<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Nicola Iarocci</title>
    <link>https://nicolaiarocci.com/</link>
    <description>Recent content on Nicola Iarocci</description>
    <generator>Hugo -- 0.143.1</generator>
    <language>en</language>
    <copyright>Produced / Written / Maintained by Nicola Iarocci since 2010</copyright>
    <lastBuildDate>Mon, 30 Mar 2026 09:46:06 +0200</lastBuildDate>
    <atom:link href="https://nicolaiarocci.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/</link>
      <pubDate>Tue, 21 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/</guid>
      <description>&lt;p&gt;Il Piccolo Libro di MongoDB è la traduzione autorizzata di &lt;a href=&#34;http://openmymind.net/mongodb.pdf&#34;&gt;The Little MongoDB Book&lt;/a&gt; di Karl Seguin.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://mongodb.org&#34;&gt;MongoDB&lt;/a&gt; è un database &lt;a href=&#34;http://en.wikipedia.org/wiki/NoSQL&#34;&gt;NoSQL&lt;/a&gt; open source, facilmente scalabile e ad alte prestazioni. Mantiene alcune similitudini coi database relazionali il che, a mio avviso, lo rende un’ottima scelta per chi si sta avvicinando al mondo NoSQL. Il Piccolo Libro è stato scritto proprio per questo tipo di lettore, ma soddisferà senz’altro anche l’esperto che vuole saperne di più su Mongo. Non lasciatevi ingannare da facilità d’uso e giovane età: MongoDB è in grado di soddisfare anche i palati più esigenti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il Piccolo Libro di MongoDB è la traduzione autorizzata di <a href="http://openmymind.net/mongodb.pdf">The Little MongoDB Book</a> di Karl Seguin.</p>
<p><a href="http://mongodb.org">MongoDB</a> è un database <a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a> open source, facilmente scalabile e ad alte prestazioni. Mantiene alcune similitudini coi database relazionali il che, a mio avviso, lo rende un’ottima scelta per chi si sta avvicinando al mondo NoSQL. Il Piccolo Libro è stato scritto proprio per questo tipo di lettore, ma soddisferà senz’altro anche l’esperto che vuole saperne di più su Mongo. Non lasciatevi ingannare da facilità d’uso e giovane età: MongoDB è in grado di soddisfare anche i palati più esigenti.</p>
<h2 id="note-sulla-traduzione">Note sulla traduzione</h2>
<p>Per garantire la coerenza del testo rispetto al <a href="http://mongly.openmymind.net/tutorial/index">tutorial interattivo online</a> sviluppato dall’autore del libro, i nomi di database, collezioni, documenti e campi degli esempi sono stati mantenuti in lingua originale. Vi invito a segnalarmi qualunque errore di traduzione, battitura o impaginazione (ce ne sono di sicuro). Poiché il sorgente è su <a href="https://github.com/nicolaiarocci/the-little-mongodb-book">GitHub</a> potete apportare e proporre voi stessi le correzioni, via pull-request. Ci terrei a migliorare la qualità del prodotto, anche e soprattutto grazie alla vostra collaborazione.</p>
<h2 id="seconda-edizione">Seconda edizione</h2>
<p>La traduzione Italiana è ora allineata alla seconda edizione inglese ed a MongoDB 2.6. Questa edizione include una introduzione al Aggregation Framework e, tra le altre cose, l’aggiornamento di tutti i link di approfondimento.</p>
<h2 id="download">Download</h2>
<p>Il Piccolo Libro di MongoDB è più disponibile per il download, ma potete
recuperarne il testo <a href="https://github.com/nicolaiarocci/the-little-mongodb-book/blob/master/it/mongodb.markdown">qui</a>.</p>
<h2 id="il-piccolo-libro-su-goodreads">Il Piccolo Libro su Goodreads</h2>
<p>Il libro è su <a href="http://www.goodreads.com/book/show/13595796-il-piccolo-libro-di-mongodb">Goodreads</a>. Se volete aggiungete commenti e/o valutazioni contribuendo così alla sua diffusione – Grazie.</p>
<h2 id="mongodb-in-italia">MongoDB in Italia</h2>
<p>Fino ad oggi MongoDB non si è diffuso granché nel nostro paese e credo che una delle cause sia  proprio la mancanza di risorse in lingua italiana. Purtroppo in Italia la barriera linguistica è ancora un grande ostacolo alla diffusione di quella conoscenza condivisa che, grazie alla rete, è sempre più diffusa a livello globale. Mi auguro davvero che Il Piccolo Libro di MongoDB contribuisca alla diffusione di Mongo anche dalle nostre parti.</p>
<p>C’è voluto un bel po’ di lavoro, ma sono contento di averlo portato a termine.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Books I Have Read</title>
      <link>https://nicolaiarocci.com/books-i-have-read/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/books-i-have-read/</guid>
      <description>&lt;p&gt;This is a partial list of the books I have read. I have it both to jog my memory and because I have read a lot of stuff I have loved, and want other people to find it.&lt;/p&gt;
&lt;h3 id=&#34;2026&#34;&gt;2026&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Portnoy&amp;rsquo;s complaint, Philip Roth ★★★★★&lt;/li&gt;
&lt;li&gt;Il segreto del Bosco Vecchio, Dino Buzzati ★★★★★&lt;/li&gt;
&lt;li&gt;Lettere luterane, Pier Paolo Pasolini ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;The hunting gun, Inoue Yasushi ★★★☆☆&lt;/li&gt;
&lt;li&gt;Una ballata del mare salato, Hugo Pratt ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Varie cose sulle sequoie e sul tempo, Jón Kalman Stefánsson ★★★☆☆&lt;/li&gt;
&lt;li&gt;La giusta distanza dal male, Giorgia Protti ★★★★★&lt;/li&gt;
&lt;li&gt;Lone Wolf, Adam Weymouth ★★★★☆&lt;/li&gt;
&lt;li&gt;Jens Munk, Thorkild Hansen ★★★★☆&lt;/li&gt;
&lt;li&gt;Il caso Bramard, Davide Longo ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2025&#34;&gt;2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#il-mangiatore-di-pietre-davide-longo&#34;&gt;Il mangiatore di pietre&lt;/a&gt;, Davide Longo ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#across-arctic-america-knud-rasmussen&#34;&gt;Across arctic America&lt;/a&gt;, Knud Rasmussen ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#orbit-orbit-caparezza&#34;&gt;Orbit Orbit&lt;/a&gt;, Caparezza ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#say-nothing-patrick-radden-keefe&#34;&gt;Say Nothing&lt;/a&gt;, Patrick Radden Keefe ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#a-nord-di-thule-knud-rasmussen&#34;&gt;A Nord di Thule&lt;/a&gt;, Knud Rasmussen ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#pornorama-claudia-grande&#34;&gt;Pornorama&lt;/a&gt;, Claudia Grande ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#the-day-of-judgment-salvatore-satta&#34;&gt;The Day of Judgment&lt;/a&gt;, Salvatore Satta ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#stasiland-anna-funder&#34;&gt;Stasiland&lt;/a&gt;, Anna Funder ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#the-communist-manifesto-by-karl-marx-and-friedrich-engels&#34;&gt;The Communist Manifesto&lt;/a&gt;, by Karl Marx and Friedrich Engels ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#the-sense-of-an-ending-julian-barnes&#34;&gt;The Sense of an Ending&lt;/a&gt;, Julian Barnes ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#lonesome-dove-larry-mcmurtry&#34;&gt;Lonesome Dove&lt;/a&gt;, Larry McMurtry ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#project-hail-mary-andy-weir&#34;&gt;Project Hail Mary&lt;/a&gt;, Andy Weir ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#assalto-alle-alpi-marco-a-ferrari&#34;&gt;Assalto alle Alpi&lt;/a&gt;, Marco A. Ferrari ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#lost-in-translation-ottavio-fatica&#34;&gt;Lost in Translation&lt;/a&gt;, Ottavio Fatica ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#the-mental-load-a-feminist-comic-by-emma&#34;&gt;The Mental Load, A Feminist Comic&lt;/a&gt;, by Emma ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#ragazzo-zuzu&#34;&gt;Ragazzo&lt;/a&gt;, Zuzu ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#history-la-storia-elsa-morante&#34;&gt;La Storia&lt;/a&gt;, Elsa Morante ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#voices-in-the-evening-le-voci-della-sera-natalia-ginzburg&#34;&gt;Le voci della sera&lt;/a&gt;, Natalia Ginzburg ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#s-gipi&#34;&gt;S.&lt;/a&gt;, Gipi ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#le-valli-della-memoria-pietro-scarnera&#34;&gt;Le valli della memoria&lt;/a&gt;, Pietro Scarnera ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#la-mia-vita-disegnata-male-gipi&#34;&gt;La mia vita disegnata male&lt;/a&gt;, Gipi ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#la-grande-rimozione-roberto-grossi&#34;&gt;La grande rimozione&lt;/a&gt;, Roberto Grossi ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#a-supposedly-fun-thing-ill-never-do-again-david-foster-wallace&#34;&gt;A supposedly fun thing I&amp;rsquo;ll never do again&lt;/a&gt;, David Foster Wallace ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#the-man-who-mistook-his-wife-for-a-hat-and-other-clinical-tales-oliver-sacks&#34;&gt;The man who mistook his wife for a hat and other clinical tales&lt;/a&gt;, Oliver Sacks ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#source-code-by-bill-gates&#34;&gt;Source code&lt;/a&gt;, Bill Gates ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#papyrus-by-irene-vallejo&#34;&gt;Papyrus&lt;/a&gt;, Irene Vallejo ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#libera-universit%C3%A0-by-tomaso-montanari&#34;&gt;Libera Università&lt;/a&gt;, Tomaso Montanari ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#cambiare-la-storia-by-adriano-prosperi&#34;&gt;Cambiare la storia&lt;/a&gt;, Adriano Prosperi ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#grandma-gatewoods-walk-by-ben-montgomery&#34;&gt;Grandma Gatewood&amp;rsquo;s Walk&lt;/a&gt;, Ben Montgomery ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#the-death-of-ivan-ilyc-by-lev-tolstoy&#34;&gt;The death of Ivan Ilych&lt;/a&gt;, Lev Tolstoj ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#la-scomparsa-di-majorana-by-leonardo-sascia&#34;&gt;La scomparsa di Majorana&lt;/a&gt;, Leonardo Sascia ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#the-moon-and-the-bonfires-by-cesare-pavese&#34;&gt;The Moon and the Bonfires&lt;/a&gt;, Cesare Pavese ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#mornings-in-jenin-by-susan-abulhawa&#34;&gt;Mornings in Jenin&lt;/a&gt;, Susan Abulhawa ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2025/#the-heartbeat-of-the-wild-by-david-quammen&#34;&gt;The heartbeat of the wild&lt;/a&gt;, David Quammen ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2024&#34;&gt;2024&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#all-your-children-scattered-by-beata-umubyeyi-mairesse-&#34;&gt;All your children, scattered&lt;/a&gt;, Beata Umubyeyi Mairesse ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#altri-libertini-by-pier-vittorio-tondelli-&#34;&gt;Altri libertini&lt;/a&gt;, Pier Vittorio Tondelli ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#the-new-york-trilogy-paul-auster-&#34;&gt;New York Trilogy&lt;/a&gt;, Paul Auster ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#class-trip-emmanuel-carr%C3%A8re-&#34;&gt;Class trip&lt;/a&gt;, Emmanuel Carrère ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#white-noise-don-delillo-&#34;&gt;White noise&lt;/a&gt;, Don DeLillo ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#the-ministry-of-ungentlemanly-warfare-damien-lewis-&#34;&gt;The Ministry of Ungentlemanly Warfare&lt;/a&gt;, Damien Lewis ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#the-three-body-problem-cixin-liu-&#34;&gt;The tree-body problem&lt;/a&gt;, Cixin Liu ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#blame-vol-2-by-tsutomu-nihei&#34;&gt;Blame! Vol. 2&lt;/a&gt;, Tsutomu Nihei ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#walking-erling-kagge&#34;&gt;Walking&lt;/a&gt;, Erling Kagge ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#lacci-domenico-starnone&#34;&gt;Lacci&lt;/a&gt;, Domenico Starnone ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#the-bastard-brigade-sam-kean&#34;&gt;The bastard brigade&lt;/a&gt;, Sam Kean ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#storia-di-mia-vita-janek-gorczyca&#34;&gt;Storia di mia vita&lt;/a&gt;, Janek Gorczyca ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#pao-pao-by-pier-vittorio-tondelli&#34;&gt;Pao Pao&lt;/a&gt;, Pier Vittorio Tondelli ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#slow-horses-by-mick-herron&#34;&gt;Slow Horses&lt;/a&gt;, Mick Herron ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#trappole-alimentari-by-stefano-vendrame&#34;&gt;Trappole alimentari&lt;/a&gt;, Stefano Vendrame ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#taccuino-1870-1884-by-giuseppe-de-nittis&#34;&gt;Taccuino 1870-1884&lt;/a&gt;, Giuseppe De Nittis ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#blame-vol-1-by-tsutomu-nihei&#34;&gt;Blame! Vol. 1&lt;/a&gt;, Tsutomu Nihei ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#i-love-russia-by-elena-kostyuchenko&#34;&gt;I love Russia&lt;/a&gt;, Elena Kostyuchenko ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#my-ingeborg-by-tore-renberg&#34;&gt;My Ingeborg&lt;/a&gt;, Tore Renberg ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#kind-of-blue-the-making-of-the-miles-davis-masterpiece-ashley-kahn&#34;&gt;Kind of Blue: the making of the Miles Davis masterpiece&lt;/a&gt;, Ashley Kahn ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#sixty-degrees-north-by-malachy-tallack&#34;&gt;Sixty Degrees North: Around the World in Search of Home&lt;/a&gt;, Malachy Tallack ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#replay-by-jordan-mechner&#34;&gt;Replay&lt;/a&gt;, Jordan Mechner ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#the-horde-how-the-mongols-changed-the-world-by-marie-favereau&#34;&gt;The Horde: how the Mongols changed the world&lt;/a&gt;, Marie Favereau ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#womens-resistance-by-benedetta-tobagi&#34;&gt;La resistenza delle donne&lt;/a&gt;, Benedetta Tobagi ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#under-the-volcano-by-malcom-lowry&#34;&gt;Under the Volcano&lt;/a&gt;, Malcolm Lowry ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#family-lexicon-by-natalia-ginzburg&#34;&gt;Family Lexicon (Lessico Famigliare)&lt;/a&gt;, Natalia Ginzburg ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#lolita-by-vladimir-nabokov&#34;&gt;Lolita&lt;/a&gt;, Vladimir Nabokov ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#meditations-by-marcus-aurelius&#34;&gt;Meditations&lt;/a&gt;, Marcus Aurelius ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#the-garden-of-the-finzi-contini-by-giorgio-bassani&#34;&gt;The garden of the Finzi-Contini&lt;/a&gt;, Giorgio Bassani ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/#the-question-of-palestine-by-ew-said&#34;&gt;The question of Palestine&lt;/a&gt;, Edward W. Said ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2023&#34;&gt;2023&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2023/&#34;&gt;Books I read in 2023: wrap-up and reviews&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is a partial list of the books I have read. I have it both to jog my memory and because I have read a lot of stuff I have loved, and want other people to find it.</p>
<h3 id="2026">2026</h3>
<ul>
<li>Portnoy&rsquo;s complaint, Philip Roth ★★★★★</li>
<li>Il segreto del Bosco Vecchio, Dino Buzzati ★★★★★</li>
<li>Lettere luterane, Pier Paolo Pasolini ★☆☆☆☆</li>
<li>The hunting gun, Inoue Yasushi ★★★☆☆</li>
<li>Una ballata del mare salato, Hugo Pratt ★★☆☆☆</li>
<li>Varie cose sulle sequoie e sul tempo, Jón Kalman Stefánsson ★★★☆☆</li>
<li>La giusta distanza dal male, Giorgia Protti ★★★★★</li>
<li>Lone Wolf, Adam Weymouth ★★★★☆</li>
<li>Jens Munk, Thorkild Hansen ★★★★☆</li>
<li>Il caso Bramard, Davide Longo ★★★☆☆</li>
</ul>
<h3 id="2025">2025</h3>
<ul>
<li><a href="/books-i-read-in-2025/#il-mangiatore-di-pietre-davide-longo">Il mangiatore di pietre</a>, Davide Longo ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#across-arctic-america-knud-rasmussen">Across arctic America</a>, Knud Rasmussen ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#orbit-orbit-caparezza">Orbit Orbit</a>, Caparezza ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#say-nothing-patrick-radden-keefe">Say Nothing</a>, Patrick Radden Keefe ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#a-nord-di-thule-knud-rasmussen">A Nord di Thule</a>, Knud Rasmussen ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#pornorama-claudia-grande">Pornorama</a>, Claudia Grande ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#the-day-of-judgment-salvatore-satta">The Day of Judgment</a>, Salvatore Satta ★★★★★</li>
<li><a href="/books-i-read-in-2025/#stasiland-anna-funder">Stasiland</a>, Anna Funder ★★★★★</li>
<li><a href="/books-i-read-in-2025/#the-communist-manifesto-by-karl-marx-and-friedrich-engels">The Communist Manifesto</a>, by Karl Marx and Friedrich Engels ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#the-sense-of-an-ending-julian-barnes">The Sense of an Ending</a>, Julian Barnes ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#lonesome-dove-larry-mcmurtry">Lonesome Dove</a>, Larry McMurtry ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#project-hail-mary-andy-weir">Project Hail Mary</a>, Andy Weir ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#assalto-alle-alpi-marco-a-ferrari">Assalto alle Alpi</a>, Marco A. Ferrari ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#lost-in-translation-ottavio-fatica">Lost in Translation</a>, Ottavio Fatica ★★☆☆☆</li>
<li><a href="/books-i-read-in-2025/#the-mental-load-a-feminist-comic-by-emma">The Mental Load, A Feminist Comic</a>, by Emma ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#ragazzo-zuzu">Ragazzo</a>, Zuzu ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#history-la-storia-elsa-morante">La Storia</a>, Elsa Morante ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#voices-in-the-evening-le-voci-della-sera-natalia-ginzburg">Le voci della sera</a>, Natalia Ginzburg ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#s-gipi">S.</a>, Gipi ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#le-valli-della-memoria-pietro-scarnera">Le valli della memoria</a>, Pietro Scarnera ★★☆☆☆</li>
<li><a href="/books-i-read-in-2025/#la-mia-vita-disegnata-male-gipi">La mia vita disegnata male</a>, Gipi ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#la-grande-rimozione-roberto-grossi">La grande rimozione</a>, Roberto Grossi ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#a-supposedly-fun-thing-ill-never-do-again-david-foster-wallace">A supposedly fun thing I&rsquo;ll never do again</a>, David Foster Wallace ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#the-man-who-mistook-his-wife-for-a-hat-and-other-clinical-tales-oliver-sacks">The man who mistook his wife for a hat and other clinical tales</a>, Oliver Sacks ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#source-code-by-bill-gates">Source code</a>, Bill Gates ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#papyrus-by-irene-vallejo">Papyrus</a>, Irene Vallejo ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#libera-universit%C3%A0-by-tomaso-montanari">Libera Università</a>, Tomaso Montanari ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#cambiare-la-storia-by-adriano-prosperi">Cambiare la storia</a>, Adriano Prosperi ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#grandma-gatewoods-walk-by-ben-montgomery">Grandma Gatewood&rsquo;s Walk</a>, Ben Montgomery ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#the-death-of-ivan-ilyc-by-lev-tolstoy">The death of Ivan Ilych</a>, Lev Tolstoj ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#la-scomparsa-di-majorana-by-leonardo-sascia">La scomparsa di Majorana</a>, Leonardo Sascia ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#the-moon-and-the-bonfires-by-cesare-pavese">The Moon and the Bonfires</a>, Cesare Pavese ★★★★☆</li>
<li><a href="/books-i-read-in-2025/#mornings-in-jenin-by-susan-abulhawa">Mornings in Jenin</a>, Susan Abulhawa ★★★☆☆</li>
<li><a href="/books-i-read-in-2025/#the-heartbeat-of-the-wild-by-david-quammen">The heartbeat of the wild</a>, David Quammen ★★★☆☆</li>
</ul>
<h3 id="2024">2024</h3>
<ul>
<li><a href="/books-i-read-in-2024/#all-your-children-scattered-by-beata-umubyeyi-mairesse-">All your children, scattered</a>, Beata Umubyeyi Mairesse ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#altri-libertini-by-pier-vittorio-tondelli-">Altri libertini</a>, Pier Vittorio Tondelli ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#the-new-york-trilogy-paul-auster-">New York Trilogy</a>, Paul Auster ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#class-trip-emmanuel-carr%C3%A8re-">Class trip</a>, Emmanuel Carrère ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#white-noise-don-delillo-">White noise</a>, Don DeLillo ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#the-ministry-of-ungentlemanly-warfare-damien-lewis-">The Ministry of Ungentlemanly Warfare</a>, Damien Lewis ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#the-three-body-problem-cixin-liu-">The tree-body problem</a>, Cixin Liu ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#blame-vol-2-by-tsutomu-nihei">Blame! Vol. 2</a>, Tsutomu Nihei ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#walking-erling-kagge">Walking</a>, Erling Kagge ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#lacci-domenico-starnone">Lacci</a>, Domenico Starnone ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#the-bastard-brigade-sam-kean">The bastard brigade</a>, Sam Kean ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#storia-di-mia-vita-janek-gorczyca">Storia di mia vita</a>, Janek Gorczyca ★★☆☆☆</li>
<li><a href="/books-i-read-in-2024/#pao-pao-by-pier-vittorio-tondelli">Pao Pao</a>, Pier Vittorio Tondelli ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#slow-horses-by-mick-herron">Slow Horses</a>, Mick Herron ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#trappole-alimentari-by-stefano-vendrame">Trappole alimentari</a>, Stefano Vendrame ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#taccuino-1870-1884-by-giuseppe-de-nittis">Taccuino 1870-1884</a>, Giuseppe De Nittis ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#blame-vol-1-by-tsutomu-nihei">Blame! Vol. 1</a>, Tsutomu Nihei ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#i-love-russia-by-elena-kostyuchenko">I love Russia</a>, Elena Kostyuchenko ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#my-ingeborg-by-tore-renberg">My Ingeborg</a>, Tore Renberg ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#kind-of-blue-the-making-of-the-miles-davis-masterpiece-ashley-kahn">Kind of Blue: the making of the Miles Davis masterpiece</a>, Ashley Kahn ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#sixty-degrees-north-by-malachy-tallack">Sixty Degrees North: Around the World in Search of Home</a>, Malachy Tallack ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#replay-by-jordan-mechner">Replay</a>, Jordan Mechner ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#the-horde-how-the-mongols-changed-the-world-by-marie-favereau">The Horde: how the Mongols changed the world</a>, Marie Favereau ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#womens-resistance-by-benedetta-tobagi">La resistenza delle donne</a>, Benedetta Tobagi ★★★☆☆</li>
<li><a href="/books-i-read-in-2024/#under-the-volcano-by-malcom-lowry">Under the Volcano</a>, Malcolm Lowry ★☆☆☆☆</li>
<li><a href="/books-i-read-in-2024/#family-lexicon-by-natalia-ginzburg">Family Lexicon (Lessico Famigliare)</a>, Natalia Ginzburg ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#lolita-by-vladimir-nabokov">Lolita</a>, Vladimir Nabokov ★★★★★</li>
<li><a href="/books-i-read-in-2024/#meditations-by-marcus-aurelius">Meditations</a>, Marcus Aurelius ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#the-garden-of-the-finzi-contini-by-giorgio-bassani">The garden of the Finzi-Contini</a>, Giorgio Bassani ★★★★☆</li>
<li><a href="/books-i-read-in-2024/#the-question-of-palestine-by-ew-said">The question of Palestine</a>, Edward W. Said ★★★☆☆</li>
</ul>
<h3 id="2023">2023</h3>
<p><a href="/books-i-read-in-2023/">Books I read in 2023: wrap-up and reviews</a></p>
<ul>
<li><a href="/books-i-read-in-2023/#the-sorrows-of-young-werther-by-jw-von-goethe">The sorrows of young Werther</a>, J.W. von Goethe ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#happiness-as-such-by-natalia-ginzburg">Happiness, as such (Caro Michele)</a>, Natialia Ginzburg ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#the-ancient-hours-by-michael-bible">The ancient hours (L&rsquo;ultima cosa bella sulla faccia della terra)</a>, M. Bible ★★★★☆</li>
<li><a href="/books-i-read-in-2023/#milano-calibro-9-by-giorgio-scerbanenco">Milano calibro 9</a>, Giorgio Scerbanenco ★★☆☆☆</li>
<li><a href="/books-i-read-in-2023/#stella-maris-by-cormac-mccarthy">Stella Maris</a>, Cormac McCarthy ★★★★☆</li>
<li><a href="/books-i-read-in-2023/#ferrovie-del-messico-by-gian-marco-griffi">Ferrovie del messico</a>, Gian Marco Griffi ★★★★☆</li>
<li><a href="/books-i-read-in-2023/#adhd-workbook-for-adults-by-tara-wilson">ADHD workbook for adults (ADHD negli adulti)</a>, Tara Wilson ★★☆☆☆</li>
<li><a href="/books-i-read-in-2023/#codice-jury-by-jury-chechi">Codice Jury</a>, Jury Chechi ★★☆☆☆</li>
<li><a href="/books-i-read-in-2023/#high-by-erica-fatland">High (La vita in alto. Una stagione sul&rsquo;Himalaya)</a>, Erica Fatland ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#the-passenger-by-cormac-mccarthy">The passenger (Il passeggero)</a>, Cormac McCarthy ★★★★☆</li>
<li><a href="/books-i-read-in-2023/#born-to-run-2-by-chris-mcdougall-and-eric-orton">Born to run 2</a>, Chris McDougall and Eric Orton ★★☆☆☆</li>
<li><a href="/books-i-read-in-2023/#blinds-man-bluff-by-susan-sontag">Blind&rsquo;s man bluff (Immersione rapida)</a>, Sharry Sontag, Christopher Drew ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#wuthering-heights-by-emily-bronte">Wuthering Heights (Cime Tempestose)</a>, Emily Bronte ★★★★☆</li>
<li><a href="/books-i-read-in-2023/#lumanit%C3%A0-%C3%A8-un-tirocinio-by-domenico-starnone">L&rsquo;umanità è un tirocinio</a>, Domenico Starnone ★★☆☆☆</li>
<li><a href="/books-i-read-in-2023/#the-overstory-by-richard-powers">The overstory (Il sussurro del mondo)</a>, Richard Powers ★☆☆☆☆</li>
<li><a href="/books-i-read-in-2023/#la-mossa-del-matto-by-alessandro-barbaglia">La mossa del matto</a>, Alessandro Barbaglia ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#disasters-by-daniil-charms">Disasters (Disastri)</a>, Daniil Charms ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#land-and-sea-by-carl-schmitt">Land and Sea (Terra e mare)</a>, Carl Schmitt ★★☆☆☆</li>
<li><a href="/books-i-read-in-2023/#medieval-callings-by-jacques-le-goff">Medieval callings (Vita nel medioevo)</a>, Jacques Le Goff ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#being-wolf-by-kerstin-ekman">Being wolf (Essere lupo)</a>, Kerstin Ekman ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#no-sleep-till-shengal-by-zerocalcare">No sleep till Shengal</a>, Zerocalcare ★★☆☆☆</li>
<li><a href="/books-i-read-in-2023/#red-mars-by-kim-stanley-robinson">Red Mars</a>, Kim Stanley Robinson ★★☆☆☆</li>
<li><a href="/books-i-read-in-2023/#sanguina-ancora-by-paolo-nori">Sanguina ancora</a>, Paolo Nori ★★★☆☆</li>
<li><a href="/books-i-read-in-2023/#uomini-boschi-e-api-by-mario-rigoni-stern">Uomini, boschi e api</a>, Mario Rigoni Stern ★★☆☆☆</li>
</ul>
<h3 id="2022">2022</h3>
<p><em><a href="/my-favorite-books-of-2022/">My favorite books of 2022</a></em></p>
<ul>
<li><a href="/book-review-stoner">Stoner</a>, John Williams</li>
<li><a href="/book-review-candide">Candide</a>, Voltaire</li>
<li><a href="/book-review-when-we-cease-to-understand-the-world/">When We Cease to Understand the World</a>, Benjamin Labatut</li>
<li><a href="/book-review-ma%C5%A1enka">Mašen&rsquo;ka</a>, Vladimir Nabokov</li>
<li><a href="/book-review-the-crow-comes-last">The Crow Comes Last</a>, Italo Calvino</li>
<li><a href="/book-review-ravenna">Ravenna</a>, Judith Herrin</li>
<li><a href="/book-review-the-count-of-monte-cristo">The Count of Monte Cristo</a>, Alexandre Dumas</li>
<li><a href="/book-review-smiling-bears">Smiling Bears</a>, Else Poulsen</li>
<li><a href="/book-review-a-captive-west-or-the-tragedy-of-central-europe">A captive West or the tragedy of Central Europe</a>, Milan Kundera</li>
<li><a href="/book-review-just-an-ordinary-day">Just an Ordinary Day</a>, Shirley Jackson</li>
<li><a href="/book-review-italica">Italica</a>, Giacomo Papi</li>
<li><a href="/book-review-the-rings-of-saturn">The Rings of Saturn</a>, W.G. Sebald</li>
<li><a href="/book-review-invisible-cities">Invisible Cities</a>, Italo Calvino</li>
<li><a href="/book-review-memoirs-of-hadrian">Memoirs of Hadrian</a>, Marguerite Yourcenar</li>
<li><a href="/book-review-lone-rider">Lone Rider</a>, Elspeth Beard</li>
<li><a href="/book-review-roumeli">Roumeli</a>, Patrick Leigh Fermor</li>
<li><a href="/book-review-thinking-fast-and-slow/">Thinking fast and slow</a>, Daniel Kahneman</li>
<li><a href="/book-review-eichmann-in-jerusalem.-a-report-on-the-banality-of-evil/">Eichmann in Jerusalem. A Report on the Banality of Evil</a>, Hannah Arendt</li>
<li><a href="/book-review-finnish-fairy-tales/">Fiabe finlandesi</a>, various authors</li>
</ul>
<h3 id="2021">2021</h3>
<p><em><a href="/three-good-books-i-read-in-2021/">Three good books I read in 2021</a></em></p>
<ul>
<li><a href="/book-review-consider-the-lobster/">Consider the Lobster</a>, David Foster Wallace</li>
<li><a href="/book-review-about-the-meaning-of-life/">A proposito del senso della vita</a>, Vito Mancuso</li>
<li><a href="/book-review-a-useles-man/">Un uomo inutile</a>, Sait Faik Abasiyanik</li>
<li><a href="/book-review-endurance-shackletons-incredible-voyage/">Endurance, Shackleton&rsquo;s Incredible Voyage</a>, Alfred Lansing</li>
<li><a href="/book-review-mathematics-is-politics">La matematica è politica</a>, Chiara Valerio</li>
<li><a href="/book-review-king-and-emperor-a-new-life-of-charlemagne/">King and Emperor: A New Life of Charlemagne</a>, Janet L. Nelson</li>
<li><a href="/book-review-language-of-the-spirit-an-introduction-to-classical-music/">Language of the Spirit: An Introduction to Classical Music</a>, Jan Swafford</li>
<li><a href="/book-review-nausea/">Nausea</a>, Jean-Paul Sartre</li>
<li><a href="/book-review-proud-tobea-flyer/">Proud tobea Flyer</a>, Matteo Sola</li>
<li><a href="/book-review-nomadland/">Nomadland</a>, Jessica Bruder</li>
<li><a href="/book-review-eight-days-in-may-the-final-collapse-of-the-third-reich/">Eight Days in May: The Final Collapse of the Third Reich</a>, Volker Ullrich</li>
<li><a href="/book-review-power-to-the-words/">Potere alle Parole</a>, Vera Gheno</li>
<li><a href="/book-review-alpi-ribelli-storie-di-montagna-resistenza-e-utopia/">Alpi ribelli</a>, Enrico Camanni</li>
<li><a href="/book-review-the-voice-of-the-sirens.-the-greeks-and-the-art-of-persuasion/">The Voice of the Sirens. The Greeks and the art of persuasion</a>, Laura Pepe</li>
<li><a href="/book-review-one-man-caravan">One Man Caravan</a>, Robert Edison Fulton</li>
<li><a href="/book-review-the-silence-a-novel">The Silence: A Novel</a>, Don DeLillo</li>
<li><a href="/book-review-in-the-heart-of-the-sea-the-tragedy-of-the-waleship-essex/">In the Heart of the Sea</a>, Nathaniel Philbrick</li>
<li><a href="/book-review-materada/">Materada</a>, Fulvio Tomizza</li>
<li><a href="/book-review-the-library-at-night/">The Library at Night</a>, Alberto Manguel</li>
<li><a href="/book-review-we-have-always-lived-in-the-castle/">We Always Lived in the Castle</a>, Shirley Jackson</li>
<li><a href="/book-review-the-water-dancer/">The Water Dancer</a>, Ta-Nehisi Coates</li>
<li><a href="https://nicolaiarocci.com/book-review-erebus-the-story-of-a-ship/">Erebus: The Story of a Ship</a>, Michael Palin</li>
</ul>
<h3 id="2020">2020</h3>
<p><em><a href="/five-good-books-i-read-in-2020/">Five good books I read in 2020</a></em></p>
<ul>
<li><a href="https://www.goodreads.com/review/show/3727653753">Terra incognita</a>, Sebastiano Barisoni</li>
<li><a href="https://www.goodreads.com/review/show/3703387965">Leggende groenlandesi</a>, Knud Rasmussen</li>
<li><a href="https://www.goodreads.com/review/show/3688975918">Nero d&rsquo;inferno</a>, Matteo Cavezzali</li>
<li><a href="https://www.goodreads.com/review/show/3676176000">Il tempo della rivolta</a>, Donatella Di Cesare</li>
<li><a href="https://www.goodreads.com/review/show/3659644587">L&rsquo;ordine nascosto: la vita segreta dei funghi</a>, Merlin Sheldrake</li>
<li><a href="https://www.goodreads.com/review/show/3634129461">Dante</a>, Alessandro Barbero</li>
<li><a href="https://www.goodreads.com/review/show/3615266809">Il ritorno del Re</a>, JRR Tolkien (new translation by O. Fatica)</li>
<li><a href="https://www.goodreads.com/review/show/3585955954">Il piccolo libro dell&rsquo;investimento</a>, John C. Bogle</li>
<li><a href="https://www.goodreads.com/review/show/3571723366">Helgoland</a>, Carlo Rovelli</li>
<li><a href="https://www.goodreads.com/review/show/3559110478">Sognando Jupiter</a>, Ted Simmons</li>
<li><a href="https://www.goodreads.com/review/show/3517418599">HHhH</a>, Laurent Binet</li>
<li><a href="https://www.goodreads.com/review/show/3506196461">Il cuore di un&rsquo;ape</a>, Helen Jukes</li>
<li><a href="https://www.goodreads.com/review/show/3498399665">Come le mosche d&rsquo;autunno</a>, Irène Némirovsky</li>
<li><a href="https://www.goodreads.com/review/show/3498399212">Per chi suona la campana</a>, Ernest Hemingway</li>
<li><a href="https://www.goodreads.com/review/show/3468088266">Uomini e topi</a>, John Steinbeck</li>
<li><a href="https://www.goodreads.com/review/show/3466408008">Il Maestro e Margherita</a>, Michail Bulgakov</li>
<li><a href="https://www.goodreads.com/review/show/3433621116">1984</a>, George Orwell</li>
<li><a href="https://www.goodreads.com/review/show/3428298282">Lo Hobbit, un viaggio verso la maturità</a>, William H. Green</li>
<li><a href="https://www.goodreads.com/review/show/3399919815">Sentieri nel ghiaccio</a>, Werner Herzog</li>
<li><a href="https://www.goodreads.com/review/show/3384237216">Pachidermi e pappagalli</a>, Carlo Cottarelli</li>
<li><a href="https://www.goodreads.com/review/show/3353438092">La strada di Swann</a>, Marcel Proust</li>
<li><a href="https://www.goodreads.com/review/show/3295740948">La vita felice</a>, Lucio Anneo Seneca</li>
<li><a href="https://www.goodreads.com/review/show/3282219880">La brevità della vita</a>, Lucio Anneo Seneca</li>
<li><a href="https://www.goodreads.com/review/show/3278447829">Saggio sulla lucidità</a>, José Saramago</li>
<li><a href="https://www.goodreads.com/review/show/3240059875">Pietro e Paolo</a>, Marcello Fois</li>
<li><a href="https://www.goodreads.com/review/show/3208811016">Possiamo salvare il mondo, prima di cena</a>, Jonathan Safran Foer</li>
<li><a href="https://www.goodreads.com/review/show/3185833586">Masters of Doom</a>, David Kushner</li>
<li><a href="https://www.goodreads.com/review/show/3158213688">Tyll</a>, Daniel Kehlmann</li>
<li><a href="https://www.goodreads.com/review/show/3135712909">Mani</a>, Patrick Leigh Fermor</li>
</ul>
<h3 id="2019">2019</h3>
<ul>
<li><a href="https://www.goodreads.com/review/show/3106211910">Fiabe norvegesi</a>, AA.VV.</li>
<li><a href="https://www.goodreads.com/review/show/3088448885">Genesi</a>, Guido Tonelli</li>
<li><a href="https://www.goodreads.com/review/show/3072203707">La lotteria</a>, Shirley Jackson</li>
<li><a href="https://www.goodreads.com/review/show/3072203366">Il vichingo nero</a>, Bergsveinn Birgisson</li>
<li><a href="https://www.goodreads.com/review/show/3047638021">La compagnia dell&rsquo;anello</a>, JRR Tolkien (new translation by O. Fatica)</li>
<li><a href="https://www.goodreads.com/review/show/3033947716">La nascita della filosofia</a>, Giorgio Colli</li>
<li><a href="https://www.goodreads.com/review/show/3023972023">Macchine come me</a>, Ian McEwan</li>
<li><a href="https://www.goodreads.com/review/show/3005140576">La guerra segreta</a>, Max Hastings</li>
<li><a href="https://www.goodreads.com/review/show/2967987949">Viaggio di una parigina a Lhasa</a>, Alexandra David-Néel</li>
<li><a href="https://www.goodreads.com/review/show/2946315396">Il futuro è storia</a>, Masha Gessen</li>
<li><a href="https://www.goodreads.com/review/show/2928885876">Guida galattica per gli autostoppisti</a>, Douglas Adams</li>
<li><a href="https://www.goodreads.com/review/show/2921224253">Come sfasciare un paese in sette mosse</a>, Ece Temelkuran</li>
<li><a href="https://www.goodreads.com/review/show/2864905113">Io Khaled vendo uomini e sono innocente</a>, Francesca Mannocchi</li>
<li><a href="https://www.goodreads.com/review/show/2832238469">Nondimanco</a>, Carlo Ginzburg</li>
<li><a href="https://www.goodreads.com/review/show/2816165678">Sulla motocicletta</a>, John Berger</li>
<li><a href="https://www.goodreads.com/review/show/2811128201">Proletkult</a>, Wu Ming</li>
<li><a href="https://www.goodreads.com/review/show/2795991613">Metamorfosi</a>, Ovidio</li>
<li><a href="https://www.giancarlobarzagli.com/grune-linie">Grüne Linie</a>, Giancarlo Barzagli</li>
<li><a href="https://www.goodreads.com/review/show/2760952924">Get programming with F#</a>, Isaac Abraham</li>
<li><a href="https://www.goodreads.com/review/show/2742732913">Diario di una apprendista astronauta</a>, Samantha Cristoforetti</li>
<li><a href="https://www.goodreads.com/review/show/2716093129">Il grande gioco</a>, Peter Hopkirk</li>
<li><a href="https://www.goodreads.com/review/show/2689925487">The Passenger: Giappone</a>, AA.VV.</li>
<li><a href="https://www.goodreads.com/review/show/2671774539">La vita segreta: tre storie vere dell&rsquo;era digitale</a>, Andrew O&rsquo;Hagan</li>
<li><a href="https://www.goodreads.com/review/show/2659525895">Peaks of Europe</a>, Johan Lolos</li>
<li><a href="https://www.goodreads.com/review/show/2655112513">Marco Polo: Viaggio ai confini del Medioevo</a>, Giulio Busy</li>
</ul>
<h3 id="2018">2018</h3>
<ul>
<li><a href="https://www.goodreads.com/review/show/2629690001">Fiabe faroesi</a>, AA.VV.</li>
<li><a href="https://www.goodreads.com/review/show/2625507016">Lezioni di letteratura</a>,
Vladimir Nabokov</li>
<li><a href="https://www.goodreads.com/review/show/2597897385">La caduta di Gongolin</a>,
JRR Tolkien</li>
<li><a href="https://www.goodreads.com/review/show/2592032021">Paranoia</a>, Shirley Jackson</li>
<li><a href="https://www.goodreads.com/review/show/2582432054">The Passenger: Olanda</a>,
AA.VV.</li>
<li><a href="https://www.goodreads.com/review/show/2568894736">Fuga in Europa</a>, Stephen
Smith</li>
<li><a href="https://www.goodreads.com/review/show/2548301973">Shakespeare and Company, Paris: A History of the Rag &amp; Bone Shop of the
Heart</a>, Krista Halverson</li>
<li><a href="https://www.goodreads.com/review/show/2537266054">Memorie di un cacciatore</a>, Ivan Turgenev</li>
<li><a href="https://www.goodreads.com/review/show/2506556277">Atlantico</a>, Simon
Winchester</li>
<li><a href="https://www.goodreads.com/review/show/2483980410">Amore e ginnastica</a>,
Edmondo De Amicis</li>
<li><a href="https://www.goodreads.com/review/show/2475628124">Il campo di nessuno</a>,
Daniel Picouly</li>
<li><a href="https://www.goodreads.com/review/show/2447541095">Il professore e il pazzo</a>, Simon Winchester</li>
<li><a href="https://www.goodreads.com/review/show/2444007353">The Passenger: Islanda</a>, AA.VV.</li>
<li><a href="https://www.goodreads.com/review/show/2428719612">Brutti incontri al chiaro di
luna</a>, W. Stanley Moss</li>
<li><a href="https://www.goodreads.com/review/show/2420790276">Aua</a>, Knud Rasmussen</li>
<li><a href="https://www.goodreads.com/review/show/2408724357">Gormenghast</a>, Mervyn
Peake</li>
<li><a href="https://www.goodreads.com/review/show/2382359505">Isola</a>, Siri Ranva Hjelm
Jacobsen</li>
<li><a href="https://www.goodreads.com/review/show/2375529000">Una vita da libraio</a>,
Shaun Bythell</li>
<li><a href="https://www.goodreads.com/review/show/2367261907">Il più grande uomo scimmia del Pleistocene</a>, Roy Lewis</li>
<li><a href="https://www.goodreads.com/review/show/2354763819">Autunno tedesco</a>, Stig
Dagerman</li>
<li><a href="https://www.goodreads.com/review/show/2346859817">Cos&rsquo;è la scienza. La rivoluzione di
Anassimandro</a>, Carlo
Rovelli</li>
<li><a href="https://www.goodreads.com/review/show/2335780405">La danzatrice di Izu</a>, Yasunari Kawabata</li>
<li><a href="https://www.goodreads.com/review/show/2330127230">Tutto quello che è un
uomo</a>, David Szalay</li>
<li><a href="https://www.goodreads.com/review/show/2294771238">Parla, ricordo</a>, Vladimir
Nabokov</li>
<li><a href="https://www.goodreads.com/review/show/2294767969">Musicofilia</a>, Oliver Sacks</li>
<li><a href="https://www.facebook.com/groups/262526193838902/">Pensieri spettinati</a>, Stanisław Jerzy Lec</li>
<li><a href="https://www.goodreads.com/review/show/2266594153">How we&rsquo;ll live on Mars</a>, Stephen L. Petranek</li>
<li><a href="https://www.goodreads.com/review/show/2263868348">Sinfonia Leningrado</a>, Sarah Quigley</li>
<li><a href="https://www.goodreads.com/review/show/2246560263">Il silenzio</a>, Erling Kagge</li>
</ul>
<h3 id="2017">2017</h3>
<ul>
<li><a href="https://www.goodreads.com/review/show/2237937699">Arboreto salvatico</a>, Mario
Rigoni Stern</li>
<li><a href="https://www.goodreads.com/review/show/2223989199">Il soccombente</a>, Thomas
Bernhard</li>
<li><a href="https://www.goodreads.com/review/show/2213760620">L&rsquo;invenzione della
solitudine</a>, Paul Auster</li>
<li><a href="https://www.goodreads.com/review/show/2202449830">Sapiens. Da animali
a Dei</a>, Yuval Noah Harari</li>
<li><a href="https://www.goodreads.com/review/show/2175630752">Vita di un uomo: Francesco
d&rsquo;Assisi</a>, Chiara Frugoni</li>
<li><a href="https://www.goodreads.com/review/show/2165919831">L&rsquo;Arminuta</a>, Donatella di
Pietrantonio</li>
<li><a href="https://www.goodreads.com/review/show/2141178221">Bull Mountain</a>, Brian
Panowich</li>
<li><a href="https://www.goodreads.com/review/show/2136461529">Cosmo</a>, Witold Gombrowicz</li>
<li><a href="https://www.goodreads.com/review/show/2124879053">Controvento</a>, Federico
Pace</li>
<li><a href="https://www.goodreads.com/review/show/2106187275">La via dello zen</a>, Alan W.
Watts</li>
<li><a href="https://www.goodreads.com/review/show/2106188440">Le otto montagne</a>. Paolo
Cognetti</li>
<li><a href="https://www.goodreads.com/review/show/2085089462">Eredità</a>, Corrado Stajano</li>
<li><a href="https://www.goodreads.com/review/show/2070389309">Una cosa divertente che non farò mai più</a>, David Foster Wallace</li>
<li><a href="https://www.goodreads.com/review/show/2052009574">L&rsquo;ultimo arrivato</a>, Marco
Balzano</li>
<li><a href="https://www.goodreads.com/review/show/2043811433">L&rsquo;arte della fuga</a>,
Fredrik Sjöberg</li>
<li><a href="https://www.goodreads.com/review/show/2037874839">Norvegian wood</a>, Lars
Mytting</li>
<li><a href="https://www.goodreads.com/review/show/2031737284">L&rsquo;ordine del tempo</a>, Carlo
Rovelli</li>
<li><a href="https://www.goodreads.com/review/show/2025964300">Il fondamentalista
riluttante</a>, Moshin Hamid</li>
<li><a href="https://www.goodreads.com/review/show/2020799146">Il giro del miele</a>, Sandro
Campani</li>
<li><a href="https://www.goodreads.com/review/show/2013278734">Le nostre anime di notte</a>, Kent Haruf</li>
<li><a href="https://www.goodreads.com/review/show/2009035353">Exit West</a>, Mohsin Hamid</li>
<li><a href="https://www.goodreads.com/review/show/2003380785">Follia</a>, Patrick McGrath</li>
<li><a href="https://www.goodreads.com/review/show/1996996202">La ricetta del dottor
Wasser</a>, Lars Gustafsson</li>
<li><a href="https://www.goodreads.com/review/show/1978683005">La conquista del
Paradiso</a>, Paul M. Cobb</li>
<li><a href="https://www.goodreads.com/review/show/1952222017">Il pastore d&rsquo;Islanda</a>,
Gunnar Gunnarsson</li>
<li><a href="https://www.goodreads.com/review/show/1934313376">La casa dei Krull</a>, Georges Simenon</li>
<li><a href="https://www.goodreads.com/review/show/1929593045">La vita segreta degli alberi</a>, Peter Wohlleben</li>
<li><a href="https://www.goodreads.com/review/show/1915042009">L&rsquo;arte di essere fragili</a>,
Alessandro D&rsquo;Avenia</li>
<li><a href="https://www.goodreads.com/review/show/1900070244">Sei pezzi facili</a>, Richard
Faynman</li>
<li><a href="https://www.goodreads.com/review/show/1892990789">Scherzetto</a>, Domenico Starnone</li>
<li><a href="https://www.goodreads.com/review/show/1890818775">Born to run</a>, Bruce Springsteen</li>
<li><a href="https://www.goodreads.com/review/show/1871063494">Fiabe lapponi</a>, Bruno Berni</li>
</ul>
<h3 id="2016">2016</h3>
<ul>
<li><a href="https://www.goodreads.com/review/show/1856934440">I viaggi di Jupiter</a>, Ted
Simon</li>
<li><a href="https://www.goodreads.com/review/show/1829463425">Zero K</a>, Don DeLillo</li>
<li><a href="https://www.goodreads.com/review/show/1818507095">Il sentiero degli eroi</a>,
Marco Albino Ferrari</li>
<li><a href="https://www.goodreads.com/review/show/1811020001">La vegetariana</a>, Han Kang</li>
<li><a href="https://www.goodreads.com/review/show/1802789884">L&rsquo;incanto del lotto 49</a>,
Thomas Pynchon</li>
<li><a href="https://www.goodreads.com/review/show/1795445180">La settimana bianca</a>,
Emmanuel Carrère</li>
<li><a href="https://www.goodreads.com/review/show/1792681816">L’ultimo serpente</a>, A.B. Guthrie</li>
<li><a href="https://www.goodreads.com/review/show/1786013774">Mea culpa</a>, Francesco Fuschini</li>
<li><a href="https://www.goodreads.com/review/show/1775614517">Il vecchio e il mare</a>, Ernest Hemingway</li>
<li><a href="https://www.goodreads.com/review/show/1773004610">Capitani coraggiosi</a>, Rudyard Kipling</li>
<li><a href="https://www.goodreads.com/review/show/1766456570">Regni dimenticati</a>, Gerard Russell</li>
<li><a href="https://www.goodreads.com/review/show/1749959783">Il processo</a>, Franz Kafka</li>
<li><a href="https://www.goodreads.com/review/show/1739313500">Canone inverso</a>, Paolo Maurensig</li>
<li><a href="https://www.goodreads.com/review/show/1735483853">Un anno sull’altipiano</a>, Emilio Lussu</li>
<li><a href="https://www.goodreads.com/review/show/1732708036">Gente indipendente</a>, Halldór Laxness</li>
<li><a href="https://www.goodreads.com/review/show/1693569550">Diario di un parroco di campagna</a>, Georges Bernanos</li>
<li><a href="https://www.goodreads.com/review/show/1679711698">Le mele di Kafka</a>, Andrea Vitali</li>
<li><a href="https://www.goodreads.com/review/show/1670127517">Purity</a>, Jonathan Franzen</li>
<li><a href="https://www.goodreads.com/review/show/1651542642">Sette Maghi</a>, Halldór Laxness</li>
<li><a href="https://www.goodreads.com/review/show/1639781362">La guardia, il poeta e l’investigatore</a>, Jung-myung Lee</li>
<li><a href="https://www.goodreads.com/review/show/1625132993">La vita e il tempo di Michael K.</a>, J.M. Coetzee</li>
<li><a href="https://www.goodreads.com/review/show/1612747269">Io e Mabel ovvero l’arte della falconeria</a>, Helen Macdonald</li>
<li><a href="https://www.goodreads.com/review/show/1601463821">Una parete sottile</a>, Enrico Regazzoni</li>
<li><a href="https://www.goodreads.com/review/show/1595044456">Furore</a>, John Steinbeck</li>
<li><a href="https://www.goodreads.com/review/show/1583088363">La Metamorfosi</a>, Franz Kafka</li>
<li><a href="https://www.goodreads.com/review/show/1580167257">Lo zen e l’arte della manutenzione della motocicletta</a>, Robert M. Pirsing</li>
<li><a href="https://www.goodreads.com/review/show/1563451334">La notte di Gerusalemme</a>, Sven Delblanc</li>
<li><a href="https://www.goodreads.com/review/show/1556032347">Saga di Ragnarr</a>, Anonimo</li>
<li><a href="https://www.goodreads.com/review/show/1549555009">Limonov</a>, Emmanuel Carrère</li>
<li><a href="https://www.goodreads.com/review/show/1533868319">E l’uomo inventò il cane</a>, Konrad Lorenz</li>
<li><a href="https://www.goodreads.com/review/show/1527747427">Abolire il carcere</a>, Luigi Manconi et alii</li>
<li><a href="https://www.goodreads.com/review/show/1519088977">Il ritorno del guerriero: lettura dell’Odissea</a>, G. Aurelio Privitera</li>
<li><a href="https://www.goodreads.com/review/show/1502108718">L’invenzione della madre</a>, Marco Peano</li>
<li><a href="https://www.goodreads.com/review/show/1488650659">Un infinito numero</a>, Sebastiano Vassalli</li>
</ul>
<h3 id="2015">2015</h3>
<ul>
<li><a href="https://www.goodreads.com/review/show/1482882858">Fiabe Danesi</a>, Bruno Berni</li>
<li><a href="https://www.goodreads.com/review/show/1482688300">Mattatoio n°5</a>, Kurt Vonnegut</li>
<li><a href="https://www.goodreads.com/review/show/1467755070">Aleph</a>, Jorge Luis Borges</li>
<li><a href="https://www.goodreads.com/review/show/1455103200">Monte Athos</a>, Robert Byron</li>
<li><a href="https://www.goodreads.com/review/show/1441612993">Solo bagaglio a mano</a>, Gabriele Romagnoli</li>
<li><a href="https://www.goodreads.com/review/show/1435128801">Un angelo migliore</a>, Chris Adrian</li>
<li><a href="https://www.goodreads.com/review/show/1426504724">Il caso Meursault</a>, Kamel Daoud</li>
<li><a href="https://www.goodreads.com/review/show/1423278007">Il caso</a>, Joseph Conrad</li>
<li><a href="https://www.goodreads.com/review/show/1405698399">La strada interrotta</a>, Patrick Leigh Fermor</li>
<li><a href="https://www.goodreads.com/review/show/1394126838">La biblioteca: una storia mondiale</a>, James W.P. Campbell</li>
<li><a href="https://www.goodreads.com/review/show/1381140217">Land grabbing</a>, Stefano Liberti</li>
<li><a href="https://www.goodreads.com/review/show/1374753169">La tregua</a>, Primo Levi</li>
<li><a href="https://www.goodreads.com/review/show/1365263034">Tra i boschi e l’acqua</a>, Patrick Leigh Fermor</li>
<li><a href="https://www.goodreads.com/review/show/1352692520">Dedalus</a>, James Joyce</li>
<li><a href="https://www.goodreads.com/review/show/1344852832">I frutti della terra</a>, Knut Hamsun</li>
<li><a href="https://www.goodreads.com/review/show/1340190765">Laxdæla Saga</a>, Anonimo</li>
<li><a href="https://www.goodreads.com/review/show/1333700325">Misteri</a>, Knut Hamsun</li>
<li><a href="https://www.goodreads.com/review/show/1325095803">Epepe</a>, Ferenc Karinthy</li>
<li><a href="https://www.goodreads.com/review/show/1317474896">Operazione Fritham</a>, Monica Kristensen</li>
<li><a href="https://www.goodreads.com/review/show/1311368840">Se questo è un’uomo</a>, Primo Levi</li>
<li><a href="https://www.goodreads.com/review/show/1303152018">La congiura</a>, Jaan Kross</li>
<li><a href="https://www.goodreads.com/review/show/1297878492">L’arte di collezionare mosche</a>, Fredrik Sjöberg</li>
<li><a href="https://www.goodreads.com/review/show/1292774363">Il paese dei coppoloni</a>, Vinicio Capossela</li>
<li><a href="https://www.goodreads.com/review/show/1270425127">Storie di Amsterdam</a>, Nescio</li>
<li><a href="https://www.goodreads.com/review/show/1262139644">Il Regno</a>, Emmanuel Carrère</li>
<li><a href="https://www.goodreads.com/review/show/1236116854">La ballata di Adam Henry</a>, Ian McEwan</li>
<li><a href="https://www.goodreads.com/review/show/1230135541">Sette brevi lezioni di fisica</a>, Carlo Rovelli</li>
<li><a href="https://www.goodreads.com/review/show/1230140632">Viaggio nelle regioni equatoriali del nuovo continente</a>, A. von Humboldt</li>
<li><a href="https://www.goodreads.com/review/show/1224596355">The Little Go Book</a>, Karl Seguin</li>
<li><a href="https://www.goodreads.com/review/show/1220098813">The Little Redis Book</a>, Karl Seguin</li>
<li><a href="https://www.goodreads.com/review/show/1199299636">Preparare un fuoco</a>, Jack London</li>
<li><a href="https://www.goodreads.com/review/show/1196802570">Diario di Oaxaca</a>, Oliver Sacks</li>
<li><a href="https://www.goodreads.com/review/show/1190281563">Giuda</a>, Amos Oz</li>
<li><a href="https://www.goodreads.com/review/show/1185205212">I colori del ghiaccio</a>, Robert Peroni</li>
<li><a href="https://www.goodreads.com/review/show/1179716212">The First 20 Minutes</a>, Gretchen Reynolds</li>
<li><a href="https://www.goodreads.com/review/show/1160595663">La leggenda della Rosa di Natale</a>, Selma Lagerlöf</li>
</ul>
<h3 id="2014">2014</h3>
<ul>
<li><a href="https://www.goodreads.com/review/show/1037702336">Shantaram</a>, Gregory David Roberts</li>
<li><a href="https://www.goodreads.com/review/show/1037702487">Il costo di una vita</a>, Angelo Ferracuti</li>
<li><a href="https://www.goodreads.com/review/show/1115318605">Un altro giro di giostra</a>, Tiziano Terzani</li>
<li><a href="https://www.goodreads.com/review/show/1081819093">L’assassinio di Roger Ackroyd</a>, Agatha Christie</li>
<li><a href="https://www.goodreads.com/review/show/1078119483">Molto forte incredibilmente vicino</a>, Jonathan Safran Foer</li>
<li><a href="https://www.goodreads.com/review/show/1069215752">Leonardo da Vinci</a>, Serge Bramly</li>
<li><a href="https://www.goodreads.com/review/show/919046304">L’armata dei sonnambuli</a>, Wu Ming</li>
<li><a href="https://www.goodreads.com/review/show/1015429086">Cristoforo Colombo uomo di mare</a>, Samuel Eliot Morison</li>
<li><a href="https://www.goodreads.com/review/show/998290682">Lorenzo il Magnifico</a>, Ivan Cloulas</li>
<li><a href="https://www.goodreads.com/review/show/893232976">Il cardellino</a>, Donna Tartt</li>
<li><a href="https://www.goodreads.com/review/show/903371517">Frugalità</a>, Paolo Legrenzi</li>
<li><a href="https://www.goodreads.com/review/show/872811223">Le vie dei canti</a>, Bruce Chatwin</li>
<li><a href="https://www.goodreads.com/review/show/858528722">La paura e altri racconti della grande guerra</a>, Federico De Roberto</li>
<li><a href="https://www.goodreads.com/review/show/837986601">Indagine sull’Orco</a>, Tommaso Braccini</li>
<li><a href="https://www.goodreads.com/review/show/854458131">Il sentiero degli Dei</a>, Wu Ming 2</li>
<li><a href="https://www.goodreads.com/review/show/837986436">Dove il vento grida più forte</a>, Robert Peroni</li>
<li><a href="https://www.goodreads.com/review/show/832011469">In senso inverso</a>, Philip K. Dick</li>
<li><a href="https://www.goodreads.com/review/show/816694446">Invecchiando gli uomini piangono</a>, Jean-Luc Seigle</li>
<li><a href="https://www.goodreads.com/review/show/789214361">Il fiordo dell’eternità</a>, Kim Leine</li>
</ul>
<h3 id="in-no-particular-order">In no particular order</h3>
<ul>
<li><a href="https://www.goodreads.com/review/show/740600326">Blackout</a>, Marc Elsberg</li>
<li><a href="https://www.goodreads.com/review/show/714736386">Open</a>, Andre Agassi</li>
<li><a href="https://www.goodreads.com/review/show/620401424">Jack London vita opere e avventura</a>, Daniel Dyer</li>
<li><a href="https://www.goodreads.com/review/show/507887505">Capire il potere</a>, Noam Chomsky</li>
<li><a href="https://www.goodreads.com/review/show/309350561">La stella di Ratner</a>, Don DeLillo</li>
<li><a href="https://www.goodreads.com/review/show/330184358">The Art of Slowing Down</a>, Edward Yu</li>
<li><a href="https://www.goodreads.com/review/show/442659878">I giocatori di Titano</a>, Philip K. Dick</li>
<li><a href="https://www.goodreads.com/review/show/408335378">Nel cuore della foresta</a>, Roger Deakin</li>
<li><a href="https://www.goodreads.com/review/show/462995315">La via del lupo</a>, Marco Albino Ferrari</li>
<li><a href="https://www.goodreads.com/review/show/442659274">Io e te</a>, Niccolò Ammaniti</li>
<li><a href="https://www.goodreads.com/review/show/401398828">Canale Mussolini</a>, Antonio Pennacchi</li>
<li><a href="https://www.goodreads.com/review/show/399758604">Ma gli androidi sognano pecore elettriche?</a>, Philip K. Dick</li>
<li><a href="https://www.goodreads.com/review/show/325452068">Andiamo a correre</a>, Fulvio Massini</li>
<li><a href="https://www.goodreads.com/review/show/308796340">La leggenda dei monti naviganti</a>, Paolo Rumiz</li>
<li><a href="https://www.goodreads.com/review/show/308796369">Neuromante</a>, William Gibson</li>
<li><a href="https://www.goodreads.com/review/show/308796660">Il giorno della civetta</a>, Leonardo Sascia</li>
<li><a href="https://www.goodreads.com/review/show/308796358">Vita nel Medioevo</a>, Eileen Power</li>
<li><a href="https://www.goodreads.com/review/show/308796284">Il tallone di ferro</a>, Jack London</li>
<li><a href="https://www.goodreads.com/review/show/308796420">Ragazzi di vita</a>, Pier Paolo Pasolini</li>
<li><a href="https://www.goodreads.com/review/show/308796386">La promessa</a>, Friedrich Dürrenmatt</li>
<li><a href="https://www.goodreads.com/review/show/308796302">Il vagabondo delle stelle</a>, Jack London</li>
<li><a href="https://www.goodreads.com/review/show/308796337">Finzioni</a>, Jorge Luis Borges</li>
<li><a href="https://www.goodreads.com/review/show/308796348">Oscar e la dama in rosa</a>, Éric-Emmanuel Schmitt</li>
<li><a href="https://www.goodreads.com/review/show/308796364">La difesa di Luzin</a>, Vladimir Nabokov</li>
<li><a href="https://www.goodreads.com/review/show/308796339">Il formaggio e i vermi</a>, Carlo Ginzburg</li>
<li><a href="https://www.goodreads.com/review/show/308796685">La scopa del sistema</a>, David Foster Wallace</li>
<li><a href="https://www.goodreads.com/review/show/308796686">I Nibelunghi</a>, Anonimo</li>
<li><a href="https://www.goodreads.com/review/show/308796388">Il cerchio celtico</a>, Björn Larsson</li>
<li><a href="https://www.goodreads.com/review/show/308796539">Il giardino di cemento</a>, Ian McEwan</li>
<li><a href="https://www.goodreads.com/review/show/308796325">Edda</a>, Snorri Sturluson</li>
<li><a href="https://www.goodreads.com/review/show/308796330">Brevi interviste con uomini schifosi</a>, David Foster Wallace</li>
<li><a href="https://www.goodreads.com/review/show/308811668">Fuoco Pallido</a>, Vladimir Nabokov</li>
<li><a href="https://www.goodreads.com/review/show/308796316">Il deserto dei Tartari</a>, Dino Buzzati</li>
<li><a href="https://www.goodreads.com/review/show/308796320">Fahrenheit 451</a>, Ray Bradbury</li>
<li><a href="https://www.goodreads.com/review/show/308796278">Sei passeggiate nei boschi narrativi</a>, Umberto Eco</li>
<li><a href="https://www.goodreads.com/review/show/308796466">L’anno della lepre</a>, Arto Paasilina</li>
<li><a href="https://www.goodreads.com/review/show/619215573">I Malavoglia</a>, Giovanni Verga</li>
<li><a href="https://www.goodreads.com/review/show/308818255">Non ci sono solo le arance</a>, Jeanette Winterson</li>
<li><a href="https://www.goodreads.com/review/show/308819667">Pastorale americana</a>, Philip Roth</li>
<li><a href="https://www.goodreads.com/review/show/782570509">La famiglia Winshaw</a>, Jonathan Coe</li>
<li><a href="https://www.goodreads.com/review/show/308796623">In viaggio con Erodoto</a>, Ryszard Kapuscinski</li>
<li><a href="https://www.goodreads.com/review/show/308796395">Lo Hobbit</a>, JRR Tolkien</li>
<li><a href="https://www.goodreads.com/review/show/308796421">La via per la Terra di Mezzo</a>, Tom Shippey</li>
<li><a href="https://www.goodreads.com/review/show/308796312">Martin Eden</a>, Jack London</li>
<li><a href="https://www.goodreads.com/review/show/308796368">Camminare</a>, Henry David Thoreau</li>
<li><a href="https://www.goodreads.com/review/show/317894790">Una barca nel bosco</a>, Paola Mastracola</li>
<li><a href="https://www.goodreads.com/review/show/308796353">La sovrana lettrice</a>, Alan Bennett</li>
<li><a href="https://www.goodreads.com/review/show/308796499">JRR Tolkien la biografia</a>, Humphrey Carpenter</li>
<li><a href="https://www.goodreads.com/review/show/732544684">La variante di Lüneburg</a>, Paolo Maurensig</li>
<li><a href="https://www.goodreads.com/review/show/308796625">Ti prendo e ti porto via</a>, Niccolò Ammaniti</li>
<li><a href="https://www.goodreads.com/review/show/308796296">Capo Horn</a>, Bernard Moitessier</li>
<li><a href="https://www.goodreads.com/review/show/308821923">Auto da fé</a>, Canetti Elias</li>
<li><a href="https://www.goodreads.com/review/show/308796651">In fuga</a>, Alice Munro</li>
<li><a href="https://www.goodreads.com/review/show/308796397">Armi acciaio e malattie</a>, Jared Diamond</li>
<li><a href="https://www.goodreads.com/review/show/308796365">La vera storia del pirata Long John Silver</a>, Larsson Björn</li>
<li><a href="https://www.goodreads.com/review/show/308801772">Nuova storia del Jazz</a>, Alyn Shipton</li>
<li><a href="https://www.goodreads.com/review/show/308796293">Il vangelo secondo Gesù Cristo</a>, José Saramago</li>
<li><a href="https://www.goodreads.com/review/show/308796394">Walden</a>, Henry David Throeau</li>
<li><a href="https://www.goodreads.com/review/show/308796577">Tifone</a>, Joseph Conrad</li>
<li><a href="https://www.goodreads.com/review/show/553979357">Il banchiere anarchico</a>, Fernando Pessoa</li>
<li><a href="https://www.goodreads.com/review/show/308796352">Anna Karenina</a>, Leo Tolstoy</li>
<li><a href="https://www.goodreads.com/review/show/308796679">La peste scarlatta</a>, Jack London</li>
<li><a href="https://www.goodreads.com/review/show/308796357">Il guardiano del frutteto</a>, Cormac McCarthy</li>
<li><a href="https://www.goodreads.com/review/show/308796326">Cuore di tenebra</a>, Joseph Conrad</li>
<li><a href="https://www.goodreads.com/review/show/308796707">Le ceneri di Angela</a>, Frank McCourt</li>
<li><a href="https://www.goodreads.com/review/show/308796525">Le lettere di Berlicche</a>, C.S. Lewis</li>
<li><a href="https://www.goodreads.com/review/show/308796354">Cristo col fucile in spalla</a>, Ryszard Kapuscinski</li>
<li><a href="https://www.goodreads.com/review/show/308796655">Norwegian Wood</a>, Haruki Murakami</li>
<li><a href="https://www.goodreads.com/review/show/308796307">Racconti incompiuti</a>, JRR Tolkien</li>
<li><a href="https://www.goodreads.com/review/show/308796498">La realtà in trasparenza</a>, JRR Tolkien</li>
<li><a href="https://www.goodreads.com/review/show/308796317">Underworld</a>, Don DeLillo</li>
<li><a href="https://www.goodreads.com/review/show/308796333">Non è un paese per vecchi</a>, Cormac McCarthy</li>
<li><a href="https://www.goodreads.com/review/show/308796335">V</a>, Thomas Pynchon</li>
<li><a href="https://www.goodreads.com/review/show/308782815">JavaScript: The Good Parts</a>, Douglas Crockford</li>
<li><a href="https://www.goodreads.com/review/show/308815294">Il paradiso degli orchi</a>, Daniel Pennac</li>
<li><a href="https://www.goodreads.com/review/show/308796659">Il giovane Holden</a>, JD Salinger</li>
<li><a href="https://www.goodreads.com/review/show/308796402">Dieci piccoli indiani</a>, Agatha Christie</li>
<li><a href="https://www.goodreads.com/review/show/308796383">Jazz</a>, Arrigo Polillo</li>
<li><a href="https://www.goodreads.com/review/show/308796305">La mia prima estate sulla Sierra</a>, John Muir</li>
<li><a href="https://www.goodreads.com/review/show/308796334">Fame</a>, Knut Hamsun</li>
<li><a href="https://www.goodreads.com/review/show/308796504">Kalevala</a>, Elias Lönnrot</li>
<li><a href="https://www.goodreads.com/review/show/308796401">Nelle terre estreme</a>, Jon Krakauer</li>
<li><a href="https://www.goodreads.com/review/show/308796351">Delitto e castigo</a>, Fyodor Dostoyevsky</li>
<li><a href="https://www.goodreads.com/review/show/308796417">Il volo della martora</a>, Mauro Corona</li>
<li><a href="https://www.goodreads.com/review/show/308796596">L’epopea di Gilgameš</a>, Anonimo</li>
<li><a href="https://www.goodreads.com/review/show/308796457">Tre mani nel buio</a>, Eraldo Baldini</li>
<li><a href="https://www.goodreads.com/review/show/308796370">54</a>, Wu Ming</li>
<li><a href="https://www.goodreads.com/review/show/308796328">I fantasmi delle biblioteche</a>, Jacques Bonnet</li>
<li><a href="https://www.goodreads.com/review/show/308796458">Faccia di sale</a>, Eraldo Baldini</li>
<li><a href="https://www.goodreads.com/review/show/308796460">Gotico rurale</a>, Eraldo Baldini</li>
<li><a href="https://www.goodreads.com/review/show/308796373">Bàrnabo delle montagne</a>, Dino Buzzati</li>
<li><a href="https://www.goodreads.com/review/show/308796318">Il compagno segreto</a>, Joseph Conrad</li>
<li><a href="https://www.goodreads.com/review/show/308796303">La biblioteca dei morti</a>, Glenn Cooper</li>
<li><a href="https://www.goodreads.com/review/show/308796537">Il libro dei libri perduti</a>, Stuart Kelly</li>
<li><a href="https://www.goodreads.com/review/show/308796300">Vertigine della lista</a>, Umberto Eco</li>
<li><a href="https://www.goodreads.com/review/show/308796689">Stella del mattino</a>, Wu Ming 4</li>
<li><a href="https://www.goodreads.com/review/show/308796588">Stagioni</a>, Mario Rigoni Stern</li>
<li><a href="https://www.goodreads.com/review/show/308796400">Inchiesta su Gesù</a>, Corrado Augias</li>
<li><a href="https://www.goodreads.com/review/show/308796289">Il peso della farfalla</a>, Erri De Luca</li>
<li><a href="https://www.goodreads.com/review/show/308793535">RESTful Web Services Cookbok</a>, Subbu Allamaraju</li>
<li><a href="https://www.goodreads.com/review/show/612844887">Il giro del mondo in barcastop</a>, Alberto Di Stefano</li>
<li><a href="https://www.goodreads.com/review/show/308796290">La finestra dei Ruoet</a>, Georges Simenon</li>
<li><a href="https://www.goodreads.com/review/show/308796385">La versione di Barney</a>, Mordecai Richler</li>
<li><a href="https://www.goodreads.com/review/show/399757870">Per questo mi chiamo Giovanni</a>, Luigi Garlando</li>
<li><a href="https://www.goodreads.com/review/show/308796331">Il cimitero di Praga</a>, Umberto Eco</li>
<li><a href="https://www.goodreads.com/review/show/308796403">Nel legno e nella pietra</a>, Mauro Corona</li>
<li><a href="https://www.goodreads.com/review/show/308796683">Diario di un dolore</a>, C.S. Lewis</li>
<li><a href="https://www.goodreads.com/review/show/308796331">Scipione e Annibale</a>, Giovanni Brizzi</li>
<li><a href="https://www.goodreads.com/review/show/308796315">Beowulf</a>, Anonimo</li>
<li><a href="https://www.goodreads.com/review/show/308796622">Dolomiti nella leggenda</a>, Ulrike Kindl</li>
<li><a href="https://www.goodreads.com/review/show/308796439">Leggende delle Dolomiti</a>, Giovanna Zangrandi</li>
<li><a href="https://www.goodreads.com/review/show/308796523">Collezionare libri antichi rari e di pregio</a>, Hanz Tuzzi</li>
<li><a href="https://www.goodreads.com/review/show/308796608">I popoli di Tolkien</a>, Gianfranco de Turris</li>
<li><a href="https://www.goodreads.com/review/show/308796536">Resisto dunque sono</a>, Pietro Trabucchi</li>
<li><a href="https://www.goodreads.com/review/show/308796456">Come il lupo</a>, Eraldo Baldini</li>
<li><a href="https://www.goodreads.com/review/show/308796349">Storia medievale</a>, Massimo Montanari</li>
<li><a href="https://www.goodreads.com/review/show/308796661">De rerum natura</a>, Lucrezio</li>
<li><a href="https://www.goodreads.com/review/show/308796324">I miti nordici</a>, Gianna Chiesa Isnardi</li>
<li><a href="https://www.goodreads.com/review/show/308796570">Perché corriamo</a>, Roberto Weber</li>
<li><a href="https://www.goodreads.com/review/show/308796650">Quell’estate di sangue e di luna</a>, Eraldo Baldini</li>
<li><a href="https://www.goodreads.com/review/show/308771346">11/22/63</a>, Stephen King</li>
<li><a href="https://www.goodreads.com/review/show/308796464">Bambine</a>, Eraldo Baldini</li>
<li><a href="https://www.goodreads.com/review/show/308796656">Il visconte dimezzato</a>, Italo Calvino</li>
<li><a href="https://www.goodreads.com/review/show/308796572">Il cavaliere inesistente</a>, Italo Calvino</li>
<li><a href="https://www.goodreads.com/review/show/308796687">La collezione</a>, Giampiero Mughini</li>
<li><a href="https://www.goodreads.com/review/show/400540581">Running fast and injury free</a>, Gordon Pirie</li>
<li><a href="https://www.goodreads.com/review/show/308796269">L’uomo che guardava passare i treni</a>, Georges Simenon</li>
<li><a href="https://www.goodreads.com/review/show/308796270">Il brigantaggio meridionale</a>, Aldo De Jaco</li>
<li><a href="https://www.goodreads.com/review/show/308796419">Paesaggi della Terra di Mezzo</a>, Roberto Arduini</li>
<li><a href="https://www.goodreads.com/review/show/308796594">Pan</a>, Knut Hamsun</li>
<li><a href="https://www.goodreads.com/review/show/308796534">Lo zen e il tiro con l’arco</a>, Eugen Herrigel</li>
<li><a href="https://www.goodreads.com/review/show/308796530">La linea d’ombra</a>, Joseph Conrad</li>
<li><a href="https://www.goodreads.com/review/show/553978068">No easy day</a>, Mark Owen</li>
<li><a href="https://www.goodreads.com/review/show/702647916">Eredità</a>, Lilli Gruber</li>
<li><a href="https://www.goodreads.com/review/show/539464451">Immagina i corvi</a>, Luigi Sorrenti</li>
<li><a href="https://www.goodreads.com/review/show/612845534">Point Lenana</a>, Wu Ming 1</li>
<li><a href="https://www.goodreads.com/review/show/585545151">La coscienza di Zeno</a>, Italo Svevo</li>
<li><a href="https://www.goodreads.com/review/show/308796374">Il lupo della steppa</a>, Hermann Hesse</li>
<li><a href="https://www.goodreads.com/review/show/308796380">Trilogia della Fondazione</a>, Isaac Asimov</li>
<li><a href="https://www.goodreads.com/review/show/308796347">Il mondo classico</a>, Robin Lane Fox</li>
<li><a href="https://www.goodreads.com/review/show/308796609">JRR Tokien: A Descriptive Bibliography</a>, Wayne G. Hammond</li>
<li><a href="https://www.goodreads.com/review/show/308796604">Tolkien and Modernity 1</a>, Thomas Honegger</li>
<li><a href="https://www.goodreads.com/review/show/308796603">Tolkien and Modernity 2</a>, Thomas Honegger</li>
<li><a href="https://www.goodreads.com/review/show/308796547">Gente di Dublino</a>, James Joyce</li>
<li><a href="https://www.goodreads.com/review/show/308796291">Ricordi dal sottosuolo</a>, Fyodor Dostoyevsky</li>
<li><a href="https://www.goodreads.com/review/show/308796454">Schegge di luce</a>, Verlyn Flieger</li>
<li><a href="https://www.goodreads.com/review/show/308796418">Tolkien e la Grande Guerra</a>, John Garth</li>
<li><a href="https://www.goodreads.com/review/show/308796343">Ebano</a>, Ryszard Kapuscinski</li>
<li><a href="https://www.goodreads.com/review/show/308796363">Q</a>, Wu Ming</li>
<li><a href="https://it.wikipedia.org/wiki/Storie_(Erodoto)">Storie</a>, Erodoto</li>
<li><a href="https://www.goodreads.com/review/show/1316226569">Tempo di regali</a>, Patrick Leigh Fermor</li>
<li>…and <a href="https://www.goodreads.com/review/list/4665453">more</a>.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Speaking</title>
      <link>https://nicolaiarocci.com/speaking/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/speaking/</guid>
      <description>&lt;p&gt;I speak at conferences and meetups. Here is a list of my most recent
engagements. You may also want to check my &lt;a href=&#34;https://sessionize.com/nicolaiarocci/&#34;&gt;Sessionize&lt;/a&gt; profile. i&lt;/p&gt;
&lt;p&gt;Want me to talk at your event? &lt;a href=&#34;mailto:info@nicolaiarocci.com&#34;&gt;Get in touch&lt;/a&gt;!&lt;/p&gt;
&lt;h3 id=&#34;2026&#34;&gt;2026&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;.NET Saturday 2026, Pordenone: &lt;a href=&#34;https://dotnetsat2026pn.1nn0va.it/#schedule&#34;&gt;Feature Flags e configurazioni dinamiche in C# e .NET&lt;/a&gt;
curl -u &amp;ldquo;ik_live_33OYhTW8MdnEpM62HIA8w4OGrsiMKKFK:&amp;rdquo; &lt;br&gt;
-X POST &lt;a href=&#34;https://api.invoicetronic.com/v1/company&#34;&gt;https://api.invoicetronic.com/v1/company&lt;/a&gt; &lt;br&gt;
-H &amp;ldquo;Content-Type: application/json&amp;rdquo; &lt;br&gt;
-H &amp;ldquo;Accept: application/json&amp;rdquo; &lt;br&gt;
-d &amp;lsquo;{
&amp;ldquo;vat&amp;rdquo;: &amp;ldquo;IT12345&amp;rdquo;,
&amp;ldquo;fiscal_code&amp;rdquo;: &amp;ldquo;12345&amp;rdquo;,
&amp;ldquo;name&amp;rdquo;: &amp;ldquo;ciao&amp;rdquo;
}&amp;rsquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2025&#34;&gt;2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WPC 2025, Milan: &lt;a href=&#34;https://nicolaiarocci.com/code-from-my-session-at-wpc-2025/&#34;&gt;Feature Flags e configurazioni dinamiche in C# e .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;.NET Conference 2025, Milan: &lt;a href=&#34;https://nicolaiarocci.com/my-session-on-mcp-servers-at-dotnet-conference-italia-2025/&#34;&gt;Integrare LLM alle nostre applicazioni in .NET con MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevMarche Summer AI Afternoon: &lt;a href=&#34;https://www.eventbrite.it/e/summer-ai-afternoon-tickets-1428458029419&#34;&gt;MCP or how to connect our apps to LLMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevRomagna Meetup: &lt;a href=&#34;https://www.meetup.com/devromagna/events/308179204/&#34;&gt;MCP or how to connect our apps to LLMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;.NET Conf 2025, Rome: &lt;a href=&#34;https://dotnetconf.it&#34;&gt;C# 13 What&amp;rsquo;s new and interesting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2024&#34;&gt;2024&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;.NET Conference Italia 2024, Milan: &lt;a href=&#34;https://www.dotnetconference.it/e/3538/-NET-Conference-Italia-2024&#34;&gt;C# 13 What&amp;rsquo;s new and interesting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ABP Dotnet Conference 2024, Turkey: &lt;a href=&#34;https://abp.io/conference/2024&#34;&gt;C# 12 What&amp;rsquo;s new and interesting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WebDay 2024, Milan: &lt;a href=&#34;https://www.webdayconf.it/e/3328/Web-Day-2024&#34;&gt;Oauth2 e Open ID Connect con ASP.NET Core 8&lt;/a&gt; (&lt;a href=&#34;https://www.improove.tech/videos/3376/Oauth2-e-Open-ID-Connect-con-ASP-NET-Core-8&#34;&gt;video&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;.NET Rome Conference 2024: &lt;a href=&#34;https://www.dotnetconf.it/agenda&#34;&gt;Oauth2 e Open ID Connect con ASP.NET Core 8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2023&#34;&gt;2023&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;.NET Conference Italia 2023, Milan: &lt;a href=&#34;https://www.dotnetconference.it/e/sessione/3295/C-12-Cosa-c-e-di-nuovo-e-interessante&#34;&gt;C# 12 What&amp;rsquo;s new and interesting&lt;/a&gt; (&lt;a href=&#34;https://www.ugidotnet.org/e/sessione/3295/C-12-Cosa-c-e-di-nuovo-e-interessante&#34;&gt;video&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;WebDay 2023, Milan: &lt;a href=&#34;https://www.webdayconf.it/e/3087/Web-Day-2023&#34;&gt;End-to-end testing with Microsoft Playwright&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevRomagna Meetup, &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/events/289709131/&#34;&gt;.NET 7 Spotlight&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2022&#34;&gt;2022&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WPC 2022, Milan: &lt;a href=&#34;https://nicolaiarocci.com/my-session-at-wpc-2022/&#34;&gt;Reliable end-to-end testing for  modern web apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevRomagna: &lt;a href=&#34;https://www.meetup.com/it-IT/DevRomagna/events/284626987/&#34;&gt;Modern Web Testing with Microsoft Playwright&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WebDay 2022: &lt;a href=&#34;https://www.ugidotnet.org/e/sessione/2883/Reliable-end-to-end-testing-for-modern-web-apps-with-Playwright-for-NET&#34;&gt;Reliable end-to-end testing for modern web apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2021&#34;&gt;2021&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DotNetPodcast: &lt;a href=&#34;https://www.spreaker.com/user/dotnetpodcast/python-eve-open-source-e-fattura-elettro&#34;&gt;My Open Source experience (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Scottish Summit 2021: &lt;a href=&#34;https://scottishsummit.com/ss2021&#34;&gt;Introduction to F# and functional programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CodeGen 2021: &lt;a href=&#34;https://codegen2021.azurewebsites.net/agenda&#34;&gt;Python REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2020&#34;&gt;2020&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sharif University of Technology, Tehran: &lt;a href=&#34;https://ssc.ce.sharif.edu&#34;&gt;Open Source Workshop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Python Show #7: &lt;a href=&#34;https://www.youtube.com/watch?v=-B0QXTQN3yM&#34;&gt;My Story with Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python Conf++ 2020, Moscow: &lt;a href=&#34;https://conf.python.ru/en/2020/&#34;&gt;Cerberus or Data Validation for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Modena Tech Summit 2020: &lt;a href=&#34;https://modenatechsummit.it/&#34;&gt;Introduction to F# and functional programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2019&#34;&gt;2019&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PiterPy 2019, St. Petersburg: &lt;a href=&#34;https://piterpy.com/materials/2631&#34;&gt;Python on Windows, the State of the Art&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XPUG Bologna 2019: &lt;a href=&#34;https://www.eventbrite.it/e/biglietti-introduzione-a-f-e-functional-programming-nicola-iarocci-74142958585#&#34;&gt;Introduction to F# and functional programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Agile Venture Firenze 2019: &lt;a href=&#34;https://www.agileday.it/venture/2019/firenze/&#34;&gt;My Story with Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevMarche 2019: &lt;a href=&#34;https://www.eventbrite.it/e/biglietti-introduzione-a-f-e-ai-linguaggi-funzionali-per-il-programmatore-c-oop-64430134266?fbclid=IwAR0eBGHMGN1QX4ZoJ0NBzz52713LuX32tcu25jcGH_f4a318HUtFSH6GdaI&#34;&gt;Introduction to F# and functional programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Working Software Conf 2019: &lt;a href=&#34;https://www.agilemovement.it/workingsoftware/schedule.html#schedule&#34;&gt;My Story with Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Community Days 2019: &lt;a href=&#34;http://www.communitydays.it/events/2019/dev11/&#34;&gt;Introduction to F# and functional programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KLab 2019 #3: &lt;a href=&#34;https://www.eventbrite.com/e/klab-2019-3-typescript-come-forse-non-lo-avete-mai-visto-git-on-the-front-line-tickets-61043068461#&#34;&gt;Git on the frontline&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;past&#34;&gt;Past&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WPC 2018, Milan: &lt;a href=&#34;http://wpc2017.it/cms/it-IT/SpeakerPage?parameters%5B0%5D=73&#34;&gt;The Mythical Open Source Contributor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;EuroPython 2018, Edinburgh: &lt;a href=&#34;https://ep2018.europython.eu/conference/p/nicola-iarocci&#34;&gt;My Story with Python and Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyConWeb 2018, Munich: &lt;a href=&#34;https://2018.pyconweb.com/talks/30-06-2018/my-story-with-python-and-open-source&#34;&gt;My Story with Python and Open Source&lt;/a&gt; (keynote)&lt;/li&gt;
&lt;li&gt;PyConWeb 2018, Munich: &lt;a href=&#34;https://2018.pyconweb.com/talks/30-06-2018/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyCon Italy 2018: &lt;a href=&#34;https://www.pycon.it/conference/talks/my-story-with-python-and-open-source&#34;&gt;My Story with Python and Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyCon Belarus 2018: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WPC 2017: &lt;a href=&#34;http://wpc2017.it/cms/it-IT/SpeakerPage?parameters%5B0%5D=73&#34;&gt;Git on the frontline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Constellation: &lt;a href=&#34;http://githubconstellation.com/milan/#nicola-iarocci&#34;&gt;My story with Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Codemotion Milan 2017: &lt;a href=&#34;https://milan2017.codemotionworld.com/speaker/460/&#34;&gt;Git on the frontline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PiterPy 2017: &lt;a href=&#34;https://it-events.com/events/8527/materials/2327&#34;&gt;Cerberus, Data Validation for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevRomagna: &lt;a href=&#34;https://www.meetup.com/it-IT/preview/DevRomagna/events/240838433&#34;&gt;Git on the trenches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;EuroPython 2017: &lt;a href=&#34;https://speakerdeck.com/nicola/python-on-windows-like-a-boss&#34;&gt;Python on Windows Like a Boss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;This is Python 2017: &lt;a href=&#34;https://speakerdeck.com/nicola/python-on-windows-like-a-boss&#34;&gt;Python on Windows Like a Boss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Socrates Italy 2017: Git in the trenches&lt;/li&gt;
&lt;li&gt;Socrates Italy 2017: Bringing an Open Source project to the next level&lt;/li&gt;
&lt;li&gt;DevRomagna: &lt;a href=&#34;https://www.meetup.com/it-IT/DevRomagna/events/239382597/&#34;&gt;Contributing to Open Source projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevRomagna: &lt;a href=&#34;https://www.meetup.com/it-IT/DevRomagna/events/239110404/&#34;&gt;Git Branching Models and Semantic Versioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyCon Italy 2017: &lt;a href=&#34;https://speakerdeck.com/nicola/python-on-windows-like-a-boss&#34;&gt;Python on Windows Like a Boss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyCon Italy 2017: Microsoft Azure integration with Open Technologies (Panel)&lt;/li&gt;
&lt;li&gt;Codemotion Rome 2017: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Restful Web Services for human beings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Future Decoded 2016: &lt;a href=&#34;https://speakerdeck.com/nicola/python-tools-for-visual-studio&#34;&gt;Python Tools for Visual Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyConUK 2016: &lt;a href=&#34;https://speakerdeck.com/nicola/cerberus&#34;&gt;Cerberus, Data Validation for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyterPy 2016: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyCon Italy 2016: &lt;a href=&#34;https://speakerdeck.com/nicola/cerberus&#34;&gt;Cerberus, Data Validation for Humans&lt;/a&gt; (&lt;a href=&#34;https://youtu.be/WQJP_2FkBqI&#34;&gt;video, Italian&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;PyCon Italy 2016: &lt;a href=&#34;https://speakerdeck.com/nicola/flask-web-development-one-drop-at-a-time&#34;&gt;Web Framework Royal Rumble&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Western Europe MVP Open Day 2016: &lt;a href=&#34;https://speakerdeck.com/nicola/real-life-net-cross-platform&#34;&gt;Real Life .NET Cross Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenDomus.net Communities Meetup: &lt;a href=&#34;https://speakerdeck.com/nicola/real-life-net-cross-platform&#34;&gt;Real Life .NET Cross Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft TecHeroes: &lt;a href=&#34;https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform&#34;&gt;Real Life .NET Cross Platform (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft Best of Build: &lt;a href=&#34;https://channel9.msdn.com/Shows/Best-of-Build--Italy/Bash-su-Ubuntu-su-Windows&#34;&gt;Bash on Ubuntu on Windows (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft TecHeroes: &lt;a href=&#34;https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-VSVim-Editor&#34;&gt;Vim for Visual Studio (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft TecHeroes: &lt;a href=&#34;https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Python-tools-per-Visual-Studio&#34;&gt;Python Tools for Visual Studio (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft TecHeroes: &lt;a href=&#34;https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids&#34;&gt;CoderDoojo Coding Club for Kids (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Persona Live 2015: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;EuroPython 2014: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyCon Italy 2014: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyCon Sweden 2014: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python Meetup: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FOSDEM 2014: &lt;a href=&#34;https://speakerdeck.com/nicola/eve-rest-api-for-humans&#34;&gt;Eve, REST APIs for Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RomagnaCamp 2013: &lt;a href=&#34;https://speakerdeck.com/nicola/we-are-all-remote-workers&#34;&gt;We Are All Remote Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;NoSQL Day 2013: &lt;a href=&#34;https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic&#34;&gt;RESTful Web API and MongoDB go for a picnic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MongoTorino 2013: &lt;a href=&#34;https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic&#34;&gt;RESTful Web API and MongoDB go for a picnic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Morning With MongoDB: &lt;a href=&#34;https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic&#34;&gt;RESTful Web API and MongoDB go for a picnic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;EuroPython 2012: &lt;a href=&#34;https://speakerdeck.com/nicola/developing-restful-web-apis-with-python-flask-and-mongodb&#34;&gt;Developing RESTful Web APIs with Python, Flask and MongoDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Agenda Digitale Ravenna 2014: &lt;a href=&#34;https://speakerdeck.com/nicola/coderdojo-romagna&#34;&gt;CoderDojo Romagna&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cultura d&amp;rsquo;Impresa 2.0: &lt;a href=&#34;https://speakerdeck.com/nicola/online&#34;&gt;Online / Offline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Liceo Artistico Severini (Ravenna): &lt;a href=&#34;https://speakerdeck.com/nicola/identita-reale-virtuale-e-digitale&#34;&gt;Identità Reale, Virtuale e Digitale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Liceo Artistico Severini (Ravenna): &lt;a href=&#34;https://speakerdeck.com/nicola/personal-branding-per-studenti-e-non-solo&#34;&gt;Personal Branding per Studenti e non solo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KnowCamp 2011: &lt;a href=&#34;https://speakerdeck.com/nicola/fuga-dalla-comfort-zone&#34;&gt;Fuga dalla Comfort Zone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RomagnaCamp 2011: &lt;a href=&#34;https://speakerdeck.com/nicola/quattro-passi-tra-le-nuvole&#34;&gt;Quattro passi tra le nuvole&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>I speak at conferences and meetups. Here is a list of my most recent
engagements. You may also want to check my <a href="https://sessionize.com/nicolaiarocci/">Sessionize</a> profile. i</p>
<p>Want me to talk at your event? <a href="mailto:info@nicolaiarocci.com">Get in touch</a>!</p>
<h3 id="2026">2026</h3>
<ul>
<li>.NET Saturday 2026, Pordenone: <a href="https://dotnetsat2026pn.1nn0va.it/#schedule">Feature Flags e configurazioni dinamiche in C# e .NET</a>
curl -u &ldquo;ik_live_33OYhTW8MdnEpM62HIA8w4OGrsiMKKFK:&rdquo; <br>
-X POST <a href="https://api.invoicetronic.com/v1/company">https://api.invoicetronic.com/v1/company</a> <br>
-H &ldquo;Content-Type: application/json&rdquo; <br>
-H &ldquo;Accept: application/json&rdquo; <br>
-d &lsquo;{
&ldquo;vat&rdquo;: &ldquo;IT12345&rdquo;,
&ldquo;fiscal_code&rdquo;: &ldquo;12345&rdquo;,
&ldquo;name&rdquo;: &ldquo;ciao&rdquo;
}&rsquo;</li>
</ul>
<h3 id="2025">2025</h3>
<ul>
<li>WPC 2025, Milan: <a href="/code-from-my-session-at-wpc-2025/">Feature Flags e configurazioni dinamiche in C# e .NET</a></li>
<li>.NET Conference 2025, Milan: <a href="/my-session-on-mcp-servers-at-dotnet-conference-italia-2025/">Integrare LLM alle nostre applicazioni in .NET con MCP</a></li>
<li>DevMarche Summer AI Afternoon: <a href="https://www.eventbrite.it/e/summer-ai-afternoon-tickets-1428458029419">MCP or how to connect our apps to LLMs</a></li>
<li>DevRomagna Meetup: <a href="https://www.meetup.com/devromagna/events/308179204/">MCP or how to connect our apps to LLMs</a></li>
<li>.NET Conf 2025, Rome: <a href="https://dotnetconf.it">C# 13 What&rsquo;s new and interesting</a></li>
</ul>
<h3 id="2024">2024</h3>
<ul>
<li>.NET Conference Italia 2024, Milan: <a href="https://www.dotnetconference.it/e/3538/-NET-Conference-Italia-2024">C# 13 What&rsquo;s new and interesting</a></li>
<li>ABP Dotnet Conference 2024, Turkey: <a href="https://abp.io/conference/2024">C# 12 What&rsquo;s new and interesting</a></li>
<li>WebDay 2024, Milan: <a href="https://www.webdayconf.it/e/3328/Web-Day-2024">Oauth2 e Open ID Connect con ASP.NET Core 8</a> (<a href="https://www.improove.tech/videos/3376/Oauth2-e-Open-ID-Connect-con-ASP-NET-Core-8">video</a>)</li>
<li>.NET Rome Conference 2024: <a href="https://www.dotnetconf.it/agenda">Oauth2 e Open ID Connect con ASP.NET Core 8</a></li>
</ul>
<h3 id="2023">2023</h3>
<ul>
<li>.NET Conference Italia 2023, Milan: <a href="https://www.dotnetconference.it/e/sessione/3295/C-12-Cosa-c-e-di-nuovo-e-interessante">C# 12 What&rsquo;s new and interesting</a> (<a href="https://www.ugidotnet.org/e/sessione/3295/C-12-Cosa-c-e-di-nuovo-e-interessante">video</a>)</li>
<li>WebDay 2023, Milan: <a href="https://www.webdayconf.it/e/3087/Web-Day-2023">End-to-end testing with Microsoft Playwright</a></li>
<li>DevRomagna Meetup, <a href="https://www.meetup.com/it-IT/devromagna/events/289709131/">.NET 7 Spotlight</a></li>
</ul>
<h3 id="2022">2022</h3>
<ul>
<li>WPC 2022, Milan: <a href="/my-session-at-wpc-2022/">Reliable end-to-end testing for  modern web apps</a></li>
<li>DevRomagna: <a href="https://www.meetup.com/it-IT/DevRomagna/events/284626987/">Modern Web Testing with Microsoft Playwright</a></li>
<li>WebDay 2022: <a href="https://www.ugidotnet.org/e/sessione/2883/Reliable-end-to-end-testing-for-modern-web-apps-with-Playwright-for-NET">Reliable end-to-end testing for modern web apps</a></li>
</ul>
<h3 id="2021">2021</h3>
<ul>
<li>DotNetPodcast: <a href="https://www.spreaker.com/user/dotnetpodcast/python-eve-open-source-e-fattura-elettro">My Open Source experience (Italian)</a></li>
<li>Scottish Summit 2021: <a href="https://scottishsummit.com/ss2021">Introduction to F# and functional programming</a></li>
<li>CodeGen 2021: <a href="https://codegen2021.azurewebsites.net/agenda">Python REST APIs for Humans</a></li>
</ul>
<h3 id="2020">2020</h3>
<ul>
<li>Sharif University of Technology, Tehran: <a href="https://ssc.ce.sharif.edu">Open Source Workshop</a></li>
<li>The Python Show #7: <a href="https://www.youtube.com/watch?v=-B0QXTQN3yM">My Story with Open Source</a></li>
<li>Python Conf++ 2020, Moscow: <a href="https://conf.python.ru/en/2020/">Cerberus or Data Validation for Humans</a></li>
<li>Modena Tech Summit 2020: <a href="https://modenatechsummit.it/">Introduction to F# and functional programming</a></li>
</ul>
<h3 id="2019">2019</h3>
<ul>
<li>PiterPy 2019, St. Petersburg: <a href="https://piterpy.com/materials/2631">Python on Windows, the State of the Art</a></li>
<li>XPUG Bologna 2019: <a href="https://www.eventbrite.it/e/biglietti-introduzione-a-f-e-functional-programming-nicola-iarocci-74142958585#">Introduction to F# and functional programming</a></li>
<li>Agile Venture Firenze 2019: <a href="https://www.agileday.it/venture/2019/firenze/">My Story with Open Source</a></li>
<li>DevMarche 2019: <a href="https://www.eventbrite.it/e/biglietti-introduzione-a-f-e-ai-linguaggi-funzionali-per-il-programmatore-c-oop-64430134266?fbclid=IwAR0eBGHMGN1QX4ZoJ0NBzz52713LuX32tcu25jcGH_f4a318HUtFSH6GdaI">Introduction to F# and functional programming</a></li>
<li>Working Software Conf 2019: <a href="https://www.agilemovement.it/workingsoftware/schedule.html#schedule">My Story with Open Source</a></li>
<li>Community Days 2019: <a href="http://www.communitydays.it/events/2019/dev11/">Introduction to F# and functional programming</a></li>
<li>KLab 2019 #3: <a href="https://www.eventbrite.com/e/klab-2019-3-typescript-come-forse-non-lo-avete-mai-visto-git-on-the-front-line-tickets-61043068461#">Git on the frontline</a></li>
</ul>
<h3 id="past">Past</h3>
<ul>
<li>WPC 2018, Milan: <a href="http://wpc2017.it/cms/it-IT/SpeakerPage?parameters%5B0%5D=73">The Mythical Open Source Contributor</a></li>
<li>EuroPython 2018, Edinburgh: <a href="https://ep2018.europython.eu/conference/p/nicola-iarocci">My Story with Python and Open Source</a></li>
<li>PyConWeb 2018, Munich: <a href="https://2018.pyconweb.com/talks/30-06-2018/my-story-with-python-and-open-source">My Story with Python and Open Source</a> (keynote)</li>
<li>PyConWeb 2018, Munich: <a href="https://2018.pyconweb.com/talks/30-06-2018/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>PyCon Italy 2018: <a href="https://www.pycon.it/conference/talks/my-story-with-python-and-open-source">My Story with Python and Open Source</a></li>
<li>PyCon Belarus 2018: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>WPC 2017: <a href="http://wpc2017.it/cms/it-IT/SpeakerPage?parameters%5B0%5D=73">Git on the frontline</a></li>
<li>GitHub Constellation: <a href="http://githubconstellation.com/milan/#nicola-iarocci">My story with Open Source</a></li>
<li>Codemotion Milan 2017: <a href="https://milan2017.codemotionworld.com/speaker/460/">Git on the frontline</a></li>
<li>PiterPy 2017: <a href="https://it-events.com/events/8527/materials/2327">Cerberus, Data Validation for Humans</a></li>
<li>DevRomagna: <a href="https://www.meetup.com/it-IT/preview/DevRomagna/events/240838433">Git on the trenches</a></li>
<li>EuroPython 2017: <a href="https://speakerdeck.com/nicola/python-on-windows-like-a-boss">Python on Windows Like a Boss</a></li>
<li>This is Python 2017: <a href="https://speakerdeck.com/nicola/python-on-windows-like-a-boss">Python on Windows Like a Boss</a></li>
<li>Socrates Italy 2017: Git in the trenches</li>
<li>Socrates Italy 2017: Bringing an Open Source project to the next level</li>
<li>DevRomagna: <a href="https://www.meetup.com/it-IT/DevRomagna/events/239382597/">Contributing to Open Source projects</a></li>
<li>DevRomagna: <a href="https://www.meetup.com/it-IT/DevRomagna/events/239110404/">Git Branching Models and Semantic Versioning</a></li>
<li>PyCon Italy 2017: <a href="https://speakerdeck.com/nicola/python-on-windows-like-a-boss">Python on Windows Like a Boss</a></li>
<li>PyCon Italy 2017: Microsoft Azure integration with Open Technologies (Panel)</li>
<li>Codemotion Rome 2017: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Restful Web Services for human beings</a></li>
<li>Future Decoded 2016: <a href="https://speakerdeck.com/nicola/python-tools-for-visual-studio">Python Tools for Visual Studio</a></li>
<li>PyConUK 2016: <a href="https://speakerdeck.com/nicola/cerberus">Cerberus, Data Validation for Humans</a></li>
<li>PyterPy 2016: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>PyCon Italy 2016: <a href="https://speakerdeck.com/nicola/cerberus">Cerberus, Data Validation for Humans</a> (<a href="https://youtu.be/WQJP_2FkBqI">video, Italian</a>)</li>
<li>PyCon Italy 2016: <a href="https://speakerdeck.com/nicola/flask-web-development-one-drop-at-a-time">Web Framework Royal Rumble</a></li>
<li>Western Europe MVP Open Day 2016: <a href="https://speakerdeck.com/nicola/real-life-net-cross-platform">Real Life .NET Cross Platform</a></li>
<li>OpenDomus.net Communities Meetup: <a href="https://speakerdeck.com/nicola/real-life-net-cross-platform">Real Life .NET Cross Platform</a></li>
<li>Microsoft TecHeroes: <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform">Real Life .NET Cross Platform (Italian)</a></li>
<li>Microsoft Best of Build: <a href="https://channel9.msdn.com/Shows/Best-of-Build--Italy/Bash-su-Ubuntu-su-Windows">Bash on Ubuntu on Windows (Italian)</a></li>
<li>Microsoft TecHeroes: <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-VSVim-Editor">Vim for Visual Studio (Italian)</a></li>
<li>Microsoft TecHeroes: <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Python-tools-per-Visual-Studio">Python Tools for Visual Studio (Italian)</a></li>
<li>Microsoft TecHeroes: <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids">CoderDoojo Coding Club for Kids (Italian)</a></li>
<li>Persona Live 2015: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>EuroPython 2014: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>PyCon Italy 2014: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>PyCon Sweden 2014: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>Python Meetup: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>FOSDEM 2014: <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve, REST APIs for Humans</a></li>
<li>RomagnaCamp 2013: <a href="https://speakerdeck.com/nicola/we-are-all-remote-workers">We Are All Remote Workers</a></li>
<li>NoSQL Day 2013: <a href="https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic">RESTful Web API and MongoDB go for a picnic</a></li>
<li>MongoTorino 2013: <a href="https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic">RESTful Web API and MongoDB go for a picnic</a></li>
<li>A Morning With MongoDB: <a href="https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic">RESTful Web API and MongoDB go for a picnic</a></li>
<li>EuroPython 2012: <a href="https://speakerdeck.com/nicola/developing-restful-web-apis-with-python-flask-and-mongodb">Developing RESTful Web APIs with Python, Flask and MongoDB</a></li>
<li>Agenda Digitale Ravenna 2014: <a href="https://speakerdeck.com/nicola/coderdojo-romagna">CoderDojo Romagna</a></li>
<li>Cultura d&rsquo;Impresa 2.0: <a href="https://speakerdeck.com/nicola/online">Online / Offline</a></li>
<li>Liceo Artistico Severini (Ravenna): <a href="https://speakerdeck.com/nicola/identita-reale-virtuale-e-digitale">Identità Reale, Virtuale e Digitale</a></li>
<li>Liceo Artistico Severini (Ravenna): <a href="https://speakerdeck.com/nicola/personal-branding-per-studenti-e-non-solo">Personal Branding per Studenti e non solo</a></li>
<li>KnowCamp 2011: <a href="https://speakerdeck.com/nicola/fuga-dalla-comfort-zone">Fuga dalla Comfort Zone</a></li>
<li>RomagnaCamp 2011: <a href="https://speakerdeck.com/nicola/quattro-passi-tra-le-nuvole">Quattro passi tra le nuvole</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Open Source</title>
      <link>https://nicolaiarocci.com/opensource/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/opensource/</guid>
      <description>&lt;p&gt;You can follow my open source activity on &lt;a href=&#34;https://nicolaiarocci.com/tags/open-source/&#34;&gt;this website&lt;/a&gt; or &lt;a href=&#34;https://github.com/nicolaiarocci/&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is a partial list of open source projects I authored:&lt;/p&gt;
&lt;h3 id=&#34;c&#34;&gt;C#&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA&#34; title=&#34;FatturaElettronicaPA&#34;&gt;&lt;strong&gt;FatturaElettronica.NET&lt;/strong&gt;&lt;/a&gt;. Validation and de/serialization of electronic invoices adhering to the standard defined by the Italian “Agenzia delle Entrate”.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://python-eve.org&#34; title=&#34;Eve&#34;&gt;&lt;strong&gt;Eve&lt;/strong&gt;&lt;/a&gt;. Effortlessly build and deploy highly customizable, fully featured RESTful Web Services. Powered by Flask, MongoDB and good intentions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://python-cerberus.org&#34; title=&#34;Cerberus&#34;&gt;&lt;strong&gt;Cerberus&lt;/strong&gt;&lt;/a&gt;. Lightweight and extensible data validation library for Python. It provides type checking and other base functionality out of the box and is designed to be easily extensible, allowing for easy custom validation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>You can follow my open source activity on <a href="/tags/open-source/">this website</a> or <a href="https://github.com/nicolaiarocci/">GitHub</a>.</p>
<p>Here is a partial list of open source projects I authored:</p>
<h3 id="c">C#</h3>
<ul>
<li><a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA" title="FatturaElettronicaPA"><strong>FatturaElettronica.NET</strong></a>. Validation and de/serialization of electronic invoices adhering to the standard defined by the Italian “Agenzia delle Entrate”.</li>
</ul>
<h3 id="python">Python</h3>
<ul>
<li>
<p><a href="http://python-eve.org" title="Eve"><strong>Eve</strong></a>. Effortlessly build and deploy highly customizable, fully featured RESTful Web Services. Powered by Flask, MongoDB and good intentions.</p>
</li>
<li>
<p><a href="http://python-cerberus.org" title="Cerberus"><strong>Cerberus</strong></a>. Lightweight and extensible data validation library for Python. It provides type checking and other base functionality out of the box and is designed to be easily extensible, allowing for easy custom validation.</p>
</li>
<li>
<p><a href="https://github.com/nicolaiarocci/events" title="Events"><strong>Events</strong></a>. Bringing the elegance of C# EventHanlder to Python. Here is a handy class that encapsulates the core to event subscription and event firing and feels like a “natural” part of the language.</p>
</li>
<li>
<p><a href="https://github.com/nicolaiarocci/flask-sentinel" title="Flask-Sentinel"><strong>Flask-Sentinel</strong></a>. OAuth2 Server bundled as a Flask extension. Add OAuth2 capabilities to an existing or brand new Flask application.</p>
</li>
<li>
<p><a href="https://github.com/nicolaiarocci/eve-swagger" title="Eve-Swagger"><strong>Eve-Swagger</strong></a>. Swagger extension for Eve powered RESTful APIs.</p>
</li>
<li>
<p><a href="https://github.com/nicolaiarocci/flask-mimerender" title="Flask-MimeRender"><strong>Flask-MimeRender</strong></a>. Python module for RESTful resource representation using MIME Media-Types and the Flask Microframework.</p>
</li>
</ul>
<h3 id="other">Other</h3>
<ul>
<li><a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB"><strong>Il Piccolo Libro di MongoDB</strong></a>. Authorized Italian translation of The Little MongoDB Book di Karl Seguin.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>About</title>
      <link>https://nicolaiarocci.com/about/</link>
      <pubDate>Mon, 22 Nov 2010 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/about/</guid>
      <description>&lt;p&gt;Hello there! My name is Nicola, and this is my website. I use it to store my
memories and thoughts, share exciting resources, and post technical content. I
follow the &lt;a href=&#34;https://indieweb.org/POSSE&#34;&gt;POSSE&lt;/a&gt; methodology, meaning I share my
content on this website first and only later, eventually, on social media or
other platforms.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a coder at heart author of several &lt;a href=&#34;https://nicolaiarocci.com/opensource/&#34;&gt;open source projects&lt;/a&gt;, a &lt;a href=&#34;https://mvp.microsoft.com/en-US/mvp/profile/a6892d61-aea0-e511-8114-c4346bac0abc&#34;&gt;Microsoft
MVP&lt;/a&gt;, &lt;a href=&#34;https://nicolaiarocci.com/speaking/&#34;&gt;conference speaker&lt;/a&gt;, teacher and consultant. I live in Ravenna,
Italy, where I lead the development of &lt;a href=&#34;https://invoicetronic.com/en&#34;&gt;Invoicetronic&lt;/a&gt;, and electronic
invoicing API, and &lt;a href=&#34;https://gestionaleamica.com/&#34;&gt;Amica&lt;/a&gt;, a hybrid (cloud and on-premise) accounting app
for Italian small businesses. I also the creator and organizer of
&lt;a href=&#34;https://meetup.com/it-IT/devromagna/&#34;&gt;DevRomagna&lt;/a&gt;, the developer community in my area.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Hello there! My name is Nicola, and this is my website. I use it to store my
memories and thoughts, share exciting resources, and post technical content. I
follow the <a href="https://indieweb.org/POSSE">POSSE</a> methodology, meaning I share my
content on this website first and only later, eventually, on social media or
other platforms.</p>
<p>I&rsquo;m a coder at heart author of several <a href="/opensource/">open source projects</a>, a <a href="https://mvp.microsoft.com/en-US/mvp/profile/a6892d61-aea0-e511-8114-c4346bac0abc">Microsoft
MVP</a>, <a href="/speaking/">conference speaker</a>, teacher and consultant. I live in Ravenna,
Italy, where I lead the development of <a href="https://invoicetronic.com/en">Invoicetronic</a>, and electronic
invoicing API, and <a href="https://gestionaleamica.com/">Amica</a>, a hybrid (cloud and on-premise) accounting app
for Italian small businesses. I also the creator and organizer of
<a href="https://meetup.com/it-IT/devromagna/">DevRomagna</a>, the developer community in my area.</p>
<p>I am a former runner, climber and swimmer now keeping myself busy with
bodyweight training (I think it&rsquo;s called calisthenics these days). I love
reading <a href="/books-i-have-read/">good books</a>, hiking in the wilderness and riding my Triumph
Bonneville.</p>
<p>My all time favourite quote: <em>&ldquo;Only those who will risk going too
far can possibly find out how far one can go (T.S. Eliot)&rdquo;</em></p>
<h2 id="stay-up-to-date">Stay up to date</h2>
<p>Any of these options will allow you to read the site updates:</p>
<ul>
<li>Subscribe to my free newsletter, <em><a href="https://buttondown.email/nicolaiarocci">Ramblings of a Software Craftsman</a></em>.</li>
<li>Subscribe to the <a href="/index.xml">RSS feed</a>.</li>
<li>Follow me on <a href="https://fosstodon.org/@nicola">Mastodon</a></li>
</ul>
<h2 id="elsewhere">Elsewhere</h2>
<p>Find me on:</p>
<ul>
<li><a href="https://github.com/nicolaiarocci">GitHub</a></li>
<li><a href="https://www.last.fm/user/nicolaiarocci">Last.fm</a></li>
<li><a href="http://www.linkedin.com/in/nicolaiarocci">LinkedIn</a></li>
</ul>
<h2 id="get-in-touch">Get in touch</h2>
<p>Via <a href="mailto:nicola@nicolaiarocci.com">email</a>.</p>
<h2 id="no-guest-posts">No guest posts</h2>
<p>This is my personal website. I will not accept any “guest posts” here, not for compensation and not for any “good cause”. You can stop asking.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The future belongs to small companies</title>
      <link>https://nicolaiarocci.com/the-future-belongs-to-small-companies/</link>
      <pubDate>Mon, 30 Mar 2026 09:46:06 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-future-belongs-to-small-companies/</guid>
      <description>&lt;p&gt;JA Westenberg &lt;a href=&#34;https://www.joanwestenberg.com/notes-on-going-solo-celebrating-6-years-of-studio-self/&#34;&gt;reflects on six years of going solo&lt;/a&gt; after a career working for various conglomerates. She&amp;rsquo;s leveraging AI tools to automate most mundane and boring tasks, so she can focus on the creative, challenging, and ultimately fun work. According to her experience, these tools, when used effectively, will allow small companies and individuals to compete on equal footing with the giants of the industry:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think the future probably belongs to the small companies // individuals more than sprawling conglomerates. There is a huge opportunity for people who use AI to remove everything that isn&amp;rsquo;t judgment from their workload, and apply that judgement to good products and good services. My theory is that one person, with an AI-augmented operational layer plus taste is the company of the future - and I&amp;rsquo;d bet on that again and again.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>JA Westenberg <a href="https://www.joanwestenberg.com/notes-on-going-solo-celebrating-6-years-of-studio-self/">reflects on six years of going solo</a> after a career working for various conglomerates. She&rsquo;s leveraging AI tools to automate most mundane and boring tasks, so she can focus on the creative, challenging, and ultimately fun work. According to her experience, these tools, when used effectively, will allow small companies and individuals to compete on equal footing with the giants of the industry:</p>
<blockquote>
<p>I think the future probably belongs to the small companies // individuals more than sprawling conglomerates. There is a huge opportunity for people who use AI to remove everything that isn&rsquo;t judgment from their workload, and apply that judgement to good products and good services. My theory is that one person, with an AI-augmented operational layer plus taste is the company of the future - and I&rsquo;d bet on that again and again.</p></blockquote>
<p>A bold statement for sure. Like many others, I&rsquo;ve been experiencing this AI acceleration firsthand — more tasks, faster pace, less time to think. It can feel overwhelming. But Westenberg&rsquo;s framing resonates with me: the goal isn&rsquo;t to do everything faster, it&rsquo;s to consciously offload the repetitive and the mundane, and reclaim that space for the work that actually matters.  I run a tiny company myself, so I can only hope Joan is right.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Markdown ate the world</title>
      <link>https://nicolaiarocci.com/markdown-ate-the-world/</link>
      <pubDate>Thu, 26 Mar 2026 10:35:55 +0100</pubDate>
      <guid>https://nicolaiarocci.com/markdown-ate-the-world/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Markdown doesn&amp;rsquo;t do most of what those formats do. You can&amp;rsquo;t set margins. You can&amp;rsquo;t do columns. You can&amp;rsquo;t embed a pivot table or track changes or add a watermark that says DRAFT across every page in 45-degree gray Calibri. Markdown doesn&amp;rsquo;t even have a native way to change the font color.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And none of that mattered, because it turns out most writing isn&amp;rsquo;t about any of those things. Most writing is about getting words down in a structure that makes sense, and then getting those words in front of other people. Markdown does that with less friction than anything else ever created. You can learn it in ten minutes, write it in any text editor on any device, read the source file without rendering it, diff it in version control, and convert it to virtually any output format.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Markdown doesn&rsquo;t do most of what those formats do. You can&rsquo;t set margins. You can&rsquo;t do columns. You can&rsquo;t embed a pivot table or track changes or add a watermark that says DRAFT across every page in 45-degree gray Calibri. Markdown doesn&rsquo;t even have a native way to change the font color.</p></blockquote>
<blockquote>
<p>And none of that mattered, because it turns out most writing isn&rsquo;t about any of those things. Most writing is about getting words down in a structure that makes sense, and then getting those words in front of other people. Markdown does that with less friction than anything else ever created. You can learn it in ten minutes, write it in any text editor on any device, read the source file without rendering it, diff it in version control, and convert it to virtually any output format.</p></blockquote>
<p><a href="https://matduggan.com/markdown-ate-the-world/">Markdown Ate The World</a> is a nice and well-informed article. I appreciated the early brief history of word-processing file formats. I didn&rsquo;t know, for example, that <code>.docx</code> is just a zipped XML file. Oh, and I vividly remember the old times, when <code>.doc</code> files were as fragile as candles in the wind.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.3.1</title>
      <link>https://nicolaiarocci.com/eve-2.3.1/</link>
      <pubDate>Tue, 24 Mar 2026 09:15:50 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.3.1/</guid>
      <description>&lt;p&gt;I just released &lt;a href=&#34;https://pypi.org/project/Eve/2.3.1/&#34;&gt;Eve v2.3.1&lt;/a&gt;. In the unlikely event that you&amp;rsquo;ve been using JSONP callbacks with Eve, you&amp;rsquo;ll want to update as this patch improves on their security (&lt;a href=&#34;https://docs.python-eve.org/en/latest/changelog.html#version-v2-3-1&#34;&gt;changelog&lt;/a&gt;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just released <a href="https://pypi.org/project/Eve/2.3.1/">Eve v2.3.1</a>. In the unlikely event that you&rsquo;ve been using JSONP callbacks with Eve, you&rsquo;ll want to update as this patch improves on their security (<a href="https://docs.python-eve.org/en/latest/changelog.html#version-v2-3-1">changelog</a>).</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica 4.0.6</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-4.0.6/</link>
      <pubDate>Sun, 22 Mar 2026 09:05:32 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-4.0.6/</guid>
      <description>&lt;p&gt;A couple of days ago I released &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronica/4.0.6&#34;&gt;FatturaElettronica 4.0.6&lt;/a&gt;. It adds support for legacy &lt;code&gt;windows-1252&lt;/code&gt; encoding to both XML and P7M invoices, a long-standing annoyance that could previously be circumvented via external code.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;windows-1252&lt;/code&gt; encoding in Italian e-invoices has been a persistent headache — it&amp;rsquo;s technically outside the FatturaPA spec (which mandates UTF-8), but it crops up often enough in real-world invoices from older or misconfigured billing systems that users kept running into it. The &lt;a href=&#34;https://invoicetronic.com&#34;&gt;Invoicetronic&lt;/a&gt; stack has been updated accordingly.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A couple of days ago I released <a href="https://www.nuget.org/packages/FatturaElettronica/4.0.6">FatturaElettronica 4.0.6</a>. It adds support for legacy <code>windows-1252</code> encoding to both XML and P7M invoices, a long-standing annoyance that could previously be circumvented via external code.</p>
<p><code>windows-1252</code> encoding in Italian e-invoices has been a persistent headache — it&rsquo;s technically outside the FatturaPA spec (which mandates UTF-8), but it crops up often enough in real-world invoices from older or misconfigured billing systems that users kept running into it. The <a href="https://invoicetronic.com">Invoicetronic</a> stack has been updated accordingly.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.3.0</title>
      <link>https://nicolaiarocci.com/eve-2.3.0/</link>
      <pubDate>Thu, 19 Mar 2026 10:38:20 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.3.0/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pypi.org/project/Eve/2.3.0/&#34;&gt;Eve v2.3&lt;/a&gt; was just released on PyPI. It adds &lt;code&gt;optimize_pagination_for_speed&lt;/code&gt;, a resource-level setting that allows granular control, overriding the equivalent global option that goes by the same name. Many thanks to Emanuele Di Giacomo for &lt;a href=&#34;https://github.com/pyeve/eve/pull/1569&#34;&gt;contributing&lt;/a&gt; to the project.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://pypi.org/project/Eve/2.3.0/">Eve v2.3</a> was just released on PyPI. It adds <code>optimize_pagination_for_speed</code>, a resource-level setting that allows granular control, overriding the equivalent global option that goes by the same name. Many thanks to Emanuele Di Giacomo for <a href="https://github.com/pyeve/eve/pull/1569">contributing</a> to the project.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The future of software engineering</title>
      <link>https://nicolaiarocci.com/the-future-of-software-engineering/</link>
      <pubDate>Sat, 14 Feb 2026 17:35:36 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-future-of-software-engineering/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Senior engineering practitioners from major technology companies gathered for a
multi-day retreat to confront the questions that matter most as AI transforms software
development. The discussions covered more than twenty topics across breakout
sessions, but the most significant insights didn’t emerge from one single session. Instead,
they surfaced at various intersections; we found that the same concerns kept appearing
in different conversations, framed by different people solving different problems.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This publication synthesizes those cross-cutting themes, organized around the patterns
that senior leaders need to understand and act on now. The retreat did not produce a
single, unified vision of the future, but instead produced something more useful: a map of
the fault lines where current practices are breaking and new ones are forming.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Senior engineering practitioners from major technology companies gathered for a
multi-day retreat to confront the questions that matter most as AI transforms software
development. The discussions covered more than twenty topics across breakout
sessions, but the most significant insights didn’t emerge from one single session. Instead,
they surfaced at various intersections; we found that the same concerns kept appearing
in different conversations, framed by different people solving different problems.</p></blockquote>
<blockquote>
<p>This publication synthesizes those cross-cutting themes, organized around the patterns
that senior leaders need to understand and act on now. The retreat did not produce a
single, unified vision of the future, but instead produced something more useful: a map of
the fault lines where current practices are breaking and new ones are forming.</p></blockquote>
<p>&ndash; <a href="https://www.thoughtworks.com/content/dam/thoughtworks/documents/report/tw_future%20_of_software_development_retreat_%20key_takeaways.pdf">The Future of Software Engineering</a></p>
<p>Great read. It also taught me about the <a href="https://en.wikipedia.org/wiki/Chatham_House_Rule">Chatham House Rule</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.2.5</title>
      <link>https://nicolaiarocci.com/eve-2.2.5/</link>
      <pubDate>Wed, 11 Feb 2026 10:44:54 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.2.5/</guid>
      <description>&lt;p&gt;Eve v2.2.5 was &lt;a href=&#34;https://pypi.org/project/Eve/2.2.5/&#34;&gt;just released&lt;/a&gt; on PyPI. It brings the pagination fix discussed in a &lt;a href=&#34;https://nicolaiarocci.com/an-ai-generated-pull-request-that-actually-makes-sense/&#34;&gt;previous post&lt;/a&gt;. Many thanks to Calvin Smith per contributing to the project.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Eve v2.2.5 was <a href="https://pypi.org/project/Eve/2.2.5/">just released</a> on PyPI. It brings the pagination fix discussed in a <a href="/an-ai-generated-pull-request-that-actually-makes-sense/">previous post</a>. Many thanks to Calvin Smith per contributing to the project.</p>
]]></content:encoded>
    </item>
    <item>
      <title>An AI-generated pull request that actually makes sense</title>
      <link>https://nicolaiarocci.com/an-ai-generated-pull-request-that-actually-makes-sense/</link>
      <pubDate>Wed, 11 Feb 2026 09:57:15 +0100</pubDate>
      <guid>https://nicolaiarocci.com/an-ai-generated-pull-request-that-actually-makes-sense/</guid>
      <description>&lt;p&gt;Yesterday a &lt;a href=&#34;https://github.com/pyeve/eve/pull/1567&#34;&gt;pull request&lt;/a&gt; came in proposing a fix for a small pagination bug in &lt;a href=&#34;https://python-eve.org&#34;&gt;Eve&lt;/a&gt;, the REST API framework I maintain. The intervention is small, precise, and comes with a well-crafted test.&lt;/p&gt;
&lt;p&gt;Two things stood out: the PR is in draft, and it includes an AI disclosure:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the fix and the test were created by Claude. I don&amp;rsquo;t have mongo available or all the necessary python versions for testing, so I&amp;rsquo;m making this a draft PR so that I can verify all the tests/checks pass before marking it as ready to review.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday a <a href="https://github.com/pyeve/eve/pull/1567">pull request</a> came in proposing a fix for a small pagination bug in <a href="https://python-eve.org">Eve</a>, the REST API framework I maintain. The intervention is small, precise, and comes with a well-crafted test.</p>
<p>Two things stood out: the PR is in draft, and it includes an AI disclosure:</p>
<blockquote>
<p>the fix and the test were created by Claude. I don&rsquo;t have mongo available or all the necessary python versions for testing, so I&rsquo;m making this a draft PR so that I can verify all the tests/checks pass before marking it as ready to review.</p></blockquote>
<p>I&rsquo;m not at all surprised that Claude was used for the fix (I use it daily myself, to great benefit), but I appreciate the disclosure. A careful review of the code wouldn&rsquo;t have revealed AI involvement.</p>
<p>The idea of submitting a draft to let the CI run and intervene where needed before marking it as ready for review is also smart — especially since, as the author explains, they can&rsquo;t run the tests locally.</p>
<p>All in all, an exemplary case of AI use in open source, and welcome news at a time when maintainers are under pressure, often flooded with auto-generated junk PRs (in my own small corner, it <a href="https://github.com/pyeve/eve/pull/1548">has happened</a> to me too). As always, it&rsquo;s not the tool that&rsquo;s the problem — it&rsquo;s who uses it, and <em>how</em>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>We mourn our craft</title>
      <link>https://nicolaiarocci.com/we-mourn-our-craft/</link>
      <pubDate>Tue, 10 Feb 2026 11:06:04 +0100</pubDate>
      <guid>https://nicolaiarocci.com/we-mourn-our-craft/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Someday years from now we will look back on the era when we were the last generation to code by hand. We’ll laugh and explain to our grandkids how silly it was that we typed out JavaScript syntax with our fingers. But secretly we’ll miss it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;We’ll miss the feeling of holding code in our hands and molding it like clay in the caress of a master sculptor. We’ll miss the sleepless wrangling of some odd bug that eventually relents to the debugger at 2 AM. We’ll miss creating something we feel proud of, something true and right and good. We’ll miss the satisfaction of the artist’s signature at the bottom of the oil painting, the GitHub repo saying “I made this.”&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Someday years from now we will look back on the era when we were the last generation to code by hand. We’ll laugh and explain to our grandkids how silly it was that we typed out JavaScript syntax with our fingers. But secretly we’ll miss it.</p></blockquote>
<blockquote>
<p>We’ll miss the feeling of holding code in our hands and molding it like clay in the caress of a master sculptor. We’ll miss the sleepless wrangling of some odd bug that eventually relents to the debugger at 2 AM. We’ll miss creating something we feel proud of, something true and right and good. We’ll miss the satisfaction of the artist’s signature at the bottom of the oil painting, the GitHub repo saying “I made this.”</p></blockquote>
<p>&ndash; Nolan Lawson, <a href="https://nolanlawson.com/2026/02/07/we-mourn-our-craft/"><em>We mourn our craft</em></a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Archivio Grafica Italiana</title>
      <link>https://nicolaiarocci.com/archivio-grafica-italiana/</link>
      <pubDate>Thu, 29 Jan 2026 15:07:26 +0100</pubDate>
      <guid>https://nicolaiarocci.com/archivio-grafica-italiana/</guid>
      <description>&lt;p&gt;&amp;ldquo;&lt;em&gt;&lt;a href=&#34;https://www.archiviograficaitaliana.com/&#34;&gt;Archivio Grafica Italiana&lt;/a&gt; is the first online archive dedicated to the entire Italian graphic design heritage.&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Beautiful resource. Some samples came as a true surprise to me, like the New York City Subway signage, though the Italian connection is a bit weak on that one. (&lt;a href=&#34;https://sidebar.io&#34;&gt;via&lt;/a&gt;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>&ldquo;<em><a href="https://www.archiviograficaitaliana.com/">Archivio Grafica Italiana</a> is the first online archive dedicated to the entire Italian graphic design heritage.</em>&rdquo;</p>
<p>Beautiful resource. Some samples came as a true surprise to me, like the New York City Subway signage, though the Italian connection is a bit weak on that one. (<a href="https://sidebar.io">via</a>)</p>
]]></content:encoded>
    </item>
    <item>
      <title>There&#39;s no such a thing as the &#39;Dark Ages&#39;</title>
      <link>https://nicolaiarocci.com/theres-no-such-a-thing-as-the-dark-ages/</link>
      <pubDate>Tue, 27 Jan 2026 18:04:03 +0100</pubDate>
      <guid>https://nicolaiarocci.com/theres-no-such-a-thing-as-the-dark-ages/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The actual phrase ‘Dark Ages’ itself derives from the Latin &lt;em&gt;saeculum obscurum&lt;/em&gt;, which Caesar Baronius – a cardinal and Church historian – came up with around 1602. He applied the term exclusively to the tenth and eleventh centuries.  However, and very significantly in his use of the term, Baronius was not decrying a state of scientific malaise, or a particularly turbulent political period – he’s talking about a lack of sources surviving from that time.  Indeed, Baronius sees the cut off point for the dark ages to be the Gregorian reforms of 1046, following which we see a massive increase in surviving documentation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The actual phrase ‘Dark Ages’ itself derives from the Latin <em>saeculum obscurum</em>, which Caesar Baronius – a cardinal and Church historian – came up with around 1602. He applied the term exclusively to the tenth and eleventh centuries.  However, and very significantly in his use of the term, Baronius was not decrying a state of scientific malaise, or a particularly turbulent political period – he’s talking about a lack of sources surviving from that time.  Indeed, Baronius sees the cut off point for the dark ages to be the Gregorian reforms of 1046, following which we see a massive increase in surviving documentation.</p></blockquote>
<p>So:</p>
<blockquote>
<p>Is there a time that historians use the term ‘Dark Ages’? Yeah, we do use it to talk about source survival rates. It’s not a term we use as a value judgment, however. We just mean that we don’t have a lot of evidence to go off of.</p></blockquote>
<p>Holy cow <a href="https://going-medieval.com/2017/05/26/theres-no-such-thing-as-the-dark-ages-but-ok/">Eleanor</a>, color me indoctrinated (<a href="https://robinrendle.com/notes/people-not-people/">via</a>).</p>
]]></content:encoded>
    </item>
    <item>
      <title>Europe needs an independent tech infrastructure</title>
      <link>https://nicolaiarocci.com/europe-needs-an-independent-tech-infrastructure/</link>
      <pubDate>Mon, 12 Jan 2026 18:25:24 +0100</pubDate>
      <guid>https://nicolaiarocci.com/europe-needs-an-independent-tech-infrastructure/</guid>
      <description>&lt;p&gt;Sam over at &lt;a href=&#34;https://thetangent.space/2026/infrastructure/&#34;&gt;theTangentSpace&lt;/a&gt; has the perfect analysis on Europe&amp;rsquo;s sorry situation in these troubled times, so much so that I have a hard time picking just one or two paragraphs to quote here. Let’s just go with the opening:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Europe must increasingly prepare for a world in which the protection &lt;em&gt;of&lt;/em&gt; America is replaced by protection &lt;em&gt;from&lt;/em&gt; America. An essential component of this is moving away from dependence on US goods and services and, perhaps most essential of all, US tech and tech infrastructure.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Sam over at <a href="https://thetangent.space/2026/infrastructure/">theTangentSpace</a> has the perfect analysis on Europe&rsquo;s sorry situation in these troubled times, so much so that I have a hard time picking just one or two paragraphs to quote here. Let’s just go with the opening:</p>
<blockquote>
<p>Europe must increasingly prepare for a world in which the protection <em>of</em> America is replaced by protection <em>from</em> America. An essential component of this is moving away from dependence on US goods and services and, perhaps most essential of all, US tech and tech infrastructure.</p></blockquote>
<p>And then, towards the conclusion:</p>
<blockquote>
<p>A potential silver lining of Europe disentangling itself from US tech is the opportunity to embed social values and democratic oversight into the design of these systems. US tech firms are massive, centralised surveillance platforms that routinely abuse their users and reproduce existing social inequalities. We could do better via better regulation of the private sector, and more public sector options.</p></blockquote>
<p>Let&rsquo;s do it, Europe.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Writing forces clarity</title>
      <link>https://nicolaiarocci.com/writing-forces-clarity/</link>
      <pubDate>Tue, 06 Jan 2026 18:25:52 +0100</pubDate>
      <guid>https://nicolaiarocci.com/writing-forces-clarity/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Writing forces clarity. When I explain a concept to others - in a doc, a talk, a code review comment, even just chatting with AI - I discover the gaps in my own understanding. The act of making something legible to someone else makes it more legible to me.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; Addy Osmani in &lt;a href=&#34;https://addyosmani.com/blog/21-lessons/&#34;&gt;21 Lessons From 14 Years at Google&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The one quoted above is #12, and I’ve been religiously abiding by it for a long time, but all 21 are well worth reading. If you&amp;rsquo;ve been in software engineering long enough, they’ll resonate with you. Also, most lessons apply to all kinds of career paths, not just software.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Writing forces clarity. When I explain a concept to others - in a doc, a talk, a code review comment, even just chatting with AI - I discover the gaps in my own understanding. The act of making something legible to someone else makes it more legible to me.</p></blockquote>
<p>&ndash; Addy Osmani in <a href="https://addyosmani.com/blog/21-lessons/">21 Lessons From 14 Years at Google</a></p>
<p>The one quoted above is #12, and I’ve been religiously abiding by it for a long time, but all 21 are well worth reading. If you&rsquo;ve been in software engineering long enough, they’ll resonate with you. Also, most lessons apply to all kinds of career paths, not just software.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Karpathy: I have never felt this much left behind as a programmer</title>
      <link>https://nicolaiarocci.com/karpathy-i-have-never-felt-this-much-left-behind-as-a-programmer/</link>
      <pubDate>Sat, 03 Jan 2026 09:27:41 +0100</pubDate>
      <guid>https://nicolaiarocci.com/karpathy-i-have-never-felt-this-much-left-behind-as-a-programmer/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve never felt this much behind as a programmer. The profession is being dramatically refactored as the bits contributed by the programmer are increasingly sparse and between. I have a sense that I could be 10X more powerful if I just properly string together what has become available over the last ~year and a failure to claim the boost feels decidedly like skill issue. There&amp;rsquo;s a new programmable layer of abstraction to master (in addition to the usual layers below) involving agents, subagents, their prompts, contexts, memory, modes, permissions, tools, plugins, skills, hooks, MCP, LSP, slash commands, workflows, IDE integrations, and a need to build an all-encompassing mental model for strengths and pitfalls of fundamentally stochastic, fallible, unintelligible and changing entities suddenly intermingled with what used to be good old fashioned engineering. Clearly some powerful alien tool was handed around except it comes with no manual and everyone has to figure out how to hold it and operate it, while the resulting magnitude 9 earthquake is rocking the profession. Roll up your sleeves to not fall behind.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I&rsquo;ve never felt this much behind as a programmer. The profession is being dramatically refactored as the bits contributed by the programmer are increasingly sparse and between. I have a sense that I could be 10X more powerful if I just properly string together what has become available over the last ~year and a failure to claim the boost feels decidedly like skill issue. There&rsquo;s a new programmable layer of abstraction to master (in addition to the usual layers below) involving agents, subagents, their prompts, contexts, memory, modes, permissions, tools, plugins, skills, hooks, MCP, LSP, slash commands, workflows, IDE integrations, and a need to build an all-encompassing mental model for strengths and pitfalls of fundamentally stochastic, fallible, unintelligible and changing entities suddenly intermingled with what used to be good old fashioned engineering. Clearly some powerful alien tool was handed around except it comes with no manual and everyone has to figure out how to hold it and operate it, while the resulting magnitude 9 earthquake is rocking the profession. Roll up your sleeves to not fall behind.</p></blockquote>
<p>&ndash; <a href="https://x.com/karpathy/status/2004607146781278521">Andrej Karpathy</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Books I read in 2025</title>
      <link>https://nicolaiarocci.com/books-i-read-in-2025/</link>
      <pubDate>Sun, 28 Dec 2025 07:36:24 +0100</pubDate>
      <guid>https://nicolaiarocci.com/books-i-read-in-2025/</guid>
      <description>&lt;p&gt;I read 35 books, or 10726 pages, in 2025. A remarkable step up from the &lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2024/&#34;&gt;previous year&lt;/a&gt;. I have not read so many books since 2015 (36), and I never read so many pages before. Having read a few comic books helps pump up the stats, I reckon, and I suspect switching to ebooks played a role, too, as reading is more accessible than ever.&lt;/p&gt;
&lt;p&gt;I bought a first-edition Kindle back in the day, but never got around to using it much. After a few attempts to like it, it ended up in a drawer. Fast forward to 2025, I gave myself a second chance and got a Kobo Clara BW, a device I’m digging a lot. Yes, every time I finish an ebook I liked, I&amp;rsquo;m sad I cannot shelf it, but the advantages are many that I don&amp;rsquo;t think I’m going back to paper books anytime soon. There will be exceptions, I’m sure, but the norm will be ebook first.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I read 35 books, or 10726 pages, in 2025. A remarkable step up from the <a href="/books-i-read-in-2024/">previous year</a>. I have not read so many books since 2015 (36), and I never read so many pages before. Having read a few comic books helps pump up the stats, I reckon, and I suspect switching to ebooks played a role, too, as reading is more accessible than ever.</p>
<p>I bought a first-edition Kindle back in the day, but never got around to using it much. After a few attempts to like it, it ended up in a drawer. Fast forward to 2025, I gave myself a second chance and got a Kobo Clara BW, a device I’m digging a lot. Yes, every time I finish an ebook I liked, I&rsquo;m sad I cannot shelf it, but the advantages are many that I don&rsquo;t think I’m going back to paper books anytime soon. There will be exceptions, I’m sure, but the norm will be ebook first.</p>
<p>The usual scoring system applies:</p>
<ul>
<li>One star means a book is meh.</li>
<li>Two stars mean a book is perfectly fine.</li>
<li>Three stars mean a book is good—consider it recommended.</li>
<li>Four stars mean a book is exceptional.</li>
<li>Five stars is pretty much unheard of.</li>
</ul>
<h3 id="il-mangiatore-di-pietre-davide-longo">Il mangiatore di pietre, Davide Longo</h3>
<p>★★★☆☆</p>
<p>A good, short noir set in the harsh, rugged, and in some ways repellent mountains of Piedmont, on the border with France. The characters are equally tough, children of their land. The writing adapts; less is more.</p>
<h3 id="across-arctic-america-knud-rasmussen">Across arctic America, Knud Rasmussen</h3>
<p><em>(Il grande viaggio in slitta, Quodlibet)</em></p>
<p>★★★☆☆</p>
<p>The exceptional account of the sled journey from Greenland to Alaska and on to Siberia. During the sixth Thule expedition, Knud Rasmussen encountered all the Eskimo tribes, documenting them one by one and collecting a huge number of artifacts. This book is a popularized, highly condensed version of Rasmussen&rsquo;s most ambitious expedition, which was a great success.</p>
<h3 id="orbit-orbit-caparezza">Orbit Orbit, Caparezza</h3>
<p>★★★★☆</p>
<p>Orbit Orbit marks Caparezza&rsquo;s debut in comics. He claims that only later did he feel inspired to add a soundtrack that blossomed to become a new album of the same name. While the two works can be enjoyed independently, they form a unique, multi-dimensional work.</p>
<h3 id="say-nothing-patrick-radden-keefe">Say Nothing, Patrick Radden Keefe</h3>
<p>★★★★☆</p>
<p>Heartbreaking. I have always wanted to learn more about what happened in Ireland during the Troubles. Not being Irish, I often found the subject daunting. The prose here is perfectly charged with meaning, and the reader is sucked into the narrative vortex from the very first page, with the insane scene of Jean McConville being torn from the arms of her large and loving family—never to return—by masked thugs. What is shocking here is that this is not a novel, but a journalistic investigation. A rich apparatus of notes accompanies every event narrated or quoted.</p>
<h3 id="a-nord-di-thule-knud-rasmussen">A Nord di Thule, Knud Rasmussen</h3>
<p>★★★★☆</p>
<p>It is 1912, Greenland is still largely unexplored by Europeans, and the Thule trading station has just been inaugurated. It is from there that Knud Rasmussen sets off in April, accompanied by a Danish cartographer and two Inuit hunters, aboard dog sleds, to map Peary&rsquo;s Channel. This volume is the expedition&rsquo;s travel diary, and it is as fascinating, harsh, and adventurous as you can imagine. It is excellent, not for its literary value, but for its testimony to a heroic era that has now disappeared. I am, however, biased, as I have been collecting all of Knud Rasmussen&rsquo;s writings for some time.</p>
<h3 id="pornorama-claudia-grande">Pornorama, Claudia Grande</h3>
<p>★★★☆☆</p>
<blockquote>
<p>with pornorama, claudia grande has written an ambitious novel that combines the atmospheres of thomas pynchon and chuck palahniuk with true crime, the most unsuspected innocence and the most heinous brutality, private neuroses and great repressions, a red-light photograph of our contemporary world, so obsessed with death that it disguises it with sex and so deformed by money that it no longer recognizes its violence.</p></blockquote>
<p>ambitious and courageous. it took too long for the story to start ticking.</p>
<h3 id="the-day-of-judgment-salvatore-satta">The Day of Judgment, Salvatore Satta</h3>
<p><em>(Il giorno del giudizio, Adelphi)</em></p>
<p>★★★★★</p>
<p>Salvatore Satta tells the story of a city (Nuoro) and a rural Sardinian society that is slowly transforming into something new and profoundly different. The protagonists, with their rituals and customs, belong to the past without knowing it. There is sadness and disillusionment in these pages. No matter their social class, a ray of light never touches the protagonists&rsquo; lives. Their lives inevitably all end in the cemetery, the only proof of their passage through this world. Compelling and convincing despite the nihilism that permeates this novel, Satta delivers a masterpiece.</p>
<h3 id="stasiland-anna-funder">Stasiland, Anna Funder</h3>
<p><em>(C&rsquo;era una volta la Ddr, Feltrinelli)</em></p>
<p>★★★★★</p>
<p>The East German Stasi was the world&rsquo;s best and most efficient secret police, the textbook definition of the omnipresent Big Brother. The Stasi guarded and secured the rule of East Germany&rsquo;s Communist Party for four decades, during which it seeped into every tiny crevice of East German society. East Germans could not escape the Stasi - in every six people, one was an informer for it; all spaces where life took place were infiltrated and monitored by the Stasi, which kept meticulous records on its subjects. Anna Funder does an extraordinary job in interviewing and telling the personal stories of people on both sides of the table: those persecuted by the service, and officials at various levels in the organization and around it, who took an active part in the action. Reading this work right after The Communist Manifesto was enlightening.</p>
<h3 id="the-communist-manifesto-by-karl-marx-and-friedrich-engels">The Communist Manifesto, by Karl Marx and Friedrich Engels</h3>
<p><em>(Manifesto del partito comunista, Feltrinelli)</em></p>
<p>★★★★☆</p>
<p>One hundred and seventy years later, the truths contained in the Manifesto remain as relevant as ever. Capital&rsquo;s ability to control our lives through its untouchable ownership of the means of production remains intact. It is difficult to deny that the struggle for emancipation from precariousness, structural exploitation, and alienation should be led not by those who control work in their own interests, but by those who spend their lives working or trying to do so. I am glad I finally read this document. Each of us should go to back the sources first, then proceed from there.</p>
<h3 id="the-sense-of-an-ending-julian-barnes">The Sense of an Ending, Julian Barnes</h3>
<p><em>(Il senso di una fine, Einaudi)</em></p>
<p>★★★★☆</p>
<p>Memory can deceive us, and our actions have consequences that we often cannot predict or fully understand. Barnes brilliantly shows how the protagonist selectively remembers events, usually distorting them in his favor. Self-justification and self-deception characterize Tony&rsquo;s narrative, as he always tends to present himself in a favorable light, minimizing his flaws and responsibilities. Guilt and responsibility emerge towards the end, when Tony discovers the role he played in his friend&rsquo;s fate.</p>
<blockquote>
<p>History is that version of the past we have chosen to believe.</p></blockquote>
<h3 id="lonesome-dove-larry-mcmurtry">Lonesome Dove, Larry McMurtry</h3>
<p>★★★★☆</p>
<p>It&rsquo;s hard to put this book down. It&rsquo;s full of stereotypes about the epic history of the West, but then again, it&rsquo;s not. It would be more accurate to say that it contributes to shaping them, and it does so in a peculiar way, enriching and retouching them in a captivating manner.</p>
<h3 id="project-hail-mary-andy-weir">Project Hail Mary, Andy Weir</h3>
<p>★★★☆☆</p>
<p>Science fiction that is both incredible and plausible thanks to the extensive research work done by the author of The Martian. Sometimes perhaps it goes overboard with the details and brilliant hacks of the genius scientist and his pal the engineer, but the story remains gripping until the end. The message is clear: it will be cooperation between peoples and between worlds that saves us, not conflict.</p>
<h3 id="assalto-alle-alpi-marco-a-ferrari">Assalto alle Alpi, Marco A. Ferrari</h3>
<p>★★★★☆</p>
<p>To give the Alps a future, a new perspective is necessary—one that is aware and respectful. A threat hangs over the Alps in our near future if we continue to draw upon old idealizing stereotypes that reduce the mountains to a salvific place of pure &ldquo;beauty,&rdquo; or to an amusement park for tourists fleeing the cities. How can we imagine their near future? In this small but important book, M.A. Ferrari traces a brief history of the &ldquo;assault on the Alps&rdquo;: tourist speculation, the &ldquo;valorization&rdquo; of the territory, and everything that has led to the current situation. He then attempts to propose new paths, which are actually already being experimented with in various places.</p>
<h3 id="lost-in-translation-ottavio-fatica">Lost in Translation, Ottavio Fatica</h3>
<p>★★☆☆☆</p>
<p>Started well, got bored relatively soon. The insights are sometimes brilliant.</p>
<h3 id="the-mental-load-a-feminist-comic-by-emma">The Mental Load, A Feminist Comic, by Emma</h3>
<p>★★★★☆</p>
<p>A graphic novel that captures the condition of women in Western Europe today in 10 episodes; a read for everyone, a starting point for exploring topics such as women&rsquo;s mental load and emotional labor. I suspect most readers are women; should be men.</p>
<h3 id="ragazzo-zuzu">Ragazzo, Zuzu</h3>
<p>★★★☆☆</p>
<p>Zuzu recounts youthful angst, the collapse of a family unit, and disorientation through a combination of scenes from everyday life and improbable situations, indulging in explicit yet childlike sexuality, without forgetting to reveal the truth through dreamlike scenes that devour reality to lead to other moments. These are certainly the most powerful moments in the entire work, in terms of intensity and visual anarchy.</p>
<h3 id="history-la-storia-elsa-morante">History (La Storia), Elsa Morante</h3>
<p>★★★★☆</p>
<p>The story of a small, humble, and desperate Roman family forced to face the great historical events of the advent of totalitarianism in Italy and Europe, World War II, and its consequences. One of the best-selling books of all time in Italy, it still sells very well today, and for good reason. It sparked great controversy and envy when it was released, but time has proven it right.</p>
<h3 id="voices-in-the-evening-le-voci-della-sera-natalia-ginzburg">Voices in the Evening (Le voci della sera), Natalia Ginzburg</h3>
<p>★★★☆☆</p>
<p>Audiobook. The story of the seemingly dull and claustrophobic life in a small town in the Piedmont province during and after World War II. Charming short work, with some rich and interesting characters.</p>
<h3 id="s-gipi">S., Gipi</h3>
<p>★★★☆☆</p>
<p>S. is short for Sergio, the name of the author&rsquo;s father, who recently passed away. The book is a collection of autobiographical memories and stories set in Tuscany between 1943 and roughly the end of the century. It&rsquo;s beautiful, but it didn&rsquo;t engage me as much as I thought it would. I appreciated the fact that it didn&rsquo;t hide some of the weaknesses of the parental figure.</p>
<h3 id="le-valli-della-memoria-pietro-scarnera">Le valli della memoria, Pietro Scarnera</h3>
<p>★★☆☆☆</p>
<p>A small comic book on the &ldquo;History of the Liberation of Ravenna,&rdquo; partly subsidized by the Municipality of Ravenna and published by Coconino (a prominent Italian comic book publisher). The idea of involving the young grandchildren of the protagonists of that era in a dreamlike way is interesting because, in the end, the message is always the same: don&rsquo;t forget and treasure the lessons of history so that we don&rsquo;t repeat the same mistakes.</p>
<h3 id="la-mia-vita-disegnata-male-gipi">La mia vita disegnata male, Gipi</h3>
<p>★★★★☆</p>
<p>It is a journey back in time to rediscover the author&rsquo;s own life, but also an evolution in comic book representation, moving towards a more simplified style. The essential, shaky, almost childish lines correspond, from a psychological point of view to the loss of references, the display of the author&rsquo;s problems and his vision of the world. Gipi has a taste for jokes; he plays down and demystifies humbly and entertainingly. It&rsquo;s just a life lived (very) badly, like so many others. But the &ldquo;poorly drawn&rdquo; cartoons are interspersed with &ldquo;well-drawn&rdquo; ones, almost as if the author wanted to show us that, if he wanted to, he is an artist with excellent technical skill. All in all, between dreams, nightmares, irony, melancholy, and reality, the book stimulates reflection on what life is, how to face it, and how to deal with one&rsquo;s feelings of guilt.</p>
<h3 id="la-grande-rimozione-roberto-grossi">La grande rimozione, Roberto Grossi</h3>
<p>★★★★☆</p>
<p>It is an essential comic book that effectively presents the situation of climate change, its urgency, and how to become aware of it and act collectively and individually before it is too late. Some of the panels, often compositions that compare two similar yet opposite situations, are brilliant and very effective. I hope it will be translated and receive the broadest possible distribution. I learned about this book thanks to the Coconino Festival held in my hometown this weekend. A small but well-executed exhibition was dedicated to this work.</p>
<h3 id="a-supposedly-fun-thing-ill-never-do-again-david-foster-wallace">A supposedly fun thing I&rsquo;ll never do again, David Foster Wallace</h3>
<p>★★★☆☆</p>
<p>(<em>Tennis, tv, trigonometria, tornado e altre cose divertenti che non farò mai più</em>, Minimum fax)</p>
<p>Three stories stand out: DFW&rsquo;s youth tennis, his visit to the Illinois State Fair, and his account of his experience following David Lynch as a director. The one about American TV started well but quickly became too US-centric to follow. DFW, however, is always a joy to read.</p>
<h3 id="the-man-who-mistook-his-wife-for-a-hat-and-other-clinical-tales-oliver-sacks">The man who mistook his wife for a hat and other clinical tales, Oliver Sacks</h3>
<p>★★★☆☆</p>
<p>(<em>L&rsquo;uomo che scambio sua moglie per un cappello, Adelphi</em>)</p>
<p>Quoting a comment on Goodreads, to which I have nothing to add: &ldquo;This book has many fascinating studies of neurological disorders, and the stories behind the patients are easily understood and, in many cases, enthralling. However, Dr. Sacks seems to give his readers too much credit when he throws off &ldquo;hyperagnosia&rdquo;, &ldquo;Korsokovian&rdquo;, and &ldquo;meningioma&rdquo; like he assumes we had read an entire neurology textbook before picking this one up.&rdquo;</p>
<h3 id="source-code-by-bill-gates">Source code, by Bill Gates</h3>
<p>★★★★☆</p>
<p>Autobiography of Bill Gates from early childhood to the early steps of Microsoft. An interesting work for many reasons, not the least of which is that I find myself in many of the traits and passions of young Gates, on an almost disturbing level. One of the main characters recounts a key moment: the advent of micro and personal computers, and how they changed everything.</p>
<h3 id="papyrus-by-irene-vallejo">Papyrus, by Irene Vallejo</h3>
<p>★★★★☆</p>
<p>Papyrus by Irene Vallejo (originally titled &ldquo;El infinito en un junco&rdquo; in Spanish) is a fascinating work about the history of books in antiquity. I think Vallejo did an excellent job telling the history of writing and books in an accessible yet scholarly way. Her ability to weave historical facts with interesting anecdotes makes the text engaging. As I understand, the autobiographical digressions that sometimes can annoy the reader are characteristic of her style - she uses her personal experience as a bridge to connect modern readers with the ancient world. The book is particularly strong when describing how texts survived through centuries thanks to dedicated copyists, libraries like Alexandria, and the transition from papyrus scrolls to codices (the ancestors of modern books).</p>
<h3 id="libera-università-by-tomaso-montanari">Libera Università, by Tomaso Montanari</h3>
<p>★★★★☆</p>
<p>Tomaso Montanari is a lucid and sharp thinker; this text proves it. By the author&rsquo;s admission, this is a militant, non-technical work. No solutions are offered to the many problems of Italian universities; that is not the goal (albeit one of his own texts on the subject would be interesting). The importance of a clear separation between the tertiary education system and executive power is emphasized more than ever in a season such as the current one, dominated by parties that hark back to totalitarian ideologies. I found the chapter about Italian telematic universities and how they&rsquo;re encouraged and leveraged by at least parts of the executive power fascinating.</p>
<h3 id="cambiare-la-storia-by-adriano-prosperi">Cambiare la storia, by Adriano Prosperi</h3>
<p>★★★★☆</p>
<p>Is human history editable? One way people have tried to change the historical course of humanity is by fabricating fakes. There is no shortage of examples; in this book, Adriano Prosperi focuses on a few in particular—the Donation of Constantine, perhaps the most famous among historical fakes. The second case concerns the historical inventions of the visionary Annio da Viterbo, who rewrote world history, starting with the Flood and prophesying the place and date of the apocalypse. One finds its model in the false chronicles and fake archaeological finds of seventeenth-century Granada, where moriscos threatened with expulsion from Spain invented the existence of a very ancient presence of Christian Arabs who came to Spain before St. James. But the most disturbing of the examples is the fourth, that of the &ldquo;Protocols of the Elder Saviors of Zion,&rdquo; notoriously false yet still widespread and operating. Changing or negating history does not pertain to the modern day; it has always been part of the process.</p>
<h3 id="grandma-gatewoods-walk-by-ben-montgomery">Grandma Gatewood&rsquo;s Walk, by Ben Montgomery</h3>
<p>★★★☆☆</p>
<p>(<em>La signora degli Appalachi, Terre di mezzo</em>)</p>
<p>&ldquo;Grandma Gatewood&rsquo;s Walk&rdquo; by Ben Montgomery tells the remarkable true story of Emma Gatewood, who, at age 67, became the first woman to hike the entire Appalachian Trail solo in 1955. After enduring decades of domestic abuse and raising 11 children, Emma left home with minimal supplies—wearing Keds sneakers and carrying only a tiny denim bag with necessities. She told her family she was &ldquo;going for a walk&rdquo; without revealing her ambitious 2,050-mile journey from Georgia to Maine. The book weaves Emma&rsquo;s extraordinary hike together with her complicated personal history, highlighting her physical resilience and mental determination. Montgomery reveals how her journey captured America&rsquo;s imagination, bringing significant publicity to the then-obscure Appalachian Trail. Emma&rsquo;s accomplishments established her as a pioneering figure in hiking and inspired generations of hikers, particularly women. The book portrays her as a hiking legend and a symbol of perseverance who found freedom and purpose in nature after a life of hardship.</p>
<p>Emma Gatewood was genuinely revolutionary in what we now recognize as ultralight hiking philosophy decades before it became a formal movement. While experienced hikers of her era typically carried 30+ pounds of gear, Emma completed the entire Appalachian Trail with a homemade denim bag containing minimal essentials—a change of clothes, a shower curtain for shelter, some food, and little else. Her choice to wear simple Keds sneakers instead of heavy hiking boots was remarkably ahead of her time. What makes her achievement even more extraordinary is the context—she had no GPS, no specialized lightweight equipment, no online trail forums, and minimal trail markings compared to today. The Appalachian Trail was rougher and less developed in 1955, with fewer shelters and support infrastructure. Her approach embodied the core ultralight philosophy: bring only what you need, rely on your knowledge and adaptability rather than gear, and understand that mental fortitude often matters more than equipment. Emma proved that age, gender, and expensive gear were not prerequisites for tackling ambitious wilderness challenges.</p>
<h3 id="the-death-of-ivan-ilyc-by-lev-tolstoy">The death of Ivan Ilyc, by Lev Tolstoy</h3>
<p>★★★★☆</p>
<p>(<em>La morte di Ivan Ilyc, Feltrinelli</em>)</p>
<p>This work is a potent warning against the superficiality of life and a call to seek a more authentic and conscious existence. The main themes (and there are many for a booklet of a few pages, but that is what can be achieved by a giant of literature) are the inevitability of death, the hypocrisy of &ldquo;civilized&rdquo; society, alienation and loneliness, the meaning of life, and redemption through suffering. It is one of Tolstoy&rsquo;s minor works, the philosophical-religious period from his second and last periods. Admirable.</p>
<h3 id="la-scomparsa-di-majorana-by-leonardo-sascia">La scomparsa di Majorana, by Leonardo Sascia</h3>
<p>★★★☆☆</p>
<p>Since March 26, 1938, traces have been lost, between his departure and arrival on a sea voyage from Palermo to Naples, of the 31-year-old Sicilian physicist Ettore Majorana, whom Fermi would not hesitate to call a genius of the stature of Galileo and Newton. Suicide, as the investigators of the time want to believe and let belief, or voluntary escape from the world and the terrible fates that such a mind may have read into the future and the near future of science? In this admittedly speculative work, Sascia favours the latter. Sciascia&rsquo;s arguments are intriguing but not entirely convincing to me. The value of this work lies in Majorana&rsquo;s biography, which is well-documented and told. One is left wondering what Majorana could have achieved in his career if he hadn&rsquo;t fled from it.</p>
<h3 id="the-moon-and-the-bonfires-by-cesare-pavese">The Moon and the Bonfires, by Cesare Pavese</h3>
<p>★★★★☆</p>
<p><em>(La Luna e i Falò, Edimedia)</em></p>
<p>The Moon and the Bonfires by Cesare Pavese is a novel published in 1950 and is considered his masterpiece. The book explores several key themes, including:</p>
<ul>
<li>Return and Memory: The protagonist, Anguilla, returns to his hometown in the Langhe after years of absence. The contrast between past and present becomes a central element of the narrative.</li>
<li>Identity and Sense of Belonging: As an orphan who sought fortune in America, Anguilla questions his roots and whether he truly belongs anywhere.</li>
<li>War and Its Consequences: In the aftermath of World War II, the novel highlights the scars left by the conflict, mainly focusing on the Italian Resistance and its impact on people and the land.</li>
<li>Myth and Disillusionment: The moon and the bonfires symbolically represent the contrast between dreams and reality, between the desire for something more significant and the harsh truth of rural life.</li>
<li>The Human Condition and the Inescapability of Fate – Pavese explores themes of solitude and the search for meaning, often portraying life with a melancholic and fatalistic outlook.</li>
</ul>
<p>The novel is intensely autobiographical and reflects Pavese’s existential concerns, offering a universal meditation on memory, identity, and the pain of existence.</p>
<blockquote>
<p>This village where I was born, I believed for a long time to be the whole world. Now that I have indeed seen the world and know that it is made up of many small villages, I’m not sure if, as a boy, I was really that wrong.</p></blockquote>
<h3 id="mornings-in-jenin-by-susan-abulhawa">Mornings in Jenin, by Susan Abulhawa</h3>
<p>★★★☆☆</p>
<p><em>(Ogni mattina a Jenin, Feltrinelli)</em></p>
<p>I received this novel as a Christmas present from my kids, and I&rsquo;m grateful to them for this powerful, passionate, eye-opening novel. Set against one of the twentieth century&rsquo;s most intractable political conflicts, Mornings in Jenin is a deeply human novel of history, identity, friendship, love, terrorism, surrender, courage, and hope. Its power forces us to take a fresh look at one of the defining conflicts of our lifetimes.</p>
<blockquote>
<p>For if life had taught her anything, it was that healing and peace can begin only with acknowledgment of wrongs committed.</p></blockquote>
<h3 id="the-heartbeat-of-the-wild-by-david-quammen">The heartbeat of the wild, by David Quammen</h3>
<p>★★★☆☆</p>
<p><em>(Il cuore selvaggio della natura, Adelphi)</em></p>
<p>An annotated collection of memorable field reports written for National Geographic over nearly three decades by David Quemmen.</p>
<blockquote>
<p>Human beings are the problem on this planet, but they are also the solution.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Importance of writing</title>
      <link>https://nicolaiarocci.com/importance-of-writing/</link>
      <pubDate>Wed, 24 Dec 2025 11:14:44 +0100</pubDate>
      <guid>https://nicolaiarocci.com/importance-of-writing/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;As AI generated content becomes the norm, I believe that human-generated content and raw thoughts and emotion will become more valuable. In many ways, I&amp;rsquo;d rather read a raw, unproduced, and scrappy blog post with grammatical mistakes over perfectly generated content that serves little value.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; Armeet Singh Jatyani, &lt;a href=&#34;https://blog.armeet.ca/importance-of-writing/&#34;&gt;Importance of Writing&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>As AI generated content becomes the norm, I believe that human-generated content and raw thoughts and emotion will become more valuable. In many ways, I&rsquo;d rather read a raw, unproduced, and scrappy blog post with grammatical mistakes over perfectly generated content that serves little value.</p></blockquote>
<p>&ndash; Armeet Singh Jatyani, <a href="https://blog.armeet.ca/importance-of-writing/">Importance of Writing</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Becoming the machine</title>
      <link>https://nicolaiarocci.com/becoming-the-machine/</link>
      <pubDate>Wed, 24 Dec 2025 11:09:47 +0100</pubDate>
      <guid>https://nicolaiarocci.com/becoming-the-machine/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Every machine serves a purpose. People need purpose. The temptation to become the machine is higher than ever. The promise of the machine is alluring. If I can just keep chugging forward, I will end up somewhere that is not here. If I can turn myself into a mechanism that takes input and consistently works towards some goal, I will make it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[..] You&amp;rsquo;re not a machine. You&amp;rsquo;re a person. Play to your strengths. Be sharp and strategic like a scalpel, not blunt like a mallet. Stop fetishizing the grind. Dream bigger.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Every machine serves a purpose. People need purpose. The temptation to become the machine is higher than ever. The promise of the machine is alluring. If I can just keep chugging forward, I will end up somewhere that is not here. If I can turn myself into a mechanism that takes input and consistently works towards some goal, I will make it.</p></blockquote>
<blockquote>
<p>[..] You&rsquo;re not a machine. You&rsquo;re a person. Play to your strengths. Be sharp and strategic like a scalpel, not blunt like a mallet. Stop fetishizing the grind. Dream bigger.</p></blockquote>
<p>&ndash; Armeet Singh Jatyani, <a href="https://armeet.bearblog.dev/becoming-the-machine/">Becoming the Machine</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Rediscovering a 2021 podcast on Python, .NET, and open source</title>
      <link>https://nicolaiarocci.com/rediscovering-a-2021-podcast-on-python-.net-and-open-source/</link>
      <pubDate>Mon, 22 Dec 2025 10:49:22 +0100</pubDate>
      <guid>https://nicolaiarocci.com/rediscovering-a-2021-podcast-on-python-.net-and-open-source/</guid>
      <description>&lt;p&gt;Yesterday, the kids came home for the Christmas holidays. Marco surprised me by telling me that on his flight from Brussels, he discovered and listened to “my podcast” on Spotify. I was stunned. I didn&amp;rsquo;t remember ever recording a podcast, even though I&amp;rsquo;ve given a few interviews here and there over the years.&lt;/p&gt;
&lt;p&gt;During my usual morning walk today, I went to look for it, and &lt;a href=&#34;https://open.spotify.com/episode/1xPawIlPhVKnnXcP4PxtC6?si=b1931340af1048de&#34;&gt;there it was&lt;/a&gt;, an interview I had done in 2021 that I had completely forgotten about. I got over the initial embarrassment (it&amp;rsquo;s always strange to hear your own voice) and resisted the temptation to turn it off, listening to it all the way through. I must admit that it captures that moment in my professional life, and much of the content is still relevant, especially regarding my experience as an open-source author and maintainer and my transition from C# to Python and back.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday, the kids came home for the Christmas holidays. Marco surprised me by telling me that on his flight from Brussels, he discovered and listened to “my podcast” on Spotify. I was stunned. I didn&rsquo;t remember ever recording a podcast, even though I&rsquo;ve given a few interviews here and there over the years.</p>
<p>During my usual morning walk today, I went to look for it, and <a href="https://open.spotify.com/episode/1xPawIlPhVKnnXcP4PxtC6?si=b1931340af1048de">there it was</a>, an interview I had done in 2021 that I had completely forgotten about. I got over the initial embarrassment (it&rsquo;s always strange to hear your own voice) and resisted the temptation to turn it off, listening to it all the way through. I must admit that it captures that moment in my professional life, and much of the content is still relevant, especially regarding my experience as an open-source author and maintainer and my transition from C# to Python and back.</p>
<p>I found copies of the podcast on many platforms, including a <a href="https://youtu.be/D8chi-YA5Uc?si=tkDKK2gWdAG1vsfU">YouTube video</a> (we actually video recorded it, who knew!), but they are all in Italian. I fed the video to MacWhisper, which transcribed it; I then asked Claude to translate it into English, removing pauses and repetitions; and finally, I ran it through Grammarly for a grammatical check. That’s what AI allows today: half an hour to go from an Italian audio podcast to a full English transcript, and that’s including a manual, pedantic review of Grammarly suggestions.</p>
<p>What follows is the full transcript, in English, of that 2021 interview. We touch on a variety of topics, including Python for .NET Developers, functional programming in Python, F#, and C#, the <a href="https://python-eve.org">Eve</a> REST framework and Flask, <a href="https://invoicetronic.com/en/">electronic invoicing</a>, my open-source experience as an author and maintainer in both ecosystems, cross-platform development, and advice to newcomers.</p>
<p>I don’t really know how or why Marco found this relic of mine on Spotify, and I&rsquo;m not brave enough to ask, but I’m grateful he dug it up. Also, many thanks to Mauro Servienti for hosting the interview.</p>
<h2 id="dotnet-podcast---interview-with-nicola-iarocci-2021">DotNet Podcast - Interview with Nicola Iarocci (2021)</h2>
<p><em>Hello everyone, and welcome to a new episode of DotNet Podcast, the Italian podcast dedicated to Microsoft technologies and more. You can find us on all major social platforms and podcasting services; all links are on our website, dotnetpodcast.com. Today we&rsquo;re talking about Python and Eve (or Pyrrest) and, why not, electronic invoicing for .NET.</em></p>
<p><em>Today I have the pleasure of having Nicola Iaroci with me. I met Nicola at the Italian edition of SoCraTes in Rimini a few years ago. Nicola is the classic jack of all trades: developer, entrepreneur, fitness enthusiast, consultant, open-source lover, Microsoft MVP, MongoDB Master, and probably something else I&rsquo;ve forgotten, because the list is very long. In the open source world, he&rsquo;s known primarily for Eve (we&rsquo;ll have him explain how to pronounce it), a REST framework for Python, and Electronic Invoicing .NET. I almost forgot: if you want to know anything about how Git works, Nicola knows it all.</em></p>
<p><strong>Welcome Nicola! Did I forget anything?</strong></p>
<p>Hi, thanks, welcome everyone. Well, no, I&rsquo;d say probably yes, but I can&rsquo;t tell you what, so I&rsquo;d say the introduction is perfect. Thanks.</p>
<p><strong>This podcast has always been oriented toward the .NET world, though lately we&rsquo;re branching out a bit into various technologies and even topics not necessarily technical. But assuming our listeners are primarily .NET developers, briefly, what is Python, and why should or could a C# .NET developer be interested?</strong></p>
<p>Sure, so first of all, Python fundamentally, let&rsquo;s say from a general point of view, is not that different from the languages we&rsquo;re used to in the .NET world, particularly C#, in the sense that it&rsquo;s still a high-level language, object-oriented from its foundations, let&rsquo;s say, from its roots. The main difference, perhaps, is that it&rsquo;s fundamentally interpreted, so there&rsquo;s an interpreter that executes the language and programs, although it&rsquo;s also possible to do JIT compilation, especially for performance reasons.</p>
<p>I&rsquo;ll add an important note because people generally think that a dynamic language is not strongly typed, which is not true. Python is a strongly typed language, but it has dynamic semantics, so type checking is still possible. I always clarify this because those coming from C-derived languages often think it&rsquo;s very similar to JavaScript, when in reality, there are clear differences.</p>
<p>It&rsquo;s certainly a language designed to be more approachable for a general programmer or even a beginner, and this probably also explains why it&rsquo;s had such success, I&rsquo;d say almost incredible success, for example, in the world of scientific research, numerical computing, in the financial world and for those who need to do numerical analysis. Because, among other things, in that particular area it&rsquo;s a language where performance is excellent, not because Python is a fast language (it&rsquo;s not at all, being interpreted), but a very beautiful thing about Python is that you can write its libraries in C, with bindings that practically allow you to use libraries written in C as if they were Python libraries.</p>
<p>And this is the trick that allowed all these tools for numerical, scientific, and financial analysis to be written in a language that&rsquo;s simple to grasp, even for those who perhaps aren&rsquo;t born developers like us. For example, think of a researcher, a scientist locked in their laboratory who can understand Python, approach programming and immediately have powerful tools available, yet the language remains easily readable and understandable. It&rsquo;s a perfect language, for example, for learning to program in general.</p>
<p>Then what else? Like our .NET languages, it obviously supports modules and packages. There&rsquo;s an equivalent to NuGet: PyPI, where you can now find hundreds of thousands of packages to install.</p>
<p>One thing that personally interested me a lot about Python when I started studying it was the fact that it was cross-platform from the beginning. It was a language that, when I started studying, was already twenty years old, so very mature. The base class library, or something like that, so it comes with a lot of included material, a bit like .NET at this point with .NET Core. Practically, whatever you want to do, there&rsquo;s certainly a standard way that allows you to do it.</p>
<p>The fact that it was cross-platform for me then was very interesting, because I came from the .NET ecosystem, which, when I started looking at Python about 10 years ago, was still absolutely out of the question. Then the world is made to change rapidly; it would also be nice if you let me tell you what happened in those years, but we probably don&rsquo;t have time. But fundamentally, yes, the fact that it was open source from the beginning, 20 years ago, I really liked a lot.</p>
<p>I must admit that in those years we fundamentally had to port our application, desktop applications, standalone, networked applications, and I was a bit frustrated by let&rsquo;s say the old Microsoft world, to be clear, which sounds strange coming from a Microsoft MVP, but this is also to tell why I became a Microsoft MVP after having abandoned Microsoft, I must say also quite disappointed, and I moved to the Python world. Then I was noticed in the Python world by Microsoft people, who sort of recruited me into this part of the MVP world.</p>
<p>Then I actually went back to doing a lot of C#, F#, in short, working in the .NET world. Actually, if I have to be honest, nowadays about 75-80% of my work is in C# and F#, and the remaining 20% is maintenance of my open-source Python packages.</p>
<p>So yes, let&rsquo;s say this: Python, personally, gave me new perspectives to answer your question. You know, when you&rsquo;re always inside, you always drink from the same source, you always drink the same water, and certainly it&rsquo;s excellent water, but you don&rsquo;t know the other flavors, the other tastes.</p>
<p>I&rsquo;ll give you a trivial example: in C#, historically (keep in mind that I&rsquo;m a certain age, so I started writing C# really too many years ago), I remember this episode that always marked me. They had always taught me not to use try-catch if possible because exceptions in .NET were performance problems; it was a bad practice. In the Python world, it&rsquo;s exactly the opposite: you write code without too many guards, you focus on the logic that solves the problem, and you catch and handle errors as needed.</p>
<p>Going back to the C# world, I started using this thing a lot in Python and used it aggressively, even to the dismay of my colleagues who had stayed in the world. And this is simply an example. Then, in the meantime, obviously, in these 10-15 years, try-catch is no longer a problem like it was 15 years ago.</p>
<p>I brought some things from the Zen of Python, a kind of decalogue that Python programmers try to follow, into the C# world. For example, &ldquo;Explicit is better than implicit,&rdquo; which is a classic of the Python world. So, rather than write one more line of code, make your intention exactly clear, rather than hiding things behind too many automagical things.</p>
<p>So, all these little things here. Now, yes, the .NET world has given us a lot, it&rsquo;s not even worth saying. Actually, now they&rsquo;ll do the same thing here, too. When I moved there, and especially there, I think C# was already very mature. So I found myself&hellip; I remember another thing: when, for the first time, I didn&rsquo;t understand how a REST call worked in Python, and I realized I could go to GitHub to see the source code of the framework I was using, which was Flask.</p>
<p>It&rsquo;s a bit like if I, 15 or 10-12 years ago, had been able to look at the ASP.NET source code to understand exactly why things weren&rsquo;t working as I thought they should. That thing for me was, the English would say, paradigmatic. It really opened my heart, and I understood that was the world I wanted to be in. Then you see, many of these arguments are a bit, let&rsquo;s say, weak today because C# and .NET are now fully open source. But better this way, thank God. A lot has changed in recent years.</p>
<p><strong>Nicola has a t-shirt I couldn&rsquo;t see well at first; it has the Superman logo, but it&rsquo;s actually an F with a hashtag, so it&rsquo;s an F# t-shirt. Is there a relationship between the functional world and Python, or is Python a traditional object-oriented world, let&rsquo;s call it that?</strong></p>
<p>Well, that&rsquo;s a good question. Actually, Python was born entirely and purely object-oriented. So anything you use in Python is an object, but it has a strong predisposition also toward functional programming, let&rsquo;s say. I have to be honest: if I want to do good quality functional programming, F# is a thousand times better than Python, but you can certainly do it.</p>
<p>Let&rsquo;s say this is probably interesting as well. I wouldn&rsquo;t have arrived at F# (let&rsquo;s say) if I hadn&rsquo;t gone through Python. Always for the discussions I was telling you about before, the approach in Python is to simplify things, break them down into&hellip; well, these are good practices used in all programming languages. But there&rsquo;s a tendency, let&rsquo;s say, to use functions rather than magic classes that incorporate state, for example.</p>
<p>In Python, it&rsquo;s quite common, even if not everyone does it, because, being a complete object-oriented language, you can perfectly well maintain state inside objects as you would in a C# class, in a classic way. But you will surely have noticed, and I think the listeners too, that the trend in C#, as well as in recent versions, is toward functional programming in a manner I&rsquo;d say is almost impetuous, so records, immutables, many other things like enhanced lambdas, etc., etc.</p>
<p>So, coming back to the .NET world from Python, I became much more curious about F # than I had been 10 years ago. So yes, in Python you can do decent functional programming and organize your code in a functional way, but it&rsquo;s certainly a language that remains object-oriented, let&rsquo;s say, in its orientation.</p>
<p>And it&rsquo;s not even, I have to tell you the truth, compared to C#, which has been adopting so much from F# in the last two or three versions, Python is not making this huge effort to become functional, and in this, I have to say I quite agree. I really like the evolution of C#, especially for me, who also obviously does F#. I think I would really like also like to know how to say, I&rsquo;ve also tried actually in some conferences to do outreach in this sense, to encourage the C# developer to go toward functional, and also to illustrate F#, the principles of F#.</p>
<p>But I also appreciate the fact that in the Python world, they said, &ldquo;ok, Python at its heart is an object-oriented language and its focus is there, let&rsquo;s improve that type of paradigm. There are other languages that do well. And in the .NET world, this is very true: there&rsquo;s C#, and we have the enormous fortune of also having F#.</p>
<p>Now there&rsquo;s been an attempt at hybridization, let&rsquo;s say, or rather to bring into the C# world everything that&rsquo;s beautiful about the functional world, which sure is appreciable. I&rsquo;m happy, I&rsquo;m already using it a lot. But I think it can also create a lot of confusion for a newcomer to the language, who perhaps comes from object-oriented programming and finds themselves with many functional things and doesn&rsquo;t quite understand what to do.</p>
<p>I adore the latest versions of C#, and I&rsquo;m very happy about it, but what is the specific direction of C#?</p>
<p><strong>Yes, I also have a sort of adoration for the latest version of C#, but I realize that having behind me&hellip; I started writing C# code in 1999 with Beta 1 of the .NET Framework. So I&rsquo;ve been through all of them, so for me, the novelties are small things compared to the twenty years that have passed. I realize that the problem might be that, for a new developer who arrives today, they face, fundamentally, an almost insurmountable mountain to climb.</strong></p>
<p>That&rsquo;s exactly what I meant, so adding then also, let&rsquo;s say, this cognitive weight. One could ask oneself why can&rsquo;t I use a class instead of a record, for example, but the same thing, what&rsquo;s the fundamental difference? Yes, there are reasons, but one of the really strong things about Python is its ease of access for those starting in programming.</p>
<p>I&rsquo;ve seen that Microsoft is making huge efforts in this regard, with video series on YouTube and sites to welcome people to C#. And I, in particular, who come from the world, I&rsquo;m let&rsquo;s say with feet in both camps, so I&rsquo;m well known in the Python world too, so much so that I&rsquo;ve also done presentations where I present Python to the C# programmer and C# and .NET to the Python programmer.</p>
<p>Especially now that C# is finally cross-platform and open source, it becomes much more&hellip; before, it was unthinkable to talk to a Python programmer about learning C#, which was only Windows and only .NET Framework, standalone, etc. It was really unthinkable. Now some cracks are opening, I&rsquo;m trying to slip in there, but it&rsquo;s very hard because clearly we have let&rsquo;s say an image, we&rsquo;re known as dotNetters in quotes for enterprise, for PA&hellip; and heavy stuff that&rsquo;s installed on Windows, the GAC, all these problems that existed in the Windows world.</p>
<p>Many times, making people understand &ldquo;look, now you can take a Linux machine and run a web application written in C# with the same ease as you would with Node or Python&rdquo; is really a message that leaves people open-mouthed, and they don&rsquo;t believe it, you have to show them. So the work to be done on our part is really a lot.</p>
<p><strong>You touched on Python at the beginning of the discussion, saying, if I remember correctly, you used Flask as a framework, which I assume is a sort of counterpart to ASP.NET. More or less? What relationship is there between Flask, ASP.NET, Eve and the REST world in general? And why did you feel the need to write a framework for REST for Python?</strong></p>
<p>Well, that&rsquo;s an excellent question. When I came to Python, there was a framework called Django, which was very widely used and very famous, and did the equivalent of a modern ASP.NET, an ASP.NET Core. But it was too complex, it was exactly the classic behemoth in the .NET style, because I&rsquo;m talking about the old way, where you had to take everything that came or what you needed. What I needed was to practically implement the equivalent of a Web API application we have in the .NET world, so the controller&hellip; well, there&rsquo;s no concept of controllers, but it&rsquo;s the classic REST API concept.</p>
<p>So, Flask actually defines itself as a REST API, but it&rsquo;s not a true Web API. It&rsquo;s more of a .NET type framework. When I explain to C# programmers what exactly Eve is, I make this kind of comparison: imagine a Web API .NET, well, Eve gives you that with the addition that there was this attempt to make it very easy to put online when you need an API that&rsquo;s basically a front-end for a database, so not much business logic but CRUD operations and things like that.</p>
<p>So, in this sense natively, Eve, besides providing the REST interface toward clients which by the way is strongly opinionated (that is, keep in mind that when I wrote Eve it actually was born as an internal project for my company, so we knew exactly that a POST would create a record, a PUT would replace, a PATCH would modify), I didn&rsquo;t create a framework that lets you do whatever you want, precise choices were made about how verbs work, how modifications work.</p>
<p>And fundamentally, if that&rsquo;s okay with you, my framework probably lets you work agilely and quickly. If you don&rsquo;t agree, use Flask or another framework, or build your own. And so yes, I&rsquo;d say the relationship is this: Flask could be, let&rsquo;s say, the core of a Web API. Look, it comes to mind now with .NET 6 this new interesting feature, which are the minimal APIs.</p>
<p>If you take the Flask homepage and look at the quick start example, it&rsquo;s maybe ten lines of code, and you take a snippet that Microsoft is publishing on its social media (David Fowler comes to mind on Twitter; every now and then, he posts screenshots of these minimal APIs), they&rsquo;re almost overlapping, it&rsquo;s incredible, right?</p>
<p>And so the work they&rsquo;re doing now in .NET 6 with minimal APIs is to remove from the logic let&rsquo;s say MVC and everything that was behind it, remove the routing and those things from verb management and then put it all in your hands so that you can make a pure API without the behemoth, without having to create a controller and so on.</p>
<p>So, Flask practically gives you that base that we&rsquo;ll now have in .NET 6. So, this, and minimal APIs are something that in my opinion can be very interesting for those who want to start using C# for example to make Web APIs, because when I came from C# I had the whole behemoth world let&rsquo;s say to manage and I found Flask which gave me the building blocks to build what I wanted, it was exactly the reason why I went to use Flask and Python.</p>
<p>So finally in .NET 6 we&rsquo;ll have something very similar and it&rsquo;s really impressive to compare Node code, Python code with Flask and .NET 6 minimal API code and see that the effort is very evident from Microsoft to make it interesting also for those coming from other stacks where all that, sorry if I repeat myself (I call it the behemoth), all that complication&hellip; so you have to have a controller, you have to have a view, you have to make a site, you have to have in short the data layer, all these affairs that certainly come from data user, among these and so on, are being somewhat thinned out to make everything lighter and it will be very interesting in my opinion.</p>
<p><strong>Exactly. One thing I noticed is that, finally, for the first time with .NET 6, the empty project template is truly empty.</strong></p>
<p>Exactly, Flask has been like that for me: you just need a .py file with your four lines of API initialization, and then a nice little function that responds to a GET, and you&rsquo;re done. Now we&rsquo;ll have this in .NET 6 too, which is really interesting to me. Hopefully, then we&rsquo;ll be able to make the rest of the world understand that .NET is no longer what it was 10 or 15 years ago, and here I emphasize this is the big commitment, in my opinion, the real challenge to win: communication.</p>
<p>But I have to say that on this I&rsquo;m optimistic for another reason and that&rsquo;s performance, that is the performance of .NET Core, multi-framework, cross-platform are really interesting and this is the reason why I went back to doing a lot of C# actually, because with .NET Core I have cross-platform and performance that I don&rsquo;t have in Python and now I&rsquo;m also starting to have a language, a stack that&rsquo;s agile and very similar to what I used in Python, what I use in Python or in Node for example. But let&rsquo;s not talk about Node, otherwise we&rsquo;ll have a classic flame war.</p>
<p><strong>Ok, in all of this, how does Electronic Invoicing .NET fit in?</strong></p>
<p>Well, Electronic Invoicing is also here, the result of my Python experience, that is, in Python I embraced open source to the point of becoming the first creator and then maintainer of some open source projects, and I saw the incredible potential that comes with letting&rsquo;s say, the benefits you have from making your code public.</p>
<p>And so going back to work in .NET (we&rsquo;re talking about 2014-2015, because electronic invoicing, it must be said, is something that was imposed by law, I think in 2019, now I don&rsquo;t remember, but actually the technical specifications were already in place for some years for the public administration world). So we had to do this thing internally.</p>
<p>Fundamentally, for those who don&rsquo;t know the product, <a href="https://fatturaelettronicaopensource.org">FatturaElettronica.NET</a> is simply a deserializer and serializer of electronic invoices that puts in your hands an instance of a class that represents the electronic invoice and that, very handily, also forces you to validate it according to the technical specifications. So you can, before submitting your electronic invoice to the Revenue Agency, etc., already know whether it will be accepted, identify any errors, and tell your user how to correct them. This is the version in a nutshell.</p>
<p>And so when we did this and I started working on this project I proposed to colleagues to try to leave it as open source because it was evidently something that would become useful certainly to a niche compared to Eve or <a href="https://python-cerberus.org">Cerberus</a> which is another project I have, but because meanwhile it&rsquo;s only dedicated to the Italian public and not to the whole planet let&rsquo;s say, but also certainly only to those who develop management software etc., etc.</p>
<p>But why not? It seemed to me an interesting little game, also because, I&rsquo;ll tell you the truth, it may seem a bit naive on my part, but it seemed to me the way to show and make .NET developers understand that open source, even from us peons, is perfectly possible. If you have an interesting project that can be useful, you can do it even if you come from the let&rsquo;s call it closed enterprise world, like that of .NET, and it seemed to me a way to give an example and encourage others to take the same step.</p>
<p>In short, at the beginning, it remained quiet for two or three years, and we used it only by us and four other unfortunate souls like us. Gradually it gained traction, it clearly became a very important thing when the law then imposed electronic invoicing and I must say we had the advantage, you see there too, of being a project that by then was already a few years old (it was from 2015 I think I left it open source), it was already mature enough to be adopted by those who were panicking because they found themselves with three months to implement something and so after that contributors arrived.</p>
<p>The thing about the whole Electronic Invoicing project that gives me the most satisfaction is the fact that there are .NET developers and it&rsquo;s evident from how they make pull requests and how they contribute to the code that they&rsquo;ve never done it before, but with enthusiasm and obviously out of necessity they get to work, they throw themselves into it and they&rsquo;ve also contributed pieces of code that have proven very important.</p>
<p>So in my small way, in the .NET world, what usually happens in other worlds I come from, or rather that I return to, so Python, is happening.</p>
<p><strong>This is a fascinating thing that recently happened to me too because I have several open source projects, one recently&hellip; a guy who I later discovered was Australian started opening issues, then a couple of pull requests and then more and now I&rsquo;m evaluating within myself whether to make him a maintainer because he&rsquo;s contributing in a very important way and if the project hadn&rsquo;t originally been open source because it didn&rsquo;t need to be open source, originally there wouldn&rsquo;t have been all the contributions that I honestly had never thought of, they didn&rsquo;t make much sense.</strong></p>
<p>Absolutely, I confirm and my experience too. To give a practical example on Electronic Invoicing, a guy comes to mind who contributed&hellip; I think I implemented serialization in JSON, in addition to XML, for these electronic invoices, but I wasn&rsquo;t at all interested in deserialization. It&rsquo;s a guy&hellip; moreover, it&rsquo;s also the contract, the pull request arrived with this feature completely implemented, and so now I support bidirectional JSON or the famous digital signatures, which are a very complex topic.</p>
<p>Electronic invoices can be sent as pure XML or with a digital signature. Actually the large part of those features was contributed from the outside. They&rsquo;re important features you see that I didn&rsquo;t work on, clearly, then I contributed to quality control, everything you want, but giving me so much value to the project and obviously to the community.</p>
<p>And among these contributors, there are precisely new contributors who, often precisely because of their enthusiasm, are the ones who in the end contribute the most, with also those more interesting features.</p>
<p>If I have a minute to tell another episode that comes to mind, in Eve, there was this guy. I had already been on GitHub for 4-5 years; it was going very well, and it had widespread adoption, which I was very proud of. After which, this pull request from this guy arrives, with, I remember, something like 800 code changes, so a monster pull request. Going to look at them, they were all changes to comments, what in Python are called docstrings, they&rsquo;re practically the inline documentation that you put as a comment that then serves developers to understand your code.</p>
<p>They were full of typos and errors because I&rsquo;m obviously not a native English speaker, so there were grammatical errors, typos, and other issues. It was super embarrassing because I realized that my code with all my errors had been seen by who knows how many tens of thousands of programmers, who knows how many laughs they had at my expense.</p>
<p>But the beautiful thing about this contribution was that he wrote to me, &ldquo;look, I&rsquo;m not an expert programmer, so I thought of contributing in this way. And from that day, the Eve documentation has enormously improved, so that a contribution which is not a code contribution, from an absolute non-expert for me personally, for the whole project, has had and still has an immense value.</p>
<p>So this is also a message, I always tell this episode. There are opportunities to contribute in a significant way for anyone, from the super programmer (the famous &ldquo;10x developer&rdquo; if you also say it in Italian), but also those who have just started can help and indeed, they should be encouraged because they&rsquo;re the ones who have so much enthusiasm, among you who then give them confidence, the problem is that after a while being a maintainer becomes very demanding and you start to delegate to someone who I&rsquo;m not saying replaces you, but maybe even yes.</p>
<p><strong>In fact, the next question is precisely that: if I understood correctly, both open source projects have some relationship with your work, but obviously, the cognitive and managerial load is significantly higher than what your work would generate. So what is your experience in the world of open source governance, and in general, managing projects that start maybe a bit like, I don&rsquo;t know, what we could call a playground, and then explode in your hands, and you say, &ldquo;oh my God, now what do I do?&rdquo;</strong></p>
<p>Yes, it&rsquo;s a gigantic problem actually because with Eve, thank God, we&rsquo;ve now reached a maturity and stability of the framework that allows me to live quite on my laurels, but attention, simply because I chose that the project is mature and stable, and I don&rsquo;t want to take it, say, to a version 2.0. If I were like .NET can be forced every year to make a new major release, it would obviously be my job 24 hours a day.</p>
<p>I also confess that to solve this problem I also tried to make Eve somehow profitable, to have an income from the project itself through donations, like &ldquo;buy me a coffee&rdquo;, but not with the objective of becoming full-time living, but with the objective of being able to pay myself half a day of work per week to dedicate explosively to the project, because if I could have dedicated, say, every Friday 8 hours to open source, you would certainly have a project 10 times more beautiful than what it has now, same thing with Cerberus, same thing with Electronic Invoicing.</p>
<p>As you can imagine, this thing didn&rsquo;t have much success because everyone is very good at installing packages, but when they have to put their hands in their wallets, they&rsquo;re much less good at it. Maybe there was gratitude for receiving this, which is very pleasant, but the long-term strategy is missing&hellip; another topic; we don&rsquo;t want to discuss now how to maintain&hellip;</p>
<p>There comes a moment when the cognitive commitment is really great, you have so much other business and other work types to deal with, and it becomes a problem. The solution, for example, I was lucky because, a bit like what happened to you, one of these contributors, gradually, I really let him, even in a somewhat sly way, I let him take control, but it started with minimal pull requests, then he gained courage, I sort of nurtured him.</p>
<p>In the end when I was certain he knew the codebase very well, he was also an expert, in short fundamentally Cerberus I left in his hands 100%, so I follow it from afar, I receive email notifications, if he has some important modification to make he asks me for advice, but actually he even has the rights to publish updates and so let&rsquo;s say now for me I&rsquo;m simply a father watching from afar the child grow, so to speak.</p>
<p>For Eve, I&rsquo;m still the main maintainer, but as I tell you, the choice of Eve was perhaps made with the idea of being able to continue living and earning, let&rsquo;s say, my salary. It was ok. The product is mature. From now on, we accept pull requests for bug fixes or mature new features that make sense to incorporate, but I don&rsquo;t foresee further development in any direction.</p>
<p>Electronic Invoicing, for me, is strategic because we use it every day in the company; we ultimately make management software, so there I remain the maintainer, and I do it gladly because there&rsquo;s a necessity.</p>
<p>So, in general, hopefully in the .NET world too, we&rsquo;ll arrive at this&hellip; so, many have told me &ldquo;how nice, I&rsquo;ll definitely make a donation, we&rsquo;ll make a donation for Electronic Invoicing because we use it in the company&rdquo;, I think not even one has arrived. So in this certainly the .NET world still has to mature and become aware of the fact that a long-term investment for a product you use every day and that gives you income in the end somehow (otherwise you wouldn&rsquo;t use it), it makes sense to think about contributing to the long life of the project to not risk finding yourself at a certain point with the maintainer who took the motorcycle and went to the Himalayas to climb and you have a critical project maybe that&rsquo;s no longer updated, that has security problems, etc. On this, there&rsquo;s work to do.</p>
<p><strong>Ok, to conclude, last two quick questions. Still staying in the open source world, if you had to give advice to someone who wants to start an open source project and advice to someone who wants to contribute to an open source project.</strong></p>
<p>Yes. So, for those who want to start, I&rsquo;d say don&rsquo;t worry. In the sense that, as you said before, there were projects you had put open source that actually didn&rsquo;t need to be. &ldquo;They didn&rsquo;t need to be open source.&rdquo; This is, the perception is a problem of really, I can&rsquo;t translate it into Italian, but it&rsquo;s a problem of wrong perception, in the sense that actually there&rsquo;s certainly someone on planet earth who has to solve the problem that you have to solve at that moment.</p>
<p>So even projects, if you want trivial small ones that serve little purpose, thanks to potential algorithms and tools, exposure from GitHub, from Google and so on, rest assured that if you&rsquo;re doing a project for electronic invoicing, someone else has that problem. So the first thing is that the history of open source is full of projects born as hobby projects, put on GitHub almost like this for convenience, because this way I have a remote backup, which actually exploded in the hands of maintainers because they were successful.</p>
<p>But even if they weren&rsquo;t successful, it serves you in the meantime to acquire the know-how, which is not small, and to gain experience in doing so and overcoming the shyness of sharing your code and showing it to the public. So, this is the other very important thing. My programming style has evolved a lot, thanks also to seeing what others do.</p>
<p>Sure, it can also be, how to say, sometimes not humiliating, I&rsquo;d say, but certainly it puts you in your place when you see that your code has been refactored in a much more performant or more elegant way by others, but it&rsquo;s there that you learn. It&rsquo;s a bit of the discourse about always drinking water from the same place I was telling you about. So certainly I&rsquo;d say first thing, don&rsquo;t be afraid, throw anything on GitHub even if the code is not the best&hellip; sorry&hellip; don&rsquo;t stay there to refine it, to clean it up, because maybe someone else will do it for you, who will even be grateful to you.</p>
<p>The other thing, probably, is&hellip; for those who want to start contributing instead, as I was saying before, there certainly are projects of the day that you use, even in professional frameworks&hellip; I&rsquo;ll also make here, I&rsquo;d say, another episode. When I was preparing a talk on Python and explaining how to use Python inside Visual Studio, which few people know, you can use all the Visual Studio features you&rsquo;re used to to write Python code. I realized that the official documentation on the Microsoft Visual Studio site had some shortcomings in the pages dedicated to Python. And so what did I do? I made a fork of that documentation, which is now finally all on GitHub. I contributed a fix to this documentation.</p>
<p>And now, I don&rsquo;t know if it&rsquo;s still like this, but two or three years ago, if you went to the official Microsoft documentation for Python, you&rsquo;d find my little face among the contributors. So there you go, I made a contribution even to an official Microsoft project. Free, because it&rsquo;s the tool that I use every day.</p>
<p>I&rsquo;m convinced that a large part of us developers have this experience of noticing a small error, a small problem, or a specification that doesn&rsquo;t necessarily require an extremely complicated algorithm to solve. It can also be, as I was telling you in that other episode, a docstring, a comment with a typo. They&rsquo;re all experiences that add up, that help you gain familiarity with the context, and so don&rsquo;t start maybe by contributing a Fibonacci optimization, because I don&rsquo;t know what.</p>
<p>So, really start from the trivial, from the simple, from what you do every day, because you know it very well and you&rsquo;re already competent. After which, there&rsquo;s time and a way to gain confidence; many of these my contributors, as I was telling you, start like this. Then, gradually, they gained courage and went to examine the deeper code, to solve the more complicated issues that I myself didn&rsquo;t feel like going to look at, because I knew it was a hornet&rsquo;s nest and the willing one arrived who did it in my place, riding the enthusiasm, which maybe I don&rsquo;t have anymore, but they have it, the positive energy to use, to spend.</p>
<p><strong>Good, very interesting, I agree completely. It&rsquo;s one of the most common barriers to entering the open source world, precisely because itis tied to the idea that &ldquo;I have to contribute,&rdquo; and you have in your head that the contribution must be substantial, when, in the end, it&rsquo;s often a small thing.</strong></p>
<p>Exactly. The novice contributor, let&rsquo;s say, is intimidated and thinks they should contribute something fundamental, but it doesn&rsquo;t make sense to contribute. On the other hand you have a maintainer who is literally at the window waiting for those who contribute the small things to arrive, because they&rsquo;re those, many small things that then are small things relatively (it&rsquo;s the perception of the remote developer that it&rsquo;s a small thing), it&rsquo;s all work that you take away from the maintainer and that you take away from the community.</p>
<p>So even the very small thing I can&rsquo;t wait for those more sought-after so-called small things to arrive. Actually, it has great value, as seen in the example of the 800 typos in the Eve documentation.</p>
<p><strong>I thank you for your availability. It&rsquo;s been a very pleasant chat. I hope to have you as a guest again, and as we shared before we started, we discussed an interesting topic that could be fitness for developers.</strong></p>
<p>If you decide to do it, call me. Thanks so much to you and your whole team for what you do with this podcast. You do an excellent job.</p>
<p><strong>Thanks so much, thanks so much and thanks again for your availability. See you next time, hello everyone.</strong></p>
<p>Bye-bye, bye everyone, thanks.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Isengard in Oxford</title>
      <link>https://nicolaiarocci.com/isengard-in-oxford/</link>
      <pubDate>Sun, 21 Dec 2025 19:11:27 +0100</pubDate>
      <guid>https://nicolaiarocci.com/isengard-in-oxford/</guid>
      <description>&lt;p&gt;The Los Angeles Review of Books on &lt;a href=&#34;https://lareviewofbooks.org/article/isengard-in-oxford/&#34;&gt;&lt;em&gt;The Bovadium Fragments&lt;/em&gt;&lt;/a&gt;, JRR Tolkien’s posthumous complete work, which was just recently published.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyone who has read Tolkien’s letters will know that he is at his funniest when filled with rage, and The Bovadium Fragments is a work brimming with Tolkien’s fury—specifically, ire over mankind’s obsession with motor vehicles. Tolkien’s anger is expressed through a playful satire told from the perspective of a group of future archaeologists who are studying the titular fragments, which tell of a civilization that asphyxiated itself on its own exhaust fumes. Tolkien’s fictional fragments use the language of ancient myth, reframing modern issues like traffic congestion and parking with a grandeur that highlights their total absurdity. It is Tolkien at his angriest and funniest, making The Bovadium Fragments a minor treasure in his ever-growing catalog.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The Los Angeles Review of Books on <a href="https://lareviewofbooks.org/article/isengard-in-oxford/"><em>The Bovadium Fragments</em></a>, JRR Tolkien’s posthumous complete work, which was just recently published.</p>
<blockquote>
<p>Anyone who has read Tolkien’s letters will know that he is at his funniest when filled with rage, and The Bovadium Fragments is a work brimming with Tolkien’s fury—specifically, ire over mankind’s obsession with motor vehicles. Tolkien’s anger is expressed through a playful satire told from the perspective of a group of future archaeologists who are studying the titular fragments, which tell of a civilization that asphyxiated itself on its own exhaust fumes. Tolkien’s fictional fragments use the language of ancient myth, reframing modern issues like traffic congestion and parking with a grandeur that highlights their total absurdity. It is Tolkien at his angriest and funniest, making The Bovadium Fragments a minor treasure in his ever-growing catalog.</p></blockquote>
<p>Tolkien’s repulsion toward machines is well documented, with Isengard serving as the in-story metaphor for technology used wrongly. The canonical reference has always been the war machines used in World Wars I and II, which he witnessed with terror on the battlefield. I never imagined that he also glimpsed Isengard in his everyday life, and much closer to home: in the polluted streets of Oxford.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Less</title>
      <link>https://nicolaiarocci.com/less/</link>
      <pubDate>Thu, 18 Dec 2025 08:50:22 +0100</pubDate>
      <guid>https://nicolaiarocci.com/less/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;When I&amp;rsquo;m writing, I write. When I&amp;rsquo;m cooking, I cook. When I&amp;rsquo;m talking to someone, I put my phone away. The constant mental juggling that felt necessary before now feels exhausting. There&amp;rsquo;s something meditative about giving your full attention to a single task.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://47nil.com/less&#34;&gt;47nil&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>When I&rsquo;m writing, I write. When I&rsquo;m cooking, I cook. When I&rsquo;m talking to someone, I put my phone away. The constant mental juggling that felt necessary before now feels exhausting. There&rsquo;s something meditative about giving your full attention to a single task.</p></blockquote>
<p>&ndash; <a href="https://47nil.com/less">47nil</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>JJ Cale</title>
      <link>https://nicolaiarocci.com/jj-cale/</link>
      <pubDate>Sun, 14 Dec 2025 11:29:22 +0100</pubDate>
      <guid>https://nicolaiarocci.com/jj-cale/</guid>
      <description>&lt;p&gt;We watched &lt;a href=&#34;https://en.wikipedia.org/wiki/A_Private_Life&#34;&gt;A Private Life&lt;/a&gt; in the theatre yesterday, a fine, funny and intriguing French film set in Paris with a solid Jodie Foster as protagonist.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;m here for the closing piece of the soundtrack, the one you hear over the end credits: &lt;a href=&#34;https://www.last.fm/music/J.J.+Cale/_/Don%27t+Go+To+Strangers&#34;&gt;Don&amp;rsquo;t Go To Strangers&lt;/a&gt;, by &lt;a href=&#34;https://en.wikipedia.org/wiki/JJ_Cale&#34;&gt;JJ Cale&lt;/a&gt;. I immediately reached for Shazam while Serena looked it up on Spotify.&lt;/p&gt;
&lt;p&gt;Now I’m spending this whole Sunday morning listening and reading about the artist and the &lt;a href=&#34;https://en.wikipedia.org/wiki/Tulsa_sound&#34;&gt;Tulsa sound&lt;/a&gt; movement he originated. Despite his reticence and all-around low profile, he was no small feat and inspired many a great artist in the 70s, 80s, and 90s. Just to get your bearings, he&amp;rsquo;s the original author of Cocaine later brought to fame by Eric Clapton.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We watched <a href="https://en.wikipedia.org/wiki/A_Private_Life">A Private Life</a> in the theatre yesterday, a fine, funny and intriguing French film set in Paris with a solid Jodie Foster as protagonist.</p>
<p>But I&rsquo;m here for the closing piece of the soundtrack, the one you hear over the end credits: <a href="https://www.last.fm/music/J.J.+Cale/_/Don%27t+Go+To+Strangers">Don&rsquo;t Go To Strangers</a>, by <a href="https://en.wikipedia.org/wiki/JJ_Cale">JJ Cale</a>. I immediately reached for Shazam while Serena looked it up on Spotify.</p>
<p>Now I’m spending this whole Sunday morning listening and reading about the artist and the <a href="https://en.wikipedia.org/wiki/Tulsa_sound">Tulsa sound</a> movement he originated. Despite his reticence and all-around low profile, he was no small feat and inspired many a great artist in the 70s, 80s, and 90s. Just to get your bearings, he&rsquo;s the original author of Cocaine later brought to fame by Eric Clapton.</p>
<p>Funny how you go watch a 2025 French movie only to end up digging an American artist from the 70s.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Plea by Flea</title>
      <link>https://nicolaiarocci.com/a-plea-by-flea/</link>
      <pubDate>Sun, 14 Dec 2025 10:15:52 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-plea-by-flea/</guid>
      <description>&lt;p&gt;I reluctantly admit that it was Spotify&amp;rsquo;s Discover Weekly that let me discover Flea&amp;rsquo;s new solo single, &lt;a href=&#34;https://www.last.fm/music/Flea/_/A+Plea&#34;&gt;A Plea&lt;/a&gt;. It’s jazz, and it&amp;rsquo;s beautiful. There are echoes of Fela Kuti and Sun Ra in it or, well, that was my first thought.&lt;/p&gt;
&lt;p&gt;The lyrics may sound naive at first, but they&amp;rsquo;re not. Instead, they strike me as lucid and match my general feeling about what&amp;rsquo;s going on lately, the risks we&amp;rsquo;re taking as a society, and what we should do to move beyond and improve ourselves. The &lt;a href=&#34;https://youtu.be/TmyjzvQv5bA?si=szHcpTKj_8P_9DjG&#34;&gt;video&lt;/a&gt; is 100% Flea, and it&amp;rsquo;s adorable (it is directed by his daughter).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I reluctantly admit that it was Spotify&rsquo;s Discover Weekly that let me discover Flea&rsquo;s new solo single, <a href="https://www.last.fm/music/Flea/_/A+Plea">A Plea</a>. It’s jazz, and it&rsquo;s beautiful. There are echoes of Fela Kuti and Sun Ra in it or, well, that was my first thought.</p>
<p>The lyrics may sound naive at first, but they&rsquo;re not. Instead, they strike me as lucid and match my general feeling about what&rsquo;s going on lately, the risks we&rsquo;re taking as a society, and what we should do to move beyond and improve ourselves. The <a href="https://youtu.be/TmyjzvQv5bA?si=szHcpTKj_8P_9DjG">video</a> is 100% Flea, and it&rsquo;s adorable (it is directed by his daughter).</p>
<p>Digging further, I <a href="https://www.nonesuch.com/journal/flea-releases-new-original-song-plea-2025-12-02">learned</a> that Flea has a “trumpet album” coming out next year (apparently the trumpet was his first instrument), and that Nick Cave lent his voice to one of the tracks. In the process, I also learned about Cave’s trenchant <a href="https://stereogum.com/2300054/nick-cave-clarifies-stance-on-red-hot-chili-peppers-discusses-forthcoming-flea-collaboration/news">opinion of RHCP</a>, which thankfully doesn&rsquo;t prevent Cave from admiring and respecting their bassist.</p>
<blockquote>
<p>I don’t care about the act of politics. I think there is a much more transcendent place above it where there’s discourse to be had that can actually help humanity, and actually help us all to live harmoniously and productively in a way that’s healthy for the world. There’s a place where we meet, and it’s love.</p></blockquote>
<p>&ndash; Flea</p>
<p>I am eager to listen to the new album.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Programming isn&#39;t the job</title>
      <link>https://nicolaiarocci.com/programming-isnt-the-job/</link>
      <pubDate>Fri, 12 Dec 2025 08:22:18 +0100</pubDate>
      <guid>https://nicolaiarocci.com/programming-isnt-the-job/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AI can replace most of programming, but programming isn’t the job. Programming is a task. It’s one of many things you do as part of your work. But if you’re a software engineer, your actual job is more than typing code into an editor. The mistake people make is conflating the task with the role.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s like saying calculators replaced accountants. Calculators automated arithmetic, but arithmetic was never the job. The job was understanding financials, advising clients, making judgment calls, etc. The calculator just made accountants faster at the mechanical part. AI is doing something similar for us.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>AI can replace most of programming, but programming isn’t the job. Programming is a task. It’s one of many things you do as part of your work. But if you’re a software engineer, your actual job is more than typing code into an editor. The mistake people make is conflating the task with the role.</p></blockquote>
<blockquote>
<p>It’s like saying calculators replaced accountants. Calculators automated arithmetic, but arithmetic was never the job. The job was understanding financials, advising clients, making judgment calls, etc. The calculator just made accountants faster at the mechanical part. AI is doing something similar for us.</p></blockquote>
<p><a href="https://terriblesoftware.org/2025/12/11/ai-can-write-your-code-it-cant-do-your-job/">AI Can Write Your Code. It Can’t Do Your Job</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Fleeing Deer</title>
      <link>https://nicolaiarocci.com/fleeing-deer/</link>
      <pubDate>Sun, 07 Dec 2025 07:31:58 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fleeing-deer/</guid>
      <description>&lt;p&gt;I swear it&amp;rsquo;s not an impressionist painting, just a blurry photo I took yesterday during my forest walk. The deer were watching me from the edge of the woods, not far away. The moment lasted a long time, until I ruined it by pulling out my phone. At that point, they took flight.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;If you&amp;rsquo;re reading from the RSS feed or the newsletter, &lt;a href=&#34;https://nicolaiarocci.com/fleeing-deer/&#34;&gt;click here&lt;/a&gt; to see the actual image.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I swear it&rsquo;s not an impressionist painting, just a blurry photo I took yesterday during my forest walk. The deer were watching me from the edge of the woods, not far away. The moment lasted a long time, until I ruined it by pulling out my phone. At that point, they took flight.</p>
<hr>
<p><em>If you&rsquo;re reading from the RSS feed or the newsletter, <a href="https://nicolaiarocci.com/fleeing-deer/">click here</a> to see the actual image.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Why speed matters</title>
      <link>https://nicolaiarocci.com/why-speed-matters/</link>
      <pubDate>Sun, 07 Dec 2025 06:59:56 +0100</pubDate>
      <guid>https://nicolaiarocci.com/why-speed-matters/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;If everything is slow-moving around you, it is likely not going to be good. To fully make use of your brain, you need to move as close as possible to the speed of your thought.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; Daniel Lemire, &lt;a href=&#34;https://lemire.me/blog/2025/12/05/why-speed-matters/&#34;&gt;Why Speed Matters&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>If everything is slow-moving around you, it is likely not going to be good. To fully make use of your brain, you need to move as close as possible to the speed of your thought.</p></blockquote>
<p>&ndash; Daniel Lemire, <a href="https://lemire.me/blog/2025/12/05/why-speed-matters/">Why Speed Matters</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>On the boundaries of humanity</title>
      <link>https://nicolaiarocci.com/on-the-boundaries-of-humanity/</link>
      <pubDate>Sat, 06 Dec 2025 16:54:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-the-boundaries-of-humanity/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;For most of humankind, and for tens of thousands of years, the idea that humanity includes every individual on the face of the earth has not existed. This designation stops at the border of a tribe or linguistic group, sometimes even at the edge of a village.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;— Paraphrased from Claude Lévi-Strauss, &lt;em&gt;Race and History&lt;/em&gt;, 1952 (&lt;a href=&#34;https://fieldnotesandfootnotes.wordpress.com/2012/04/30/quoting-levi-strauss-on-ethnocentrism-and-barbarism-following-a-brief-rambling-prelude-because-i-cannot-help-myself/&#34;&gt;&lt;em&gt;full quote and context&lt;/em&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I guess my beloved &lt;a href=&#34;https://nicolaiarocci.com/are-we-trek-yet/&#34;&gt;Star Trek future&lt;/a&gt;—post-scarcity, post-conflict, beyond divisions—is still far away.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>For most of humankind, and for tens of thousands of years, the idea that humanity includes every individual on the face of the earth has not existed. This designation stops at the border of a tribe or linguistic group, sometimes even at the edge of a village.</p></blockquote>
<p>— Paraphrased from Claude Lévi-Strauss, <em>Race and History</em>, 1952 (<a href="https://fieldnotesandfootnotes.wordpress.com/2012/04/30/quoting-levi-strauss-on-ethnocentrism-and-barbarism-following-a-brief-rambling-prelude-because-i-cannot-help-myself/"><em>full quote and context</em></a>)</p>
<p>I guess my beloved <a href="/are-we-trek-yet/">Star Trek future</a>—post-scarcity, post-conflict, beyond divisions—is still far away.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Code from my session at WPC 2025</title>
      <link>https://nicolaiarocci.com/code-from-my-session-at-wpc-2025/</link>
      <pubDate>Fri, 05 Dec 2025 10:07:42 +0100</pubDate>
      <guid>https://nicolaiarocci.com/code-from-my-session-at-wpc-2025/</guid>
      <description>&lt;p&gt;On Wednesday, I held a session  titled &amp;ldquo;Feature Flags and Dynamic Configurations in C#&amp;rdquo; at &lt;a href=&#34;https://www.wpc.education/&#34;&gt;WPC 2025&lt;/a&gt;. It went well, at least judging by the offline questions that came in at the end of the session and which almost made us late for lunch.&lt;/p&gt;
&lt;p&gt;Attending WPC is always exciting. The audience is large, the rooms are big and well-equipped, the energy is just right, and there&amp;rsquo;s always a chance to catch up with friends and colleagues. I especially enjoy seeing fellow Microsoft MVPs and speakers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On Wednesday, I held a session  titled &ldquo;Feature Flags and Dynamic Configurations in C#&rdquo; at <a href="https://www.wpc.education/">WPC 2025</a>. It went well, at least judging by the offline questions that came in at the end of the session and which almost made us late for lunch.</p>
<p>Attending WPC is always exciting. The audience is large, the rooms are big and well-equipped, the energy is just right, and there&rsquo;s always a chance to catch up with friends and colleagues. I especially enjoy seeing fellow Microsoft MVPs and speakers.</p>
<p>As promised, here is a <a href="https://github.com/nicolaiarocci/featureflags">link to the repository</a> with the code I demonstrated; just read the README to get your bearings. Oh, and as expected, someone in the audience got nerd-sniped by that <code>cj</code> bash function <a href="/curl-and-jq-go-to-a-conference/">I mentioned</a>.</p>
<figure>
    <img loading="lazy" src="/images/wpc2025.jpeg"
         alt="Snagged this one on LinkedIn. I expect the slides and video to be released soon by the fine folks at WPC."/> <figcaption>
            <p>Snagged this one on LinkedIn. I expect the slides and video to be released soon by the fine folks at WPC.</p>
        </figcaption>
</figure>

]]></content:encoded>
    </item>
    <item>
      <title>To hide in the woods</title>
      <link>https://nicolaiarocci.com/to-hide-in-the-woods/</link>
      <pubDate>Thu, 04 Dec 2025 15:16:35 +0100</pubDate>
      <guid>https://nicolaiarocci.com/to-hide-in-the-woods/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The woods, the jungle, the forest are the boundary between the wild and the civilized, a place of shelter and legendary fears, of hiding and losing oneself. A place of wonder and unease. [..] But what a mythical power lies in this tangle of nature, shadows, and roots, where the unconscious of the world can be found.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.internazionale.it/magazine/vinicio-capossela/2025/12/04/imboscarsi&#34;&gt;Vinicio Capossela&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The woods, the jungle, the forest are the boundary between the wild and the civilized, a place of shelter and legendary fears, of hiding and losing oneself. A place of wonder and unease. [..] But what a mythical power lies in this tangle of nature, shadows, and roots, where the unconscious of the world can be found.</p></blockquote>
<p>&ndash; <a href="https://www.internazionale.it/magazine/vinicio-capossela/2025/12/04/imboscarsi">Vinicio Capossela</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.2.4</title>
      <link>https://nicolaiarocci.com/eve-2.2.4/</link>
      <pubDate>Tue, 02 Dec 2025 16:06:46 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.2.4/</guid>
      <description>&lt;p&gt;Eve v2.2.4 was just released on &lt;a href=&#34;https://pypi.rg/project/Eve/2.2.4/&#34;&gt;PyPI&lt;/a&gt;. It is a minor update, with a validation fix contributed by &lt;a href=&#34;https://github.com/smeng9&#34;&gt;smeng9&lt;/a&gt;. See the &lt;a href=&#34;https://docs.python-eve.org/en/stable/changelog.html#version-v2-2-4&#34;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Eve v2.2.4 was just released on <a href="https://pypi.rg/project/Eve/2.2.4/">PyPI</a>. It is a minor update, with a validation fix contributed by <a href="https://github.com/smeng9">smeng9</a>. See the <a href="https://docs.python-eve.org/en/stable/changelog.html#version-v2-2-4">changelog</a> for details.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How Brian Eno created Music for Airports</title>
      <link>https://nicolaiarocci.com/how-brian-eno-created-music-for-airports/</link>
      <pubDate>Tue, 02 Dec 2025 11:35:21 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-brian-eno-created-music-for-airports/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Brian Eno’s &lt;em&gt;Ambient 1: Music for Airports&lt;/em&gt; is a landmark album in ambient and electronic music. Although it wasn’t the first ambient album, it was the first album to be explicitly labelled as ‘ambient music’. [..] In this article, I’ll discuss how Music for Airports was created, and I’ll deconstruct and recreate the tracks 2/1 and 1/2. Hopefully, the article will demystify some of Brian Eno’s techniques, and give you some ideas about how to adopt some of his ambient music techniques yourself.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Brian Eno’s <em>Ambient 1: Music for Airports</em> is a landmark album in ambient and electronic music. Although it wasn’t the first ambient album, it was the first album to be explicitly labelled as ‘ambient music’. [..] In this article, I’ll discuss how Music for Airports was created, and I’ll deconstruct and recreate the tracks 2/1 and 1/2. Hopefully, the article will demystify some of Brian Eno’s techniques, and give you some ideas about how to adopt some of his ambient music techniques yourself.</p></blockquote>
<p>I&rsquo;m a sucker for this nerdy stuff. I didn&rsquo;t know Brian Eno designed the cover art for the whole <em>Ambient</em> series himself. Also, oh my God, take a look at the graphic score. It is mesmerizing. It looks like mysterious alien notation, gifted to us, humble hearthlings, to ponder<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p><a href="https://reverbmachine.com/blog/deconstructing-brian-eno-music-for-airports/">How Brian Eno Created Ambient 1: Music for Airports</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>&ldquo;Not a trained musician and unable to read or write sheet music, he used graphic symbols to denote each musical phrase or loop&rdquo;.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>On the usefulness of writing</title>
      <link>https://nicolaiarocci.com/on-the-usefulness-of-writing/</link>
      <pubDate>Tue, 02 Dec 2025 09:55:03 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-the-usefulness-of-writing/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I think of it [the usefulness of writing] like breathing but for ideas. We do so much reading all day—there should be a natural balance with producing words too. Inhale, exhale, inhale, exhale&amp;hellip;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Joe Boudreau in &lt;a href=&#34;https://flowtwo.io/post/on-10-years-of-writing-a-blog-nobody-reads&#34;&gt;On 10 Years of Writing a Blog Nobody Reads&lt;/a&gt;, an article I agree 100% with.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I think of it [the usefulness of writing] like breathing but for ideas. We do so much reading all day—there should be a natural balance with producing words too. Inhale, exhale, inhale, exhale&hellip;</p></blockquote>
<p>Joe Boudreau in <a href="https://flowtwo.io/post/on-10-years-of-writing-a-blog-nobody-reads">On 10 Years of Writing a Blog Nobody Reads</a>, an article I agree 100% with.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My session on MCP servers at .NET Conference Italia 2025</title>
      <link>https://nicolaiarocci.com/my-session-on-mcp-servers-at-dotnet-conference-italia-2025/</link>
      <pubDate>Wed, 26 Nov 2025 16:24:38 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-session-on-mcp-servers-at-dotnet-conference-italia-2025/</guid>
      <description>&lt;p&gt;I presented a session at the &lt;a href=&#34;https://www.aspitalia.com/eventi/97/.NET-Conference-Italia-2025-Milano.aspx&#34;&gt;.NET Conference Italia 2025&lt;/a&gt; in Milan a couple of weeks ago. The title was &amp;ldquo;Integrating our applications with LLMs and AI via MCP Servers&amp;rdquo;. It was well received; there were good questions throughout the talk and in the hall afterward. Surprisingly, live coding and demos went relatively smoothly.&lt;/p&gt;
&lt;p&gt;The fine guys at ASP Italia just published the &lt;a href=&#34;https://media.aspitalia.com/events/netconf25-LLM-dotNET-AI-MCP.media&#34;&gt;video&lt;/a&gt; in case someone is interested.&lt;/p&gt;
&lt;p&gt;Yeah, it is in Italian. I got a transcript from MacWhisper and then asked Claude to translate and clean it up. It did a pretty good job, so let me know if there&amp;rsquo;s any interest in an English transcript; I might post it here.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I presented a session at the <a href="https://www.aspitalia.com/eventi/97/.NET-Conference-Italia-2025-Milano.aspx">.NET Conference Italia 2025</a> in Milan a couple of weeks ago. The title was &ldquo;Integrating our applications with LLMs and AI via MCP Servers&rdquo;. It was well received; there were good questions throughout the talk and in the hall afterward. Surprisingly, live coding and demos went relatively smoothly.</p>
<p>The fine guys at ASP Italia just published the <a href="https://media.aspitalia.com/events/netconf25-LLM-dotNET-AI-MCP.media">video</a> in case someone is interested.</p>
<p>Yeah, it is in Italian. I got a transcript from MacWhisper and then asked Claude to translate and clean it up. It did a pretty good job, so let me know if there&rsquo;s any interest in an English transcript; I might post it here.</p>
<p>Speaking of English, I&rsquo;ve started submitting to international events again, without any luck so far. The conference landscape has changed quite a bit, especially since the COVID break. I still get invited to local ones, while internationals have been elusive. I suspect my change in technology stack plays a role. It was relatively easy to speak abroad when I was into Python. With .NET, not so much. But again, I was into Python in the pre-COVID era, so it is hard to tell which factors are at play and what their weight is.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Time</title>
      <link>https://nicolaiarocci.com/time/</link>
      <pubDate>Wed, 26 Nov 2025 08:31:56 +0100</pubDate>
      <guid>https://nicolaiarocci.com/time/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;If you want to understand time — which is how you come to befriend life — turn to stone.
Climb a mountain and listen to the conversation between eons encoded in each stripe of rock.
Walk a beach and comb your fingers through the golden dust that was once a mountain.
Pick up a perfect oval pebble and feel its mute assurance that time can grind down even the heaviest boulder, and smooth even the sharpest edge.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>If you want to understand time — which is how you come to befriend life — turn to stone.
Climb a mountain and listen to the conversation between eons encoded in each stripe of rock.
Walk a beach and comb your fingers through the golden dust that was once a mountain.
Pick up a perfect oval pebble and feel its mute assurance that time can grind down even the heaviest boulder, and smooth even the sharpest edge.</p></blockquote>
<p><a href="https://wrywriter.ca/2025/11/25/time/">wry writer</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Train Dreams</title>
      <link>https://nicolaiarocci.com/train-dreams/</link>
      <pubDate>Tue, 25 Nov 2025 10:09:37 +0100</pubDate>
      <guid>https://nicolaiarocci.com/train-dreams/</guid>
      <description>&lt;p&gt;With all the medium-to-very-low-quality productions we&amp;rsquo;ve been accustomed to from Netflix, it was a pleasant surprise and a relief to watch &lt;a href=&#34;https://www.imdb.com/title/tt29768334/&#34;&gt;Train Dreams&lt;/a&gt; last night.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll quote the most recent review on IMDb:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Robert&amp;rsquo;s life is gently lived and not without profound tragedy. The film evokes our own memories, little joys and sadnesses, discoveries, losses, and hopes, bringing grace to our self-reflection. The film is heartbreakingly beautiful. Acting, editing, and direction are just right. &lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>With all the medium-to-very-low-quality productions we&rsquo;ve been accustomed to from Netflix, it was a pleasant surprise and a relief to watch <a href="https://www.imdb.com/title/tt29768334/">Train Dreams</a> last night.</p>
<p>I&rsquo;ll quote the most recent review on IMDb:</p>
<blockquote>
<p>Robert&rsquo;s life is gently lived and not without profound tragedy. The film evokes our own memories, little joys and sadnesses, discoveries, losses, and hopes, bringing grace to our self-reflection. The film is heartbreakingly beautiful. Acting, editing, and direction are just right. </p></blockquote>
<p>I read on Wikipedia that it&rsquo;s doing very well, and deservedly so. Of course, I now regret not having known about or read the <a href="https://en.wikipedia.org/wiki/Train_Dreams">novel</a> before watching the movie.</p>
<p><em>Update:</em> I just found out that the title track of the original soundtrack is by Nick Cave.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I Am Not Yours</title>
      <link>https://nicolaiarocci.com/i-am-not-yours/</link>
      <pubDate>Tue, 25 Nov 2025 08:18:56 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-not-yours/</guid>
      <description>&lt;p&gt;I was walking early this morning, &lt;a href=&#34;https://nicolaiarocci.com/early-morning-walks&#34;&gt;as usual&lt;/a&gt;, when I came
across an unusual advertising sign. It was in Spanish, text only, red background and black
typography. I don&amp;rsquo;t comprehend Spanish well enough to read it, so I photographed it
and sent it to Serena, who promptly replied with the translation.&lt;/p&gt;
&lt;p&gt;Embarrassingly, just yesterday, I got a severe reprimand from Serena because I did not know or remember what day it was today. When I got back, I traced the &lt;a href=&#34;https://www.regione.emilia-romagna.it/notizie/approfondimenti/2025/nonsonotua/la-campagna-non-sono-tua&#34;&gt;source&lt;/a&gt; and found that the sign is actually available in several languages.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was walking early this morning, <a href="/early-morning-walks">as usual</a>, when I came
across an unusual advertising sign. It was in Spanish, text only, red background and black
typography. I don&rsquo;t comprehend Spanish well enough to read it, so I photographed it
and sent it to Serena, who promptly replied with the translation.</p>
<p>Embarrassingly, just yesterday, I got a severe reprimand from Serena because I did not know or remember what day it was today. When I got back, I traced the <a href="https://www.regione.emilia-romagna.it/notizie/approfondimenti/2025/nonsonotua/la-campagna-non-sono-tua">source</a> and found that the sign is actually available in several languages.</p>
<figure>
    <img loading="lazy" src="/images/i-am-not-yours.png"
         alt="The RER campagin for the International day for the elimination of violence against women."/> <figcaption>
            <p>The RER campagin for the International day for the elimination of violence against women.</p>
        </figcaption>
</figure>

]]></content:encoded>
    </item>
    <item>
      <title>Flask started as an April Fool&#39;s joke</title>
      <link>https://nicolaiarocci.com/flask-started-as-an-april-fools-joke/</link>
      <pubDate>Mon, 24 Nov 2025 15:29:19 +0100</pubDate>
      <guid>https://nicolaiarocci.com/flask-started-as-an-april-fools-joke/</guid>
      <description>&lt;p&gt;The story that the Python micro web framework Flask started as an April Fool&amp;rsquo;s
joke is well known in Python circles, but it was nice to &lt;a href=&#34;https://www.youtube.com/watch?v=GXJwX3tpMe0&#34;&gt;see it told by Armin
Ronacher&lt;/a&gt; himself&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m fond of Flask. It was a breath of fresh air when it came out, and most of my
Python &lt;a href=&#34;https://nicolaiarocci.com/opensource/#python&#34;&gt;open-source&lt;/a&gt; work is based on it.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;The video is produced by the people who also authored the remarkable &lt;a href=&#34;https://nicolaiarocci.com/python-the-documentary/&#34;&gt;Python: The Documentary&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;</description>
      <content:encoded><![CDATA[<p>The story that the Python micro web framework Flask started as an April Fool&rsquo;s
joke is well known in Python circles, but it was nice to <a href="https://www.youtube.com/watch?v=GXJwX3tpMe0">see it told by Armin
Ronacher</a> himself<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>I&rsquo;m fond of Flask. It was a breath of fresh air when it came out, and most of my
Python <a href="/opensource/#python">open-source</a> work is based on it.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The video is produced by the people who also authored the remarkable <a href="/python-the-documentary/">Python: The Documentary</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>People who no longer read as much as they used to</title>
      <link>https://nicolaiarocci.com/people-who-no-longer-read-as-much-as-they-used-to/</link>
      <pubDate>Sat, 22 Nov 2025 09:42:44 +0100</pubDate>
      <guid>https://nicolaiarocci.com/people-who-no-longer-read-as-much-as-they-used-to/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The theory that people no longer read as much as they used to is put forward by people who no longer read as much as they used to.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://open.substack.com/pub/bastonate/p/sei-consigli-per-non-fare-un-soldo&#34;&gt;Francesco Farabegoli&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The theory that people no longer read as much as they used to is put forward by people who no longer read as much as they used to.</p></blockquote>
<p>&ndash; <a href="https://open.substack.com/pub/bastonate/p/sei-consigli-per-non-fare-un-soldo">Francesco Farabegoli</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Curl and jq go to a conference</title>
      <link>https://nicolaiarocci.com/curl-and-jq-go-to-a-conference/</link>
      <pubDate>Fri, 21 Nov 2025 16:57:44 +0100</pubDate>
      <guid>https://nicolaiarocci.com/curl-and-jq-go-to-a-conference/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m presenting at the &lt;a href=&#34;https://www.wpc.education&#34;&gt;WPC 2025 Conference&lt;/a&gt; on December 3rd in Milan. My session topic is Feature Flag Management and Dynamic Configurations in C#.&lt;/p&gt;
&lt;p&gt;I will use a Web API as an example project, and since I&amp;rsquo;ll be using curl live to query it, I&amp;rsquo;ll need to pipe responses through &lt;a href=&#34;https://jqlang.org&#34;&gt;jq&lt;/a&gt; to obtain nicely formatted JSON for the audience.&lt;/p&gt;
&lt;p&gt;The problem with jq is that it crashes on 400s or 500s because the response body is empty in those cases. Error responses are inherent to the demo, and crashes are not the most desirable thing during a presentation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m presenting at the <a href="https://www.wpc.education">WPC 2025 Conference</a> on December 3rd in Milan. My session topic is Feature Flag Management and Dynamic Configurations in C#.</p>
<p>I will use a Web API as an example project, and since I&rsquo;ll be using curl live to query it, I&rsquo;ll need to pipe responses through <a href="https://jqlang.org">jq</a> to obtain nicely formatted JSON for the audience.</p>
<p>The problem with jq is that it crashes on 400s or 500s because the response body is empty in those cases. Error responses are inherent to the demo, and crashes are not the most desirable thing during a presentation.</p>
<p>I cooked up a quick bash function that enhances curl and jq. It is called cj (curl + jq) and prevents crashes on errors, displays HTTP status codes with color-coded output (green for success, red for errors), and prettifies JSON responses.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>As I fully expect someone in the audience to raise their hand and ask what the hell &ldquo;cj&rdquo; is, I&rsquo;m posting it for reference so I can point them here if needed (Hi there!).</p>
<p>The function looks like this:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cj() {
</span></span><span style="display:flex;"><span>    local response http_code body
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    response=<span style="font-weight:bold">$(</span>curl -s -w <span style="font-style:italic">&#34;\n%{http_code}&#34;</span> <span style="font-style:italic">&#34;</span>$@<span style="font-style:italic">&#34;</span><span style="font-weight:bold">)</span>
</span></span><span style="display:flex;"><span>    http_code=<span style="font-weight:bold;font-style:italic">${</span>response##*<span style="font-style:italic">$&#39;\n&#39;</span><span style="font-weight:bold;font-style:italic">}</span>
</span></span><span style="display:flex;"><span>    body=<span style="font-weight:bold;font-style:italic">${</span>response%<span style="font-style:italic">$&#39;\n&#39;</span>*<span style="font-weight:bold;font-style:italic">}</span>
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">if</span> [[ $http_code =~ ^2[0-9][0-9]$ ]]; <span style="font-weight:bold">then</span>
</span></span><span style="display:flex;"><span>        echo -e <span style="font-style:italic">&#34;\033[0;32mHTTP Code: </span>$http_code<span style="font-style:italic">\033[0m&#34;</span>
</span></span><span style="display:flex;"><span>        echo <span style="font-style:italic">&#34;</span>$body<span style="font-style:italic">&#34;</span> | jq 2&gt;/dev/null || echo <span style="font-style:italic">&#34;</span>$body<span style="font-style:italic">&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">else</span>
</span></span><span style="display:flex;"><span>        echo -e <span style="font-style:italic">&#34;\033[0;31mHTTP Code: </span>$http_code<span style="font-style:italic">\033[0m&#34;</span>
</span></span><span style="display:flex;"><span>        echo -e <span style="font-style:italic">&#34;\033[0;31m</span>$body<span style="font-style:italic">\033[0m&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>It currently sits at the bottom of my .zshrc file. I might turn it into a script in the future, but it&rsquo;s probably going to be short-lived, so I&rsquo;m happy with its current residence.</p>
<p>It&rsquo;s pretty straightforward, but let&rsquo;s break it down line by line.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cj() {
</span></span></code></pre></div><p>Defines a function named cj (short for &ldquo;curl with jq&rdquo;), which will wrap the standard curl command with automatic JSON formatting and colored output.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>local response http_code body
</span></span></code></pre></div><p>Declares three local variables scoped to this function: <code>response</code> will store the full curl output, <code>http_code</code> will contain the HTTP status code, and <code>body</code> will hold the response body.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>response=<span style="font-weight:bold">$(</span>curl -s -w <span style="font-style:italic">&#34;\n%{http_code}&#34;</span> <span style="font-style:italic">&#34;</span>$@<span style="font-style:italic">&#34;</span><span style="font-weight:bold">)</span>
</span></span></code></pre></div><p>Executes curl with the <code>-s</code> flag for silent mode (no progress bar), <code>-w &quot;\n%{http_code}&quot;</code> to append a newline and the HTTP status code at the end of the output, and <code>&quot;$@&quot;</code> to forward all arguments passed to the function. The entire output is captured in the response variable.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>http_code=<span style="font-weight:bold;font-style:italic">${</span>response##*<span style="font-style:italic">$&#39;\n&#39;</span><span style="font-weight:bold;font-style:italic">}</span>
</span></span></code></pre></div><p>Extracts the HTTP status code using Bash parameter expansion. The <code>##*$'\n'</code> pattern removes everything up to and including the last newline, leaving only the status code. This is faster than using external commands like tail.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>body=<span style="font-weight:bold;font-style:italic">${</span>response%<span style="font-style:italic">$&#39;\n&#39;</span>*<span style="font-weight:bold;font-style:italic">}</span>
</span></span></code></pre></div><p>Extracts the response body using parameter expansion. The <code>%$'\n'*</code> pattern removes the last newline and everything after it (the status code), leaving only the body content. This is more efficient than using, say, sed.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="font-weight:bold">if</span> [[ $http_code =~ ^2[0-9][0-9]$ ]]; <span style="font-weight:bold">then</span>
</span></span></code></pre></div><p>Checks if the HTTP status code matches the pattern for success responses (2xx). The regex <code>^2[0-9][0-9]$</code> matches any three-digit number starting with 2.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo -e <span style="font-style:italic">&#34;\033[0;32mHTTP Code: </span>$http_code<span style="font-style:italic">\033[0m&#34;</span>
</span></span></code></pre></div><p>Prints the HTTP status code in green color. The <code>-e</code> flag enables interpretation of backslash escapes, <code>\033[0;32m</code> is the ANSI code for green text, and <code>\033[0m</code> resets the color back to default.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo <span style="font-style:italic">&#34;</span>$body<span style="font-style:italic">&#34;</span> | jq 2&gt;/dev/null || echo <span style="font-style:italic">&#34;</span>$body<span style="font-style:italic">&#34;</span>
</span></span></code></pre></div><p>This one was fun. Attempts to format the response body as JSON using jq. If jq is not installed or the body isn&rsquo;t valid JSON, stderr is redirected to <code>/dev/null</code> and the <code>||</code> operator triggers the fallback, which simply prints the raw body.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="font-weight:bold">else</span>
</span></span><span style="display:flex;"><span>        echo -e <span style="font-style:italic">&#34;\033[0;31mHTTP Code: </span>$http_code<span style="font-style:italic">\033[0m&#34;</span>
</span></span></code></pre></div><p>For non-2xx responses (errors), prints the HTTP status code in red color using the ANSI code <code>\033[0;31m</code>.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo -e <span style="font-style:italic">&#34;\033[0;31m</span>$body<span style="font-style:italic">\033[0m&#34;</span>
</span></span></code></pre></div><p>Prints the error response body also in red color, making errors immediately visible during the demo.</p>
<p>And that is all.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I could of course update the API to return valid JSON even on errors, but that&rsquo;s boring.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>La Niña</title>
      <link>https://nicolaiarocci.com/la-ni%C3%B1a/</link>
      <pubDate>Fri, 21 Nov 2025 10:02:29 +0100</pubDate>
      <guid>https://nicolaiarocci.com/la-ni%C3%B1a/</guid>
      <description>&lt;p&gt;Last night we went to Bologna&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; to see &lt;a href=&#34;https://it.wikipedia.org/wiki/La_Ni%C3%B1a_(cantante)&#34;&gt;La Niña&lt;/a&gt; in concert, a birthday present from the kids to Serena. She loves this artist, whom I didn&amp;rsquo;t really know before last night. The concert was very nice, even though, not knowing her, I was initially confused, I think by the local folk festival atmosphere, if such a thing exists. It took me a few minutes to understand what I was looking at and what I was listening to.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last night we went to Bologna<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> to see <a href="https://it.wikipedia.org/wiki/La_Ni%C3%B1a_(cantante)">La Niña</a> in concert, a birthday present from the kids to Serena. She loves this artist, whom I didn&rsquo;t really know before last night. The concert was very nice, even though, not knowing her, I was initially confused, I think by the local folk festival atmosphere, if such a thing exists. It took me a few minutes to understand what I was looking at and what I was listening to.</p>
<p>Musically, there&rsquo;s no doubt that she and all her artists, four women, one man, all on vocals and playing multiple instruments, are talented. They rock a very sensual performance on stage<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>As I was listening I thought: she reminds me of Rosalia and today, I immediately found a review that makes the comparison<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>, pointing out, however, that while Rosalia started with flamenco and moved towards quality pop, La Niña is doing the opposite, at least for now: her first album was more into high quality pop music, sang in Neapolitan but also with Italian lyrics while her second album dives into folklore and urban themes, packed with potential hits. The same review mentions the second artist who came to mind last night: Daniela Pes from Sardinia, who is certainly less accessible (and, in fact, has a smaller audience).</p>
<p>I&rsquo;m listening to VANITAS, her first album, as I write. In some respects, it may be even more interesting than FURÈSTA, her second. Listen to them in order, and one can clearly see the path La Niña is on. I find it remarkable that she went all-in on folk music with her second work; an obvious choice intellectually, not so much from a marketing perspective. It paid off, though, as it is her second work that is growing her fanbase. The musical research on FURÈSTA is interesting as it doesn&rsquo;t stop at the Neapolitan tradition but aims to embrace the whole southern Italy and Mediterranean scene. She is not afraid to dare.</p>
<p>I&rsquo;m looking at her official <a href="https://www.youtube.com/channel/UCHzf4k-zsvFi18RJO0ic-TA">videos</a> too, and they are all visually stunning. I think La Niña has every chance of achieving international success. Not impossible, look at Rosalia&rsquo;s trajectory.</p>
<p>Serena was ecstatic—a lovely evening overall.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://dumbospace.it/?lang=en">DumBO</a>, the event location, was a pleasant discovery. What a remarkable regeneration effort!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>I was impressed by Alfredo Maddaluno&rsquo;s skill at doubling with a large number of instruments, both traditional and electronic. La Niña referred to him as &ldquo;Master&rdquo; on stage. I understand he&rsquo;s also her producer and I presume partner.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>I now read on Wikipedia that at some point Rolling Stone described La Niña as a hybrid of Teresa De Sio and Rosalia.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Early morning walks</title>
      <link>https://nicolaiarocci.com/early-morning-walks/</link>
      <pubDate>Tue, 18 Nov 2025 07:50:49 +0100</pubDate>
      <guid>https://nicolaiarocci.com/early-morning-walks/</guid>
      <description>&lt;p&gt;An essential part of my fitness routine is my early morning &lt;a href=&#34;https://nicolaiarocci.com/tags/walks&#34;&gt;walks&lt;/a&gt;. On weekdays, I leave my home on the outskirts of my small provincial town, walk to downtown, and then return. It&amp;rsquo;s a brisk, almost hour-long loop before I sit down at my desk. On weekends, I take walks in the woods or to the beach, or if I have the time, head out for a mountain &lt;a href=&#34;https://nicolaiarocci.com/tags/hiking&#34;&gt;hike&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These walks make my daily zen moment. Sometimes I come back and, if I try, I can&amp;rsquo;t remember what I was thinking about the whole time. Other times, however, and often, I mentally organize my day, or solve coding problems (or, more likely, study solutions to try later, once I&amp;rsquo;m at the keyboard). Sometimes I plan or dream about my future mountain trips, or remember past adventures, or plan motorcycle trips. Sometimes I listen to podcasts or music: there are mornings when I want to be on my own; others when listening to a well-told story is just what I need. In any case, once I get back, I feel refreshed, oxygenated, relaxed, and ready for the day&amp;rsquo;s work.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>An essential part of my fitness routine is my early morning <a href="/tags/walks">walks</a>. On weekdays, I leave my home on the outskirts of my small provincial town, walk to downtown, and then return. It&rsquo;s a brisk, almost hour-long loop before I sit down at my desk. On weekends, I take walks in the woods or to the beach, or if I have the time, head out for a mountain <a href="/tags/hiking">hike</a>.</p>
<p>These walks make my daily zen moment. Sometimes I come back and, if I try, I can&rsquo;t remember what I was thinking about the whole time. Other times, however, and often, I mentally organize my day, or solve coding problems (or, more likely, study solutions to try later, once I&rsquo;m at the keyboard). Sometimes I plan or dream about my future mountain trips, or remember past adventures, or plan motorcycle trips. Sometimes I listen to podcasts or music: there are mornings when I want to be on my own; others when listening to a well-told story is just what I need. In any case, once I get back, I feel refreshed, oxygenated, relaxed, and ready for the day&rsquo;s work.</p>
<p>I rarely, if ever, skip my morning walk. I usually go out whatever the weather, but today, for the first time in a long, long time, I didn&rsquo;t feel like braving the rain and the <a href="https://en.wikipedia.org/wiki/Bora_(wind)">Bora</a> wind (a condition that I usually enjoy), so I&rsquo;m here writing about it instead.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Solarpunk is already happening in Africa</title>
      <link>https://nicolaiarocci.com/solarpunk-is-already-happening-in-africa/</link>
      <pubDate>Thu, 06 Nov 2025 17:43:31 +0100</pubDate>
      <guid>https://nicolaiarocci.com/solarpunk-is-already-happening-in-africa/</guid>
      <description>&lt;p&gt;Super interesting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What’s happening across Sub-Saharan Africa right now is the most ambitious infrastructure project in human history, except it’s not being built by governments or utilities or World Bank consortiums. It’s being built by startups selling solar panels to farmers on payment plans. And it’s working.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://climatedrift.substack.com/p/why-solarpunk-is-already-happening&#34;&gt;Why Solarpunk is already happening in Africa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The ongoing discussion on &lt;a href=&#34;https://news.ycombinator.com/item?id=45827190&#34;&gt;HN&lt;/a&gt; is also worth reading (minus the AI slop complaints).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Super interesting.</p>
<blockquote>
<p>What’s happening across Sub-Saharan Africa right now is the most ambitious infrastructure project in human history, except it’s not being built by governments or utilities or World Bank consortiums. It’s being built by startups selling solar panels to farmers on payment plans. And it’s working.</p></blockquote>
<p><a href="https://climatedrift.substack.com/p/why-solarpunk-is-already-happening">Why Solarpunk is already happening in Africa</a></p>
<p>The ongoing discussion on <a href="https://news.ycombinator.com/item?id=45827190">HN</a> is also worth reading (minus the AI slop complaints).</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Florian Schneider Collection</title>
      <link>https://nicolaiarocci.com/the-florian-schneider-collection/</link>
      <pubDate>Fri, 31 Oct 2025 09:07:52 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-florian-schneider-collection/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;It is impossible to tell the story of electronic music without examining the pioneering beats, grooves, and performance aesthetics of Dusseldorf’s Kraftwerk and its founding member, Florian Schneider. Formed in 1970, the band brought an experimental approach to pop music, resulting in some of the most innovative and commercially successful electronic albums of the mid-1970s into the 1980s: &lt;em&gt;Autobahn&lt;/em&gt;, &lt;em&gt;Trans-Europe Express&lt;/em&gt;, &lt;em&gt;The Man-Machine&lt;/em&gt;, and &lt;em&gt;Computer World&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The Florian Schneider Collection is the first auction to feature a comprehensive collection of items from Florian’s personal life and career, providing a tantalizing glimpse at his and Kraftwerk’s often-enigmatic musical processes. The sale features over 450 lots of stage- and studio-played instruments and gear, clothing, artwork and furniture from Florian’s home and studios (as well as from Kraftwerk’s Kling Klang Studio), bicycles, Kraftwerk memorabilia, and Florian’s extensive collection of historic woodwind and brass instruments (flutes, clarinets, oboes, saxophones, horns, tubas, and one-of-a-kind oddities).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>It is impossible to tell the story of electronic music without examining the pioneering beats, grooves, and performance aesthetics of Dusseldorf’s Kraftwerk and its founding member, Florian Schneider. Formed in 1970, the band brought an experimental approach to pop music, resulting in some of the most innovative and commercially successful electronic albums of the mid-1970s into the 1980s: <em>Autobahn</em>, <em>Trans-Europe Express</em>, <em>The Man-Machine</em>, and <em>Computer World</em>.</p></blockquote>
<blockquote>
<p>The Florian Schneider Collection is the first auction to feature a comprehensive collection of items from Florian’s personal life and career, providing a tantalizing glimpse at his and Kraftwerk’s often-enigmatic musical processes. The sale features over 450 lots of stage- and studio-played instruments and gear, clothing, artwork and furniture from Florian’s home and studios (as well as from Kraftwerk’s Kling Klang Studio), bicycles, Kraftwerk memorabilia, and Florian’s extensive collection of historic woodwind and brass instruments (flutes, clarinets, oboes, saxophones, horns, tubas, and one-of-a-kind oddities).</p></blockquote>
<p>My goodness, <a href="https://www.juliensauctions.com/en/auctions/the-florian-schneider-collection">the items up for auction</a> are all adorable. The idea of them being dispersed fills me with unspeakable sadness, although that doesn&rsquo;t stop me from coveting any one of these pieces. I hope someone will acquire the entire lot and build a museum around it. In Düsseldorf, of course.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Beyond the machine</title>
      <link>https://nicolaiarocci.com/beyond-the-machine/</link>
      <pubDate>Tue, 21 Oct 2025 17:42:17 +0200</pubDate>
      <guid>https://nicolaiarocci.com/beyond-the-machine/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m just back from reading the transcript of &lt;a href=&#34;https://frankchimero.com/blog/2025/beyond-the-machine/&#34;&gt;Beyond the Machine&lt;/a&gt;, a thoughtful and insightful talk by Frank Chimero.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m trying to figure out how to use generative AI as a designer without feeling like shit. I am fascinated with what it can do, impressed and repulsed by what it makes, and distrustful of its owners. I am deeply ambivalent about it all. The believers demand devotion, the critics demand abstinence, and to see AI as just another technology is to be a heretic twice over.
Today, I’d like to try to open things up a bit.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m just back from reading the transcript of <a href="https://frankchimero.com/blog/2025/beyond-the-machine/">Beyond the Machine</a>, a thoughtful and insightful talk by Frank Chimero.</p>
<blockquote>
<p>I’m trying to figure out how to use generative AI as a designer without feeling like shit. I am fascinated with what it can do, impressed and repulsed by what it makes, and distrustful of its owners. I am deeply ambivalent about it all. The believers demand devotion, the critics demand abstinence, and to see AI as just another technology is to be a heretic twice over.
Today, I’d like to try to open things up a bit.</p></blockquote>
<p>I&rsquo;m surprised by how brilliantly Rick Rubin, Brian Eno, Hayao Miyazaki, and Miyazaki&rsquo;s <em>Spirited Away</em> are packed into this talk.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Are we Trek yet?</title>
      <link>https://nicolaiarocci.com/are-we-trek-yet/</link>
      <pubDate>Thu, 16 Oct 2025 15:41:28 +0200</pubDate>
      <guid>https://nicolaiarocci.com/are-we-trek-yet/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This guide is intended to be a comprehensive look at the tech that Star Trek suggested to drive humanity forward &lt;em&gt;ad astra per aspera&lt;/em&gt;. The emphasis is on innovations that don&amp;rsquo;t violate physics according to present consensus understanding. Go ahead and explore boldly.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://arewetrekyet.com&#34;&gt;Are We Trek Yet? &amp;ndash; A guide for how close we are to Star Trek technology&lt;/a&gt;  is a funny, revealing, and well-executed idea. It is somewhat comforting that at the time of this writing, eight of all the Star Trek technologies are readily available, and thirty-one are in progress. It only tracks Star Trek technology, though.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>This guide is intended to be a comprehensive look at the tech that Star Trek suggested to drive humanity forward <em>ad astra per aspera</em>. The emphasis is on innovations that don&rsquo;t violate physics according to present consensus understanding. Go ahead and explore boldly.</p></blockquote>
<p><a href="https://arewetrekyet.com">Are We Trek Yet? &ndash; A guide for how close we are to Star Trek technology</a>  is a funny, revealing, and well-executed idea. It is somewhat comforting that at the time of this writing, eight of all the Star Trek technologies are readily available, and thirty-one are in progress. It only tracks Star Trek technology, though.</p>
<p>The most innovative and intriguing aspect of Star Trek is its society, depicted as a post-scarcity utopia where material needs are met without the use of money, allowing individuals to work for personal fulfillment and the betterment of humanity. The United Federation of Planets exemplifies this ideal, promoting equality, cooperation, and exploration among diverse species.</p>
<p>Many years ago, I read a writing on a wall that struck my young, fervent imagination so profoundly that I still remember it vividly: <em>&ldquo;To live in utopia, we must first dream it.&rdquo;</em><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> We&rsquo;re not a Star Trek society today, and we certainly aren&rsquo;t heading in that direction, but I&rsquo;ll keep dreaming.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>On that wall, the sentence was attributed to the anarchist Émile Henry, but a quick research with today&rsquo;s modern means reveals that it was probably apocryphal. It could be a free paraphrase or a collective creation born out of the movements of the 1970s and 1980s, when political graffiti was widespread.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>What .NET 10 garbage collection changes really mean for developers</title>
      <link>https://nicolaiarocci.com/what-.net-10-garbage-collection-changes-really-mean-for-developers/</link>
      <pubDate>Tue, 07 Oct 2025 10:12:04 +0200</pubDate>
      <guid>https://nicolaiarocci.com/what-.net-10-garbage-collection-changes-really-mean-for-developers/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;For decades, garbage collection in .NET was a background concern. It was mostly invisible to the everyday developer and was regarded as &amp;lsquo;automatic&amp;rsquo; unless (or until) something slowed down the application. However, .NET 10 changes this perspective by making garbage collection (GC) a key component of application performance.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://roxeem.com/2025/09/30/what-net-10-gc-changes-mean-for-developers/&#34;&gt;What .NET 10 GC Changes Mean for Developers&lt;/a&gt; is a good in-depth article that explores the revolutionary garbage collection improvements in .NET 10, which deliver 2- 3x performance gains through seven key enhancements: escape analysis for stack allocation, DATAS enabled by default, flexible region sizing, delegate optimizations, intelligent write barrier elimination, enhanced devirtualization, and refined heap controls for containers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>&ldquo;For decades, garbage collection in .NET was a background concern. It was mostly invisible to the everyday developer and was regarded as &lsquo;automatic&rsquo; unless (or until) something slowed down the application. However, .NET 10 changes this perspective by making garbage collection (GC) a key component of application performance.&rdquo;</p></blockquote>
<p><a href="https://roxeem.com/2025/09/30/what-net-10-gc-changes-mean-for-developers/">What .NET 10 GC Changes Mean for Developers</a> is a good in-depth article that explores the revolutionary garbage collection improvements in .NET 10, which deliver 2- 3x performance gains through seven key enhancements: escape analysis for stack allocation, DATAS enabled by default, flexible region sizing, delegate optimizations, intelligent write barrier elimination, enhanced devirtualization, and refined heap controls for containers.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Marmarole Mountains: a three-day solo hike in the Dolomites</title>
      <link>https://nicolaiarocci.com/the-marmarole-mountains-a-three-day-solo-hike-in-the-dolomites/</link>
      <pubDate>Sat, 27 Sep 2025 11:05:22 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-marmarole-mountains-a-three-day-solo-hike-in-the-dolomites/</guid>
      <description>&lt;p&gt;The Marmarole mountain group is an island of quiet, where, especially at the end of the season, it&amp;rsquo;s easy not to meet anyone for entire days. Nature is harsh and wild; steep, apparently inaccessible ridges separate the slopes and basins. It follows that the elevation gains are significant and many obligatory passages are often technical, exposed and equipped with steel cables (via ferrata). Water is scarce everywhere, especially on the north face, which also lacks refuges at altitude. Up there, the support structures are spartan bivouacs, isolated and challenging to reach. The solitude up there is almost total, but frequent encounters with high-altitude wildlife compensate for it. It&amp;rsquo;s easy to spot chamois, ibex, marmots, and eagles.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The Marmarole mountain group is an island of quiet, where, especially at the end of the season, it&rsquo;s easy not to meet anyone for entire days. Nature is harsh and wild; steep, apparently inaccessible ridges separate the slopes and basins. It follows that the elevation gains are significant and many obligatory passages are often technical, exposed and equipped with steel cables (via ferrata). Water is scarce everywhere, especially on the north face, which also lacks refuges at altitude. Up there, the support structures are spartan bivouacs, isolated and challenging to reach. The solitude up there is almost total, but frequent encounters with high-altitude wildlife compensate for it. It&rsquo;s easy to spot chamois, ibex, marmots, and eagles.</p>
<p>My journey began on Thursday afternoon (September 18) by car, with the destination being Calalzo di Cadore. Three and a half hours of heavy traffic, followed by an overnight stay in a hostel. It proved to be a good decision: the next day, at 8 in the morning, I was fresh and rested, backpack on my shoulders, ready at the trailhead (my car was parked in the locality of <a href="https://maps.app.goo.gl/s58ZsCDDyYn6Ymt88">Praciadelan</a>, ten minutes from the hostel).</p>
<h2 id="day-1">Day 1</h2>
<p><em>From Praciadelan to Bivacco Tiziano, passing through Rifugio Chiggiato and forcella Jau della Tana</em></p>
<p>The ascent to Col Negro and <a href="https://maps.app.goo.gl/Y7DU8D5eGSTK2HrU8">Rifugio Chiggiato</a> is in the woods, on a trail that&rsquo;s almost always steep but comfortable. Nine hundred meters of elevation gain covered without stops, I felt in good shape. The fifteen-minute break I had planned at the refuge, I skipped it, a grave mistake. The presence of the two keepers having breakfast on the refuge terrace put me in a difficult situation. I didn&rsquo;t want to sit there in their refuge without consuming anything, but I also didn&rsquo;t want to move to the nearby meadow to avoid looking cheap. I had started just an hour and a half earlier, and it wasn&rsquo;t the time to consume anything except maybe an energy bar, since the most challenging part awaited me.</p>
<figure>
    <img loading="lazy" src="/images/marmarole1.jpg"
         alt="Forcella Piccola as seen from the whereabouts of Rifugio Chiggiato. I will reach it on Day 3."/> <figcaption>
            <p>Forcella Piccola as seen from the whereabouts of Rifugio Chiggiato. I will reach it on Day 3.</p>
        </figcaption>
</figure>

<p>After a brief traverse westward, more or less at mid-slope toward Forcella Jau della Tana, the trail immediately becomes technical and demanding. It overcomes a series of rock &ldquo;blades&rdquo;) under Cima Salina, with deep intermediate scree gullies. It jumps on stones and scree, with continuous ups and downs. I slipped once on small rocks going downhill; fortunately, there was no damage apart from a couple of tears to my shorts. In this area, I encountered a herd of chamois moving nimbly, not too far on the opposite scree. There&rsquo;s so much silence on these mountains that it&rsquo;s easy to hear their alarm whistle or notice their trampling on gravel or rocks. Once I reached the vertical line to the pass, the final ascent began, a very long and largely steel-cabled route with exposed sections. This section, especially in the final part near the summit, really put me to the test. The two sections together (Parking-Rifugio Chiggiato, then Chiggiato-Jau della Tana) cover approximately 1,600 meters of elevation gain, which I stupidly tackled almost without rest. Toward the end, I was getting dizzy with every few steps and/or pulls on the iron cables. I was in difficulty and didn&rsquo;t expect it, so much so that, now almost at the summit, I consumed a second energy bar. From Rifugio Chiggiato to Jau della Tana, it took me no less than two hours and thirty minutes, possibly three.</p>
<p>From the pass, I could see <a href="https://maps.app.goo.gl/3P7i4XRdo9QMsxHD9">Bivacco Tiziano</a>, the day&rsquo;s destination. From up there, it appears as little more than a red dot still distant, resting on a grassy ridge a few kilometers away and about five hundred meters of elevation loss downhill. A few meters from the summit, I met the first person, a Frenchman (I think) with a tent and a huge backpack. He came from <a href="https://maps.app.goo.gl/GdmnKwUYjHCaojXQ7">Bivacco Musatti</a> or thereabouts and asked me where he could find some water. I told him it was a long way down until the Chiggiato; no water until there. While I was resting at the pass, a very young and fit boy reached me. He had stopped to chat with the Frenchman (I could hear them chatting a couple of hundred meters below me). The boy told me that the Frenchman left (if I understood correctly, I was tired) France in April and was slowly hiking across all the Alps to reach Slovenia by the end of October. Crazy. The boy was headed to Bivacco Fantoni and was the vanguard of a group of four. He was &ldquo;running&rdquo; ahead to arrive early at Fantoni, which nowadays is &ldquo;YouTube famous&rdquo; since it has been recently rebuilt and is now an ultra-modern and very comfortable structure. We parted ways as I undertook my descent toward Tiziano. Slowly, I descended first on steep scree and then on mixed terrain of stone and meadow, navigating the ups and downs of the Lastoni delle Marmarole, and finally arrived at Bivacco Tiziano at about 4:30 PM. Bivacco Tiziano is situated in a stunning location, at the western edge of the Lastoni, with the Marmarole ridges behind and the door opening onto the Ansiei Valley, a thousand meters below, and the Dolomites to the north. You can admire the Tre Cime di Lavaredo, Cristallo, the Tofane, the Cadini di Misurina, and many other well-known groups and peaks.</p>
<p>As widely expected, there&rsquo;s no water at Tiziano, and none is found along the entire route once you leave Chiggiato. I had brought an extra supply that was sufficient to prepare dinner and breakfast for the next day, certainly not to continue for another two days. At this point, I was worried. In the bivouac log, a good soul had described where to find it. Still, it wasn&rsquo;t close, and to be honest, for a moment I considered the idea of giving up and heading down to the valley the next day, so exhausted I was, and especially worried about the lack of water on the rest of the route. I had dinner, recovered some strength, and then, with my headlamp on, sat-nav in my pocket, and two water bottles in hand, I headed toward a wall of slabs &ldquo;striped&rdquo; by what looked like water rivulets. These slabs were approximately 500 meters from the bivouac as the crow flies, but to reach them, you had to cover a certain elevation difference, first uphill and then downhill. Without a backpack, however, it seemed like flying. Dinner had reinvigorated me, and I got there without too much suffering except for a frontal fall tripping on a stone that cost me a bruise on my hand that still hurts today. Reaching the wall, I realized that to collect water, it was necessary to climb about ten meters up the slabs, near a small roof from which water dripped onto the slabs below, forming the striped lines visible from the bivouac. Fortunately, the slabs are easily climbable due to their adhesion, so I went up and slowly filled one container at a time. It took a long time to fill the three containers from that tiny trickle of water; moreover, each time I had to climb down to return to the ground, deposit the whole container, and climb back up to fill the next one (I feared that a full water bottle could slip down and break). The position was uncomfortable: my feet were resting in adhesion, one hand to hold myself in place, the other with my arm extended to fill the bottle slowly. The entire procedure took me an hour, so I returned to the bivouac when it was almost dark. At 8 PM, exhausted but happy, I got into my sleeping bag and fell asleep almost immediately. For some strange reason, falling asleep alone, in a tent or bivouac, in such remote and wild places, far from everyone, with only nature around, puts me at ease. It&rsquo;s almost as if I were cradled by nature itself.</p>
<h2 id="day-2">Day 2</h2>
<p><em>From Bivacco Tiziano to Bivacco Voltolina</em></p>
<p>The most spectacular day. I exit the bivouac and brush my teeth while a young ibex watches me, perplexed, no more than twenty meters away. Having left Bivacco Tiziano, I enter Val Longa, where three more ibexes, one adult and two youngsters, graze peacefully and are not at all intimidated by my passing by. The ascent begins early, though, on the hydrographic left of Val Longa, and it&rsquo;s as I expected: steep and, soon, technical. Steel cable sections (not marked on the map) help in the most exposed sections until you reach the ridge line, in an airy and spectacular position, with breathtaking panoramas all around. Looking down in the direction I climbed from, I see the bivouac I left about an hour ago, a tiny red tin can. The path follows the ridge line until it reaches a pass that gives high entrance to a new glacial basin, the Meduce de Fora. We&rsquo;re very high, literally a step from the sky. Far below, at the entrance to the upper part of the basin, I can see the red of Bivacco Musatti, the intermediate destination of the day. The descent is initially easy on the high meadows until I reach the terminal scree, which is initially steep and treacherous. Here, toward the bottom of the basin, I spot other ibexes a few meters from me. Unlike the cautious chamois, ibexes have a haughty attitude: they observe you calmly, unimpressed, with those majestic horns and regal pose. They certainly are the kings of the great heights. I find Bivacco Musatti occupied by a gentleman and his son. They are from the local CAI branch and are conducting maintenance work on the bivouac. I rest nearby for about ten minutes and leave again, aware that the longest and most demanding section still awaits me.</p>
<figure>
    <img loading="lazy" src="/images/marmarole2.jpg"
         alt="Bivacco Tiziano seen from the ridge line between Val Longa and Meduce de Fora. The brick building is the original bivouac, now abandoned."/> <figcaption>
            <p>Bivacco Tiziano seen from the ridge line between Val Longa and Meduce de Fora. The brick building is the original bivouac, now abandoned.</p>
        </figcaption>
</figure>

<p>The ascent along the slopes of Monte Mecol is immediately hard and equipped with steel cables in the most exposed sections. Again, you climb up to the summit ridge and the highest passes; otherwise, you can&rsquo;t get through. This is, it seems to me, the salient characteristic of these Marmarole Mountains: every valley change, on the north face, involves steep climbs, up to the summit ridges, then crossings of airy passes, and finally rough descents. There&rsquo;s no easy passage from one basin to the other. The path descends and then crosses the Meduce De Inze among large erratic boulders. One must follow the many but constantly attention-requiring signs (red-painted dots and &ldquo;ometti&rdquo;); on this terrain, it&rsquo;s easy to get lost. You then climb again, steeply and at length, again with equipped sections, on the slopes of Croda Rotta until arriving, you guessed it, at an airy pass. Staying high at the foot of the summit walls, you go around two or three gorges and cross again at length to finally drop, always on difficult terrain and often with the help of steel cables, to Forcella Vanedel, the narrowest, steepest, and also most dangerous of all. Pay attention here not to unhook too early from the cable: if toward the north the usual steep scree descends, toward the south, right where feet rest upon arrival, there&rsquo;s a precipice of several tens of meters. Also be careful not to follow the scree downhill: a new steel cable is ready to your left and continues the course on the left slabs, still for a long time but gradually descending, parallel to the scree of Forcella Vanedel (still equipped sections here) until reaching a greener area and finally a trail that leads to the head of Val Granda, which is visible much lower, and to the access to Val De Medo, suspended almost in the void, where the day&rsquo;s destination, <a href="https://maps.app.goo.gl/ugMkkWUsb39MHFwTA">Bivacco Voltolina</a>, is hidden. A very exposed passage on rock protects access to Val De Medo. This passage is perfectly equipped with cables and is perhaps the most beautiful along the entire tour.</p>
<figure>
    <img loading="lazy" src="/images/marmarole3.jpg"
         alt="One of the many aerial views you are granted to enjoy on this high route."/> <figcaption>
            <p>One of the many aerial views you are granted to enjoy on this high route.</p>
        </figcaption>
</figure>

<p>Arriving in this valley hidden in the recesses of the Marmarole, no matter how tired, offers a magnificent sensation, also for the wonder of what opens before us. The bivouac can be seen in the distance, up high: one last effort to cover the last two to three hundred meters of elevation gain, and I can finally rest. I can already see that nobody is there: I will be alone for the night, once again. As the day before, I&rsquo;m anxious about the water. I already imagine I&rsquo;ll have to look for it among the walls surrounding the bivouac. The trail climbs through a low grove of larches (we&rsquo;re at the extreme limit of the vegetation&rsquo;s range), sometimes intersecting the dry bed of a stream, and sometimes running alongside it a hundred meters away. After a few hundred meters, I seem to hear the sound of flowing water. Where I am, you can no longer see the stream bed that was completely dry a few moments ago when I crossed it. I stand still for a moment listening: there&rsquo;s no doubt, what I hear is water, and not little, flowing among the rocks. I leave the trail and head toward the sound. As I imagined, there&rsquo;s an abundant water outcrop right in the stream bed, which, in this season, evidently, flows underground for most of the route. Enormous joy takes me. There&rsquo;s a small waterfall, and there&rsquo;s even a pool so big I could bathe in it. I drink all the water I have left, then fill the bottles, and all happy and watered, I cover the last kilometer that takes me to Voltolina. The conditions of this bivouac are worse than the previous one. There&rsquo;s no broom, to begin with, which certainly doesn&rsquo;t help keep it clean. There are no pillows, but there are mattresses and blankets, although partially eaten by critters. There&rsquo;s the bivouac log, but a pen is missing to update it. I don&rsquo;t have one with me, so I won&rsquo;t be able to register my passage, which is a pity, also because I&rsquo;ll probably be one of the last to pass here before winter. I don&rsquo;t have to worry about water, so I can spend a couple of hours contemplating nature, taking in the majestic view that opens before me, and the silence at high altitude.</p>
<figure>
    <img loading="lazy" src="/images/marmarole5.jpg"
         alt="Bivacco Voltolina."/> <figcaption>
            <p>Bivacco Voltolina.</p>
        </figcaption>
</figure>

<h2 id="day-3">Day 3</h2>
<p><em>From Bivacco Voltolina to Forcella Grande via Cengia del Doge, then to Forcella Piccola and return to Praciadelan, passing through Rifugi San Marco and Galassi</em></p>
<p>During the night, I was awakened by a loud crash, likely a landslide on the ridges behind or around the bivouac, possibly on the Piana del Scoter, which is located directly behind here. The descent from Voltolina is pleasant and enchanting, continuing until you arrive at the entrance to the famous Cengia del Doge. I hear the typical alarm whistle, I raise my head and see a group of chamois that, it seems to me, have just tackled the Cengia. The Cengia is about a kilometer of trail that exploits a very exposed ledge that cuts in half a very high vertical wall. Absence of vertigo and sure footing are required. It&rsquo;s well secured with cables, except for a brief passage of about three meters, which, frankly, leaves me perplexed: it&rsquo;s dangerous; a slip there would be fatal. From the Cengia, the gaze spans over the imposing slopes of Sorapiss opposite, beyond the deep and spectacular Val de San Vido. The Minazio Trail, which cuts horizontally across the southeastern spurs of Sorapiss, is clearly visible and is almost as stunning as the Cengia del Doge. I walked that trail nearly thirty years ago with Fabio (my brother) and Gianluca. Good memories. We were young.</p>
<figure>
    <img loading="lazy" src="/images/marmarole4.jpg"
         alt="The massive vertical wall traversed by the Cengia del Doge. Look closely and you&rsquo;ll see a narrow path cutting almost horizontally through the wall."/> <figcaption>
            <p>The massive vertical wall traversed by the Cengia del Doge. Look closely and you&rsquo;ll see a narrow path cutting almost horizontally through the wall.</p>
        </figcaption>
</figure>

<p>The ledge exits into a trail that leads right to the head of Val De San Vido. Here you walk among larches and mountain pines (with some water!), passing under the famous Torre dei Sabbioni and finally reaching <a href="https://maps.app.goo.gl/TjJ5kNmSfUHYguJW9">Forcella Grande</a>. Here, the path abandons the wild north face of the Marmarole and descends toward <a href="https://maps.app.goo.gl/cPLQUi7XWAfwqmuR8">Rifugio San Marco</a>, which is managed and open in high season. When I pass, the managers are setting up for winter closure. I continue for <a href="https://maps.app.goo.gl/trFtuuvsypav4JFN6">Forcella Piccola</a>, with a panorama over the valley of San Vito di Cadore and Monte Pelmo opposite. The path eventually crosses under the enormous south walls and then climbs to Forcella Piccola, where the Normal Route, which leads to the summit of Monte Antelao, begins. Many years ago, I was here in the same place on August 4 (!) to climb the Antelao summit, but I had to withdraw due to the snow that had fallen during a night storm. The climbs are over: from now on, only a long descent, passing from <a href="https://maps.app.goo.gl/TES3oFaMWN8MiCjEA">Rifugio Galassi</a> on its last day of opening and continuing for six kilometers, first steep till <a href="https://maps.app.goo.gl/B9npQNcNHmrDSdXN9">Capanna degli Alpini</a>, then four kilometers on Pian della Gravina until reaching the car again at Praciadelan and closing the loop.</p>
<figure>
    <img loading="lazy" src="/images/marmarole6.jpg"
         alt="Stepping onto Cengia del Doge."/> <figcaption>
            <p>Stepping onto Cengia del Doge.</p>
        </figcaption>
</figure>

<p>I must admit that when I arrived at the car, I became emotional. The satisfaction of having completed this solo adventure, certainly the most demanding of all, filled me with joy. In terms of overall difficulty, the Translogorai comes close. Still, while in that case the difficulty is mainly due to its length, here on the Marmarole, it&rsquo;s the combination of rugged and technical trails, difficult orientation, demanding elevation gains, exposed and un-equipped sections, lack of water, and isolation that raises the level.</p>
<h2 id="closing-notes">Closing notes</h2>
<p>While a GPX track is now standard procedure, it&rsquo;s always a good idea to carry a good paper map, such as the Tabacco 016 for this hike. The GPX is valuable, but nothing beats the map when it comes to details, precision, and reliability. I ran out of battery on my phone on day two. It was fully charged when I left the bivouac. Still, always-on Komoot tracking can be taxing on the battery on very long days. I had a power bank with me, but the point still stands. A paper map is durable and, as such, always available.</p>
<p>An emergency satellite navigation device is mandatory for solo adventures, let alone one like this. I had no cell signal for three consecutive days. Yet every evening, when I arrived at the bivouac, I could text Serena to let her know I was doing fine. Moreover, in the unfortunate event of an emergency, help is just a press of the SOS button away.</p>
<p>Do your homework. Prepare consciously and adapt your usual routine to the expected situation. Knowing there was little water on the route, I brought an extra one-and-a-half-litre bottle with me. Best call ever.</p>
<p>Wait for the best weather. I had been waiting for the perfect long weekend for one month. I only went when the forecast was highly optimistic.  Knowing that the weather is not an issue is a significant relief and a crucial safety measure, especially on hazardous and challenging terrain.</p>
<p>I could go on a super sunny weekend because we were almost in the Fall. Going off-season is beneficial for many reasons, one of which is that it&rsquo;s not scorching hot weather. Also, you can expect very little company on the route and, more importantly, at the bivouacs. The room in those shelters is minimal. Being alone in both of them was a luxury, but a planned one.</p>
<p>The GPX is I used is available <a href="https://www.komoot.com/it-it/tour/2276200131?share_token=a5szNgQV5HmH6umSs5uo0WbtwKyJ2g8o1lA2MiDcVZxKf0osM3&amp;ref=wtd">here</a>. This is not the effective recording because well, my phone died at some point, as mentioned.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ur-Fascism</title>
      <link>https://nicolaiarocci.com/ur-fascism/</link>
      <pubDate>Tue, 23 Sep 2025 11:07:38 +0200</pubDate>
      <guid>https://nicolaiarocci.com/ur-fascism/</guid>
      <description>&lt;p&gt;Prompted by an old post by &lt;a href=&#34;https://bobmschwartz.com/2017/12/28/umberto-eco-ur-fascism/&#34;&gt;Bob Schwartz&lt;/a&gt; (2017), I revisited and reread &lt;a href=&#34;https://theanarchistlibrary.org/library/umberto-eco-ur-fascism&#34;&gt;&lt;em&gt;Ur-Fascism&lt;/em&gt;&lt;/a&gt;, the essay Umberto Eco wrote in 1995 for the &lt;em&gt;New York Review of Books&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;What are the features of Fascism? We need to know, so we can recognize them and point them out as they emerge, as they always tend to do, time and time again, as our societies struggle to evolve.&lt;/p&gt;
&lt;p&gt;Sounds like heavy reading material, but it isn&amp;rsquo;t. I mean, look at the incipit:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Prompted by an old post by <a href="https://bobmschwartz.com/2017/12/28/umberto-eco-ur-fascism/">Bob Schwartz</a> (2017), I revisited and reread <a href="https://theanarchistlibrary.org/library/umberto-eco-ur-fascism"><em>Ur-Fascism</em></a>, the essay Umberto Eco wrote in 1995 for the <em>New York Review of Books</em>.</p>
<p>What are the features of Fascism? We need to know, so we can recognize them and point them out as they emerge, as they always tend to do, time and time again, as our societies struggle to evolve.</p>
<p>Sounds like heavy reading material, but it isn&rsquo;t. I mean, look at the incipit:</p>
<blockquote>
<p>In 1942, at the age of ten, I received the First Provincial Award of Ludi Juveniles (a voluntary, compulsory competition for young Italian Fascists — that is, for every young Italian). I elaborated with rhetorical skill on the subject “Should we die for the glory of Mussolini and the immortal destiny of Italy?” My answer was positive. I was a smart boy.</p></blockquote>
<p>Brilliant. I forgot what a masterpiece of synthesis, clarity, accessibility, and subtle irony this essay is. While Schwartz&rsquo;s post offers an excellent, concise synthesis, the original is worth reading in its entirety, especially in today&rsquo;s context.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Monte Mauro loop</title>
      <link>https://nicolaiarocci.com/the-monte-mauro-loop/</link>
      <pubDate>Wed, 17 Sep 2025 09:01:11 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-monte-mauro-loop/</guid>
      <description>&lt;p&gt;On Sunday afternoon, I suddenly decided to take my motorcycle, ride to the foothills, leave the bike there, and hike the Monte Mauro loop, including the climb to the summit.&lt;/p&gt;
&lt;p&gt;The Monte Mauro loop is a classic route in the Vena del Gesso area. Wooded areas alternate with exposed stretches below the summit of Monte Mauro, where you literally walk on chalk outcrops. The trail is well marked, but you have to pay attention to the path because there are often alternatives (also marked) that can confuse you. It is an enjoyable short tour.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On Sunday afternoon, I suddenly decided to take my motorcycle, ride to the foothills, leave the bike there, and hike the Monte Mauro loop, including the climb to the summit.</p>
<p>The Monte Mauro loop is a classic route in the Vena del Gesso area. Wooded areas alternate with exposed stretches below the summit of Monte Mauro, where you literally walk on chalk outcrops. The trail is well marked, but you have to pay attention to the path because there are often alternatives (also marked) that can confuse you. It is an enjoyable short tour.</p>
<p>I had no backpack or equipment, and I alternated between fast walking and running, especially in the final stretch, taking no rest. Therefore, the times reported (1h 56m) should be taken with a grain of salt.</p>
<p>I had already been to Monte Mauro about thirty years ago, and I remembered it as being much less wooded, which was probably the case. Track and details on <a href="https://www.komoot.com/it-it/tour/2576430037">Komoot</a>.</p>
<p>PS: Cover images aren&rsquo;t included in the RSS feed, so you won&rsquo;t see this post&rsquo;s picture if you are reading from the newsletter. If curious, <a href="/the-monte-mauro-loop/">click here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Age and cognitive ability</title>
      <link>https://nicolaiarocci.com/age-and-cognitive-ability/</link>
      <pubDate>Sat, 13 Sep 2025 08:34:26 +0200</pubDate>
      <guid>https://nicolaiarocci.com/age-and-cognitive-ability/</guid>
      <description>&lt;p&gt;Finally some good news for us old farts! &lt;a href=&#34;https://hereticalinsights.substack.com/p/age-and-cognitive-ability&#34;&gt;Cognitive ability (probably) peaks between 50 and 60&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Finally some good news for us old farts! <a href="https://hereticalinsights.substack.com/p/age-and-cognitive-ability">Cognitive ability (probably) peaks between 50 and 60</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why exercise is a miracle drug</title>
      <link>https://nicolaiarocci.com/why-exercise-is-a-miracle-drug/</link>
      <pubDate>Fri, 12 Sep 2025 09:06:48 +0200</pubDate>
      <guid>https://nicolaiarocci.com/why-exercise-is-a-miracle-drug/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Last year, Ashley and a large team of scientists conducted an elaborate experiment on the effects of exercise on the mammalian body. In one test, Ashley put rats on tiny treadmills, worked them out for weeks, and cut into them to investigate how their organs and vessels responded to the workout compared to a control group of more sedentary rodents.1 The results were spectacular. Exercise transformed just about every tissue and molecular system that Ashley and his co-authors studied—not just the muscles and heart, but also the liver, adrenal glands, fat, and immune system&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Last year, Ashley and a large team of scientists conducted an elaborate experiment on the effects of exercise on the mammalian body. In one test, Ashley put rats on tiny treadmills, worked them out for weeks, and cut into them to investigate how their organs and vessels responded to the workout compared to a control group of more sedentary rodents.1 The results were spectacular. Exercise transformed just about every tissue and molecular system that Ashley and his co-authors studied—not just the muscles and heart, but also the liver, adrenal glands, fat, and immune system</p></blockquote>
<p><a href="https://www.derekthompson.org/p/the-sunday-morning-post-why-exercise">Why Exercise is a Miracle Drug</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Empty nest</title>
      <link>https://nicolaiarocci.com/empty-nest/</link>
      <pubDate>Wed, 10 Sep 2025 09:54:58 +0200</pubDate>
      <guid>https://nicolaiarocci.com/empty-nest/</guid>
      <description>&lt;p&gt;A few weeks ago, we accompanied Anna to Amsterdam, where she will study at the University. She is our youngest daughter. Marco left home years ago to study in France, where he graduated, and now lives in Brussels, and Giulia is in her third year of medical school, also living in another town. After twenty-plus years, the nest is empty. It&amp;rsquo;s a strange feeling wandering around the house knowing that none of the kids are around. Despite feeling nostalgic, Serena and I are doing well. We&amp;rsquo;re getting used to this new life as a seasoned couple.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few weeks ago, we accompanied Anna to Amsterdam, where she will study at the University. She is our youngest daughter. Marco left home years ago to study in France, where he graduated, and now lives in Brussels, and Giulia is in her third year of medical school, also living in another town. After twenty-plus years, the nest is empty. It&rsquo;s a strange feeling wandering around the house knowing that none of the kids are around. Despite feeling nostalgic, Serena and I are doing well. We&rsquo;re getting used to this new life as a seasoned couple.</p>
<p>It&rsquo;s also because of this recent changes in our lives that I could appreciate the <a href="https://dri.es/climbing-la-tournette-on-a-three-day-hike-near-lake-annecy">story of the three-day hiking trip</a> that Dries Buytaert took with his son Axl in the French Alps. Axl has just finished high school and will soon be at University, so this hike served as a rite of passage for both of them.
I profoundly understand Dries&rsquo;s emotional moment:</p>
<blockquote>
<p>As we sat down, we had time for deeper conversations. We talked about how life will change now that he is eighteen and about to leave for university. I told him our hike felt symbolic. The climb up was like the years behind us, when his parents, myself included, made most of the important decisions in his life. The way down would be different. From here he would choose his own path in life, and my role would be to walk beside him and support him. Saying it out loud caught me by surprise. It left me with a lump in my throat and tears in my eyes. It felt as if we would leave one version of Axl at the summit and return with another, stepping into adulthood and independence.</p></blockquote>
<p>Sustaining our children from afar is demanding and draining in many ways, but it is also rewarding. We observe their struggles and accomplishments from a distance, sometimes worried and feeling powerless and unhelpful, yet with a sense of pride and achievement that is unparalleled.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cognitive load is what matters</title>
      <link>https://nicolaiarocci.com/cognitive-load-is-what-matters/</link>
      <pubDate>Fri, 05 Sep 2025 15:52:38 +0200</pubDate>
      <guid>https://nicolaiarocci.com/cognitive-load-is-what-matters/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Sometimes we feel confusion going through the code. Confusion costs time and money. Confusion is caused by high cognitive load. It&amp;rsquo;s not some fancy abstract concept, but rather a fundamental human constraint. It&amp;rsquo;s not imagined, it&amp;rsquo;s there and we can feel it. Since we spend far more time reading and understanding code than writing it, we should constantly ask ourselves whether we are embedding excessive cognitive load into our code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Sometimes we feel confusion going through the code. Confusion costs time and money. Confusion is caused by high cognitive load. It&rsquo;s not some fancy abstract concept, but rather a fundamental human constraint. It&rsquo;s not imagined, it&rsquo;s there and we can feel it. Since we spend far more time reading and understanding code than writing it, we should constantly ask ourselves whether we are embedding excessive cognitive load into our code.</p></blockquote>
<p><a href="https://github.com/zakirullin/cognitive-load">Cognitive Load is what matters</a></p>
<p>I appreciate that the final output is the result of an open collaborative effort.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why arent people going to conferences anymore?</title>
      <link>https://nicolaiarocci.com/why-arent-people-going-to-conferences-anymore/</link>
      <pubDate>Tue, 02 Sep 2025 17:18:49 +0200</pubDate>
      <guid>https://nicolaiarocci.com/why-arent-people-going-to-conferences-anymore/</guid>
      <description>&lt;p&gt;Brent Ozar&amp;rsquo;s article below resonates with my post-COVID experience as a conference speaker. From big national and international conferences to local meetups like the one I run, attendance has been dwindling following the hiatus. Of all the proposed reasons, I believe &amp;ldquo;people switched how they&amp;rsquo;re learning&amp;rdquo; is crucial; just think about YouTube, LLMs, and the plethora of free and paid online courses.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.brentozar.com/archive/2025/08/why-arent-people-going-to-local-and-regional-in-person-events-anymore/&#34;&gt;Why Aren’t People Going to Local and Regional In-Person Events Anymore?&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Brent Ozar&rsquo;s article below resonates with my post-COVID experience as a conference speaker. From big national and international conferences to local meetups like the one I run, attendance has been dwindling following the hiatus. Of all the proposed reasons, I believe &ldquo;people switched how they&rsquo;re learning&rdquo; is crucial; just think about YouTube, LLMs, and the plethora of free and paid online courses.</p>
<p><a href="https://www.brentozar.com/archive/2025/08/why-arent-people-going-to-local-and-regional-in-person-events-anymore/">Why Aren’t People Going to Local and Regional In-Person Events Anymore?</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Python: The Documentary</title>
      <link>https://nicolaiarocci.com/python-the-documentary/</link>
      <pubDate>Tue, 02 Sep 2025 16:52:21 +0200</pubDate>
      <guid>https://nicolaiarocci.com/python-the-documentary/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is the story of the world&amp;rsquo;s most beloved programming language: Python. What began as a side project in Amsterdam during the 1990s became the software powering artificial intelligence, data science and some of the world’s biggest companies. But Python&amp;rsquo;s future wasn&amp;rsquo;t certain; at one point it almost disappeared.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/GfH4QL4VqJ0&#34;&gt;Python: The Documentary&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>This is the story of the world&rsquo;s most beloved programming language: Python. What began as a side project in Amsterdam during the 1990s became the software powering artificial intelligence, data science and some of the world’s biggest companies. But Python&rsquo;s future wasn&rsquo;t certain; at one point it almost disappeared.</p></blockquote>
<p><a href="https://youtu.be/GfH4QL4VqJ0">Python: The Documentary</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The first-line treatment for ADHD</title>
      <link>https://nicolaiarocci.com/the-first-line-treatment-for-adhd/</link>
      <pubDate>Mon, 01 Sep 2025 14:49:21 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-first-line-treatment-for-adhd/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The first-line treatment for ADHD is stimulants. Everything else in this post works best as a complement to, rather than as an alternative to, stimulant medication. In fact most of the strategies described here, I was only able to execute after starting stimulants. For me, chemistry is the critical node in the tech tree: the todo list, the pomodoro timers, etc., all of that was unlocked by the medication&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://borretti.me/article/notes-on-managing-adhd&#34;&gt;Notes on Managing ADHD&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The first-line treatment for ADHD is stimulants. Everything else in this post works best as a complement to, rather than as an alternative to, stimulant medication. In fact most of the strategies described here, I was only able to execute after starting stimulants. For me, chemistry is the critical node in the tech tree: the todo list, the pomodoro timers, etc., all of that was unlocked by the medication</p></blockquote>
<p><a href="https://borretti.me/article/notes-on-managing-adhd">Notes on Managing ADHD</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Invoicetronic, or what I&#39;ve been working on recently</title>
      <link>https://nicolaiarocci.com/invoicetronic-or-what-ive-been-working-on-recently/</link>
      <pubDate>Thu, 28 Aug 2025 10:07:05 +0200</pubDate>
      <guid>https://nicolaiarocci.com/invoicetronic-or-what-ive-been-working-on-recently/</guid>
      <description>&lt;p&gt;The most recent project I worked on is &lt;a href=&#34;https://invoicetronic.com/en/&#34;&gt;Invoicetronic&lt;/a&gt;, a modern API for complete management of the electronic invoicing cycle in Italy (FatturaPA/SDI).&lt;/p&gt;
&lt;p&gt;We had long used an internal API by our accounting software, which was also utilized by thousands of our end users. We decided to make our experience and expertise available to external developers, allowing them to integrate electronic invoicing into their applications quickly via a public API. Thus, the Invoicetronic project was born.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The most recent project I worked on is <a href="https://invoicetronic.com/en/">Invoicetronic</a>, a modern API for complete management of the electronic invoicing cycle in Italy (FatturaPA/SDI).</p>
<p>We had long used an internal API by our accounting software, which was also utilized by thousands of our end users. We decided to make our experience and expertise available to external developers, allowing them to integrate electronic invoicing into their applications quickly via a public API. Thus, the Invoicetronic project was born.</p>
<p>We had made a similar choice in the past with the open-source release of <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET">FatturaElettronica.NET</a>, also a library initially created for internal use. <a href="https://python-eve.org">Eve</a> and <a href="https://python-cerberus.org">Cerberus</a> for Python started as an internal projects too.</p>
<p>We didn&rsquo;t limit ourselves to just opening our API to the public. That alone would have been challenging (as any veteran well knows, opening a private product to a broader and more diverse audience is already a real challenge in itself). We seized the opportunity, years after its creation and with millions of invoices having passed through the system in the meantime, to refresh the design, improve performance, and add <a href="https://invoicetronic.com/en/features/">important features</a> that proved stimulating to implement.</p>
<p>I certainly wasn&rsquo;t lacking experience with REST APIs, but I still learned a lot, especially while working on the tools accessory to the actual API. An example is the client <a href="https://invoicetronic.com/en/docs/sdk/">SDKs</a>. We support all the most common programming languages: JavaScript/TypeScript, Python, PHP, Java, C#, Ruby, and Go. They&rsquo;re built using OpenAPI Generator, a tool I initially underestimated but which turned out to be excellent, thanks also to the remarkable ecosystem built by the community. Working on the SDKs also provided me with the opportunity to improve my Continuous Integration skills. Beyond the usual test-containerization-staging-deploy cycle, every API update is followed by an automatic release of all SDKs, each with deployment on both GitHub and the reference package manager for the language: PyPI, NuGet, npm, etc. Seemingly obvious tasks (such as inferring the new API version number from CI and then reusing it in the package version of individual SDKs) required considerable brainstorming.</p>
<p>The Invoicetronic project, which gave me the most satisfaction and taught me the most, is <a href="https://invoicetronic.com/en/docs/cli/#invoice"><code>invoice-cli</code></a>. This <a href="https://github.com/invoicetronic/invoice-cli">open source</a> command-line tool enables sending and receiving electronic invoices from the terminal, and is available for Linux, Mac, and Windows. You don&rsquo;t need to be a developer or study the API in depth to use it, and, not secondarily, it can be conveniently inserted into a script. A trivial usage example would be:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span># send a single invoice.
</span></span><span style="display:flex;"><span>$ invoice send file1.xml
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># send multiple invoices, then delete the local copies.
</span></span><span style="display:flex;"><span>$ invoice send *.xml --delete
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># individually send multiple files.
</span></span><span style="display:flex;"><span>$ invoice send file1.xml file2.xml file3.xml
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># receive all unread invoices.
</span></span><span style="display:flex;"><span>$ invoice receive --unread
</span></span></code></pre></div><p>From my point of view, though, the interesting thing about <code>invoice</code> is that it&rsquo;s written in Go, a language I hadn&rsquo;t yet had the chance to use professionally. A veteran would likely find fault with the implementation details and the chosen approach, but I hope they&rsquo;ll be merciful, considering I&rsquo;m a beginner in this space. We could have used C#, which is now our reference language. Still, in the case of the command-line, Go seemed like a better choice, first of all, for the exceptional support in creating native multi-platform binaries, then for performance both cold and hot, and for deployment simplicity. If I had to make another command-line tool, I would return to Go rather than orient myself toward languages I know better and with which I&rsquo;m more comfortable, like Python and C# (speaking of C#, the recent improvements in AOT and cross-platform support are remarkable - we&rsquo;re on the right track, come on guys!)</p>
<p>A second stimulating project was the <a href="https://invoicetronic.com/en/features/#llm-and-ai-integration">Invoicetronic MCP Server.</a> We were interested in having developers interact with the Invoicetronic API via LLM, and an MCP server serves precisely that purpose. Fortunately, C# has an excellent official library (still in preview but sufficiently mature) that simplifies the work, and implementing and deploying a first experimental version was relatively simple. There is enormous potential in this area, and I want to stay on top of it: objective achieved (I also gave a <a href="https://nicolaiarocci.com/im-speaking-at-devmarche-summer-ai-afternoon/">couple</a> of <a href="https://nicolaiarocci.com/mcp-or-connecting-our-apps-to-llms/">presentations</a> on the topic).</p>
<p>We released Invoicetronic for our own use, but I hope other developers will adopt it. Throughout many years of activity, our primary client has consistently been the end-user, the company that utilizes our accounting applications. In recent years, we also engaged with developers, but only in the context of our open-source projects. I&rsquo;d love to serve them professionally as well.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A zoomable, searchable archive of BYTE Magazine</title>
      <link>https://nicolaiarocci.com/a-zoomable-searchable-archive-of-byte-magazine/</link>
      <pubDate>Wed, 27 Aug 2025 10:12:33 +0200</pubDate>
      <guid>https://nicolaiarocci.com/a-zoomable-searchable-archive-of-byte-magazine/</guid>
      <description>&lt;p&gt;From roughly the late 80s until the mid-90s, every month I would visit the newsstand at my city&amp;rsquo;s train station, hoping to snag the single copy of BYTE Magazine that arrived in town (at least one other hunter was competing with me: I often won, but not always, which frustrated me tremendously). I understood little to nothing with my rudimentary school English, but I was too stubborn to give up. I credit BYTE Magazine as one of my significant English teachers. Flipping those pages was exciting, and, as unbelievable as it may seem today, back then the advertisements were just as captivating as the articles themselves. Granted, I was also reading Italian computing magazines, but most were copycats of the one authoritative source &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>From roughly the late 80s until the mid-90s, every month I would visit the newsstand at my city&rsquo;s train station, hoping to snag the single copy of BYTE Magazine that arrived in town (at least one other hunter was competing with me: I often won, but not always, which frustrated me tremendously). I understood little to nothing with my rudimentary school English, but I was too stubborn to give up. I credit BYTE Magazine as one of my significant English teachers. Flipping those pages was exciting, and, as unbelievable as it may seem today, back then the advertisements were just as captivating as the articles themselves. Granted, I was also reading Italian computing magazines, but most were copycats of the one authoritative source <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Thank you, whoever you are, for the extraordinary work done on <a href="https://byte.tsundoku.io/">this website</a> (<a href="https://news.ycombinator.com/item?id=45028002">via</a>).</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>This is a story I already <a href="/the-end-of-computer-magazines-in-america-and-elsewhere/">mentioned</a> in the past.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Repair, the skill nobody talks about</title>
      <link>https://nicolaiarocci.com/repair-the-skill-nobody-talks-about/</link>
      <pubDate>Mon, 25 Aug 2025 15:57:34 +0200</pubDate>
      <guid>https://nicolaiarocci.com/repair-the-skill-nobody-talks-about/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Let me tell you something that will happen after you become a manager: you’re going to mess up. A lot. You’ll give feedback that lands wrong and crushes someone’s confidence. You’ll make a decision that seems logical but turns out to be completely misguided. You’ll forget that important thing you promised to do for someone on your team. You’ll lose your temper in a meeting when you should have stayed calm. The real question isn’t whether you’ll make mistakes; it’s what you do &lt;em&gt;after&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Let me tell you something that will happen after you become a manager: you’re going to mess up. A lot. You’ll give feedback that lands wrong and crushes someone’s confidence. You’ll make a decision that seems logical but turns out to be completely misguided. You’ll forget that important thing you promised to do for someone on your team. You’ll lose your temper in a meeting when you should have stayed calm. The real question isn’t whether you’ll make mistakes; it’s what you do <em>after</em>.</p></blockquote>
<p><a href="https://terriblesoftware.org/2025/08/22/the-management-skill-nobody-talks-about/">The Management Skill Nobody Talks About</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The ROI of exercise</title>
      <link>https://nicolaiarocci.com/the-roi-of-exercise/</link>
      <pubDate>Mon, 25 Aug 2025 15:13:06 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-roi-of-exercise/</guid>
      <description>&lt;p&gt;Like Herman below, I exercise daily. A one-hour brisk walk in the early morning on weekdays before sitting at the desk, and four weekly sessions of bodyweight strength training (known as calisthenics nowadays). If it&amp;rsquo;s going to be a scorching hot day, I&amp;rsquo;ll immediately follow the walk with the training, take a shower, have breakfast, and then start work. In the cooler season, I&amp;rsquo;ll stop working at noon and exercise before lunch instead. During the weekend, I often take long &lt;a href=&#34;https://nicolaiarocci.com/tags/walks/&#34;&gt;walks&lt;/a&gt;, go &lt;a href=&#34;https://nicolaiarocci.com/tags/hiking/&#34;&gt;hiking&lt;/a&gt;, and rest.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Like Herman below, I exercise daily. A one-hour brisk walk in the early morning on weekdays before sitting at the desk, and four weekly sessions of bodyweight strength training (known as calisthenics nowadays). If it&rsquo;s going to be a scorching hot day, I&rsquo;ll immediately follow the walk with the training, take a shower, have breakfast, and then start work. In the cooler season, I&rsquo;ll stop working at noon and exercise before lunch instead. During the weekend, I often take long <a href="https://nicolaiarocci.com/tags/walks/">walks</a>, go <a href="https://nicolaiarocci.com/tags/hiking/">hiking</a>, and rest.</p>
<p>I&rsquo;m turning 55 in a few days, and sometimes I wonder if I should slow down or reduce the intensity of my training. I&rsquo;ve made adjustments along those lines in recent years, but I suspect I am still pretty active for my age.</p>
<p>Today I read <a href="https://herman.bearblog.dev/exercise/">Herman&rsquo;s post on the ROI of exercise</a>, and it is spot on. It&rsquo;s common sense; we&rsquo;ve all read those things, but here they are nicely compiled. The concept that lifelong exercise &ldquo;adds extra years to each stage of life rather than just frail years at the end&rdquo; hit home for me.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Old timers who built the early web are coding with AI like it&#39;s 1995</title>
      <link>https://nicolaiarocci.com/old-timers-who-built-the-early-web-are-coding-with-ai-like-its-1995/</link>
      <pubDate>Fri, 01 Aug 2025 08:19:05 +0200</pubDate>
      <guid>https://nicolaiarocci.com/old-timers-who-built-the-early-web-are-coding-with-ai-like-its-1995/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The old timers who built the early web are coding with AI like it&amp;rsquo;s 1995. Think about it: They gave blockchain the sniff test and walked away. Ignored crypto (and yeah, we&amp;rsquo;re not rich now). NFTs got a collective eye roll. But AI? Different story. The same folks who hand-coded HTML while listening to dial-up modems sing are now vibe-coding with the kids. Building things. Breaking things. Giddy about it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The old timers who built the early web are coding with AI like it&rsquo;s 1995. Think about it: They gave blockchain the sniff test and walked away. Ignored crypto (and yeah, we&rsquo;re not rich now). NFTs got a collective eye roll. But AI? Different story. The same folks who hand-coded HTML while listening to dial-up modems sing are now vibe-coding with the kids. Building things. Breaking things. Giddy about it.</p></blockquote>
<blockquote>
<p>We Gen X&rsquo;ers have seen enough gold rushes to know the real thing. This one&rsquo;s got all the usual crap—bad actors, inflated claims, VCs throwing money at anything with &ldquo;AI&rdquo; in the pitch deck. Gross behavior all around. Normal for a paradigm shift, but still gross.</p></blockquote>
<blockquote>
<p>The people who helped wire up the internet recognize what&rsquo;s happening. When the folks who&rsquo;ve been through every tech cycle since gopher start acting like excited newbies again, that tells you something.</p></blockquote>
<p>&ndash; <a href="https://www.linkedin.com/posts/christinawodtke_the-old-timers-who-built-the-early-web-are-activity-7356335847614402560-8nKx/">Christina Wodtke</a> (<a href="https://simonwillison.net/2025/Jul/31/christina-wodtke/#atom-everything">via</a>)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Oops he slipped</title>
      <link>https://nicolaiarocci.com/oops-he-slipped/</link>
      <pubDate>Tue, 29 Jul 2025 17:18:45 +0200</pubDate>
      <guid>https://nicolaiarocci.com/oops-he-slipped/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I was hiking the Narrows trail along the Rockcastle river in Kentucky’s Daniel Boone National Forest, slipped off the edge of the trail and broke me ankle. There was no cell phone service so I ended up butt-crawling a ways on the trail (crutches I hacked together made things worse with weak wood out there) until I finally raised a faint signal. Texted 911 (so thankful they have this service for the deaf), helped their volunteer rescue squad locate me by boat on the river below and their wonderful firemen hauled me down the mountain with good cheer.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I was hiking the Narrows trail along the Rockcastle river in Kentucky’s Daniel Boone National Forest, slipped off the edge of the trail and broke me ankle. There was no cell phone service so I ended up butt-crawling a ways on the trail (crutches I hacked together made things worse with weak wood out there) until I finally raised a faint signal. Texted 911 (so thankful they have this service for the deaf), helped their volunteer rescue squad locate me by boat on the river below and their wonderful firemen hauled me down the mountain with good cheer.</p></blockquote>
<p><a href="https://alongtheray.com/oops-i-slipped%E2%80%A6">Lucky man</a>. Reaching an area with cell phone reception was not impossible, and the distance to cover was still feasible.</p>
<p>Reading stories like this doesn&rsquo;t make me as nervous as it did before I took the plunge and got a <a href="https://www.garmin.com/en-US/p/765374/">Garmin InReach Mini</a> and then joined <a href="https://en.wikipedia.org/wiki/Club_Alpino_Italiano">CAI</a>, so I would have insurance coverage for emergency rescues.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The lies we tell ourselves</title>
      <link>https://nicolaiarocci.com/the-lies-we-tell-ourselves/</link>
      <pubDate>Mon, 28 Jul 2025 14:43:03 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-lies-we-tell-ourselves/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The lies we tell others
are for survival.&lt;br&gt;
But the lies we tell ourselves&amp;hellip;&lt;br&gt;
those can kill us!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;A quote from &lt;a href=&#34;https://www.coconinopress.it/prodotto/ragazzo/&#34;&gt;Ragazzo&lt;/a&gt; by Zuzu, which I read recently.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The lies we tell others
are for survival.<br>
But the lies we tell ourselves&hellip;<br>
those can kill us!</p></blockquote>
<p>A quote from <a href="https://www.coconinopress.it/prodotto/ragazzo/">Ragazzo</a> by Zuzu, which I read recently.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Professional decline begins sooner than expected</title>
      <link>https://nicolaiarocci.com/professional-decline-begins-sooner-than-expected/</link>
      <pubDate>Wed, 23 Jul 2025 12:13:51 +0200</pubDate>
      <guid>https://nicolaiarocci.com/professional-decline-begins-sooner-than-expected/</guid>
      <description>&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/original.jpg.webp&#34;
         alt=&#34;Luci Gutiérrez, from the linked article.&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Luci Gutiérrez, from the linked article.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Arthur C. Brooks, in his July 2019 Atlantic article &lt;a href=&#34;https://www.theatlantic.com/magazine/archive/2019/07/work-peak-professional-decline/590650/&#34;&gt;Your Professional Decline Is Coming (Much) Sooner Than You Think&lt;/a&gt;, confronts an uncomfortable truth: professional decline begins much earlier than most people expect.&lt;/p&gt;
&lt;p&gt;The core of Brooks&amp;rsquo; argument is based on psychologist Raymond Cattell&amp;rsquo;s work from the 1940s, which distinguished between fluid and crystallized intelligence.&lt;/p&gt;
&lt;p&gt;Fluid intelligence—analytical capacity, processing speed, and the ability to solve novel problems—peaks in one&amp;rsquo;s early thirties and then declines precipitously, which explains why many tech entrepreneurs achieve fame and fortune in their twenties but enter creative decline by age 30.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
    <img loading="lazy" src="/images/original.jpg.webp"
         alt="Luci Gutiérrez, from the linked article."/> <figcaption>
            <p>Luci Gutiérrez, from the linked article.</p>
        </figcaption>
</figure>

<p>Arthur C. Brooks, in his July 2019 Atlantic article <a href="https://www.theatlantic.com/magazine/archive/2019/07/work-peak-professional-decline/590650/">Your Professional Decline Is Coming (Much) Sooner Than You Think</a>, confronts an uncomfortable truth: professional decline begins much earlier than most people expect.</p>
<p>The core of Brooks&rsquo; argument is based on psychologist Raymond Cattell&rsquo;s work from the 1940s, which distinguished between fluid and crystallized intelligence.</p>
<p>Fluid intelligence—analytical capacity, processing speed, and the ability to solve novel problems—peaks in one&rsquo;s early thirties and then declines precipitously, which explains why many tech entrepreneurs achieve fame and fortune in their twenties but enter creative decline by age 30.</p>
<p>Crystallized intelligence, conversely, represents the ability to use knowledge accumulated over time—the essence of wisdom. This form of intelligence tends to increase through one&rsquo;s forties and doesn&rsquo;t diminish until very late in life. Careers that depend primarily on fluid intelligence tend to reach their peak early, while those utilizing more crystallized intelligence tend to reach their peak later.</p>
<p>Brooks suggests that as we age, we should embrace this change and prepare in advance for a transition, planning to move from innovator to mentoring and teaching roles.</p>
<p>Another study that struck me is the 2007 study by UCLA and Princeton researchers, also mentioned in the article, that showed that elderly people who rarely or never felt &ldquo;useful&rdquo; were nearly three times more likely to develop depression than those who frequently felt useful. It may seem like common sense, and it probably is, but we should keep this in mind when interacting with our elderly loved ones.</p>
<p>I&rsquo;m turning 55 this year. I&rsquo;m still grinding like there&rsquo;s no tomorrow, though. I am in a peculiar position, as running my own company and being responsible for the people working with me makes transitioning to something else a less-than-easy option. Additionally, in my field, continuous learning is essential, as failure to do so can render one obsolete in short order; therefore, I am committed to and used to ongoing training. I&rsquo;m not slowing down, at least not yet. Experience makes decision-making easier (and wiser?), and learning still comes naturally, perhaps because of the knowledge base I can draw upon.</p>
<p>That&rsquo;s how I feel today as I ponder Brooks&rsquo; article, but I&rsquo;ll admit that the thought of slowing down surfaces sometimes. Also, I&rsquo;m often the only grey-bearded individual in the crowd (especially noticeable at conferences where I&rsquo;m speaking), and that must mean something.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Tech promised everything. Did it deliver?</title>
      <link>https://nicolaiarocci.com/tech-promised-everything.-did-it-deliver/</link>
      <pubDate>Tue, 22 Jul 2025 10:36:48 +0200</pubDate>
      <guid>https://nicolaiarocci.com/tech-promised-everything.-did-it-deliver/</guid>
      <description>&lt;p&gt;I have had the good fortune of meeting Scott several times at various conferences and the MVP Summits held at Microsoft headquarters in Seattle. Seeing him get emotional in this talk does not surprise me, nor is it unusual for him to criticize the very technology&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; that his company promotes.&lt;/p&gt;
&lt;p&gt;He has always been an entertaining speaker and teacher. As it turns out, the TED format suits him perfectly.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/dVG8W-0p6vg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Or rather, the way that technology is utilized.&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;</description>
      <content:encoded><![CDATA[<p>I have had the good fortune of meeting Scott several times at various conferences and the MVP Summits held at Microsoft headquarters in Seattle. Seeing him get emotional in this talk does not surprise me, nor is it unusual for him to criticize the very technology<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> that his company promotes.</p>
<p>He has always been an entertaining speaker and teacher. As it turns out, the TED format suits him perfectly.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/dVG8W-0p6vg?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Or rather, the way that technology is utilized.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Just one good thing</title>
      <link>https://nicolaiarocci.com/just-one-good-thing/</link>
      <pubDate>Tue, 22 Jul 2025 09:46:55 +0200</pubDate>
      <guid>https://nicolaiarocci.com/just-one-good-thing/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In the last year, a mindset shift and approach appeared as a very simple idea: just do one thing, &lt;em&gt;that I want to do today&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The one thing can be small or big, easy or labored, fleeting or long. I carve out time to go play drums for two hours, go for a bouldering session, do a shorter 20 minute run, read a page of a book, eat something I’m really excited about, and more. Even on the most difficult day, I can adjust and find the smallest thing that I am excited about and do it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>In the last year, a mindset shift and approach appeared as a very simple idea: just do one thing, <em>that I want to do today</em>.</p></blockquote>
<blockquote>
<p>The one thing can be small or big, easy or labored, fleeting or long. I carve out time to go play drums for two hours, go for a bouldering session, do a shorter 20 minute run, read a page of a book, eat something I’m really excited about, and more. Even on the most difficult day, I can adjust and find the smallest thing that I am excited about and do it.</p></blockquote>
<p><a href="https://nazhamid.com/journal/just-one-good-thing/">Just One Good Thing</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Foothills of Romagna</title>
      <link>https://nicolaiarocci.com/foothills-of-romagna/</link>
      <pubDate>Mon, 21 Jul 2025 08:37:14 +0200</pubDate>
      <guid>https://nicolaiarocci.com/foothills-of-romagna/</guid>
      <description>&lt;p&gt;Between motorcycle rides with my friends from &lt;a href=&#34;https://tomccitalia.org&#34;&gt;TOMCC Italia&lt;/a&gt; and family dinners at sunset, I spent most of the weekend in the foothills of Romagna. I&amp;rsquo;m fortunate to live close to such &lt;a href=&#34;https://nicolaiarocci.com/images/foothills-of-romagna-at-sunset.jpg&#34;&gt;beautiful landscapes&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Between motorcycle rides with my friends from <a href="https://tomccitalia.org">TOMCC Italia</a> and family dinners at sunset, I spent most of the weekend in the foothills of Romagna. I&rsquo;m fortunate to live close to such <a href="/images/foothills-of-romagna-at-sunset.jpg">beautiful landscapes</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Neuromancer in 2025</title>
      <link>https://nicolaiarocci.com/neuromancer-in-2025/</link>
      <pubDate>Mon, 14 Jul 2025 16:49:18 +0200</pubDate>
      <guid>https://nicolaiarocci.com/neuromancer-in-2025/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Neuromancer has become more than just an influential novel; it’s now the blueprint for the entire Cyberpunk genre. Even if you’ve never read it, you’ve felt its impact in nearly every major sci-fi film, TV show, anime, and video game of the past 40 years. Gibson didn’t invent cyberpunk, but he defined it. He created the lexicon—cyberspace, matrix, sprawl—that shaped how we imagine our digital future.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://mbh4h.substack.com/p/neuromancer-2025-review-william-gibson&#34;&gt;Reading Neuromancer for the very first time in 2025&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Neuromancer has become more than just an influential novel; it’s now the blueprint for the entire Cyberpunk genre. Even if you’ve never read it, you’ve felt its impact in nearly every major sci-fi film, TV show, anime, and video game of the past 40 years. Gibson didn’t invent cyberpunk, but he defined it. He created the lexicon—cyberspace, matrix, sprawl—that shaped how we imagine our digital future.</p></blockquote>
<p><a href="https://mbh4h.substack.com/p/neuromancer-2025-review-william-gibson">Reading Neuromancer for the very first time in 2025</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>What doesn&#39;t change</title>
      <link>https://nicolaiarocci.com/what-doesnt-change/</link>
      <pubDate>Mon, 14 Jul 2025 16:28:26 +0200</pubDate>
      <guid>https://nicolaiarocci.com/what-doesnt-change/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Everyone’s either panicking that AI will replace them or assuming they don’t need to learn anything anymore. Both miss the point entirely. AI amplifies what you already know. If you understand distributed systems, you’ll use AI to build better ones. If you don’t, you’ll use AI to create distributed disasters.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The difference? When that AI-generated code breaks in production — and it will — you need to know why. When it doesn’t scale — and it won’t — you need to understand the bottlenecks. When it creates race conditions, memory leaks, or architectural nightmares, GitHub Copilot won’t save you. &lt;strong&gt;Your fundamentals will&lt;/strong&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Everyone’s either panicking that AI will replace them or assuming they don’t need to learn anything anymore. Both miss the point entirely. AI amplifies what you already know. If you understand distributed systems, you’ll use AI to build better ones. If you don’t, you’ll use AI to create distributed disasters.</p></blockquote>
<blockquote>
<p>The difference? When that AI-generated code breaks in production — and it will — you need to know why. When it doesn’t scale — and it won’t — you need to understand the bottlenecks. When it creates race conditions, memory leaks, or architectural nightmares, GitHub Copilot won’t save you. <strong>Your fundamentals will</strong>.</p></blockquote>
<p><a href="https://terriblesoftware.org/2025/07/14/what-doesnt-change/">What Doesn&rsquo;t Change</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Maintaining curiosity</title>
      <link>https://nicolaiarocci.com/maintaining-curiosity/</link>
      <pubDate>Tue, 08 Jul 2025 14:53:36 +0200</pubDate>
      <guid>https://nicolaiarocci.com/maintaining-curiosity/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I believe what&amp;rsquo;s important isn&amp;rsquo;t the specific technology itself, but rather maintaining curiosity that always looks toward new alternatives and making technical decisions based on your own judgment rather than simply delegating your choices to popular opinion.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://hackers.pub/@hongminhee/2025/contrarian-stack/en&#34;&gt;In Praise of the Contrarian Stack&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I believe what&rsquo;s important isn&rsquo;t the specific technology itself, but rather maintaining curiosity that always looks toward new alternatives and making technical decisions based on your own judgment rather than simply delegating your choices to popular opinion.</p></blockquote>
<p><a href="https://hackers.pub/@hongminhee/2025/contrarian-stack/en">In Praise of the Contrarian Stack</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>I&#39;m speaking at DevMarche Summer AI Afternoon</title>
      <link>https://nicolaiarocci.com/im-speaking-at-devmarche-summer-ai-afternoon/</link>
      <pubDate>Tue, 08 Jul 2025 10:59:39 +0200</pubDate>
      <guid>https://nicolaiarocci.com/im-speaking-at-devmarche-summer-ai-afternoon/</guid>
      <description>&lt;p&gt;On Thursday, I will be conducting an MCP Server session at the &lt;a href=&#34;https://www.eventbrite.it/e/summer-ai-afternoon-tickets-1428458029419&#34;&gt;Summer AI Afternoon&lt;/a&gt; event organized by &lt;a href=&#34;https://dev.marche.it&#34;&gt;DevMarche&lt;/a&gt; in collaboration with &lt;a href=&#34;https://devromagna.org&#34;&gt;DevRomagna&lt;/a&gt;, the neighbouring development communities. There are more than 50 people signed up already, and I&amp;rsquo;m so looking forward to meeting old and new friends down South.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On Thursday, I will be conducting an MCP Server session at the <a href="https://www.eventbrite.it/e/summer-ai-afternoon-tickets-1428458029419">Summer AI Afternoon</a> event organized by <a href="https://dev.marche.it">DevMarche</a> in collaboration with <a href="https://devromagna.org">DevRomagna</a>, the neighbouring development communities. There are more than 50 people signed up already, and I&rsquo;m so looking forward to meeting old and new friends down South.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cloudflare to introduce pay-per-crawl for AI bots</title>
      <link>https://nicolaiarocci.com/cloudflare-to-introduce-pay-per-crawl-for-ai-bots/</link>
      <pubDate>Wed, 02 Jul 2025 09:57:57 +0200</pubDate>
      <guid>https://nicolaiarocci.com/cloudflare-to-introduce-pay-per-crawl-for-ai-bots/</guid>
      <description>&lt;p&gt;The biggest news in tech this week (which isn&amp;rsquo;t over yet) is, without a doubt, that &lt;a href=&#34;https://blog.cloudflare.com/introducing-pay-per-crawl/&#34;&gt;Cloudflare is about to introduce a pay-per-crawl model for AI bots&lt;/a&gt;—huge in many ways, as let&amp;rsquo;s not forget that approximately 20% of internet traffic is routed through Cloudflare.&lt;/p&gt;
&lt;p&gt;I have many thoughts right now, and it will take some time for them to settle. A good analysis and explanation of why this move is needed and is a good first step can be found in yesterday&amp;rsquo;s article by Dries Buytaert&amp;rsquo;s, &lt;a href=&#34;https://dri.es/the-webs-broken-deal-with-ai-companies&#34;&gt;The Web&amp;rsquo;s Broken Deal with AI Companies&lt;/a&gt;, which I recommend everyone read.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The biggest news in tech this week (which isn&rsquo;t over yet) is, without a doubt, that <a href="https://blog.cloudflare.com/introducing-pay-per-crawl/">Cloudflare is about to introduce a pay-per-crawl model for AI bots</a>—huge in many ways, as let&rsquo;s not forget that approximately 20% of internet traffic is routed through Cloudflare.</p>
<p>I have many thoughts right now, and it will take some time for them to settle. A good analysis and explanation of why this move is needed and is a good first step can be found in yesterday&rsquo;s article by Dries Buytaert&rsquo;s, <a href="https://dri.es/the-webs-broken-deal-with-ai-companies">The Web&rsquo;s Broken Deal with AI Companies</a>, which I recommend everyone read.</p>
<blockquote>
<p>For 25 years, we built the Open Web on an implicit agreement: search engines could index our content because they sent users back to our websites. That model helped sustain blogs, news sites, and even open source projects. AI companies broke that model. They train on our work and answer questions directly in their own interfaces, cutting creators out entirely. Anthropic&rsquo;s crawler reportedly makes 70,000 website requests for every single visitor it sends back. That is extraction, not exchange.</p></blockquote>
<p>The ongoing discussion on <a href="https://news.ycombinator.com/item?id=44432385">Hacker News</a> is also worth reading</p>
<p>Side note, I am fascinated by the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402">technical details</a> surrounding the 402 Payment Required response (and <a href="https://blog.cloudflare.com/introducing-pay-per-crawl/#publisher-controls-and-pricing">Cloudflare&rsquo;s implementation</a>), which was designed explicitly for micro-payment handling but never gained traction, until now.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sometimes bad weather can feel like a gift</title>
      <link>https://nicolaiarocci.com/sometimes-bad-weather-can-feel-like-a-gift/</link>
      <pubDate>Tue, 01 Jul 2025 08:50:43 +0200</pubDate>
      <guid>https://nicolaiarocci.com/sometimes-bad-weather-can-feel-like-a-gift/</guid>
      <description>&lt;p&gt;Simon Collison in &lt;a href=&#34;https://colly.com/journal/another-week-in-edale&#34;&gt;Another Week in Edale&lt;/a&gt; perfectly captures why I enjoy hiking in bad weather, something those in my proximity consider borderline reckless:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A calm day is always welcome, but there’s a perverse pleasure in struggling against violent gusts, or enjoying the steady rhythmic crackle of rain on a waterproof hood. Sometimes, bad weather can feel like a gift, exactly what’s needed to stir the senses and awaken the brain.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Simon Collison in <a href="https://colly.com/journal/another-week-in-edale">Another Week in Edale</a> perfectly captures why I enjoy hiking in bad weather, something those in my proximity consider borderline reckless:</p>
<blockquote>
<p>A calm day is always welcome, but there’s a perverse pleasure in struggling against violent gusts, or enjoying the steady rhythmic crackle of rain on a waterproof hood. Sometimes, bad weather can feel like a gift, exactly what’s needed to stir the senses and awaken the brain.</p></blockquote>
<p>I also share with him my disillusionment about the sublime purity of nature.</p>
<blockquote>
<p>When I was young I saw only what I wanted to see — mostly myself — in what appeared to be a beautiful landscape with the occasional thrill of the sublime. But now, I see every sign of intensive land management; little is natural or truly wild when almost every hectare is the product of either sheep farming, grouse production, or forestry. And I think about issues of ownership, class, exclusion, climate and tourism. This landscape is political, and it reflects all of us.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>How software became a lifestyle brand</title>
      <link>https://nicolaiarocci.com/how-software-became-a-lifestyle-brand/</link>
      <pubDate>Tue, 24 Jun 2025 11:26:52 +0200</pubDate>
      <guid>https://nicolaiarocci.com/how-software-became-a-lifestyle-brand/</guid>
      <description>&lt;p&gt;Omer has an &lt;a href=&#34;https://omeru.bearblog.dev/lifestyle/&#34;&gt;intriguing essay&lt;/a&gt; up on his blog:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;choosing software used to be straightforward. does the app do what you need, or not? but now, opening notion or obsidian feels less like launching software and more like putting on your favorite jacket. it says something about you. aligns you with a tribe, becomes part of your identity. software isn’t just functional anymore. it’s quietly turned into a lifestyle brand, a digital prosthetic we use to signal who we are, or who we wish we were.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Omer has an <a href="https://omeru.bearblog.dev/lifestyle/">intriguing essay</a> up on his blog:</p>
<blockquote>
<p>choosing software used to be straightforward. does the app do what you need, or not? but now, opening notion or obsidian feels less like launching software and more like putting on your favorite jacket. it says something about you. aligns you with a tribe, becomes part of your identity. software isn’t just functional anymore. it’s quietly turned into a lifestyle brand, a digital prosthetic we use to signal who we are, or who we wish we were.</p></blockquote>
<p>I don&rsquo;t necessarily agree with the premise. In the late 1980s and early 1990s, we chose which BBS to operate as Sysops not only based on features but also culture, style, and aesthetics. Given the option, humans make a choice based on both function and form. Why behave differently with software?</p>
<p>The notion versus obsidian face-off is brilliant. As a Team Obsidian, I find Omer&rsquo;s take amusing and spot on:</p>
<blockquote>
<p>if notion is a sleek apartment in seoul, obsidian is a cluttered home lab. markdown files. local folders. keyboard shortcuts. graph views. it doesn’t care how it looks, it cares that it works. it’s functional first, aesthetic maybe never. there’s no onboarding flow, no emoji illustrations, no soft gradients telling you everything’s going to be okay. just an empty vault and the quiet suggestion: you figure it out.</p></blockquote>
<p>Style is more relevant these days, that&rsquo;s for sure, but that&rsquo;s also a consequence of proliferation. There are so many viable alternatives today that products also need to differentiate on form.</p>
<blockquote>
<p>these apps aren’t solving new problems. they’re solving old ones with better fonts. tighter animations, cleaner onboarding. they’re selling taste. they’re selling time. and people buy in, not just because the tools are better (some of them aren’t), but because they feel like tools made for people who care.</p></blockquote>
<p><a href="https://omeru.bearblog.dev/lifestyle/">You are what you launch</a> is a good read.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Working on databases from prison</title>
      <link>https://nicolaiarocci.com/working-on-databases-from-prison/</link>
      <pubDate>Mon, 23 Jun 2025 17:40:36 +0200</pubDate>
      <guid>https://nicolaiarocci.com/working-on-databases-from-prison/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://turso.tech/blog/working-on-databases-from-prison&#34;&gt;Preston Thorpe&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;m very excited to announce that I have recently joined Turso as a software engineer. For many in the field, including myself, getting to work on databases and solve unique challenges with such a talented team would be a dream job, but it is that much more special to me because of my unusual and unlikely circumstances. As difficult as it might be to believe, I am currently incarcerated and I landed this job from my cell in state prison. If you don’t know me, let me tell you more about how I got here.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://turso.tech/blog/working-on-databases-from-prison">Preston Thorpe</a>:</p>
<blockquote>
<p>I&rsquo;m very excited to announce that I have recently joined Turso as a software engineer. For many in the field, including myself, getting to work on databases and solve unique challenges with such a talented team would be a dream job, but it is that much more special to me because of my unusual and unlikely circumstances. As difficult as it might be to believe, I am currently incarcerated and I landed this job from my cell in state prison. If you don’t know me, let me tell you more about how I got here.</p></blockquote>
<p>What a remarkable story of redemption and an example of how far hard work, determination, and discipline can take you.</p>
<p><em>Update (2026-06-24):</em> Mandar Vaze <a href="https://indieweb.social/@mandarvaze/114737109017600901">reports</a> the Preston Thorpe was recently interviewed on the <a href="https://changelog.com/podcast/642">Changelog podcast</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Cure&#39;s Acoustic Hits</title>
      <link>https://nicolaiarocci.com/the-cures-acoustic-hits/</link>
      <pubDate>Mon, 23 Jun 2025 08:29:51 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-cures-acoustic-hits/</guid>
      <description>&lt;p&gt;In 2001, The Cure released Greatest Hits, the compilation with which they ended their contract with Fiction Records. The first edition of the anthology was accompanied by Acoustic Hits, an acoustic reinterpretation of the band&amp;rsquo;s hits, including Boys Don&amp;rsquo;t Cry, Friday I&amp;rsquo;m in Love, A Forest, Just Like Heaven, Lullaby, and Lovesong, one of the simplest and greatest love songs of all time (just listen to the bass line). The bonus disc was not reissued &lt;a href=&#34;https://www.discogs.com/release/10171635-The-Cure-Acoustic-Hits&#34;&gt;until 2017&lt;/a&gt; and has only recently landed on streaming platforms.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In 2001, The Cure released Greatest Hits, the compilation with which they ended their contract with Fiction Records. The first edition of the anthology was accompanied by Acoustic Hits, an acoustic reinterpretation of the band&rsquo;s hits, including Boys Don&rsquo;t Cry, Friday I&rsquo;m in Love, A Forest, Just Like Heaven, Lullaby, and Lovesong, one of the simplest and greatest love songs of all time (just listen to the bass line). The bonus disc was not reissued <a href="https://www.discogs.com/release/10171635-The-Cure-Acoustic-Hits">until 2017</a> and has only recently landed on streaming platforms.</p>
<p>Acoustic Hits has undeservedly remained under the radar, or at least it has for me. I only recently discovered it thanks to YouTube<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, where many of its beautiful sessions are <a href="https://www.youtube.com/results?search_query=the+cure+acoustic+sessions">available</a> and of excellent quality.</p>
<p>True to form, I bought the album, and for the past few days, as I ride out this fourth goddam iteration of COVID, it&rsquo;s been on heavy rotation.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Lately, I spend entire evenings watching old music videos from 80s and 90s classics - another sign of old age, I know.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Only <a href="/i-canceled-my-bluesky-account/">yesterday</a>, I was moaning about algorithmic selection, and now I&rsquo;m here celebrating it. Streaming and video platforms aren&rsquo;t primarily social networks, so I think my point still stands.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>I canceled my Bluesky account</title>
      <link>https://nicolaiarocci.com/i-canceled-my-bluesky-account/</link>
      <pubDate>Sun, 22 Jun 2025 08:30:38 +0200</pubDate>
      <guid>https://nicolaiarocci.com/i-canceled-my-bluesky-account/</guid>
      <description>&lt;p&gt;I deleted my Bluesky account. I didn&amp;rsquo;t follow anyone anyway, and I only used it to repost content from my website. Being almost mainstream now, I found Bluesky to have the same dynamics as other mass-adopted social networks: controversies, lots of ego-hunting, vanity fairs, sterile debates, witticisms, and everything else that doesn&amp;rsquo;t interest me.&lt;/p&gt;
&lt;p&gt;Having left Twitter &lt;a href=&#34;http://localhost:1313/im-leaving-twitter/x/&#34;&gt;a while ago&lt;/a&gt; and Facebook a long time before that, I&amp;rsquo;m left with &lt;a href=&#34;https://fosstodon.org/@nicola&#34;&gt;Mastodon&lt;/a&gt; precisely because there are fewer people there, and they are more in my niche; it feels like the pre-mass social media world, like the first Twitter years. Not coincidentally, I&amp;rsquo;m also receiving more feedback on my content than anywhere else.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I deleted my Bluesky account. I didn&rsquo;t follow anyone anyway, and I only used it to repost content from my website. Being almost mainstream now, I found Bluesky to have the same dynamics as other mass-adopted social networks: controversies, lots of ego-hunting, vanity fairs, sterile debates, witticisms, and everything else that doesn&rsquo;t interest me.</p>
<p>Having left Twitter <a href="http://localhost:1313/im-leaving-twitter/x/">a while ago</a> and Facebook a long time before that, I&rsquo;m left with <a href="https://fosstodon.org/@nicola">Mastodon</a> precisely because there are fewer people there, and they are more in my niche; it feels like the pre-mass social media world, like the first Twitter years. Not coincidentally, I&rsquo;m also receiving more feedback on my content than anywhere else.</p>
<p>I doubt I&rsquo;ll get back into social networks; they failed me hard. I get all my news from RSS anyway, where I can select the sources, and there&rsquo;s no algorithm dictating the agenda.</p>
]]></content:encoded>
    </item>
    <item>
      <title>AI coding is less fun</title>
      <link>https://nicolaiarocci.com/ai-coding-is-less-fun/</link>
      <pubDate>Thu, 19 Jun 2025 10:30:51 +0200</pubDate>
      <guid>https://nicolaiarocci.com/ai-coding-is-less-fun/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been doing &amp;ldquo;agentic coding&amp;rdquo; for some time, and well, it&amp;rsquo;s weird. On stable, mature technology (in my case, the C#/.NET stack), it is beneficial, as it significantly boosts productivity.&lt;/p&gt;
&lt;p&gt;But, there&amp;rsquo;s a bit, and that&amp;rsquo;s that I&amp;rsquo;m not programming anymore, or very little now, and I love coding. I love entering &amp;ldquo;the zone&amp;rdquo; and solving complex problems, one at a time. It&amp;rsquo;s always been my superpower. Will I still have fun in the future now that I can delegate most tasks to Claude Code?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been doing &ldquo;agentic coding&rdquo; for some time, and well, it&rsquo;s weird. On stable, mature technology (in my case, the C#/.NET stack), it is beneficial, as it significantly boosts productivity.</p>
<p>But, there&rsquo;s a bit, and that&rsquo;s that I&rsquo;m not programming anymore, or very little now, and I love coding. I love entering &ldquo;the zone&rdquo; and solving complex problems, one at a time. It&rsquo;s always been my superpower. Will I still have fun in the future now that I can delegate most tasks to Claude Code?</p>
<p>In his <a href="https://terriblesoftware.org/2025/04/23/the-hidden-cost-of-ai-coding/">The Hidden Cost of AI Coding</a>, Matheus Lima expresses the same concern:</p>
<blockquote>
<p>Instead of that deep immersion where I&rsquo;d craft each function, I&rsquo;m now more like a <em>curator</em>? I describe what I want, evaluate what the AI gives me, tweak the prompts, and iterate. It&rsquo;s efficient, yes. Revolutionary, even. But something essential feels missing — that state of flow where time vanishes and you&rsquo;re completely absorbed in creation. If this becomes the dominant workflow across teams, do we risk an industry full of highly productive yet strangely detached developers?</p></blockquote>
<p>I&rsquo;m afraid there&rsquo;s no going back; agentic coding is so helpful that it&rsquo;s tough to let go, especially in tiny teams like mine. Matheus suggests we preserve some space in our work where the flow can still happen, and that&rsquo;s probably what I&rsquo;m going to do: on some projects, maybe the open-source ones I maintain, resist the temptation of a <code>claude /init</code> and keep going like the good old times. One can at least try.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Mihaly Csikszentmihalyi</title>
      <link>https://nicolaiarocci.com/quoting-mihaly-csikszentmihalyi/</link>
      <pubDate>Thu, 19 Jun 2025 09:45:55 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-mihaly-csikszentmihalyi/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The best moments in our lives are not the passive, receptive, relaxing times… The best moments usually occur if a person’s body or mind is stretched to its limits in a voluntary effort to accomplish something difficult and worthwhile.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; Mihaly Csikszentmihalyi (&lt;a href=&#34;https://terriblesoftware.org/2025/04/23/the-hidden-cost-of-ai-coding/&#34;&gt;via&lt;/a&gt;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The best moments in our lives are not the passive, receptive, relaxing times… The best moments usually occur if a person’s body or mind is stretched to its limits in a voluntary effort to accomplish something difficult and worthwhile.</p></blockquote>
<p>&ndash; Mihaly Csikszentmihalyi (<a href="https://terriblesoftware.org/2025/04/23/the-hidden-cost-of-ai-coding/">via</a>)</p>
]]></content:encoded>
    </item>
    <item>
      <title>If a note can be public, it should be</title>
      <link>https://nicolaiarocci.com/if-a-note-can-be-public-it-should-be/</link>
      <pubDate>Wed, 18 Jun 2025 14:25:11 +0200</pubDate>
      <guid>https://nicolaiarocci.com/if-a-note-can-be-public-it-should-be/</guid>
      <description>&lt;p&gt;Quoting &lt;a href=&#34;https://dri.es/if-a-note-can-be-public-it-should-be&#34;&gt;Dries Buytaert&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A few years ago, I quietly adopted a small principle that has changed how I think about publishing on my website. [&amp;hellip;] The principle is: If a note can be public, it should be.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Unconsciously, I am trying to do the same, as you might have noticed by the increased activity on this website. Maintaining consistency can be challenging, but it&amp;rsquo;s worth the effort.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quoting <a href="https://dri.es/if-a-note-can-be-public-it-should-be">Dries Buytaert</a>:</p>
<blockquote>
<p>A few years ago, I quietly adopted a small principle that has changed how I think about publishing on my website. [&hellip;] The principle is: If a note can be public, it should be.</p></blockquote>
<p>Unconsciously, I am trying to do the same, as you might have noticed by the increased activity on this website. Maintaining consistency can be challenging, but it&rsquo;s worth the effort.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MCP Remote</title>
      <link>https://nicolaiarocci.com/mcp-remote/</link>
      <pubDate>Wed, 18 Jun 2025 10:36:39 +0200</pubDate>
      <guid>https://nicolaiarocci.com/mcp-remote/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been implementing a remote &lt;a href=&#34;https://modelcontextprotocol.io&#34;&gt;MCP Server&lt;/a&gt;. It comes with a hybrid authentication system that supports the OAuth2 flow and, as a fallback, a custom header for those simple clients that cannot handle OAuth. One such client is Claude Desktop, which, at this time, is even worse; it only supports STDIO (local) servers, let alone OAuth2.&lt;/p&gt;
&lt;p&gt;Today I learned about a nice NPM package called &lt;a href=&#34;https://www.npmjs.com/package/mcp-remote&#34;&gt;MCP Remote&lt;/a&gt;, which bridges the gap by allowing MCP clients that only support local servers to connect to remote MCP Servers, even with authentication support. Thanks to this tool, Claude Desktop is now talking to my remote server&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been implementing a remote <a href="https://modelcontextprotocol.io">MCP Server</a>. It comes with a hybrid authentication system that supports the OAuth2 flow and, as a fallback, a custom header for those simple clients that cannot handle OAuth. One such client is Claude Desktop, which, at this time, is even worse; it only supports STDIO (local) servers, let alone OAuth2.</p>
<p>Today I learned about a nice NPM package called <a href="https://www.npmjs.com/package/mcp-remote">MCP Remote</a>, which bridges the gap by allowing MCP clients that only support local servers to connect to remote MCP Servers, even with authentication support. Thanks to this tool, Claude Desktop is now talking to my remote server<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>The only problem is that the OAuth2 handshake is not initiated at Claude startup or the first 401 response, as I expected, so I had to fall back to my secondary authentication method, the custom header.</p>
<p>I could, of course, retrieve my OAuth2 token out of band and then pass it to MCP Remote, but that&rsquo;s cumbersome and boring. For now, I&rsquo;m satisfied with the custom header approach. It&rsquo;s only a matter of time before Claude Desktop matures enough to fully support Remote MCP servers. Right?</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>For testing purposes, I primarily resort to <a href="https://modelcontextprotocol.io/docs/tools/inspector">MCP Inspector</a>, the reference tool; however, it&rsquo;s also nice to experiment with a reference large language model (LLM), mainly to assess the potential once the server is connected to it.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Free online courses from top universities</title>
      <link>https://nicolaiarocci.com/free-online-courses-from-top-universities/</link>
      <pubDate>Tue, 17 Jun 2025 15:10:46 +0200</pubDate>
      <guid>https://nicolaiarocci.com/free-online-courses-from-top-universities/</guid>
      <description>&lt;p&gt;An impressive list of &lt;a href=&#34;https://www.openculture.com/freeonlinecourses&#34;&gt;free online courses from top universities&lt;/a&gt;, courtesy of Open Culture. I’m bookmarking them for a friend when he retires.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>An impressive list of <a href="https://www.openculture.com/freeonlinecourses">free online courses from top universities</a>, courtesy of Open Culture. I’m bookmarking them for a friend when he retires.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Marp, the markdown presentation ecosystem</title>
      <link>https://nicolaiarocci.com/marp-the-markdown-presentation-ecosystem/</link>
      <pubDate>Tue, 17 Jun 2025 09:59:26 +0200</pubDate>
      <guid>https://nicolaiarocci.com/marp-the-markdown-presentation-ecosystem/</guid>
      <description>&lt;p&gt;Today, I learned about &lt;a href=&#34;https://marp.app&#34;&gt;Marp&lt;/a&gt;, the &amp;ldquo;Markdown Presentation Ecosystem,&amp;rdquo; which comes with an enticing promise: &lt;em&gt;to create beautiful slide decks using an intuitive Markdown experience.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For my &lt;a href=&#34;https://nicolaiarocci.com/mcp-or-connecting-our-apps-to-llms/&#34;&gt;latest presentation&lt;/a&gt;, I utilized the Slides Extended Obsidian plugin, which is based on reveal.js—an excellent option for keeping slide decks within one&amp;rsquo;s Obsidian vault  (I keep all notes, work and personal journals, and knowledge in Obsidian.)&lt;/p&gt;
&lt;p&gt;Marp could be a viable alternative to the plugin, as Obsidian notes are just markdown files. The advantage here is that I can further elaborate or iterate on my slides, for example, from the command line, as Marp comes with a dedicated &lt;a href=&#34;https://github.com/marp-team/marp-cli/&#34;&gt;CLI tool&lt;/a&gt; that lets you export to PDF, HTML, and more. Additionally, Marp is not based on reveal.js, a tool that has given me headaches in the past.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, I learned about <a href="https://marp.app">Marp</a>, the &ldquo;Markdown Presentation Ecosystem,&rdquo; which comes with an enticing promise: <em>to create beautiful slide decks using an intuitive Markdown experience.</em></p>
<p>For my <a href="/mcp-or-connecting-our-apps-to-llms/">latest presentation</a>, I utilized the Slides Extended Obsidian plugin, which is based on reveal.js—an excellent option for keeping slide decks within one&rsquo;s Obsidian vault  (I keep all notes, work and personal journals, and knowledge in Obsidian.)</p>
<p>Marp could be a viable alternative to the plugin, as Obsidian notes are just markdown files. The advantage here is that I can further elaborate or iterate on my slides, for example, from the command line, as Marp comes with a dedicated <a href="https://github.com/marp-team/marp-cli/">CLI tool</a> that lets you export to PDF, HTML, and more. Additionally, Marp is not based on reveal.js, a tool that has given me headaches in the past.</p>
<p>My understanding is that Marp is more geared toward producing &ldquo;static&rdquo; slides intended for PDF or other outputs (HTML included, though). In contrast, reveal-based solutions allow for more advanced features, such as animated slides, which I don&rsquo;t like and use anyway.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica v4</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-v4/</link>
      <pubDate>Mon, 16 Jun 2025 15:51:28 +0200</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-v4/</guid>
      <description>&lt;p&gt;I just released &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronica/4.0.0&#34;&gt;FatturaElettronica.NET v4&lt;/a&gt;. The major version bump is due to a minor breaking change introduced with this version.&lt;/p&gt;
&lt;p&gt;After removing the BouncyCastle dependency (&lt;a href=&#34;https://fatturaelettronicaopensource.org/docs/changelog.html#v-3416&#34;&gt;v3.4.16&lt;/a&gt;) for signature, content extraction, and encoding purposes, a few minor behavioral changes were introduced in the library.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It was previously possible to extract content from documents with tampered signatures (if signature validation was flagged false)&lt;/li&gt;
&lt;li&gt;Signature exceptions were being misreported as Base64 &lt;code&gt;FormatExceptions&lt;/code&gt; for non-base64 input files&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After a &lt;a href=&#34;https://github.com/FatturaElettronica/FatturaElettronica.NET/issues/431&#34;&gt;lengthy analysis and troubleshooting&lt;/a&gt;, it was determined that System.Cryptography (which now replaces BouncyCastle) cannot support the successful decoding of tampered invoices. However, this is undesirable as a feature in the first place. The result is a breaking change: attempting to read tampered documents will now invariably throw &lt;code&gt;SignatureException&lt;/code&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just released <a href="https://www.nuget.org/packages/FatturaElettronica/4.0.0">FatturaElettronica.NET v4</a>. The major version bump is due to a minor breaking change introduced with this version.</p>
<p>After removing the BouncyCastle dependency (<a href="https://fatturaelettronicaopensource.org/docs/changelog.html#v-3416">v3.4.16</a>) for signature, content extraction, and encoding purposes, a few minor behavioral changes were introduced in the library.</p>
<ol>
<li>It was previously possible to extract content from documents with tampered signatures (if signature validation was flagged false)</li>
<li>Signature exceptions were being misreported as Base64 <code>FormatExceptions</code> for non-base64 input files</li>
</ol>
<p>After a <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET/issues/431">lengthy analysis and troubleshooting</a>, it was determined that System.Cryptography (which now replaces BouncyCastle) cannot support the successful decoding of tampered invoices. However, this is undesirable as a feature in the first place. The result is a breaking change: attempting to read tampered documents will now invariably throw <code>SignatureException</code>.</p>
<p>Many thanks to Paolo Manili, aka Delta-38, for <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET/pull/434">contributing</a> this remarkable update.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Blogs are still a thing</title>
      <link>https://nicolaiarocci.com/blogs-are-still-a-thing/</link>
      <pubDate>Mon, 16 Jun 2025 08:47:31 +0200</pubDate>
      <guid>https://nicolaiarocci.com/blogs-are-still-a-thing/</guid>
      <description>&lt;p&gt;Quoting &lt;a href=&#34;http://82mhz.net/posts/2025/06/blogs-are-still-a-thing/&#34;&gt;Andreas&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Blogging is a small niche these days. There isn&amp;rsquo;t much hype around it, nor is there any money to be made because the VC firms are all busy chasing the next big thing, whatever that might be once the AI hype dies off in a year or two. But it is still here, and I like it exactly because it&amp;rsquo;s not the hype technology of the day anymore. It isn&amp;rsquo;t commercialised, algorithmically curated and set up to make some other person rich.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quoting <a href="http://82mhz.net/posts/2025/06/blogs-are-still-a-thing/">Andreas</a>:</p>
<blockquote>
<p>Blogging is a small niche these days. There isn&rsquo;t much hype around it, nor is there any money to be made because the VC firms are all busy chasing the next big thing, whatever that might be once the AI hype dies off in a year or two. But it is still here, and I like it exactly because it&rsquo;s not the hype technology of the day anymore. It isn&rsquo;t commercialised, algorithmically curated and set up to make some other person rich.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>In bloom</title>
      <link>https://nicolaiarocci.com/in-bloom/</link>
      <pubDate>Mon, 16 Jun 2025 08:22:37 +0200</pubDate>
      <guid>https://nicolaiarocci.com/in-bloom/</guid>
      <description>&lt;p&gt;After years of care, the orchid in the bathroom has bloomed again. I moved it from the edge of the bathtub, where it had been surviving in a wilted state for years, to the sink, hoping to water it more often, which I did. Nothing else: no repotting, no fertilizer, the same light as before. The resilience of nature.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>After years of care, the orchid in the bathroom has bloomed again. I moved it from the edge of the bathtub, where it had been surviving in a wilted state for years, to the sink, hoping to water it more often, which I did. Nothing else: no repotting, no fertilizer, the same light as before. The resilience of nature.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Protests work</title>
      <link>https://nicolaiarocci.com/protests-work/</link>
      <pubDate>Sat, 14 Jun 2025 16:39:32 +0200</pubDate>
      <guid>https://nicolaiarocci.com/protests-work/</guid>
      <description>&lt;p&gt;Quoting &lt;a href=&#34;https://inessential.com/2025/06/13/saturday-march.html&#34;&gt;Brent Simmons&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chatting with my friends about how I hate these fascist assholes doesn’t do a damn thing. Protests work. (Imperfectly, sure, with no guarantees. But it sure beats not protesting.)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;He&amp;rsquo;s attending &lt;a href=&#34;https://www.nokings.org/&#34;&gt;No Kings&lt;/a&gt; today.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quoting <a href="https://inessential.com/2025/06/13/saturday-march.html">Brent Simmons</a>:</p>
<blockquote>
<p>Chatting with my friends about how I hate these fascist assholes doesn’t do a damn thing. Protests work. (Imperfectly, sure, with no guarantees. But it sure beats not protesting.)</p></blockquote>
<p>He&rsquo;s attending <a href="https://www.nokings.org/">No Kings</a> today.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The empire strikes back</title>
      <link>https://nicolaiarocci.com/the-empire-strikes-back/</link>
      <pubDate>Sat, 14 Jun 2025 10:57:48 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-empire-strikes-back/</guid>
      <description>&lt;p&gt;Quoting straight from &lt;a href=&#34;https://notes.jim-nielsen.com/#2025-06-13T0927&#34;&gt;Jim Nielsen&amp;rsquo;s note&lt;/a&gt; on LLM training on copyrighted data:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a broke teenager, the web was this strange wonderland where you could access all kinds of copyrighted material using tools developed by fringe individuals/communities: Napster, Kazaa, Torrents, Usenet, etc. These tools (at least in the beginning) weren’t really made for profit, just to subvert the gatekeepers (and yeah, steal their profits).&lt;/p&gt;
&lt;p&gt;Now — in a strange twist of irony — things seem to have flipped:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quoting straight from <a href="https://notes.jim-nielsen.com/#2025-06-13T0927">Jim Nielsen&rsquo;s note</a> on LLM training on copyrighted data:</p>
<blockquote>
<p>As a broke teenager, the web was this strange wonderland where you could access all kinds of copyrighted material using tools developed by fringe individuals/communities: Napster, Kazaa, Torrents, Usenet, etc. These tools (at least in the beginning) weren’t really made for profit, just to subvert the gatekeepers (and yeah, steal their profits).</p>
<p>Now — in a strange twist of irony — things seem to have flipped:</p>
<ul>
<li>1999: Individuals use digital tools to steal intellectual property from corporations.</li>
<li>2025: Corporations use digital tools to steal intellectual property from individuals.</li>
</ul>
<p>The empire strikes back.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Exploration by Calibro 35</title>
      <link>https://nicolaiarocci.com/exploration-by-calibro-35/</link>
      <pubDate>Fri, 13 Jun 2025 15:38:08 +0200</pubDate>
      <guid>https://nicolaiarocci.com/exploration-by-calibro-35/</guid>
      <description>&lt;p&gt;Calibro 35&amp;rsquo;s Exploration, their latest album that I have just purchased, supremely fits and redefines the instrumental jazz-funk genre, adding a firm pinch of &amp;ldquo;vintage futurism,&amp;rdquo; as they call it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We were born with our heads facing forward and our eyes looking backward toward the future and the past. We have always struggled more with the present.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;A review that makes them justice and includes a concise yet well-done listening guide is on &lt;a href=&#34;https://faroutmagazine.co.uk/calibro-35-exploration-album-review/&#34;&gt;Far Out&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Calibro 35&rsquo;s Exploration, their latest album that I have just purchased, supremely fits and redefines the instrumental jazz-funk genre, adding a firm pinch of &ldquo;vintage futurism,&rdquo; as they call it.</p>
<blockquote>
<p>We were born with our heads facing forward and our eyes looking backward toward the future and the past. We have always struggled more with the present.</p></blockquote>
<p>A review that makes them justice and includes a concise yet well-done listening guide is on <a href="https://faroutmagazine.co.uk/calibro-35-exploration-album-review/">Far Out</a>.</p>
<p>I&rsquo;m excited to see them live in <a href="https://dice.fm/event/yokb7a-calibro-35-3rd-sep-rocca-malatestiana-cesena-tickets">September</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Agentic coding recommendations</title>
      <link>https://nicolaiarocci.com/agentic-coding-recommendations/</link>
      <pubDate>Thu, 12 Jun 2025 18:15:42 +0200</pubDate>
      <guid>https://nicolaiarocci.com/agentic-coding-recommendations/</guid>
      <description>&lt;p&gt;Armin Ronacher is on a roll. He just published his &lt;a href=&#34;https://lucumr.pocoo.org/2025/6/12/agentic-coding/&#34;&gt;Agentic Coding Reccomendations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On the topic of Agenting Coding he recently published:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://lucumr.pocoo.org/2025/6/4/changes/&#34;&gt;AI Changes Everything&lt;/a&gt; (you should read it)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://lucumr.pocoo.org/2025/6/10/genai-criticism/&#34;&gt;GenAI Criticism and Moral Quandaries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both already &lt;a href=&#34;http://localhost:1313/ai-changes-everything/&#34;&gt;reported&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Armin Ronacher is on a roll. He just published his <a href="https://lucumr.pocoo.org/2025/6/12/agentic-coding/">Agentic Coding Reccomendations</a>.</p>
<p>On the topic of Agenting Coding he recently published:</p>
<ul>
<li><a href="https://lucumr.pocoo.org/2025/6/4/changes/">AI Changes Everything</a> (you should read it)</li>
<li><a href="https://lucumr.pocoo.org/2025/6/10/genai-criticism/">GenAI Criticism and Moral Quandaries</a></li>
</ul>
<p>Both already <a href="http://localhost:1313/ai-changes-everything/">reported</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MCP or connecting our apps to LLMs</title>
      <link>https://nicolaiarocci.com/mcp-or-connecting-our-apps-to-llms/</link>
      <pubDate>Thu, 12 Jun 2025 09:23:46 +0200</pubDate>
      <guid>https://nicolaiarocci.com/mcp-or-connecting-our-apps-to-llms/</guid>
      <description>&lt;p&gt;Last night, I presented a session titled &lt;a href=&#34;https://www.meetup.com/devromagna/events/308179204/&#34;&gt;MCP or Connecting our Apps to LLMs&lt;/a&gt; at DevRomagna, our local developer&amp;rsquo;s community, and I think it went well.&lt;/p&gt;
&lt;p&gt;I had intended to record the audio with the idea of transcribing it with MacWhisper and then publishing it here on my site, but I forgot to do so, which is a pity.&lt;/p&gt;
&lt;p&gt;The session lasted almost two hours (I had thought it would take less time), during which I deviated somewhat from the script, using slides as a guide that were essentially an adaptation of the notes I had taken during my experiments. I showed the code for the MCP servers I created (stdio and streamable HTTP transports), demonstrated the various ways to link them with LLMs (Claude Desktop, Claude Code, and VS Code), and then shared my thoughts on the entire matter.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last night, I presented a session titled <a href="https://www.meetup.com/devromagna/events/308179204/">MCP or Connecting our Apps to LLMs</a> at DevRomagna, our local developer&rsquo;s community, and I think it went well.</p>
<p>I had intended to record the audio with the idea of transcribing it with MacWhisper and then publishing it here on my site, but I forgot to do so, which is a pity.</p>
<p>The session lasted almost two hours (I had thought it would take less time), during which I deviated somewhat from the script, using slides as a guide that were essentially an adaptation of the notes I had taken during my experiments. I showed the code for the MCP servers I created (stdio and streamable HTTP transports), demonstrated the various ways to link them with LLMs (Claude Desktop, Claude Code, and VS Code), and then shared my thoughts on the entire matter.</p>
<p>I received quite a bit of feedback, both in the room and afterward, when we moved to a pub where we stayed quite late by my standards, discussing AI, LLMs, and their impact on our daily work, which we can certainly define as significant, if not massive. Everyone uses LLMs&rsquo; UIs at their job to some extent, but very few are currently into agentic coding (the idea of a future session on that topic is tempting).</p>
<p>One remarkable tool that surfaced during the pub chat is <a href="https://github.com/Cinnamon/kotaemon">Kotaemon</a>, <em>&ldquo;an open-source RAG-based tool for chatting with your documents.&rdquo;</em>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Sam Altman</title>
      <link>https://nicolaiarocci.com/quoting-sam-altman/</link>
      <pubDate>Wed, 11 Jun 2025 14:20:55 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-sam-altman/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In the 2030s, intelligence and energy—ideas, and the ability to make ideas happen—are going to become wildly abundant. These two have been the fundamental limiters on human progress for a long time; with abundant intelligence and energy (and good governance), we can theoretically have anything else.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://blog.samaltman.com/the-gentle-singularity&#34;&gt;Sam Altman&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>In the 2030s, intelligence and energy—ideas, and the ability to make ideas happen—are going to become wildly abundant. These two have been the fundamental limiters on human progress for a long time; with abundant intelligence and energy (and good governance), we can theoretically have anything else.</p></blockquote>
<p>&ndash; <a href="https://blog.samaltman.com/the-gentle-singularity">Sam Altman</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>People won&#39;t use IDEs anymore</title>
      <link>https://nicolaiarocci.com/people-wont-use-ides-anymore/</link>
      <pubDate>Tue, 10 Jun 2025 18:11:36 +0200</pubDate>
      <guid>https://nicolaiarocci.com/people-wont-use-ides-anymore/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m just back from watching &lt;a href=&#34;https://www.youtube.com/live/6eBSHbLKuN0&#34;&gt;Mastering Claude Code in 30 Minutes&lt;/a&gt;, a talk by Boris Cherny, who, I learned, created Claude Code. I was struck by Boris&amp;rsquo;s reply to one question from the crowd:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hey, why did you build a CLI tool instead of an IDE?&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yeah, it&amp;rsquo;s a good question. There are two reasons. We started this at Anthropic, where people use a broad range of IDEs. Some people use VS code. Other people use Zed, Xcode, Vim, or Emacs. And it was just hard to build something that works for everyone. And so the terminal is just the common denominator. The second thing is that at Anthropic, we see firsthand how quickly the model is improving. &lt;strong&gt;I think there&amp;rsquo;s a good chance that by the end of the year, people won&amp;rsquo;t use IDEs&lt;/strong&gt;. And so, we want to prepare for this future and avoid over-investing in UI and other layers on top. Given the way the models are progressing, it may not be practical to work on them soon.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m just back from watching <a href="https://www.youtube.com/live/6eBSHbLKuN0">Mastering Claude Code in 30 Minutes</a>, a talk by Boris Cherny, who, I learned, created Claude Code. I was struck by Boris&rsquo;s reply to one question from the crowd:</p>
<p><em>Hey, why did you build a CLI tool instead of an IDE?</em></p>
<blockquote>
<p>Yeah, it&rsquo;s a good question. There are two reasons. We started this at Anthropic, where people use a broad range of IDEs. Some people use VS code. Other people use Zed, Xcode, Vim, or Emacs. And it was just hard to build something that works for everyone. And so the terminal is just the common denominator. The second thing is that at Anthropic, we see firsthand how quickly the model is improving. <strong>I think there&rsquo;s a good chance that by the end of the year, people won&rsquo;t use IDEs</strong>. And so, we want to prepare for this future and avoid over-investing in UI and other layers on top. Given the way the models are progressing, it may not be practical to work on them soon.</p></blockquote>
<p>Well, that&rsquo;s one fascinating bold statement right there. It aligns with a vision I&rsquo;ve had for a while: in a not-too-distant future, people will use LLM UIs (think Claude.ai with plug-and-play MCP support and voice recognition<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> both built in) as their primary interface instead of many different, specialized applications, at least for most use cases.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>One remarkable suggestion from the talk is to use macOS voice dictation instead of typing prompts to Claude Code.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>What happens when people don&#39;t understand how AI works</title>
      <link>https://nicolaiarocci.com/what-happens-when-people-dont-understand-how-ai-works/</link>
      <pubDate>Mon, 09 Jun 2025 14:32:13 +0200</pubDate>
      <guid>https://nicolaiarocci.com/what-happens-when-people-dont-understand-how-ai-works/</guid>
      <description>Despite what tech CEOs might say, large language models are not smart in any recognizably human sense of the word.</description>
      <content:encoded><![CDATA[<p>This week&rsquo;s obligatory yet solid warning about the misunderstanding of LLMs comes from Tyler Austin Harper&rsquo;s <a href="https://archive.is/NJ9K0#selection-615.3-617.19">What Happens When People Don&rsquo;t Understand How AI Works</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why Bell Labs worked</title>
      <link>https://nicolaiarocci.com/why-bell-labs-worked/</link>
      <pubDate>Sat, 07 Jun 2025 12:33:38 +0200</pubDate>
      <guid>https://nicolaiarocci.com/why-bell-labs-worked/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://1517.substack.com/p/why-bell-labs-worked&#34;&gt;Why Bell Labs Worked&lt;/a&gt; is a fascinating, evocative read.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We live in a metrics obsessed culture that is obsessed with narrowly defined productivity. There&amp;rsquo;s too much focus on accountability and too little focus on creativity. The reason why we don&amp;rsquo;t have Bell Labs is because we&amp;rsquo;re unwilling to do what it takes to create Bell Labs — giving smart people radical freedom and autonomy. The freedom to waste time. The freedom to waste resources. And the autonomy to decide how.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://1517.substack.com/p/why-bell-labs-worked">Why Bell Labs Worked</a> is a fascinating, evocative read.</p>
<blockquote>
<p>We live in a metrics obsessed culture that is obsessed with narrowly defined productivity. There&rsquo;s too much focus on accountability and too little focus on creativity. The reason why we don&rsquo;t have Bell Labs is because we&rsquo;re unwilling to do what it takes to create Bell Labs — giving smart people radical freedom and autonomy. The freedom to waste time. The freedom to waste resources. And the autonomy to decide how.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Being fat is a trap</title>
      <link>https://nicolaiarocci.com/being-fat-is-a-trap/</link>
      <pubDate>Sat, 07 Jun 2025 11:47:46 +0200</pubDate>
      <guid>https://nicolaiarocci.com/being-fat-is-a-trap/</guid>
      <description>&lt;p&gt;Federico Pereiro&amp;rsquo;s &lt;a href=&#34;https://federicopereiro.com/fat-trap/&#34;&gt;Being Fat is a Trap&lt;/a&gt; is, I think, a great piece of advice. Way more people than I wish who are close to me are struggling with eating disorders of all kinds, so I&amp;rsquo;m sensible about the topic.&lt;/p&gt;
&lt;p&gt;This sentence, in particular, rings true in an aching way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Judging people inside the fat trap just intensifies their misery and reduces the odds they can get out of it.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>Federico Pereiro&rsquo;s <a href="https://federicopereiro.com/fat-trap/">Being Fat is a Trap</a> is, I think, a great piece of advice. Way more people than I wish who are close to me are struggling with eating disorders of all kinds, so I&rsquo;m sensible about the topic.</p>
<p>This sentence, in particular, rings true in an aching way:</p>
<blockquote>
<p>Judging people inside the fat trap just intensifies their misery and reduces the odds they can get out of it.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Claude Code first impressions</title>
      <link>https://nicolaiarocci.com/claude-code-first-impressions/</link>
      <pubDate>Thu, 05 Jun 2025 18:02:55 +0200</pubDate>
      <guid>https://nicolaiarocci.com/claude-code-first-impressions/</guid>
      <description>&lt;p&gt;Since yesterday, Claude Code has been included in the Pro subscription we&amp;rsquo;re signed up for. I&amp;rsquo;d been wanting to try it for a while, and now nothing was stopping me. Only yesterday (a curious coincidence), I read &lt;a href=&#34;https://nicolaiarocci.com/ai-changes-everything/&#34;&gt;AI Changes Everything&lt;/a&gt; by Armin Ronacher, which gave me a glimpse of the potential and made my hands itch to try it.&lt;/p&gt;
&lt;p&gt;The initialization of Claude on the repository surprised me; the analysis (reported in CLAUDE.md) is thorough and reveals a good understanding of the project, including both the code and the general functioning, strategies, techniques, technologies and libraries employed.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Since yesterday, Claude Code has been included in the Pro subscription we&rsquo;re signed up for. I&rsquo;d been wanting to try it for a while, and now nothing was stopping me. Only yesterday (a curious coincidence), I read <a href="/ai-changes-everything/">AI Changes Everything</a> by Armin Ronacher, which gave me a glimpse of the potential and made my hands itch to try it.</p>
<p>The initialization of Claude on the repository surprised me; the analysis (reported in CLAUDE.md) is thorough and reveals a good understanding of the project, including both the code and the general functioning, strategies, techniques, technologies and libraries employed.</p>
<p>I asked Claude to generate a test suite from scratch, and it did so rather effortlessly (it went back and forth a few times, and it is fascinating following its reasoning and attempts from a distance). Claude added the tests to the existing project, a big no-no for me. I asked it to go back and create a dedicated test project, and it complied, adding the new project to the solution. It took several iterations to achieve a good result. We now have 134 tests that cover 98% of the project&rsquo;s business logic. Upon request, Claude also added code coverage by installing the missing tools.</p>
<p>Once satisfied with the test suite and having committed and pushed (via Claude) the work done, I asked Claude to set up a GitHub Action to run the tests on every push, then to update the existing workflows (container build; deployment to test or production; etc.) so they all run tests first.</p>
<p>In half a day of work, during which I mostly did other things, such as helping a colleague while Claude was chugging away, I achieved what would have taken me a week or even just a few days.</p>
<p>I have very little to complain about in terms of code quality, and where I wasn&rsquo;t satisfied, I informed Claude and the unsatisfying code was quickly and pleasantly refactored. However, some refactoring is better done with Rider because it&rsquo;s faster, doesn&rsquo;t miss anything (like Claude tends to do if there are multiple similar refactorings to be done and they are scattered across various files) and doesn&rsquo;t waste tokens that count toward usage limits (with the Pro subscription, we have access to a lighter tier of Claude Code. You want the Max subscription for unlimited - or higher anyway- ceiling).</p>
<p>One valuable feature is memory. You can have Claude memorize directives. This memory can be local to the repo or global. I instructed Claude to prefer collection expressions and utilize C#&rsquo;s new targeted-type initialization feature, among other things, which were duly noted. I then asked Claude to refactor in light of the new directives, and it did. New code is now produced according to my preferences, and it will be on all my projects.</p>
<p>A thorough code review is always necessary, of course, but wouldn&rsquo;t you do that for any code coming into your project?</p>
<p>Color me impressed so far. Copying and pasting from LLM&rsquo;s web UIs is already a thing of the past. The present is all about agents, and they&rsquo;re just getting started.</p>
]]></content:encoded>
    </item>
    <item>
      <title>When to leave</title>
      <link>https://nicolaiarocci.com/when-to-leave/</link>
      <pubDate>Thu, 05 Jun 2025 14:47:06 +0200</pubDate>
      <guid>https://nicolaiarocci.com/when-to-leave/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Knowing when to leave might be more important than knowing when to show up.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; kupajo in &lt;a href=&#34;https://kupajo.com/when-to-leave/&#34;&gt;When to Leave&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Knowing when to leave might be more important than knowing when to show up.</p></blockquote>
<p>&ndash; kupajo in <a href="https://kupajo.com/when-to-leave/">When to Leave</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>AI changes everything</title>
      <link>https://nicolaiarocci.com/ai-changes-everything/</link>
      <pubDate>Wed, 04 Jun 2025 15:21:21 +0200</pubDate>
      <guid>https://nicolaiarocci.com/ai-changes-everything/</guid>
      <description>&lt;p&gt;Today&amp;rsquo;s Armin Ronacher&amp;rsquo;s &lt;a href=&#34;https://lucumr.pocoo.org/2025/6/4/changes/&#34;&gt;AI Changes Everything&lt;/a&gt; strongly resonates with me&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;. I may not be using Claude Code as a daily driver as he now does, but I&amp;rsquo;ve slowly and steadily introduced large language models (LLMs) into my routine, and I&amp;rsquo;m reaping the benefits.&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t the purpose of his article, but I wish Armin had gone into the details of how, why, and when he delegates tasks to Claude Code.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; Armin later a &lt;a href=&#34;https://lucumr.pocoo.org/2025/6/10/genai-criticism/&#34;&gt;follow-up&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today&rsquo;s Armin Ronacher&rsquo;s <a href="https://lucumr.pocoo.org/2025/6/4/changes/">AI Changes Everything</a> strongly resonates with me<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I may not be using Claude Code as a daily driver as he now does, but I&rsquo;ve slowly and steadily introduced large language models (LLMs) into my routine, and I&rsquo;m reaping the benefits.</p>
<p>It wasn&rsquo;t the purpose of his article, but I wish Armin had gone into the details of how, why, and when he delegates tasks to Claude Code.</p>
<p><em>Update:</em> Armin later a <a href="https://lucumr.pocoo.org/2025/6/10/genai-criticism/">follow-up</a>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://fly.io/blog/youre-all-nuts/">My AI Skeptic Friends All Nuts</a>, linked in Armin&rsquo;s piece, is also worth reading.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Moving On</title>
      <link>https://nicolaiarocci.com/moving-on/</link>
      <pubDate>Wed, 04 Jun 2025 09:00:17 +0200</pubDate>
      <guid>https://nicolaiarocci.com/moving-on/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://minutestomidnight.co.uk/blog/moving-on/&#34;&gt;Moving On&lt;/a&gt;, Simone Silvestroni recounts how he moved away from the Apple ecosystem.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a move I&amp;rsquo;ve been contemplating for some time. Like Simone, I use Linux at work daily so that the task wouldn&amp;rsquo;t be too much of a stretch, but I&amp;rsquo;m probably too lazy (or too old) to execute it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In <a href="https://minutestomidnight.co.uk/blog/moving-on/">Moving On</a>, Simone Silvestroni recounts how he moved away from the Apple ecosystem.</p>
<p>It&rsquo;s a move I&rsquo;ve been contemplating for some time. Like Simone, I use Linux at work daily so that the task wouldn&rsquo;t be too much of a stretch, but I&rsquo;m probably too lazy (or too old) to execute it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Run your own AI</title>
      <link>https://nicolaiarocci.com/run-your-own-ai/</link>
      <pubDate>Wed, 04 Jun 2025 08:43:28 +0200</pubDate>
      <guid>https://nicolaiarocci.com/run-your-own-ai/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://anthonylewis.com/2025/06/01/run-your-own-ai/&#34;&gt;Run Your Own AI&lt;/a&gt;&lt;/strong&gt; by Anthony Lewis is a concise tutorial on how to run large language models on your laptop from the command line via &lt;a href=&#34;https://simonwillison.net/2025/Feb/15/llm-mlx/&#34;&gt;llm-mlx&lt;/a&gt;. It focuses on Macs M-series, but it&amp;rsquo;s also suitable for other hardware. Saving it here for a friend.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><a href="https://anthonylewis.com/2025/06/01/run-your-own-ai/">Run Your Own AI</a></strong> by Anthony Lewis is a concise tutorial on how to run large language models on your laptop from the command line via <a href="https://simonwillison.net/2025/Feb/15/llm-mlx/">llm-mlx</a>. It focuses on Macs M-series, but it&rsquo;s also suitable for other hardware. Saving it here for a friend.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.2.1</title>
      <link>https://nicolaiarocci.com/eve-2.2.1/</link>
      <pubDate>Tue, 03 Jun 2025 15:16:43 +0200</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.2.1/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pypi.org/project/Eve/2.2.1/&#34;&gt;Eve v2.2.1&lt;/a&gt; was just released on PyPI. It is a minor upgrade, but it includes a remarkable performance increase contributed by &lt;a href=&#34;https://github.com/pyeve/eve/pull/1553&#34;&gt;Alexander Urieles&lt;/a&gt;. Also, thanks to &lt;a href=&#34;https://github.com/pyeve/eve/pull/1547&#34;&gt;Svante Bengtson&lt;/a&gt; and &lt;a href=&#34;https://github.com/pyeve/eve/pull/1541&#34;&gt;Pablo Parada&lt;/a&gt; for their help with this release.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://pypi.org/project/Eve/2.2.1/">Eve v2.2.1</a> was just released on PyPI. It is a minor upgrade, but it includes a remarkable performance increase contributed by <a href="https://github.com/pyeve/eve/pull/1553">Alexander Urieles</a>. Also, thanks to <a href="https://github.com/pyeve/eve/pull/1547">Svante Bengtson</a> and <a href="https://github.com/pyeve/eve/pull/1541">Pablo Parada</a> for their help with this release.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Serra Pass along the pilgrims&#39; route</title>
      <link>https://nicolaiarocci.com/serra-pass-along-the-pilgrims-route/</link>
      <pubDate>Mon, 02 Jun 2025 11:26:40 +0200</pubDate>
      <guid>https://nicolaiarocci.com/serra-pass-along-the-pilgrims-route/</guid>
      <description>&lt;p&gt;From Corezzo, a short hiking loop along the park&amp;rsquo;s oldest mule tracks.&lt;/p&gt;
&lt;p&gt;The Serra Pass mule track is one of the most fascinating in the entire Casentino territory, if only for the tangible memory of the millions of feet that have trodden, traveled, and worn it down over the centuries. It connected – and still connects – the upper Savio valley with that of Corsalone, branching off from the Romagna valley floor near the Gualchiere (about 2 km south of Bagno di Romagna) and climbing up the Nasseto ridge to reach the summit ridge at a pass that isn&amp;rsquo;t exactly low (1,150 m), but evidently &amp;ldquo;convenient&amp;rdquo; for other reasons, given that its use is documented as early as prehistoric times and experienced an intense period with medieval pilgrimages directed to Rome and later to La Verna.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>From Corezzo, a short hiking loop along the park&rsquo;s oldest mule tracks.</p>
<p>The Serra Pass mule track is one of the most fascinating in the entire Casentino territory, if only for the tangible memory of the millions of feet that have trodden, traveled, and worn it down over the centuries. It connected – and still connects – the upper Savio valley with that of Corsalone, branching off from the Romagna valley floor near the Gualchiere (about 2 km south of Bagno di Romagna) and climbing up the Nasseto ridge to reach the summit ridge at a pass that isn&rsquo;t exactly low (1,150 m), but evidently &ldquo;convenient&rdquo; for other reasons, given that its use is documented as early as prehistoric times and experienced an intense period with medieval pilgrimages directed to Rome and later to La Verna.</p>
<p>This itinerary follows its best-preserved section, on the Tuscan side, from the mountain hamlet of Serra to the pass of the same name, among remnants of ancient stone paving where one seems to still perceive that &ldquo;incessant wearing of steps&rdquo; of pilgrims who descended from the Alps to reach the hospitals of Serra and Scapruggine, now safe from the dangers and storms of the ridge.</p>
<figure>
    <img loading="lazy" src="/images/passo-serra3.jpg"
         alt="One good reason for late spring hiking: blossom."/> <figcaption>
            <p>One good reason for late spring hiking: blossom.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/passo-serra2.jpg"
         alt="The beech forest high on the Apennine ridge. As expected, this was the only section where I encountered anyone."/> <figcaption>
            <p>The beech forest high on the Apennine ridge. As expected, this was the only section where I encountered anyone.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/passo-serra1.jpg"
         alt="On the way back, downhill, there are clearings that were probably once cultivated fields."/> <figcaption>
            <p>On the way back, downhill, there are clearings that were probably once cultivated fields.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/passo-serra4.jpg"
         alt="In the distance, on the left, you can see the roofs of the village of Corezzo, the starting point and return point of the tour."/> <figcaption>
            <p>In the distance, on the left, you can see the roofs of the village of Corezzo, the starting point and return point of the tour.</p>
        </figcaption>
</figure>

<p>This trip was also an opportunity to take a ride on my motorcycle. The combination of motorcycling and hiking is not easy to pull off, especially with a classic bike like mine, but it&rsquo;s worth it as it combines two of my passions.</p>
<p>GPX track available <a href="https://out.ac/IPUfvn">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Foresta della Lama</title>
      <link>https://nicolaiarocci.com/foresta-della-lama/</link>
      <pubDate>Thu, 22 May 2025 09:54:02 +0200</pubDate>
      <guid>https://nicolaiarocci.com/foresta-della-lama/</guid>
      <description>&lt;p&gt;I went hiking in my beloved &lt;a href=&#34;https://www.parcoforestecasentinesi.it/en&#34;&gt;Foreste Casentinesi National Park&lt;/a&gt; a few weeks ago. This trip has been on my radar for a long time, a circular tour of incomparable beauty among wild environments like very few others in the area. Among the many ways to reach the &lt;a href=&#34;https://www.parcoforestecasentinesi.it/en/multimedia/interactive-map/place-to-visit/la-lama&#34;&gt;La Lama&lt;/a&gt;, it is undoubtedly the best way to visit the ancient forests surrounding the beautiful, partly marshy plateau between rocky crags. The initial detour to Mount Penna is motivated by the rare panoramic view, perhaps the most beautiful in the entire park, as if from a wide-open balcony overlooking the sea of forests below.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I went hiking in my beloved <a href="https://www.parcoforestecasentinesi.it/en">Foreste Casentinesi National Park</a> a few weeks ago. This trip has been on my radar for a long time, a circular tour of incomparable beauty among wild environments like very few others in the area. Among the many ways to reach the <a href="https://www.parcoforestecasentinesi.it/en/multimedia/interactive-map/place-to-visit/la-lama">La Lama</a>, it is undoubtedly the best way to visit the ancient forests surrounding the beautiful, partly marshy plateau between rocky crags. The initial detour to Mount Penna is motivated by the rare panoramic view, perhaps the most beautiful in the entire park, as if from a wide-open balcony overlooking the sea of forests below.</p>
<p>GPX track and details available <a href="https://www.outdooractive.com/en/route/hiking-trail/province-of-arezzo/foresta-della-lama-dal-passo-fangacci-vetta-monte-penna-passo-crocina/284294969/">here</a>.</p>
<figure>
    <img loading="lazy" src="/images/lama1.jpg"
         alt="The view from Monte Penna summit. You can see the Ridracoli Lake in the distance."/> <figcaption>
            <p>The view from Monte Penna summit. You can see the Ridracoli Lake in the distance.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/lama2.jpg"
         alt="La Lama is a partly marshy plateau between rock cargs, filled with its peculiar Black Alders"/> <figcaption>
            <p>La Lama is a partly marshy plateau between rock cargs, filled with its peculiar Black Alders</p>
        </figcaption>
</figure>

<p><figure>
    <img loading="lazy" src="/images/lama3.jpg"
         alt="La Lama is crossed by several, crystal-clear streams."/> <figcaption>
            <p>La Lama is crossed by several, crystal-clear streams.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/lama4.jpg"
         alt="The magnificent beech forest that covers the area, at this time graced by the bloom of wild garlic."/> <figcaption>
            <p>The magnificent beech forest that covers the area, at this time graced by the bloom of wild garlic.</p>
        </figcaption>
</figure>
</p>
<p>The day was bright and perfect, and everything went well. The highlight of the day was testing the Garmin InReach, and La Lama is the ideal place to test such an item since you have no cell signal. I sent and received text messages via satellite with Serena. The messages are geo-localized. You are no longer isolated; it works anywhere worldwide, and you can issue an SOS call anytime. Garmin will contact Mountain Rescue or equivalent service anywhere. As I have recently re-enrolled in <a href="https://en.wikipedia.org/wiki/Club_Alpino_Italiano">CAI</a>, social insurance should also cover any extraction intervention. I am very pleased with this setup; safety has increased dramatically. I have gone and come back on my motorcycle.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica v3.6.3</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-v3.6.3/</link>
      <pubDate>Tue, 06 May 2025 09:49:13 +0200</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-v3.6.3/</guid>
      <description>&lt;p&gt;I just released &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronica/3.6.3&#34;&gt;FatturaElettronica .NET v3.6.3&lt;/a&gt;. Since version 3.6.1, the project has added English to the list of supported languages. The latest release improves English support, aligning it with the official translation. Michael Mairegger &lt;a href=&#34;https://github.com/FatturaElettronica/FatturaElettronica.NET/pull/432&#34;&gt;contributed&lt;/a&gt; this improvement.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://fatturaelettronicaopensource.org&#34;&gt;Fattura Elettronica&lt;/a&gt; open-source project allows for the validation and de/serialization of electronic invoices that adhere to the standard defined by the Italian Revenue Agency.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just released <a href="https://www.nuget.org/packages/FatturaElettronica/3.6.3">FatturaElettronica .NET v3.6.3</a>. Since version 3.6.1, the project has added English to the list of supported languages. The latest release improves English support, aligning it with the official translation. Michael Mairegger <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET/pull/432">contributed</a> this improvement.</p>
<p>The <a href="https://fatturaelettronicaopensource.org">Fattura Elettronica</a> open-source project allows for the validation and de/serialization of electronic invoices that adhere to the standard defined by the Italian Revenue Agency.</p>
]]></content:encoded>
    </item>
    <item>
      <title>It is moments like this</title>
      <link>https://nicolaiarocci.com/it-is-moments-like-this/</link>
      <pubDate>Sat, 12 Apr 2025 07:54:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/it-is-moments-like-this/</guid>
      <description>&lt;p&gt;I presented at &lt;a href=&#34;https://www.dotnetconf.it&#34;&gt;.NET Conf Rome 2025&lt;/a&gt; yesterday, and it went very well, or at least that was my impression. I enjoyed myself, and the reception seemed great, from the organizers, the other speakers (most of whom are fellow MVPs), and the audience.&lt;/p&gt;
&lt;p&gt;But the kicker was just before the session when, at the coffee break, an attendant approached me to shake hands and tell me he had known me for a long time because he discovered and used &lt;a href=&#34;https://python-eve.org&#34;&gt;Eve&lt;/a&gt; in a research project he was working on years ago. As I recall, he had attended one of my Eve sessions at EuroPython, maybe in Berlin in 2014. As is often the case, he had no immediate need for my project and shelved it as &amp;ldquo;interesting, and cool that it&amp;rsquo;s by an Italian author, but I don&amp;rsquo;t need really it&amp;rdquo;. Then, a couple of years later, in a time of need, he recalled that little presentation of mine, and, long story short, Eve ended up being adopted by a big, unnamed corp or research institute. I thanked him from the bottom of my heart and told him it was worth preparing for the talk, waking up at 4 am and travelling to Rome to meet him and hear his story. It&amp;rsquo;s moments like this that make it all worth it. Also, hearing such a Python story at a .NET event was unexpected.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I presented at <a href="https://www.dotnetconf.it">.NET Conf Rome 2025</a> yesterday, and it went very well, or at least that was my impression. I enjoyed myself, and the reception seemed great, from the organizers, the other speakers (most of whom are fellow MVPs), and the audience.</p>
<p>But the kicker was just before the session when, at the coffee break, an attendant approached me to shake hands and tell me he had known me for a long time because he discovered and used <a href="https://python-eve.org">Eve</a> in a research project he was working on years ago. As I recall, he had attended one of my Eve sessions at EuroPython, maybe in Berlin in 2014. As is often the case, he had no immediate need for my project and shelved it as &ldquo;interesting, and cool that it&rsquo;s by an Italian author, but I don&rsquo;t need really it&rdquo;. Then, a couple of years later, in a time of need, he recalled that little presentation of mine, and, long story short, Eve ended up being adopted by a big, unnamed corp or research institute. I thanked him from the bottom of my heart and told him it was worth preparing for the talk, waking up at 4 am and travelling to Rome to meet him and hear his story. It&rsquo;s moments like this that make it all worth it. Also, hearing such a Python story at a .NET event was unexpected.</p>
<p>Nothing gratifies me more than seeing my open-source work appreciated and actively used in the wild.</p>
<p>Special thanks to Fabio Spaziani and the whole DotNetCode team for accomodating for my &ldquo;daily commuter from afar&rdquo; special needs.</p>
<p><img loading="lazy" src="/images/dotnetconf2025.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>The Literary Power of Hobbits</title>
      <link>https://nicolaiarocci.com/the-literary-power-of-hobbits/</link>
      <pubDate>Mon, 07 Apr 2025 15:40:00 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-literary-power-of-hobbits/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Verlyn_Flieger&#34;&gt;Verlyn Flieger&lt;/a&gt; on the late addition of Tolkien&amp;rsquo;s most iconic characters:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hobbits were no part of Tolkien’s original plan. They entered rather late and through a side door, as the unexpected central characters in a children’s story, The Hobbit which Tolkien invented for his own children but which found an immediate and lasting worldwide audience. And of which The Lord of the Rings was the commissioned, longed-awaited and trebly successful sequel.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Verlyn_Flieger">Verlyn Flieger</a> on the late addition of Tolkien&rsquo;s most iconic characters:</p>
<blockquote>
<p>Hobbits were no part of Tolkien’s original plan. They entered rather late and through a side door, as the unexpected central characters in a children’s story, The Hobbit which Tolkien invented for his own children but which found an immediate and lasting worldwide audience. And of which The Lord of the Rings was the commissioned, longed-awaited and trebly successful sequel.</p></blockquote>
<p><em><a href="https://lithub.com/the-literary-power-of-hobbits-how-jrr-tolkien-shaped-modern-fantasy/">The Literary Power of Hobbits: How JRR Tolkien Shaped Modern Fantasy</a></em> is a good short read (<em><a href="https://www.jrrtolkien.it/2025/04/07/la-potenza-letteraria-degli-hobbit-come-j-r-r-tolkien-ha-dato-forma-al-fantasy-moderno/">via</a></em>)</p>
]]></content:encoded>
    </item>
    <item>
      <title>A 10x faster TypeScript, but that&#39;s not the point</title>
      <link>https://nicolaiarocci.com/a-10x-faster-typescript-but-thats-not-the-point/</link>
      <pubDate>Sat, 15 Mar 2025 07:47:30 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-10x-faster-typescript-but-thats-not-the-point/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Anders_Hejlsberg&#34;&gt;Anders Hejlsberg&lt;/a&gt; is a legend in my field, with Turbo Pascal, Delphi, C#, and TypeScript in his palmares. This week, he &lt;a href=&#34;https://devblogs.microsoft.com/typescript/typescript-native-port/&#34;&gt;announced&lt;/a&gt; a rewrite of the TypeScript compiler, leading to a stunning 10x performance boost. This remarkable achievement is due to two main factors: the adoption of Go for the compiler and the Language Server Protocol and the high parallelism that Go enables. Previously, the compiler itself was in TypeScript, which severely hindered performance.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Anders_Hejlsberg">Anders Hejlsberg</a> is a legend in my field, with Turbo Pascal, Delphi, C#, and TypeScript in his palmares. This week, he <a href="https://devblogs.microsoft.com/typescript/typescript-native-port/">announced</a> a rewrite of the TypeScript compiler, leading to a stunning 10x performance boost. This remarkable achievement is due to two main factors: the adoption of Go for the compiler and the Language Server Protocol and the high parallelism that Go enables. Previously, the compiler itself was in TypeScript, which severely hindered performance.</p>
<p>Two things strike me about this story.</p>
<p>The <a href="https://youtu.be/pNlq-EVld70?si=BOlGs8g1pwBpCEqz">video</a> is worth watching. Not so much for the content itself but for the delivery. No emphasis, special effects, marketing crap, visual tricks, or star tricks whatsoever. The strength is in the message; any addition would be a distraction. I was fortunate enough to attend a few meetings with Hejlsberg at the Microsoft Campus in Redwood, and, well, emphasis and hyperbole are certainly not his style. He&rsquo;s genuinely a down-to-heart type of guy. On the other hand, he is Danish, not American.</p>
<p>For purely business reasons, Microsoft could have forced the choice of one of its languages for the rewrite. Of course, none of those would have been ideal, least of all C# (itself a Hejlsberg creature), but corporate reasons could easily have prevailed. Hejlsberg and his team could pick the best tool for the job. Go is the lowest-level language with a GC; it compiles natively on all platforms, has great parallelism support, and you can write excellent functional code with it. It says a lot about Microsoft, the cultural shift it has managed since the late 1990s and early 2000s, and how it stays relevant today, unlike many of its competitors of those times.</p>
<p>I am concerned that by switching to Go, they will no longer dogfood the language. By their admission, maintaining that massive compiler codebase in TypeScript was instrumental in adequately developing the language. We&rsquo;ll see how that pans out now that they&rsquo;re not working TypeScript daily.</p>
<p>I&rsquo;ll end by quoting a YouTube commenter who nailed it in one sentence:</p>
<blockquote>
<p>Imagine creating several languages but still choosing a different one for your compiler rewrite because it&rsquo;s just the best tool for the job - absolute ego-less GOAT move.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Why do earthworms appear on wet roads?</title>
      <link>https://nicolaiarocci.com/why-do-earthworms-appear-on-wet-roads/</link>
      <pubDate>Fri, 14 Mar 2025 08:52:37 +0100</pubDate>
      <guid>https://nicolaiarocci.com/why-do-earthworms-appear-on-wet-roads/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s raining a lot these days, and during my early morning walk, I see many earthworms popping out of the ground and filling the sidewalks and the streets. I observed this behaviour many times in similarly wet conditions. So I asked Claude: &lt;em&gt;Why do earthworms appear on wet roads?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When it rains heavily, streets fill with earthworms for several reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Earthworms breathe through their skin, which must remain moist. During heavy rainfall, their underground tunnels flood, forcing them to surface to avoid drowning.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s raining a lot these days, and during my early morning walk, I see many earthworms popping out of the ground and filling the sidewalks and the streets. I observed this behaviour many times in similarly wet conditions. So I asked Claude: <em>Why do earthworms appear on wet roads?</em></p>
<p>When it rains heavily, streets fill with earthworms for several reasons:</p>
<ol>
<li>
<p>Earthworms breathe through their skin, which must remain moist. During heavy rainfall, their underground tunnels flood, forcing them to surface to avoid drowning.</p>
</li>
<li>
<p>The vibrations of raindrops on the soil can be mistaken by earthworms for those produced by predators like moles, causing them to flee to the surface.</p>
</li>
<li>
<p>Rainy periods are ideal for earthworms to move and find new habitats or mates, as they can travel on the moist surface without risking dehydration.</p>
</li>
<li>
<p>On paved surfaces like roads and sidewalks, water tends to accumulate more than in soil, creating conditions that attract earthworms.</p>
</li>
</ol>
<p>Unfortunately, once earthworms reach the asphalt, they often become trapped and unable to return to the soil, becoming easy prey or risking dehydration when the sun returns.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Evan Miller</title>
      <link>https://nicolaiarocci.com/quoting-evan-miller/</link>
      <pubDate>Fri, 14 Mar 2025 08:21:18 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-evan-miller/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;One of the most essential practices for maintaining the long-term quality of computer code is to write automated tests that ensure the program continues to act as expected, even when other people (including your future self) muck with it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.evanmiller.org/functional-tests-as-a-tree-of-continuations.html&#34;&gt;Evan Miller&lt;/a&gt; (&lt;em&gt;&lt;a href=&#34;https://simonwillison.net/2025/Mar/13/evan-miller/#atom-everything&#34;&gt;via&lt;/a&gt;&lt;/em&gt;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>One of the most essential practices for maintaining the long-term quality of computer code is to write automated tests that ensure the program continues to act as expected, even when other people (including your future self) muck with it.</p></blockquote>
<p>&ndash; <a href="https://www.evanmiller.org/functional-tests-as-a-tree-of-continuations.html">Evan Miller</a> (<em><a href="https://simonwillison.net/2025/Mar/13/evan-miller/#atom-everything">via</a></em>)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Jannick Sinner</title>
      <link>https://nicolaiarocci.com/quoting-jannick-sinner/</link>
      <pubDate>Sat, 08 Mar 2025 10:52:23 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-jannick-sinner/</guid>
      <description>&lt;p&gt;I just watched an &lt;a href=&#34;https://www.youtube.com/watch?v=KreEMoS0drQ&#34;&gt;incredible interview&lt;/a&gt; with legendary tennis coach Darren Cahill, now coaching Jannick Sinner. The interview is outstanding and worth watching; Cahill is remarkable and a great communicator. In the final part, they&amp;rsquo;re talking about Jannick when Cahill &lt;a href=&#34;https://www.youtube.com/watch?v=KreEMoS0drQ&amp;amp;t=3498s&#34;&gt;drops&lt;/a&gt; an incredible Jannick quote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t worry about criticism from someone you wouldn&amp;rsquo;t take advice from.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;That&amp;rsquo;s profound for a boy who&amp;rsquo;s just 23 years of age.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just watched an <a href="https://www.youtube.com/watch?v=KreEMoS0drQ">incredible interview</a> with legendary tennis coach Darren Cahill, now coaching Jannick Sinner. The interview is outstanding and worth watching; Cahill is remarkable and a great communicator. In the final part, they&rsquo;re talking about Jannick when Cahill <a href="https://www.youtube.com/watch?v=KreEMoS0drQ&amp;t=3498s">drops</a> an incredible Jannick quote:</p>
<blockquote>
<p>Don&rsquo;t worry about criticism from someone you wouldn&rsquo;t take advice from.</p></blockquote>
<p>That&rsquo;s profound for a boy who&rsquo;s just 23 years of age.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Lately</title>
      <link>https://nicolaiarocci.com/lately-2025-03-04/</link>
      <pubDate>Tue, 04 Mar 2025 17:21:32 +0100</pubDate>
      <guid>https://nicolaiarocci.com/lately-2025-03-04/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been slacking a little lately, shocked mainly by what is happening
worldwide. I&amp;rsquo;ve also been busy at work and, unfortunately, am taking my old man
to way too many medical checkups. A short recap of notable facts might be in
order.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronica/3.6.0&#34;&gt;FatturaElettronica for .NET 3.6&lt;/a&gt; has been released. It adds support for the upcoming technical specifications v1.9 that are coming into effect on April 1, 2025 (not a joke.) The changelog is &lt;a href=&#34;https://fatturaelettronicaopensource.org/docs/changelog.html#v-360&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I did some maintenance work on &lt;a href=&#34;https://python-eve.org&#34;&gt;Eve&lt;/a&gt;. The CI workflow has been switched to &lt;code&gt;ubuntu-latest&lt;/code&gt; from &lt;code&gt;20.04&lt;/code&gt;, as the latter is &lt;a href=&#34;https://github.com/actions/runner-images/issues/11101&#34;&gt;about to be sunsetted&lt;/a&gt; by GitHub. I also merged two pull requests (&lt;a href=&#34;https://github.com/pyeve/eve/pull/1541&#34;&gt;#1541&lt;/a&gt; and &lt;a href=&#34;https://github.com/pyeve/eve/pull/1547&#34;&gt;#1547&lt;/a&gt;), one of which was long-standing. There isn&amp;rsquo;t enough material for a release, although the guys who submitted the PRs might think otherwise (if that&amp;rsquo;s the case, let me know.)&lt;/li&gt;
&lt;li&gt;I ran two &lt;a href=&#34;https://www.meetup.com/devromagna/&#34;&gt;DevRomagna&lt;/a&gt; meetups. The first one was on &lt;a href=&#34;https://www.meetup.com/devromagna/events/304417824/&#34;&gt;OpenTelemetry&lt;/a&gt; and was kept by Alessandro Mengoli, of whom I&amp;rsquo;m very proud (I&amp;rsquo;ve been encouraging him to start speaking for a long time.) The second was on &lt;a href=&#34;https://www.meetup.com/devromagna/events/305974494/?eventOrigin=group_past_events&#34;&gt;Linux Containers&lt;/a&gt; but before Docker. The speaker was Gabriele Santomaggio, my go-to buddy regarding low-level networking stuff. I found both events to be quite successful and enjoyable. I hope the other attendants agree.&lt;/li&gt;
&lt;li&gt;I finally deactivated my Twitter/X account. I abandoned the platform a &lt;a href=&#34;https://nicolaiarocci.com/im-leaving-twitter/x/&#34;&gt;while ago&lt;/a&gt; and did not miss it. I maintain a presence on Mastodon and Bluesky, mainly to propagate whatever content I post on my website, but don&amp;rsquo;t count on me following or reading you there (same with LinkedIn.) I&amp;rsquo;m not active on social media and don&amp;rsquo;t see myself getting back into them. I&amp;rsquo;m not interested anymore (and the content there is mostly trash.)&lt;/li&gt;
&lt;li&gt;I went on &lt;a href=&#34;https://out.ac/IPUdpG&#34;&gt;a nice hike&lt;/a&gt; a couple of weeks ago. It was cold and overcast, and that&amp;rsquo;s why, I suspect, I did not meet a single person the whole day.&lt;/li&gt;
&lt;li&gt;Speaking of hiking, I finally got myself a Garmin inReach Mini 2 device. It&amp;rsquo;s meant to be used in case of emergency. It allows me to call for help  and send sms messages even when no cell signal is available (it uses the Iridium satellite network.) I resisted getting it so far because of the high cost, not so much of the device itself, but the mandatory subscription. Only &lt;a href=&#34;https://youtu.be/Hv7cH_oShbw?si=KTYHBBuR5frjJMxU&#34;&gt;recently&lt;/a&gt;, I found that one can buy Garmin data plans from other vendors, and &lt;a href=&#34;https://www.protegear.de/en-gb/inreach-dataplans&#34;&gt;ProteGear&lt;/a&gt; has a nice option to suspend the subscription when not in use. So, I bought the device from Garmin, activated it, and subscribed to ProteGear. It&amp;rsquo;s looking good so far, and sending sms messages (and emails!) when there&amp;rsquo;s no cell signal feels like black magic.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve been reading &lt;a href=&#34;https://nicolaiarocci.com/books-i-have-read&#34;&gt;good books&lt;/a&gt;, and I&amp;rsquo;m grateful for them.&lt;/li&gt;
&lt;li&gt;Well, my dad is not doing well. He&amp;rsquo;s okay now, but he&amp;rsquo;s been going through a lot, and more is expected soon. That&amp;rsquo;s life, I know.&lt;/li&gt;
&lt;li&gt;I am having difficulty making peace with what is happening in the world right now. American friends, I cannot understand how you could re-elect Donald Trump for a second term. It beats me. I am in shock and worried about the geopolitical consequences. I hope time will prove me wrong, but the future looks grim.&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been slacking a little lately, shocked mainly by what is happening
worldwide. I&rsquo;ve also been busy at work and, unfortunately, am taking my old man
to way too many medical checkups. A short recap of notable facts might be in
order.</p>
<ul>
<li><a href="https://www.nuget.org/packages/FatturaElettronica/3.6.0">FatturaElettronica for .NET 3.6</a> has been released. It adds support for the upcoming technical specifications v1.9 that are coming into effect on April 1, 2025 (not a joke.) The changelog is <a href="https://fatturaelettronicaopensource.org/docs/changelog.html#v-360">here</a>.</li>
<li>I did some maintenance work on <a href="https://python-eve.org">Eve</a>. The CI workflow has been switched to <code>ubuntu-latest</code> from <code>20.04</code>, as the latter is <a href="https://github.com/actions/runner-images/issues/11101">about to be sunsetted</a> by GitHub. I also merged two pull requests (<a href="https://github.com/pyeve/eve/pull/1541">#1541</a> and <a href="https://github.com/pyeve/eve/pull/1547">#1547</a>), one of which was long-standing. There isn&rsquo;t enough material for a release, although the guys who submitted the PRs might think otherwise (if that&rsquo;s the case, let me know.)</li>
<li>I ran two <a href="https://www.meetup.com/devromagna/">DevRomagna</a> meetups. The first one was on <a href="https://www.meetup.com/devromagna/events/304417824/">OpenTelemetry</a> and was kept by Alessandro Mengoli, of whom I&rsquo;m very proud (I&rsquo;ve been encouraging him to start speaking for a long time.) The second was on <a href="https://www.meetup.com/devromagna/events/305974494/?eventOrigin=group_past_events">Linux Containers</a> but before Docker. The speaker was Gabriele Santomaggio, my go-to buddy regarding low-level networking stuff. I found both events to be quite successful and enjoyable. I hope the other attendants agree.</li>
<li>I finally deactivated my Twitter/X account. I abandoned the platform a <a href="/im-leaving-twitter/x/">while ago</a> and did not miss it. I maintain a presence on Mastodon and Bluesky, mainly to propagate whatever content I post on my website, but don&rsquo;t count on me following or reading you there (same with LinkedIn.) I&rsquo;m not active on social media and don&rsquo;t see myself getting back into them. I&rsquo;m not interested anymore (and the content there is mostly trash.)</li>
<li>I went on <a href="https://out.ac/IPUdpG">a nice hike</a> a couple of weeks ago. It was cold and overcast, and that&rsquo;s why, I suspect, I did not meet a single person the whole day.</li>
<li>Speaking of hiking, I finally got myself a Garmin inReach Mini 2 device. It&rsquo;s meant to be used in case of emergency. It allows me to call for help  and send sms messages even when no cell signal is available (it uses the Iridium satellite network.) I resisted getting it so far because of the high cost, not so much of the device itself, but the mandatory subscription. Only <a href="https://youtu.be/Hv7cH_oShbw?si=KTYHBBuR5frjJMxU">recently</a>, I found that one can buy Garmin data plans from other vendors, and <a href="https://www.protegear.de/en-gb/inreach-dataplans">ProteGear</a> has a nice option to suspend the subscription when not in use. So, I bought the device from Garmin, activated it, and subscribed to ProteGear. It&rsquo;s looking good so far, and sending sms messages (and emails!) when there&rsquo;s no cell signal feels like black magic.</li>
<li>I&rsquo;ve been reading <a href="/books-i-have-read">good books</a>, and I&rsquo;m grateful for them.</li>
<li>Well, my dad is not doing well. He&rsquo;s okay now, but he&rsquo;s been going through a lot, and more is expected soon. That&rsquo;s life, I know.</li>
<li>I am having difficulty making peace with what is happening in the world right now. American friends, I cannot understand how you could re-elect Donald Trump for a second term. It beats me. I am in shock and worried about the geopolitical consequences. I hope time will prove me wrong, but the future looks grim.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica v3.5.2</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-v3.5.2/</link>
      <pubDate>Tue, 07 Jan 2025 11:38:52 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-v3.5.2/</guid>
      <description>&lt;p&gt;I just released &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronica/3.5.2&#34;&gt;FatturaElettronica .NET v3.5.2&lt;/a&gt;. It gets around a &lt;a href=&#34;https://github.com/advisories/GHSA-hh2w-p6rv-4g7w&#34;&gt;known CVE&lt;/a&gt; so you may want to update ASAP. The Fattura Elettronica open-source project allows for the validation and de/serialization of electronic invoices that adhere to the standard defined by the Italian Revenue Agency.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just released <a href="https://www.nuget.org/packages/FatturaElettronica/3.5.2">FatturaElettronica .NET v3.5.2</a>. It gets around a <a href="https://github.com/advisories/GHSA-hh2w-p6rv-4g7w">known CVE</a> so you may want to update ASAP. The Fattura Elettronica open-source project allows for the validation and de/serialization of electronic invoices that adhere to the standard defined by the Italian Revenue Agency.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My most used command-line commands</title>
      <link>https://nicolaiarocci.com/my-most-used-command-line-commands/</link>
      <pubDate>Wed, 01 Jan 2025 12:33:34 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-most-used-command-line-commands/</guid>
      <description>&lt;p&gt;My most used command-line commands:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;5180 &lt;code&gt;git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;777 &lt;code&gt;cd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;653 &lt;code&gt;ls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;452 &lt;code&gt;go&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;440 &lt;code&gt;./invoice&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;377 &lt;code&gt;dotnet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;373 &lt;code&gt;rm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;270 &lt;code&gt;vi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;225 &lt;code&gt;cat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;219 &lt;code&gt;ssh&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Version control dominates the scene (a gentle middle finger for the youngster - you know who you are - who told me I should not be coding anymore). I also like that the list hints at the new stuff I&amp;rsquo;ve been working on recently and am excited about.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>My most used command-line commands:</p>
<ol>
<li>5180 <code>git</code></li>
<li>777 <code>cd</code></li>
<li>653 <code>ls</code></li>
<li>452 <code>go</code></li>
<li>440 <code>./invoice</code></li>
<li>377 <code>dotnet</code></li>
<li>373 <code>rm</code></li>
<li>270 <code>vi</code></li>
<li>225 <code>cat</code></li>
<li>219 <code>ssh</code></li>
</ol>
<p>Version control dominates the scene (a gentle middle finger for the youngster - you know who you are - who told me I should not be coding anymore). I also like that the list hints at the new stuff I&rsquo;ve been working on recently and am excited about.</p>
<p>Generated with <code>history | awk '{print $2}' | sort | uniq --count | sort --numeric-sort --reverse | head -10</code> and inspired by <a href="https://www.chrisdeluca.me/2024/12/31/my-cli-wrapped-most-used.html">Chris De Luca</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Books I read in 2024</title>
      <link>https://nicolaiarocci.com/books-i-read-in-2024/</link>
      <pubDate>Thu, 26 Dec 2024 07:36:24 +0100</pubDate>
      <guid>https://nicolaiarocci.com/books-i-read-in-2024/</guid>
      <description>&lt;p&gt;I read 30 books or 8365 pages in 2024, a solid improvement over &lt;a href=&#34;https://nicolaiarocci.com/books-i-read-in-2023/&#34;&gt;last
year&lt;/a&gt;&amp;rsquo;s, and many of those books were excellent.
&lt;em&gt;Lolita&lt;/em&gt; by Vladimir Nabokov was outstanding, Marcus Aurelius&amp;rsquo; &lt;em&gt;Meditations&lt;/em&gt; was
incredible, and then there&amp;rsquo;s &lt;em&gt;Family Lexicon&lt;/em&gt; and &lt;em&gt;The garden of Finzi-Contini&lt;/em&gt;,
and many others were close to that league. Yeah, color me satisfied.&lt;/p&gt;
&lt;p&gt;The usual scoring system applies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One star means a book is meh.&lt;/li&gt;
&lt;li&gt;Two stars mean a book is perfectly fine.&lt;/li&gt;
&lt;li&gt;Three stars mean a book is good—consider it recommended.&lt;/li&gt;
&lt;li&gt;Four stars mean a book is exceptional.&lt;/li&gt;
&lt;li&gt;Five stars is pretty much unheard of.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-question-of-palestine-by-ew-said&#34;&gt;The question of Palestine, by E.W. Said&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;(La Questione Palestinese, il Saggiatore)&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I read 30 books or 8365 pages in 2024, a solid improvement over <a href="/books-i-read-in-2023/">last
year</a>&rsquo;s, and many of those books were excellent.
<em>Lolita</em> by Vladimir Nabokov was outstanding, Marcus Aurelius&rsquo; <em>Meditations</em> was
incredible, and then there&rsquo;s <em>Family Lexicon</em> and <em>The garden of Finzi-Contini</em>,
and many others were close to that league. Yeah, color me satisfied.</p>
<p>The usual scoring system applies:</p>
<ul>
<li>One star means a book is meh.</li>
<li>Two stars mean a book is perfectly fine.</li>
<li>Three stars mean a book is good—consider it recommended.</li>
<li>Four stars mean a book is exceptional.</li>
<li>Five stars is pretty much unheard of.</li>
</ul>
<h3 id="the-question-of-palestine-by-ew-said">The question of Palestine, by E.W. Said</h3>
<p><em>(La Questione Palestinese, il Saggiatore)</em></p>
<p>★★★☆☆</p>
<p>I was interested in learning about Israeli-Palestinian history from the beginning, and I wanted it told from the perspective of an Arab-Palestinian scholar and critic. In the West, we grow with Western and pro-Israeli narratives, and it is super-hard to get access to the Palestinian narration. The Palestinian Question turned out to be the ideal text. &ldquo;The tragedy of being a victim of victims.&rdquo;</p>
<h3 id="the-garden-of-the-finzi-contini-by-giorgio-bassani">The garden of the Finzi-Contini, by Giorgio Bassani</h3>
<p><em>(Il giardino dei Finzi-Contini, audiolibro)</em></p>
<p>★★★★☆</p>
<p>The Garden of the Finzi-Contini is probably the most understated and effective novel about the Holocaust. It is also a bittersweet and nostalgic tale of youth. The reconstruction of provincial life in the years immediately preceding World War II is touching, especially if one is fortunate enough to know Ferrara and its historic town center. The prose is rich, the characters are all indispensable and well-chiseled, each peculiar in his way, but some stand out, like Micol. The dialogues, never trite, often hint at unspoken yet implied meanings. Near the novel&rsquo;s end, the late-night conversation between the protagonist (whose name we never know) and his old father touched me deeply. This slow burner picks up pace as it approaches its inevitable, bitter end.</p>
<h3 id="meditations-by-marcus-aurelius">Meditations, by Marcus Aurelius</h3>
<p><em>(Pensieri, Oscar Mondadori)</em></p>
<p>★★★★☆</p>
<p>Marcus Aurelius, one of the Five Good Emperors of Rome, kept a journal to collect his thoughts about how to live well. It was not meant for the public, and in fact, it did not go public until centuries after the emperor&rsquo;s death, when it surfaced in its original Greek form, probably with missing and corrupted parts. Meditations is that journal, a work of motivational advice that inspires us in stoicism and a manual for being a complete, mature adult living a dignified, thoughtful life. Some concepts repeatedly resurface throughout the twelve books that make the text:</p>
<ul>
<li>inevitability of death</li>
<li>irrelevance of the individual no matter their importance in life</li>
<li>how to be a good man</li>
<li>forgive the defects of others</li>
<li>accept and embrace what comes at us, be it good or bad</li>
<li>live in accordance wit nature</li>
</ul>
<p>These and others were reflections and aims meant for the author, not lectures for an audience. That these thoughts came from the most powerful man in the world makes it all the more impressive. Two thousand years have passed, and humanity still struggles with the same essential topics and unanswered questions.</p>
<h3 id="lolita-by-vladimir-nabokov">Lolita, by Vladimir Nabokov</h3>
<p><em>(Lolita, audiolibro)</em></p>
<p>★★★★★</p>
<p>I read many of Nabokov&rsquo;s works but avoided reading Lolita for a long time despite its universal acclaim as his masterpiece. I was not ready to confront its obscenity. In hindsight, I cowardly feared that my admiration for the writer would be affected. However, now that I have read the book, I know it is both shocking and disturbing, yet sublime. While reading, I couldn&rsquo;t help but appreciate the author&rsquo;s audacity in publishing a text like this in 1955. It was then pointed out to me that it was easier to publish works on the topic of pedophilia during that time as compared to today<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Quoting Nabokov in his afterword to the Italian edition (Adelphi):</p>
<blockquote>
<p>Lolita does not carry any morals with it. For me, a work of fiction exists only if it provides me with what I will frankly call aesthetic voluptuousness, that is, the sense of being in touch, somehow, somewhere, with other states of being where art (curiosity, tenderness, goodness, ecstasy) is the norm. The others are topical garbage or what some call the Literature of Ideas, which very often consists of circumstantial shenanigans that are lovingly passed on from era to era in large chalk blocks until someone gives Balzac, Gorky, Mann a good hammering.</p></blockquote>
<p>I am glad to report that my admiration for the author is intact. Shoutout to Ennio Fantastichini for his exceptional audiobook reading (Ad Alta Voce, Radio Tre.)</p>
<h3 id="family-lexicon-by-natalia-ginzburg">Family Lexicon, by Natalia Ginzburg</h3>
<p><em>(Lessico Famigliare, Einaudi)</em></p>
<p>★★★★☆</p>
<p>The key to this novel is outlined already in its title. It is familiar because it tells the story of a Jewish and antifascist family, the Levi family, in Turin between the 1930s and 1950s. And Lexicon because the paths of memory pass through the recollection of phrases, idioms, and slang expressions that only existed within the family. The Levi&rsquo;s were not just an ordinary family. During those years, characters who were already or would become influential for the time passed by their house: politicians, industrialists, and intellectuals are all told from the point of view of a kid (later a girl, then a woman) who observes them from an unusual and unprejudiced angle. The years of Jewish persecution, confinement, and the postwar period are recounted without drama; the Great Story is lived daily and flows around them; they&rsquo;re impacted in significant ways, yet the focus stays on the family, its members and the many characters that revolve around it. The outstanding characters are the mother and the father; Natalia, the author, stays on the fringe, rarely seen or mentioned, if not by the last part of the book.</p>
<h3 id="under-the-volcano-by-malcom-lowry">Under the Volcano, by Malcom Lowry</h3>
<p><em>(Sotto il Vulcano, Einaudi)</em></p>
<p>★★☆☆☆</p>
<p>I gave up on this one. I wanted to like this one. I attempted it a couple of times last year, and then I tried with an audiobook, which was more engaging. However, in the end, I abandoned it again. Again, I&rsquo;m sorry because the writing is good, and the author is remarkable in their art. Nothing happens throughout the 400+ pages of this book. The plot could be summarized as primarily drunk people wandering around a small Mexican town at the foot of two volcanoes, spending much of their time brooding over an old love triangle that was never entirely forgotten.</p>
<h3 id="womens-resistance-by-benedetta-tobagi">Women&rsquo;s Resistance, by Benedetta Tobagi</h3>
<p><em>(La Resistenza delle Donne, Einaudi)</em></p>
<p>★★★☆☆</p>
<p>This book is exciting and well-written. It tells the story of the Italian Resistance from the point of view of women who participated actively in it and with an often decisive role but never really saw their merits appreciated, much less their participation recognized. The Italian Resistance was a pivotal and dramatic period of World War II, and women who chose to participate had to show even more courage and attitude than their male comrades, as in those times, women were expected to serve as mothers, wives, and housekeepers at home. War was a male affair; women leaving for the mountains to join packs of male rebels tended to be ill-reputed, and when captured, they risked far more than their male counterparts. At times, it tends a bit toward rhetoric, which is entirely excusable in this case, but even when it happens, the author quickly picks up the thread.</p>
<h3 id="the-horde-how-the-mongols-changed-the-world-by-marie-favereau">The Horde: How the Mongols Changed the World, by Marie Favereau</h3>
<p><em>(L&rsquo;Orda. Come i mongoli cambiarono il mondo, Einaudi)</em></p>
<p>★★★★☆</p>
<p>This book interested me because it offered a historically researched and accurate narrative of a historical period and geographical area I know little about: the Euro-Asiatic region between the 8th and 16th centuries, during the Mongol rule. It is a remarkable work that substantially revises and corrects the canonical image of the Mongols as ruthless and almost uncivilized rulers and conquerors. On the contrary, historical sources prove that the Mongol empire was based on flexibility, tolerance for customs, traditions and religions, integration and not assimilation, often allowing the dominant structures of the conquered territories to remain intact. The Empire offered ample and rich trade opportunities, both to the dominated and outsiders (the European, Muslim, and nonassimilated Asian powers), and thrived on the tribute it reaped from the thriving economy that resulted. The other key point of this book is the intrinsic and never-lost pure nomadic nature of the Empire, perhaps its distinguishing characteristic: Mongol leaders always remained nomadic, even as they conquered and assimilated settled civilizations, such as Russia, China, and Islamic regions of southern Asia. And yet the Empire shattered when, over time, it slowly moved away from ancestral, communal nomadic traditions in favor of an authoritarianism that, paradoxically, made the Empire less authoritative and, as such, weaker. I also learned about the origins of Russian society, the relevance of Kyiv and other principalities before the slow rise of Moscow, and the influence the Mongol Empire had in the formation of modern Russia.</p>
<h3 id="replay-by-jordan-mechner">Replay, by Jordan Mechner</h3>
<p>★★★★☆</p>
<p><em>First Second Books/Macmillan, signed copy</em></p>
<blockquote>
<p>A graphic memoir by Prince of Persia creator Jordan Mechner, recounting his own family story of war, exile and new beginnings.</p></blockquote>
<p>It&rsquo;s the first comic book I&rsquo;ve read in a long while, and I&rsquo;m glad I did. I <a href="/replay-by-jordan-mechner/">pre-ordered</a> a signed first edition from the USA that I received by post. The book is a work of craftsmanship. The story was a challenge for the author, I&rsquo;m sure. Many characters from three (if not four) generations are juxtaposed and interwoven continuously; the risk of getting lost is real, but Mechner manages to keep control, also thanks to the comic form that he masters and lends itself to the purpose, for example, through the use of different color palettes depending on the era being narrated. Remarkably, this narrative would not have been possible without the diaristic fever that gripped at least three generations of this Jewish family that was uprooted and then dispersed across two continents by the dramatic events that followed the advent of Nazism in Europe.</p>
<h3 id="sixty-degrees-north-by-malachy-tallack">Sixty Degrees North, by Malachy Tallack</h3>
<p>★★★☆☆</p>
<p><em>Iperborea, I Corvi</em></p>
<p>Sixty Degrees North is a travel book written in the 2000s based on the author&rsquo;s visits to each of the eight nations along this northern parallel. I didn&rsquo;t expect that so much of it would be about the impact on the author of his father&rsquo;s death when he was a teenager, his search to resolve his feelings about this, and his search to find somewhere to live that felt like home. These unexpected parts gravitate the book more toward the memoir genre, but the travel parts are still prevalent, well-researched, and recounted, some more interesting than others. This book touches on many things, often only superficially, which is a pity.</p>
<h3 id="kind-of-blue-the-making-of-the-miles-davis-masterpiece-ashley-kahn">Kind of Blue, the making of the Miles Davis masterpiece, Ashley Kahn</h3>
<p>★★★☆☆</p>
<p><em>Il Saggiatore</em></p>
<p>I saw the light the first time I listened to Kind of Blue, and I did a lot of research to find a text that would go into detail and explain how this legendary album came about and why it influenced jazz so much that it became the benchmark. Kind of Blue by Ashley Kahn fully met my expectations. Well-researched and written, full of first-hand accounts and quotes from the sextet members. I appreciated the introductory part that clearly illustrates where the jazz scene was at when the six came together to record this masterpiece, as well as the final part in which we understand the influence that Kind of Blue had, and is still having, in the decades that followed, not only in jazz but in all genres of music.</p>
<h3 id="my-ingeborg-by-tore-renberg">My Ingeborg, by Tore Renberg</h3>
<p>★★★★☆</p>
<p><em>(La mia Ingeborg, Fazi)</em></p>
<p>Awarded best book of the year by Norwegian booksellers, this one is a literary bestseller dragged along by lashing writing, as taut as a thriller and as moving as a love story, My Ingeborg is an intense tale of a family that, headed by a destructive man, falls apart. A great book.</p>
<h3 id="i-love-russia-by-elena-kostyuchenko">I love Russia, by Elena Kostyuchenko</h3>
<p>★★★☆☆</p>
<p><em>(La mia Russia, Einaudi)</em></p>
<p>This book is written by an independent Russian journalist who worked at Novaja Gazeta for many years until it was banned. Mostly, these are reportages from the great rural Russia, far from the big cities (the story from small villages on the high-speed train line between Moscow and St. Petersburg is one of the best). I Love Russia helps us understand today&rsquo;s deep Russia and the consequences of the fall of the USSR and the advent of Putin. It is also a love letter to the homeland, hence the title, but it does not bend to the official narrative; quite the opposite.</p>
<h3 id="blame-vol-1-by-tsutomu-nihei">Blame! Vol. 1, by Tsutomu Nihei</h3>
<p>★★★★☆</p>
<p>I came to this manga after watching the action movie on Netflix. The movie intrigued me, and I wanted to trace the source. It was well worth the effort. Cyberpunk is at its best here.</p>
<h3 id="taccuino-1870-1884-by-giuseppe-de-nittis">Taccuino 1870-1884, by Giuseppe De Nittis</h3>
<p>★★★☆☆</p>
<p>We happened upon the <a href="https://www.palazzorealemilano.it/mostre/pittore-della-vita-moderna">De Nittis exhibition</a> at the Royal Palace in Milan. It was a revelation, the best exhibition since the <a href="https://mostremuseisandomenico.it/preraffaelliti/">Pre-Raphaelite Brotherhood</a> one in Forlì a few months ago. Giuseppe De Nittis&rsquo;s notebook, an inconspicuous booklet displayed in a few copies in the bookshop at the end of the exhibition, caught my eye. I bought it because I wanted to learn more about this artist from southern Italy who emigrated to Paris to become one of the most famous painters of his era. It turned out to be a good purchase. De Nittis recounts salient episodes of his life in the French period and in London (where &ldquo;I made my fortune&rdquo;), with several enjoyable episodes occurring during his travels in Italy, especially in Naples and his hometown Barletta in Apulia. We learn a lot about the artist&rsquo;s life, peculiar personality, and the upper-class lifestyle of the time. In contrast, Italian episodes often depict scenes of popular life that would come across as stereotypical today but are undoubtedly genuine.</p>
<h3 id="trappole-alimentari-by-stefano-vendrame">Trappole alimentari, by Stefano Vendrame</h3>
<p>★★★☆☆</p>
<blockquote>
<p>There are four things that never cease to amaze me: first, how disastrous people&rsquo;s diets are; second, how little they realize; third, how even small changes in eating habits can make huge differences in health status; and fourth, how little people are willing to make such changes.</p></blockquote>
<p>Vendrami is a nutritional biologist with great expertise and undoubted popularization skills (he&rsquo;s also active on YouTube). In this book, he does not propose diets but highlights the &ldquo;food traps&rdquo; into which all of us in the West have fallen, induced mainly by the food industry. At the end of each chapter, Vendrami suggests behaviours and tricks that promise to get us back on track. Anchored in sound science, Food Traps is a valuable book worth keeping on hand, applying its suggestions a little at a time, without haste, with the long-term goal improving our nutrition strategy and, with it, achieve better health.</p>
<h3 id="slow-horses-by-mick-herron">Slow Horses, by Mick Herron</h3>
<p>★★★☆☆</p>
<blockquote>
<p>The first book in CWA Gold Dagger Award-winning British espionage series starring a team of MI5 agents united by one common bond: They&rsquo;ve screwed up royally and will do anything to redeem themselves.</p></blockquote>
<p>This was a fun read. I should read more fiction in the future, especially light-hearted fiction like this; it entertains and engages.</p>
<h3 id="pao-pao-by-pier-vittorio-tondelli">Pao Pao, by Pier Vittorio Tondelli</h3>
<p>★★★☆☆</p>
<p>This book is a collection of autobiographical accounts from the author&rsquo;s military service in 1980. In Italy, military service was mandatory—a rite of passage for generations of young adults. I went through that ten years later (1990), but the experiences were very similar. His conscript life was much more transgressive and unruly than mine, and the book perhaps indulges too much in those excesses, but PVT was like that. Pao Pao is a worthwhile read, especially for remembering a long-gone, intensely lived era that will never return. Also, PVT was a great writer.</p>
<h3 id="storia-di-mia-vita-janek-gorczyca">Storia di mia vita, Janek Gorczyca</h3>
<p>★★☆☆☆☆</p>
<p>This book tells the the story of Janek, a Pole who has lived in Rome for over 30 years without a home, documents or a steady job. It is a work written in an overwhelming, cruel, and unique Italian language, as spoken by the protagonist. It is a short, rough and not wholly satisfying book.</p>
<h3 id="the-bastard-brigade-sam-kean">The bastard brigade, Sam Kean</h3>
<p>★★★★☆</p>
<p><em>(La brigata dei bastardi, Adelphi)</em></p>
<p>The Bastard Brigate tells the gripping, untold story of a renegade group of scientists and spies determined to keep Adolf Hitler from obtaining the ultimate prize: a nuclear bomb. In the middle of building an atomic bomb, the leaders of the Manhattan Project were alarmed to learn that Nazi Germany was far outpacing the Allies in nuclear weapons research. Hitler, with just a few pounds of uranium, would have the capability to reverse the entire D-Day operation and conquer Europe. So they assembled a rough and motley crew of geniuses - dubbed the Alsos Mission - and sent them reeling into Axis territory to spy on, sabotage, and even assassinate members of Nazi Germany&rsquo;s feared Uranium Club. This book is well conceived and executed, and I liked that there&rsquo;s humour in it on almost every page, despite the dramatic events it narrates. I want to read more by Sam Kean.</p>
<h3 id="lacci-domenico-starnone">Lacci, Domenico Starnone</h3>
<p>★★★★☆</p>
<p>What are we willing to sacrifice so as not to feel trapped? And what do we lose when we choose to retrace our steps? Nothing is more radical than abandonment, but nothing is more tenacious than those invisible ties that bind people to one another. And sometimes, all it takes is the slightest gesture to resurface what we have tried to put aside. Domenico Starnone gives us a moving story, a masterful account of an escape, of a return, of all the failures that seem impossible to us and those that keep us company for a lifetime.</p>
<h3 id="walking-erling-kagge">Walking, Erling Kagge</h3>
<p><em>(Camminare, Einaudi)</em></p>
<p>★★★☆☆</p>
<p>Walking, by Erling Kagge, is a book on walking. The author is an explorer who has walked to both poles and the summit of Everest; his performances are certainly out of the ordinary, yet in this book, he is more about the everyday act of walking: the walks he still takes every day, both in his neck of the woods (Norway) and around the many places in the world he has visited. The text contains thematic quotations from writers, philosophers, and other famous people, and it explores the meaning and utility, both physiological and psychological, of the act of walking. As a walker and hiker, I found myself in many of the arguments in the text, but Kagge explains and argues them better.</p>
<h3 id="blame-vol-2-by-tsutomu-nihei">Blame! Vol. 2, by Tsutomu Nihei</h3>
<p>★★★★☆</p>
<p>The second instalment of Blame didn&rsquo;t delude me. I&rsquo;m not very deep into mangas, so sometimes I&rsquo;m in trouble parsing what I&rsquo;m seeing and making sense of a story often told via drawings rather than words, but I welcome the challenge.</p>
<h3 id="the-ministry-of-ungentlemanly-warfare-damien-lewis-">The Ministry of Ungentlemanly Warfare, Damien Lewis ★★★☆☆</h3>
<p><em>(Il ministero della guerra sporca)</em></p>
<blockquote>
<p>Damien Lewis became an author largely by accident, when a British publisher asked him if he&rsquo;d be willing to turn a TV documentary he was working on into a book (<a href="https://www.goodreads.com/book/show/29247060-the-ministry-of-ungentlemanly-warfare">source</a>).</p></blockquote>
<p>Reading the book, one notices that the author must not have a literary background, as the language seems more appropriate for an action movie. It is not great literature, but it does tell a story worth knowing, that of the early clandestine actions that saw the baptism of the British SOE and Anders Lassen (SOE, SAS, SBS), a role model for all brave and swaggering agents operating behind the lines. In celebrating the daring actions of these outlawed warriors, this book does not hide their flaws, such as the abundant use of drugs to sustain themselves in action. I was surprised to learn that at the end of WWII, SOE operated in my area, and Lassen ultimately found his death in Comacchio (FE). His body is buried at the Argenta Gap War Cemetery, not too far from where I live.</p>
<h3 id="the-three-body-problem-cixin-liu-">The three-body problem, Cixin Liu ★★★★☆</h3>
<p><em>(Il problema dei tre corpi, Mondadori)</em></p>
<p>It took me oh-so-long to get to this book. I was scared it would be a delusion, and I&rsquo;m glad to say I was wrong. Excellent writing, an enthralling story, and lots of science intermixed with intriguing philosophical concepts and wild ideas—Sci-fi at his best.</p>
<h3 id="white-noise-don-delillo-">White noise, Don DeLillo ★★★★☆</h3>
<p><em>(Rumore Bianco, Einaudi)</em></p>
<p>I missed DeLillo, as it had been some years since I read him. White Noise is from 1985 but is still fresh and relevant today, maybe especially today. It&rsquo;s the book that brought him to prominence and with merit. A couple random quotes:</p>
<blockquote>
<p>Man’s guilt in history and in the tides of his own blood has been complicated by technology, the daily seeping falsehearted death.</p></blockquote>
<blockquote>
<p>No sense of the irony of human experience, that we are the highest form of life on earth, and yet ineffably sad because we know what no other animal knows, that we must die.</p></blockquote>
<p>DeLillo is The american postmodern writer. Well, along with Paul Auster, of course.</p>
<h3 id="class-trip-emmanuel-carrère-">Class trip, Emmanuel Carrère ★★★☆☆</h3>
<p><em>(La settimana bianca, Einaudi)</em></p>
<p>I thought this would be a chilly psychological murder mystery with a classic French Existentialism gloss. Instead, I read a haunting character study of a child filled with angst and dread, trying and failing to make sense of the disorienting world around him, never understanding the true nature of his existence in this meaningless, absurd, and often deadly world, which is French Existentialism in a nutshell. Class Trip is the only Carrere book I read that is pure fiction. He soon moved on to the fictionalised biography genre and became more effective there. Mine was a reread, as I found out today when I went to add the book to my library page and discovered I read it in 2016. It should tell either about the book&rsquo;s impact on me, my ageing and sadly vanishing memory, or both. And yes, I own two copies of this book now; they&rsquo;re different editions, at least.</p>
<h3 id="the-new-york-trilogy-paul-auster-">The New York Trilogy, Paul Auster ★★★★☆</h3>
<p><em>(Trilogia di New York, Einaudi)</em></p>
<p>Paul Auster&rsquo;s The New York Trilogy is a postmodern masterpiece. It is a collection of three short detective and mystery fiction novels initially published between 1985 and 1986: City of Glass, Ghosts and The Locked Room. Although seemingly independent stories, they share themes, atmospheres, and narrative structures that deeply connect them. All three novels explore the identity crisis of the protagonists, who are often driven to confuse themselves with other characters. The protagonists are isolated figures engulfed by an urban landscape (New York City) that becomes a veritable labyrinth.
The city is more than a backdrop; it is a unifying and symbolic element. With its immensity and endless possibilities, New York represents a place of loss and finding but also an enigma. It functions as a reflection of the protagonists&rsquo; obsessions and quests. Auster plays with the boundaries between reality and fiction, questioning the meaning of writing and storytelling. In some cases, the narrator almost emerges as a character (so much so that one character is named &ldquo;Paul Auster&rdquo;.) The author litters the three novels with recurring elements that create a sense of continuity and mysterious interconnectedness. The objects, character names, and details that reappear suggest that the stories are not independent but parts of a single narrative universe. Again, a masterpiece. Also, the book that gave Auster fame.</p>
<h3 id="altri-libertini-by-pier-vittorio-tondelli-">Altri libertini, by Pier Vittorio Tondelli ★★★★☆</h3>
<p>After <a href="#pao-pao-by-pier-vittorio-tondelli">Pao Pao</a>, I wanted to go back to Pier Vittorio Tondelli, to his early work, to understand better what it was all about. I wanted to know more about the author, but also about what he was telling about, about that Italian generation of the late 70s and early 80s orphaned of the great ideals of the 60s, much more ramshackle, desperate and at the same time full of will to live. Great.</p>
<h3 id="all-your-children-scattered-by-beata-umubyeyi-mairesse-">All your children, scattered, by Beata Umubyeyi Mairesse ★★★★☆</h3>
<p><em>(I tuoi figli ovunque dispersi, e/o)</em></p>
<p>I read this book almost by accident. It was a home reading assignment for my daughter Anna, who liked it and recommended it to me. It is a novel but also an autobiography, given the many commonalities between the author&rsquo;s story and the Rwandan family featured in this novel. Everyone remembers the 1994 Tutsi genocide in Rwanda, if only from following the news on TV. This book tells us about those dramatic events and the trauma that followed, along with the life-long attempt to reconcile, from the point of view of those who experienced them firsthand. It isn&rsquo;t easy to hold together the stories of four generations of protagonists and do so engagingly—good, solid book. I am grateful to Anna&rsquo;s literature teacher; she always gives me stimulating and enriching readings.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>Lolita</em> was first published in France (1955), as the text was initially not accepted by any publisher in the States.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>On C# and .NET quick release cycle</title>
      <link>https://nicolaiarocci.com/on-csharp-and-dotnet-quick-release-cycle/</link>
      <pubDate>Mon, 09 Dec 2024 17:31:18 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-csharp-and-dotnet-quick-release-cycle/</guid>
      <description>&lt;p&gt;&lt;em&gt;I sat to jot down a quick introduction to my &lt;a href=&#34;https://nicolaiarocci.com/speaking-at-the-dotnet-conference-italia-2024/&#34;&gt;C# 13 What&amp;rsquo;s New and Interesting&lt;/a&gt; session next week, and what I ended up with instead is a long rant or, should I dare, stream of consciousness that is certainly inappropriate for a five-minute introduction. I&amp;rsquo;ll have to cut most of it down, especially on the personal story part, but my site might be a good place to host it in all its completeness. I may reference this post at the start of the session on Monday for those few poor souls who might be interested.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>I sat to jot down a quick introduction to my <a href="/speaking-at-the-dotnet-conference-italia-2024/">C# 13 What&rsquo;s New and Interesting</a> session next week, and what I ended up with instead is a long rant or, should I dare, stream of consciousness that is certainly inappropriate for a five-minute introduction. I&rsquo;ll have to cut most of it down, especially on the personal story part, but my site might be a good place to host it in all its completeness. I may reference this post at the start of the session on Monday for those few poor souls who might be interested.</em></p>
<p>Exactly one year ago we were here, in this same room, at the same conference, presenting C# 12. Some of you in the audience were present back then. If so, please raise your hands. Twelve months later, here we are again, looking at a new version of C#. It&rsquo;s the new normal; this has been happening, give or take, since the advent of .NET Core and C# 8 in 2019. Previously, C# had a new release every 2–3 years, so the release rate has doubled or even tripled recently. Is this good news? If you&rsquo;ve followed forums or social media, you might have noticed some controversy about the topic. The main complaint is that the language is changing too quickly, &ldquo;chasing trends,&rdquo; with no valuable addition to its core.</p>
<p>Most of these complaints come from old-timers around my age (maybe even ten years younger because I&rsquo;m seasoned) and have been in the .NET environment for many, perhaps too many years. There&rsquo;s always a certain inertia, a form of resistance to change, especially when it&rsquo;s rapid. But I&rsquo;m seasoned enough to remember when complaints went in the opposite direction: back then, the .NET Framework (the historical, monolithic, Windows-only version) moved like a dinosaur while the world was racing ahead. New languages were blooming. Old competitors were evolving at double or triple the speed, constantly innovating, and—this is key—attracting hordes of developers. There was a critical moment when this attraction became so intense that more and more developers set aside .NET and C# to explore new directions. I know because I was one of them.</p>
<p>Around 2010–11, I was set to create a new, rather complex platform of REST services, and instead of reaching out for my usual .NET toolchain, I chose Python. That marked the beginning of an adventure that lasted years and included the unexpected release of some reasonably successful open-source Python projects. The reasons I decided to abandon .NET and C# were several—not least the frustration with the lack of transparency and a clear path for the .NET ecosystem, its languages, with oh-so-many frameworks enthusiastically presented and then abandoned, changes of direction, and above all, in my case, it all being closed source, which didn&rsquo;t allow me to dig deeper and understand why certain things didn&rsquo;t work as expected. I clearly remember when I was writing my first REST service in Python and realized that in this new ecosystem if I didn&rsquo;t understand what was happening behind the scenes (in my case, with the Flask framework), I could quickly look at what was going on because the entire Flask source code, like Python&rsquo;s for that matter, was available not only for consumption but it was also open to contribution. Coming from the enterprise closed-source world, it was an empowering sensation.</p>
<p>The discovery of Flask was an absolute revelation, not for its intrinsic features (which were great) but because it was just one of the many options. In Python space, there were dozens of web frameworks at varying stages of maturity. There was a choice and often many different approaches to solve the same problem. I could experiment freely and decide what was best for my use case. Not only was I facing a vast and diverse world, but I could also use the operating system I wanted. Linux was much less demanding, let alone less expensive, for deployment than Windows, and behold! I could use a Mac for development. Open-source, cross-platform, with a vast community not only adopting the language and the standard library but constantly forging new solutions, making them available to the same community, almost always for free. It was the way forward.</p>
<p>I envied that such a thing was unthinkable in my world. But unbeknownst to many, Microsoft was watching and taking notes. To the best of my knowledge, it was mainly the developers inside the corp —the dev team—who, glancing out of the ivory tower, began a campaign of internal lobbying, initially scattered and disorganized and later increasingly coordinated, which in turn led to endless meetings, discussions at coffee machines, and gradually, slowly and then more rapidly, to the advent of the .NET Core project. The metaphor of a snowball slowly rolling down a slope until it becomes an unstoppable avalanche perfectly applies here.</p>
<p>So, years after my departure (not an actual departure—I still worked in .NET for our legacy products), a new and unexpected .NET appeared on the scene. It was open-source, cross-platform, and open to external contributions. We could and perhaps should have a lengthy discussion on the openness to external contributions, but we can all agree that a revolution occurred and was historic in scale. At the same time, Microsoft opened up to other stacks, mainly because of Azure. I was shocked when I was proposed for a Microsoft MVP Award for my work on Python, not C#, at a time when Python had little to nothing to do with Microsoft. It made sense, as there was an urgent need to speak to developers outside its ecosystem—and perhaps even more so to those like me who had left: <em>Hey, look, we&rsquo;re back, we&rsquo;re on track, and we&rsquo;re not evil anymore</em>.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> </p>
<p>And there I was, finding my old stack (which I secretly, I admit, considered only museum-worthy) back to relevance, competing on equal footing with the rest of the scene. The delay was costly, though. Even today, I meet colleagues who think modern .NET is just a new version, if not a simple rebranding of the Windows framework of old, and C# is more or less the same, way behind the new kids on the block. It&rsquo;s a shame, and there are responsibilities. Some choices could have been bolder and more disruptive, starting with naming the new framework—but that&rsquo;s another story.</p>
<p>Today, I create REST services with Minimal APIs on my Mac and deploy them on Linux via Docker at zero or near-zero cost, just as I would with Python, JavaScript, Rust, Go, or any other stack. The performance is far better than Python&rsquo;s (C# REST services make circles around Python&rsquo;s), and the toolchain is rich and powerful, especially around the command line, while many think .NET is still a GUI/Windows thing. Quick release cycles are essential to compensate for lost time (and there was lots of it) and stay on the cutting edge, sending a continuous signal that the platform is alive, thriving, and constantly expanding.</p>
<p>Aldus Manutius, the renowned Venetian printer and publisher of the Renaissance, adopted the Latin motto <em>Festina lente</em>, which translates to <em>Make haste slowly</em> or <em>Hasten slowly</em>. This paradoxical phrase encapsulates achieving careful, deliberate progress quickly and precisely, balancing urgency with caution. I feel that, consciously or not, the .NET team is on track with Manuzio&rsquo;s goal: they iterate rapidly to achieve progress, balancing urgency with caution.</p>
<p>Nowadays, both .NET and C# focus on performance and while there&rsquo;s room for growth, the current achievements are extraordinary. We&rsquo;re competitive with most stacks, if not significantly ahead of them. Frequent, more minor C# releases allow for quick adjustments. Attentive developers adopt them continuously. Meanwhile, those who aren&rsquo;t in a rush (probably most of Microsoft&rsquo;s long-time customers, slow-moving conglomerates and the like) benefit from performance gains and technological advantages (multi-platform deployment!) at a low cost because, while the framework and language evolve, great effort is put into preserving backward compatibility. In most cases, migrating to .NET Core and newer versions of C# requires minimal effort.</p>
<p>C# 12 introduced two significant features: primary constructors and collection expressions, with the latter being predominant in terms of syntactic, semantic, and performance importance. They weren&rsquo;t the only new features but certainly the key ones. C# 13 innovates further but subtly—there&rsquo;s less syntax and more semantics, building on last year&rsquo;s new features. The improvements may be less flashy but guide developers in the right direction, often ensuring better performance at zero cost, sometimes even without us having to do anything. As we shall see, it happens because in recent releases—let&rsquo;s say the last two or three— features were introduced primarily to improve the framework, which is also written in C#. Our higher-level applications benefit from all of this. It is a pattern we&rsquo;ll observe repeatedly throughout this presentation.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>If you think we&rsquo;re talking about the same company that had its CEO infamously pronounce the &ldquo;Linux is a cancer&rdquo; quote, please consider that it happened on <a href="https://www.theregister.com/2001/06/02/ballmer_linux_is_a_cancer/">June 1, 2001</a>. That was 23 (twenty-three!) years ago at the time of this writing. Take your time to process that. That happened like a couple of technological eras ago. I know it&rsquo;s a distant past because I was there. Things have moved forward. Get over it. Of course, one must stay vigilant; things can change, but this is where we are now, and it is a good position to be in.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Speaking at the .NET Conference Italia 2024</title>
      <link>https://nicolaiarocci.com/speaking-at-the-dotnet-conference-italia-2024/</link>
      <pubDate>Sat, 07 Dec 2024 08:36:26 +0100</pubDate>
      <guid>https://nicolaiarocci.com/speaking-at-the-dotnet-conference-italia-2024/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m speaking at the &lt;a href=&#34;https://www.dotnetconference.it&#34;&gt;.NET Conference Italia 2024&lt;/a&gt; on Dec 16th in Milan at the Microsoft House. My session is titled &lt;a href=&#34;https://www.dotnetconference.it/e/sessione/3589/C-13-e-NET-9-cosa-c%E2%80%99e-di-nuovo-e-interessante&#34;&gt;C# 13 What&amp;rsquo;s New and Interesting&lt;/a&gt; and will be on the latest iteration of the C# language. We&amp;rsquo;ll also briefly touch on .NET 9, which was also just released. Hope to see you there (make sure to come to me to say Hi!)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m speaking at the <a href="https://www.dotnetconference.it">.NET Conference Italia 2024</a> on Dec 16th in Milan at the Microsoft House. My session is titled <a href="https://www.dotnetconference.it/e/sessione/3589/C-13-e-NET-9-cosa-c%E2%80%99e-di-nuovo-e-interessante">C# 13 What&rsquo;s New and Interesting</a> and will be on the latest iteration of the C# language. We&rsquo;ll also briefly touch on .NET 9, which was also just released. Hope to see you there (make sure to come to me to say Hi!)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Kuma Fo by Les Amazones D&#39;Afrique</title>
      <link>https://nicolaiarocci.com/kuma-fo-by-les-amazones-dafrique/</link>
      <pubDate>Fri, 06 Dec 2024 16:52:41 +0100</pubDate>
      <guid>https://nicolaiarocci.com/kuma-fo-by-les-amazones-dafrique/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Inspired by the historic Dahomey Amazons and founded by three of the biggest powerhouses in African music, Mamani Keïta, Mariam Doumbia, and Oumou Sangare, Les Amazones d&amp;rsquo;Afrique have been using their voices to advocate for women&amp;rsquo;s rights since their 2017 debut. The group has never shied away from mashing up tradition and technology. Still, on Musow Dance, with the endlessly inventive production of Jacknife Lee, they lean heavily into an almost entirely electronic sound, turning up the energy several notches with booming 808s, dramatic synth slides, and bursts of vintage disco. But none of these additions ever overshadow the true soul of the music, instead amplifying the already formidable voices of Les Amazones d&amp;rsquo;Afrique&amp;rsquo;s ever-evolving lineup (&lt;a href=&#34;https://daily.bandcamp.com/best-of-2024/the-best-albums-of-2024-g-m&#34;&gt;source&lt;/a&gt;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Inspired by the historic Dahomey Amazons and founded by three of the biggest powerhouses in African music, Mamani Keïta, Mariam Doumbia, and Oumou Sangare, Les Amazones d&rsquo;Afrique have been using their voices to advocate for women&rsquo;s rights since their 2017 debut. The group has never shied away from mashing up tradition and technology. Still, on Musow Dance, with the endlessly inventive production of Jacknife Lee, they lean heavily into an almost entirely electronic sound, turning up the energy several notches with booming 808s, dramatic synth slides, and bursts of vintage disco. But none of these additions ever overshadow the true soul of the music, instead amplifying the already formidable voices of Les Amazones d&rsquo;Afrique&rsquo;s ever-evolving lineup (<a href="https://daily.bandcamp.com/best-of-2024/the-best-albums-of-2024-g-m">source</a>).</p></blockquote>
<p><a href="https://lesamazonesdafrique.bandcamp.com/album/musow-danse">Musow Dance</a> is a stunning release, and Kuma Fo is just the perfect leading track. Every component is on point, finely dispensed and precisely interleaved: voices, sound, beat, you name it. The producer, after all, is Jacknife Lee (R.E.M., Taylor Swift, U2.)</p>

<iframe style="border: 0; width: 100%; height: 42px;" src="https://bandcamp.com/EmbeddedPlayer/album=3384140492/size=small/bgcol=333333/linkcol=0f91ff/track=1250735316/transparent=true/" seamless><a href="https://lesamazonesdafrique.bandcamp.com/album/musow-danse">Musow Danse by Les Amazones d&#39;Afrique</a></iframe>

<p>Then, there are the lyrics with their meaninful message. While they all sing in their native language (the four members are from different African countries), I could dig out the English translation from the <a href="https://www.youtube.com/watch?v=CHeC03169e4">official video</a>, which is equally good and powerful.</p>
<p>She preserves life, gives the first breath<br>
She preserves life, gives the first breath<br>
Woman oh, oh woman<br>
She gives the first breath</p>
<p>Chorus:<br>
Whatever they say<br>
Whatever women have to say<br>
Is worth listening to<br>
Life is hard, I fight with courage, let me be<br>
Whatever they say<br>
Whatever women have to say<br>
Is worth listening to<br>
You know, my life is mine, so give me space</p>
<p>The world was created by a woman<br>
Mika mika mika mika mika<br>
She preserves life<br>
Mika mika mika mika mika</p>
<p>You wonder how we’re gona make it?<br>
We decided to gather our strength and fight<br>
Whatever it costs<br>
You wonder how we’ll make it?</p>
<p>Chorus</p>
<p>You light up life<br>
You light up life<br>
To educate a woman is to educate a village<br>
To educate a girl is to educate the world<br>
Get up, get up, get up<br>
Regain your feminine strength<br>
Woman, woman, woman, get up, get up<br>
Regain your feminine strength</p>
<p>I travelled to the North<br>
People from the North told me<br>
That women have dignity<br>
I travelled to the West<br>
People from the West told me<br>
That women have dignity</p>
<p>I belong to myself, I’m free to do what I like<br>
I will not accept what others want me to be<br>
I belong to myself, I’m free to do what I like<br>
I will never accept it anymore</p>
<p>Chorus</p>
<p>Whatever they say<br>
Whatever women have to say<br>
Is worth listening to<br>
I will not be driven like a car<br>
Woman, woman, woman</p>
<p>You give hope<br>
You give hope<br>
You give hope<br>
You give life<br>
To educate a woman is to educate a village<br>
To educate a girl is to educate the world</p>
]]></content:encoded>
    </item>
    <item>
      <title>Reading books and commenting on them with ChatGPT</title>
      <link>https://nicolaiarocci.com/reading-books-and-commenting-on-them-with-chatgpt/</link>
      <pubDate>Tue, 26 Nov 2024 19:20:01 +0100</pubDate>
      <guid>https://nicolaiarocci.com/reading-books-and-commenting-on-them-with-chatgpt/</guid>
      <description>&lt;p&gt;I just finished reading Paul Auster&amp;rsquo;s The New York Trilogy&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;. On this occasion, I discovered a new use for ChatGPT and LLMs. ChatGPT and I chatted about the themes, especially the correlations and connections between the three short novels that comprise the volume. It was an alienating and revealing experience. For the first time, I am reasoning about a book with a machine, not a person. Because it knows everything about the text and draws on the shared global knowledge, it can give more satisfaction than most people do (also, it&amp;rsquo;s not easy to find someone around with whom I can talk about all the books I read!) Yes, it is wordy and repetitive, but it can stimulate and enrich my analysis&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;</description>
      <content:encoded><![CDATA[<p>I just finished reading Paul Auster&rsquo;s The New York Trilogy<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. On this occasion, I discovered a new use for ChatGPT and LLMs. ChatGPT and I chatted about the themes, especially the correlations and connections between the three short novels that comprise the volume. It was an alienating and revealing experience. For the first time, I am reasoning about a book with a machine, not a person. Because it knows everything about the text and draws on the shared global knowledge, it can give more satisfaction than most people do (also, it&rsquo;s not easy to find someone around with whom I can talk about all the books I read!) Yes, it is wordy and repetitive, but it can stimulate and enrich my analysis<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>I&rsquo;ve been using LLMs (ChatGPT and Claude) more and more lately, especially for work. The more I use them, the more I understand how to leverage their capabilities. I would have never thought about sharing my reading experiences with ChatGPT before. <a href="https://www.oneusefulthing.org/p/getting-started-with-ai-good-enough">Ethan Mollick</a> has it right; we should all put at least 10 hours into LLMs before judging them.</p>
<blockquote>
<p>Your goal is simple: spend 10 hours using AI on tasks that actually matter to you. After that, you&rsquo;ll have a natural sense of how AI fits into your work and life. You&rsquo;ll develop an intuition for effective prompting, and you&rsquo;ll better understand AI&rsquo;s potential. Don&rsquo;t aim for perfection - just start somewhere and learn as you go.</p></blockquote>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I&rsquo;ve not been posting my usual short book reviews in 2024. I&rsquo;m reading a lot, though, and updating a &ldquo;Books I read in 2024&rdquo; article as I go on. I plan to publish it by the end of the year.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Sharing that chat with Serena was another remarkable feature.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>From Corniolo to Passo Braccina via Valpisella</title>
      <link>https://nicolaiarocci.com/from-corniolo-to-passo-braccina-via-valpisella/</link>
      <pubDate>Sat, 16 Nov 2024 09:06:23 +0100</pubDate>
      <guid>https://nicolaiarocci.com/from-corniolo-to-passo-braccina-via-valpisella/</guid>
      <description>&lt;p&gt;I took a daily hike in my beloved Apennine Mountains a few weeks ago. One of my favourite motorcycling routes is the narrow, engaging, panoramic road that unites Corniolo in the Bidente Valley with Marradi and the Mugello area via the Braccina Pass. I always wanted to return and hike through it; the moment had come.&lt;/p&gt;
&lt;p&gt;It was an excellent circular tour that, to the merits of moderation-it is not too long, nor too strenuous, the ascent is always gradual, etc. - also combines the variety of the environment, shading from mixed mid-altitude broadleaf forests (hornbeams, oaks, ash, cherry, maple) to coniferous reforestations that in this case, with increasing age and size, have taken on a certain dignity.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I took a daily hike in my beloved Apennine Mountains a few weeks ago. One of my favourite motorcycling routes is the narrow, engaging, panoramic road that unites Corniolo in the Bidente Valley with Marradi and the Mugello area via the Braccina Pass. I always wanted to return and hike through it; the moment had come.</p>
<p>It was an excellent circular tour that, to the merits of moderation-it is not too long, nor too strenuous, the ascent is always gradual, etc. - also combines the variety of the environment, shading from mixed mid-altitude broadleaf forests (hornbeams, oaks, ash, cherry, maple) to coniferous reforestations that in this case, with increasing age and size, have taken on a certain dignity.</p>
<p><a href="https://forlicesena.anpi.it/valpisella/">Valpisella</a> is a rural stone building dating back to 1872 and later reclaimed as a vacation home by the volunteer work of ANPI partisans. When I arrived, I could hear people enjoying their lunch inside. It&rsquo;s a nice place; unfortunately, I forgot to take a picture.</p>
<p>If hiked at a brisk pace, it might take only half a day, but with a few well-deserved stops and savouring the myriad details that the various seasons can offer, it fills the whole day without difficulty.</p>
<p>The Corniolo/Braccina route marked my first winter hike of the season. I recently realized that, to me, daily hikes are more accessible in the winter. In summer, I&rsquo;m usually too busy between motorcycling trips with the <a href="https://tomccitalia.org/">Club</a>, family matters, holidays and, since we live close by, going to the beach.</p>
<p>GPS track is available <a href="https://www.outdooractive.com/en/route/hiking-route/da-corniolo-al-passo-braccina-via-valpisella/284294599/">here</a>.</p>
<p><img alt="From Corniolo to Passo Braccina" loading="lazy" src="/images/corniolo-braccina1.jpg">
<img alt="From Corniolo to Passo Braccina" loading="lazy" src="/images/corniolo-braccina3.jpg">
<img alt="From Corniolo to Passo Braccina" loading="lazy" src="/images/corniolo-braccina2.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>A walk after the storm</title>
      <link>https://nicolaiarocci.com/a-walk-after-the-storm/</link>
      <pubDate>Mon, 21 Oct 2024 08:41:05 +0200</pubDate>
      <guid>https://nicolaiarocci.com/a-walk-after-the-storm/</guid>
      <description>&lt;p&gt;A walk on the beach right after the storm. Lots of logs scattered all around, for miles.&lt;/p&gt;

&lt;div style=&#34;padding:56.25% 0 0 0;position:relative;&#34;&gt;&lt;iframe src=&#34;https://player.vimeo.com/video/1021633268?badge=0&amp;amp;autopause=0&amp;amp;player_id=0&amp;amp;app_id=58479&#34; frameborder=&#34;0&#34; allow=&#34;autoplay; fullscreen; picture-in-picture; clipboard-write&#34; style=&#34;position:absolute;top:0;left:0;width:100%;height:100%;&#34; title=&#34;After the storm&#34;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;script src=&#34;https://player.vimeo.com/api/player.js&#34;&gt;&lt;/script&gt;

&lt;p&gt;And sanderlings running all over the place.&lt;/p&gt;

&lt;div style=&#34;padding:56.25% 0 0 0;position:relative;&#34;&gt;&lt;iframe src=&#34;https://player.vimeo.com/video/1021609203?badge=0&amp;amp;autopause=0&amp;amp;player_id=0&amp;amp;app_id=58479&#34; frameborder=&#34;0&#34; allow=&#34;autoplay; fullscreen; picture-in-picture; clipboard-write&#34; style=&#34;position:absolute;top:0;left:0;width:100%;height:100%;&#34; title=&#34;Sanderlings&#34;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;script src=&#34;https://player.vimeo.com/api/player.js&#34;&gt;&lt;/script&gt;</description>
      <content:encoded><![CDATA[<p>A walk on the beach right after the storm. Lots of logs scattered all around, for miles.</p>

<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/1021633268?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="After the storm"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>

<p>And sanderlings running all over the place.</p>

<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/1021609203?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Sanderlings"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>

]]></content:encoded>
    </item>
    <item>
      <title>Journalists should not surrender their weapons</title>
      <link>https://nicolaiarocci.com/journalists-should-not-surrender-their-weapons/</link>
      <pubDate>Wed, 16 Oct 2024 10:24:37 +0200</pubDate>
      <guid>https://nicolaiarocci.com/journalists-should-not-surrender-their-weapons/</guid>
      <description>&lt;p&gt;Kara Swisher, a dean in digital and classical journalism, has an interesting article in the New York Magazine. As a witness and protagonist she recounts how in the last 30 years digital has eaten away at traditional media and how today, with the advent of AI, there is a risk of it happening all over again. Above all, she reasons why it is essential for journalists not to surrender their weapons and lawmakers to step in and finally harness an industry that always had free reign and no regulation, as it is considered inevitable.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Kara Swisher, a dean in digital and classical journalism, has an interesting article in the New York Magazine. As a witness and protagonist she recounts how in the last 30 years digital has eaten away at traditional media and how today, with the advent of AI, there is a risk of it happening all over again. Above all, she reasons why it is essential for journalists not to surrender their weapons and lawmakers to step in and finally harness an industry that always had free reign and no regulation, as it is considered inevitable.</p>
<blockquote>
<p>[&hellip;] more and more people across the globe get their news and cues from social media. It has a scary ability to generate anxiety and rage, and it is addictive. Expert after expert I’ve talked to over the years has made the same point — in the new paradigm, engagement equals enragement. This is made worse by the people who run these companies, for whom anticipation of consequences is lacking and whose first instinct is to let it all through the gate, regardless of potential damage or danger. What’s the opposite of the mommy state? Parent-free chaos.</p></blockquote>
<p>Read her article <a href="https://nymag.com/intelligencer/article/kara-swisher-burn-book-excerpt-silicon-valley-media.html">here</a>.</p>
<p>I appreciate how Swisher was an initial proponent of digital advent, so much so that she <a href="https://en.wikipedia.org/wiki/All_Things_Digital">co-founded All Things Digital</a>. Yet, that didn&rsquo;t prevent her from foreseeing the troubled waters ahead.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.2.0</title>
      <link>https://nicolaiarocci.com/eve-2.2.0/</link>
      <pubDate>Tue, 15 Oct 2024 09:37:02 +0200</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.2.0/</guid>
      <description>&lt;p&gt;Today I released &lt;a href=&#34;https://pypi.org/project/Eve/2.2.0/&#34;&gt;Eve 2.2&lt;/a&gt;. It is a maintenance release that drops old Pythons and adds support for the latest versions of the language. Long overdue, it also gets rid of some annoying deprecation warnings. As always, see the &lt;a href=&#34;https://docs.python-eve.org/en/stable/changelog.html#version-v2-2&#34;&gt;changelog&lt;/a&gt; for details. Many thanks to Bret Curtis and Guillaume Le Pape for their contributions to this release.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released <a href="https://pypi.org/project/Eve/2.2.0/">Eve 2.2</a>. It is a maintenance release that drops old Pythons and adds support for the latest versions of the language. Long overdue, it also gets rid of some annoying deprecation warnings. As always, see the <a href="https://docs.python-eve.org/en/stable/changelog.html#version-v2-2">changelog</a> for details. Many thanks to Bret Curtis and Guillaume Le Pape for their contributions to this release.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Gimme gimme gimme</title>
      <link>https://nicolaiarocci.com/gimme-gimme-gimme/</link>
      <pubDate>Fri, 04 Oct 2024 11:46:13 +0200</pubDate>
      <guid>https://nicolaiarocci.com/gimme-gimme-gimme/</guid>
      <description>&lt;p&gt;Why does &lt;a href=&#34;https://www.man7.org/linux/man-pages/man1/man.1.html&#34;&gt;man&lt;/a&gt; print &amp;ldquo;gimme gimme gimme&amp;rdquo; at 00:30?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The maintainer of man is a good friend of mine, and one day six years ago I
jokingly said to him that if you invoke man after midnight it should print
&amp;ldquo;gimme gimme gimme&amp;rdquo;, because of the Abba song called &amp;ldquo;Gimme gimme gimme a man
after midnight&amp;rdquo;.  Well, he did actually put it in. A few people were amused to
discover it, and we mostly forgot about it until today.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Why does <a href="https://www.man7.org/linux/man-pages/man1/man.1.html">man</a> print &ldquo;gimme gimme gimme&rdquo; at 00:30?</p>
<blockquote>
<p>The maintainer of man is a good friend of mine, and one day six years ago I
jokingly said to him that if you invoke man after midnight it should print
&ldquo;gimme gimme gimme&rdquo;, because of the Abba song called &ldquo;Gimme gimme gimme a man
after midnight&rdquo;.  Well, he did actually put it in. A few people were amused to
discover it, and we mostly forgot about it until today.</p></blockquote>
<p>Long live the good old hacker spirit. Full story <a href="https://unix.stackexchange.com/questions/405783/why-does-man-print-gimme-gimme-gimme-at-0030">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica v3.5</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-v3.5/</link>
      <pubDate>Mon, 30 Sep 2024 09:39:20 +0200</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-v3.5/</guid>
      <description>&lt;p&gt;I just released &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronica&#34;&gt;FatturaElettronica .NET v3.5.0&lt;/a&gt;. This version adds multi-language support, all thanks to the excellent work done by &lt;a href=&#34;https://michaelmairegger.it&#34;&gt;Michael Mairegger&lt;/a&gt;. We currently support Italian and German and are ready to accept contributions for other languages. The Fattura Elettronica open-source project allows for the validation and de/serialization of electronic invoices that adhere to the standard defined by the Italian Revenue Agency.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just released <a href="https://www.nuget.org/packages/FatturaElettronica">FatturaElettronica .NET v3.5.0</a>. This version adds multi-language support, all thanks to the excellent work done by <a href="https://michaelmairegger.it">Michael Mairegger</a>. We currently support Italian and German and are ready to accept contributions for other languages. The Fattura Elettronica open-source project allows for the validation and de/serialization of electronic invoices that adhere to the standard defined by the Italian Revenue Agency.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I am Herman Melville</title>
      <link>https://nicolaiarocci.com/i-am-herman-melville/</link>
      <pubDate>Sat, 14 Sep 2024 10:22:27 +0200</pubDate>
      <guid>https://nicolaiarocci.com/i-am-herman-melville/</guid>
      <description>&lt;p&gt;I never knew about the connection between Ray Bradbury, John Huston, and Herman Melville.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today, few people are aware that Bradbury, renowned science fiction writer, beloved fantasist, and mainstay on banned-book lists, wrote the screenplay for the 1956 John Huston adaptation of the Melville classic, which starred Gregory Peck as the iconic and obsessive Captain Ahab. Writing the screenplay was a dream come true for Bradbury, until it morphed into a waking nightmare. As the old adage goes: Never meet your heroes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I never knew about the connection between Ray Bradbury, John Huston, and Herman Melville.</p>
<blockquote>
<p>Today, few people are aware that Bradbury, renowned science fiction writer, beloved fantasist, and mainstay on banned-book lists, wrote the screenplay for the 1956 John Huston adaptation of the Melville classic, which starred Gregory Peck as the iconic and obsessive Captain Ahab. Writing the screenplay was a dream come true for Bradbury, until it morphed into a waking nightmare. As the old adage goes: Never meet your heroes.</p></blockquote>
<p>Fascinating stuff. Well written, too. Read the full story <a href="https://lareviewofbooks.org/article/i-am-herman-melville/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Books are strange objects</title>
      <link>https://nicolaiarocci.com/books-are-strange-objects/</link>
      <pubDate>Fri, 13 Sep 2024 09:14:43 +0200</pubDate>
      <guid>https://nicolaiarocci.com/books-are-strange-objects/</guid>
      <description>&lt;p&gt;Dave Rupert, reasoning on why he likes books:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Books are strange objects. Chapters and chapters of coherent research and lived experiences assembled by people who wanted to put it all down in one place. Edited by actual editors who like editing. Designed— down to the weight of the paper, the typography, and the illustration on the cover— to make the experience of reading it enjoyable. Books are uncanny and impractical objects. A terribly inefficient way to encode information from one brain to another, but an excellent way to tell a story.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dave Rupert, reasoning on why he likes books:</p>
<blockquote>
<p>Books are strange objects. Chapters and chapters of coherent research and lived experiences assembled by people who wanted to put it all down in one place. Edited by actual editors who like editing. Designed— down to the weight of the paper, the typography, and the illustration on the cover— to make the experience of reading it enjoyable. Books are uncanny and impractical objects. A terribly inefficient way to encode information from one brain to another, but an excellent way to tell a story.</p></blockquote>
<p>Full post <a href="https://daverupert.com/2024/09/fuck-the-book-a-week-club/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Under ASP.NET 8, NGINX returns 502 Bad Gateway after authentication by IdentityServer</title>
      <link>https://nicolaiarocci.com/under-aspnet-8-nginx-returns-502-bad-gateway-after-authentication-by-identityserver/</link>
      <pubDate>Thu, 12 Sep 2024 16:17:58 +0200</pubDate>
      <guid>https://nicolaiarocci.com/under-aspnet-8-nginx-returns-502-bad-gateway-after-authentication-by-identityserver/</guid>
      <description>Today, I learned the hard way that NGINX has default buffer sizes, which can cause trouble in specific scenarios like mine.</description>
      <content:encoded><![CDATA[<p>Today, I learned the hard way that NGINX has small buffer sizes, which can cause trouble in specific scenarios like mine.</p>
<p>We have two ASP.NET 8 applications behind NGINX; one is a regular web app, and the other is an auth server built with Duende Identity Server. When the user attempts to log in to the web app, they are sent to the auth server; once logged in, they are sent back to the app, and that&rsquo;s when NGINX returns a weird 502 Bad Gateway. Upon inspecting the NGINX logs, I found the following error:</p>
<pre><code>upstream sent too big header while reading response header from upstream
</code></pre>
<p>Some digging revealed that NGINX has a pretty small default buffer size, and proxying auth requests (with their typically above-average-size headers) back and forth is prone to breaking that limit.</p>
<p>The fix is straightforward: raise those buffer sizes. Most blogs suggest doing that globally, but that seems overkill, as NGINX buffering can be configured per server and location blocks. You may want to keep the global defaults and only raise them (along with memory consumption) for locations that need it.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>  location {
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>    proxy_buffers 4 256k;
</span></span><span style="display:flex;"><span>    proxy_buffer_size 128k;
</span></span><span style="display:flex;"><span>    proxy_busy_buffers_size 256k;
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>  }
</span></span></code></pre></div><p>Mind you, the above values (that I found in almost every blog dealing with this problem) are likely too big and should be trimmed down. That&rsquo;s my next task, using <a href="https://www.getpagespeed.com/server-setup/nginx/tuning-proxy_buffer_size-in-nginx">this</a> excellent article for guidance.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The loneliness of the low ranking tennis player</title>
      <link>https://nicolaiarocci.com/the-loneliness-of-the-low-ranking-tennis-player/</link>
      <pubDate>Thu, 12 Sep 2024 10:35:10 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-loneliness-of-the-low-ranking-tennis-player/</guid>
      <description>&lt;p&gt;I admit, like many of my compatriots in this last year and a half, I follow a lot more tennis than usual, and it is all the fault (or merit) of Jannick Sinner. The top-level pro tennis field appears distant, privileged, brilliant and rewarding. We appreciate the immense talent of these players and sympathize with the struggle and stress they undergo. We praise their character, determination, and mental strength. They make a lot of money, so we infer they conduct fulfilling and satisfying lives. Most fans, however, ignore how crowded, harsh, lonely, and unapologetic professional players&amp;rsquo; lives are below the elite.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I admit, like many of my compatriots in this last year and a half, I follow a lot more tennis than usual, and it is all the fault (or merit) of Jannick Sinner. The top-level pro tennis field appears distant, privileged, brilliant and rewarding. We appreciate the immense talent of these players and sympathize with the struggle and stress they undergo. We praise their character, determination, and mental strength. They make a lot of money, so we infer they conduct fulfilling and satisfying lives. Most fans, however, ignore how crowded, harsh, lonely, and unapologetic professional players&rsquo; lives are below the elite.</p>
<p><a href="https://www.theguardian.com/sport/article/2024/jun/27/the-loneliness-of-the-low-ranking-tennis-player">The Loneliness of the Low-ranking Tennis Player</a>, by Conor Niland, chronicles the life of players at the Challenger and Futures levels, one or two steps below the elite. Sinner, Alcaraz, and most other stars have only skimmed through these purgatorial circles thanks to their talent, and still, hundreds spend their entire career trapped in there, and it&rsquo;s not as pretty as we, the laymen, may think.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why Github actually won</title>
      <link>https://nicolaiarocci.com/why-github-actually-won/</link>
      <pubDate>Tue, 10 Sep 2024 11:15:01 +0200</pubDate>
      <guid>https://nicolaiarocci.com/why-github-actually-won/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In the end we won because the open source community started to converge on distributed version control and we were the only ones in the hosting space that truly cared about how developers worked at all. The only ones who questioned it, approached it from first principles, tried to make it better holistically rather than just throwing more features onto something existing in order to sell it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Full story &lt;a href=&#34;https://blog.gitbutler.com/why-github-actually-won/&#34;&gt;here&lt;/a&gt;. A great run-down by Scott Cahon himself on why Git and then GitHub won the version control system war.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>In the end we won because the open source community started to converge on distributed version control and we were the only ones in the hosting space that truly cared about how developers worked at all. The only ones who questioned it, approached it from first principles, tried to make it better holistically rather than just throwing more features onto something existing in order to sell it.</p></blockquote>
<p>Full story <a href="https://blog.gitbutler.com/why-github-actually-won/">here</a>. A great run-down by Scott Cahon himself on why Git and then GitHub won the version control system war.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Solar will get unfathomably cheap</title>
      <link>https://nicolaiarocci.com/solar-will-get-unfathomably-cheap/</link>
      <pubDate>Wed, 04 Sep 2024 10:09:29 +0200</pubDate>
      <guid>https://nicolaiarocci.com/solar-will-get-unfathomably-cheap/</guid>
      <description>&lt;p&gt;At home, we haven’t done anything about it yet: we’re still 100% grid-dependant and old-fashioned, partly because it would be problematic for us as we live in an apartment building and partly because, frankly, it still seems expensive, especially with three kids studying away from home. Also, I want to avoid getting entangled in another project; my mental bandwidth is limited (and I suspect it will only worsen over time.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>At home, we haven’t done anything about it yet: we’re still 100% grid-dependant and old-fashioned, partly because it would be problematic for us as we live in an apartment building and partly because, frankly, it still seems expensive, especially with three kids studying away from home. Also, I want to avoid getting entangled in another project; my mental bandwidth is limited (and I suspect it will only worsen over time.)</p>
<p>But I follow the solar energy topic and stay up to speed, as I want to take action one day. Here are two articles I read just in the last couple of days. In many aspects, they are similar, and both draw very optimistic conclusions: solar will get unfathomably cheap.</p>
<ul>
<li><a href="https://climate.benjames.io/solar-will-get-too-cheap-to-connect-to-the-power-grid/">Solar will get too cheap to connect to the grid</a>, by Ben James</li>
<li><a href="https://archive.is/4OtEA">What Will We Do With Our Free Power?</a>, By David Wallace-Wells</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>The secret inside One Million Checkboxes</title>
      <link>https://nicolaiarocci.com/the-secret-inside-one-million-checkboxes/</link>
      <pubDate>Fri, 30 Aug 2024 09:52:11 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-secret-inside-one-million-checkboxes/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A few days into making One Million Checkboxes I thought I’d been hacked. What was that doing in my database? A few hours later I was tearing up, proud of some brilliant teens.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Full story &lt;a href=&#34;https://eieio.games/essays/the-secret-in-one-million-checkboxes/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What a great story. Teenagers who are enthusiastic about hacking and coding and have lots of fun in creative ways. It reminds me so much of my teenage years, like when assembling a fake backdoor on Lorien, my first BBS, as a honeypot to attract local hackers so I could later reach out and get to know them&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>A few days into making One Million Checkboxes I thought I’d been hacked. What was that doing in my database? A few hours later I was tearing up, proud of some brilliant teens.</p></blockquote>
<p>Full story <a href="https://eieio.games/essays/the-secret-in-one-million-checkboxes/">here</a>.</p>
<p>What a great story. Teenagers who are enthusiastic about hacking and coding and have lots of fun in creative ways. It reminds me so much of my teenage years, like when assembling a fake backdoor on Lorien, my first BBS, as a honeypot to attract local hackers so I could later reach out and get to know them<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Long gone are those days, and I wish I still had that kind of drive.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Which was a successful attempt. We formed a team that went on to crack <a href="https://artofhacking.com/tucops3/hack/networks/live/aoh_itapac.htm">ITAPAC</a> (we&rsquo;re talking pre-Internet era) and do other funny things.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Infocom: The Documentary</title>
      <link>https://nicolaiarocci.com/infocom-the-documentary/</link>
      <pubDate>Thu, 29 Aug 2024 15:15:42 +0200</pubDate>
      <guid>https://nicolaiarocci.com/infocom-the-documentary/</guid>
      <description>&lt;p&gt;For nerds of my generation, Infocom is a legend. Today, I watched the long-time overdue &lt;em&gt;Infocom: The Documentary&lt;/em&gt; and I found it to be a gem.&lt;/p&gt;
&lt;p&gt;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/OXNLWy7rwH4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;With no commentary or narration but made up of the protagonists’ testimonies alone, it effectively evokes the excitement and enthusiasm around the early computer game industry (and software development in general) of those early years. It is also a cautionary tale about how easy it is to fall once you reach the peak&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>For nerds of my generation, Infocom is a legend. Today, I watched the long-time overdue <em>Infocom: The Documentary</em> and I found it to be a gem.</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OXNLWy7rwH4?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<!-- raw HTML omitted --></p>
<p>With no commentary or narration but made up of the protagonists’ testimonies alone, it effectively evokes the excitement and enthusiasm around the early computer game industry (and software development in general) of those early years. It is also a cautionary tale about how easy it is to fall once you reach the peak<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>If you dig this type of retro content, check out <a href="https://www.youtube.com/watch?v=zEJXZ2wnO3w">GET LAMP: The Text Adventure Documentary</a>, from which <em>Infocom: The Documentary</em> was extracted.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>I&#39;m leaving Twitter/X</title>
      <link>https://nicolaiarocci.com/im-leaving-twitter/x/</link>
      <pubDate>Wed, 14 Aug 2024 08:20:39 +0200</pubDate>
      <guid>https://nicolaiarocci.com/im-leaving-twitter/x/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m abandoning Twitter/X. I&amp;rsquo;ll freeze the account without deleting it; never say never, but I don&amp;rsquo;t plan on coming back. I no longer feel comfortable on that platform and haven&amp;rsquo;t been for a while.&lt;/p&gt;
&lt;p&gt;If you still want to follow me (I&amp;rsquo;d love for you to do so), the best option is &lt;a href=&#34;https://nicolaiarocci.com&#34;&gt;my website&lt;/a&gt;  where I always post first (RSS feed &lt;a href=&#34;https://nicolaiarocci.com/index.xml&#34;&gt;here&lt;/a&gt;), the &lt;a href=&#34;https://buttondown.email/nicolaiarocci&#34;&gt;mailing list&lt;/a&gt;, or &lt;a href=&#34;https://fosstodon.org/@nicola&#34;&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m abandoning Twitter/X. I&rsquo;ll freeze the account without deleting it; never say never, but I don&rsquo;t plan on coming back. I no longer feel comfortable on that platform and haven&rsquo;t been for a while.</p>
<p>If you still want to follow me (I&rsquo;d love for you to do so), the best option is <a href="https://nicolaiarocci.com">my website</a>  where I always post first (RSS feed <a href="https://nicolaiarocci.com/index.xml">here</a>), the <a href="https://buttondown.email/nicolaiarocci">mailing list</a>, or <a href="https://fosstodon.org/@nicola">Mastodon</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The crazy engineering of Venice</title>
      <link>https://nicolaiarocci.com/the-crazy-engineering-of-venice/</link>
      <pubDate>Mon, 05 Aug 2024 16:45:00 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-crazy-engineering-of-venice/</guid>
      <description>&lt;p&gt;We spent a weekend in Venice&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; a short while ago, and one of the things that caught my attention was the wells in the city&amp;rsquo;s squares. Is there fresh water underneath that brackish swamp water? Well, no. The water from the wells in Venice is rainwater, collected by an ingenious hydraulic collection system that leveraged the square and surrounding buildings.&lt;/p&gt;
&lt;p&gt;I learned this and other intriguing tidbits by watching &lt;a href=&#34;https://youtu.be/77omYd0JOeA&#34;&gt;The Crazy Engineering of Venice&lt;/a&gt; on YouTube.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We spent a weekend in Venice<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> a short while ago, and one of the things that caught my attention was the wells in the city&rsquo;s squares. Is there fresh water underneath that brackish swamp water? Well, no. The water from the wells in Venice is rainwater, collected by an ingenious hydraulic collection system that leveraged the square and surrounding buildings.</p>
<p>I learned this and other intriguing tidbits by watching <a href="https://youtu.be/77omYd0JOeA">The Crazy Engineering of Venice</a> on YouTube.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>We were in Venice on a sailing trip, but that&rsquo;s for another post.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Capability makes you life simpler</title>
      <link>https://nicolaiarocci.com/capability-makes-you-life-simpler/</link>
      <pubDate>Mon, 05 Aug 2024 11:59:37 +0200</pubDate>
      <guid>https://nicolaiarocci.com/capability-makes-you-life-simpler/</guid>
      <description>&lt;p&gt;Quoting &lt;a href=&#34;https://www.bryanbraun.com/2024/07/31/capability-makes-your-life-simpler/&#34;&gt;Bryan Baun&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Capability makes your life simpler. Tolerance, skills, knowledge, and health are always with you, wherever you go. They are assets but they take up no space. They are stored in your body. Some lack capability through no fault of their own, but anyone can increase their capability. It’s an investment that pays dividends every day.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>Quoting <a href="https://www.bryanbraun.com/2024/07/31/capability-makes-your-life-simpler/">Bryan Baun</a>:</p>
<blockquote>
<p>Capability makes your life simpler. Tolerance, skills, knowledge, and health are always with you, wherever you go. They are assets but they take up no space. They are stored in your body. Some lack capability through no fault of their own, but anyone can increase their capability. It’s an investment that pays dividends every day.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Digital market is going back to 20th century</title>
      <link>https://nicolaiarocci.com/digital-market-is-going-back-to-20th-century/</link>
      <pubDate>Thu, 01 Aug 2024 14:54:18 +0200</pubDate>
      <guid>https://nicolaiarocci.com/digital-market-is-going-back-to-20th-century/</guid>
      <description>&lt;p&gt;Rand Fishkin on the evolution of digital marketing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Well, marketing friends, we gotta have a serious talk. Because the way we’ve done marketing for the last twenty years is ending. I’m serious. I believe that Rand in 2010 would have told you that digital marketing was all about being able to track every view and every click, so that when conversions happened, we could perfectly attribute them, is wrong today. Back then, we could say: &lt;em&gt;“Oh, this piece of content, this advertisement, this PR investment, this word-of-mouth effort is worthwhile because it turned into this trackable, perfectly attributable series of events in our analytics.”&lt;/em&gt; It doesn’t work this way anymore.  That’s because clicks are dying and attribution is dying. There’s only one way forward.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Rand Fishkin on the evolution of digital marketing:</p>
<blockquote>
<p>Well, marketing friends, we gotta have a serious talk. Because the way we’ve done marketing for the last twenty years is ending. I’m serious. I believe that Rand in 2010 would have told you that digital marketing was all about being able to track every view and every click, so that when conversions happened, we could perfectly attribute them, is wrong today. Back then, we could say: <em>“Oh, this piece of content, this advertisement, this PR investment, this word-of-mouth effort is worthwhile because it turned into this trackable, perfectly attributable series of events in our analytics.”</em> It doesn’t work this way anymore.  That’s because clicks are dying and attribution is dying. There’s only one way forward.</p></blockquote>
<p>A 7 minutes video, with transcript, is available <a href="https://sparktoro.com/blog/attribution-is-dying-clicks-are-dying-marketing-is-going-back-to-the-20th-century/">here</a>.</p>
<p>Yes, he&rsquo;s stating the obvious in some ways, but it&rsquo;s his job to spread the word to the masses, and he&rsquo;s been doing that for quite a long time. I remember seeing him on stage in San Marino many years ago when his gospel was about SEO, SERP attribution, and traceability. I am glad to find that he&rsquo;s still on the go.</p>
<p>My colleague Stefano correctly points out that Rand&rsquo;s final advice on moving where the public is today is sound and reasonable, but it is nothing new. It&rsquo;s always been about that. In 2014, we went to Google AdWords and the likes because that&rsquo;s where the public was back then. In the 2020s, the public has flocked to platforms&rsquo; walled gardens and digital marketers follow the herd, like a pack of wolves.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Solarpunk Manifesto</title>
      <link>https://nicolaiarocci.com/a-solarpunk-manifesto/</link>
      <pubDate>Thu, 01 Aug 2024 09:03:43 +0200</pubDate>
      <guid>https://nicolaiarocci.com/a-solarpunk-manifesto/</guid>
      <description>&lt;p&gt;I dig the attempt at a &lt;a href=&#34;https://www.re-des.org/es/a-solarpunk-manifesto/&#34;&gt;Solarpunk Manifesto&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Solarpunk is a movement in speculative fiction, art, fashion, and activism that seeks to answer and embody the question “what does a sustainable civilization look like, and how can we get there?”&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The aesthetics of solarpunk merge the practical with the beautiful, the well-designed with the green and lush, the bright and colorful with the earthy and solid.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Solarpunk can be utopian, just optimistic, or concerned with the struggles en route to a better world ,  but never dystopian. As our world roils with calamity, we need solutions, not only warnings.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I dig the attempt at a <a href="https://www.re-des.org/es/a-solarpunk-manifesto/">Solarpunk Manifesto</a>.</p>
<blockquote>
<p>Solarpunk is a movement in speculative fiction, art, fashion, and activism that seeks to answer and embody the question “what does a sustainable civilization look like, and how can we get there?”</p></blockquote>
<blockquote>
<p>The aesthetics of solarpunk merge the practical with the beautiful, the well-designed with the green and lush, the bright and colorful with the earthy and solid.</p></blockquote>
<blockquote>
<p>Solarpunk can be utopian, just optimistic, or concerned with the struggles en route to a better world ,  but never dystopian. As our world roils with calamity, we need solutions, not only warnings.</p></blockquote>
<blockquote>
<p>Solutions to thrive without fossil fuels, to equitably manage real scarcity and share in abundance instead of supporting false scarcity and false abundance, to be kinder to each other and to the planet we share.</p></blockquote>
<blockquote>
<p>Solarpunk is at once a vision of the future, a thoughtful provocation, a way of living and a set of achievable proposals to get there.</p></blockquote>
<p>I&rsquo;m too compromised and ahead in age to make it my own. Still, I hope this movement has traction among young people, especially those in my field—optimism and activism instead of denial and despair.</p>
<p>Read the whole document <a href="https://www.re-des.org/es/a-solarpunk-manifesto/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>David Foster Wallace on screen time</title>
      <link>https://nicolaiarocci.com/david-foster-wallace-on-screen-time/</link>
      <pubDate>Mon, 29 Jul 2024 17:21:05 +0200</pubDate>
      <guid>https://nicolaiarocci.com/david-foster-wallace-on-screen-time/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cause the technology is just gonna get better and better and it&amp;rsquo;s gonna get easier and easier and more and more convenient and more and more pleasurable to sit alone with images on a screen given to us by people who do not love us but want our money and that&amp;rsquo;s fine in low doses but if it&amp;rsquo;s the basic main staple of your diet you&amp;rsquo;re gonna die.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.quotes.net/mquote/1089473&#34;&gt;David Foster Wallace&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Cause the technology is just gonna get better and better and it&rsquo;s gonna get easier and easier and more and more convenient and more and more pleasurable to sit alone with images on a screen given to us by people who do not love us but want our money and that&rsquo;s fine in low doses but if it&rsquo;s the basic main staple of your diet you&rsquo;re gonna die.</p></blockquote>
<p>&ndash; <a href="https://www.quotes.net/mquote/1089473">David Foster Wallace</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The tour of Mount Civetta in the Dolomites</title>
      <link>https://nicolaiarocci.com/the-tour-of-mount-civetta-in-the-dolomites/</link>
      <pubDate>Mon, 29 Jul 2024 15:25:30 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-tour-of-mount-civetta-in-the-dolomites/</guid>
      <description>&lt;p&gt;I left home at 5 AM on my Triumph Bonneville, arrived in Palafavera at about 9 AM, and left on foot half an hour later. I was eager to see the Civetta&amp;rsquo;s northwest face again, and it was as I remembered it: giant, looming, impressive, intimidating, outstanding. As I crossed the valley below, I thought about Marco Anghilleri, who completed the first winter repeat of the Solleder route on that wall, and just then, I came across a plaque, just below the summit&amp;rsquo;s vertical, announcing his passing on the Central Freney Pylon in 2014. He fell while attempting the first winter solo of a challenging route there.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I left home at 5 AM on my Triumph Bonneville, arrived in Palafavera at about 9 AM, and left on foot half an hour later. I was eager to see the Civetta&rsquo;s northwest face again, and it was as I remembered it: giant, looming, impressive, intimidating, outstanding. As I crossed the valley below, I thought about Marco Anghilleri, who completed the first winter repeat of the Solleder route on that wall, and just then, I came across a plaque, just below the summit&rsquo;s vertical, announcing his passing on the Central Freney Pylon in 2014. He fell while attempting the first winter solo of a challenging route there.</p>
<p><figure>
    <img loading="lazy" src="/images/civetta4.jpg"
         alt="Coldai Lake, immediately above the refuge and the homonymous saddle, at 2143 mt. On the left in the background is a glimpse of the huge west face of Civetta."/> <figcaption>
            <p>Coldai Lake, immediately above the refuge and the homonymous saddle, at 2143 mt. On the left in the background is a glimpse of the huge west face of Civetta.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/civetta10.jpg"
         alt="The monumental northwest face of Civetta, more than 1,000 meters of vertical rock with a total extension of more than 4 km"/> <figcaption>
            <p>The monumental northwest face of Civetta, more than 1,000 meters of vertical rock with a total extension of more than 4 km</p>
        </figcaption>
</figure>
</p>
<p>After the fork to the Rifugio Tissi, the crowd (literally) disappeared. We are on the Alta Via 1, which has become an international attraction since I walked it almost thirty years ago: French, Dutch, Americans, and Italians, all lining up to complete it, and I guess it is a good thing, or maybe not? I snacked on one of the two small sandwiches I had bought at a café in Zoldo, enjoying the sunshine in a surprisingly flat clearing that was undoubtedly once an alpine pasture. I was low on water but heard water running nearby as I ate. And indeed, there was a stream just a few meters from me, and I refilled my water bottle. This canteen has a water filter and costs a lot, but it grants safety and peace of mind. It is too bad it is small; I should have gotten the 1L version. 0.6L is small when you are out all day in the sun in summer, and there&rsquo;s little to no water around.</p>
<p><figure>
    <img loading="lazy" src="/images/civetta9.jpg"
         alt="Cason del Col Raen, a splendid and lonely alpine pasture, now abandoned."/> <figcaption>
            <p>Cason del Col Raen, a splendid and lonely alpine pasture, now abandoned.</p>
        </figcaption>
</figure>


<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/991563027?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Giro del Civetta - Cason di Col Rean"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
</p>
<p>The evening at Rifugio Vazzoler was enjoyable. I had dinner at a table outside, sitting with five French people and one Spaniard. The French were two groups: three guys from Paris fleeing the 2024 Olympics and a couple from Lyon. She speaks Italian and breeds horses for a living, while he is an ultra-marathon runner who is a bit introverted and sulky but definitely on the ball. After the others went to bed, I chatted a little longer with Javier from Malaga. Last year, he did the Tour du Mont Blanc solo, his first real hiking experience. Remarkable. Like everyone else (except me) at the Vazzoler, he is now doing the Alta Via 1. After so much time avoiding them, I reevaluated the Alpine hut experience. In recent years, I have opted for wild camping away from the crowds. Still, the social aspect of sharing the experience in a cosy facility after a long day of strenuous hiking makes it all magical and unforgettable. There is another great advantage to the shelter: fewer logistical difficulties and less weight (tent, sleeping bag, stove, food) to carry around, which is no small thing, especially at 54. Looming over Vazzoler are Torre Venezia and Torre Trieste, the first of which I climbed almost thirty years ago. It was good to see it again and recall those strong emotions.</p>
<figure>
    <img loading="lazy" src="/images/civetta8.jpg"
         alt="Torre Venezia as seen from Rifugio Vazzoler, where I spent the night."/> <figcaption>
            <p>Torre Venezia as seen from Rifugio Vazzoler, where I spent the night.</p>
        </figcaption>
</figure>

<p>After a restful night (I wouldn&rsquo;t have guessed it, I was in a dormitory with 24 beds-luckily the one next to me was empty, and on the other side, I had the wooden wall-apt choice) I set off for the second and (much) more challenging stage, the one that would climb the very steep wall leading to Van delle Sasse and the fork above, then traverse the challenging Tivan Trail to Rifugio Coldai and then back to Palafavera. The climb was steady for almost 2 1/2 hours, always in an exciting environment. I never cease to be amazed at the wit of the hunters and hikers who, in ages long gone, have traced these daring routes. The Van delle Sasse is an isolated and wonderful high-altitude basin. There are no words to describe it. Almost unreachable, lonely, circled by a crown of peaks, with a flat, green plain just below the fork. It is the result of what used to be at the bottom of a massive glacier of lost epic. As I left early, I got up there first and met nobody the whole time. I rested and ate dried fruit at the Forcella delle Sasse above.</p>
<p><figure>
    <img loading="lazy" src="/images/civetta7.jpg"
         alt="Torre Venezia (left) illuminated by the first light of dawn. I climbed the tower some 30 years ago. As always in mountaineering, the structure seen from afar is much more awe-inspiring than when you are in its arms."/> <figcaption>
            <p>Torre Venezia (left) illuminated by the first light of dawn. I climbed the tower some 30 years ago. As always in mountaineering, the structure seen from afar is much more awe-inspiring than when you are in its arms.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/civetta6.jpg"
         alt="Forcella delle Sasse seen from Van delle Sasse below. The photo does not render the idea. At the foot of the fork, what appears to be a small green area is actually a plane at least the size of a soccer field, completely flat, green and perfect for camping at altitude."/> <figcaption>
            <p>Forcella delle Sasse seen from Van delle Sasse below. The photo does not render the idea. At the foot of the fork, what appears to be a small green area is actually a plane at least the size of a soccer field, completely flat, green and perfect for camping at altitude.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/civetta5.jpg"
         alt="Van delle Sasse, seen from the Forcella delle Sasse. This is certainly one of the most remote and inaccessible places I have reached in my mountaineering experience."/> <figcaption>
            <p>Van delle Sasse, seen from the Forcella delle Sasse. This is certainly one of the most remote and inaccessible places I have reached in my mountaineering experience.</p>
        </figcaption>
</figure>


<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/991563083?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Giro del Civetta - Van delle Sasse"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
</p>
<p>I began the rugged and steep descent, first on an equipped section (a few meters of iron cable), then on a very steep and slippery scree, and then I took the Tivan Trail to the left, which I must say I had underestimated. Very long, a continuous up and down at the foot of the looming Civetta walls. When it connects with the trail that goes up to Coldai from Pecol, it becomes a steady though not steep climb, interrupted often by exposed and equipped (again, iron cables) downhill sections, practically until the vicinity of the refuge. Tivan Trail is a wild, strenuous, exposed, lonely, precious experience. I was alone the whole time.</p>
<p><figure>
    <img loading="lazy" src="/images/civetta3.jpg"
         alt="View looking east from Forcella delle Sasse, the highest point of the route at 2476 meters."/> <figcaption>
            <p>View looking east from Forcella delle Sasse, the highest point of the route at 2476 meters.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/civetta2.jpg"
         alt="Monte Pelmo as seen from the Tivan Trail. I climbed Pelmo solo about 25 years ago: it is still there."/> <figcaption>
            <p>Monte Pelmo as seen from the Tivan Trail. I climbed Pelmo solo about 25 years ago: it is still there.</p>
        </figcaption>
</figure>
</p>
<p>I arrived at the hut very tired. There, I ate the sandwich the Vazzoler guys had made me, drank a Radler (a mixture of beer and Lemon soda the Germans like to drink; it didn&rsquo;t particularly quench my thirst), and walked down back for one more hour to the parking lot, where my trusty Bonneville was waiting for me.</p>
<figure>
    <img loading="lazy" src="/images/civetta1.jpg"
         alt="The much-coveted Rifugio Coldai, as seen on my return from the two-days Tour of Mount Civetta trail. From there, it&rsquo;s only one more hour of descent till the parking, where my trusty Triumph Bonneville awaits."/> <figcaption>
            <p>The much-coveted Rifugio Coldai, as seen on my return from the two-days Tour of Mount Civetta trail. From there, it&rsquo;s only one more hour of descent till the parking, where my trusty Triumph Bonneville awaits.</p>
        </figcaption>
</figure>

<p>It was a glorious day. Unfortunately, I sprained my ankle (my usual ankle) shortly after starting the climb to Van delle Sasse. I was sore but didn&rsquo;t stop for a moment, and it slowly became manageable. Later, on a vertically equipped section on the descent, now 20 minutes, maybe less from the Coldai hut, I sprained the ankle again, which hurt a lot more this time. From experience, I was expecting this second accident to happen. I let out a terrible scream, I&rsquo;m afraid, but I was alone, and no one could have helped me anyway. I slowly dragged myself to the hut, one step after another, hiking poles being crucial in this situation. Strangely enough, after lunch at Coldai, I could descend to Palafavera almost normally, with virtually no pain.</p>
<p>After the second sprain, I sat, looked at the view, and said, &ldquo;OK, this is my goodbye to the mountains.&rdquo; I can&rsquo;t hurt my ankle that often: it&rsquo;s a problem, a fragility that sooner or later could put me in serious trouble, especially since I go solo on wild trails like the Tivan. I was convinced. But at the same time, I started wondering what I could do about it. Have Dr Calderoni examine me, maybe talk to him about my problem and hear if/what can be done, even if only on the level of rehabilitation exercise (I&rsquo;m very pessimistic: I&rsquo;ve been exercising for years, ankles included). I&rsquo;ve been thinking about the ankle braces that Jannik Sinner and other professional tennis players use. On my first day back from the trip, I ordered something similar on Amazon.</p>
<p>Today, I am less convinced about my goodbye to the mountain<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>GPS track, more pictures, and statics are available <a href="https://out.ac/IVZArE">here</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>ShellCheck</title>
      <link>https://nicolaiarocci.com/shellcheck/</link>
      <pubDate>Wed, 24 Jul 2024 14:59:21 +0200</pubDate>
      <guid>https://nicolaiarocci.com/shellcheck/</guid>
      <description>&lt;p&gt;Today I &lt;a href=&#34;https://www.simplermachines.com/how-to-write-better-bash-than-chatgpt/&#34;&gt;learned&lt;/a&gt; about &lt;a href=&#34;https://github.com/koalaman/shellcheck&#34;&gt;ShellCheck&lt;/a&gt;, a static analysis tool that &amp;ldquo;finds bugs in your scripts&amp;rdquo;. It can and should be run on the command line, but an &lt;a href=&#34;https://www.shellcheck.net&#34;&gt;online version&lt;/a&gt; is also available. It catches most style and syntax errors and has plenty of options, like ignoring specific errors and warnings, which is helpful in CI scenarios.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I <a href="https://www.simplermachines.com/how-to-write-better-bash-than-chatgpt/">learned</a> about <a href="https://github.com/koalaman/shellcheck">ShellCheck</a>, a static analysis tool that &ldquo;finds bugs in your scripts&rdquo;. It can and should be run on the command line, but an <a href="https://www.shellcheck.net">online version</a> is also available. It catches most style and syntax errors and has plenty of options, like ignoring specific errors and warnings, which is helpful in CI scenarios.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Bash-Oneliner: a collection of terminal tricks for Linux</title>
      <link>https://nicolaiarocci.com/bash-oneliner-a-collection-of-terminal-tricks-for-linux/</link>
      <pubDate>Mon, 22 Jul 2024 15:51:51 +0200</pubDate>
      <guid>https://nicolaiarocci.com/bash-oneliner-a-collection-of-terminal-tricks-for-linux/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/onceupon/Bash-Oneliner&#34;&gt;Bash-Oneliner&lt;/a&gt; is an excellent resource for Bash/Linux users. Most of the &amp;ldquo;tricks&amp;rdquo; are well-known, but there is always something to learn. More importantly, finding them all well organized in one file is rare.&lt;/p&gt;
&lt;p&gt;I use the reverse lookup of bash-history (Ctrl+R) daily. Still, only today (thanks to an HN &lt;a href=&#34;https://news.ycombinator.com/item?id=41033120&#34;&gt;comment&lt;/a&gt; on Bash-Onliner) did I learn that it also preserves one&amp;rsquo;s comments, which can be exploited to invoke complex commands quickly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-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;$ mv -n ~/Desktop/*.pdf ~/Documents/PDF_Archive/  &lt;span style=&#34;font-style:italic&#34;&gt;#pdfsync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, you simply Ctrl-R and type &amp;ldquo;pdfsync&amp;rdquo; to recall the above command when needed. Neat.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/onceupon/Bash-Oneliner">Bash-Oneliner</a> is an excellent resource for Bash/Linux users. Most of the &ldquo;tricks&rdquo; are well-known, but there is always something to learn. More importantly, finding them all well organized in one file is rare.</p>
<p>I use the reverse lookup of bash-history (Ctrl+R) daily. Still, only today (thanks to an HN <a href="https://news.ycombinator.com/item?id=41033120">comment</a> on Bash-Onliner) did I learn that it also preserves one&rsquo;s comments, which can be exploited to invoke complex commands quickly:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ mv -n ~/Desktop/*.pdf ~/Documents/PDF_Archive/  <span style="font-style:italic">#pdfsync</span>
</span></span></code></pre></div><p>Then, you simply Ctrl-R and type &ldquo;pdfsync&rdquo; to recall the above command when needed. Neat.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The main issue with social media</title>
      <link>https://nicolaiarocci.com/the-main-issue-with-social-media/</link>
      <pubDate>Thu, 18 Jul 2024 09:40:28 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-main-issue-with-social-media/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The main issue with social media is that we want them to be everything. We want them to be a place for casual interactions, for discovery, for news, for serious discourse. And that’s a mistake. Because the moment you put a stupid amount of people in one room and you let them do whatever they want the only reasonable outcome you can expect is chaos. Sure, you might get some positive results out of it but you’ll also likely get someone shitting in a corner and someone trying to fuck the power outlet. Because that’s the world we live in. Now sprinkle some nonsense AI on top of it all and Bob’s your uncle.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The main issue with social media is that we want them to be everything. We want them to be a place for casual interactions, for discovery, for news, for serious discourse. And that’s a mistake. Because the moment you put a stupid amount of people in one room and you let them do whatever they want the only reasonable outcome you can expect is chaos. Sure, you might get some positive results out of it but you’ll also likely get someone shitting in a corner and someone trying to fuck the power outlet. Because that’s the world we live in. Now sprinkle some nonsense AI on top of it all and Bob’s your uncle.</p></blockquote>
<p>&ndash; <a href="https://manuelmoreale.com/should-you-give-up-social-media">Manuel Moreale</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The art of not reading</title>
      <link>https://nicolaiarocci.com/the-art-of-not-reading/</link>
      <pubDate>Thu, 18 Jul 2024 08:54:22 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-art-of-not-reading/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The art of not reading is a very important one. It consists in not taking an interest in whatever may be engaging the attention of the general public at any particular time. When some political or ecclesiastical pamphlet, or novel, or poem is making a great commotion, you should remember that he who writes for fools always finds a large public. - A precondition for reading good books is not reading bad ones: for life is short.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The art of not reading is a very important one. It consists in not taking an interest in whatever may be engaging the attention of the general public at any particular time. When some political or ecclesiastical pamphlet, or novel, or poem is making a great commotion, you should remember that he who writes for fools always finds a large public. - A precondition for reading good books is not reading bad ones: for life is short.</p></blockquote>
<p>&ndash; <a href="https://www.goodreads.com/quotes/255277-the-art-of-not-reading-is-a-very-important-one">Arthur Schopenhauer</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>A guide to Miyazaki weird little guys</title>
      <link>https://nicolaiarocci.com/a-guide-to-miyazaki-weird-little-guys/</link>
      <pubDate>Thu, 18 Jul 2024 08:44:46 +0200</pubDate>
      <guid>https://nicolaiarocci.com/a-guide-to-miyazaki-weird-little-guys/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;With so many weird little guys running around Miyazaki’s filmography, it seems time to honor and celebrate them. [&amp;hellip;] A key aspect of Miyazaki’s weird little guys is how numerous they are. They’re a swarm, frequently providing little moments of comic relief as they move coal or swim through the sea. Their designs are quite simple, but their meaning frequently is not.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More &lt;a href=&#34;https://www.vulture.com/article/miyazaki-weird-little-guys.html&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>With so many weird little guys running around Miyazaki’s filmography, it seems time to honor and celebrate them. [&hellip;] A key aspect of Miyazaki’s weird little guys is how numerous they are. They’re a swarm, frequently providing little moments of comic relief as they move coal or swim through the sea. Their designs are quite simple, but their meaning frequently is not.</p></blockquote>
<p>More <a href="https://www.vulture.com/article/miyazaki-weird-little-guys.html">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Microsoft MVP</title>
      <link>https://nicolaiarocci.com/microsoft-mvp-ninth-time/</link>
      <pubDate>Thu, 11 Jul 2024 15:11:50 +0200</pubDate>
      <guid>https://nicolaiarocci.com/microsoft-mvp-ninth-time/</guid>
      <description>&lt;p&gt;Last night, I was at an outdoor theatre with Serena, watching Anatomy of a Fall (an excellent film). Outdoor theatres are becoming rare, which is a pity, and &lt;a href=&#34;https://maps.app.goo.gl/j7t3SigtkPtKnB22A&#34;&gt;Arena del Sole&lt;/a&gt; is lovely with its strong vintage, 80s vibe. There&amp;rsquo;s little as pleasant as watching a film under the stars with your loved one on a quiet summer evening.&lt;/p&gt;
&lt;p&gt;Anyway, in the pause, I glanced at my e-mails and discovered I had been again granted the &lt;a href=&#34;https://mvp.microsoft.com/en-US/mvp/profile/a6892d61-aea0-e511-8114-c4346bac0abc&#34;&gt;Microsoft MVP Award&lt;/a&gt;. It is the ninth consecutive year, and I&amp;rsquo;m grateful and happy the journey continues. At this point, I should put in some extra effort to reach the 10-year milestone next year.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last night, I was at an outdoor theatre with Serena, watching Anatomy of a Fall (an excellent film). Outdoor theatres are becoming rare, which is a pity, and <a href="https://maps.app.goo.gl/j7t3SigtkPtKnB22A">Arena del Sole</a> is lovely with its strong vintage, 80s vibe. There&rsquo;s little as pleasant as watching a film under the stars with your loved one on a quiet summer evening.</p>
<p>Anyway, in the pause, I glanced at my e-mails and discovered I had been again granted the <a href="https://mvp.microsoft.com/en-US/mvp/profile/a6892d61-aea0-e511-8114-c4346bac0abc">Microsoft MVP Award</a>. It is the ninth consecutive year, and I&rsquo;m grateful and happy the journey continues. At this point, I should put in some extra effort to reach the 10-year milestone next year.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Write a lot</title>
      <link>https://nicolaiarocci.com/write-a-lot/</link>
      <pubDate>Wed, 10 Jul 2024 15:39:47 +0200</pubDate>
      <guid>https://nicolaiarocci.com/write-a-lot/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Write a lot. This is alpha and omega of writing advice, the beginning and the end, and it&amp;rsquo;s that way for a reason– I don’t know anyone who’s good writing who hasn’t also put in serious hours.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.simplermachines.com/how-to-write/&#34;&gt;Nat Bennet&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Write a lot. This is alpha and omega of writing advice, the beginning and the end, and it&rsquo;s that way for a reason– I don’t know anyone who’s good writing who hasn’t also put in serious hours.</p></blockquote>
<p>&ndash; <a href="https://www.simplermachines.com/how-to-write/">Nat Bennet</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>A library is a good place</title>
      <link>https://nicolaiarocci.com/a-library-is-a-good-place/</link>
      <pubDate>Wed, 10 Jul 2024 15:36:17 +0200</pubDate>
      <guid>https://nicolaiarocci.com/a-library-is-a-good-place/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I’ve always loved libraries. They are a glimpse of the kind of ‘better world’ we all want to live in. That’s because by their very nature they are inclusive and welcoming. Anyone who walks through the doors of a library is reminded, just by inhaling the air of the library, just by being embraced by its atmosphere, to be a kinder and more caring person, and to forget, for a moment, the usual rules of our capitalistic society.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I’ve always loved libraries. They are a glimpse of the kind of ‘better world’ we all want to live in. That’s because by their very nature they are inclusive and welcoming. Anyone who walks through the doors of a library is reminded, just by inhaling the air of the library, just by being embraced by its atmosphere, to be a kinder and more caring person, and to forget, for a moment, the usual rules of our capitalistic society.</p></blockquote>
<blockquote>
<p>A library is a good place.</p></blockquote>
<p>&ndash; <a href="https://rebeccatoh.co/somewhere/">Rebecca Toh</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting J.P. Wing</title>
      <link>https://nicolaiarocci.com/quoting-j.p.-wing/</link>
      <pubDate>Mon, 24 Jun 2024 17:15:33 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-j.p.-wing/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;When I’m out hiking on my weekend hike I often spend much of the experience in contemplation. My thoughts are usually tickling at Warp 10, going everywhere possible at once, but then I ramp it back a bit and I just think about an assortment of topics at any given moment. Out in nature is really a good place for me to get things back into perspective, and I usually feel the better for it when I get back home.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>When I’m out hiking on my weekend hike I often spend much of the experience in contemplation. My thoughts are usually tickling at Warp 10, going everywhere possible at once, but then I ramp it back a bit and I just think about an assortment of topics at any given moment. Out in nature is really a good place for me to get things back into perspective, and I usually feel the better for it when I get back home.</p></blockquote>
<p>&ndash; <a href="https://blog.jpnearl.com/2024/06/19/distraction-8/">J.P. Wing</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The exponential growth of solar power will change the world</title>
      <link>https://nicolaiarocci.com/the-exponential-growth-of-solar-power-will-change-the-world/</link>
      <pubDate>Fri, 21 Jun 2024 16:23:14 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-exponential-growth-of-solar-power-will-change-the-world/</guid>
      <description>&lt;p&gt;The latest issue of The Economist focuses on solar energy. The &lt;a href=&#34;https://archive.is/T48Iy&#34;&gt;introductory article&lt;/a&gt; is short, compelling, and optimistic. On the economics, they make a good point:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Consider solar economics. As the cumulative production of a manufactured good increases, costs go down. As costs go down, demand goes up. As demand goes up, production increases—and costs go down further. This cannot go on for ever; production, demand or both always become constrained. In earlier energy transitions—from wood to coal, coal to oil or oil to gas—the efficiency of extraction grew, but it was eventually offset by the cost of finding ever more fuel. Solar power faces no such constraint. The resources needed to produce solar cells and plant them on solar farms are silicon-rich sand, sunny places and human ingenuity, all three of which are abundant.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The latest issue of The Economist focuses on solar energy. The <a href="https://archive.is/T48Iy">introductory article</a> is short, compelling, and optimistic. On the economics, they make a good point:</p>
<blockquote>
<p>Consider solar economics. As the cumulative production of a manufactured good increases, costs go down. As costs go down, demand goes up. As demand goes up, production increases—and costs go down further. This cannot go on for ever; production, demand or both always become constrained. In earlier energy transitions—from wood to coal, coal to oil or oil to gas—the efficiency of extraction grew, but it was eventually offset by the cost of finding ever more fuel. Solar power faces no such constraint. The resources needed to produce solar cells and plant them on solar farms are silicon-rich sand, sunny places and human ingenuity, all three of which are abundant.</p></blockquote>
<p>Even China&rsquo;s dominance in panel production, which remains a concern, does not prevent technology development and cost-cutting, at least not in the medium term.</p>
<blockquote>
<p>Another worry is that the vast majority of the world’s solar panels, and almost all the purified silicon from which they are made, come from China. Its solar industry is highly competitive, heavily subsidised and is outstripping current demand—quite an achievement given all the solar capacity China is installing within its own borders. This means that Chinese capacity is big enough to keep the expansion going for years to come, even if some of the companies involved go to the wall and some investment dries up.</p></blockquote>
<p>They sustain that low-cost, clean solar energy is inevitable and will reshape society and the planet in ways we can&rsquo;t yet fathom. I sure hope things go in this direction.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Roger Federer</title>
      <link>https://nicolaiarocci.com/quoting-roger-federer/</link>
      <pubDate>Fri, 21 Jun 2024 08:33:18 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-roger-federer/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;When you’re playing a point, it is the most important thing in the world. But
when it’s behind you, it’s behind you&amp;hellip; This mindset is really crucial, because
it frees you to fully commit to the next point… and the next one after that…
with intensity, clarity and focus.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The truth is, whatever game you play in life&amp;hellip; sometimes you’re going to
lose. A point, a match, a season, a job&amp;hellip;  it’s a roller coaster, with many ups
and downs.  And it’s natural, when you’re down, to doubt yourself. To feel sorry
for yourself. And by the way, your opponents have self-doubt, too. Don’t ever
forget that.  But negative energy is wasted energy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>When you’re playing a point, it is the most important thing in the world. But
when it’s behind you, it’s behind you&hellip; This mindset is really crucial, because
it frees you to fully commit to the next point… and the next one after that…
with intensity, clarity and focus.</p></blockquote>
<blockquote>
<p>The truth is, whatever game you play in life&hellip; sometimes you’re going to
lose. A point, a match, a season, a job&hellip;  it’s a roller coaster, with many ups
and downs.  And it’s natural, when you’re down, to doubt yourself. To feel sorry
for yourself. And by the way, your opponents have self-doubt, too. Don’t ever
forget that.  But negative energy is wasted energy.</p></blockquote>
<blockquote>
<p>You want to become a master at overcoming hard moments. That to me is the sign
of a champion.</p></blockquote>
<p>&ndash; <a href="https://home.dartmouth.edu/news/2024/06/2024-commencement-address-roger-federer">Roger Federer</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The appropriate response to a horrible idea is a better idea</title>
      <link>https://nicolaiarocci.com/the-appropriate-response-to-a-horrible-idea-is-a-better-idea/</link>
      <pubDate>Thu, 20 Jun 2024 08:40:31 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-appropriate-response-to-a-horrible-idea-is-a-better-idea/</guid>
      <description>&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/hkUrnHT1VvI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;</description>
      <content:encoded><![CDATA[<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/hkUrnHT1VvI?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

]]></content:encoded>
    </item>
    <item>
      <title>Generative AI is not going to build your engineering team for you</title>
      <link>https://nicolaiarocci.com/generative-ai-is-not-going-to-build-your-engineering-team-for-you/</link>
      <pubDate>Fri, 14 Jun 2024 16:08:08 +0200</pubDate>
      <guid>https://nicolaiarocci.com/generative-ai-is-not-going-to-build-your-engineering-team-for-you/</guid>
      <description>&lt;p&gt;Charity Majors&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; has a good, long-form article on the Stack Overflow &lt;a href=&#34;https://stackoverflow.blog/2024/06/10/generative-ai-is-not-going-to-build-your-engineering-team-for-you/&#34;&gt;blog&lt;/a&gt;. The title is misleading as, while AI&amp;rsquo;s impact on software engineering and its hiring process (spoiler: you&amp;rsquo;ll still want to hire junior engineers) is at the heart of the article, there&amp;rsquo;s so much more in it. It gets exciting in the second part, where she dispenses much from-the-trenches advice on team management and building.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hiring engineers is about composing teams. The smallest unit of software ownership is not the individual, it’s the team.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Charity Majors<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> has a good, long-form article on the Stack Overflow <a href="https://stackoverflow.blog/2024/06/10/generative-ai-is-not-going-to-build-your-engineering-team-for-you/">blog</a>. The title is misleading as, while AI&rsquo;s impact on software engineering and its hiring process (spoiler: you&rsquo;ll still want to hire junior engineers) is at the heart of the article, there&rsquo;s so much more in it. It gets exciting in the second part, where she dispenses much from-the-trenches advice on team management and building.</p>
<blockquote>
<p>Hiring engineers is about composing teams. The smallest unit of software ownership is not the individual, it’s the team.</p></blockquote>
<blockquote>
<p>Have you ever been on a team packed exclusively with staff or principal engineers? It is not fun. That is not a high-functioning team. There is only so much high-level architecture and planning work to go around, there are only so many big decisions that need to be made. These engineers spend most of their time doing work that feels boring and repetitive, so they tend to over-engineer solutions and/or cut corners—sometimes at the same time. They compete for the “fun” stuff and find reasons to pick technical fights with each other. They chronically under-document and under-invest in the work that makes systems simple and tractable.</p></blockquote>
<blockquote>
<p>The best teams are ones where no one is bored, because every single person is working on something that challenges them and pushes their boundaries. The only way you can get this is by having a range of skill levels on the team.</p></blockquote>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I met her once at MongoDB headquarters in 2012 or 2013. We were invited back when they were running their now-long-defunct MongoDB Masters program. She worked at Parse then. Anyway, I remember being impressed by her competence and delivery.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Experts vs. imitators</title>
      <link>https://nicolaiarocci.com/experts-vs.-imitators/</link>
      <pubDate>Thu, 13 Jun 2024 15:55:58 +0200</pubDate>
      <guid>https://nicolaiarocci.com/experts-vs.-imitators/</guid>
      <description>&lt;p&gt;I love &lt;a href=&#34;https://fs.blog/experts-vs-imitators/&#34;&gt;this&lt;/a&gt; concise checklist on detecting fake experts, with which my experience wholeheartedly agrees. The first one:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imitators can&amp;rsquo;t answer questions at a deeper level. Specific knowledge is earned, not learned, so imitators don&amp;rsquo;t fully understand the ideas they&amp;rsquo;re talking about. Their knowledge is shallow. As a result, when you ask about details, first principles, or nonstandard cases, they don&amp;rsquo;t have good answers.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;For more advice, see the &lt;a href=&#34;https://fs.blog/experts-vs-imitators/&#34;&gt;original post&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I love <a href="https://fs.blog/experts-vs-imitators/">this</a> concise checklist on detecting fake experts, with which my experience wholeheartedly agrees. The first one:</p>
<blockquote>
<p>Imitators can&rsquo;t answer questions at a deeper level. Specific knowledge is earned, not learned, so imitators don&rsquo;t fully understand the ideas they&rsquo;re talking about. Their knowledge is shallow. As a result, when you ask about details, first principles, or nonstandard cases, they don&rsquo;t have good answers.</p></blockquote>
<p>For more advice, see the <a href="https://fs.blog/experts-vs-imitators/">original post</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Container security meetup at DevRomagna</title>
      <link>https://nicolaiarocci.com/container-security-meetup-at-devromagna/</link>
      <pubDate>Thu, 13 Jun 2024 11:16:00 +0200</pubDate>
      <guid>https://nicolaiarocci.com/container-security-meetup-at-devromagna/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re doing a DevRomagna meetup on container security. It will happen on June 26 at 7pm, it will be in Italian, and the speaker will be the one and the only &lt;a href=&#34;https://x.com/imperugo&#34;&gt;Ugo Lattanzi&lt;/a&gt;. Details and signup &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/events/301598446/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We&rsquo;re doing a DevRomagna meetup on container security. It will happen on June 26 at 7pm, it will be in Italian, and the speaker will be the one and the only <a href="https://x.com/imperugo">Ugo Lattanzi</a>. Details and signup <a href="https://www.meetup.com/it-IT/devromagna/events/301598446/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hidden Tracks: Domodossola – Weissmies</title>
      <link>https://nicolaiarocci.com/hidden-tracks-domodossola-weissmies/</link>
      <pubDate>Tue, 11 Jun 2024 16:01:15 +0200</pubDate>
      <guid>https://nicolaiarocci.com/hidden-tracks-domodossola-weissmies/</guid>
      <description>&lt;p&gt;Lately, I have become increasingly interested in sound. Of the short films I shoot while &lt;a href=&#34;https://nicolaiarocci.com/tags/hiking&#34;&gt;hiking&lt;/a&gt;, for example, I&amp;rsquo;ve noticed that I&amp;rsquo;m primarily interested in their sounds. Footsteps on the ground, birds singing, wind rustling through leaves, things like that. During my &lt;a href=&#34;https://nicolaiarocci.com/a-motorcycle-trip-across-europe/&#34;&gt;motorcycle ride across Europe&lt;/a&gt;, I caught myself recording a walk with the Memo app on my iPhone. Listening to it allows me to reconstruct a sharp and surprisingly clear memory of that early morning, just out of the tent at Shelsley Walsh. My interest in sounds is not new; I&amp;rsquo;ve written about the &lt;a href=&#34;https://nicolaiarocci.com/what-i-listen-to-while-programming/&#34;&gt;Field Recordings podcast&lt;/a&gt; for example, but lately, I&amp;rsquo;ve become more aware of the importance of sound memory. During my daily early morning walk, I happen to listen to audiobooks or podcasts with the AirPods Pro, but there is always a lot of friction; I have to force myself into putting them on and, usually, after half an hour or so it is a great relief to take them off and listen to the world around me again (the jury is still out on whether I should leave my AirPods at home or not.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lately, I have become increasingly interested in sound. Of the short films I shoot while <a href="/tags/hiking">hiking</a>, for example, I&rsquo;ve noticed that I&rsquo;m primarily interested in their sounds. Footsteps on the ground, birds singing, wind rustling through leaves, things like that. During my <a href="/a-motorcycle-trip-across-europe/">motorcycle ride across Europe</a>, I caught myself recording a walk with the Memo app on my iPhone. Listening to it allows me to reconstruct a sharp and surprisingly clear memory of that early morning, just out of the tent at Shelsley Walsh. My interest in sounds is not new; I&rsquo;ve written about the <a href="https://nicolaiarocci.com/what-i-listen-to-while-programming/">Field Recordings podcast</a> for example, but lately, I&rsquo;ve become more aware of the importance of sound memory. During my daily early morning walk, I happen to listen to audiobooks or podcasts with the AirPods Pro, but there is always a lot of friction; I have to force myself into putting them on and, usually, after half an hour or so it is a great relief to take them off and listen to the world around me again (the jury is still out on whether I should leave my AirPods at home or not.)</p>
<p>The other day, I read on about <a href="https://www.juliansartorius.com">Julian Sartorius</a> (drummer, percussionist, and artist) latest work, <a href="https://juliansartorius.bandcamp.com/album/hidden-tracks-domodossola-weissmies">Hidden Tracks: Domodossola—Weissmies</a>. He took a five-day hike from Domodossola, Italy (272 meters above the sea) to Switzerland&rsquo;s Weissmies summit (4017 mt). He took his drumsticks and a recorder with him, and as he went by, he recorded many sounds, natural and not, and, most importantly, played his sticks on many different surfaces. Quoting <a href="https://daily.bandcamp.com/features/julian-sartorius-hidden-tracks-interview">Bandcamp Daily</a>:</p>
<blockquote>
<p>Every track on Hidden Tracks: Domodossola – Weissmies is named according to that change (i.e., “272m ↗ 500m,” “1500m ↗ 2000m,” etc.). The first few, recorded in Domodossola and its surroundings, are lively—almost symphonic. You can hear passing cars and motorcycles, people talking, dogs barking, church bells tolling. Sartorius plays a hypnotic, techno-like rhythm—sometimes on wooden houses, sometimes with clanks on metal or footsteps on grass. With each subsequent track, the music becomes sparser and quieter. Sounds of nature prevail, as Sartorius plays the rhythm on a surface of a stream, and catches the sound of sheep as they pass through the meadow. It culminates on the mountain’s summit where the only sounds are wind, snow, and ice—and a distant helicopter.</p></blockquote>
<p>Being a hiker myself, I was immediately enthralled by this project. I listened and was not disappointed, so I bought the album to support the author. There&rsquo;s also a short film about the project on <a href="https://youtu.be/xCb3GTRpkXo?si=SrthrnEAVtK7doMl">YouTube</a> that is worth watching.</p>

<iframe style="border: 0; width: 100%; height: 42px;" src="https://bandcamp.com/EmbeddedPlayer/album=2680166290/size=small/bgcol=333333/linkcol=0f91ff/artwork=none/track=865184655/transparent=true/" seamless><a href="https://juliansartorius.bandcamp.com/album/hidden-tracks-domodossola-weissmies">Hidden Tracks: Domodossola – Weissmies by Julian Sartorius</a></iframe>

]]></content:encoded>
    </item>
    <item>
      <title>Quoting Sean Voisen</title>
      <link>https://nicolaiarocci.com/quoting-sean-voisen/</link>
      <pubDate>Tue, 04 Jun 2024 14:54:44 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-sean-voisen/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;just writing down notes is all that really matters. Any tool that allows you to compose and save text will do. It is the act of writing, not the act of linking or reading or revisiting, that clarifies thought and leads to insight. The rest is all superfluous.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://sean.voisen.org/notes/2024-05-29-controversial-thoughts-on-networked-note-taking&#34;&gt;Sean Voisen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just yesterday, I fixed a bug in our legacy application. Once I was done, I turned to my notes to log what I&amp;rsquo;d just done. I was only partially happy with the fix, so I articulated what would have been ideal and why I didn&amp;rsquo;t achieve my goal. Right in the middle of a sentence, the solution surfaced. It was so evident and straightforward! The simple act of writing down the problem led me to the solution. Relieved, I returned to the project and promptly improved my code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>just writing down notes is all that really matters. Any tool that allows you to compose and save text will do. It is the act of writing, not the act of linking or reading or revisiting, that clarifies thought and leads to insight. The rest is all superfluous.</p></blockquote>
<p>&ndash; <a href="https://sean.voisen.org/notes/2024-05-29-controversial-thoughts-on-networked-note-taking">Sean Voisen</a></p>
<p>Just yesterday, I fixed a bug in our legacy application. Once I was done, I turned to my notes to log what I&rsquo;d just done. I was only partially happy with the fix, so I articulated what would have been ideal and why I didn&rsquo;t achieve my goal. Right in the middle of a sentence, the solution surfaced. It was so evident and straightforward! The simple act of writing down the problem led me to the solution. Relieved, I returned to the project and promptly improved my code.</p>
<p>Sean Voisen is right. The act of writing clarifies thoughts and leads to insight.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Toschi Hermitage</title>
      <link>https://nicolaiarocci.com/the-toschi-hermitage/</link>
      <pubDate>Sun, 02 Jun 2024 12:26:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-toschi-hermitage/</guid>
      <description>&lt;p&gt;I went on a motorcycle and hiking trip yesterday. It was a glorious day, albeit windy, which helped keep the temperature chill.  Mixing hiking with motorcycling is something I love, as it combines two of my hobbies. However, it requires some careful planning. I still want to wear full safety gear on the bike but not take any of that with me as I walk in the wilderness, where I&amp;rsquo;ll be in hiking gear instead.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I went on a motorcycle and hiking trip yesterday. It was a glorious day, albeit windy, which helped keep the temperature chill.  Mixing hiking with motorcycling is something I love, as it combines two of my hobbies. However, it requires some careful planning. I still want to wear full safety gear on the bike but not take any of that with me as I walk in the wilderness, where I&rsquo;ll be in hiking gear instead.</p>
<p>The loop tour from the Montone River Valley reaches the watershed ridge overlooking the Acquacheta basin and then the main Apennine ridge at over 1,000 meters. From an environmental point of view, it is worth noting the constant presence of woods, first of oak and hornbeam, then of beech; the latter, with recent conversions to tall trees from coppice, have largely regained an appearance closer to naturalness. From a historical point of view, the itinerary is characterized by access to the very ancient (11th century) Hermitage of the Toschi or Tusci, currently being restored to be used as a farm and accommodation facility that gives hospitality to hikers, still very suggestive for its superb isolation and position set among the meadows at the top of the valley of Fosso Pian di Soia.</p>
<p>I risked losing the path when, just near the Hermitage, I spotted a hare a few steps away. She scampered unhurriedly away under my gaze as I was walking and not paying too much attention to the path, which seemed obvious. I missed a detour, and I recovered shortly after. Just before the hare, I kicked a harmless snake who got more scared than I did. It ran away, disappearing into knee-high grass.</p>
<p>When I returned to the bike, since it was still early, I decided to go up to the Muraglione Pass, descend to Tuscany, and return via the Tre Faggi Pass, Permilcuore and Predappio. It always strikes me to see tourists (alas, many motorcyclists) stopping at the cemetery in Predappio, presumably to visit Mussolini&rsquo;s grave.</p>
<p>I published a short <a href="https://vimeo.com/952806475">video</a> on Vimeo<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>; GPX track and some photos are available <a href="https://www.outdooractive.com/en/route/hiking-route/province-of-florence/eremo-deitoschi/293755434/?share=%7Ezywxwsim%244osseuny">here</a>.</p>

<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/952806475?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Eremo dei Toschi"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>

<figure>
    <img loading="lazy" src="/images/eremo-dei-toschi2.jpg"
         alt="Beech forests are a characteristic feature of this area of the Apennines"/> <figcaption>
            <p>Beech forests are a characteristic feature of this area of the Apennines</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/eremo-dei-toschi1.jpg"
         alt="By now, at the end of the tour, the clearing with the Toschi Hermitage stands directly in front of us."/> <figcaption>
            <p>By now, at the end of the tour, the clearing with the Toschi Hermitage stands directly in front of us.</p>
        </figcaption>
</figure>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>It&rsquo;s embedded, but I discovered that email subscribers don&rsquo;t get to see embedded resources.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>How to handle custom claims in an Open ID Connect-authenticated ASP.NET Core app</title>
      <link>https://nicolaiarocci.com/how-to-handle-custom-claims-in-an-oidc-authenticated-aspnet-core-app/</link>
      <pubDate>Fri, 31 May 2024 15:53:30 +0200</pubDate>
      <guid>https://nicolaiarocci.com/how-to-handle-custom-claims-in-an-oidc-authenticated-aspnet-core-app/</guid>
      <description>&lt;p&gt;Today, I learned how to handle custom claims in an Open ID Connect authenticated ASP.NET Core app.&lt;/p&gt;
&lt;p&gt;The scenario goes like this. I have an ASP.NET Core app that authenticates with Open Id Connect. It receives a bearer token from the authentication server. Besides OIDC claims, this token has been forged with additional custom claims for use in the app. However, only ODIC claims exist when I parse &lt;code&gt;HttpContext.User.Identity.Claims&lt;/code&gt; in my middleware. If I retrieve the token with &lt;code&gt;HttpContext.GetTokenAsync&lt;/code&gt; and decode it, I confirm it contains all the claims I need. Where have my custom claims gone? Or, how can I get &lt;code&gt;User.Identity&lt;/code&gt; to provide them along with the OIDC ones?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, I learned how to handle custom claims in an Open ID Connect authenticated ASP.NET Core app.</p>
<p>The scenario goes like this. I have an ASP.NET Core app that authenticates with Open Id Connect. It receives a bearer token from the authentication server. Besides OIDC claims, this token has been forged with additional custom claims for use in the app. However, only ODIC claims exist when I parse <code>HttpContext.User.Identity.Claims</code> in my middleware. If I retrieve the token with <code>HttpContext.GetTokenAsync</code> and decode it, I confirm it contains all the claims I need. Where have my custom claims gone? Or, how can I get <code>User.Identity</code> to provide them along with the OIDC ones?</p>
<p>As it turns out, one must hack them into the <code>User.Identity.Claims</code> collection by hand. That&rsquo;s done by leveraging the <code>OnTokenValidated</code> event handler like this:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span>authenticationBuilder.AddOpenIdConnect(<span style="font-style:italic">&#34;oidc&#34;</span>, options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.Authority = <span style="font-style:italic">&#34;authority&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ClientId = <span style="font-style:italic">&#34;client_id&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ClientSecret = <span style="font-style:italic">&#34;secret&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ResponseType = <span style="font-style:italic">&#34;code&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>    options.GetClaimsFromUserInfoEndpoint = <span style="font-weight:bold">true</span>;
</span></span><span style="display:flex;"><span>    options.SaveTokens = <span style="font-weight:bold">true</span>;
</span></span><span style="display:flex;"><span>    options.Events = <span style="font-weight:bold">new</span>()
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        OnTokenValidated = context =&gt;
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="font-style:italic">// adds custom claims from the token into Principal.Identity</span>
</span></span><span style="display:flex;"><span>            <span style="font-weight:bold">if</span> (context.Principal?.Identity <span style="font-weight:bold">is</span> not ClaimsIdentity claimsIdentity) <span style="font-weight:bold">return</span> Task.CompletedTask;
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="">var</span> accessToken = context.TokenEndpointResponse?.AccessToken;
</span></span><span style="display:flex;"><span>            <span style="font-weight:bold">if</span> (<span style="">string</span>.IsNullOrEmpty(accessToken)) <span style="font-weight:bold">return</span> Task.CompletedTask;
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="">var</span> handler = <span style="font-weight:bold">new</span> JwtSecurityTokenHandler();
</span></span><span style="display:flex;"><span>            <span style="font-weight:bold">if</span> (handler.ReadToken(accessToken) <span style="font-weight:bold">is</span> not JwtSecurityToken jsonToken) <span style="font-weight:bold">return</span> Task.CompletedTask;
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="font-weight:bold">foreach</span> (<span style="">var</span> claim <span style="font-weight:bold">in</span> jsonToken.Claims)
</span></span><span style="display:flex;"><span>                <span style="font-weight:bold">if</span> (claimsIdentity.Claims.All(c =&gt; c.Type != claim.Type))
</span></span><span style="display:flex;"><span>                    claimsIdentity.AddClaim(claim);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            <span style="font-weight:bold">return</span> Task.CompletedTask;
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    };
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><p>Is there a better and less hacky way to achieve the same result? Please let me know.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Kagi is profitable</title>
      <link>https://nicolaiarocci.com/kagi-is-profitable/</link>
      <pubDate>Fri, 31 May 2024 08:35:49 +0200</pubDate>
      <guid>https://nicolaiarocci.com/kagi-is-profitable/</guid>
      <description>&lt;p&gt;Two years after its launch, Kagi, the pay-per-use search engine &lt;a href=&#34;https://blog.kagi.com/what-is-next-for-kagi&#34;&gt;is profitable&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We are also thrilled to report that we have achieved profitability. This significant milestone is a testament to our sustainable growth and fiscal responsibility. It demonstrates that our approach of offering a premium, ad-free search experience resonates with users who support a service aligning with their values. Becoming profitable allows us to reinvest in the business, further enhancing our offerings and ensuring that we can continue to provide a top-notch search experience.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Two years after its launch, Kagi, the pay-per-use search engine <a href="https://blog.kagi.com/what-is-next-for-kagi">is profitable</a>.</p>
<blockquote>
<p>We are also thrilled to report that we have achieved profitability. This significant milestone is a testament to our sustainable growth and fiscal responsibility. It demonstrates that our approach of offering a premium, ad-free search experience resonates with users who support a service aligning with their values. Becoming profitable allows us to reinvest in the business, further enhancing our offerings and ensuring that we can continue to provide a top-notch search experience.</p></blockquote>
<p>This is a remarkable achievement. Two years ago, only a few would have bet on
its sustainability. I&rsquo;ve tried Kagi&rsquo;s free tier with good results, but not as
much as I would like. It&rsquo;s not my default search engine—not yet, at least.</p>
<p>Over time, I&rsquo;ve switched from free (as in &ldquo;you, the user, are the product we
sell&rdquo;) to paid services. Years ago, I dropped Gmail and switched to Fastmail,
and I could never imagine going back. I&rsquo;m good with paying for excellent
critical services. My data and I are not the product, and I&rsquo;m invested in them
staying around long-term.</p>
]]></content:encoded>
    </item>
    <item>
      <title>LLMs don&#39;t remember everything you say</title>
      <link>https://nicolaiarocci.com/llms-dont-remember-everything-you-say/</link>
      <pubDate>Wed, 29 May 2024 17:05:53 +0200</pubDate>
      <guid>https://nicolaiarocci.com/llms-dont-remember-everything-you-say/</guid>
      <description>&lt;p&gt;Simon Willison has a new article explaining an important and often ununderstood
aspect of LLMs. There&amp;rsquo;s a remarkable difference between chatting with an LLM, as
we users do, and training it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Short version: ChatGPT and other similar tools do not directly learn from and
memorize everything that you say to them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Every time you start a new chat conversation, you clear the slate. Each
conversation is an entirely new sequence, carried out entirely independently of
previous conversations from both yourself and other users. Understanding this is
key to working effectively with these models. Every time you hit “new chat” you
are effectively wiping the short-term memory of the model, starting again from
scratch. This has a number of important consequences.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Simon Willison has a new article explaining an important and often ununderstood
aspect of LLMs. There&rsquo;s a remarkable difference between chatting with an LLM, as
we users do, and training it.</p>
<blockquote>
<p>Short version: ChatGPT and other similar tools do not directly learn from and
memorize everything that you say to them.</p></blockquote>
<blockquote>
<p>Every time you start a new chat conversation, you clear the slate. Each
conversation is an entirely new sequence, carried out entirely independently of
previous conversations from both yourself and other users. Understanding this is
key to working effectively with these models. Every time you hit “new chat” you
are effectively wiping the short-term memory of the model, starting again from
scratch. This has a number of important consequences.</p></blockquote>
<p>More <a href="https://simonwillison.net/2024/May/29/training-not-chatting/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Elena Kostyuchenko</title>
      <link>https://nicolaiarocci.com/quoting-elena-kostyuchenko/</link>
      <pubDate>Wed, 29 May 2024 11:22:52 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-elena-kostyuchenko/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In 2021, in Russian courts, the fate of 783000 people was decided. There were 2190 acquittals. Two thousand one hundred and ninety. The probability of being acquitted is 0.28 per cent.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; Elena Kostyuchenko in &lt;em&gt;I Love Russia&lt;/em&gt;, which I&amp;rsquo;m currently reading.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>In 2021, in Russian courts, the fate of 783000 people was decided. There were 2190 acquittals. Two thousand one hundred and ninety. The probability of being acquitted is 0.28 per cent.</p></blockquote>
<p>&ndash; Elena Kostyuchenko in <em>I Love Russia</em>, which I&rsquo;m currently reading.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica for .NET v3.4.15</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-for-.net-v3.4.15/</link>
      <pubDate>Fri, 24 May 2024 11:02:31 +0200</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-for-.net-v3.4.15/</guid>
      <description>&lt;p&gt;Today I released &lt;a href=&#34;https://fatturaelettronicaopensource.org/docs&#34;&gt;Fattura Elettronica for .NET&lt;/a&gt; v3.4.15. The Fattura
Elettronica project allows for the validation and de/serialization of electronic
invoices that adhere to the standard defined by Italian Revenue Agency
(&lt;a href=&#34;https://www.agenziaentrate.gov.it/portale/web/guest/specifiche-tecniche-versione-1.8&#34;&gt;Agenzia Entrate&lt;/a&gt;). See the &lt;a href=&#34;https://fatturaelettronicaopensource.org/docs/changelog.html#v-3415&#34;&gt;changelog&lt;/a&gt; for details (Italian).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released <a href="https://fatturaelettronicaopensource.org/docs">Fattura Elettronica for .NET</a> v3.4.15. The Fattura
Elettronica project allows for the validation and de/serialization of electronic
invoices that adhere to the standard defined by Italian Revenue Agency
(<a href="https://www.agenziaentrate.gov.it/portale/web/guest/specifiche-tecniche-versione-1.8">Agenzia Entrate</a>). See the <a href="https://fatturaelettronicaopensource.org/docs/changelog.html#v-3415">changelog</a> for details (Italian).</p>
]]></content:encoded>
    </item>
    <item>
      <title>A motorcycle trip across Europe</title>
      <link>https://nicolaiarocci.com/a-motorcycle-trip-across-europe/</link>
      <pubDate>Thu, 23 May 2024 17:28:21 +0200</pubDate>
      <guid>https://nicolaiarocci.com/a-motorcycle-trip-across-europe/</guid>
      <description>&lt;p&gt;Last night, I returned from &lt;a href=&#34;https://www.tomcc.org/Trifest/tomcc75&#34;&gt;Trifest 75&lt;/a&gt;,
a motorcycle rally organized by the &lt;a href=&#34;https://tomcc.org&#34;&gt;Triumph Owners Motorcycle
Club&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; at the Shelsley Walsh Hill Climb, Worcester, UK.
Crossing Europe from South to North took us a whole week across Italy,
Switzerland, and France before reaching the soil of England.&lt;/p&gt;
&lt;p&gt;This outing was conceived long ago (Trifest happen every year) and has always
been postponed because of the high cost and time required. This year, we took
the opportunity of the 75th anniversary to go, partly because I sensed the great
interest while talking about the idea at various rallies we had last year in Italy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last night, I returned from <a href="https://www.tomcc.org/Trifest/tomcc75">Trifest 75</a>,
a motorcycle rally organized by the <a href="https://tomcc.org">Triumph Owners Motorcycle
Club</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> at the Shelsley Walsh Hill Climb, Worcester, UK.
Crossing Europe from South to North took us a whole week across Italy,
Switzerland, and France before reaching the soil of England.</p>
<p>This outing was conceived long ago (Trifest happen every year) and has always
been postponed because of the high cost and time required. This year, we took
the opportunity of the 75th anniversary to go, partly because I sensed the great
interest while talking about the idea at various rallies we had last year in Italy.</p>
<p>We were twenty motorcycles strong. Leading such a large group across Europe for
4,000 km is no joke, but somehow, we made it through without significant issues.
Energy and mood were always high, and we were welcomed with open arms by our
English friends and by the other Triumph Owners Clubs attending: Germany,
Sweden, and Holland. It was an excellent opportunity to strengthen the bond
between us Italians and make new international friendships, laying the
foundation, who knows, for future occasions.</p>
<p><figure>
    <img loading="lazy" src="/images/trifest75-colmar.jpg"
         alt="Colmar, France, was our first stop at the end of a rather challenging (and rainy) 750km day."/> <figcaption>
            <p>Colmar, France, was our first stop at the end of a rather challenging (and rainy) 750km day.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/trifest75-dover.jpeg"
         alt="White cliffs of Dover. England here we come."/> <figcaption>
            <p>White cliffs of Dover. England here we come.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/trifest75-camping.jpg"
         alt="My tent &amp; Bonneville at the Trifest 75 campsite."/> <figcaption>
            <p>My tent &amp; Bonneville at the Trifest 75 campsite.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/trifest75-hill-climb.jpg"
         alt="The bucolic England you&rsquo;d expect, just at a stone&rsquo;s throw from the campsite."/> <figcaption>
            <p>The bucolic England you&rsquo;d expect, just at a stone&rsquo;s throw from the campsite.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/trifest75-triumph-visitor-experience.jpeg"
         alt="While there, we visited Triumph HQ in Hinckley and enjoyed the Visitor Experience there."/> <figcaption>
            <p>While there, we visited Triumph HQ in Hinckley and enjoyed the Visitor Experience there.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/trifest75-stonehenge.jpg"
         alt="On the way back, we visited Stonehenge."/> <figcaption>
            <p>On the way back, we visited Stonehenge.</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/trifest75-mont-blanc.jpg"
         alt="We came back to Italy via the Mont Blanc tunnel."/> <figcaption>
            <p>We came back to Italy via the Mont Blanc tunnel.</p>
        </figcaption>
</figure>
</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Of which I happen to chair the <a href="https://tomccitalia.org">Italian branch</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The video of my OAuth2 session at WebDay 2024 is online</title>
      <link>https://nicolaiarocci.com/the-video-of-my-oauth2-session-at-webday-2024-is-online/</link>
      <pubDate>Thu, 23 May 2024 09:30:54 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-video-of-my-oauth2-session-at-webday-2024-is-online/</guid>
      <description>&lt;p&gt;The video my OAuth2 and OpenID Connect session at WebDay 2024 Milan is
&lt;a href=&#34;https://www.improove.tech/videos/3376/Oauth2-e-Open-ID-Connect-con-ASP-NET-Core-8&#34;&gt;available
online&lt;/a&gt;.
It is in Italian, and you need to login or register in order to see it (sorry, I
don’t have control over it.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The video my OAuth2 and OpenID Connect session at WebDay 2024 Milan is
<a href="https://www.improove.tech/videos/3376/Oauth2-e-Open-ID-Connect-con-ASP-NET-Core-8">available
online</a>.
It is in Italian, and you need to login or register in order to see it (sorry, I
don’t have control over it.)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Thirty-seven years ago</title>
      <link>https://nicolaiarocci.com/thirty-seven-years-ago/</link>
      <pubDate>Tue, 14 May 2024 16:37:56 +0200</pubDate>
      <guid>https://nicolaiarocci.com/thirty-seven-years-ago/</guid>
      <description>&lt;p&gt;Thirty-seven years ago, at about 11 a.m., at the Rocca Brancaleone Park, my then-girlfriend and I kissed for the first time under a tree. We decided immediately not to get together because we were classmates&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;, and we didn&amp;rsquo;t want to complicate our lives.&lt;/p&gt;
&lt;p&gt;Right.&lt;/p&gt;
&lt;p&gt;We have been together ever since and will celebrate our 27th wedding anniversary next week. Our three sons are the fruitful result of that teenage affair.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Thirty-seven years ago, at about 11 a.m., at the Rocca Brancaleone Park, my then-girlfriend and I kissed for the first time under a tree. We decided immediately not to get together because we were classmates<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, and we didn&rsquo;t want to complicate our lives.</p>
<p>Right.</p>
<p>We have been together ever since and will celebrate our 27th wedding anniversary next week. Our three sons are the fruitful result of that teenage affair.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>We skipped class on that day.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>What Open AI just did</title>
      <link>https://nicolaiarocci.com/what-open-ai-just-did/</link>
      <pubDate>Tue, 14 May 2024 08:41:04 +0200</pubDate>
      <guid>https://nicolaiarocci.com/what-open-ai-just-did/</guid>
      <description>&lt;p&gt;Open AI just released ChatGPT 4o. The launch demo is available on &lt;a href=&#34;https://www.youtube.com/live/DQacCB9tDaw&#34;&gt;YouTube&lt;/a&gt;, and yes, it is impressive. They did not launch v5, though, and 4o is only incremental, not exponential, as v4 has been compared to its predecessor. It may mean we&amp;rsquo;re at the end of the &amp;ldquo;exponential growth&amp;rdquo; phase of LLM models.&lt;/p&gt;
&lt;p&gt;However, the most critical aspect of this release is not technical, as Ethan Mollick correctly pinpoints in his timely &lt;a href=&#34;https://www.oneusefulthing.org/p/what-openai-did&#34;&gt;What Open AI Did&lt;/a&gt; post:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Open AI just released ChatGPT 4o. The launch demo is available on <a href="https://www.youtube.com/live/DQacCB9tDaw">YouTube</a>, and yes, it is impressive. They did not launch v5, though, and 4o is only incremental, not exponential, as v4 has been compared to its predecessor. It may mean we&rsquo;re at the end of the &ldquo;exponential growth&rdquo; phase of LLM models.</p>
<p>However, the most critical aspect of this release is not technical, as Ethan Mollick correctly pinpoints in his timely <a href="https://www.oneusefulthing.org/p/what-openai-did">What Open AI Did</a> post:</p>
<blockquote>
<p>Likely the biggest impact of GPT-4o is not technical, but a business decision: soon everyone, whether they are paying or not, will get access to GPT-4o1. I think this is a big deal. When I talk with groups and ask people to raise their hands if they use ChatGPT, almost every hand goes up. When I ask if they used GPT-4, only 5% of hands remain up, at most. GPT-4 is so, so much better than free ChatGPT-3.5, it is like having a PhD student work with you instead of a high school sophomore. But that $20 a month barrier kept many people from understanding how impressive AI can be, and for gaining any benefit from AI. That is no longer true.</p></blockquote>
<p>He then speculates how this change will impact significant areas such as education, work, and global entrepreneurship.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A walk on the beach [video]</title>
      <link>https://nicolaiarocci.com/a-walk-on-the-beach-video/</link>
      <pubDate>Sun, 12 May 2024 15:25:27 +0200</pubDate>
      <guid>https://nicolaiarocci.com/a-walk-on-the-beach-video/</guid>
      <description>&lt;p&gt;I took a walk on the beach last weekend. I never frequent Lido Adriano. It is much better than I expected, especially out of season.&lt;/p&gt;

&lt;div style=&#34;padding:56.25% 0 0 0;position:relative;&#34;&gt;&lt;iframe src=&#34;https://player.vimeo.com/video/945495592?badge=0&amp;amp;autopause=0&amp;amp;player_id=0&amp;amp;app_id=58479&#34; frameborder=&#34;0&#34; allow=&#34;autoplay; fullscreen; picture-in-picture; clipboard-write&#34; style=&#34;position:absolute;top:0;left:0;width:100%;height:100%;&#34; title=&#34;A walk on the beach in Lido Adriano&#34;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;script src=&#34;https://player.vimeo.com/api/player.js&#34;&gt;&lt;/script&gt;</description>
      <content:encoded><![CDATA[<p>I took a walk on the beach last weekend. I never frequent Lido Adriano. It is much better than I expected, especially out of season.</p>

<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/945495592?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="A walk on the beach in Lido Adriano"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>

]]></content:encoded>
    </item>
    <item>
      <title>The best thing I have read on ADHD</title>
      <link>https://nicolaiarocci.com/the-best-thing-i-have-read-on-adhd/</link>
      <pubDate>Sun, 12 May 2024 15:17:07 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-best-thing-i-have-read-on-adhd/</guid>
      <description>&lt;p&gt;I read &lt;a href=&#34;https://gekk.info/articles/adhd.html&#34;&gt;ADHD—A Lifelong Struggle&lt;/a&gt; today.
It&amp;rsquo;s the best thing I&amp;rsquo;ve read on ADHD so far. Its advice is grounded in
experience and applies to everyone: those who think ADHD is a crock or, worse,
an excuse, those who suffer from it, and those who have family members or
friends who suffer from it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And we all punish ourselves. That&amp;rsquo;s the real tragedy of this illness. We are
our biggest detractors because we know what we&amp;rsquo;re capable of. Better than our
teachers. Better than our parents. They always said that they could &amp;ldquo;see our
potential,&amp;rdquo; but we saw ten times what they did. Every day. We saw the things we
could do, in our heads, and hated ourselves for not doing them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I read <a href="https://gekk.info/articles/adhd.html">ADHD—A Lifelong Struggle</a> today.
It&rsquo;s the best thing I&rsquo;ve read on ADHD so far. Its advice is grounded in
experience and applies to everyone: those who think ADHD is a crock or, worse,
an excuse, those who suffer from it, and those who have family members or
friends who suffer from it.</p>
<blockquote>
<p>And we all punish ourselves. That&rsquo;s the real tragedy of this illness. We are
our biggest detractors because we know what we&rsquo;re capable of. Better than our
teachers. Better than our parents. They always said that they could &ldquo;see our
potential,&rdquo; but we saw ten times what they did. Every day. We saw the things we
could do, in our heads, and hated ourselves for not doing them.</p></blockquote>
<p>There are so many good lines in the article that I highlighted twelve whole
paragraphs with many more deserving, and I struggled to pick one to quote here.</p>
]]></content:encoded>
    </item>
    <item>
      <title>C# 12 Collection Expressions</title>
      <link>https://nicolaiarocci.com/csharp-collection-expressions/</link>
      <pubDate>Fri, 10 May 2024 17:39:02 +0200</pubDate>
      <guid>https://nicolaiarocci.com/csharp-collection-expressions/</guid>
      <description>&lt;p&gt;This is a follow-up post to &lt;a href=&#34;https://nicolaiarocci.com/csharp-primary-constructors&#34;&gt;C# 12 Primary
Constructors&lt;/a&gt;. Like that article, this one
originates from the preparation notes for my presentation at the &lt;a href=&#34;https://abp.io/conference/2024&#34;&gt;ABP Dotnet
Conference 2024&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I love collection expressions. Like primary constructors, collection
expressions will see a significant adoption in the long run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collection expressions introduce a new way to initialize common collection
values in a terse, unified syntax.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is how we initialize collections today:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cs&#34; data-lang=&#34;cs&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;var&lt;/span&gt; x1 = &lt;span style=&#34;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;&#34;&gt;int&lt;/span&gt;[] { 1, 2, 3, 4 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;var&lt;/span&gt; x2 = Array.Empty&amp;lt;&lt;span style=&#34;&#34;&gt;int&lt;/span&gt;&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WriteByteArray(&lt;span style=&#34;font-weight:bold&#34;&gt;new&lt;/span&gt;[] { (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)1, (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)2, (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)3 });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&amp;lt;&lt;span style=&#34;&#34;&gt;int&lt;/span&gt;&amp;gt; x3 = &lt;span style=&#34;font-weight:bold&#34;&gt;new&lt;/span&gt;() { 1, 2, 3, 4 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Span&amp;lt;DateTime&amp;gt; dates = &lt;span style=&#34;font-weight:bold&#34;&gt;stackalloc&lt;/span&gt; DateTime[] { GetDate(0), GetDate(1) };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WriteByteSpan(&lt;span style=&#34;font-weight:bold&#34;&gt;stackalloc&lt;/span&gt;[] { (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)1, (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)2, (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)3 });
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice how the code is diverse depending on the type and the context. It is also
verbose. Look at how we initialize an empty &lt;code&gt;int&lt;/code&gt; array (second line); it&amp;rsquo;s
lengthy and starkly contrasts with the previous line, where we initialize the
same type with some actual values.  In many situations, casting is needed;
again, take a look at the &lt;code&gt;WriteByteArray&lt;/code&gt; and &lt;code&gt;WriteByteSpan&lt;/code&gt; calls.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is a follow-up post to <a href="/csharp-primary-constructors">C# 12 Primary
Constructors</a>. Like that article, this one
originates from the preparation notes for my presentation at the <a href="https://abp.io/conference/2024">ABP Dotnet
Conference 2024</a>.</p>
<ul>
<li>
<p>I love collection expressions. Like primary constructors, collection
expressions will see a significant adoption in the long run.</p>
</li>
<li>
<p>Collection expressions introduce a new way to initialize common collection
values in a terse, unified syntax.</p>
</li>
<li>
<p>This is how we initialize collections today:</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="">var</span> x1 = <span style="font-weight:bold">new</span> <span style="">int</span>[] { 1, 2, 3, 4 };
</span></span><span style="display:flex;"><span><span style="">var</span> x2 = Array.Empty&lt;<span style="">int</span>&gt;();
</span></span><span style="display:flex;"><span>WriteByteArray(<span style="font-weight:bold">new</span>[] { (<span style="">byte</span>)1, (<span style="">byte</span>)2, (<span style="">byte</span>)3 });
</span></span><span style="display:flex;"><span>List&lt;<span style="">int</span>&gt; x3 = <span style="font-weight:bold">new</span>() { 1, 2, 3, 4 };
</span></span><span style="display:flex;"><span>Span&lt;DateTime&gt; dates = <span style="font-weight:bold">stackalloc</span> DateTime[] { GetDate(0), GetDate(1) };
</span></span><span style="display:flex;"><span>WriteByteSpan(<span style="font-weight:bold">stackalloc</span>[] { (<span style="">byte</span>)1, (<span style="">byte</span>)2, (<span style="">byte</span>)3 });
</span></span></code></pre></div><p>Notice how the code is diverse depending on the type and the context. It is also
verbose. Look at how we initialize an empty <code>int</code> array (second line); it&rsquo;s
lengthy and starkly contrasts with the previous line, where we initialize the
same type with some actual values.  In many situations, casting is needed;
again, take a look at the <code>WriteByteArray</code> and <code>WriteByteSpan</code> calls.</p>
<ul>
<li>With collection expressions, it becomes like this:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="">int</span>[] x4 = [1, 2, 3, 4];
</span></span><span style="display:flex;"><span><span style="">int</span>[] x5 = [];
</span></span><span style="display:flex;"><span>WriteByteArray([1, 2, 3]);
</span></span><span style="display:flex;"><span>List&lt;<span style="">int</span>&gt; x6 = [1, 2, 3, 4];
</span></span><span style="display:flex;"><span>Span&lt;DateTime&gt; dates1 = [GetDate(0), GetDate(1)];
</span></span><span style="display:flex;"><span>WriteByteSpan([1, 2, 3]);
</span></span></code></pre></div><p>We enclose items within square brackets, and that&rsquo;s all. An empty collection is
empty brackets. We can, of course, call functions or use variables.</p>
<ul>
<li>
<p>In many scenarios, the compiler will perform several optimizations. It can
allocate the correct capacity or avoid copying data when unnecessary. The
compiler can do that because the supported collection types are well-known and
have been for a long time. We get these performance boosts for free when we switch to
collection expressions.</p>
</li>
<li>
<p>Let&rsquo;s look at that <code>WriteByteArray</code> call. Let&rsquo;s say that at some
point, maybe months or years after it&rsquo;s been used in many places, we decide to
refactor the method and change the argument type from <code>byte[]</code> to <code>int[].</code> We&rsquo;d
have to refactor the old-style caller to eliminate the casting, which is now an
error. We don&rsquo;t need to do any fix with collection expressions as they come with
enhanced inference that will resolve the casting for us.</p>
</li>
<li>
<p>On the first line, we&rsquo;re initializing a new array (we aren&rsquo;t calling a method
with a signature), so with collection expressions, if we try to use <code>var,</code> it
won&rsquo;t work. In that case, we need to be explicit about the type.</p>
</li>
<li>
<p>The spread operator allows us to insert variables and constants and to sort of
&ldquo;unroll&rdquo; another collection within the new one, and it does so with optimal
performance.</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="">int</span>[] numbers1 = [1, 2, 3];
</span></span><span style="display:flex;"><span><span style="">int</span>[] numbers2 = [4, 5, 6];
</span></span><span style="display:flex;"><span><span style="">int</span>[] moreNumbers = [.. numbers1, .. numbers2, 7, 8, 9];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="font-weight:bold">foreach</span>(<span style="">var</span> number <span style="font-weight:bold">in</span> moreNumbers)
</span></span><span style="display:flex;"><span>    Console.WriteLine(number);
</span></span></code></pre></div><p>It would be nice if lambdas were allowed in collection expressions,
like in other languages (Python), but that&rsquo;s not yet an option.</p>
<ul>
<li>What about custom collections? But let&rsquo;s imagine I have built a <code>LineBuffer</code>
class that inherits from <code>IEnumrable&lt;chrar&gt;</code>; it offers some custom features
over its base class. I get an error if I try to use collection expression syntax
on it. It is not a common .NET type, and the compiler doesn&rsquo;t know how to go
around it.</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">class</span> <span style="font-weight:bold">LineBuffer</span> : IEnumerable&lt;<span style="">char</span>&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">private</span> <span style="font-weight:bold">readonly</span> <span style="">char</span>[] _buffer = <span style="font-weight:bold">new</span> <span style="">char</span>[80];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> LineBuffer(ReadOnlySpan&lt;<span style="">char</span>&gt; buffer)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="">int</span> number = (_buffer.Length &lt; buffer.Length) ? _buffer.Length : buffer.Length;
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">for</span> (<span style="">int</span> i = 0; i &lt; number; i++)
</span></span><span style="display:flex;"><span>            _buffer[i] = buffer[i];
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> IEnumerator&lt;<span style="">char</span>&gt; GetEnumerator() =&gt; _buffer.AsEnumerable&lt;<span style="">char</span>&gt;().GetEnumerator();
</span></span><span style="display:flex;"><span>    IEnumerator IEnumerable.GetEnumerator() =&gt; _buffer.GetEnumerator();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-style:italic">// etc</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="font-style:italic">// this causes a compile error</span>
</span></span><span style="display:flex;"><span>LineBuffer line = [<span style="font-style:italic">&#39;H&#39;</span>, <span style="font-style:italic">&#39;e&#39;</span>, <span style="font-style:italic">&#39;l&#39;</span>, <span style="font-style:italic">&#39;l&#39;</span>, <span style="font-style:italic">&#39;o&#39;</span>, <span style="font-style:italic">&#39; &#39;</span>, <span style="font-style:italic">&#39;W&#39;</span>, <span style="font-style:italic">&#39;o&#39;</span>, <span style="font-style:italic">&#39;r&#39;</span>, <span style="font-style:italic">&#39;l&#39;</span>, <span style="font-style:italic">&#39;d&#39;</span>, <span style="font-style:italic">&#39;!&#39;</span>];
</span></span></code></pre></div><ul>
<li>We can support collection expressions in our custom types, though. It&rsquo;s a
two-step process. First, we implement a builder method, then decorate the class
(or struct) with a <code>CollectionBuilderAttribute.</code> The attribute maps our type to
the builder method.</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span>[CollectionBuilder(typeof(LineBuffer), nameof(Create))]
</span></span><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">class</span> <span style="font-weight:bold">LineBuffer</span> : IEnumerable&lt;<span style="">char</span>&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">private</span> <span style="font-weight:bold">readonly</span> <span style="">char</span>[] _buffer = <span style="font-weight:bold">new</span> <span style="">char</span>[80];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> LineBuffer(ReadOnlySpan&lt;<span style="">char</span>&gt; buffer)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="">int</span> number = (_buffer.Length &lt; buffer.Length) ? _buffer.Length : buffer.Length;
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">for</span> (<span style="">int</span> i = 0; i &lt; number; i++)
</span></span><span style="display:flex;"><span>            _buffer[i] = buffer[i];
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> IEnumerator&lt;<span style="">char</span>&gt; GetEnumerator() =&gt; _buffer.AsEnumerable&lt;<span style="">char</span>&gt;().GetEnumerator();
</span></span><span style="display:flex;"><span>    IEnumerator IEnumerable.GetEnumerator() =&gt; _buffer.GetEnumerator();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">internal</span> <span style="font-weight:bold">static</span> LineBuffer Create(ReadOnlySpan&lt;<span style="">char</span>&gt; values) =&gt; <span style="font-weight:bold">new</span> LineBuffer(values);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>The official documentation says the builder must be named &ldquo;Create,&rdquo; but that&rsquo;s
false. We can name it however we want as long as it matches the attribute (it&rsquo;s
probably still worth adhering to the suggested practice.)</p>
<ul>
<li>
<p>Adding collection expression support to custom types is helpful in your
codebase, even more so if you&rsquo;re a library author.</p>
</li>
<li>
<p>The syntax of collection expressions is symmetric with that of slicing and
pattern matching, a nice touch that keeps the language tidy and coherent. Take a
look at this pattern matching switch:</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> Grade GPA =&gt; Grades <span style="font-weight:bold">switch</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    [] =&gt; 4.0m,
</span></span><span style="display:flex;"><span>    [var grade] =&gt; grade,
</span></span><span style="display:flex;"><span>    [.. var all] =&gt; all.Average()
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><ul>
<li>
<p>Visual Studio, VS Code, JetBrains Rider and most other IDEs offer full support
for refactoring old-style collection initializations to collection expressions.</p>
</li>
<li>
<p>What about dictionary expressions? They are common in other languages (again,
Python). When asked, Kathrine Dollard of the C# design team answered that
they&rsquo;re thinking about it, mostly trying to understand the best design, so
there&rsquo;s a chance that we&rsquo;ll see dictionary expressions in the language in the
future.</p>
</li>
</ul>
<p>Also see: <a href="/csharp-primary-constructors/">C# 12 Primary Constructors</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting John Gruber</title>
      <link>https://nicolaiarocci.com/quoting-john-gruber/</link>
      <pubDate>Fri, 10 May 2024 10:35:23 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-john-gruber/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The standard shouldn’t be never to make a mistake. It’s to make as few mistakes as possible, but quickly recognize, acknowledge, and address the ones you do make.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://daringfireball.net/linked/2024/05/09/apple-crush-apology&#34;&gt;John Gruber&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The standard shouldn’t be never to make a mistake. It’s to make as few mistakes as possible, but quickly recognize, acknowledge, and address the ones you do make.</p></blockquote>
<p>&ndash; <a href="https://daringfireball.net/linked/2024/05/09/apple-crush-apology">John Gruber</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>C# 12 Primary Constructors</title>
      <link>https://nicolaiarocci.com/csharp-primary-constructors/</link>
      <pubDate>Thu, 09 May 2024 18:04:39 +0200</pubDate>
      <guid>https://nicolaiarocci.com/csharp-primary-constructors/</guid>
      <description>&lt;p&gt;I wrapped up my C# 12 session at the &lt;a href=&#34;https://abp.io/conference/2024&#34;&gt;ABP Dotnet Conference 2024&lt;/a&gt;, and I wanted to share the take-home points, at least about the most relevant features in this language version. Posting the slides made no sense as they were minimal; all the content was packed in the live demo.&lt;/p&gt;
&lt;p&gt;In a follow-up post, I plan to address Collection Expressions (&lt;a href=&#34;https://nicolaiarocci.com/csharp-collection-expressions&#34;&gt;done&lt;/a&gt;) and maybe &amp;ldquo;type any aliases&amp;rdquo;; this is about Primary Constructors.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I wrapped up my C# 12 session at the <a href="https://abp.io/conference/2024">ABP Dotnet Conference 2024</a>, and I wanted to share the take-home points, at least about the most relevant features in this language version. Posting the slides made no sense as they were minimal; all the content was packed in the live demo.</p>
<p>In a follow-up post, I plan to address Collection Expressions (<a href="/csharp-collection-expressions">done</a>) and maybe &ldquo;type any aliases&rdquo;; this is about Primary Constructors.</p>
<ul>
<li>
<p>We can now add a list of parameters to a struct or class declaration. This way, we avoid writing an explicit constructor method, sparing us some boilerplate code.</p>
</li>
<li>
<p>What I refer to as &lsquo;primary parameters&rsquo; are unique in that they are in scope throughout the type definition; this means they can be used anywhere within the type.</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">readonly</span> <span style="font-weight:bold">struct</span> <span style="font-weight:bold">Distance</span>(<span style="">double</span> dx, <span style="">double</span> dy)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="font-weight:bold">readonly</span> <span style="">double</span> Magnitude { <span style="font-weight:bold">get</span>; } = Math.Sqrt(dx * dx + dy * dy);
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="font-weight:bold">readonly</span> <span style="">double</span> Direction { <span style="font-weight:bold">get</span>; } = Math.Atan2(dy, dx);
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="font-weight:bold">override</span> <span style="">string</span> ToString() =&gt; <span style="font-style:italic">$&#34;{nameof(Magnitude)}: {Magnitude}, {nameof(Direction)}: {Direction}&#34;</span>;
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="">double</span> Dx { <span style="font-weight:bold">get</span>; } = dx;
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="">double</span> Dy { <span style="font-weight:bold">get</span>; } = dy;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><ul>
<li>
<p>It&rsquo;s important to note that primary constructor parameters are not class members; therefore, <code>this.</code> cannot be used on them. They can be considered static values, but unlike typical static values, they can also be used in non-static methods, offering a unique advantage (some black magic happens behind the scenes.)</p>
</li>
<li>
<p>We no longer need to define and assign a type-level field; the compiler will do that behind the scenes when needed; if a behind-the-scenes backing field is unnecessary, it won&rsquo;t be created.</p>
</li>
<li>
<p>Primary constructor parameters don&rsquo;t become properties and are inaccessible outside the instance. We can create properties to expose their values if needed. Record types are an exception. Constructor parameters become properties with records, and it makes sense because records are generally used as DTOs, whereas we want the option with class and structs.</p>
</li>
<li>
<p>Secondary and parameterless constructors can be added to a primary constructor. They must invoke the primary, passing its values along.</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> Distance() : <span style="font-weight:bold">this</span>(0, 0) { }
</span></span></code></pre></div><ul>
<li>With primary constructors, we do not have a method body; how do we handle argument validation? One pattern is to perform validation at property assignation.</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="">string</span> AccountID { <span style="font-weight:bold">get</span>; } = ValidAccountNumber(accountID)
</span></span><span style="display:flex;"><span>    ? accountID
</span></span><span style="display:flex;"><span>    : <span style="font-weight:bold">throw</span> <span style="font-weight:bold">new</span> ArgumentException(<span style="font-style:italic">&#34;Invalid account number&#34;</span>, nameof(accountID));
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">static</span> <span style="">bool</span> ValidAccountNumber(<span style="">string</span> accountID) =&gt; accountID?.Length == 10 &amp;&amp; accountID.All(c =&gt; <span style="">char</span>.IsDigit(c));
</span></span></code></pre></div><ul>
<li>
<p>I like this pattern because it brings property declaration and validation close to each other, making it easier to process and reason about the domain logic. When we perform argument validation in an old-style constructor method, we tend to separate validation and declaration, making it difficult to reconcile the two aspects, especially when we have hundreds of lines between constructor code and property declaration.</p>
</li>
<li>
<p>Derived types can have a primary constructor, too; it must invoke the base class&rsquo; primary constructor.</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">class</span> <span style="font-weight:bold">CheckingAccount</span>(<span style="">string</span> accountID, <span style="">string</span> owner, <span style="">decimal</span> overdraftLimit = 0) : BankAccount(accountID, owner)
</span></span></code></pre></div><ul>
<li>
<p>Old-style derived types can still derive from a primary constructor type; a regular constructor will invoke the base primary, as we&rsquo;ve always been doing.</p>
</li>
<li>
<p>Regarding inheritance, we can mix and match primary constructor types with old-style types, making it easy to refactor our libraries to use primary constructors. We know that adopters will have no problem deriving from our refactored types.</p>
</li>
<li>
<p>Watch out for &ldquo;nested captures&rdquo; of primary parameter values in derived types. If both the derived and the base type capture them, and one (or both) change their captured values, we may end up with non-aligned instance values. Roslyn&rsquo;s analyzer will raise a warning so we can fix our code or mute the alert with a pragma.</p>
</li>
<li>
<p>Visual Studio and Visual Studio code offer built-in support for primary constructors (refactorings, etc.) That&rsquo;s true for JetBrains Rider or any other IDEs leveraging Roslyn.</p>
</li>
<li>
<p>The primary constructor&rsquo;s original implementation dates back to C# 6 in 2015. It was publicly available in one of those version previews for a short period. Then, it was taken back to the drawing board, only to resurface with record types in C# 9 (?) and custom types in C# 12.</p>
</li>
</ul>
<p>Also see: <a href="/csharp-collection-expressions/">C# 12 Collection Expressions</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>In the pinewood [video]</title>
      <link>https://nicolaiarocci.com/in-the-pinewood-video/</link>
      <pubDate>Fri, 03 May 2024 15:56:46 +0200</pubDate>
      <guid>https://nicolaiarocci.com/in-the-pinewood-video/</guid>
      <description>&lt;p&gt;I went for a walk in the &lt;a href=&#34;https://maps.app.goo.gl/xYHc8GpX7fRN5ZqT6&#34;&gt;local pinewood&lt;/a&gt; the other day. It&amp;rsquo;s one of my favorite places, especially the least frequented parts, where one can walk for hours (and risk getting lost) without meeting anyone. I cut it shorter this time as it started to drip rain, and I had nothing with me.

&lt;div style=&#34;padding:56.25% 0 0 0;position:relative;&#34;&gt;&lt;iframe src=&#34;https://player.vimeo.com/video/942353685?badge=0&amp;amp;autopause=0&amp;amp;player_id=0&amp;amp;app_id=58479&#34; frameborder=&#34;0&#34; allow=&#34;autoplay; fullscreen; picture-in-picture; clipboard-write&#34; style=&#34;position:absolute;top:0;left:0;width:100%;height:100%;&#34; title=&#34;In the pinewood&#34;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;script src=&#34;https://player.vimeo.com/api/player.js&#34;&gt;&lt;/script&gt;
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I went for a walk in the <a href="https://maps.app.goo.gl/xYHc8GpX7fRN5ZqT6">local pinewood</a> the other day. It&rsquo;s one of my favorite places, especially the least frequented parts, where one can walk for hours (and risk getting lost) without meeting anyone. I cut it shorter this time as it started to drip rain, and I had nothing with me.

<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/942353685?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="In the pinewood"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Ralph Waldo Emerson</title>
      <link>https://nicolaiarocci.com/quoting-ralph-waldo-emerson/</link>
      <pubDate>Mon, 29 Apr 2024 09:27:57 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-ralph-waldo-emerson/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I cannot remember the books I&amp;rsquo;ve read any more than the meals I have eaten; even so, they have made me.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.goodreads.com/quotes/37953-i-cannot-remember-the-books-i-ve-read-any-more-than&#34;&gt;Ralph Waldo Emerson&lt;/a&gt; (debated, see &lt;a href=&#34;https://quoteinvestigator.com/2016/06/20/books/&#34;&gt;here&lt;/a&gt;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I cannot remember the books I&rsquo;ve read any more than the meals I have eaten; even so, they have made me.</p></blockquote>
<p>&ndash; <a href="https://www.goodreads.com/quotes/37953-i-cannot-remember-the-books-i-ve-read-any-more-than">Ralph Waldo Emerson</a> (debated, see <a href="https://quoteinvestigator.com/2016/06/20/books/">here</a>)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Moxie Marlinspike</title>
      <link>https://nicolaiarocci.com/quoting-moxie-marlinspike/</link>
      <pubDate>Sat, 27 Apr 2024 11:37:19 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-moxie-marlinspike/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s very fast to build something that&amp;rsquo;s 90% of a solution. The problem is that the last 10% of building something is usually the hard part which really matters, and with a black box at the center of the product, it feels much more difficult to me to nail that remaining 10%. Closing that gap with gen AI feels much more fickle to me than a normal engineering problem. It could be that I&amp;rsquo;m unfamiliar with it, but I also wonder if some classes of generative AI based products are just doomed to mediocrity as a result.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>It&rsquo;s very fast to build something that&rsquo;s 90% of a solution. The problem is that the last 10% of building something is usually the hard part which really matters, and with a black box at the center of the product, it feels much more difficult to me to nail that remaining 10%. Closing that gap with gen AI feels much more fickle to me than a normal engineering problem. It could be that I&rsquo;m unfamiliar with it, but I also wonder if some classes of generative AI based products are just doomed to mediocrity as a result.</p></blockquote>
<p>&ndash; <a href="https://twitter.com/moxie/status/1783932933717561486">Moxie Marlinspike</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Ken Thompson</title>
      <link>https://nicolaiarocci.com/quoting-ken-thompson/</link>
      <pubDate>Fri, 26 Apr 2024 16:15:45 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-ken-thompson/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The moral is obvious. You can&amp;rsquo;t trust code that you did not totally create yourself. No amount of source-level verification or scrutiny will protect you from using untrusted code.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://dl.acm.org/doi/pdf/10.1145/358198.358210&#34;&gt;Ken Thompson&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;His 1984 Turing Award paper on supply chain security is only four pages long and is worth reading repeatedly.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The moral is obvious. You can&rsquo;t trust code that you did not totally create yourself. No amount of source-level verification or scrutiny will protect you from using untrusted code.</p></blockquote>
<p>&ndash; <a href="https://dl.acm.org/doi/pdf/10.1145/358198.358210">Ken Thompson</a></p>
<p>His 1984 Turing Award paper on supply chain security is only four pages long and is worth reading repeatedly.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Tor: from the Dark Web to the Future of Privacy</title>
      <link>https://nicolaiarocci.com/tor-from-the-dark-web-to-the-future-of-privacy/</link>
      <pubDate>Fri, 26 Apr 2024 09:39:22 +0200</pubDate>
      <guid>https://nicolaiarocci.com/tor-from-the-dark-web-to-the-future-of-privacy/</guid>
      <description>&lt;p&gt;This one looks like a promising read:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tor, one of the most important and misunderstood technologies of the digital age, is best known as the infrastructure underpinning the so-called Dark Web. But the real “dark web,” when it comes to Tor, is the hidden history brought to light in this book: where this complex and contested infrastructure came from, why it exists, and how it connects with global power in intricate and intimate ways. In Tor: From the Dark Web to the Future of Privacy,Ben Collier has written, in essence, a biography of Tor—a cultural and technological history of power, privacy, politics, and empire in the deepest reaches of the internet.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This one looks like a promising read:</p>
<blockquote>
<p>Tor, one of the most important and misunderstood technologies of the digital age, is best known as the infrastructure underpinning the so-called Dark Web. But the real “dark web,” when it comes to Tor, is the hidden history brought to light in this book: where this complex and contested infrastructure came from, why it exists, and how it connects with global power in intricate and intimate ways. In Tor: From the Dark Web to the Future of Privacy,Ben Collier has written, in essence, a biography of Tor—a cultural and technological history of power, privacy, politics, and empire in the deepest reaches of the internet.</p></blockquote>
<p>I&rsquo;ve always been cautiously curious about the Tor project. I remember listening to a Tor talk at a PyCon Italy (or EuroPython?) conference, where the speaker insisted that Tor wasn&rsquo;t meant for dark usages but as a means of liberation. <a href="https://direct.mit.edu/books/oa-monograph/5761/TorFrom-the-Dark-Web-to-the-Future-of-Privacy"><em>Tor: From the Dark Web to the Future of Privacy</em></a> might help frame the project from that perspective.</p>
<p>It&rsquo;s packaged as a free PDF. It&rsquo;s too bad it&rsquo;s watermarked, so converting it to EPUB results in a mess.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Spellbound Contemporary Ballet&#39;s The Art of Fugue</title>
      <link>https://nicolaiarocci.com/spellbound-contemporary-ballets-the-art-of-fugue/</link>
      <pubDate>Mon, 22 Apr 2024 16:28:56 +0200</pubDate>
      <guid>https://nicolaiarocci.com/spellbound-contemporary-ballets-the-art-of-fugue/</guid>
      <description>&lt;p&gt;Yesterday, Serena and I went to see &lt;a href=&#34;https://www.spellboundance.com/&#34;&gt;Spellbound Contemporary Ballet&lt;/a&gt;&amp;rsquo;s &lt;em&gt;The Art of Fugue&lt;/em&gt;, a performance based on J.S. Bach&amp;rsquo;s &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Art_of_Fugue&#34;&gt;unfinished work&lt;/a&gt;.&lt;/p&gt;

&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://player.vimeo.com/video/811478146&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;vimeo video&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;I have been gifting Serena two subscriptions to &lt;a href=&#34;https://www.teatroalighieri.org&#34;&gt;our city&amp;rsquo;s theater&lt;/a&gt;&amp;rsquo;s dance season for some years. She loves dance, both classic and contemporary. I thought I did not. Usually, she goes with one of her best friends. I don&amp;rsquo;t remember ever going before, and yesterday, I only went because none of her friends were available.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday, Serena and I went to see <a href="https://www.spellboundance.com/">Spellbound Contemporary Ballet</a>&rsquo;s <em>The Art of Fugue</em>, a performance based on J.S. Bach&rsquo;s <a href="https://en.wikipedia.org/wiki/The_Art_of_Fugue">unfinished work</a>.</p>

<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
  <iframe src="https://player.vimeo.com/video/811478146" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="vimeo video" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</div>

<p>I have been gifting Serena two subscriptions to <a href="https://www.teatroalighieri.org">our city&rsquo;s theater</a>&rsquo;s dance season for some years. She loves dance, both classic and contemporary. I thought I did not. Usually, she goes with one of her best friends. I don&rsquo;t remember ever going before, and yesterday, I only went because none of her friends were available.</p>
<p>I know nothing about ballet, and truthfully, I expected to get relatively bored. Instead, I got excited. I sat there in the stalls, open-mouthed, the whole time. The nonstop one-hour and ten-minute show flew by; it was delightful.</p>
<p>Many of the dancers&rsquo; movements, individual but primarily choral, reminded me of Hayao Miyazaki&rsquo;s masterful sequences, particularly those in which one or more characters literally &ldquo;liquefy&rdquo; to the ground or otherwise amalgamate, which happens quite often in his works. I wonder if Mauro Astolfi, the choreographer, took inspiration from Miyazaki or if it was just a figment of my imagination (Serena, I later found out, had the same thoughts.)</p>
<p>Next year, Serena&rsquo;s best friends are staying at home. There&rsquo;s a new ballet fan in town.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cowboy Bebop</title>
      <link>https://nicolaiarocci.com/cowboy-bebop/</link>
      <pubDate>Fri, 19 Apr 2024 17:03:36 +0200</pubDate>
      <guid>https://nicolaiarocci.com/cowboy-bebop/</guid>
      <description>&lt;p&gt;I have been following &lt;a href=&#34;https://en.wikipedia.org/wiki/Cowboy_Bebop&#34;&gt;Cowboy Bebop&lt;/a&gt; on Netflix (the anime, not the spinoff TV series). The opening is a visual and musical marvel; I&amp;rsquo;m enthralled by it.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/EL-D9LrFJd4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;The show&amp;rsquo;s soundtrack is a unique blend of jazz (big band hard bop, mainly), blues, and a bit of rock, which I&amp;rsquo;ve never seen before in anime and probably in movies. Even episode titles pay tribute to jazz, blues and rock tracks. We have &amp;ldquo;Valtz for Venus,&amp;rdquo; &amp;ldquo;Sympathy for the Devil,&amp;rdquo; &amp;ldquo;My Funny Valentine,&amp;rdquo; and stuff like that. Adorable. Episodes may appear rambling and superficial at first glance, but they are far from that. They strike a perfect balance between comedy and thought-provoking, often philosophical themes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have been following <a href="https://en.wikipedia.org/wiki/Cowboy_Bebop">Cowboy Bebop</a> on Netflix (the anime, not the spinoff TV series). The opening is a visual and musical marvel; I&rsquo;m enthralled by it.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EL-D9LrFJd4?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>The show&rsquo;s soundtrack is a unique blend of jazz (big band hard bop, mainly), blues, and a bit of rock, which I&rsquo;ve never seen before in anime and probably in movies. Even episode titles pay tribute to jazz, blues and rock tracks. We have &ldquo;Valtz for Venus,&rdquo; &ldquo;Sympathy for the Devil,&rdquo; &ldquo;My Funny Valentine,&rdquo; and stuff like that. Adorable. Episodes may appear rambling and superficial at first glance, but they are far from that. They strike a perfect balance between comedy and thought-provoking, often philosophical themes.</p>
<p>Last night&rsquo;s episode, &ldquo;Jamming with Edward&rdquo;, struck me as prescient. In 2071, Earth is surrounded by a mountain of scrap metal (mostly decommissioned satellites and wreckage from missiles, probes, and spaceships). Space junk was not a theme in 1998 when the anime was conceived, or was it? And there&rsquo;s this AI, a clear tribute to HAL 9000, left active on a derelict satellite, feeling lonely, misunderstood, and abandoned. It is tremendously timely, resonating with the issues we face today.</p>
<p>I bought the whole Space Cowboy soundtrack. It&rsquo;s the bomb.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Redis is forked</title>
      <link>https://nicolaiarocci.com/redis-is-forked/</link>
      <pubDate>Fri, 19 Apr 2024 11:15:41 +0200</pubDate>
      <guid>https://nicolaiarocci.com/redis-is-forked/</guid>
      <description>&lt;p&gt;Vicki Boykis has a &lt;a href=&#34;https://vickiboykis.com/2024/04/16/redis-is-forked/&#34;&gt;good piece&lt;/a&gt; on Redis&amp;rsquo;s recent vicissitudes. At the same time, she recaps where we stand and sings the praises of a project that many are fond of, and not just for its technical worth.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I, like many developers who have worked on high-scale, low-latency web services over the last fifteen years, have an intimate relationship with Redis. At any new job, when you ask where the data is, and someone points you to a server address with port 6379, you know you will meet an good, reliable friend there.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Vicki Boykis has a <a href="https://vickiboykis.com/2024/04/16/redis-is-forked/">good piece</a> on Redis&rsquo;s recent vicissitudes. At the same time, she recaps where we stand and sings the praises of a project that many are fond of, and not just for its technical worth.</p>
<blockquote>
<p>I, like many developers who have worked on high-scale, low-latency web services over the last fifteen years, have an intimate relationship with Redis. At any new job, when you ask where the data is, and someone points you to a server address with port 6379, you know you will meet an good, reliable friend there.</p></blockquote>
<p>Redis is indeed an awe-inspiring project. I have met Salvatore (antirez), its author, several times. He&rsquo;s a down-to-earth and brilliant guy. I admit I feel nostalgic for Redis&rsquo; &ldquo;heroic&rdquo; period when Salvatore was at the helm and Redis was for developers, not enterprises.</p>
]]></content:encoded>
    </item>
    <item>
      <title>AI isn&#39;t useless. But is it worth it?</title>
      <link>https://nicolaiarocci.com/ai-isnt-useless.-but-is-it-worth-it/</link>
      <pubDate>Thu, 18 Apr 2024 15:19:20 +0200</pubDate>
      <guid>https://nicolaiarocci.com/ai-isnt-useless.-but-is-it-worth-it/</guid>
      <description>&lt;p&gt;Molly White&amp;rsquo;s experience with LLMs corresponds more or less with my own, but she is much better at recounting, critiquing, and drawing conclusions than I am.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I find my feelings about AI are actually pretty similar to my feelings about blockchains: &lt;strong&gt;they do a poor job of much of what people try to do with them, they can&amp;rsquo;t do the things their creators claim they one day might, and many of the things they are well suited to do may not be altogether that beneficial&lt;/strong&gt;. And while I do think that AI tools are more broadly useful than blockchains, they also come with similarly monstrous costs.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Molly White&rsquo;s experience with LLMs corresponds more or less with my own, but she is much better at recounting, critiquing, and drawing conclusions than I am.</p>
<blockquote>
<p>I find my feelings about AI are actually pretty similar to my feelings about blockchains: <strong>they do a poor job of much of what people try to do with them, they can&rsquo;t do the things their creators claim they one day might, and many of the things they are well suited to do may not be altogether that beneficial</strong>. And while I do think that AI tools are more broadly useful than blockchains, they also come with similarly monstrous costs.</p></blockquote>
<p>Brilliant.</p>
<blockquote>
<p>But the reality is that you can&rsquo;t build a hundred-billion-dollar industry around a technology that&rsquo;s kind of useful, mostly in mundane ways, and that boasts perhaps small increases in productivity if and only if the people who use it fully understand its limitations. And you certainly can&rsquo;t justify the kind of exploitation, extraction, and environmental cost that the industry has been mostly getting away with, in part because people have believed their lofty promises of someday changing the world.</p></blockquote>
<p>Full article <a href="https://www.citationneeded.news/ai-isnt-useless/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I am speaking at ABP Dotnet Conf&#39;24</title>
      <link>https://nicolaiarocci.com/i-am-speaking-at-abp-dotnet-conf24.md/</link>
      <pubDate>Mon, 15 Apr 2024 15:01:12 +0200</pubDate>
      <guid>https://nicolaiarocci.com/i-am-speaking-at-abp-dotnet-conf24.md/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Nicola Iarocci: C#12 What&amp;rsquo;s new and Interesting session at ABP Dotnet Conf&#39;24&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/abp-dotnet-conf24.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;I am thrilled to have the opportunity to present at an international conference once again. On May 9th, I will speak at the &lt;a href=&#34;https://abp.io/conference/2024&#34;&gt;ABP Donet Conf&#39;24&lt;/a&gt;. My session, titled C #12: What&amp;rsquo;s New and Interesting, is on a topic I&amp;rsquo;m passionate about.&lt;/p&gt;
&lt;p&gt;With the alignment of C# and Dotnet Core release cycles, the C# release cadence has increased (we&amp;rsquo;re on a yearly cycle now), while feature quantity has reduced for individual releases, which is good. The faster, smaller iterations allow for quicker course corrections, and introducing fewer new features makes it easier to embrace the changes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="Nicola Iarocci: C#12 What&rsquo;s new and Interesting session at ABP Dotnet Conf'24" loading="lazy" src="/images/abp-dotnet-conf24.png"></p>
<p>I am thrilled to have the opportunity to present at an international conference once again. On May 9th, I will speak at the <a href="https://abp.io/conference/2024">ABP Donet Conf'24</a>. My session, titled C #12: What&rsquo;s New and Interesting, is on a topic I&rsquo;m passionate about.</p>
<p>With the alignment of C# and Dotnet Core release cycles, the C# release cadence has increased (we&rsquo;re on a yearly cycle now), while feature quantity has reduced for individual releases, which is good. The faster, smaller iterations allow for quicker course corrections, and introducing fewer new features makes it easier to embrace the changes.</p>
<p>The ABP Dotnet Conf'24<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> will be held online on 8-9th May; the <a href="https://abp.io/conference/2024#agenda">lineup and agenda</a> look great, so reserve a ticket before they are sold out, and see you there!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I love what the conference organizers are doing with the subtle product name change. Did you catch that? #dropthedot&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Why I speak at conferences</title>
      <link>https://nicolaiarocci.com/why-i-speak-at-conferences/</link>
      <pubDate>Thu, 11 Apr 2024 11:46:48 +0200</pubDate>
      <guid>https://nicolaiarocci.com/why-i-speak-at-conferences/</guid>
      <description>&lt;p&gt;Among the essential reasons I continue to make presentations at various conferences is that the preparation required to deliver good content forces me to learn and comprehend a topic in greater depth. I always try to talk about the stuff I am working on: the commitment to explaining what I am learning in public forces me into a higher level of knowledge.&lt;/p&gt;
&lt;p&gt;In the past few weeks, I have spoken about OAuth2 at &lt;a href=&#34;https://nicolaiarocci.com/i-am-presenting-on-oauth2-at-two-conferences-this-month/&#34;&gt;two different conferences&lt;/a&gt;, and OAuth2 has been precisely the subject of my work for the past few months, and it still is now. It goes like this: I study and implement things, and while doing that, I say to myself, hey, this could be an exciting topic for other devs, too. I let the idea cool down for a few days, and then, if it still seems good, I start looking for a fitting call for papers. Magic happens if the proposal is accepted: I am forced to turn from a superficial connoisseur to someone close to a field expert. That&amp;rsquo;s the level of competence to aim for if one wants to talk publicly, especially on a technical topic.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Among the essential reasons I continue to make presentations at various conferences is that the preparation required to deliver good content forces me to learn and comprehend a topic in greater depth. I always try to talk about the stuff I am working on: the commitment to explaining what I am learning in public forces me into a higher level of knowledge.</p>
<p>In the past few weeks, I have spoken about OAuth2 at <a href="https://nicolaiarocci.com/i-am-presenting-on-oauth2-at-two-conferences-this-month/">two different conferences</a>, and OAuth2 has been precisely the subject of my work for the past few months, and it still is now. It goes like this: I study and implement things, and while doing that, I say to myself, hey, this could be an exciting topic for other devs, too. I let the idea cool down for a few days, and then, if it still seems good, I start looking for a fitting call for papers. Magic happens if the proposal is accepted: I am forced to turn from a superficial connoisseur to someone close to a field expert. That&rsquo;s the level of competence to aim for if one wants to talk publicly, especially on a technical topic.</p>
<p>Something new happened yesterday. As I was writing the OAuth2 documentation for the next iteration of our APIs, I realized I could reuse some of the material from my live sessions. In the talk, it made sense to dedicate a few minutes to explain the <a href="https://datatracker.ietf.org/doc/html/rfc6749#section-4.1">OAuth2 Authorization Code Flow</a>, so I used <a href="https://obsidian.md/canvas">Obsidian Canvas</a> to draw two diagrams, one with a high-level view of the flow while the other would zoom into the details. I could now take the first one, streamline and simplify it, and then include it in our official documentation. And that&rsquo;s what I did.</p>
<figure>
    <img loading="lazy" src="/images/why-i-speak-at-conferences.png"
         alt="Our documentation now includes the flow chart I conceived for the conference."/> <figcaption>
            <p>Our documentation now includes the flow chart I conceived for the conference.</p>
        </figcaption>
</figure>

<p>That presentation took a while to prepare, but the delivery was good. It took me to a new level of expertise, and part of that work landed in our product. It was all well worth the effort.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting snakeyjake</title>
      <link>https://nicolaiarocci.com/quoting-snakeyjake/</link>
      <pubDate>Sat, 06 Apr 2024 08:00:41 +0200</pubDate>
      <guid>https://nicolaiarocci.com/quoting-snakeyjake/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I wish I was morally bankrupt enough to be a productivity guru. I could, like,
charge $50k to stand behind a podium in a hotel ballroom and spout nonsense at
desperate people in an attempt to get them to buy my book and planners. It would
be awesome.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://news.ycombinator.com/item?id=39950195&#34;&gt;snakeyjake&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I wish I was morally bankrupt enough to be a productivity guru. I could, like,
charge $50k to stand behind a podium in a hotel ballroom and spout nonsense at
desperate people in an attempt to get them to buy my book and planners. It would
be awesome.</p></blockquote>
<p>&ndash; <a href="https://news.ycombinator.com/item?id=39950195">snakeyjake</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Timeline of the XZ open source attack</title>
      <link>https://nicolaiarocci.com/timeline-of-the-xz-open-source-attack/</link>
      <pubDate>Tue, 02 Apr 2024 15:30:03 +0200</pubDate>
      <guid>https://nicolaiarocci.com/timeline-of-the-xz-open-source-attack/</guid>
      <description>&lt;p&gt;The so-called &amp;ldquo;XZ attack&amp;rdquo; is all over the internet these days, and for good
reason.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Over a period of over two years, an attacker using the name “Jia Tan” worked
as a diligent, effective contributor to the xz compression library, eventually
being granted commit access and maintainership. Using that access, they
installed a very subtle, carefully hidden backdoor into liblzma, a part of xz
that also happens to be a dependency of OpenSSH sshd on Debian, Ubuntu, Fedora,
and other systemd-based Linux systems. That backdoor watches for the attacker
sending hidden commands at the start of an SSH session, giving the attacker the
ability to run an arbitrary command on the target system without logging in:
unauthenticated, targeted remote code execution.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The so-called &ldquo;XZ attack&rdquo; is all over the internet these days, and for good
reason.</p>
<blockquote>
<p>Over a period of over two years, an attacker using the name “Jia Tan” worked
as a diligent, effective contributor to the xz compression library, eventually
being granted commit access and maintainership. Using that access, they
installed a very subtle, carefully hidden backdoor into liblzma, a part of xz
that also happens to be a dependency of OpenSSH sshd on Debian, Ubuntu, Fedora,
and other systemd-based Linux systems. That backdoor watches for the attacker
sending hidden commands at the start of an SSH session, giving the attacker the
ability to run an arbitrary command on the target system without logging in:
unauthenticated, targeted remote code execution.</p></blockquote>
<p>As the excellent <a href="https://research.swtch.com/xz-timeline">timeline of the xz open-source
attack</a> quoted above remarks,
this will likely be remembered as the first known supply chain attack on widely
used open-source software. This story screams a nation-state-level hacking
attempt to me.</p>
<p>As an open-source maintainer with limited bandwidth, I know very well how
tempting it can be to give up control and how difficult it is to judge someone&rsquo;s
intentions. I feel for the original author of XZ. A relevant discussion is
currently going on on <a href="https://news.ycombinator.com/item?id=39902241">HN</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Listening to purchased music is the way</title>
      <link>https://nicolaiarocci.com/listening-to-purchased-music-is-the-way/</link>
      <pubDate>Sun, 31 Mar 2024 19:37:58 +0200</pubDate>
      <guid>https://nicolaiarocci.com/listening-to-purchased-music-is-the-way/</guid>
      <description>&lt;p&gt;Happy Easter, everyone. This morning, I completed the long-overdue move of all
my ripped CDs from my old 2012 MacBook Pro to the new one and, then, to my
iPhone. I&amp;rsquo;m using Doppler on both devices. I like Doppler, a simple yet elegant
MP3 player app with few well-thought-out features.&lt;/p&gt;
&lt;p&gt;I am increasingly convinced that &lt;a href=&#34;https://nicolaiarocci.com/sick-and-tired-of-spotifys-music-consuming-model/&#34;&gt;returning to purchased music is the
way&lt;/a&gt;.
I&amp;rsquo;ve been listening to streaming services for so long that I almost forgot the
accomplishment of listening to music I own. This music was so significant when I
first listened to it that it was worth buying and carrying along over the years.
It&amp;rsquo;s tangible, too: it&amp;rsquo;s sitting right next to me, on my hard disk and my phone;
I can look at it and, yes, touch and move it as I please, as I can with my
original CDs. The same goes for the new music I buy on Bandcamp or elsewhere.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Happy Easter, everyone. This morning, I completed the long-overdue move of all
my ripped CDs from my old 2012 MacBook Pro to the new one and, then, to my
iPhone. I&rsquo;m using Doppler on both devices. I like Doppler, a simple yet elegant
MP3 player app with few well-thought-out features.</p>
<p>I am increasingly convinced that <a href="https://nicolaiarocci.com/sick-and-tired-of-spotifys-music-consuming-model/">returning to purchased music is the
way</a>.
I&rsquo;ve been listening to streaming services for so long that I almost forgot the
accomplishment of listening to music I own. This music was so significant when I
first listened to it that it was worth buying and carrying along over the years.
It&rsquo;s tangible, too: it&rsquo;s sitting right next to me, on my hard disk and my phone;
I can look at it and, yes, touch and move it as I please, as I can with my
original CDs. The same goes for the new music I buy on Bandcamp or elsewhere.</p>
<p><img alt="Music I own is sitting right next to me" loading="lazy" src="/images/music-i-own.png"></p>
<p>I can download music from Spotify, but that&rsquo;s rented music that I cannot move
away from the app.</p>
<p>It&rsquo;s also relevant that a much more significant part of my money goes to the
artists when I purchase their music, and I&rsquo;m glad for that because I&rsquo;m thankful.
I want their business to be healthy and prosperous so that I may enjoy more of
their art in the future.</p>
<p>I&rsquo;m listening to <em>Dance Cadaverous</em> from Wayne Shorter&rsquo;s <em>Speak No Evil</em>, a song
I probably last listened to ten years ago. <em>Speak No Evil</em> is one of the 100 CDs
that, back in the day, I started collecting from <a href="http://jazz100.sffjazz.com/top100.html">The Best Jazz (pre-1980) Ever
Released Digitally</a>. I never completed
that collection. I may resume it now, although future purchases will likely be
just MP3s.</p>
]]></content:encoded>
    </item>
    <item>
      <title>ChatGPT is the perfect Linux assistant</title>
      <link>https://nicolaiarocci.com/chatgpt-is-the-perfect-linux-assistant/</link>
      <pubDate>Fri, 29 Mar 2024 18:01:58 +0100</pubDate>
      <guid>https://nicolaiarocci.com/chatgpt-is-the-perfect-linux-assistant/</guid>
      <description>&lt;p&gt;I spent the day doing remote maintenance on multiple Linux machines via ssh. The
revelation is that ChatGPT is the bomb for these tasks: What does that command
option do? I am trying to remember. What syntax is to install that peculiar and
rarely used package on Debian? I am getting this locale configuration error;
what was the fix again? All this stuff is answered much sooner than searching
online, no matter the search engine.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I spent the day doing remote maintenance on multiple Linux machines via ssh. The
revelation is that ChatGPT is the bomb for these tasks: What does that command
option do? I am trying to remember. What syntax is to install that peculiar and
rarely used package on Debian? I am getting this locale configuration error;
what was the fix again? All this stuff is answered much sooner than searching
online, no matter the search engine.</p>
<p>The feeling is having a good, untiring Linux connoisseur (and of all the various
ancillary packages) sitting right next to you, always ready to lend a hand. I
also think, and I&rsquo;m probably wrong (but my experience seems to bear this out so
far), that because these are all simple questions about stuff well carved in
stone, hallucinations are unlikely to occur.</p>
<p>My assistant today was ChatGPT 3.5, which is very old by today&rsquo;s LLM standards.
It is also free to use, which makes it all even more impressive.</p>
]]></content:encoded>
    </item>
    <item>
      <title>William Adams: english advisor to the Shogun</title>
      <link>https://nicolaiarocci.com/william-adams-english-advisor-to-the-shogun/</link>
      <pubDate>Tue, 26 Mar 2024 10:02:11 +0100</pubDate>
      <guid>https://nicolaiarocci.com/william-adams-english-advisor-to-the-shogun/</guid>
      <description>&lt;p&gt;I am not a fan of TV series. However, I have been following the Shogun
miniseries with a fair amount of interest, mainly because I am intrigued by the
setting and historical period covered. As is always the case with modern TV
series, it started very well (the first two to three episodes). Then it slowed
down, getting stuck in the main characters&amp;rsquo; fanciful and improbable personal
affairs and agendas, straying from the main plot, essentially muddling along
until, I assume, the last episode of the season that will end with a bang.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am not a fan of TV series. However, I have been following the Shogun
miniseries with a fair amount of interest, mainly because I am intrigued by the
setting and historical period covered. As is always the case with modern TV
series, it started very well (the first two to three episodes). Then it slowed
down, getting stuck in the main characters&rsquo; fanciful and improbable personal
affairs and agendas, straying from the main plot, essentially muddling along
until, I assume, the last episode of the season that will end with a bang.</p>
<p>In any case, I thought the characters were more or less fictional until today,
when I found that, no, the main ones are historical, and the story is, by and
large, true.</p>
<blockquote>
<p>In 1600 a Dutch galleon arrived on the shores of a small fief on Kyushu, the
westernmost of Japan’s four main islands. It was the first Dutch ship to reach
Japan. Among the crew was an English navigator, William Adams, who managed to
gain the trust of Tokugawa Ieyasu, a powerful warlord who became a shogun (the
military leader of the samurai caste) in 1603. Adams eventually rose to the rank
of Hatamoto, the shogun’s direct retainer. How did an English navigator come to
serve the shogun? To answer this, we must first look at the situation in Japan
at the time and the policies of Ieyasu.</p></blockquote>
<p>The History Today article, available
<a href="https://www.historytoday.com/archive/history-matters/william-adams-english-advisor-shogun">here</a>,
confirms that the main plotline has solid historical roots. By the way, I just
realized it&rsquo;s Tuesday. A new episode is due today, at least in my part of the
world.</p>
]]></content:encoded>
    </item>
    <item>
      <title>From Bocconi to the Twin Mountains</title>
      <link>https://nicolaiarocci.com/from-bocconi-to-the-twin-mountains/</link>
      <pubDate>Mon, 18 Mar 2024 15:30:33 +0100</pubDate>
      <guid>https://nicolaiarocci.com/from-bocconi-to-the-twin-mountains/</guid>
      <description>&lt;p&gt;Yesterday I went for a walk in the mountains. This tour starts from
&lt;a href=&#34;https://maps.app.goo.gl/BSJnhQBuqgXFN2sA8&#34;&gt;Bocconi&lt;/a&gt; (on the road to Muraglione
Pass) and the nice humpback bridge that is just below the village (I think it&amp;rsquo;s
called &amp;ldquo;della Brusia&amp;rdquo;).&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/bocconi3.jpg&#34;
         alt=&#34;Ponte della Brusia, Bocconi (FC)&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Ponte della Brusia, Bocconi (FC)&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It is a nice hike, with the ascent that becomes quite challenging in the final
part, towards the ridge tops, which, once reached, you&amp;rsquo;ll follow for a long
time, partially on a forest road, before plunging back downhill, initially
following a lovely descending ridge da makes most of the descent quite pleasant.
During the ascent, several detours were necessary to get around the landslides
that originated during the infamous May floods (there are still several traffic
lights on the roadway leading up from Forlì, all due to the restoration works
following the flood). Hats off to the volunteers who maintain the trail: they
have had to work hard this year. At some point, they had to &amp;lsquo;dug out&amp;rsquo; complete
new sections to get around the more enormous landslides.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday I went for a walk in the mountains. This tour starts from
<a href="https://maps.app.goo.gl/BSJnhQBuqgXFN2sA8">Bocconi</a> (on the road to Muraglione
Pass) and the nice humpback bridge that is just below the village (I think it&rsquo;s
called &ldquo;della Brusia&rdquo;).</p>
<figure>
    <img loading="lazy" src="/images/bocconi3.jpg"
         alt="Ponte della Brusia, Bocconi (FC)"/> <figcaption>
            <p>Ponte della Brusia, Bocconi (FC)</p>
        </figcaption>
</figure>

<p>It is a nice hike, with the ascent that becomes quite challenging in the final
part, towards the ridge tops, which, once reached, you&rsquo;ll follow for a long
time, partially on a forest road, before plunging back downhill, initially
following a lovely descending ridge da makes most of the descent quite pleasant.
During the ascent, several detours were necessary to get around the landslides
that originated during the infamous May floods (there are still several traffic
lights on the roadway leading up from Forlì, all due to the restoration works
following the flood). Hats off to the volunteers who maintain the trail: they
have had to work hard this year. At some point, they had to &lsquo;dug out&rsquo; complete
new sections to get around the more enormous landslides.</p>
<p>Primroses, wild saffron, and buttercup suggest that, yes, we are indeed entering
spring. All of this botanic expertise is due to
<a href="https://plantnet.org/en/">PlantNet</a>, the app I installed the other day, which
works well, except that it has to be online, which is only rarely possible on
the trail. Fortunately, it can also be used on previously taken photos, which I
did once I was back in Bocconi. I also installed an app to recognize birdsong;
it&rsquo;s called <a href="https://merlin.allaboutbirds.org">Merlin Bird ID</a>, received a lot
of praise, and should work offline, but I have yet to try it.</p>
<figure>
    <img loading="lazy" src="/images/bocconi1.jpg"
         alt="As is often the case in the Apennines, rural ruins are encountered on the trail."/> <figcaption>
            <p>As is often the case in the Apennines, rural ruins are encountered on the trail.</p>
        </figcaption>
</figure>

<p>The best moment was the twenty or so minutes I spent lying down to rest at the
highest point before embarking on the descent. I listened to the silence that
silence was not: the sounds of the forest, the birds, the wind, the heat of the
sun on my skin. My mind wanted to divert to new paths, and I tended to fall
asleep several times, but I consciously tried to bring my mind back to
listening. A meditation exercise that restored my energy levels: I felt
recharged and rested when I got up.</p>
<figure>
    <img loading="lazy" src="/images/bocconi2.jpg"
         alt="A warm day for mid-March, and breezy with partly cloudy skies."/> <figcaption>
            <p>A warm day for mid-March, and breezy with partly cloudy skies.</p>
        </figcaption>
</figure>

<p>At the start, be careful not to take the trail in reverse (as I initially did):
after crossing the beautiful humpback bridge known as the Brusia, do not take
the trail directly in front of you, but turn sharply left, walk about 30 meters
above the Montone river, then take the trail to the right, marked &ldquo;Valbura&rdquo;.</p>
<p>GPX track and some photos <a href="https://www.outdooractive.com/en/route/hiking-route/province-of-forli-cesena/da-bocconi-verso-i-monti-gemelli/284291423/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Alice Rohrwacher</title>
      <link>https://nicolaiarocci.com/quoting-alice-rohrwacher/</link>
      <pubDate>Sat, 16 Mar 2024 10:58:01 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-alice-rohrwacher/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In a beautiful essay published in Waiting for God, Simone Weil reminds us that study serves to develop attention, and almost no matter what is studied, even a mathematical exercise that turns out to be incomprehensible is fine. &amp;ldquo;Without feeling or knowing it,&amp;rdquo; Weil writes, &amp;ldquo;that seemingly sterile and fruitless effort has brought more light into the soul. One day one will find the fruit of it (&amp;hellip;) in any sphere of intelligence, perhaps entirely unrelated to mathematics.&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>In a beautiful essay published in Waiting for God, Simone Weil reminds us that study serves to develop attention, and almost no matter what is studied, even a mathematical exercise that turns out to be incomprehensible is fine. &ldquo;Without feeling or knowing it,&rdquo; Weil writes, &ldquo;that seemingly sterile and fruitless effort has brought more light into the soul. One day one will find the fruit of it (&hellip;) in any sphere of intelligence, perhaps entirely unrelated to mathematics.&rdquo;</p></blockquote>
<p>&ndash; <a href="https://intern.az/1JeG">Alice Rohrwacher</a> 🇮🇹</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cannibalism as a way to honor the dead</title>
      <link>https://nicolaiarocci.com/cannibalism-as-a-way-to-honor-the-dead/</link>
      <pubDate>Sat, 16 Mar 2024 10:42:55 +0100</pubDate>
      <guid>https://nicolaiarocci.com/cannibalism-as-a-way-to-honor-the-dead/</guid>
      <description>&lt;p&gt;As it appears, cannibalism was much more widespread than previously thought, and perhaps for
more complex reasons than we think. To honor the dead, for example.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our ancestors have been eating each other for a million years or more. In
fact, it seems that, down the ages, around a fifth of societies have practised
cannibalism. While some of this people-eating may have been done simply to
survive, in many cases, the reasons look more complex. In places like Gough’s
cave, for example, consuming the bodies of the dead seems to have been part of a
funerary ritual. Far from a monstrous affront to nature, cannibalism may be a
way of showing respect and love for the dead, say some archaeologists.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As it appears, cannibalism was much more widespread than previously thought, and perhaps for
more complex reasons than we think. To honor the dead, for example.</p>
<blockquote>
<p>Our ancestors have been eating each other for a million years or more. In
fact, it seems that, down the ages, around a fifth of societies have practised
cannibalism. While some of this people-eating may have been done simply to
survive, in many cases, the reasons look more complex. In places like Gough’s
cave, for example, consuming the bodies of the dead seems to have been part of a
funerary ritual. Far from a monstrous affront to nature, cannibalism may be a
way of showing respect and love for the dead, say some archaeologists.</p></blockquote>
<p>More <a href="https://www.newscientist.com/article/mg26134780-500-our-human-ancestors-often-ate-each-other-and-for-surprising-reasons/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Frank Herbert</title>
      <link>https://nicolaiarocci.com/quoting-frank-herbert/</link>
      <pubDate>Thu, 14 Mar 2024 15:58:04 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-frank-herbert/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I wrote the Dune series because I had this idea that charismatic leaders ought to come with a warning label on their forehead: &amp;ldquo;May be dangerous to your health.&amp;rdquo; One of the most dangerous presidents we had in this century was John Kennedy because people said &amp;ldquo;Yes Sir Mr. Charismatic Leader what do we do next?&amp;rdquo; and we wound up in Vietnam. And I think probably the most valuable president of this century was Richard Nixon. Because he taught us to distrust government and he did it by example.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I wrote the Dune series because I had this idea that charismatic leaders ought to come with a warning label on their forehead: &ldquo;May be dangerous to your health.&rdquo; One of the most dangerous presidents we had in this century was John Kennedy because people said &ldquo;Yes Sir Mr. Charismatic Leader what do we do next?&rdquo; and we wound up in Vietnam. And I think probably the most valuable president of this century was Richard Nixon. Because he taught us to distrust government and he did it by example.</p></blockquote>
<p>&ndash; <a href="https://theaugustry.com/frank-herbert-ucla-speech-transcript-17-4-1985/">Frank Herbert</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Lars Wirzenius</title>
      <link>https://nicolaiarocci.com/quoting-lars-wirzenius/</link>
      <pubDate>Wed, 13 Mar 2024 08:38:43 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-lars-wirzenius/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Take care of yourself. Sleep. Eat. Exercise. Rest. Relax. Take care of other people, as best you can. People are important. Software is just fun.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; Lars Wirzenius, in his noteworthy &lt;a href=&#34;https://liw.fi/40/&#34;&gt;&lt;em&gt;40 years of programming&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Take care of yourself. Sleep. Eat. Exercise. Rest. Relax. Take care of other people, as best you can. People are important. Software is just fun.</p></blockquote>
<p>&ndash; Lars Wirzenius, in his noteworthy <a href="https://liw.fi/40/"><em>40 years of programming</em></a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Dirty Rat by Orbital, with Sleaford Mods [music]</title>
      <link>https://nicolaiarocci.com/dirty-rat-by-orbital-with-sleaford-mods-music/</link>
      <pubDate>Mon, 11 Mar 2024 17:36:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/dirty-rat-by-orbital-with-sleaford-mods-music/</guid>
      <description>&lt;p&gt;I recently bought &lt;a href=&#34;https://orbitalofficial.bandcamp.com/track/dirty-rat-2&#34;&gt;Dirty
Rat&lt;/a&gt;, the absolute
banger from Orbital&amp;rsquo;s 2023 Optical Delusion. It couldn&amp;rsquo;t be anything different,
given that it&amp;rsquo;s a collaboration between the seminal electronic duo that emerged
from the rave era and one of my British favorites, Sleaford Mods.&lt;/p&gt;
&lt;p&gt;Sleaford Mods&amp;rsquo; barbed lyrics perfectly augment Orbital&amp;rsquo;s concrete-heavy
digitalism. Mods&amp;rsquo; James Williamson lambasts the people, &amp;ldquo;blaming everyone in the
hospital, everyone at the bottom of the English Channel, and everyone who
doesn&amp;rsquo;t look like a fried animal.&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I recently bought <a href="https://orbitalofficial.bandcamp.com/track/dirty-rat-2">Dirty
Rat</a>, the absolute
banger from Orbital&rsquo;s 2023 Optical Delusion. It couldn&rsquo;t be anything different,
given that it&rsquo;s a collaboration between the seminal electronic duo that emerged
from the rave era and one of my British favorites, Sleaford Mods.</p>
<p>Sleaford Mods&rsquo; barbed lyrics perfectly augment Orbital&rsquo;s concrete-heavy
digitalism. Mods&rsquo; James Williamson lambasts the people, &ldquo;blaming everyone in the
hospital, everyone at the bottom of the English Channel, and everyone who
doesn&rsquo;t look like a fried animal.&rdquo;</p>
<blockquote>
<p>I guess it&rsquo;s about telling people to take responsibility for their own
actions, you know, all these politicians don&rsquo;t come from out of nowhere.
Somebody keeps voting them in. So who might that be? &ndash;Paul Hartnoll, Orbital</p></blockquote>

<iframe style="border: 0; width: 100%; height: 42px;" src="https://bandcamp.com/EmbeddedPlayer/track=1690764069/size=small/bgcol=333333/linkcol=ffffff/artwork=none/transparent=true/" seamless><a href="https://orbitalofficial.bandcamp.com/track/dirty-rat-2">Dirty Rat by Orbital, Sleaford Mods</a></iframe>

<p>The <a href="https://youtu.be/4FM7XeaSO0M">official video</a> is good, too.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Voice dictation on iOS and macOS is underestimated</title>
      <link>https://nicolaiarocci.com/voice-dictation-on-ios-and-macos-is-underestimated/</link>
      <pubDate>Sun, 10 Mar 2024 15:57:16 +0100</pubDate>
      <guid>https://nicolaiarocci.com/voice-dictation-on-ios-and-macos-is-underestimated/</guid>
      <description>&lt;p&gt;Most people likely already know and use the voice dictation feature in iOS and
macOS all day, but I&amp;rsquo;ve only now seen the light.&lt;/p&gt;
&lt;p&gt;Yesterday, I discovered I could dictate text notes to my iPhone, even offline.
It works with Obsidian, WhatsApp, and any other app where I need to enter text,
like the Safari search box. I suck at entering text on the phone. I also hate
WhatsApp audio messages, but I often recur to them as, again, I suck at typing
text on the phone. I can instead dictate those messages, and they will render as
text as if I typed them; what a revelation!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Most people likely already know and use the voice dictation feature in iOS and
macOS all day, but I&rsquo;ve only now seen the light.</p>
<p>Yesterday, I discovered I could dictate text notes to my iPhone, even offline.
It works with Obsidian, WhatsApp, and any other app where I need to enter text,
like the Safari search box. I suck at entering text on the phone. I also hate
WhatsApp audio messages, but I often recur to them as, again, I suck at typing
text on the phone. I can instead dictate those messages, and they will render as
text as if I typed them; what a revelation!</p>
<p>It&rsquo;s not entirely a discovery; I knew I could do that and did it occasionally,
primarily for quick lookups.  However, I underestimated how good and valuable
the feature is.</p>
<p>This morning, I discovered the obvious: I can do the same on the Mac. The
MacBook keyboard has a microphone function key, and guess what? It&rsquo;s for voice
dictation, and it works seamlessly. I can even start typing on the keyboard,
switch to dictation on the fly, and then go back to typing without interruption.
It works offline and has built-in multi-language support, just like iOS. Voice
dictation will likely change how I take notes, send messages, and perform other
tasks. Take notes, for example; until today, I rarely write them down when away
from the keyboard.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Medieval monks also had focus issues</title>
      <link>https://nicolaiarocci.com/medieval-monks-also-had-focus-issues/</link>
      <pubDate>Sun, 10 Mar 2024 09:53:20 +0100</pubDate>
      <guid>https://nicolaiarocci.com/medieval-monks-also-had-focus-issues/</guid>
      <description>&lt;p&gt;Medieval monks also needed help with focus and attention. Joel J Miller
discusses this in &lt;a href=&#34;https://www.millersbookreview.com/p/jamie-kreiner-how-to-focus&#34;&gt;What Monks Know About
Focus&lt;/a&gt;, the
latest issue of Miller&amp;rsquo;s Book Review, which I recently discovered and shows
great promise.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While technology has evolved in the last fifteen hundred years, the human
brain has not. And few people in the ancient world cared as much about the
challenges of attention and distraction as monks. Our reasons might differ
today, but we have much to learn nonetheless.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Medieval monks also needed help with focus and attention. Joel J Miller
discusses this in <a href="https://www.millersbookreview.com/p/jamie-kreiner-how-to-focus">What Monks Know About
Focus</a>, the
latest issue of Miller&rsquo;s Book Review, which I recently discovered and shows
great promise.</p>
<blockquote>
<p>While technology has evolved in the last fifteen hundred years, the human
brain has not. And few people in the ancient world cared as much about the
challenges of attention and distraction as monks. Our reasons might differ
today, but we have much to learn nonetheless.</p></blockquote>
<p>The focus problem predates the advent of the modern age with all its continuous,
unstoppable, but always alluring background noise. I wonder if ADHD was also a
thing back then and how many were possibly affected. We will never know.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I am presenting on OAuth2 at two conferences this month</title>
      <link>https://nicolaiarocci.com/i-am-presenting-on-oauth2-at-two-conferences-this-month/</link>
      <pubDate>Tue, 05 Mar 2024 10:36:21 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-presenting-on-oauth2-at-two-conferences-this-month/</guid>
      <description>&lt;p&gt;I am speaking about OAuth2 and Open ID Connect with ASP.NET Core 8 at &lt;a href=&#34;https://www.dotnetconf.it&#34;&gt;Rome .NET
Conference 2024&lt;/a&gt; on March 22 and then, less than a
week later, at &lt;a href=&#34;https://www.webdayconf.it&#34;&gt;WebDay 2024&lt;/a&gt; in Milan.&lt;/p&gt;
&lt;p&gt;I am always particularly excited when I can present the stuff I&amp;rsquo;m currently
working on. Being forced to share as I learn encourages me to go deeper into the
topic to reinforce my comprehension and better explain it to the audience—a
win-win situation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am speaking about OAuth2 and Open ID Connect with ASP.NET Core 8 at <a href="https://www.dotnetconf.it">Rome .NET
Conference 2024</a> on March 22 and then, less than a
week later, at <a href="https://www.webdayconf.it">WebDay 2024</a> in Milan.</p>
<p>I am always particularly excited when I can present the stuff I&rsquo;m currently
working on. Being forced to share as I learn encourages me to go deeper into the
topic to reinforce my comprehension and better explain it to the audience—a
win-win situation.</p>
<p>While the Rome conference is free, if you are considering <a href="https://www.webdayconf.it">WebDay in
Milan</a> (you should), feel free to use my speaker
coupon P-SPEAKER10 for a 20% discount.  If you come to any, don&rsquo;t be shy and
come to say Hi!</p>
<p><img loading="lazy" src="/images/dotnet-conference-rome-2024.jpeg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Saturday beach walk</title>
      <link>https://nicolaiarocci.com/saturday-beach-walk/</link>
      <pubDate>Mon, 04 Mar 2024 08:30:43 +0100</pubDate>
      <guid>https://nicolaiarocci.com/saturday-beach-walk/</guid>
      <description></description>
    </item>
    <item>
      <title>Quoting Benedetta Tobagi</title>
      <link>https://nicolaiarocci.com/quoting-benedetta-tobagi/</link>
      <pubDate>Sun, 03 Mar 2024 11:20:05 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-benedetta-tobagi/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;For those who have found their meaning, their place in the world, and what they feel they want to live for, death is just one part - inevitable, but not frightening - of a good life—a death all woven with life, which has the smile and soft touch of a newfound embrace. I wish myself, anyone, such a death.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; Benedetta Tobagi, &lt;a href=&#34;https://www.einaudi.it/catalogo-libri/storia/storia-moderna/la-resistenza-delle-donne-benedetta-tobagi-9788806253660/&#34;&gt;&lt;em&gt;La Resistenza delle donne&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>For those who have found their meaning, their place in the world, and what they feel they want to live for, death is just one part - inevitable, but not frightening - of a good life—a death all woven with life, which has the smile and soft touch of a newfound embrace. I wish myself, anyone, such a death.</p></blockquote>
<p>&ndash; Benedetta Tobagi, <a href="https://www.einaudi.it/catalogo-libri/storia/storia-moderna/la-resistenza-delle-donne-benedetta-tobagi-9788806253660/"><em>La Resistenza delle donne</em></a></p>
]]></content:encoded>
    </item>
    <item>
      <title>On founders doing customer support</title>
      <link>https://nicolaiarocci.com/on-founders-doing-customer-support/</link>
      <pubDate>Sat, 02 Mar 2024 10:58:26 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-founders-doing-customer-support/</guid>
      <description>&lt;p&gt;I just came across this tweet by &lt;a href=&#34;https://twitter.com/levie/status/1763356362858430501&#34;&gt;Aaron Levie&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The best founders I know — no matter their company’s scale — thrive on doing
customer support directly. There’s literally no better way to understand the
pulse of your customer base, what features to build next, or where systems are
breaking down. It’s always upside.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It profoundly resonates with me. For context, we&amp;rsquo;ve been a small company in the
market since 1991, making us quite the rare bird (we have seen so many software
companies come and go that it is unbelievable).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just came across this tweet by <a href="https://twitter.com/levie/status/1763356362858430501">Aaron Levie</a>:</p>
<blockquote>
<p>The best founders I know — no matter their company’s scale — thrive on doing
customer support directly. There’s literally no better way to understand the
pulse of your customer base, what features to build next, or where systems are
breaking down. It’s always upside.</p></blockquote>
<p>It profoundly resonates with me. For context, we&rsquo;ve been a small company in the
market since 1991, making us quite the rare bird (we have seen so many software
companies come and go that it is unbelievable).</p>
<p>My untiring co-founder, Stefano, still does customer support daily, while I
chime in occasionally when needed. Every Friday at 2.30 pm, our dev and support
teams have a joint call to assess what&rsquo;s going on on the frontline, to get the
pulse and to check if there are new and unexpected issues the customers are
experiencing with our products. This call is complimentary to the live chat that
both teams share daily. This continuous feedback cycle and the resulting quick
release cycle have been the key that allowed us to stay relevant and endure for
such a long time.</p>
<p>Of course, founders doing customer support delays other fundamental
activities, and sometimes that&rsquo;s stressful, but it is worth it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Astral Gold by Dean McPhee [music]</title>
      <link>https://nicolaiarocci.com/astral-gold-by-dean-mcphee-music/</link>
      <pubDate>Thu, 29 Feb 2024 10:44:26 +0100</pubDate>
      <guid>https://nicolaiarocci.com/astral-gold-by-dean-mcphee-music/</guid>
      <description>&lt;p&gt;Thanks to Giovanni Ansaldo&amp;rsquo;s convincing review on yesterday&amp;rsquo;s issue of
&lt;a href=&#34;https://www.internazionale.it/ilmondo&#34;&gt;Il Mondo&lt;/a&gt; podcast, my first Bandcamp
purchase&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; is the recently released &lt;a href=&#34;https://deanmcphee.bandcamp.com/album/astral-gold&#34;&gt;Astral
Gold&lt;/a&gt; album by Dean McPhee, a
British guitarist who combines folk with experimental music and jazz using his
telecaster guitar to create endless landscapes.&lt;/p&gt;
&lt;p&gt;As the title suggests, McPhee&amp;rsquo;s latest album is a journey into outer space. The
album consists of six instrumental pieces, all captivating, enjoyable, and
cohesive; they all serve as each other&amp;rsquo;s natural continuation. Along with the
sound of his guitar, the musician uses tape loops, small percussion sounds, and
a few synthesizers here and there. The result is a hypnotic moonscape
reminiscent of 2001: A Space Odyssey&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;</description>
      <content:encoded><![CDATA[<p>Thanks to Giovanni Ansaldo&rsquo;s convincing review on yesterday&rsquo;s issue of
<a href="https://www.internazionale.it/ilmondo">Il Mondo</a> podcast, my first Bandcamp
purchase<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> is the recently released <a href="https://deanmcphee.bandcamp.com/album/astral-gold">Astral
Gold</a> album by Dean McPhee, a
British guitarist who combines folk with experimental music and jazz using his
telecaster guitar to create endless landscapes.</p>
<p>As the title suggests, McPhee&rsquo;s latest album is a journey into outer space. The
album consists of six instrumental pieces, all captivating, enjoyable, and
cohesive; they all serve as each other&rsquo;s natural continuation. Along with the
sound of his guitar, the musician uses tape loops, small percussion sounds, and
a few synthesizers here and there. The result is a hypnotic moonscape
reminiscent of 2001: A Space Odyssey<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>The album avoids easy psychedelia and opts for a more meditative approach while
meeting expectations perfectly. Sometimes, it sounds like Brian Eno&rsquo;s early
ambient phase and the more dilated Tangerine Dream. Dean McPhee has created an
otherworldly experience with just a few elements; minimalism is key.</p>

<iframe style="border: 0; width: 100%; height: 42px;" src="https://bandcamp.com/EmbeddedPlayer/album=1583034048/size=small/bgcol=333333/linkcol=ffffff/artwork=none/track=756127897/transparent=true/" seamless><a href="https://deanmcphee.bandcamp.com/album/astral-gold">Astral Gold by Dean McPhee</a></iframe>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Look <a href="/sick-and-tired-of-spotifys-music-consuming-model/">here</a> for my
recent Spotify tirade and how I decided to return to purchased music.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>On a lateral note, this music would fit perfectly as an EVE Online
soundtrack. I vividly remember my space pirate days in that game, exploring far
away and unknown solar systems, looking for prey while listening to Jón Hallur Haraldsson&rsquo;s
incredibly immersive <a href="https://archive.org/details/eve-online-soundtrack">original
soundtrack</a> (McPhee is on
another level, and the two genres don&rsquo;t compare, but hey.)&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Sick and tired of Spotify&#39;s music-consuming model</title>
      <link>https://nicolaiarocci.com/sick-and-tired-of-spotifys-music-consuming-model/</link>
      <pubDate>Wed, 28 Feb 2024 11:26:29 +0100</pubDate>
      <guid>https://nicolaiarocci.com/sick-and-tired-of-spotifys-music-consuming-model/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m growing sick and tired of Spotify&amp;rsquo;s music-consuming model. There are many
compelling and sometimes conflicting reasons, most perfectly outlined in &lt;em&gt;&lt;a href=&#34;https://blog.raed.dev/posts/goodbye_spotify&#34;&gt;The
day I canceled my Spotify
subscription&lt;/a&gt;&lt;/em&gt; on Raed&amp;rsquo;s blog.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I used to cherish music, I used to religiously collect, catalog and enjoy
every album on my iPod. I could navigate the endless folders and find that exact
song that I needed for that precise moment. Spotify killed that, I listen to
what it suggests and just accept that it will go away when it decides to rotate
it out. Spotify trained me not to look too hard, to let the flow be, and if that
awesome song is gone or removed, don’t worry, we still have a million more.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m growing sick and tired of Spotify&rsquo;s music-consuming model. There are many
compelling and sometimes conflicting reasons, most perfectly outlined in <em><a href="https://blog.raed.dev/posts/goodbye_spotify">The
day I canceled my Spotify
subscription</a></em> on Raed&rsquo;s blog.</p>
<blockquote>
<p>I used to cherish music, I used to religiously collect, catalog and enjoy
every album on my iPod. I could navigate the endless folders and find that exact
song that I needed for that precise moment. Spotify killed that, I listen to
what it suggests and just accept that it will go away when it decides to rotate
it out. Spotify trained me not to look too hard, to let the flow be, and if that
awesome song is gone or removed, don’t worry, we still have a million more.</p></blockquote>
<p>And also:</p>
<blockquote>
<p>The main screen is littered with podcasts I don’t care about, nor have I ever
listened to. It keeps pushing playlists that feel generic, bland, more based on
demographics than my years of consistent listening history. And there is nothing
I can do about it.</p></blockquote>
<p>I can&rsquo;t cancel my subscription yet, as I would risk being lynched (we&rsquo;re on the
family plan), so I&rsquo;m experimenting with digital purchases of selected music that
I know I want to keep for the long run and that I deem worth sustaining
directly. The current plan is to buy it on Bandcamp, immediately download it,
and then listen to it, probably on Doppler. I will also drop a quick review on
my website (if it is not exciting enough to share here, it&rsquo;s probably not worth
buying in the first place.) I&rsquo;ve been gathering old-style music sources lately
(I primarily follow music critics and websites I respect and listen to live
stations like <a href="/nts-radio/">NTS</a>, Radio Paradise, and Bandcamp Radio). For the
time being, Spotify will stay and serve as a secondary discovery agent.</p>
<p>Yes, I will spend more on music, and it&rsquo;s okay. I won&rsquo;t buy everything I listen
to anyway; the idea is to only invest in the true gems. In a way, this all looks
like going back to old and brick-and-mortar music shop days but actualized, and
I like it a lot.</p>
]]></content:encoded>
    </item>
    <item>
      <title>REPLAY by Jordan Mechner</title>
      <link>https://nicolaiarocci.com/replay-by-jordan-mechner/</link>
      <pubDate>Tue, 27 Feb 2024 14:46:43 +0100</pubDate>
      <guid>https://nicolaiarocci.com/replay-by-jordan-mechner/</guid>
      <description>&lt;p&gt;Jordan Mechner (&lt;a href=&#34;https://twitter.com/jmechner&#34;&gt;@jmechner&lt;/a&gt;, creator of Prince of
Persia) has written and drawn a graphic novel memoir, REPLAY. It&amp;rsquo;s out in French
and will be released in English on March 19.  I pre-ordered a signed English
copy. More info &lt;a href=&#34;https://www.jordanmechner.com/en/books/replay/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jordan Mechner (<a href="https://twitter.com/jmechner">@jmechner</a>, creator of Prince of
Persia) has written and drawn a graphic novel memoir, REPLAY. It&rsquo;s out in French
and will be released in English on March 19.  I pre-ordered a signed English
copy. More info <a href="https://www.jordanmechner.com/en/books/replay/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting John Carmack on AI</title>
      <link>https://nicolaiarocci.com/quoting-john-carmack-on-ai/</link>
      <pubDate>Mon, 26 Feb 2024 15:34:07 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-john-carmack-on-ai/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Coding” was never the source of value, and people shouldn’t get overly
attached to it. Problem solving is the core skill. The discipline and precision
demanded by traditional programming will remain valuable transferable
attributes, but they won’t be a barrier to entry.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://twitter.com/ID_AA_Carmack/status/1762110222321975442&#34;&gt;John Carmack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d be tempted to call bullshit on this one, but it&amp;rsquo;s coming from Carmack, so
hey, let me think about it for a minute (it&amp;rsquo;s not the first time I&amp;rsquo;ve
&lt;a href=&#34;https://nicolaiarocci.com/quoting-john-carmack/&#34;&gt;caught him&lt;/a&gt; endorsing AI).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>“Coding” was never the source of value, and people shouldn’t get overly
attached to it. Problem solving is the core skill. The discipline and precision
demanded by traditional programming will remain valuable transferable
attributes, but they won’t be a barrier to entry.</p></blockquote>
<p>&ndash; <a href="https://twitter.com/ID_AA_Carmack/status/1762110222321975442">John Carmack</a></p>
<p>I&rsquo;d be tempted to call bullshit on this one, but it&rsquo;s coming from Carmack, so
hey, let me think about it for a minute (it&rsquo;s not the first time I&rsquo;ve
<a href="/quoting-john-carmack/">caught him</a> endorsing AI).</p>
]]></content:encoded>
    </item>
    <item>
      <title>Beach walk</title>
      <link>https://nicolaiarocci.com/beach-walk/</link>
      <pubDate>Mon, 26 Feb 2024 09:08:50 +0100</pubDate>
      <guid>https://nicolaiarocci.com/beach-walk/</guid>
      <description>&lt;p&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/lonely-beach-walk.jpg&#34;
         alt=&#34;In a brigh Sunday morning, we went on a lonely beach walk&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;In a brigh Sunday morning, we went on a lonely beach walk&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

Our third kid turned eighteen yesterday; she&amp;rsquo;s an adult now, and we&amp;rsquo;re left with no teenagers in our family. She is on a celebrative short trip to Barcelona so we are alone at home, for the first time. It&amp;rsquo;s only temporary, but it&amp;rsquo;ll become the norm in just over a year when she leaves for University. What a strange feeling; the nest is going to be empty soon. It will take a while before we get used to it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><figure>
    <img loading="lazy" src="/images/lonely-beach-walk.jpg"
         alt="In a brigh Sunday morning, we went on a lonely beach walk"/> <figcaption>
            <p>In a brigh Sunday morning, we went on a lonely beach walk</p>
        </figcaption>
</figure>

Our third kid turned eighteen yesterday; she&rsquo;s an adult now, and we&rsquo;re left with no teenagers in our family. She is on a celebrative short trip to Barcelona so we are alone at home, for the first time. It&rsquo;s only temporary, but it&rsquo;ll become the norm in just over a year when she leaves for University. What a strange feeling; the nest is going to be empty soon. It will take a while before we get used to it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Ran Prieur</title>
      <link>https://nicolaiarocci.com/quoting-ran-prieur/</link>
      <pubDate>Sat, 24 Feb 2024 09:35:43 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-ran-prieur/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;There&amp;rsquo;s a common belief that suffering is necessary for pleasure, or that evil is necessary for good, like the change of the seasons. It&amp;rsquo;s one of those ideas that sounds like wisdom, but when you think about it, it&amp;rsquo;s not actually true. There are some people who are happy all the time, and other people who are miserable all the time. I think suffering and evil are like taking a wrong turn on a journey. Taking a wrong turn sometimes happens, and some good can come of it. But it&amp;rsquo;s never necessary.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>There&rsquo;s a common belief that suffering is necessary for pleasure, or that evil is necessary for good, like the change of the seasons. It&rsquo;s one of those ideas that sounds like wisdom, but when you think about it, it&rsquo;s not actually true. There are some people who are happy all the time, and other people who are miserable all the time. I think suffering and evil are like taking a wrong turn on a journey. Taking a wrong turn sometimes happens, and some good can come of it. But it&rsquo;s never necessary.</p></blockquote>
<p>&ndash; <a href="http://ranprieur.com">Ran Prieur</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>SQLite foreign key constraints are disabled by default</title>
      <link>https://nicolaiarocci.com/sqlite-foreign-key-constraints-are-disabled-by-default/</link>
      <pubDate>Thu, 22 Feb 2024 17:35:40 +0100</pubDate>
      <guid>https://nicolaiarocci.com/sqlite-foreign-key-constraints-are-disabled-by-default/</guid>
      <description>&lt;p&gt;Today, I learned that SQLite only enforces foreign-key constraints if explicitly
instructed. I imagine this is well-known and trivial for the SQLite initiated,
but we&amp;rsquo;re a Postgres shop; I have used SQLite sporadically, primarily for
experiments like today&amp;rsquo;s, and this one amenity was certainly unexpected.&lt;/p&gt;
&lt;p&gt;Anyways. I had all my &lt;code&gt;ON DELETE CASCADE&lt;/code&gt; constraints nicely configured, but
related records in child tables were not being deleted when I deleted the
parent. Perplexed, I &lt;a href=&#34;https://www.sqlite.org/foreignkeys.html&#34;&gt;looked it up&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, I learned that SQLite only enforces foreign-key constraints if explicitly
instructed. I imagine this is well-known and trivial for the SQLite initiated,
but we&rsquo;re a Postgres shop; I have used SQLite sporadically, primarily for
experiments like today&rsquo;s, and this one amenity was certainly unexpected.</p>
<p>Anyways. I had all my <code>ON DELETE CASCADE</code> constraints nicely configured, but
related records in child tables were not being deleted when I deleted the
parent. Perplexed, I <a href="https://www.sqlite.org/foreignkeys.html">looked it up</a>.</p>
<blockquote>
<p>Foreign key constraints are disabled by default (for backwards compatibility),
so must be enabled separately for each database connection.</p></blockquote>
<p>The quick fix was to add <code>&quot;foreign keys=true;&quot;</code> to our connection string.
Alternatively, the application can also use a <code>PRAGMA foreign keys = ON;</code>
statement to activate them once the connection is established, but it doesn&rsquo;t
make sense, as we need constraints active throughout the connection&rsquo;s lifecycle.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Ethan Mollick</title>
      <link>https://nicolaiarocci.com/quoting-ethan-mollick/</link>
      <pubDate>Tue, 20 Feb 2024 14:54:06 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-ethan-mollick/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Many skeptics about the impact of AI are focused on the flaws that LLMs have today: hallucinations, short context windows, slow answers, and so on. These are legitimate concerns, and, if AI advancement were to stop, they might prove to be huge issues in the utility of AI. But AI is advancing rapidly, and some of these concerns may soon vanish, even if others (like hallucinations) are not completely solved.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Many skeptics about the impact of AI are focused on the flaws that LLMs have today: hallucinations, short context windows, slow answers, and so on. These are legitimate concerns, and, if AI advancement were to stop, they might prove to be huge issues in the utility of AI. But AI is advancing rapidly, and some of these concerns may soon vanish, even if others (like hallucinations) are not completely solved.</p></blockquote>
<blockquote>
<p>What that means is that it is fine to be focused on today, building working AI applications and prompts that take into account the limits of present AIs… but there is also a lot of value in building ambitious applications that go past what LLMs can do now. You want to build some applications that almost, but not quite, work. I suspect better LLM “brains” are coming soon, in the form of GPT-5 and Gemini 2.0 and many others. When they do, you can swap them into the almost-but-not-quite-working applications for a fast start. This is similar to the philosophy of the big AI labs, which build ambitious solutions (OpenAI&rsquo;s GPT agents, Google&rsquo;s connections to Gmail) which will benefit when the next version of their core LLMs are released.</p></blockquote>
<blockquote>
<p>So don’t just build for what is possible today, but what is possible in six months, if this pace of change continues. At this point, I think things are unlikely to slow down in the near future, and focusing on where things are heading, rather than where they are, prepares you for a world of continuing change.</p></blockquote>
<p>&ndash; <a href="https://www.oneusefulthing.org/p/strategies-for-an-accelerating-future">Ethan Mollick</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Default ASP NET Core 8 port changed from 80 to 8080</title>
      <link>https://nicolaiarocci.com/default-asp-net-core-8-port-changed-from-80-to-8080/</link>
      <pubDate>Tue, 20 Feb 2024 11:48:42 +0100</pubDate>
      <guid>https://nicolaiarocci.com/default-asp-net-core-8-port-changed-from-80-to-8080/</guid>
      <description>&lt;p&gt;Today, I learned the hard way that the default port for ASP.NET Core 8 container
images has been updated from port 80 to 8080, quite a remarkable breaking
change.&lt;/p&gt;
&lt;p&gt;We upgraded our web application from .NET 7 and let the CI pipeline do its work.
Finally, we checked the application in the browser to ensure everything was
okay, but unfortunately, we got a 502 Bad Gateway error. The Nginx logs revealed
that the app was rejecting connections, which was unexpected because we didn&amp;rsquo;t
make any changes there. Further investigation showed that the web app listened
on port 8080 while Nginx was reverse-proxied to 80. So that was the problem. But
why did the port change?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, I learned the hard way that the default port for ASP.NET Core 8 container
images has been updated from port 80 to 8080, quite a remarkable breaking
change.</p>
<p>We upgraded our web application from .NET 7 and let the CI pipeline do its work.
Finally, we checked the application in the browser to ensure everything was
okay, but unfortunately, we got a 502 Bad Gateway error. The Nginx logs revealed
that the app was rejecting connections, which was unexpected because we didn&rsquo;t
make any changes there. Further investigation showed that the web app listened
on port 8080 while Nginx was reverse-proxied to 80. So that was the problem. But
why did the port change?</p>
<blockquote>
<p>The change to the port number was made because of the need to provide a good
usability experience when switching to a non-root user. Running as a non-root
user requires the use of a non-privileged port in some environments. Since port
80, the previous default port, is a privileged port, the default was updated to
port 8080, which is a non-privileged port <em>(<a href="https://learn.microsoft.com/en-us/dotnet/core/compatibility/containers/8.0/aspnet-port#reason-for-change">source</a>)</em></p></blockquote>
<p>It all makes sense now. In hindsight, it was our mistake. We should have
explicitly declared the port in our launch settings anyway. As the <a href="https://en.wikipedia.org/wiki/Zen_of_Python">Python
Zen</a> says, &ldquo;Explicit is better than
implicit.&rdquo;</p>
]]></content:encoded>
    </item>
    <item>
      <title>Monte Tiravento</title>
      <link>https://nicolaiarocci.com/monte-tiravento/</link>
      <pubDate>Mon, 19 Feb 2024 10:02:48 +0100</pubDate>
      <guid>https://nicolaiarocci.com/monte-tiravento/</guid>
      <description>&lt;p&gt;Yesterday, I went on a hiking trip to Monte Tiravento. This majestic loop tour
is uncommon compared to the classic woody image of the Parco Nazionale del
Foreste Casentinesi, as it takes place mainly on aerial and partly even barren
ridges, resulting in magnificent views. Compared to other variants I did in the
past, this one starts at a high altitude, offering lower elevation differences.&lt;/p&gt;
&lt;p&gt;It is inadvisable on the hottest summer days when the nearby forests offer more
cover from the scorching sun, but it is a real treat throughout the rest of the
year.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday, I went on a hiking trip to Monte Tiravento. This majestic loop tour
is uncommon compared to the classic woody image of the Parco Nazionale del
Foreste Casentinesi, as it takes place mainly on aerial and partly even barren
ridges, resulting in magnificent views. Compared to other variants I did in the
past, this one starts at a high altitude, offering lower elevation differences.</p>
<p>It is inadvisable on the hottest summer days when the nearby forests offer more
cover from the scorching sun, but it is a real treat throughout the rest of the
year.</p>
<p>Reasons for environmental interest, other than in individual uncommon botanical
species (at least red juniper and turkey oak), lie mainly in the wild valleys
overlooked by what is the &ldquo;turnaround&rdquo; as well as the highest point of the
itinerary, Monte Tiravento (and even the name testifies to the splendid
isolation of the site) and in the beautiful ruin of the medieval Montalto Tower.
A final appendage to see monumental oaks further embellishes the hike. I met
several groups on the trail, and we&rsquo;re in February, so I&rsquo;d expect these ridges
to be crowded in spring and autumn.</p>
<p>For GPS track, photos, and stats <a href="https://www.outdooractive.com/en/route/hiking-route/province-of-forli-cesena/monte-tiravento/287243288/">click here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Paying people to work on open source is good actually</title>
      <link>https://nicolaiarocci.com/paying-people-to-work-on-open-source-is-good-actually/</link>
      <pubDate>Sat, 17 Feb 2024 07:35:46 +0100</pubDate>
      <guid>https://nicolaiarocci.com/paying-people-to-work-on-open-source-is-good-actually/</guid>
      <description>&lt;p&gt;From my experience as a maintainer of midly successful open-source projects, I
have come to the conclusion that people who criticize accepting payment to work
on such projects are either acting in bad faith or are incredibly naive.&lt;/p&gt;
&lt;p&gt;Anyway, Jacob Kaplan-Moss&amp;rsquo;s recent &lt;em&gt;Paying people to work on open source is
good&lt;/em&gt; is a stellar post on the topic of open-source sustainability.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My fundamental position is that paying people to work on open source is good, full stop, no exceptions. We need to stop criticizing maintainers getting paid, and start celebrating. Yes, all of the mechanisms are flawed in some way, but that’s because the world is flawed, and it’s not the fault of the people taking money. Yelling at maintainers who’ve found a way to make a living is wrong.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>From my experience as a maintainer of midly successful open-source projects, I
have come to the conclusion that people who criticize accepting payment to work
on such projects are either acting in bad faith or are incredibly naive.</p>
<p>Anyway, Jacob Kaplan-Moss&rsquo;s recent <em>Paying people to work on open source is
good</em> is a stellar post on the topic of open-source sustainability.</p>
<blockquote>
<p>My fundamental position is that paying people to work on open source is good, full stop, no exceptions. We need to stop criticizing maintainers getting paid, and start celebrating. Yes, all of the mechanisms are flawed in some way, but that’s because the world is flawed, and it’s not the fault of the people taking money. Yelling at maintainers who’ve found a way to make a living is wrong.</p></blockquote>
<p>Full article <a href="https://jacobian.org/2024/feb/16/paying-maintainers-is-good/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Solo winter attempt at Cerro Torre</title>
      <link>https://nicolaiarocci.com/solo-winter-attempt-at-cerro-torre/</link>
      <pubDate>Fri, 16 Feb 2024 18:52:56 +0100</pubDate>
      <guid>https://nicolaiarocci.com/solo-winter-attempt-at-cerro-torre/</guid>
      <description>&lt;p&gt;My mountaineering days are mostly left behind, and I miss them, so now and then,
I look at some YouTube videos from the field specialists. Today, the algorithm
suggested I watch a truly phenomenal one by &lt;a href=&#34;https://en.wikipedia.org/wiki/Colin_Haley&#34;&gt;Colin Haley&lt;/a&gt;.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/Hg7VLCiUeGc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;What makes it so unique is the raw, unedited &amp;ldquo;I&amp;rsquo;m filming for my family&amp;rdquo; feeling
that there is to it.  He&amp;rsquo;s sweating, swearing, worrying and freezing like, you
know, the rest of us. Colin seems a lovable, down-to-earth guy, I like his
attitude. Oh, and I would&amp;rsquo;ve bailed much sooner than him.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>My mountaineering days are mostly left behind, and I miss them, so now and then,
I look at some YouTube videos from the field specialists. Today, the algorithm
suggested I watch a truly phenomenal one by <a href="https://en.wikipedia.org/wiki/Colin_Haley">Colin Haley</a>.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Hg7VLCiUeGc?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>What makes it so unique is the raw, unedited &ldquo;I&rsquo;m filming for my family&rdquo; feeling
that there is to it.  He&rsquo;s sweating, swearing, worrying and freezing like, you
know, the rest of us. Colin seems a lovable, down-to-earth guy, I like his
attitude. Oh, and I would&rsquo;ve bailed much sooner than him.</p>
]]></content:encoded>
    </item>
    <item>
      <title>AI generated videos just changed forever</title>
      <link>https://nicolaiarocci.com/ai-generated-videos-just-changed-forever/</link>
      <pubDate>Fri, 16 Feb 2024 18:16:15 +0100</pubDate>
      <guid>https://nicolaiarocci.com/ai-generated-videos-just-changed-forever/</guid>
      <description>&lt;p&gt;Yesterday&amp;rsquo;s OpenAI launch of Sora is, as is always the case with OpenAI, mind-boggling. Marquees Browniee&amp;rsquo;s comment is spot-on, so much so as he&amp;rsquo;s obviously involved in the video-making scene.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/NXpdyAWLDas?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;I don&amp;rsquo;t think content creators are at risk with Sora, not anytime soon, but, as Marquees repeatedly notes in the video above, just one year ago we thought AI-generated video was a joke.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday&rsquo;s OpenAI launch of Sora is, as is always the case with OpenAI, mind-boggling. Marquees Browniee&rsquo;s comment is spot-on, so much so as he&rsquo;s obviously involved in the video-making scene.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/NXpdyAWLDas?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>I don&rsquo;t think content creators are at risk with Sora, not anytime soon, but, as Marquees repeatedly notes in the video above, just one year ago we thought AI-generated video was a joke.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Content of Charles Darwin&#39;s personal library revealed for the first time</title>
      <link>https://nicolaiarocci.com/content-of-charles-darwins-personal-library-revealed-for-the-first-time/</link>
      <pubDate>Thu, 15 Feb 2024 15:42:49 +0100</pubDate>
      <guid>https://nicolaiarocci.com/content-of-charles-darwins-personal-library-revealed-for-the-first-time/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m always fascinated by these in-depth bibliography efforts, and this one, with
its unique 300-page catalog detailing 7,400 titles from Charles Darwin&amp;rsquo;s
library, is nothing short of extraordinary.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;John van Wyhe, the academic who has led the “overwhelming” endeavour, said it showed the extraordinary extent of Darwin’s research into the work of others.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“It also shows how insanely eclectic Darwin was,” Van Wyhe said. “There is this vast sea of things which might be an American or German news clipping about a duck or invasive grasshoppers. That’s been the fun part, not the formal books but the other things … all of which pool together to make the theories and publications we all know.”&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m always fascinated by these in-depth bibliography efforts, and this one, with
its unique 300-page catalog detailing 7,400 titles from Charles Darwin&rsquo;s
library, is nothing short of extraordinary.</p>
<blockquote>
<p>John van Wyhe, the academic who has led the “overwhelming” endeavour, said it showed the extraordinary extent of Darwin’s research into the work of others.</p></blockquote>
<blockquote>
<p>“It also shows how insanely eclectic Darwin was,” Van Wyhe said. “There is this vast sea of things which might be an American or German news clipping about a duck or invasive grasshoppers. That’s been the fun part, not the formal books but the other things … all of which pool together to make the theories and publications we all know.”</p></blockquote>
<p>The Guardian article is <a href="https://www.theguardian.com/science/2024/feb/11/charles-darwin-entire-personal-library-revealed-first-time">here</a>. I had to dig a little to surface the <a href="http://darwin-online.org.uk/Complete_Library_of_Charles_Darwin.html">actual catalog</a> on the Darwin Online website.  Many titles even have links to their text contents and images.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Spinoza and the art of thinking in dangerous times</title>
      <link>https://nicolaiarocci.com/spinoza-and-the-art-of-thinking-in-dangerous-times/</link>
      <pubDate>Sat, 10 Feb 2024 12:22:45 +0100</pubDate>
      <guid>https://nicolaiarocci.com/spinoza-and-the-art-of-thinking-in-dangerous-times/</guid>
      <description>&lt;p&gt;Technically, The New Yorker&amp;rsquo;s &lt;em&gt;Baruch Spinoza and the Art of Thinking in
Dangerous Times&lt;/em&gt; reviews a book on Spinoza. It is so well conceived that it
also offers a practical primer on the philosopher&amp;rsquo;s thoughts on God, nature,
democracy, religion and their interaction.&lt;/p&gt;
&lt;p&gt;A few steps into his public philosopher career, Spinoza found himself exiled
from his Jewish community in Amsterdam. That made him cautious and adept at
avoiding an even worse fate, which was entirely possible in the mid-1600s.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Technically, The New Yorker&rsquo;s <em>Baruch Spinoza and the Art of Thinking in
Dangerous Times</em> reviews a book on Spinoza. It is so well conceived that it
also offers a practical primer on the philosopher&rsquo;s thoughts on God, nature,
democracy, religion and their interaction.</p>
<p>A few steps into his public philosopher career, Spinoza found himself exiled
from his Jewish community in Amsterdam. That made him cautious and adept at
avoiding an even worse fate, which was entirely possible in the mid-1600s.</p>
<blockquote>
<p>Although Spinoza was certainly a champion of political and intellectual
freedom, he had no interest in being a martyr for them, and, if his life teaches
anything about thinking in dangerous times, it is how prudence and boldness can
go hand in hand. Not for nothing did he wear a ring inscribed with the Latin
word “Caute”: “Be cautious.”</p></blockquote>
<p>Full article <a href="https://www.newyorker.com/magazine/2024/02/12/baruch-spinoza-and-the-art-of-thinking-in-dangerous-times">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>GitHub Wikis don&#39;t allow edits or pull requests</title>
      <link>https://nicolaiarocci.com/github-wikis-dont-allow-edits-or-pull-requests/</link>
      <pubDate>Fri, 09 Feb 2024 15:58:54 +0100</pubDate>
      <guid>https://nicolaiarocci.com/github-wikis-dont-allow-edits-or-pull-requests/</guid>
      <description>&lt;p&gt;Today I learned that GitHub wikis are not editable online and &lt;a href=&#34;https://github.com/orgs/community/discussions/50163&#34;&gt;do not support
pull requests&lt;/a&gt;. You can
clone and edit a wiki locally but not return your change to the original
repository.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t use wikis in &lt;a href=&#34;https://nicolaiarocci.com/opensource/&#34;&gt;my projects&lt;/a&gt;; I prefer documentation to stay with the
project, usually in a dedicated directory, and publish it on a dedicated site
through GitHub Pages. But today was different as I &lt;a href=&#34;https://github.com/adityatelange/hugo-PaperMod/pull/1419&#34;&gt;opened a pull
request&lt;/a&gt; for PaperMod,
the Hugo theme I use on this website. Someone asked if I could update the
documentation too. Right, too bad it&amp;rsquo;s impossible to do that.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned that GitHub wikis are not editable online and <a href="https://github.com/orgs/community/discussions/50163">do not support
pull requests</a>. You can
clone and edit a wiki locally but not return your change to the original
repository.</p>
<p>I don&rsquo;t use wikis in <a href="/opensource/">my projects</a>; I prefer documentation to stay with the
project, usually in a dedicated directory, and publish it on a dedicated site
through GitHub Pages. But today was different as I <a href="https://github.com/adityatelange/hugo-PaperMod/pull/1419">opened a pull
request</a> for PaperMod,
the Hugo theme I use on this website. Someone asked if I could update the
documentation too. Right, too bad it&rsquo;s impossible to do that.</p>
<p>The first ticket on this <a href="https://github.com/isaacs/github/issues/846">goes back to
2016</a>. This limitation makes GitHub
wikis impractical for any team project (maybe 90% of those on the platform),
confining them to personal projects or small experiments. No wonder so many
Wikis appear as outdated on GitHub.</p>
<p>It would be better to withdraw the feature given that GitHub offers a much more
compelling solution in Pages.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Isolated indigenous people as happy as wealthy western peers</title>
      <link>https://nicolaiarocci.com/isolated-indigenous-people-as-happy-as-wealthy-western-peers/</link>
      <pubDate>Fri, 09 Feb 2024 09:30:34 +0100</pubDate>
      <guid>https://nicolaiarocci.com/isolated-indigenous-people-as-happy-as-wealthy-western-peers/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;People living in remote Indigenous communities are as happy as those in
wealthy developed countries despite having “very little money”, according to new
scientific research that could challenge the widely held perception that “money
buys happiness”.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Researchers who interviewed 2,966 people in 19 Indigenous and local
communities across the world found that on average they were as happy – if not
happier – as the average person in high-income western countries.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>People living in remote Indigenous communities are as happy as those in
wealthy developed countries despite having “very little money”, according to new
scientific research that could challenge the widely held perception that “money
buys happiness”.</p></blockquote>
<blockquote>
<p>Researchers who interviewed 2,966 people in 19 Indigenous and local
communities across the world found that on average they were as happy – if not
happier – as the average person in high-income western countries.</p></blockquote>
<p>Who would have thought.</p>
<p>Full article <a href="https://www.theguardian.com/lifeandstyle/2024/feb/05/isolated-indigenous-people-as-happy-as-wealthy-western-peers-study">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ethan Mollick&#39;s first impressions on Gemini Advanced</title>
      <link>https://nicolaiarocci.com/ethan-mollicks-first-impressions-on-gemini-advanced/</link>
      <pubDate>Thu, 08 Feb 2024 17:40:23 +0100</pubDate>
      <guid>https://nicolaiarocci.com/ethan-mollicks-first-impressions-on-gemini-advanced/</guid>
      <description>&lt;p&gt;Ethan Mollick, one of my few &lt;a href=&#34;https://nicolaiarocci.com/some-hints-about-what-the-next-year-of-ai-looks-like/&#34;&gt;LLM/AI
sources&lt;/a&gt;, just dropped
his first impressions on Gemini Advanced, released today, but which he&amp;rsquo;s been
testing for a month in early access.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let me start with the headline: Gemini Advanced is clearly a GPT-4 class
model. The statistics show this, but so does a month of our informal testing.
And this is a big deal because OpenAI’s GPT-4 (the paid version of
ChatGPT/Microsoft Copilot) has been the dominant AI for well over a year, and no
other model has come particularly close. Prior to Gemini, we only had one
advanced AI model to look at, and it is hard drawing conclusions with a dataset
of one. Now there are two, and we can learn a few things.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ethan Mollick, one of my few <a href="/some-hints-about-what-the-next-year-of-ai-looks-like/">LLM/AI
sources</a>, just dropped
his first impressions on Gemini Advanced, released today, but which he&rsquo;s been
testing for a month in early access.</p>
<blockquote>
<p>Let me start with the headline: Gemini Advanced is clearly a GPT-4 class
model. The statistics show this, but so does a month of our informal testing.
And this is a big deal because OpenAI’s GPT-4 (the paid version of
ChatGPT/Microsoft Copilot) has been the dominant AI for well over a year, and no
other model has come particularly close. Prior to Gemini, we only had one
advanced AI model to look at, and it is hard drawing conclusions with a dataset
of one. Now there are two, and we can learn a few things.</p></blockquote>
<p>Things are getting hotter in the LLM space, and competition is always good.</p>
<p>Full article
<a href="https://www.oneusefulthing.org/p/google-gemini-advanced-tasting-notes">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A new golden era of blogging?</title>
      <link>https://nicolaiarocci.com/a-new-golden-era-of-blogging/</link>
      <pubDate>Thu, 08 Feb 2024 09:25:30 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-new-golden-era-of-blogging/</guid>
      <description>&lt;p&gt;After &lt;a href=&#34;https://nicolaiarocci.com/the-20-year-indie-web-cycle-maybe/&#34;&gt;yesterday&lt;/a&gt;&amp;rsquo;s, another article on the
modern era of blogging surfaced on my RSS feed. In &lt;a href=&#34;https://blog.jim-nielsen.com/2024/golden-era-blogging/&#34;&gt;A Golden Era of
Blogging&lt;/a&gt;, Jim Nielsen
boldly proposes that we live in, you guessed it, a new golden era of blogging.&lt;/p&gt;
&lt;p&gt;He argues that the advent of the ads market tainted the original blogging scene
in the mid-2000s, and something similar is now happening in the YouTube scene.
Today&amp;rsquo;s independent blogger is not in it for the money (there&amp;rsquo;s none to be had)
but for passion and an (unconscious?) belief in indie web ideals, and these are
precisely the forces that drove the first wave of bloggers in the 2000s.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>After <a href="/the-20-year-indie-web-cycle-maybe/">yesterday</a>&rsquo;s, another article on the
modern era of blogging surfaced on my RSS feed. In <a href="https://blog.jim-nielsen.com/2024/golden-era-blogging/">A Golden Era of
Blogging</a>, Jim Nielsen
boldly proposes that we live in, you guessed it, a new golden era of blogging.</p>
<p>He argues that the advent of the ads market tainted the original blogging scene
in the mid-2000s, and something similar is now happening in the YouTube scene.
Today&rsquo;s independent blogger is not in it for the money (there&rsquo;s none to be had)
but for passion and an (unconscious?) belief in indie web ideals, and these are
precisely the forces that drove the first wave of bloggers in the 2000s.</p>
<p>We modern bloggers, however, inhabit a tiny self-indulging bubble that is not
comparable with the original scene. But you know what, I feel comfortable in it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The 20-year indie web cycle, maybe</title>
      <link>https://nicolaiarocci.com/the-20-year-indie-web-cycle-maybe/</link>
      <pubDate>Wed, 07 Feb 2024 09:07:10 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-20-year-indie-web-cycle-maybe/</guid>
      <description>&lt;p&gt;The History of the Web has an interesting take on the resurgence of blogging and
the indie web that seems to be occurring these days.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With roots in the world of fashion, there exists a cyclical principle
suggesting that every two decades, previously popular trends “every 20 years or
so the trends that were once popular will begin to be on the forefront again.”
What’s old is new again. However, these recurring trends aren’t just rip-offs.
They are remixed and reinterpreted through the lens of a new generation. We are,
perhaps, in a 20 year resurgence for the indie web and blogging.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The History of the Web has an interesting take on the resurgence of blogging and
the indie web that seems to be occurring these days.</p>
<blockquote>
<p>With roots in the world of fashion, there exists a cyclical principle
suggesting that every two decades, previously popular trends “every 20 years or
so the trends that were once popular will begin to be on the forefront again.”
What’s old is new again. However, these recurring trends aren’t just rip-offs.
They are remixed and reinterpreted through the lens of a new generation. We are,
perhaps, in a 20 year resurgence for the indie web and blogging.</p></blockquote>
<p>More <a href="https://thehistoryoftheweb.com/weve-been-waiting-20-years-for-this/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>YouTube video summaries via ChatGPT</title>
      <link>https://nicolaiarocci.com/youtube-video-summaries-via-chatgpt/</link>
      <pubDate>Tue, 06 Feb 2024 09:45:04 +0100</pubDate>
      <guid>https://nicolaiarocci.com/youtube-video-summaries-via-chatgpt/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://just-tell-me.deno.dev&#34;&gt;Just Tell Me&lt;/a&gt; cleverly leverages ChatGPT to
provide short, insightful summaries of YouTube videos.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Have you ever wasted some time watching a youtube video, that got you kind of
interested because of the click-baity topic, but in the end turned out to be
nothing more BUT click-bait? Or have you ever wanted to just quickly recall what
a video that you&amp;rsquo;ve watched some time ago was about? Just Tell Me has you
covered!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://just-tell-me.deno.dev">Just Tell Me</a> cleverly leverages ChatGPT to
provide short, insightful summaries of YouTube videos.</p>
<blockquote>
<p>Have you ever wasted some time watching a youtube video, that got you kind of
interested because of the click-baity topic, but in the end turned out to be
nothing more BUT click-bait? Or have you ever wanted to just quickly recall what
a video that you&rsquo;ve watched some time ago was about? Just Tell Me has you
covered!</p></blockquote>
<p>You can run it from the website or
<a href="https://github.com/franekmagiera/just-tell-me">locally</a> on the command line,
with your OpenAPI key and the LLM model of choice. I have not looked at the
code, but I understand it leverages the video transcript to do its magic<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I&rsquo;ve
been using it for a while, and it&rsquo;s been good.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I&rsquo;ve now looked at the code and the actual ChatGPT prompt is <em>&ldquo;You will be provided with video captions. Summarize the video in one paragraph&rdquo;</em>
(<a href="https://github.com/franekmagiera/just-tell-me/blob/04be5af4de743ca99d4480a9576830416ec3415e/app/src/get-captions-summary.ts#L23">link</a>).&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Marcus Aurelius the man who solved the universe</title>
      <link>https://nicolaiarocci.com/marcus-aurelius-the-man-who-solved-the-universe/</link>
      <pubDate>Sat, 03 Feb 2024 08:21:18 +0100</pubDate>
      <guid>https://nicolaiarocci.com/marcus-aurelius-the-man-who-solved-the-universe/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been reading Marcus Aurielius&amp;rsquo; &lt;em&gt;Meditations&lt;/em&gt; and, very appropriately and
scaringly, YouTube algorithm thought I would be interested in &lt;a href=&#34;https://www.youtube.com/watch?v=tv6W0Nv5ev0&#34;&gt;Marcus Aurelius,
the Man Who Solved The Universe&lt;/a&gt;.
The title is bombastic and misplaced, but the video is well executed and
correctly summarizes some of the Emperor-Philosopher&amp;rsquo;s thoughts.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/tv6W0Nv5ev0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been reading Marcus Aurielius&rsquo; <em>Meditations</em> and, very appropriately and
scaringly, YouTube algorithm thought I would be interested in <a href="https://www.youtube.com/watch?v=tv6W0Nv5ev0">Marcus Aurelius,
the Man Who Solved The Universe</a>.
The title is bombastic and misplaced, but the video is well executed and
correctly summarizes some of the Emperor-Philosopher&rsquo;s thoughts.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/tv6W0Nv5ev0?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

]]></content:encoded>
    </item>
    <item>
      <title>Being autistic</title>
      <link>https://nicolaiarocci.com/being-autistic/</link>
      <pubDate>Fri, 02 Feb 2024 08:54:30 +0100</pubDate>
      <guid>https://nicolaiarocci.com/being-autistic/</guid>
      <description>&lt;p&gt;A lot of the things David describes in &lt;a href=&#34;https://dhwthompson.com/2018/being-autistic&#34;&gt;this
post&lt;/a&gt; resonate with me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As far as I’ve been able to figure out so far, the things my mind is best at
are details and systems. It‘s part of what makes me a good programmer: I can
hold a lot of detail in my head about how a system fits together, I can mess
around with it more easily than most people, and I can pick up on details other
people might miss, such as potential bugs. A lot of the things I enjoy (and seem
to be pretty good at) are those where there’s an underlying system to figure out
and master – computer games, martial arts, even cooking.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A lot of the things David describes in <a href="https://dhwthompson.com/2018/being-autistic">this
post</a> resonate with me.</p>
<blockquote>
<p>As far as I’ve been able to figure out so far, the things my mind is best at
are details and systems. It‘s part of what makes me a good programmer: I can
hold a lot of detail in my head about how a system fits together, I can mess
around with it more easily than most people, and I can pick up on details other
people might miss, such as potential bugs. A lot of the things I enjoy (and seem
to be pretty good at) are those where there’s an underlying system to figure out
and master – computer games, martial arts, even cooking.</p></blockquote>
<blockquote>
<p>Then there’s a few things my mind struggles to handle. Most of them revolve
around people.</p></blockquote>
<blockquote>
<p>I’m not always great at figuring out what someone else is thinking, or
feeling, or even dropping hints about. I can take educated guesses, for sure,
but I don’t necessarily get it right. It also takes a lot of work to keep track
of all the social cues going on whenever there’s a conversation happening, and
all the social conventions most people seem to follow without even thinking. I
can think of several times when someone has asked me how my weekend went, and
it’s completely slipped my mind that the appropriate response is to ask them
about theirs too. It’s not that I don’t care; it’s that I’m having to
concentrate so much on the rest of the social cues that I take longer to catch
up with how the conversation is supposed to go.</p></blockquote>
<p>It took some balls to write his next one: <a href="https://dhwthompson.com/2018/my-brain-and-how-to-help-it">My brain, and how you can help
me</a>. Respect.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Mars in 4K</title>
      <link>https://nicolaiarocci.com/mars-in-4k/</link>
      <pubDate>Wed, 31 Jan 2024 15:21:11 +0100</pubDate>
      <guid>https://nicolaiarocci.com/mars-in-4k/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The footage, captured directly by NASA&amp;rsquo;s Mars rovers - Spirit, Opportunity, Curiosity, and Perseverance - unveils the red planet&amp;rsquo;s intricate details. These rovers, acting as robotic geologists, have traversed varied terrains, from ancient lake beds to towering mountains, uncovering Mars&amp;rsquo; complex geological history.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;As viewers enjoy these images, they will notice informal place names assigned by NASA&amp;rsquo;s team, providing context to the Martian features observed. Each rover&amp;rsquo;s unique journey is highlighted, showcasing their contributions to Martian exploration.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The footage, captured directly by NASA&rsquo;s Mars rovers - Spirit, Opportunity, Curiosity, and Perseverance - unveils the red planet&rsquo;s intricate details. These rovers, acting as robotic geologists, have traversed varied terrains, from ancient lake beds to towering mountains, uncovering Mars&rsquo; complex geological history.</p></blockquote>
<blockquote>
<p>As viewers enjoy these images, they will notice informal place names assigned by NASA&rsquo;s team, providing context to the Martian features observed. Each rover&rsquo;s unique journey is highlighted, showcasing their contributions to Martian exploration.</p></blockquote>
<p>Stunning, and mesmerizing.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Vy_RPd0rblI?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>In case you can&rsquo;t see the embedded video (hi mailing list folks), here&rsquo;s the <a href="https://www.youtube.com/watch?v=Vy_RPd0rblI">link</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>pg_dump and pg_restore can backup and restore single Postgres schemas</title>
      <link>https://nicolaiarocci.com/pg_dump-and-pg_restore-can-backup-and-restore-single-postgres-schemas/</link>
      <pubDate>Tue, 30 Jan 2024 15:56:15 +0100</pubDate>
      <guid>https://nicolaiarocci.com/pg_dump-and-pg_restore-can-backup-and-restore-single-postgres-schemas/</guid>
      <description>&lt;p&gt;Today I learned that &lt;code&gt;pg_dump&lt;/code&gt; can make a copy of a Postgres schema instead of
the whole database. Likewise, if needed, &lt;code&gt;pg_restore&lt;/code&gt; can restore the schema in
either the original database or a different one.&lt;/p&gt;
&lt;p&gt;Backup of a Postgres schema:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pg_dump -h host -d source_database -U user -n schema_name -F c -f schema_dump_file.dump
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restore of a Postgres schema:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pg_restore -h host -d dest_database -U user -n schema_name schema_dump_file.dump
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All primary and shared knowledge, I am sure. Another item of note: the DB name
is hard-coded in &lt;code&gt;pg_dumpall&lt;/code&gt; files, so if one wants to restore on a database
named differently, one must go into the dump file and edit it by hand.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned that <code>pg_dump</code> can make a copy of a Postgres schema instead of
the whole database. Likewise, if needed, <code>pg_restore</code> can restore the schema in
either the original database or a different one.</p>
<p>Backup of a Postgres schema:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>pg_dump -h host -d source_database -U user -n schema_name -F c -f schema_dump_file.dump
</span></span></code></pre></div><p>Restore of a Postgres schema:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>pg_restore -h host -d dest_database -U user -n schema_name schema_dump_file.dump
</span></span></code></pre></div><p>All primary and shared knowledge, I am sure. Another item of note: the DB name
is hard-coded in <code>pg_dumpall</code> files, so if one wants to restore on a database
named differently, one must go into the dump file and edit it by hand.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Digital books wear out faster than physical books</title>
      <link>https://nicolaiarocci.com/digital-books-wear-out-faster-than-physical-books/</link>
      <pubDate>Tue, 30 Jan 2024 08:32:30 +0100</pubDate>
      <guid>https://nicolaiarocci.com/digital-books-wear-out-faster-than-physical-books/</guid>
      <description>&lt;p&gt;Brewster Kahle, at The Internet Archive Blogs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ever try to read a physical book passed down in your family from 100 years
ago?  Probably worked well. Ever try reading an ebook you paid for 10 years ago?
Probably a different experience. From the leasing business model of mega
a publishers to physical device evolution to format obsolescence, digital books
are fragile and threatened. [&amp;hellip;] Our paper books have lasted hundreds of years
on our shelves and are still readable. Without active maintenance, we will be
lucky if our digital books last a decade.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Brewster Kahle, at The Internet Archive Blogs:</p>
<blockquote>
<p>Ever try to read a physical book passed down in your family from 100 years
ago?  Probably worked well. Ever try reading an ebook you paid for 10 years ago?
Probably a different experience. From the leasing business model of mega
a publishers to physical device evolution to format obsolescence, digital books
are fragile and threatened. [&hellip;] Our paper books have lasted hundreds of years
on our shelves and are still readable. Without active maintenance, we will be
lucky if our digital books last a decade.</p></blockquote>
<p>Full article <a href="https://blog.archive.org/2022/11/15/digital-books-wear-out-faster-than-physical-books/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Rio Petroso</title>
      <link>https://nicolaiarocci.com/rio-petroso/</link>
      <pubDate>Mon, 29 Jan 2024 09:44:15 +0100</pubDate>
      <guid>https://nicolaiarocci.com/rio-petroso/</guid>
      <description>&lt;p&gt;Wet, cold, and foggy winter day in the plains, I knew it would be splendid in
the highlands. At the last minute and even a little late by my usual safety
standards, I packed my backpack and dashed into the hills. To avoid being late
or having to return in the dark, I didn&amp;rsquo;t even stop eating, munching on two bars
as I walked, but it was worth it.&lt;/p&gt;
&lt;p&gt;Rio Petroso is a rather complex and articulated circular tour, with frequent
environmental changes, configuring itself among the most arid of the entire Park
territory; I wouldn&amp;rsquo;t do this route at the height of summer.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wet, cold, and foggy winter day in the plains, I knew it would be splendid in
the highlands. At the last minute and even a little late by my usual safety
standards, I packed my backpack and dashed into the hills. To avoid being late
or having to return in the dark, I didn&rsquo;t even stop eating, munching on two bars
as I walked, but it was worth it.</p>
<p>Rio Petroso is a rather complex and articulated circular tour, with frequent
environmental changes, configuring itself among the most arid of the entire Park
territory; I wouldn&rsquo;t do this route at the height of summer.</p>
<p>Another peculiarity of this hike is the dense presence of ruined houses,
precious testimonies of the glorious Apennine civilization history that lasted
until the late 1960s, with the departure of the population to the valley floors
or, more often than not, the plains.</p>
<p>The geological peculiarity is constituted by the so-called &ldquo;Verghereto marls&rdquo;
(named after the typical locality where they, in fact, overbearingly
characterize the landscape), which appear especially along the ridge of Rio
Petroso: they give rise to a barren environment, with erosion phenomena
reminiscent of those of gullies but with, in addition, an almost exotic
suggestion in their lunar nudity.</p>
<p>When I got to the car, I realized I had forgotten the headlights on. It&rsquo;s a good
thing I hurried on the route (and recently changed the battery), or I would have
been stuck there, 10 km from civilization, with no phone signal—an adventure I
gladly spared myself.</p>
<p>GPS track, map, pics and all the frills are <a href="https://out.ac/IPx3WT">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Video of my C# 12 session at .NET Conference Italia 2023</title>
      <link>https://nicolaiarocci.com/video-of-my-csharp-12-session-at-dotnet-conference-italia-2023/</link>
      <pubDate>Fri, 26 Jan 2024 15:39:31 +0100</pubDate>
      <guid>https://nicolaiarocci.com/video-of-my-csharp-12-session-at-dotnet-conference-italia-2023/</guid>
      <description>&lt;p&gt;The video and slides of my C# 12 session at .NET Conference Italia 2023 is
finally &lt;a href=&#34;https://www.ugidotnet.org/e/sessione/3295/C-12-Cosa-c-e-di-nuovo-e-interessante&#34;&gt;available
online&lt;/a&gt;.
Unfortunately it&amp;rsquo;s just my voice and my laptop screen, and that&amp;rsquo;s too bad
because the location was as cool as it can get, and the room was packed.&lt;/p&gt;
&lt;p&gt;It is in Italian&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; and you need to login in order to see it (sorry, I
don&amp;rsquo;t have control over it.)&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I also submitted to several international conferences; let&amp;rsquo;s see what
happens. Since the COVID hiatus, I&amp;rsquo;ve had no luck with international events.&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;</description>
      <content:encoded><![CDATA[<p>The video and slides of my C# 12 session at .NET Conference Italia 2023 is
finally <a href="https://www.ugidotnet.org/e/sessione/3295/C-12-Cosa-c-e-di-nuovo-e-interessante">available
online</a>.
Unfortunately it&rsquo;s just my voice and my laptop screen, and that&rsquo;s too bad
because the location was as cool as it can get, and the room was packed.</p>
<p>It is in Italian<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and you need to login in order to see it (sorry, I
don&rsquo;t have control over it.)</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I also submitted to several international conferences; let&rsquo;s see what
happens. Since the COVID hiatus, I&rsquo;ve had no luck with international events.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Dungeons and Dragons turns 50 today</title>
      <link>https://nicolaiarocci.com/dungeons-and-dragons-turns-50-today/</link>
      <pubDate>Fri, 26 Jan 2024 15:01:38 +0100</pubDate>
      <guid>https://nicolaiarocci.com/dungeons-and-dragons-turns-50-today/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dungeons &amp;amp; Dragons played an outsize role in popularizing fantasy literature,
ideas, and themes, as well as inspiring many of its devotees to create their
own. Roleplaying, as a formal activity, owes nearly its entire existence to the
phenomenal success of D&amp;amp;D. Even more remarkable is the extent to which the
computer and video game industry, which is bigger and more profitable than the
music and movie industries combined, owes a huge debt to the example set by D&amp;amp;D.
If you play any game with classes or levels or experience or hit points today,
that&amp;rsquo;s because of Dungeons &amp;amp; Dragons.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Dungeons &amp; Dragons played an outsize role in popularizing fantasy literature,
ideas, and themes, as well as inspiring many of its devotees to create their
own. Roleplaying, as a formal activity, owes nearly its entire existence to the
phenomenal success of D&amp;D. Even more remarkable is the extent to which the
computer and video game industry, which is bigger and more profitable than the
music and movie industries combined, owes a huge debt to the example set by D&amp;D.
If you play any game with classes or levels or experience or hit points today,
that&rsquo;s because of Dungeons &amp; Dragons.</p></blockquote>
<p>More <a href="http://grognardia.blogspot.com/2024/01/fifty-years-ago-today.html">here</a>.</p>
<p>I started playing D&amp;D in high school in the mid-80s. Does that make me a
Stranger Things kid? I&rsquo;m still trying to figure that out, but D&amp;D significantly
impacted me growing up. It probably didn&rsquo;t save my life <a href="https://www.hearsay.tech/2023-10-29-dungeons-and-dragons-saved-my-life.gmi">like it did for
others</a>,
but to an introvert like me, it offered an incredible opportunity to go out,
meet and talk to people, challenging myself and my imagination.</p>
<p>Right before Christmas, I presented myself with an AD&amp;D 5th edition complete
set, partly out of curiosity but also nostalgia. I loved browsing the modern
editions of the Player Handbook, Master Manual, and Monsters Book—so many good
memories. I later bought the Starter Kit, hoping to play at least an evening
session with my &ldquo;kids,&rdquo; as two of them were about to return home from University
(the third is still with us.) We never played that session. In hindsight, it was
a stupid idea.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fixing the &#34;Failed to create CoreCLR error 0x80070008&#34; error when starting a .NET 8 docker container</title>
      <link>https://nicolaiarocci.com/fixing-the-failed-to-create-coreclr-error-0x80070008-error-when-starting-a-dotnet-docker-container/</link>
      <pubDate>Fri, 26 Jan 2024 09:31:47 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fixing-the-failed-to-create-coreclr-error-0x80070008-error-when-starting-a-dotnet-docker-container/</guid>
      <description>&lt;p&gt;Another day, another unexpected problem. Launching a .NET 8 app from a docker
container, I got this error: &lt;code&gt;Failed to create CoreCLR, HRESULT: 0x80070008&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I was puzzled as the same container ran smoothly in our test environment but not
in production. I ruled out resource problems (memory or disk full, maybe?) but
then compared the Docker Engine versions we run in test and production. Both
were old (20. xx when 25 is available), but interestingly, the production
version was older. I searched online and found a two years-old
&lt;a href=&#34;https://github.com/PowerShell/PowerShell/issues/17624&#34;&gt;ticket&lt;/a&gt; hinting at some
problems between .NET 8 and older Docker versions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Another day, another unexpected problem. Launching a .NET 8 app from a docker
container, I got this error: <code>Failed to create CoreCLR, HRESULT: 0x80070008</code>.</p>
<p>I was puzzled as the same container ran smoothly in our test environment but not
in production. I ruled out resource problems (memory or disk full, maybe?) but
then compared the Docker Engine versions we run in test and production. Both
were old (20. xx when 25 is available), but interestingly, the production
version was older. I searched online and found a two years-old
<a href="https://github.com/PowerShell/PowerShell/issues/17624">ticket</a> hinting at some
problems between .NET 8 and older Docker versions.</p>
<p>I
<a href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository">updated</a>
the Docker Engine to the latest version, and guess what? The .NET 8 container
now starts without making a dent.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to fix the crontab error `rename: Operation not permitted`</title>
      <link>https://nicolaiarocci.com/how-to-fix-the-crontab-error-rename-operation-not-permitted/</link>
      <pubDate>Thu, 25 Jan 2024 14:37:42 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-fix-the-crontab-error-rename-operation-not-permitted/</guid>
      <description>&lt;p&gt;Today, something unexpected happened while I was working on one of our Linux
machines. I issued the &lt;code&gt;crontab -e&lt;/code&gt; command to add a cron job to my user&amp;rsquo;s
crontab file, modified and saved it, only to the following error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-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;crontab: installing new crontab
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crontab: crontabs/&amp;lt;user&amp;gt;: rename: Operation not permitted
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crontab: edits left in /tmp/crontab.hgmsOH/crontab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puzzled, I checked whether my user permissions were all right, if the disk was
full, and several other things. Long story short, the fix was this one:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, something unexpected happened while I was working on one of our Linux
machines. I issued the <code>crontab -e</code> command to add a cron job to my user&rsquo;s
crontab file, modified and saved it, only to the following error:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>crontab: installing new crontab
</span></span><span style="display:flex;"><span>crontab: crontabs/&lt;user&gt;: rename: Operation not permitted
</span></span><span style="display:flex;"><span>crontab: edits left in /tmp/crontab.hgmsOH/crontab
</span></span></code></pre></div><p>Puzzled, I checked whether my user permissions were all right, if the disk was
full, and several other things. Long story short, the fix was this one:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo chattr -i /var/spool/cron/crontabs/&lt;user&gt;
</span></span><span style="display:flex;"><span>sudo chown &lt;user&gt;:crontab /var/spool/cron/crontabs/&lt;user&gt;
</span></span></code></pre></div><p>Somehow, the user&rsquo;s crontab file had become immutable.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My grandpa was a Nazi</title>
      <link>https://nicolaiarocci.com/my-grandpa-was-a-nazi/</link>
      <pubDate>Sun, 21 Jan 2024 16:35:07 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-grandpa-was-a-nazi/</guid>
      <description>&lt;p&gt;Powerful and cautionary story.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I wondered for many years, how all of this could have happened. How people
like my grandpa turned into monsters and people around him watched or turned
into monsters with him. The last years made this very clear.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More &lt;a href=&#34;https://bastianallgeier.com/notes/grandpa&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Powerful and cautionary story.</p>
<blockquote>
<p>I wondered for many years, how all of this could have happened. How people
like my grandpa turned into monsters and people around him watched or turned
into monsters with him. The last years made this very clear.</p></blockquote>
<p>More <a href="https://bastianallgeier.com/notes/grandpa">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linus Torvalds on the impact of LLMs and AI on programming</title>
      <link>https://nicolaiarocci.com/linus-torvalds-on-the-impact-of-llms-and-ai-on-programming/</link>
      <pubDate>Sun, 21 Jan 2024 12:27:26 +0100</pubDate>
      <guid>https://nicolaiarocci.com/linus-torvalds-on-the-impact-of-llms-and-ai-on-programming/</guid>
      <description>&lt;p&gt;I think I like &lt;a href=&#34;https://www.youtube.com/watch?v=VHHT6W-N0ak&#34;&gt;his take&lt;/a&gt; on the topic.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/VHHT6W-N0ak?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>I think I like <a href="https://www.youtube.com/watch?v=VHHT6W-N0ak">his take</a> on the topic.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VHHT6W-N0ak?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

]]></content:encoded>
    </item>
    <item>
      <title>I&#39;m leaving Substack</title>
      <link>https://nicolaiarocci.com/im-leaving-substack/</link>
      <pubDate>Fri, 19 Jan 2024 15:32:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/im-leaving-substack/</guid>
      <description>&lt;p&gt;If you are one of the few following me on Substack, I have news: I&amp;rsquo;m
leaving Substack and moving to a &lt;a href=&#34;https://buttondown.email/refer/nicolaiarocci&#34;&gt;different
platform&lt;/a&gt;. I actually left a
couple of weeks ago; my latest posts are not on Substack and you can find them
on &lt;a href=&#34;https://nicolaiarocci.com&#34;&gt;my website&lt;/a&gt; (the source of all my content), or
you can subscribe to the &lt;a href=&#34;https://buttondown.email/nicolaiarocci&#34;&gt;new
newsletter&lt;/a&gt; or the &lt;a href=&#34;https://nicolaiarocci.com/index.xml&#34;&gt;RSS
feed&lt;/a&gt; like hackers do.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re an old-time Substack subscriber, you already know because I
transferred all the active subscriptions to the new platform. I&amp;rsquo;m writing for
the occasional passerby looking for fresh content.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you are one of the few following me on Substack, I have news: I&rsquo;m
leaving Substack and moving to a <a href="https://buttondown.email/refer/nicolaiarocci">different
platform</a>. I actually left a
couple of weeks ago; my latest posts are not on Substack and you can find them
on <a href="https://nicolaiarocci.com">my website</a> (the source of all my content), or
you can subscribe to the <a href="https://buttondown.email/nicolaiarocci">new
newsletter</a> or the <a href="https://nicolaiarocci.com/index.xml">RSS
feed</a> like hackers do.</p>
<p>If you&rsquo;re an old-time Substack subscriber, you already know because I
transferred all the active subscriptions to the new platform. I&rsquo;m writing for
the occasional passerby looking for fresh content.</p>
<p>Why I left Substack? Two reasons:</p>
<ol>
<li>
<p>It&rsquo;s <a href="https://badnewsletter.substack.com/p/all-the-garbage-i-found-on-substack">full of
garbage</a>,
has a <a href="https://www.theatlantic.com/ideas/archive/2023/11/substack-extremism-nazi-white-supremacy-newsletters/676156/">nazi
problem</a>,
and it is monetizing on all this stuff. I don&rsquo;t want to be associated in any
possible way with an enterprise like this, and I certainly don&rsquo;t want to offer
them visibility, no matter how little.</p>
</li>
<li>
<p>Substack does not support RSS-alimented campaigns, so I had to copy &amp; paste
every single post from my website manually. That is tiring and error-prone.</p>
</li>
</ol>
<p>Because of 2, Substack was not my platform from the get-go. I knew, but I
was willing, as an experiment, to put in some extra work in exchange for the
visibility.</p>
<p>I&rsquo;m not willing to compromise on 1.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to implement a PKCE code challenge in C#</title>
      <link>https://nicolaiarocci.com/how-to-implement-pkce-code-challenge-in-csharp/</link>
      <pubDate>Wed, 17 Jan 2024 18:28:14 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-implement-pkce-code-challenge-in-csharp/</guid>
      <description>&lt;p&gt;Today&amp;rsquo;s fun was implementing OAuth2&amp;rsquo;s &lt;a href=&#34;http://tools.ietf.org/html/rfc7636&#34;&gt;RFC
7636&lt;/a&gt;&amp;rsquo;s PKCE (Proof Key for Code Exchange)
in C#. It&amp;rsquo;s relatively straightforward, but I decided to share my implementation
should it be helpful to someone else out there.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PKCE  is an extension to the Authorization Code flow to prevent CSRF and
authorization code injection attacks. [..] It was originally designed to protect
the authorization code flow in mobile apps, but its ability to prevent
authorization code injection makes it useful for every type of OAuth client,
even web apps that use client authentication
(&lt;a href=&#34;https://oauth.net/2/pkce/&#34;&gt;source&lt;/a&gt;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today&rsquo;s fun was implementing OAuth2&rsquo;s <a href="http://tools.ietf.org/html/rfc7636">RFC
7636</a>&rsquo;s PKCE (Proof Key for Code Exchange)
in C#. It&rsquo;s relatively straightforward, but I decided to share my implementation
should it be helpful to someone else out there.</p>
<blockquote>
<p>PKCE  is an extension to the Authorization Code flow to prevent CSRF and
authorization code injection attacks. [..] It was originally designed to protect
the authorization code flow in mobile apps, but its ability to prevent
authorization code injection makes it useful for every type of OAuth client,
even web apps that use client authentication
(<a href="https://oauth.net/2/pkce/">source</a>).</p></blockquote>
<p>In a nutshell:</p>
<ol>
<li>The client requests a single-use authorization code to an authorization server. In doing that, it includes a <code>code_challenge</code> with the request.</li>
<li>The server responds with the authorization code if the client is recognized and authorized.</li>
<li>The client requests an access token in exchange for the authorization code. It includes the <code>code_verifier</code> used to generate the original <code>code_challenge</code>;</li>
<li>The server confirms that the verifier is the same one used to generate the code challenge; hence, the client is the same.</li>
</ol>
<p>Plenty of excellent documentation is online (like
<a href="https://auth0.com/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-proof-key-for-code-exchange-pkce">here</a>.)</p>
<p>I was interested in <code>code_verifier</code> and <code>code_challenge</code> generation. Here&rsquo;s my implementation:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-style:italic">/// &lt;summary&gt;</span>
</span></span><span style="display:flex;"><span><span style="font-style:italic">/// Provides a randomly generating PKCE code verifier and it&#39;s corresponding code challenge.</span>
</span></span><span style="display:flex;"><span><span style="font-style:italic">/// &lt;/summary&gt;</span>
</span></span><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">static</span> <span style="font-weight:bold">class</span> <span style="font-weight:bold">Pkce</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="font-style:italic">/// &lt;summary&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="font-style:italic">/// Generates a code_verifier and the corresponding code_challenge, as specified in the rfc-7636.</span>
</span></span><span style="display:flex;"><span>    <span style="font-style:italic">/// &lt;/summary&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="font-style:italic">/// &lt;remarks&gt;See https://datatracker.ietf.org/doc/html/rfc7636#section-4.1 and https://datatracker.ietf.org/doc/html/rfc7636#section-4.2&lt;/remarks&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="font-weight:bold">static</span> (<span style="">string</span> code_challenge, <span style="">string</span> verifier) Generate(<span style="">int</span> size = 32)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">using</span> <span style="font-weight:bold">var</span> rng = RandomNumberGenerator.Create();
</span></span><span style="display:flex;"><span>        <span style="">var</span> randomBytes = <span style="font-weight:bold">new</span> <span style="">byte</span>[size];
</span></span><span style="display:flex;"><span>        rng.GetBytes(randomBytes);
</span></span><span style="display:flex;"><span>        <span style="">var</span> verifier = Base64UrlEncode(randomBytes);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="">var</span> buffer = Encoding.UTF8.GetBytes(verifier);
</span></span><span style="display:flex;"><span>        <span style="">var</span> hash = SHA256.Create().ComputeHash(buffer);
</span></span><span style="display:flex;"><span>        <span style="">var</span> challenge = Base64UrlEncode(hash);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">return</span> (challenge, verifier);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">private</span> <span style="font-weight:bold">static</span> <span style="">string</span> Base64UrlEncode(<span style="">byte</span>[] data) =&gt;
</span></span><span style="display:flex;"><span>        Convert.ToBase64String(data)
</span></span><span style="display:flex;"><span>            .Replace(<span style="font-style:italic">&#34;+&#34;</span>, <span style="font-style:italic">&#34;-&#34;</span>)
</span></span><span style="display:flex;"><span>            .Replace(<span style="font-style:italic">&#34;/&#34;</span>, <span style="font-style:italic">&#34;_&#34;</span>)
</span></span><span style="display:flex;"><span>            .TrimEnd(<span style="font-style:italic">&#39;=&#39;</span>);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Usage is as simple as:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="">var</span> (challenge, verifier) = Pkce.Generate();
</span></span></code></pre></div><p>In ASP.NET Core you don&rsquo;t usually need to mess with PKCE as the framework
supports it very transparently, but the project I&rsquo;m working on right now is bare
and to the bones, with no ASP.NET Core in sight, so I had to bring my own
implementation. Fun stuff.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Guillermo del Toro</title>
      <link>https://nicolaiarocci.com/quoting-guillermo-del-toro/</link>
      <pubDate>Mon, 15 Jan 2024 08:40:38 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-guillermo-del-toro/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The structure [&lt;em&gt;of most Miyazaki&amp;rsquo;s works&lt;/em&gt;] is not bound by the western-culture Aristotelean three act setup, conflict, pay-off, and resolution&amp;hellip; its about showing you the sweet and sour of life. The loss and the love and the beauty all at the same time.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.youtube.com/watch?v=6gQTZMG-sZg&#34;&gt;Guillermo del Toro&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For more context, see: &lt;em&gt;&lt;a href=&#34;https://nicolaiarocci.com/movie-review-the-boy-and-the-heron/&#34;&gt;Move review: The Boy and the Heron&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The structure [<em>of most Miyazaki&rsquo;s works</em>] is not bound by the western-culture Aristotelean three act setup, conflict, pay-off, and resolution&hellip; its about showing you the sweet and sour of life. The loss and the love and the beauty all at the same time.</p></blockquote>
<p>&ndash; <a href="https://www.youtube.com/watch?v=6gQTZMG-sZg">Guillermo del Toro</a></p>
<p>For more context, see: <em><a href="/movie-review-the-boy-and-the-heron/">Move review: The Boy and the Heron</a></em>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>NTS Radio</title>
      <link>https://nicolaiarocci.com/nts-radio/</link>
      <pubDate>Sat, 13 Jan 2024 10:53:40 +0100</pubDate>
      <guid>https://nicolaiarocci.com/nts-radio/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;NTS Radio is a family of like-minded and passionate individuals, dedicated to
supporting exciting music and culture through online radio and events. NTS
uncovers the best of the musical past, celebrates the present and cultivates the
future of the underground music scene, and prides itself on being open-minded
and experimental. &lt;em&gt;(&lt;a href=&#34;https://en.wikipedia.org/wiki/NTS_Radio&#34;&gt;source&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m certainly a latecomer, but &lt;a href=&#34;https://www.nts.live&#34;&gt;NTS Radio&lt;/a&gt; is the bomb. I
have not opened Spotify (whose algorithm I find dull and repetitive) in the last
week, not even once. I go straight to NTS to find the best and most diverse
music from all genres, played by DJs and independent radio stations worldwide.
Absolute banger.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>NTS Radio is a family of like-minded and passionate individuals, dedicated to
supporting exciting music and culture through online radio and events. NTS
uncovers the best of the musical past, celebrates the present and cultivates the
future of the underground music scene, and prides itself on being open-minded
and experimental. <em>(<a href="https://en.wikipedia.org/wiki/NTS_Radio">source</a>)</em></p></blockquote>
<p>I&rsquo;m certainly a latecomer, but <a href="https://www.nts.live">NTS Radio</a> is the bomb. I
have not opened Spotify (whose algorithm I find dull and repetitive) in the last
week, not even once. I go straight to NTS to find the best and most diverse
music from all genres, played by DJs and independent radio stations worldwide.
Absolute banger.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fabio the tramp</title>
      <link>https://nicolaiarocci.com/fabio-the-tramp/</link>
      <pubDate>Fri, 12 Jan 2024 15:53:46 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fabio-the-tramp/</guid>
      <description>&lt;p&gt;Last night, I was preparing dinner while waiting for Serena to return home when
I received an unexpected call from her: she was in her parked car, petrified as
the car&amp;rsquo;s headlights had illuminated a person lying on the floor of our
building&amp;rsquo;s entrance, right in front of the elevator&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;. I told her to stay in the
car and rushed down the stairs. When I got to the ground floor, no one was
there; I checked the basement, and it was empty, too. On my way back, I found
Serena entering from the front door. She told me the person had quickly risen
and walked away when the lights turned on in the staircase.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last night, I was preparing dinner while waiting for Serena to return home when
I received an unexpected call from her: she was in her parked car, petrified as
the car&rsquo;s headlights had illuminated a person lying on the floor of our
building&rsquo;s entrance, right in front of the elevator<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I told her to stay in the
car and rushed down the stairs. When I got to the ground floor, no one was
there; I checked the basement, and it was empty, too. On my way back, I found
Serena entering from the front door. She told me the person had quickly risen
and walked away when the lights turned on in the staircase.</p>
<p>I took a few steps outside and saw an aged, bald man on the porch, more or less
twenty meters away. He was standing still, looking back at me. He had nothing
going on, no jacket, scarf, or cap, just a sweater, cargo pants with summer
shorts on top, canvas shoes, and half gloves, and that was it. It must have been
0 or 1 degree Celsius. It was so cold. Since he wasn&rsquo;t fleeing, I approached him
and asked if everything was okay and if he needed any help<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. He nodded and said,
&ldquo;Yes.&rdquo; That broke my heart.</p>
<p>He then told me, &ldquo;My teeth hurt&rdquo;. From what I could see, he was utterly
toothless. I asked if he had entered the building looking for warmth, and he
nodded again. I told him we could get him something warm, and then, if he
allowed us, we would call for help. &ldquo;Yes, he again answered. I told him to wait
a few minutes, and then we went to our apartment to get an old jacket, an
oversized, warm scarf and a woolen cap. &ldquo;He must have run away by now,&rdquo; I
thought as I went down with everything tucked under my arm, but when the
elevator door opened, I found he had made his way into the building again and
was waiting for me. I helped him wear the jacket and wrap his scarf around his
neck. As I called for an ambulance, he laid down again on the floor; all
gathered up to keep what little warmth the new clothes could give within.</p>
<p>We waited about 20 minutes. The ambulance driver made him get up abruptly,
pulling him by the arm and scolding him because &ldquo;you don&rsquo;t go into buildings;
it&rsquo;s forbidden.&rdquo; The nurse wanted to return our clothes because &ldquo;we have
blankets&rdquo;; it took a while to explain that we didn&rsquo;t want them back and that he
would need them the following day anyway when he inevitably ended up back on the
street.</p>
<p>His name is Fabio, and he is 60 years old.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The return spring of the building&rsquo;s front door has been broken for some time. As a result, the door only closes if accompanied, and no one does.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Silly questions. I wanted to be reassuring, and I couldn&rsquo;t develop anything better.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The strage story of the grave of Copernicus</title>
      <link>https://nicolaiarocci.com/the-strage-story-of-the-grave-of-copernicus/</link>
      <pubDate>Wed, 10 Jan 2024 18:16:18 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-strage-story-of-the-grave-of-copernicus/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Upon his death in 1543 in Frombork, Poland, Copernicus was buried in the local
cathedral. Over the subsequent centuries, the location of his grave was lost to
history. There were several unsuccessful attempts to locate Copernicus’s
remains, dating as far back as the 16th and 17th centuries. Another failed
attempt was made by the French emperor Napoleon after the 1807 Battle of Eylau.
Napoleon held Copernicus in high regard as a polymath, mathematician and
astronomer. In 2005, a group of Polish archaeologists took up the search.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Upon his death in 1543 in Frombork, Poland, Copernicus was buried in the local
cathedral. Over the subsequent centuries, the location of his grave was lost to
history. There were several unsuccessful attempts to locate Copernicus’s
remains, dating as far back as the 16th and 17th centuries. Another failed
attempt was made by the French emperor Napoleon after the 1807 Battle of Eylau.
Napoleon held Copernicus in high regard as a polymath, mathematician and
astronomer. In 2005, a group of Polish archaeologists took up the search.</p></blockquote>
<p>More <a href="https://theconversation.com/the-strange-story-of-the-grave-of-copernicus-213358">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>pg_rman: a backup and restore management tool for PostgreSQL</title>
      <link>https://nicolaiarocci.com/pg_rman-a-backup-and-restore-management-tool-for-postgresql/</link>
      <pubDate>Tue, 09 Jan 2024 09:19:48 +0100</pubDate>
      <guid>https://nicolaiarocci.com/pg_rman-a-backup-and-restore-management-tool-for-postgresql/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The goal of the pg_rman project is to provide a method for online backup and
PITR that is as easy as pg_dump. Also, it maintains a backup catalog per
database cluster. Users can maintain old backups including archive logs with one
command.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;We&amp;rsquo;ve always been doing our Postgres backups the rudimentary way via
&lt;code&gt;pg_dumpall&lt;/code&gt;, which works and is purely logical (one can restore across different
Postgres versions), but &lt;code&gt;pg_rman&lt;/code&gt; maintains a catalog and has point-in-time
recovery.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The goal of the pg_rman project is to provide a method for online backup and
PITR that is as easy as pg_dump. Also, it maintains a backup catalog per
database cluster. Users can maintain old backups including archive logs with one
command.</p></blockquote>
<p>We&rsquo;ve always been doing our Postgres backups the rudimentary way via
<code>pg_dumpall</code>, which works and is purely logical (one can restore across different
Postgres versions), but <code>pg_rman</code> maintains a catalog and has point-in-time
recovery.</p>
<p>I might want to <a href="https://github.com/ossc-db/pg_rman">look into it</a> at some point.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica for .NET v3.4.13</title>
      <link>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.4.13/</link>
      <pubDate>Mon, 08 Jan 2024 14:57:59 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.4.13/</guid>
      <description>&lt;p&gt;Today I released &lt;a href=&#34;https://fatturaelettronicaopensource.org/docs&#34;&gt;Fattura Elettronica for .NET&lt;/a&gt; v3.4.13. The Fattura
Elettronica project allows for the validation and de/serialization of electronic
invoices that adhere to the standard defined by Italian Revenue Agency
(&lt;a href=&#34;https://www.agenziaentrate.gov.it/portale/web/guest/specifiche-tecniche-versione-1.8&#34;&gt;Agenzia Entrate&lt;/a&gt;). See the &lt;a href=&#34;https://fatturaelettronicaopensource.org/docs/changelog.html#v-3413&#34;&gt;changelog&lt;/a&gt; for details (Italian).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released <a href="https://fatturaelettronicaopensource.org/docs">Fattura Elettronica for .NET</a> v3.4.13. The Fattura
Elettronica project allows for the validation and de/serialization of electronic
invoices that adhere to the standard defined by Italian Revenue Agency
(<a href="https://www.agenziaentrate.gov.it/portale/web/guest/specifiche-tecniche-versione-1.8">Agenzia Entrate</a>). See the <a href="https://fatturaelettronicaopensource.org/docs/changelog.html#v-3413">changelog</a> for details (Italian).</p>
]]></content:encoded>
    </item>
    <item>
      <title>Movie review: The Boy and the Heron</title>
      <link>https://nicolaiarocci.com/movie-review-the-boy-and-the-heron/</link>
      <pubDate>Sun, 07 Jan 2024 16:15:10 +0100</pubDate>
      <guid>https://nicolaiarocci.com/movie-review-the-boy-and-the-heron/</guid>
      <description>&lt;p&gt;We watched Hayao Miyazaki&amp;rsquo;s &lt;em&gt;The Boy and the Heron&lt;/em&gt; yesterday at the theatre,
and I liked it. The official plot goes like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A young boy named Mahito yearning for his mother ventures into a world shared
by the living and the dead. There, death comes to an end, and life finds a new
beginning.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Unsurprisingly, the animation is stunning, and the complex story is beautifully
narrated. Mahito Maki, the protagonist, is a kid grappling with inner conflicts
and insecurities who recently lost his beloved mother in a dramatic accident.
The fantastic and very &amp;ldquo;Miyazakiest&amp;rdquo; events that unfold once he and his father
reach his mother&amp;rsquo;s family&amp;rsquo;s rural residence will help him cope with his loss.
This movie&amp;rsquo;s central themes are dealing with strife and loss, letting go of
selfishness, and embracing living for and with others. As is often the case with
Miyazaki, while the protagonist is a kid (and a young audience may appreciate
the content, possibly on a more superficial level), the target audience is
adults.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We watched Hayao Miyazaki&rsquo;s <em>The Boy and the Heron</em> yesterday at the theatre,
and I liked it. The official plot goes like this:</p>
<blockquote>
<p>A young boy named Mahito yearning for his mother ventures into a world shared
by the living and the dead. There, death comes to an end, and life finds a new
beginning.</p></blockquote>
<p>Unsurprisingly, the animation is stunning, and the complex story is beautifully
narrated. Mahito Maki, the protagonist, is a kid grappling with inner conflicts
and insecurities who recently lost his beloved mother in a dramatic accident.
The fantastic and very &ldquo;Miyazakiest&rdquo; events that unfold once he and his father
reach his mother&rsquo;s family&rsquo;s rural residence will help him cope with his loss.
This movie&rsquo;s central themes are dealing with strife and loss, letting go of
selfishness, and embracing living for and with others. As is often the case with
Miyazaki, while the protagonist is a kid (and a young audience may appreciate
the content, possibly on a more superficial level), the target audience is
adults.</p>
<p>I read that <em>The Boy and the Heron</em> has autobiographical features. Like Mahito,
Miyazaki lost his mother as a kid and was forced to evacuate from the city to
the countryside during the war. His works commonly find children leaving the
city for the rural areas, only to meet the magic and fantastic once they get
there. I cannot help but draw a parallel with J.R.R. Tolkien, who devoted much
of his youth exploring the outskirts of Birmingham with his brother Hillary.
That &ldquo;kind of lost paradise&rdquo; and the rural people who inhabited it were
instrumental in inspiring the Hobbits and Hobbiton&hellip; but I&rsquo;m getting off-topic.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Some hints about what the next year of AI looks like</title>
      <link>https://nicolaiarocci.com/some-hints-about-what-the-next-year-of-ai-looks-like/</link>
      <pubDate>Sun, 07 Jan 2024 10:57:43 +0100</pubDate>
      <guid>https://nicolaiarocci.com/some-hints-about-what-the-next-year-of-ai-looks-like/</guid>
      <description>&lt;p&gt;Professor Ethan Mollick&amp;rsquo;s &lt;a href=&#34;https://www.oneusefulthing.org/p/signs-and-portents&#34;&gt;Signs and
Portents&lt;/a&gt; analyzes what AI
has achieved, what the effects have been so far, and what we might expect in
2024.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To ground ourselves, we can start with two quotes that should inform any
estimates about the future. The first is Amara&amp;rsquo;s Law: &amp;ldquo;We tend to overestimate
the effect of a technology in the short run and underestimate the effect in the
long run.&amp;rdquo; Social change is slower than technological change. We should not
expect to see immediate global effects of AI in a major way, no matter how fast
its adoption (and it is remarkably fast), yet we certainly will see it sooner
than many people think.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Professor Ethan Mollick&rsquo;s <a href="https://www.oneusefulthing.org/p/signs-and-portents">Signs and
Portents</a> analyzes what AI
has achieved, what the effects have been so far, and what we might expect in
2024.</p>
<blockquote>
<p>To ground ourselves, we can start with two quotes that should inform any
estimates about the future. The first is Amara&rsquo;s Law: &ldquo;We tend to overestimate
the effect of a technology in the short run and underestimate the effect in the
long run.&rdquo; Social change is slower than technological change. We should not
expect to see immediate global effects of AI in a major way, no matter how fast
its adoption (and it is remarkably fast), yet we certainly will see it sooner
than many people think.</p></blockquote>
<p>It&rsquo;s an insightful read that pairs well with Simon Wilson&rsquo;s <a href="/stuff-we-figured-out-about-ai-in-2023/">2023
round-up</a>. Also, his 30-second fake
video of himself telling things he never told is impressive.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to use bash to recursively search and replace a string in all directory files</title>
      <link>https://nicolaiarocci.com/how-to-use-bash-to-recursively-search-and-replace-a-string-in-all-directory-files/</link>
      <pubDate>Sat, 06 Jan 2024 09:34:16 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-use-bash-to-recursively-search-and-replace-a-string-in-all-directory-files/</guid>
      <description>&lt;p&gt;Another achievement I unlocked with the &lt;a href=&#34;https://nicolaiarocci.com/new-website-finally-with-no-analytics/&#34;&gt;recent website
update&lt;/a&gt; is the newsletter switch from Substack to
a fantastic and independent provider,
&lt;a href=&#34;https://buttondown.email/refer/nicolaiarocci&#34;&gt;Buttondown&lt;/a&gt;. That required
updating all the &amp;ldquo;subscribe to my newsletter&amp;rdquo; links. We&amp;rsquo;re talking 5K posts, all
saved as individual files in the same directory. The bash command that did that
for me is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-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;find content/post/*.md -type f -exec &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&lt;/span&gt;    sed -i .bak &lt;span style=&#34;font-style:italic&#34;&gt;&amp;#39;s|https://nicolaiarocci.substack.com|https://buttondown.email/nicolaiarocci|g&amp;#39;&lt;/span&gt; {} +
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is pretty straightforward. &lt;code&gt;find&lt;/code&gt; looks for all markdown files in the
&lt;code&gt;content/post/&lt;/code&gt; directory. On each file, &lt;code&gt;sed&lt;/code&gt; performs a search-and-replace
action. Notice that I use &lt;code&gt;|&lt;/code&gt; instead of the standard &lt;code&gt;/&lt;/code&gt; as a separator for the
search-and-replace pattern , and that&amp;rsquo;s because the pattern itself has &lt;code&gt;/&lt;/code&gt;s in
the URLs so I need to differentiate. Also, on macOS, the &lt;code&gt;-i&lt;/code&gt; parameter requires
a backup file argument (&amp;quot;*.bak&amp;quot;) to make a backup copy before the update. This
argument is unnecessary in newer sed versions and will perform an in-place
update if not provided.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Another achievement I unlocked with the <a href="/new-website-finally-with-no-analytics/">recent website
update</a> is the newsletter switch from Substack to
a fantastic and independent provider,
<a href="https://buttondown.email/refer/nicolaiarocci">Buttondown</a>. That required
updating all the &ldquo;subscribe to my newsletter&rdquo; links. We&rsquo;re talking 5K posts, all
saved as individual files in the same directory. The bash command that did that
for me is:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>find content/post/*.md -type f -exec <span style="font-weight:bold;font-style:italic">\
</span></span></span><span style="display:flex;"><span><span style="font-weight:bold;font-style:italic"></span>    sed -i .bak <span style="font-style:italic">&#39;s|https://nicolaiarocci.substack.com|https://buttondown.email/nicolaiarocci|g&#39;</span> {} +
</span></span></code></pre></div><p>It is pretty straightforward. <code>find</code> looks for all markdown files in the
<code>content/post/</code> directory. On each file, <code>sed</code> performs a search-and-replace
action. Notice that I use <code>|</code> instead of the standard <code>/</code> as a separator for the
search-and-replace pattern , and that&rsquo;s because the pattern itself has <code>/</code>s in
the URLs so I need to differentiate. Also, on macOS, the <code>-i</code> parameter requires
a backup file argument (&quot;*.bak&quot;) to make a backup copy before the update. This
argument is unnecessary in newer sed versions and will perform an in-place
update if not provided.</p>
<p>Later, I realized I would be better off if I removed the call to action from my
posts and added it to the footer template instead. That way, I&rsquo;d only have one
place to edit or update it in the future, and my RSS feed (and newsletter
updates,  as they draw from the RSS feed) would be clean of unnecessary spam. In
hindsight, this a move I could&rsquo;ve made many years ago (2010?) when I installed
Hugo for the first time, but hey, better late than never. But how could I delete
calls to action from all my 5K posts? With a variation of the above command, of
course:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>find content/post/*.md -type f -exec sed -i .bak <span style="">&#39;</span>/
</span></span></code></pre></div><p>It is the same logic as above, but we&rsquo;re replacing the matched string with a
&ldquo;delete all lines till the end of the file&rdquo; pattern this time. I must admit that
this one was trickier to pull off and required a discrete amount of trial and
error.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Jason Fried</title>
      <link>https://nicolaiarocci.com/quoting-jason-fried/</link>
      <pubDate>Fri, 05 Jan 2024 12:08:08 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-jason-fried/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I have to say, I&amp;rsquo;ve found no greater professional joy than working with a tight group of people to ship and support our own products. And for those products to find people willing to trade their own hard earned treasure for a little bit of ours.  Betting on an idea — and seeing it through — is enormously fulfilling. The creative and intellectual stimulation is beyond compare. Especially when you&amp;rsquo;re the first customer for anything you make.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I have to say, I&rsquo;ve found no greater professional joy than working with a tight group of people to ship and support our own products. And for those products to find people willing to trade their own hard earned treasure for a little bit of ours.  Betting on an idea — and seeing it through — is enormously fulfilling. The creative and intellectual stimulation is beyond compare. Especially when you&rsquo;re the first customer for anything you make.</p></blockquote>
<p>&ndash; <a href="https://twitter.com/jasonfried/status/1742701289316942131">Jason Fried</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>New website, finally with no analytics</title>
      <link>https://nicolaiarocci.com/new-website-finally-with-no-analytics/</link>
      <pubDate>Wed, 03 Jan 2024 14:27:38 +0100</pubDate>
      <guid>https://nicolaiarocci.com/new-website-finally-with-no-analytics/</guid>
      <description>&lt;p&gt;During the Christmas/New Year break, I achieved my goal of updating my website
with a new theme. I loved
&lt;a href=&#34;https://github.com/vjeantet/hugo-theme-casper&#34;&gt;Casper&lt;/a&gt;, the previous one I ran
for a very long time, but it has not been updated in years and looks abandoned.
I wanted new features like &lt;a href=&#34;https://nicolaiarocci.com/search/&#34;&gt;fuzzy search&lt;/a&gt;, &lt;a href=&#34;https://nicolaiarocci.com/archives/&#34;&gt;archive&lt;/a&gt; and
&lt;a href=&#34;https://nicolaiarocci.com/tags/&#34;&gt;tags&lt;/a&gt; pages, &lt;a href=&#34;https://nicolaiarocci.com/the-wilderness-of-poggio-montironi/&#34;&gt;cover images&lt;/a&gt;,
&lt;a href=&#34;https://nicolaiarocci.com/books-i-have-read/&#34;&gt;table of contents&lt;/a&gt;, title anchors, and more. Also, the
old theme kept me anchored to an ancient Hugo version, something I felt
uncomfortable with. There are still a few loose parts, but I&amp;rsquo;m confident I made
the right call by switching to &lt;a href=&#34;https://github.com/adityatelange/hugo-PaperMod&#34;&gt;PaperMod&lt;/a&gt;; it offers all the
needed features (and plenty more), and it&amp;rsquo;s frequently updated, which allows me
to &lt;a href=&#34;https://github.com/adityatelange/hugo-PaperMod/issues/1367&#34;&gt;open tickets&lt;/a&gt;
and offer improvements confidently.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>During the Christmas/New Year break, I achieved my goal of updating my website
with a new theme. I loved
<a href="https://github.com/vjeantet/hugo-theme-casper">Casper</a>, the previous one I ran
for a very long time, but it has not been updated in years and looks abandoned.
I wanted new features like <a href="/search/">fuzzy search</a>, <a href="/archives/">archive</a> and
<a href="/tags/">tags</a> pages, <a href="/the-wilderness-of-poggio-montironi/">cover images</a>,
<a href="/books-i-have-read/">table of contents</a>, title anchors, and more. Also, the
old theme kept me anchored to an ancient Hugo version, something I felt
uncomfortable with. There are still a few loose parts, but I&rsquo;m confident I made
the right call by switching to <a href="https://github.com/adityatelange/hugo-PaperMod">PaperMod</a>; it offers all the
needed features (and plenty more), and it&rsquo;s frequently updated, which allows me
to <a href="https://github.com/adityatelange/hugo-PaperMod/issues/1367">open tickets</a>
and offer improvements confidently.</p>
<p>I also dropped web analytics. I&rsquo;ve not counted visits or any other metric for
years; I realized I&rsquo;m not interested and certainly don&rsquo;t need metrics for
motivation. I happen to hate Google Analytics UX so much that I always wanted to
replace it, but never got around to doing that. Besides, from my small
experiments, web metrics are unreliable. Just today, Manuel Moreale&rsquo;s <a href="https://manuelmoreale.com/answers-to-my-analytics-inquiry">little
analytics experiment</a>
surfaced on my RSS reader:</p>
<blockquote>
<p>[&hellip;] we were discussing the discrepancy between log numbers and the ones
coming out of the various analytics platforms and were noticing how they all
spit out different data. Which to me makes no sense. Still, it&rsquo;s an interesting
topic and I decided to run a little experiment to gather more info on the
subject.</p></blockquote>
<p>His article is worth reading. He ran four different GA-alternative analytics
platforms on his website for a short period and obtained unpredictable and
differentiated results. His conclusions corroborate my impression: trust web
analytics sparingly, if at all.  They might make sense on professional websites
(and I&rsquo;d like to argue against that, too, but maybe in another post), but for
blogs? They do not serve any useful purpose other than slowing down the whole
thing.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Christine Lemmer-Webber</title>
      <link>https://nicolaiarocci.com/quoting-christine-lemmer-webber/</link>
      <pubDate>Tue, 02 Jan 2024 12:07:53 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-christine-lemmer-webber/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Bring back self-hosted blogs, reinstall a feed reader, make your feed icon prominent on your blog.  Blogs + Atom/RSS is the best decentralized social media system we&amp;rsquo;ve ever had!  And yes I am saying that as co-author of ActivityPub: self hosted blogs is the best decentralized social networking we&amp;rsquo;ve had.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://octodon.social/@cwebber/111647596861000656&#34;&gt;Christine Lemmer-Webber&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Bring back self-hosted blogs, reinstall a feed reader, make your feed icon prominent on your blog.  Blogs + Atom/RSS is the best decentralized social media system we&rsquo;ve ever had!  And yes I am saying that as co-author of ActivityPub: self hosted blogs is the best decentralized social networking we&rsquo;ve had.</p></blockquote>
<p>&ndash; <a href="https://octodon.social/@cwebber/111647596861000656">Christine Lemmer-Webber</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Stuff we figured out about AI in 2023</title>
      <link>https://nicolaiarocci.com/stuff-we-figured-out-about-ai-in-2023/</link>
      <pubDate>Mon, 01 Jan 2024 11:46:22 +0100</pubDate>
      <guid>https://nicolaiarocci.com/stuff-we-figured-out-about-ai-in-2023/</guid>
      <description>&lt;p&gt;Simon Wilson, who&amp;rsquo;s recently been my go-to person for all AI-related stuff, has
an excellent &lt;a href=&#34;https://simonwillison.net/2023/Dec/31/ai-in-2023/&#34;&gt;2023 AI
round-up&lt;/a&gt; on his website.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2023 was the breakthrough year for Large Language Models (LLMs). I think it&amp;rsquo;s
OK to call these AI—they&amp;rsquo;re the latest and (currently) most &amp;ldquo;interesting
development in the academic field of Artificial Intelligence that dates back to
the 1950s. Here&amp;rsquo;s my attempt to round up the highlights in one place!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The links contained within the post are also valuable. You may know Simon&amp;rsquo;s
website if you are interested in LLMs and AI. If you don&amp;rsquo;t, I suggest you start
following him, preferably via his RSS feed like real hackers do.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Simon Wilson, who&rsquo;s recently been my go-to person for all AI-related stuff, has
an excellent <a href="https://simonwillison.net/2023/Dec/31/ai-in-2023/">2023 AI
round-up</a> on his website.</p>
<blockquote>
<p>2023 was the breakthrough year for Large Language Models (LLMs). I think it&rsquo;s
OK to call these AI—they&rsquo;re the latest and (currently) most &ldquo;interesting
development in the academic field of Artificial Intelligence that dates back to
the 1950s. Here&rsquo;s my attempt to round up the highlights in one place!</p></blockquote>
<p>The links contained within the post are also valuable. You may know Simon&rsquo;s
website if you are interested in LLMs and AI. If you don&rsquo;t, I suggest you start
following him, preferably via his RSS feed like real hackers do.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Movie review: The Vast of the Night</title>
      <link>https://nicolaiarocci.com/movie-review-the-vast-of-the-night/</link>
      <pubDate>Sat, 30 Dec 2023 10:08:07 +0100</pubDate>
      <guid>https://nicolaiarocci.com/movie-review-the-vast-of-the-night/</guid>
      <description>&lt;p&gt;Yesterday evening, we watched &lt;em&gt;The Vast of the Night&lt;/em&gt;, and what a pleasant
surprise it was.&lt;/p&gt;
&lt;p&gt;One night, in a small New Mexico town, a girl who works at a local radio station
and an older reporter boy listen to a recording of some strange noises. Through
the radio and its listeners, throughout a single night, they uncover a series of
sighting stories that, from clue to clue and radio testimony to radio testimony,
bring them close to uncovering something big.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday evening, we watched <em>The Vast of the Night</em>, and what a pleasant
surprise it was.</p>
<p>One night, in a small New Mexico town, a girl who works at a local radio station
and an older reporter boy listen to a recording of some strange noises. Through
the radio and its listeners, throughout a single night, they uncover a series of
sighting stories that, from clue to clue and radio testimony to radio testimony,
bring them close to uncovering something big.</p>
<p>It has a distinctive retro soundtrack, and its beauty is the pleasure of the
stories told. At the center of everything always remains the mystery the two
protagonists try to investigate in one night, approaching the truth from
testimony to testimony. A good part of the film lies in the classic elements of
science fiction, namely the discovery (perhaps) of something from another
planet; another part, however, is the creation of the overwhelming sense of
excitement of two people from a small provincial town who increasingly feel they
are part of something important.</p>
<p>The photography, lighting, and camerawork are stellar:</p>
<blockquote>
<p>At the midpoint, Patterson wows with a tracking shot that seems to race a
half-mile down a quiet street, take a left-hook through a parking lot, sprint
through an ongoing basketball game, and zip up the crowded bleachers before
plunging out of a window. It&rsquo;s effective razzle-dazzle that will probably get
the young Oklahoman hired to make something 20 times The Vast of Night&rsquo;s budget.
Yet, the ambition behind it is just as impressive – as is the crew&rsquo;s creativity
at spinning financial limitations into magic.&quot; <br>
&ndash;Amy Nicholson, <a href="https://variety.com/2019/film/reviews/the-vast-of-night-review-1203335505/">Variety</a>.</p></blockquote>
<p>&ldquo;The Vast of the Night&rdquo; is a small, independent, character-driven debut film that
perfectly captures America&rsquo;s province life in the 50s and cleverly leverages
those atmospheres. Inventive and charming, it is also a homage to The Twilight
Zone, The War Of The Worlds (the radio station name is WOTW), and others.</p>
<p>Serena found it slow, especially at the beginning. I can understand that: the
first twenty minutes are a long walk-and-talk between the two protagonists, but
oh boy, look the world-building (and camera work) happening right there!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Books I read in 2023</title>
      <link>https://nicolaiarocci.com/books-i-read-in-2023/</link>
      <pubDate>Fri, 29 Dec 2023 15:51:02 +0100</pubDate>
      <guid>https://nicolaiarocci.com/books-i-read-in-2023/</guid>
      <description>&lt;p&gt;I read 24 books for a total of 7070 pages in 2023. That&amp;rsquo;s seven more books than
last year, which is quite an outstanding result considering the seemingly
unstoppable decline in book reading &lt;a href=&#34;https://nicolaiarocci.com/my-favorite-books-of-2022/&#34;&gt;I have suffered in recent
years&lt;/a&gt;. Most have been fiction books, and that&amp;rsquo;s
something new and influential with the final result, as I tend to read
non-fiction more slowly. The bad news is that I did not review most of the books
I read this year, and that sucks. The last review was in August, a &lt;a href=&#34;https://nicolaiarocci.com/a-few-late-book-reviews/&#34;&gt;catch-up
review of several books&lt;/a&gt; clearly showing I was in
trouble.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I read 24 books for a total of 7070 pages in 2023. That&rsquo;s seven more books than
last year, which is quite an outstanding result considering the seemingly
unstoppable decline in book reading <a href="/my-favorite-books-of-2022/">I have suffered in recent
years</a>. Most have been fiction books, and that&rsquo;s
something new and influential with the final result, as I tend to read
non-fiction more slowly. The bad news is that I did not review most of the books
I read this year, and that sucks. The last review was in August, a <a href="/a-few-late-book-reviews/">catch-up
review of several books</a> clearly showing I was in
trouble.</p>
<p>Inspired by <a href="https://adactio.com/journal/20740">Adactio</a>, I am considering a
different, less demanding approach.  Instead of one review for every book, I may
post one general review at the end of the year. I plan to start the article with
the first book of the year, keep it as a draft, update it with every new book I
read, and publish it by the end of the year. Individual notes should be short,
one or two paragraphs at most, maybe with a rating. This solution would reduce
the number of book-related posts, also benefitting, I suspect, most of my
readers. Also, this allows me to leverage a couple of new features on my
website: the table of contents and active title links (which I can then use in
my <a href="/books-i-have-read/">library</a> page).</p>
<p>I might as well adopt Adactio&rsquo;s scoring system:</p>
<ul>
<li>One star means a book is meh.</li>
<li>Two stars mean a book is perfectly fine.</li>
<li>Three stars mean a book is good—consider it recommended.</li>
<li>Four stars mean a book is exceptional.</li>
<li>Five stars is pretty much unheard of.</li>
</ul>
<p>Most ratings would fall in the two- to three-star range.</p>
<p>I&rsquo;m starting this year. When a previously posted, more detailed review is
available, I&rsquo;ll link it, and only repost the first paragrafe in this page.</p>
<h3 id="the-sorrows-of-young-werther-by-jw-von-goethe">The sorrows of young Werther, by J.W. von Goethe</h3>
<p><em>(I dolori del giovane Werther, Einaudi, traduzione di E. Ganni)</em></p>
<p>★★★☆☆</p>
<p><em>&ldquo;The first Dandy in European literature, Werther ignited the sensibilities of an
entire generation, that of the Sturm und Drang, which made him a timeless hero
of the rebellious culture that prefers the intensity of feeling to the aridity
of reason&rdquo;.</em> To modern eyes, the reading is sometimes disturbing, preconfiguring
Werther as the prototype of today&rsquo;s stalker (he goes so far as to consider the
suppression of the now unattainable love). Still, one has to refrain from
judging a text out of the context and period in which it was written. The
writing is superb, fluent, and accessible for a text published in 1774—Enrico
Ganni&rsquo;s Italian translation is excellent.</p>
<h3 id="happiness-as-such-by-natalia-ginzburg">Happiness, as such by Natalia Ginzburg</h3>
<p><em>(Caro Michele, Einaudi)</em></p>
<p>★★★☆☆</p>
<p>A mother already advanced in years but still young, and a son physically distant
and even more distant in ideas, needs, affections, and sorrows. A son for whom
the mother resents but from whom she cannot detach herself, and the last,
unbreakable umbilical cord is made of letters alone. It is a novel of many
scattered characters, divided by incommunicability and destined for loneliness.
I was struck by the precise description of society and culture in the early
1970s (the novel was published in 1973) and the non-trivial (for the time) theme
of homosexuality, treated effectively.</p>
<h3 id="the-ancient-hours-by-michael-bible">The ancient hours, by Michael Bible</h3>
<p><em>(L&rsquo;ultima cosa bella sulla faccia delle terra, Adelphi)</em></p>
<p>★★★★☆</p>
<p>A few troubled characters move through the area south of the Appalachians, one
of America&rsquo;s poorest and most religious (evangelical) areas. Though tormented,
the characters refuse to admit their defeats. They seek redemption in love in
memory and drugs, trying to bridge frailties and family conflicts, coming to
terms with God&rsquo;s cumbersome presence, and accompanied by the feeling that they
are moving forward but can only look backward. There is much poetry and
poignancy in this beautiful and passionate tale. Micheal Bible is a talented
writer who knows the places, culture and society he narrates, and it shows.</p>
<h3 id="milano-calibro-9-by-giorgio-scerbanenco">Milano calibro 9, by Giorgio Scerbanenco</h3>
<p><em>(La nave di Teseo)</em></p>
<p>★★☆☆☆</p>
<p>A collection of twenty-two noir tales about the ruthless Milan of the 1960s: the
sacred triad of crime, sex, money, and power is present on every page. The
characters in these tales are driven by aching and losing loves, vices and
addictions, or fatal sexual attractions. The stories were originally published
in weekly magazines that were then in vogue, first and foremost Novella 2000, of
which Scerbanenco was a longtime editor. At the time, Novella 2000 was not the
tabloid magazine we know today but a popular literature magazine (hence the
name). Only some of the stories are captivating; some are not well written, and
noir is not a genre that interests me, but I got this book to understand the
literary Milan of those times better, and I got what I wanted.</p>
<h3 id="ferrovie-del-messico-by-gian-marco-griffi">Ferrovie del messico, by Gian Marco Griffi</h3>
<p><em>(Laurana)</em></p>
<p>★★★★☆</p>
<p>If you are looking for adventure, you will find plenty and taste great
literature with this novel. There are so many characters to follow between Asti,
Italian Social Republic, February 1944 and then up and down the railroads of
Mexico between the 1920s and 1930s, all rich and exciting, never flat or
predictable, masterfully orchestrated by an author who manages to keep the
events narrated in perfect balance between comedy and tragedy, never dull
despite the length (824 pages). Gian Marco Griffi is the best modern Italian author I
discovered this year.</p>
<h3 id="adhd-workbook-for-adults-by-tara-wilson">ADHD workbook for adults, by Tara Wilson</h3>
<p><em>(ADHD negli adulti, independently published)</em></p>
<p>★★☆☆☆</p>
<p>A relative of mine was recently diagnosed with ADHD and this short introductory
book allowed me to learn more about it. I didn&rsquo;t find it particularly
enlightening (much of what it contains can be found online), nor is the author
particularly titled to talk about it (she is a professional coach), but perhaps
because of this the content remains simple, and serve its purpose.</p>
<h3 id="high-by-erica-fatland">High, by Erica Fatland</h3>
<p><em>(La vita in alto. Una stagione sull&rsquo;Himalaya, Marisilio)</em></p>
<p>★★★☆☆</p>
<p>Himalayan fiction has accustomed us to stories of climbers tackling Everest and
travelers seeking spiritual experiences in Buddhist monasteries. But what do we
know about the people living in that region? Erica Flatland tells of the
peoples, cultures, and societies that have inhabited the high areas in the
Himalayas since time immemorial, and to do so, she takes a long, slow journey
through these remote areas, encountering characters and places full of stories
to discover. High is an excellent reportage that I thoroughly enjoyed.</p>
<h3 id="codice-jury-by-jury-chechi">Codice Jury, by Jury Chechi</h3>
<p><em>(Longanesi)</em></p>
<p>★★☆☆☆</p>
<p>Jury Chechi won the Olympic title in the rings at Atlanta in 1996 and was third
at Athens in 2004. Chechi&rsquo;s bronze resulted from his attempted comeback into the
sport at 35, well above the average age of a male gymnast. Even at 54 (his
current age), he&rsquo;s astoundingly in shape. He&rsquo;s one of my idols. The news that he
authored a book on calisthenics primarily dedicated to older adults couldn&rsquo;t be
ignored by me. I recommend this work if you&rsquo;re starting and looking for
guidance, motivation, and solid routines, not so much for the expert.</p>
<h3 id="the-passenger-by-cormac-mccarthy">The Passenger, by Cormac McCarthy</h3>
<p><em>(Einaudi)</em></p>
<p>★★★★☆</p>
<p>In the middle of a cold night in 1980, Bobby Western dons his wetsuit and dives
into the black depths of Mississippi Bay. There, he catches sight of the outline
of a plane with nine bodies in the cabin, their eyes empty and their arms
outstretched in an icy embrace. What happened to the phantom&rsquo;s tenth passenger?
It sounds like a thriller and is also that, but also much, much more. The
author&rsquo;s classic themes are all present, only disguised in a story that is only
seemingly and partially different. The Passenger requires commitment and
concentration: there are many closed discussions, varied and more or less
recurring characters, numerous flashbacks and juxtapositions, but it is amply
worth it.</p>
<p>McCarthy&rsquo;s final diarchy consists of this work and its natural continuation,
Stella Maris, centered on Bobby&rsquo;s schizophrenic sister, Alice. Together, the two
volumes make a modern masterpiece.</p>
<h3 id="stella-maris-by-cormac-mccarthy">Stella Maris, by Cormac McCarthy</h3>
<p><em>(Einaudi)</em></p>
<p>★★★★☆</p>
<p>In The Passenger, we hear the story of Bobby Western, salvage diver, physics
expert, former race car driver, and grieving brother who is still in love with
his beautiful sister who killed herself. This very sister is the protagonist of
Stella Maris, the book&rsquo;s title being the name of the psychiatric facility she
admitted herself to. The text is set in 1972, and here (spoiler alert), we
discover that ten years before The Passenger events, Bobby was in a coma after a
car accident and brain dead. The doctors wanted Alice to agree to stop
life-support. Mind-blowing. The whole text comprises seven sessions with her
therapist, Dr. Cohen, rendered in pure dialogue and, therefore, more linear than
The Passenger. Stella Maris can be read without its companion, but I would
not advice doing that.</p>
<h3 id="born-to-run-2-by-chris-mcdougall-and-eric-orton">Born to run 2, by Chris McDougall and Eric Orton</h3>
<p>★★☆☆☆</p>
<p>I&rsquo;ve been back to running after a long hiatus, and this book helped me get back
on track with the right, lightly-hearted approach. The fundamentals are solid
(the barefoot-like technique is the way), the 90-day training plan is a good
platform, the nutrition hints are remarkable, and I appreciated the
injury-treatment segments. There&rsquo;s too much chitchat for my liking, though, with
many stories, anecdotes, and non-technical, gospel-like content. Some chapters
are unattractive to the experienced runner (running with dogs, the music while
running debate, and training with scooters?).  This book targets the newcomer
and the veteran runner switching to the barefoot technique. The first book in
the series, Born to Run, was the commercial hit introducing barefoot running to
the masses. This one is trying to be both a sequel and something different that
can live independently. Meeting all these goals was a complicated bet.</p>
<h3 id="blinds-man-bluff-by-susan-sontag">Blind’s man bluff, by Susan Sontag</h3>
<p><em>(Immersione rapida, Net)</em></p>
<p>★★★☆☆</p>
<p>This book made a lot of noise when it came out in 1998. Back then, most of the
events narrated were unknown to the general public. The cold-war stories
contained within are as enthralling as spy, maritime and Cold War stories can
get.  This book is still relevant today, as it does an excellent job of
recounting the Cold War craziness and revealing how close humanity got to
shooting his own feet, and we never knew.</p>
<h3 id="wuthering-heights-by-emily-bronte">Wuthering Heights, by Emily Bronte</h3>
<p><em>(Cime Tempestose, BUR)</em></p>
<p>★★★★☆</p>
<p>What a weird work of fiction. I was expecting the usual romantic story between
noble landowners in late 19th-century England, full of heartbreak and probably
opposed by their respective families, the difficulties of rural life, or both.
I found myself immersed in a much darker, twisted and sick version of the story,
in which every single character is flawed, and there is not a single light of
hope. A few weeks passed since I read it, and I&rsquo;m still trying to come to terms
with it. This book was well ahead of its time (1847) and still challenges the
readers today. As I read, I could not help but think, &ldquo;What kind of sick author
would write a thing like this?&rdquo; Emily Brontë&rsquo;s life was not easy, and many
experiences of her and her family percolated in the novel in one way or another.
I found an [excellent review][1] on Goodreads, and I&rsquo;m using it as a guideline
for pondering this novel. For as an oddball as it is, this book is a must-read.</p>
<h3 id="lumanità-è-un-tirocinio-by-domenico-starnone">L&rsquo;umanità è un tirocinio, by Domenico Starnone</h3>
<p><em>(Einaudi)</em></p>
<p>★★☆☆☆</p>
<p>Getting to know my beloved Starnone better through the literary fascinations
that turned him on, the sharp reflections on authors and texts, and his very
personal &ldquo;shattering&rdquo; of articles representing a lifetime&rsquo;s thoughts on writing
and writing was terrific. <em>&ldquo;The texts collected here owe what little good they
possibly hold to the forty-five years of passionate, enjoyable daily
conversation with Anita; time has passed too quickly.&rdquo;</em> It was not an easy read,
mainly because most of the mentioned texts I had never read before, but worth
it. My to-read list has surely grown much longer now.</p>
<h3 id="the-overstory-by-richard-powers">The overstory, by Richard Powers</h3>
<p><em>(Il sussurro del mondo, La nave di Teseo)</em></p>
<p>★☆☆☆☆</p>
<p>I found it overly dull and did not finish it. Strange, because it sounds like a book I&rsquo;d love. Maybe I&rsquo;ll try again in a
few years.</p>
<h3 id="la-mossa-del-matto-by-alessandro-barbaglia">La mossa del matto, by Alessandro Barbaglia</h3>
<p><em>(Mondadori)</em></p>
<p>★★★☆☆</p>
<p>Alessandro Barbaglia’s La mossa del matto (The fool’s move) tries to be three
things in one: the life story of chess champion Bobby Fischer, a reconciliation
dialogue between author and father, who died too soon, as well the tracing of a
daring parallel between Fischer’s relationship with Russian champion Boris
Spasskij and that of Achilles and Ulysses of Homeric memory. In our neck of the
woods, we say that too much is crippling, and this work runs the risk. More
<a href="/book-review-la-mossa-del-matto-the-fools-move/">here</a>.</p>
<h3 id="disasters-by-daniil-charms">Disasters, by Daniil Charms</h3>
<p><em>(Disastri, UTET)</em></p>
<p>★★★☆☆</p>
<p>Daniil Charms was considered a children’s author and could not stand children
all his life. While his whimsical fairy tales populated illustrated books and
magazines, giving him something to live on in the silence of his room, he also
feverishly wrote tales for adults, equally imaginative but inhabited by an
excruciating melancholy, as in fairy tales went wrong. More <a href="/book-review-disastri/">here</a>.</p>
<h3 id="land-and-sea-by-carl-schmitt">Land and sea, by Carl Schmitt</h3>
<p><em>(Terra e mare, Adelphi)</em></p>
<p>★★☆☆☆</p>
<p>Land and Sea is an essay in short story form written in 1942 by Carl Schmitt.
Subtitled “A consideration of world history told to my daughter Anna,” this
essay recounts and summarizes the geo-historical-legal evolution of our planet
since the discovery of the New World. The originality of the work lies in the
author’s identification of the Earth-Sea dichotomy as the driving force of human
history. More <a href="/book-review-land-and-sea/">here</a>.</p>
<h3 id="medieval-callings-by-jacques-le-goff">Medieval callings, by Jacques Le Goff</h3>
<p><em>(L&rsquo;uomo medievale, Laterza)</em></p>
<p>★★★☆☆</p>
<p>Medieval Callings comprises eleven essays by internationally renowned medieval
historians. Somewhat deceptively, only Jacques Le Goff’s prestigious name
appears on the front page, as he authored the introductive essay and handpicked
and curated the collection. Each piece presents a nuanced profile of a
significant social or professional Middle Ages group. Warrior knights, monks,
high churchmen, criminals, lepers, shepherds, artists, and prostitutes, all
prominent figures of medieval society, are depicted here with great detail. More
<a href="/book-review-medieval-callings/">here</a>.</p>
<h3 id="being-wolf-by-kerstin-ekman">Being wolf, by Kerstin Ekman</h3>
<p><em>(Essere lupo, Iperborea)</em></p>
<p>★★★☆☆</p>
<p>I saw a wolf: that’s the phrase Ulf, a hunter and former forestry inspector now in his seventies, has been brooding, unable to confess to anyone since he spotted a majestic specimen at dawn on the first day of the year. Something clicks inside him, and Ulf, one of the most respected men in the village in deep Sweden where he lives, feels an increasingly solid and intimate connection with the creature. They both are hunters and loners, but why does he feel like an intruder? More <a href="/book-review-essere-lupo-being-wolf/">here</a>.</p>
<h3 id="no-sleep-till-shengal-by-zerocalcare">No sleep till Shengal, by Zerocalcare</h3>
<p><em>(Bao)</em></p>
<p>★★☆☆☆</p>
<p>Zerocalcare is an Italian cartoonist whose strips, especially in the form of
illustrated books, have surged to an iconic level in the last decade. His
drawing is excellent, but it is with his writing that, I think, he conquered
fame. His stories are fun to read and yet profound and vibrant, all at the same
time. Also, he often touches on themes nobody else covers, at least not in the
comics world. It was the case with Kobane Calling: Greetings from Northern
Syria, his graphic reportage from Syrian Kurdistan and the Syria-Turkey border.
The author visited the area with other volunteers to support the Kurdish
resistance. I think Kobane Calling did a lot in raising awareness of the Kurdish
situation, at least here in Italy (an English edition was published too.) More
<a href="/book-review-no-sleep-till-shengal/">here</a>.</p>
<h3 id="red-mars-by-kim-stanley-robinson">Red Mars, by Kim Stanley Robinson</h3>
<p><em>(Il rosso di marte, Fanucci)</em></p>
<p>★★☆☆☆</p>
<p>Regarding space-related topics and scientific research, Casey Handmer’s blog is
one of my references. So when Casey started his Mars Trilogy Technical
Commentary and I learned about Kim Stanley Robinson’s masterpiece, I was
instantly intrigued. In Casey’s opinion, KSR’s Mars Trilogy is “one of the
finest works of literature ever composed.” It took a couple of weeks of futile
resistance before I gave in and ordered the first book in the series, Red Mars,
a 420 pages tome that attempts to depict a scientifically credible human
colonization of Mars. More <a href="/book-review-red-mars/">here</a>.</p>
<h3 id="sanguina-ancora-by-paolo-nori">Sanguina ancora, by Paolo Nori</h3>
<p><em>(Mondadori)</em></p>
<p>★★★☆☆</p>
<p>Sanguina Ancora (Still Bleeding) is not a biography but a passionate and
informative tribute to Dostoevsky. The nonlinear, not literary style works and
the continuous back and forth between Dostoevsky’s epic and the author’s own
experiences as a scholar and Russian literature enthusiast is probably a good
idea as it helps stress the actualness of Dostoevsky’s opus. More
<a href="/book-review-sanguina-ancora-still-bleeding/">here</a>.</p>
<h3 id="uomini-boschi-e-api-by-mario-rigoni-stern">Uomini, boschi e api, by Mario Rigoni Stern</h3>
<p><em>(Einaudi)</em></p>
<p>★★☆☆☆</p>
<p>&ldquo;I wish everyone could listen to the song of the partridges as the sun rises,
see the deer on pastures in spring, the larch trees reddened by autumn on the
edges of rocks, the darting of fish among the clear waters of streams, and the
bees gathering nectar from the flowering cherry trees. In these stories, I write
about village places. These natural environments are still livable, about the
beautiful social insects that are bees, but also about ancient jobs that are
slowly and inexorably disappearing.&rdquo; More
<a href="/book-review-uomini-boschi-e-api/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The wilderness of Poggio Montironi</title>
      <link>https://nicolaiarocci.com/the-wilderness-of-poggio-montironi/</link>
      <pubDate>Fri, 15 Dec 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-wilderness-of-poggio-montironi/</guid>
      <description>&lt;p&gt;Yesterday was a beautiful, sunny, cold winter Sunday. I felt like going out and
enjoying nature, so I took a solo hike in the Foreste Casentinesi National Park,
about an hour&amp;rsquo;s drive from home.&lt;/p&gt;
&lt;p&gt;This one marks my very first technology-assisted hiking adventure. It may seem
weird for someone who&amp;rsquo;s been hiking for so long, is a notorious geek and is a
professional computer programmer to have never used technology before. A trail
map and sometimes a compass were all I was used to, and deliberately. I wanted
to avoid technology in this aspect of my life. I welcomed the orientation
challenges and superbly looked down at the crowds of phone-smartwatch-compulsive
hikers I met on the route. Alas, 2023 was the year I surrendered my motorcycling
habits to intercom systems and GPS navigation, and that spoiled me. In a couple
of situations yesterday, the app spared me some trouble by warning me of the
wrong direction I was going. Nothing major. I would&amp;rsquo;ve realized the error and
backtracked, but being these the shortest and coldest days of the year, I
appreciated not risking getting caught by dusk. Also, I found that I can turn on
voice-assisted navigation as I do on my motorcycle, and that&amp;rsquo;s nice (albeit
surreal - walking alone in the wilderness, miles from anybody, with a voice
coming out of nowhere and whispering when I should take turns on the trail): it
avoids looking at the cellphone all the time so I can stay focused on the
experience even more, I suspect, than before when the don&amp;rsquo;t-get-lost alarm bell
was constantly ringing in the back of my head.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday was a beautiful, sunny, cold winter Sunday. I felt like going out and
enjoying nature, so I took a solo hike in the Foreste Casentinesi National Park,
about an hour&rsquo;s drive from home.</p>
<p>This one marks my very first technology-assisted hiking adventure. It may seem
weird for someone who&rsquo;s been hiking for so long, is a notorious geek and is a
professional computer programmer to have never used technology before. A trail
map and sometimes a compass were all I was used to, and deliberately. I wanted
to avoid technology in this aspect of my life. I welcomed the orientation
challenges and superbly looked down at the crowds of phone-smartwatch-compulsive
hikers I met on the route. Alas, 2023 was the year I surrendered my motorcycling
habits to intercom systems and GPS navigation, and that spoiled me. In a couple
of situations yesterday, the app spared me some trouble by warning me of the
wrong direction I was going. Nothing major. I would&rsquo;ve realized the error and
backtracked, but being these the shortest and coldest days of the year, I
appreciated not risking getting caught by dusk. Also, I found that I can turn on
voice-assisted navigation as I do on my motorcycle, and that&rsquo;s nice (albeit
surreal - walking alone in the wilderness, miles from anybody, with a voice
coming out of nowhere and whispering when I should take turns on the trail): it
avoids looking at the cellphone all the time so I can stay focused on the
experience even more, I suspect, than before when the don&rsquo;t-get-lost alarm bell
was constantly ringing in the back of my head.</p>
<p>And then, of course, there&rsquo;s the selfish and ego-boosting pleasure of sharing
your achievement with the masses. I mean, <a href="https://out.ac/IPVine">look at this
beauty</a>!</p>
<p>The Poggio Montironi hike was an excellent circular tour, advisable all year
round and especially suggestive in winter because of the barren and scenic ridge
(perhaps too sunny in midsummer) that culminates with the more than 1,000 meters
of Poggio Montironi. Near the destination stands an always-open bivouac that can
be useful as shelter. At the same time, the ancient castle of Spescia, reduced
to ruins but with considerable environmental value, on the return ridge gives
the hike additional reasons for interest.</p>
<p>Caution on the descent: Two or three turns could be more noticeable, but they
are well reported in the GPX track. A fallen tree (surmountable) interrupts the
trail near the ford of the Rio Sasso.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How Many Hobbits?</title>
      <link>https://nicolaiarocci.com/how-many-hobbits/</link>
      <pubDate>Thu, 14 Dec 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-many-hobbits/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;For those who don’t know me, I’m a demographer. I study population. And my first love in fantasy was, of course, Middle Earth. How many people live in Middle Earth? Being a demographer, I was mainly interested in the data side of things.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Tolkien is frustratingly vague about population. He almost never gives us estimates of settlement sizes, and many of the larger metropolises of Middle Earth (like Pelargir) never actually appear on the page. Sizable armies make frequent appearances, yet because his adventurers almost exclusively traverse the wilds of Middle Earth, we rarely see where those soldiers are coming from.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>For those who don’t know me, I’m a demographer. I study population. And my first love in fantasy was, of course, Middle Earth. How many people live in Middle Earth? Being a demographer, I was mainly interested in the data side of things.</p></blockquote>
<blockquote>
<p>Tolkien is frustratingly vague about population. He almost never gives us estimates of settlement sizes, and many of the larger metropolises of Middle Earth (like Pelargir) never actually appear on the page. Sizable armies make frequent appearances, yet because his adventurers almost exclusively traverse the wilds of Middle Earth, we rarely see where those soldiers are coming from.</p></blockquote>
<blockquote>
<p>Almost every attempt to estimate population in Middle Earth extrapolates from army sizes.  This is no surprise since those are some of the only numbers Tolkien does provide and, furthermore, historically, this is also how ancient populations in the real world are often estimated, so there are some credible rules-of-thumb out there.</p></blockquote>
<blockquote>
<p>I wanted to take a new approach.</p></blockquote>
<p>As a long time Tolkien fan, I truly enjoyed <em><a href="https://medium.com/@lymanstone/how-many-hobbits-a-demographic-analysis-of-middle-earth-cd53b91d141f">How Many Hobbits? A Demographic Analysis of Middle Earth</a></em>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Winterkeeper</title>
      <link>https://nicolaiarocci.com/the-winterkeeper/</link>
      <pubDate>Sun, 10 Dec 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-winterkeeper/</guid>
      <description>&lt;p&gt;The Guardian&amp;rsquo;s &lt;em&gt;The Winterkeeper: A Lifetime Spent Protecting Yellowstone National Park&lt;/em&gt; is a beautiful short documentary I truly enjoyed watching.&lt;/p&gt;
&lt;p&gt;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/9OwLLNPRbUw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;!-- raw HTML omitted --&gt;
A little research on Steven Fuller, the protagonist, allowed me to dig out some promising &lt;a href=&#34;https://mountainjournal.org/a-winterkeeper-remembers-his-piece-in-natgo&#34;&gt;reading material&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The Guardian&rsquo;s <em>The Winterkeeper: A Lifetime Spent Protecting Yellowstone National Park</em> is a beautiful short documentary I truly enjoyed watching.</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/9OwLLNPRbUw?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<!-- raw HTML omitted -->
A little research on Steven Fuller, the protagonist, allowed me to dig out some promising <a href="https://mountainjournal.org/a-winterkeeper-remembers-his-piece-in-natgo">reading material</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Andrej Karpathy</title>
      <link>https://nicolaiarocci.com/quoting-andrej-karpathy/</link>
      <pubDate>Sat, 09 Dec 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-andrej-karpathy/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I always struggle a bit with I&amp;rsquo;m asked about the &amp;ldquo;hallucination problem&amp;rdquo; in LLMs. Because, in some sense, hallucination is all LLMs do. They are dream machines.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;We direct their dreams with prompts. The prompts start the dream, and based on the LLM&amp;rsquo;s hazy recollection of its training documents, most of the time the result goes someplace useful.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s only when the dreams go into deemed factually incorrect territory that we label it a &amp;ldquo;hallucination&amp;rdquo;. It looks like a bug, but it&amp;rsquo;s just the LLM doing what it always does.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I always struggle a bit with I&rsquo;m asked about the &ldquo;hallucination problem&rdquo; in LLMs. Because, in some sense, hallucination is all LLMs do. They are dream machines.</p></blockquote>
<blockquote>
<p>We direct their dreams with prompts. The prompts start the dream, and based on the LLM&rsquo;s hazy recollection of its training documents, most of the time the result goes someplace useful.</p></blockquote>
<blockquote>
<p>It&rsquo;s only when the dreams go into deemed factually incorrect territory that we label it a &ldquo;hallucination&rdquo;. It looks like a bug, but it&rsquo;s just the LLM doing what it always does.</p></blockquote>
<p>&ndash; <a href="https://twitter.com/karpathy/status/1733299213503787018">Andrej Karpathy</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Intro to Large Language Models (video)</title>
      <link>https://nicolaiarocci.com/intro-to-large-language-models-video/</link>
      <pubDate>Fri, 24 Nov 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/intro-to-large-language-models-video/</guid>
      <description>&lt;p&gt;Andrej Karpathy has a very well-done &lt;a href=&#34;https://youtu.be/zjkBMFhNj_g?si=5tJNFaDcK-FBWnWK&#34;&gt;Intro to Large Language Models&lt;/a&gt;
video on YouTube. As a founding member and research scientist at OpenAI and with a two-year hiatus working on Tesla
Autopilot, Karpathy is an authority in the field. He is also good at explaining hard things.&lt;/p&gt;
&lt;p&gt;As a Kahneman reader, I appreciated the &lt;em&gt;Thinking Fast and Slow&lt;/em&gt; analogy proposed at about half-length in the video:
&amp;ldquo;System 1&amp;rdquo; (fast automatic thinking, rapid decisions) is where we&amp;rsquo;re now; &amp;ldquo;System 2&amp;rdquo; (rational, slow thinking, complex
decisions) is LLMs next goal. Also, I suspect Karpathy&amp;rsquo;s intriguing idea of LLMs as the center of a new &amp;ldquo;operating
system style&amp;rdquo; is not too far off from what will emerge soon. The final segment on AI security and known attack vectors
(jailbreaking, prompt injection, data poisoning) is also super interesting.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Andrej Karpathy has a very well-done <a href="https://youtu.be/zjkBMFhNj_g?si=5tJNFaDcK-FBWnWK">Intro to Large Language Models</a>
video on YouTube. As a founding member and research scientist at OpenAI and with a two-year hiatus working on Tesla
Autopilot, Karpathy is an authority in the field. He is also good at explaining hard things.</p>
<p>As a Kahneman reader, I appreciated the <em>Thinking Fast and Slow</em> analogy proposed at about half-length in the video:
&ldquo;System 1&rdquo; (fast automatic thinking, rapid decisions) is where we&rsquo;re now; &ldquo;System 2&rdquo; (rational, slow thinking, complex
decisions) is LLMs next goal. Also, I suspect Karpathy&rsquo;s intriguing idea of LLMs as the center of a new &ldquo;operating
system style&rdquo; is not too far off from what will emerge soon. The final segment on AI security and known attack vectors
(jailbreaking, prompt injection, data poisoning) is also super interesting.</p>
<p>On his website, Karpathy also has a promising <a href="https://karpathy.ai/zero-to-hero.html">zero-to-hero video series</a>, &ldquo;a
course on building neural networks from scratch, in code.&rdquo;</p>
]]></content:encoded>
    </item>
    <item>
      <title>I am speaking at the .NET Conference Italia 2023</title>
      <link>https://nicolaiarocci.com/i-am-speaking-at-the-dotnet-conference-italia-2023/</link>
      <pubDate>Thu, 23 Nov 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-speaking-at-the-dotnet-conference-italia-2023/</guid>
      <description>&lt;p&gt;In a few days, on Monday, December 4, at 10 a.m., I will present at the .NET Conference Italia 2023, which will be held
at the Microsoft House in Milan. My session is titled &amp;ldquo;C#12 What&amp;rsquo;s new and interesting&amp;rdquo; and is part of a &lt;a href=&#34;https://dotnetconference.it/e/3281/dotNET-Conference-Italia-2023&#34;&gt;rich agenda&lt;/a&gt;
focused on the recent release of .NET 8.&lt;/p&gt;
&lt;p&gt;I presented on the same subject at a &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/&#34;&gt;DevRomagna&lt;/a&gt; meetup a few months ago when C# 12 was in preview and still had
several moving parts. Now that the final release is out, it will be interesting to return to the topic to consolidate my
knowledge. I suspect that of the many reasons I challenge myself to speak publicly, enriching my knowledge is prevalent.
As the adage goes, for learning a subject, nothing beats explaining it in front of a knowledgeable audience.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In a few days, on Monday, December 4, at 10 a.m., I will present at the .NET Conference Italia 2023, which will be held
at the Microsoft House in Milan. My session is titled &ldquo;C#12 What&rsquo;s new and interesting&rdquo; and is part of a <a href="https://dotnetconference.it/e/3281/dotNET-Conference-Italia-2023">rich agenda</a>
focused on the recent release of .NET 8.</p>
<p>I presented on the same subject at a <a href="https://www.meetup.com/it-IT/devromagna/">DevRomagna</a> meetup a few months ago when C# 12 was in preview and still had
several moving parts. Now that the final release is out, it will be interesting to return to the topic to consolidate my
knowledge. I suspect that of the many reasons I challenge myself to speak publicly, enriching my knowledge is prevalent.
As the adage goes, for learning a subject, nothing beats explaining it in front of a knowledgeable audience.</p>
<p>If you will attend the conference (you should!), remember to meet me and say hi!</p>
<p><em>Update:</em> the session is now <a href="/video-of-my-csharp-12-session-at-dotnet-conference-italia-2023/">available online</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to use XmlWriter along with StringWriter to properly serialize a UTF-8 string</title>
      <link>https://nicolaiarocci.com/how-to-use-xmlwriter-along-with-stringwriter-to-properly-serialize-a-utf-8-string/</link>
      <pubDate>Thu, 09 Nov 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-use-xmlwriter-along-with-stringwriter-to-properly-serialize-a-utf-8-string/</guid>
      <description>&lt;p&gt;Today, I (re)learned how to serialize an XML to a UTF-8 string. Like all the other times I did this, I got backstabbed
by StringWriter, which only supports UTF-16. A simple code snippet like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    await using &lt;span style=&#34;font-weight:bold&#34;&gt;var&lt;/span&gt; sw = new StringWriter();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    await using &lt;span style=&#34;font-weight:bold&#34;&gt;var&lt;/span&gt; w = XmlWriter.Create(sw, new() { Async = true });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    await w.FlushAsync();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; sw.ToString();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Will emit this output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-16&amp;#34;?&amp;gt;&amp;lt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There&amp;rsquo;s nothing inherently wrong with UTF-16, but XML is usually UTF-8, so one must do something about it. StringWriter
exposes an &lt;code&gt;Encoding&lt;/code&gt; property, but it is read-only for unknown reasons. One might think that given that the XmlWriter
allows setting its own &lt;code&gt;Encoding&lt;/code&gt; value, something like this would work:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, I (re)learned how to serialize an XML to a UTF-8 string. Like all the other times I did this, I got backstabbed
by StringWriter, which only supports UTF-16. A simple code snippet like this:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    await using <span style="font-weight:bold">var</span> sw = new StringWriter();
</span></span><span style="display:flex;"><span>    await using <span style="font-weight:bold">var</span> w = XmlWriter.Create(sw, new() { Async = true });
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>    await w.FlushAsync();
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">return</span> sw.ToString();
</span></span></code></pre></div><p>Will emit this output:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>    &lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-16&#34;?&gt;&lt;...
</span></span></code></pre></div><p>There&rsquo;s nothing inherently wrong with UTF-16, but XML is usually UTF-8, so one must do something about it. StringWriter
exposes an <code>Encoding</code> property, but it is read-only for unknown reasons. One might think that given that the XmlWriter
allows setting its own <code>Encoding</code> value, something like this would work:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    await using <span style="font-weight:bold">var</span> sw = new StringWriter();
</span></span><span style="display:flex;"><span>    await using <span style="font-weight:bold">var</span> w = XmlWriter.Create(sw, 
</span></span><span style="display:flex;"><span>        new() { Async = true , Encoding = Encoding.UTF8});
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>    await w.FlushAsync();
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">return</span> sw.ToString();
</span></span></code></pre></div><p>But it doesn’t. Over time, I’ve seen a few different ways to get out of this dead end, some more performant and or less
verbose than others, but my favorite is resorting to a custom StringWriter:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>    public class Utf8StringWriter : StringWriter
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        public override Encoding Encoding =&gt; Encoding.UTF8;
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>Armed with this, it is trivial, as it should have been from the get-go, to obtain the desired output:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    await using <span style="font-weight:bold">var</span> sw = new Utf8StringWriter();
</span></span><span style="display:flex;"><span>    await using <span style="font-weight:bold">var</span> w = XmlWriter.Create(sw, new() { Async = true });
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>    await w.FlushAsync();
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">return</span> sw.ToString();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    // returns  &lt;<span style="">?</span>xml version=<span style="font-style:italic">&#34;1.0&#34;</span> encoding=<span style="font-style:italic">&#34;utf-8&#34;</span><span style="">?</span>&gt;&lt;...
</span></span></code></pre></div><p>The whole .NET framework has seen fantastic performance improvements, top-class multi-platform support, and remarkable
streamlining, but some baffling pitfalls are still hidden in some of its less obvious parts. StringWriter not supporting
UTF-8 out-of-the-box is one of them.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica for .NET v3.4.11</title>
      <link>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.4.11/</link>
      <pubDate>Fri, 27 Oct 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.4.11/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://fatturaelettronicaopensource.org/docs&#34;&gt;Fattura Elettronica&lt;/a&gt; for .NET v3.4.11 was released on NuGet today. The Fattura Elettronica project allows for the
fixes a missing validation point. See the &lt;a href=&#34;https://fatturaelettronicaopensource.org/docs/changelog.html#v-3411&#34;&gt;changelog&lt;/a&gt; for details (Italian). validation and de/serialization of
electronic invoices following the Italian Revenue Agency standards.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://fatturaelettronicaopensource.org/docs">Fattura Elettronica</a> for .NET v3.4.11 was released on NuGet today. The Fattura Elettronica project allows for the
fixes a missing validation point. See the <a href="https://fatturaelettronicaopensource.org/docs/changelog.html#v-3411">changelog</a> for details (Italian). validation and de/serialization of
electronic invoices following the Italian Revenue Agency standards.</p>
]]></content:encoded>
    </item>
    <item>
      <title>LINQ DistinctBy on a property for .NET Standard and older .NET versions</title>
      <link>https://nicolaiarocci.com/linq-distinctby-on-a-property-for-dotnet-standard-and-old-dotnet-versions/</link>
      <pubDate>Wed, 25 Oct 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/linq-distinctby-on-a-property-for-dotnet-standard-and-old-dotnet-versions/</guid>
      <description>&lt;p&gt;Today I learned how to implement a custom &lt;code&gt;Enumerable.DistinctBy&lt;/code&gt; extension method that returns distinct elements from a
sequence according to a specified key selector function.&lt;/p&gt;
&lt;p&gt;.NET 6 and its successors have the method &lt;a href=&#34;https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.distinctby?view=net-6.0&#34;&gt;built in&lt;/a&gt; within LINQ, but I needed it in a .NET Standard 2.0 class
library, so I was out of luck. My implementation is simple, not different from &lt;a href=&#34;https://stackoverflow.com/a/489421/323269&#34;&gt;others&lt;/a&gt; I found online, and should
also work fine with old .NET releases. Here it is:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned how to implement a custom <code>Enumerable.DistinctBy</code> extension method that returns distinct elements from a
sequence according to a specified key selector function.</p>
<p>.NET 6 and its successors have the method <a href="https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.distinctby?view=net-6.0">built in</a> within LINQ, but I needed it in a .NET Standard 2.0 class
library, so I was out of luck. My implementation is simple, not different from <a href="https://stackoverflow.com/a/489421/323269">others</a> I found online, and should
also work fine with old .NET releases. Here it is:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    public <span style="font-weight:bold">static</span> IEnumerable&lt;TSource&gt; DistinctBy&lt;TSource, TKey&gt;(this IEnumerable&lt;TSource&gt; source, Func&lt;TSource, TKey&gt; keySelector)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">var</span> keys = new HashSet&lt;TKey&gt;();
</span></span><span style="display:flex;"><span>        foreach (<span style="font-weight:bold">var</span> element <span style="font-weight:bold">in</span> source)
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="font-weight:bold">if</span> (keys.Contains(keySelector(element))) <span style="font-weight:bold">continue</span>;
</span></span><span style="display:flex;"><span>            keys.Add(keySelector(element));
</span></span><span style="display:flex;"><span>            yield <span style="font-weight:bold">return</span> element;
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>In the following usage example, I will get back all unique objects from the original sequence, distinct by their Name
property:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    <span style="font-weight:bold">var</span> uniques = mySequenceOfObjects.DistinctBy(x =&gt; x.Name);
</span></span></code></pre></div><p>I later went to check the <a href="https://github.com/dotnet/runtime/blob/e0409d44bd8d1fd0be1d66fbb52bd609be18f388/src/libraries/System.Linq/src/System/Linq/Distinct.cs#L62">official .NET 6+ implementation</a>. They support an optional equality comparer , which I
don&rsquo;t need, but their base implementation is similar to mine (they use deferred execution as well).</p>
<p>By the way, years after its open-sourcing, I still get thrills when I realize I can always look at, let alone contribute
to, the .NET source code.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A few late book reviews</title>
      <link>https://nicolaiarocci.com/a-few-late-book-reviews/</link>
      <pubDate>Sat, 26 Aug 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-few-late-book-reviews/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been reading a few books throughout the summer and needed to be more active in reviewing them here. Rather than
writing five individual posts in a row (too lazy for that), I will catch up with this single post.&lt;/p&gt;
&lt;h2 id=&#34;born-to-run-2&#34;&gt;Born to Run 2&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been back to running after a long hiatus, and this book helped me get back on track with the right, lightly-hearted
approach. The fundamentals are solid (the barefoot-like technique is the way), the 90-day training plan is a good
platform, the nutrition hints are remarkable, and I appreciated the injury-treatment segments. There&amp;rsquo;s too much chitchat
for my liking, though, with many stories, anecdotes, and non-technical, gospel-like content. Some chapters are
unattractive to the experienced runner (running with dogs, the music while running debate, and training with scooters?).
This book targets the newcomer and the veteran runner switching to the barefoot technique. The first book in the series,
Born to Run, was the commercial hit introducing barefoot running to the masses. This one is trying to be both a sequel
and something different that can live independently. Meeting all these goals was a complicated bet. &lt;em&gt;Authors: Chris
McDougall, Eric Orton.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been reading a few books throughout the summer and needed to be more active in reviewing them here. Rather than
writing five individual posts in a row (too lazy for that), I will catch up with this single post.</p>
<h2 id="born-to-run-2">Born to Run 2</h2>
<p>I&rsquo;ve been back to running after a long hiatus, and this book helped me get back on track with the right, lightly-hearted
approach. The fundamentals are solid (the barefoot-like technique is the way), the 90-day training plan is a good
platform, the nutrition hints are remarkable, and I appreciated the injury-treatment segments. There&rsquo;s too much chitchat
for my liking, though, with many stories, anecdotes, and non-technical, gospel-like content. Some chapters are
unattractive to the experienced runner (running with dogs, the music while running debate, and training with scooters?).
This book targets the newcomer and the veteran runner switching to the barefoot technique. The first book in the series,
Born to Run, was the commercial hit introducing barefoot running to the masses. This one is trying to be both a sequel
and something different that can live independently. Meeting all these goals was a complicated bet. <em>Authors: Chris
McDougall, Eric Orton.</em></p>
<h2 id="immersione-rapida-blinds-man-bluff">Immersione rapida (Blind&rsquo;s Man Bluff)</h2>
<blockquote>
<p>For decades, American submarines have roamed the depths in a dangerous battle for information and advantage in
missions known only to a select few. Now, after six years of research, those missions are told in Blind Man&rsquo;s Bluff, a
magnificent achievement in investigative reporting.</p></blockquote>
<p>This book made a lot of noise when it came out in 1998. Back then, most of the events narrated were unknown to the
general public. The cold-war stories contained within are as enthralling as spy, maritime and Cold War stories can get.
This book is still relevant today, as it does an excellent job of recounting the Cold War craziness and revealing how
close humanity got to shooting his own feet, and we never knew. <em>Authors: Sherry Sontag, Christopher Drew, Annette L.
Drew</em>.</p>
<h2 id="cime-tempestose-wuthering-heights">Cime tempestose (Wuthering Heights)</h2>
<p>What a weird work of fiction. I was expecting the usual romantic story between noble landowners in late 19th-century
England, full of heartbreak and probably opposed by their respective families, the difficulties of rural life, or both.
I found myself immersed in a much darker, twisted and sick version of the story, in which every single character is
flawed, and there is not a single light of hope. A few weeks passed since I read it, and I&rsquo;m still trying to come to
terms with it. This book was well ahead of its time (1847) and still challenges the readers today. As I read, I could
not help but think, &ldquo;What kind of sick author would write a thing like this?&rdquo; Emily Brontë&rsquo;s life was not easy, and many
experiences of her and her family percolated in the novel in one way or another. I found an <a href="https://www.goodreads.com/review/show/4840111965">excellent review</a> on
Goodreads, and I&rsquo;m using it as a guideline for pondering this novel. For as an oddball as it is, this book is a
must-read. <em>Author: Emily Brontë.</em></p>
<h2 id="lumanità-è-un-tirocinio-life-is-an-apprenticeship">L&rsquo;umanità è un tirocinio (Life is an apprenticeship)</h2>
<p>Getting to know my beloved Starnone better through the literary fascinations that turned him on, the sharp reflections
on authors and texts, and his very personal &ldquo;shattering&rdquo; of articles representing a lifetime&rsquo;s thoughts on writing and
writing was terrific. <em>&ldquo;The texts collected here owe what little good they possibly hold to the forty-five years of
passionate, enjoyable daily conversation with Anita; time has passed too quickly.&rdquo;</em> It was not an easy read, mainly
because most of the mentioned texts I had never read before, but worth it. My to-read list has surely grown much longer
now. <em>Author: Domenico Starnone</em>.</p>
<h2 id="il-sussurro-del-mondo-the-overstory">Il sussurro del mondo (The Overstory)</h2>
<blockquote>
<p>The Overstory is a sweeping, impassioned work of activism and resistance that is also a stunning evocation of - and
paean to - the natural world. From the roots to the crown and back to the seeds, Richard Powers&rsquo;s twelfth novel
unfolds in concentric rings of interlocking fables that range from antebellum New York to the late twentieth-century
Timber Wars of the Pacific Northwest and beyond. There is a world alongside ours—vast, slow, interconnected,
resourceful, magnificently inventive, and almost invisible to us. This is the story of a handful of people who learn
how to see that world and who are drawn up into its unfolding catastrophe.</p></blockquote>
<p>I found it overly dull and did not finish it. Strange, because it sounds like a book I&rsquo;d love. Maybe I&rsquo;ll try again in a
few years. <em>Author: Richard Powers.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>rsync with a different user</title>
      <link>https://nicolaiarocci.com/rsync-with-a-different-user/</link>
      <pubDate>Wed, 23 Aug 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/rsync-with-a-different-user/</guid>
      <description>&lt;p&gt;Today I learned how to rsync with a user different than the one connected to the remote. Why would one want to do such a
thing? The data I need to download from that server is owned by &amp;lsquo;backup,&amp;rsquo; a different, service-only user. I wanted to
avoid going the change-permissions slippery route and allow my user direct access to the data.&lt;/p&gt;
&lt;p&gt;Looking at the rsync documentation, I learned about the nifty &lt;code&gt;--rsync-path=PROGRAM&lt;/code&gt; &lt;a href=&#34;https://download.samba.org/pub/rsync/rsync.1#opt--rsync-path&#34;&gt;option&lt;/a&gt;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned how to rsync with a user different than the one connected to the remote. Why would one want to do such a
thing? The data I need to download from that server is owned by &lsquo;backup,&rsquo; a different, service-only user. I wanted to
avoid going the change-permissions slippery route and allow my user direct access to the data.</p>
<p>Looking at the rsync documentation, I learned about the nifty <code>--rsync-path=PROGRAM</code> <a href="https://download.samba.org/pub/rsync/rsync.1#opt--rsync-path">option</a>:</p>
<blockquote>
<p>Use this to specify what program is to be run on the remote machine to start-up rsync. Often used when rsync is not in
the default remote-shell&rsquo;s path (e.g. &ndash;rsync-path=/usr/local/bin/rsync).</p></blockquote>
<p>The example caught my attention. I could perhaps leverage this option to perform a user switch before executing rsync
(now performed on the remote machine). As further research confirmed, it <a href="https://unix.stackexchange.com/a/546296">can be done</a>:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>rsync --rsync-path &#39;sudo -u backup rsync&#39; -a --delete host:source destination
</span></span></code></pre></div><p>It didn&rsquo;t work immediately because my user was not a sudoer, but that was an easy fix:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>cat &gt; /etc/sudoers.d/myuser &lt;&lt; EOF
</span></span><span style="display:flex;"><span>myuser ALL=(ALL) NOPASSWD:/usr/bin/rsync
</span></span><span style="display:flex;"><span>EOF
</span></span></code></pre></div><p>As you can see, not only must the user be a sudoer, but it also needs to be able to sudo with no password. One last
minor issue was that &lsquo;backup&rsquo;, being a service user, had no shell access. That was another easy fix:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sudo usermod -s /bin/bash backup
</span></span></code></pre></div><p>Now my rsync-with-a-different-user command works like a charm. I do have some mild security concerns, though. My user is
a sudoer (can only sudo rsync, though<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>), and &lsquo;backup&rsquo; now has shell access. As password logins are turned off, and
SSH keys-only access is allowed to the machine (and I&rsquo;m the only person holding those keys), everything&rsquo;s still
reasonably safe. Are there better ways? Please let me know.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Thanks to Sebastian on Mastodon for <a href="https://fosstodon.org/@DarkMetatron@rollenspiel.social/110939139075153024">pointing out</a> that I should limit the sudoer to just rsync itself. I updated the post accordingly. By the way, this is why I love posting TILs in public.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[m]: <a href="https://fosstodon.org/@nicola">https://fosstodon.org/@nicola</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The Legacy of Bram Moolenaar</title>
      <link>https://nicolaiarocci.com/the-legacy-of-bram-moolenaar/</link>
      <pubDate>Fri, 11 Aug 2023 08:55:35 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-legacy-of-bram-moolenaar/</guid>
      <description>&lt;p&gt;Quoting &lt;a href=&#34;https://j11g.com/2023/08/07/the-legacy-of-bram-moolenaar/&#34;&gt;Jan van den Berg&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This weekend we learned that Bram Moolenaar had passed away at the age of 62. And this news affected me more than I
expected. Like so many: I did not know Bram personally. But I’ve been using a tool made by Bram for more than half my
life — at least weekly, sometimes daily. That tool is a text editor. The best one there is: Vim.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quoting <a href="https://j11g.com/2023/08/07/the-legacy-of-bram-moolenaar/">Jan van den Berg</a>:</p>
<blockquote>
<p>This weekend we learned that Bram Moolenaar had passed away at the age of 62. And this news affected me more than I
expected. Like so many: I did not know Bram personally. But I’ve been using a tool made by Bram for more than half my
life — at least weekly, sometimes daily. That tool is a text editor. The best one there is: Vim.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus v1.3.5 released</title>
      <link>https://nicolaiarocci.com/cerberus-v1.3.5-released/</link>
      <pubDate>Thu, 10 Aug 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-v1.3.5-released/</guid>
      <description>&lt;p&gt;Thanks to &lt;a href=&#34;https://github.com/funkyfuture&#34;&gt;funkyfuture&lt;/a&gt;&amp;rsquo;s tireless work, yesterday we released &lt;a href=&#34;https://pypi.org/project/Cerberus/1.3.5/&#34;&gt;version 1.3.5&lt;/a&gt; of &lt;a href=&#34;https://docs.python-cerberus.org&#34;&gt;Cerberus&lt;/a&gt;, the data
validation package for Python. This release officially supports Python 3.10 and 3.11, fixes a few issues, and proudly
displays a new documentation theme which I dig, and I hope you&amp;rsquo;ll do the same. As usual, see the &lt;a href=&#34;https://docs.python-cerberus.org/changelog.html#version-1-3-5&#34;&gt;changelog&lt;/a&gt; for
details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Thanks to <a href="https://github.com/funkyfuture">funkyfuture</a>&rsquo;s tireless work, yesterday we released <a href="https://pypi.org/project/Cerberus/1.3.5/">version 1.3.5</a> of <a href="https://docs.python-cerberus.org">Cerberus</a>, the data
validation package for Python. This release officially supports Python 3.10 and 3.11, fixes a few issues, and proudly
displays a new documentation theme which I dig, and I hope you&rsquo;ll do the same. As usual, see the <a href="https://docs.python-cerberus.org/changelog.html#version-1-3-5">changelog</a> for
details.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica for .NET v3.4.10</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-for-dotnet-v3.4.10/</link>
      <pubDate>Thu, 03 Aug 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-for-dotnet-v3.4.10/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://fatturaelettronicaopensource.org/docs&#34;&gt;Fattura Elettronica&lt;/a&gt; for .NET v3.4.10 was released on NuGet today. The Fattura Elettronica project allows for the
validation and de/serialization of electronic invoices following the Italian Revenue Agency standards. This release
adds a missing validation point. See the &lt;a href=&#34;https://fatturaelettronicaopensource.org/docs/changelog.html#v-3410&#34;&gt;changelog&lt;/a&gt; for details (Italian).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://fatturaelettronicaopensource.org/docs">Fattura Elettronica</a> for .NET v3.4.10 was released on NuGet today. The Fattura Elettronica project allows for the
validation and de/serialization of electronic invoices following the Italian Revenue Agency standards. This release
adds a missing validation point. See the <a href="https://fatturaelettronicaopensource.org/docs/changelog.html#v-3410">changelog</a> for details (Italian).</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Medieval Monks Who Lived on Top of Giant Pillars</title>
      <link>https://nicolaiarocci.com/the-medieval-monks-who-lived-on-top-of-giant-pillars/</link>
      <pubDate>Thu, 03 Aug 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-medieval-monks-who-lived-on-top-of-giant-pillars/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Imagine, for a moment, that you are walking along a dirt road in the seventh century Middle East. The sun is hot, the
air is dry, your feet are tired. It’s been a long journey, by boat and foot, from your home in Constantinople to where
you find yourself now: outside of the walls of the mountainous river city of Antioch. In the bright sunlight, you
strain your eyes to catch a distant glimpse of the sight you’ve come all this way to see – and then suddenly, you do.
A bright stone pillar, stretching as tall as a church dome with an unsteady-looking wooden platform; and atop it a
tiny, bedraggled, flinty old man.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Imagine, for a moment, that you are walking along a dirt road in the seventh century Middle East. The sun is hot, the
air is dry, your feet are tired. It’s been a long journey, by boat and foot, from your home in Constantinople to where
you find yourself now: outside of the walls of the mountainous river city of Antioch. In the bright sunlight, you
strain your eyes to catch a distant glimpse of the sight you’ve come all this way to see – and then suddenly, you do.
A bright stone pillar, stretching as tall as a church dome with an unsteady-looking wooden platform; and atop it a
tiny, bedraggled, flinty old man.</p></blockquote>
<blockquote>
<p>You’ve found him: the Pillar Saint.</p></blockquote>
<blockquote>
<p>To our modern eyes, this is a profoundly weird image – but it would have been a recognisable, even iconic, one if we
were living in the early medieval Middle East. To explain how we got here – and how that guy got on that pillar - we
need to step back and tell the origin story of one of the most recognisable characters in medieval life: the monk.</p></blockquote>
<p>More <a href="https://weirdmedievalguys.substack.com/p/the-medieval-monks-who-lived-on-top">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Events 0.5 released</title>
      <link>https://nicolaiarocci.com/events-0.5-released/</link>
      <pubDate>Mon, 31 Jul 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/events-0.5-released/</guid>
      <description>&lt;p&gt;Today I released &lt;a href=&#34;https://pypi.org/project/Events/0.5/&#34;&gt;Events 0.5&lt;/a&gt;. Thanks to &lt;a href=&#34;https://github.com/CaileanMParker&#34;&gt;Cailean
Parker&lt;/a&gt;&amp;rsquo;s contribution, we added support for the &lt;code&gt;__getitem__&lt;/code&gt; dunder (aka Python
magic method.) This allows the calling of events from strings, thus enabling dynamic events. For instance:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;events = Events(tuple(f&amp;#34;on_{i}&amp;#34; for i in range(5)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;for i in range(5):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    events[f&amp;#34;on_{i}&amp;#34;](i)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The C# language provides a handy way to declare, subscribe to and fire events. In C#, an event is a &amp;ldquo;slot&amp;rdquo; to which
callback functions (event handlers) can be attached - a process referred to as subscribing to an event. &lt;em&gt;Events&lt;/em&gt; adds
this mechanism to Python. It originated as a side experiment (I was a C# transfugee then) that I later adopted as an
&lt;a href=&#34;https://github.com/pyeve/eve&#34;&gt;Eve&lt;/a&gt; dependency. It slowly got some traction besides my projects. Read more on the project&amp;rsquo;s &lt;a href=&#34;https://github.com/pyeve/events&#34;&gt;GitHub
page&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released <a href="https://pypi.org/project/Events/0.5/">Events 0.5</a>. Thanks to <a href="https://github.com/CaileanMParker">Cailean
Parker</a>&rsquo;s contribution, we added support for the <code>__getitem__</code> dunder (aka Python
magic method.) This allows the calling of events from strings, thus enabling dynamic events. For instance:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>events = Events(tuple(f&#34;on_{i}&#34; for i in range(5)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>for i in range(5):
</span></span><span style="display:flex;"><span>    events[f&#34;on_{i}&#34;](i)
</span></span></code></pre></div><p>The C# language provides a handy way to declare, subscribe to and fire events. In C#, an event is a &ldquo;slot&rdquo; to which
callback functions (event handlers) can be attached - a process referred to as subscribing to an event. <em>Events</em> adds
this mechanism to Python. It originated as a side experiment (I was a C# transfugee then) that I later adopted as an
<a href="https://github.com/pyeve/eve">Eve</a> dependency. It slowly got some traction besides my projects. Read more on the project&rsquo;s <a href="https://github.com/pyeve/events">GitHub
page</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I won the Microsoft MVP Award</title>
      <link>https://nicolaiarocci.com/i-won-the-microsoft-mvp-award/</link>
      <pubDate>Thu, 06 Jul 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-won-the-microsoft-mvp-award/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve just received news that I&amp;rsquo;ve been awarded the Microsoft Most Valuable Professional (MVP) Award in the Software
Development category. It is an honor and a pleasure to be renewed for the eighth time. Being a Microsoft MVP means a lot
to me; I remember how intimidated I felt when I met MVPs at various events and how totally out of reach the title seemed
for someone like me. Besides my everyday work, I kept doing the things I loved:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve just received news that I&rsquo;ve been awarded the Microsoft Most Valuable Professional (MVP) Award in the Software
Development category. It is an honor and a pleasure to be renewed for the eighth time. Being a Microsoft MVP means a lot
to me; I remember how intimidated I felt when I met MVPs at various events and how totally out of reach the title seemed
for someone like me. Besides my everyday work, I kept doing the things I loved:</p>
<ul>
<li>Work on my open-source projects</li>
<li>Present at conferences and local meetups</li>
<li>Write some articles here and there</li>
<li>Blog as usual</li>
</ul>
<p>Then, one day, someone nominated me for the award. I was surprised, baffled and thankful, and I did not expect to pass
the selection process. I was genuinely shocked when I received the first award. Being in the MVP program has been a
happy and rewarding ride, and I&rsquo;m glad the journey continues for another year.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Homebrew and docfx don&#39;t like each other too</title>
      <link>https://nicolaiarocci.com/homebrew-and-docfx-dont-like-each-other-too/</link>
      <pubDate>Tue, 20 Jun 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/homebrew-and-docfx-dont-like-each-other-too/</guid>
      <description>&lt;p&gt;Another day another Homebrew incompatibility emerges, this time with &lt;a href=&#34;https://dotnet.github.io/docfx/index.html&#34;&gt;docfx&lt;/a&gt;, the technical documentation building
tool of reference in .NET space. I&amp;rsquo;ve been using docfx for years to build the &lt;a href=&#34;https://fatturaelettronicaopensource.org&#34;&gt;FatturaElettronica.NET&lt;/a&gt; website, and it&amp;rsquo;s
always been working without a glitch. Lately, however, my builds have been failing with strange errors I was too lazy to
diagnose until today when I decided to grasp the nettle and sort the whole thing out.&lt;/p&gt;
&lt;p&gt;It took me an embarrassing time to realize that, while successful, my docfx updates (&lt;code&gt;dotnet tool update -g docfx&lt;/code&gt;) were
being ignored. An old, Homebrew-installed version of docfx was being executed at my launches —a simple &lt;code&gt;which docfx&lt;/code&gt;
revealed the issue. &lt;code&gt;brew uninstall docfx&lt;/code&gt; finally set the updated, dotnet-installed version free of its chains, and it
is now merrily churning websites.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Another day another Homebrew incompatibility emerges, this time with <a href="https://dotnet.github.io/docfx/index.html">docfx</a>, the technical documentation building
tool of reference in .NET space. I&rsquo;ve been using docfx for years to build the <a href="https://fatturaelettronicaopensource.org">FatturaElettronica.NET</a> website, and it&rsquo;s
always been working without a glitch. Lately, however, my builds have been failing with strange errors I was too lazy to
diagnose until today when I decided to grasp the nettle and sort the whole thing out.</p>
<p>It took me an embarrassing time to realize that, while successful, my docfx updates (<code>dotnet tool update -g docfx</code>) were
being ignored. An old, Homebrew-installed version of docfx was being executed at my launches —a simple <code>which docfx</code>
revealed the issue. <code>brew uninstall docfx</code> finally set the updated, dotnet-installed version free of its chains, and it
is now merrily churning websites.</p>
<p>A similar issue emerged <a href="/homebrew-and-dotnet-8-preview-dont-like-each-other/">between Homebrew and .NET 8 Preview</a> only a few days ago. Lesson learned I&rsquo;m not installing
dotnet tools via Homebrew anymore. Or maybe, I might stay clear of Homebrew altogether.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Homebrew and .NET 8 Preview don&#39;t like each other</title>
      <link>https://nicolaiarocci.com/homebrew-and-dotnet-8-preview-dont-like-each-other/</link>
      <pubDate>Tue, 13 Jun 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/homebrew-and-dotnet-8-preview-dont-like-each-other/</guid>
      <description>&lt;p&gt;Today I learned that .NET 8 Preview could play better with Homebrew (or vice-versa). I&amp;rsquo;m working on a &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/events/293340671/&#34;&gt;C# 12 presentation
for our local developer meetup&lt;/a&gt;, and for that, I wanted .NET 8 Preview to run side by side with version 7 on my Mac. As
version 7 was initially installed with Homebrew, I also wanted to install version 8 Preview with Homebrew, but that
recipe was unavailable. Not perfectly happy with that, I fell back to the stand-alone installer, expecting
problems.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned that .NET 8 Preview could play better with Homebrew (or vice-versa). I&rsquo;m working on a <a href="https://www.meetup.com/it-IT/devromagna/events/293340671/">C# 12 presentation
for our local developer meetup</a>, and for that, I wanted .NET 8 Preview to run side by side with version 7 on my Mac. As
version 7 was initially installed with Homebrew, I also wanted to install version 8 Preview with Homebrew, but that
recipe was unavailable. Not perfectly happy with that, I fell back to the stand-alone installer, expecting
problems.</p>
<p>Installation went well, but then I turned to the command line only to find that <code>dotnet --list-sdks</code> was still and only
showing version 7. Yet, the 8 Preview was sitting there at its canonical location at <code>/usr/local/share/dotnet/sdk</code>,
where the v7 was also listed.</p>
<p>Puzzled, I tried a few things, but the quick fix was to simply <code>brew uninstall --ignore-dependencies dotnet</code> and, boom,
both versions 8 Preview and 7 became immediately available. I suspect that <code>brew uninstall</code> only removed the symlink
from .NET canonical location to the Homebrew cellar, which magically solved the SDK visibility problem.</p>
<p>TL; DR. Homebrew recipes don&rsquo;t play nicely with .NET canonical installer. To make all my SDK versions visible to .NET,
I had to forego the Homebrew installation, which did not uninstall the SDK itself, but simply unlinked it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python `decimal.getcontext` does not work with bpython</title>
      <link>https://nicolaiarocci.com/python-decimal.getcontext-does-not-work-with-bpython/</link>
      <pubDate>Tue, 06 Jun 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/python-decimal.getcontext-does-not-work-with-bpython/</guid>
      <description>&lt;p&gt;I have been working on a side project for which I&amp;rsquo;m using &lt;a href=&#34;https://bpython-interpreter.org&#34;&gt;bpython&lt;/a&gt;, a &amp;ldquo;fancy interface to the Python interpreter.&amp;rdquo;
If you use the Python REPL often, you should check it out. It offers unique features like in-line syntax
highlighting, readline-like autocomplete, a &amp;ldquo;rewind&amp;rdquo; function to pop the last line of code from memory, auto-indentation
and more.&lt;/p&gt;
&lt;p&gt;Anyway, today I found a bug in bpython, and that&amp;rsquo;s that Python&amp;rsquo;s &lt;code&gt;decimal.getcontext()&lt;/code&gt; does not work with it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have been working on a side project for which I&rsquo;m using <a href="https://bpython-interpreter.org">bpython</a>, a &ldquo;fancy interface to the Python interpreter.&rdquo;
If you use the Python REPL often, you should check it out. It offers unique features like in-line syntax
highlighting, readline-like autocomplete, a &ldquo;rewind&rdquo; function to pop the last line of code from memory, auto-indentation
and more.</p>
<p>Anyway, today I found a bug in bpython, and that&rsquo;s that Python&rsquo;s <code>decimal.getcontext()</code> does not work with it.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>bpython version 0.24 on top of Python 3.11.3
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; import decimal
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; decimal.getcontext().prec = 6
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; decimal.Decimal(1) / decimal.Decimal(7)
</span></span><span style="display:flex;"><span>Decimal(&#39;0.1428571428571428571428571429&#39;)
</span></span></code></pre></div><p>If you run the same lines in the standard Python REPL, what you get instead is:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>bpython version 0.24 on top of Python 3.11.3
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; import decimal
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; decimal.getcontext().prec = 6
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; decimal.Decimal(1) / decimal.Decimal(7)
</span></span><span style="display:flex;"><span>Decimal(&#39;0.142857&#39;)
</span></span></code></pre></div><p>Further experimenting revealed that, as a workaround, setting <code>DefaultContext</code> works as expected:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>bpython version 0.24 on top of Python 3.11.3
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; decimal.DefaultContext.prec = 6
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; decimal.Decimal(1) / decimal.Decimal(7)
</span></span><span style="display:flex;"><span>Decimal(&#39;0.142857&#39;)
</span></span></code></pre></div><p>I suspect this has something to do with threads, as <code>decimal.getcontext</code> targets the current thread while
<code>DefaultContext</code> is global. I went to the bpython repository only to find that a ticket was already opened in 2021. I
<a href="https://github.com/bpython/bpython/issues/918#issuecomment-1578911204">added</a> my <code>DefaultContext</code> observation there.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daft Punk&#39;s Infinity Repeating music video</title>
      <link>https://nicolaiarocci.com/daft-punks-infinity-repeating-music-video/</link>
      <pubDate>Tue, 30 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/daft-punks-infinity-repeating-music-video/</guid>
      <description>&lt;p&gt;Julian Casablancas (The Strokes, The Voidz) says Infinity Repeating is &amp;ldquo;the last Daft Punk song, ever.&amp;rdquo; The song was
recorded in 2013 as a demo and left unpublished until it was included in the 10th-anniversary edition of Random Access
Memories released a few weeks ago.&lt;/p&gt;
&lt;p&gt;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/imBlPXbAv6E?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;!-- raw HTML omitted --&gt;
The video is a highly addictive masterpiece. Digging into the comments on YouTube, I found that someone attempted a
reconstruction of &lt;a href=&#34;https://www.youtube.com/watch?v=imBlPXbAv6E&amp;amp;lc=UgzaNoEwyYOxNyc53cB4AaABAg&#34;&gt;all the citations included&lt;/a&gt;. I&amp;rsquo;m especially fond of the 8-16-32-bit graphics animation section.
Another thing I learned is that Thomas Bangalter, formerly one-half of Daft Punk, &lt;a href=&#34;https://www.latimes.com/entertainment-arts/story/2023-04-04/daft-punk-member-thomas-bangalter-terrified-ai&#34;&gt;said&lt;/a&gt; that his fear of artificial
intelligence was a factor in why the group split in 2021.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Julian Casablancas (The Strokes, The Voidz) says Infinity Repeating is &ldquo;the last Daft Punk song, ever.&rdquo; The song was
recorded in 2013 as a demo and left unpublished until it was included in the 10th-anniversary edition of Random Access
Memories released a few weeks ago.</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/imBlPXbAv6E?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<!-- raw HTML omitted -->
The video is a highly addictive masterpiece. Digging into the comments on YouTube, I found that someone attempted a
reconstruction of <a href="https://www.youtube.com/watch?v=imBlPXbAv6E&amp;lc=UgzaNoEwyYOxNyc53cB4AaABAg">all the citations included</a>. I&rsquo;m especially fond of the 8-16-32-bit graphics animation section.
Another thing I learned is that Thomas Bangalter, formerly one-half of Daft Punk, <a href="https://www.latimes.com/entertainment-arts/story/2023-04-04/daft-punk-member-thomas-bangalter-terrified-ai">said</a> that his fear of artificial
intelligence was a factor in why the group split in 2021.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Donald Knuth</title>
      <link>https://nicolaiarocci.com/quoting-donald-knuth/</link>
      <pubDate>Fri, 26 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-donald-knuth/</guid>
      <description>&lt;p&gt;Donald Knuth challenged ChatGPT-4 with 20 questions and then submitted the results and his comments to Stephen Wolfram. The
&lt;a href=&#34;https://cs.stanford.edu/~knuth/chatGPT20.txt&#34;&gt;whole thing&lt;/a&gt; is fascinating in many ways and worth reading.&lt;/p&gt;
&lt;p&gt;Some remarkable quotes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Of course these are extremely impressive responses, sometimes astonishingly so; thus I totally understand why you and
others have been paying attention to it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The most immediate impression is the quality of the wordsmithing. It&amp;rsquo;s way better than 99% of copy that people
actually write. It&amp;rsquo;s definitely not like a Markov model that uses the most predictable way to continue what&amp;rsquo;s already
been said. On the other hand there are surprising lapses there too, as typical of any large system.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Donald Knuth challenged ChatGPT-4 with 20 questions and then submitted the results and his comments to Stephen Wolfram. The
<a href="https://cs.stanford.edu/~knuth/chatGPT20.txt">whole thing</a> is fascinating in many ways and worth reading.</p>
<p>Some remarkable quotes:</p>
<blockquote>
<p>Of course these are extremely impressive responses, sometimes astonishingly so; thus I totally understand why you and
others have been paying attention to it.</p></blockquote>
<blockquote>
<p>The most immediate impression is the quality of the wordsmithing. It&rsquo;s way better than 99% of copy that people
actually write. It&rsquo;s definitely not like a Markov model that uses the most predictable way to continue what&rsquo;s already
been said. On the other hand there are surprising lapses there too, as typical of any large system.</p></blockquote>
<blockquote>
<p>Answer #10 reads as though it&rsquo;s the best answer yet. But it&rsquo;s almost totally wrong!</p></blockquote>
<blockquote>
<p>It&rsquo;s amazing how the confident tone lends credibility to all of that made-up nonsense. Almost impossible for anybody
without knowledge of the book to believe that those &ldquo;facts&rdquo; aren&rsquo;t authorititative and well researched.</p></blockquote>
<blockquote>
<p>I find it fascinating that novelists galore have written for decades about scenarios that might occur after a
&ldquo;singularity&rdquo; in which superintelligent machines exist. But as far as I know, not a single novelist has realized that
such a singularity would almost surely be preceded by a world in which machines are 0.01% intelligent (say), and in
which millions of real people would be able to interact with them freely at essentially no cost.</p></blockquote>
<blockquote>
<p>I myself shall certainly continue to leave such research to others, and to devote my time to developing concepts that
are authentic and trustworthy. And I hope you do the same.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>A new modern MSBuild terminal logger is coming with .NET 8</title>
      <link>https://nicolaiarocci.com/a-new-modern-msbuild-terminal-logger-is-coming-with-dotnet-8/</link>
      <pubDate>Sat, 20 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-new-modern-msbuild-terminal-logger-is-coming-with-dotnet-8/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-4/&#34;&gt;latest .NET 8 Preview&lt;/a&gt; is out, and I love that they&amp;rsquo;re finally changing how MSBuild logs are printed to the terminal.
The new Terminal Logger ditches the infamous &amp;ldquo;wall of text&amp;rdquo; that is a nightmare to parse in favor of a cleaner, leaner,
and more organized output.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Once enabled, the new logger shows you the restore phase, followed by the build phase. During each phase, the
currently-building projects are at the bottom of the terminal, and each building project tells you both the MSBuild
Target currently being built, as well as the amount of time spent on that target.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The <a href="https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-4/">latest .NET 8 Preview</a> is out, and I love that they&rsquo;re finally changing how MSBuild logs are printed to the terminal.
The new Terminal Logger ditches the infamous &ldquo;wall of text&rdquo; that is a nightmare to parse in favor of a cleaner, leaner,
and more organized output.</p>
<blockquote>
<p>Once enabled, the new logger shows you the restore phase, followed by the build phase. During each phase, the
currently-building projects are at the bottom of the terminal, and each building project tells you both the MSBuild
Target currently being built, as well as the amount of time spent on that target.</p></blockquote>
<p>The new MSBuild terminal logger is not the default. It must be opted-in with the <code>tl</code> option of the <code>dotnet build</code>
command. Here&rsquo;s what it looks like for a complex, multi-project and multi-target solution:</p>
<p><img alt="MSBuild Terminal Logger output" loading="lazy" src="/images/modernbuildoutput.gif"></p>
<p>Now, if you&rsquo;re doing .NET programming within an IDE like Rider of Visual Studio, this all might seem of little
importance to you, but rest assured as soon as you have to look at CI logs or if you use the command line in your
workflow a lot as I do, this is pure bliss.</p>
<p>Interestingly, this marks only the first step in a series of upcoming MSBuild UX improvements: <em>&ldquo;We hope to use this
logger as the foundation for a new batch of UX improvements for MSBuild, including aspects like progress reporting and
structured errors in the future.&rdquo;</em> Color me excited.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: La Mossa del Matto (The Fool&#39;s Move)</title>
      <link>https://nicolaiarocci.com/book-review-la-mossa-del-matto-the-fools-move/</link>
      <pubDate>Fri, 19 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-la-mossa-del-matto-the-fools-move/</guid>
      <description>&lt;p&gt;Alessandro Barbaglia&amp;rsquo;s &lt;em&gt;La mossa del matto (The fool&amp;rsquo;s move)&lt;/em&gt; tries to be three things in one: the life story of chess
champion Bobby Fischer, a reconciliation dialogue between author and father, who died too soon, as well the tracing of a
daring parallel between Fischer&amp;rsquo;s relationship with Russian champion Boris Spasskij and that of Achilles and Ulysses of
Homeric memory. In our neck of the woods, we say that too much is crippling, and this work runs the risk.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Alessandro Barbaglia&rsquo;s <em>La mossa del matto (The fool&rsquo;s move)</em> tries to be three things in one: the life story of chess
champion Bobby Fischer, a reconciliation dialogue between author and father, who died too soon, as well the tracing of a
daring parallel between Fischer&rsquo;s relationship with Russian champion Boris Spasskij and that of Achilles and Ulysses of
Homeric memory. In our neck of the woods, we say that too much is crippling, and this work runs the risk.</p>
<p><img alt="Book cover: La mossa del matto" loading="lazy" src="/images/book-cover-la-mossa-del-matto.jpg#right">
I appreciated the accurate and skillfully woven account of Bobby Fischer&rsquo;s incredibly successful yet troubled
life. The intersection between Fischer&rsquo;s biography and actual episodes of the author&rsquo;s and his dad&rsquo;s lives works well,
too. The attempt to bind the Fischer/Spasskij relationship to that of Achilles and Ulysses, albeit intriguing and often
fitting, seems unnecessary, always risking breaking the fragile balance between the three narratives. Somehow Barbaglia
manages to keep it all together.</p>
<p>Before getting into this book, I knew very little about Bobby Fischer. He&rsquo;s known as the American genius who beat the
unbeatable Russians at chess, but there&rsquo;s much more to him than that, and this book does a great job at telling.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Tiny electronic desktop sculptures</title>
      <link>https://nicolaiarocci.com/tiny-electronic-desktop-sculptures/</link>
      <pubDate>Thu, 18 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/tiny-electronic-desktop-sculptures/</guid>
      <description>&lt;p&gt;Adorable, functional, often internet-connected desktop bots like those below are hand-crafted by Mohit Bhoite in San
Francisco, California.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/bhoite-sculptures-01.jpg&#34;&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/bhoite-sculptures-02.jpg&#34;&gt;
It pleasantly surprised me that they&amp;rsquo;re built as a purely artistic expression. All sculptures (as Mohit rightfully refers
to them) are unique and not for sale. Check them all out on &lt;a href=&#34;https://www.bhoite.com&#34;&gt;his website&lt;/a&gt; &lt;em&gt;(&lt;a href=&#34;https://kottke.org/23/05/tiny-electronic-desktop-sculptures&#34;&gt;via&lt;/a&gt;)&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Adorable, functional, often internet-connected desktop bots like those below are hand-crafted by Mohit Bhoite in San
Francisco, California.</p>
<p><img loading="lazy" src="/images/bhoite-sculptures-01.jpg">
<img loading="lazy" src="/images/bhoite-sculptures-02.jpg">
It pleasantly surprised me that they&rsquo;re built as a purely artistic expression. All sculptures (as Mohit rightfully refers
to them) are unique and not for sale. Check them all out on <a href="https://www.bhoite.com">his website</a> <em>(<a href="https://kottke.org/23/05/tiny-electronic-desktop-sculptures">via</a>)</em>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>macOS networkQuality tool</title>
      <link>https://nicolaiarocci.com/macos-networkquality-tool/</link>
      <pubDate>Mon, 15 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/macos-networkquality-tool/</guid>
      <description>&lt;p&gt;Today I learned about a precious little macOS command line tool, &lt;code&gt;networkQuality&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The networkQuality tool is a built-in tool released in macOS Monterey that can help diagnose network issues and
measure network performance.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;networkQuality -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==== SUMMARY ====
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Uplink capacity: 44.448 Mbps (Accuracy: High)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downlink capacity: 162.135 Mbps (Accuracy: High)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Responsiveness: Low (73 RPM) (Accuracy: High)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Idle Latency: 50.125 milliseconds (Accuracy: High)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Interface: en0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Uplink bytes transferred: 69.921 MB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downlink bytes transferred: 278.340 MB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Uplink Flow count: 16
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downlink Flow count: 12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Start: 13/05/2023, 15:04:13
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;End: 13/05/2023, 15:04:27
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;OS Version: Version 13.3.1 (a) (Build 22E772610a)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It supports Apple&amp;rsquo;s Private Relay, offers some configuration options and allows setting up your own server. More info
&lt;a href=&#34;https://cyberhost.uk/the-hidden-macos-speedtest-tool-networkquality/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned about a precious little macOS command line tool, <code>networkQuality</code>.</p>
<blockquote>
<p>The networkQuality tool is a built-in tool released in macOS Monterey that can help diagnose network issues and
measure network performance.</p></blockquote>
<p>Usage:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>networkQuality -v
</span></span></code></pre></div><p>Example output:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>==== SUMMARY ====
</span></span><span style="display:flex;"><span>Uplink capacity: 44.448 Mbps (Accuracy: High)
</span></span><span style="display:flex;"><span>Downlink capacity: 162.135 Mbps (Accuracy: High)
</span></span><span style="display:flex;"><span>Responsiveness: Low (73 RPM) (Accuracy: High)
</span></span><span style="display:flex;"><span>Idle Latency: 50.125 milliseconds (Accuracy: High)
</span></span><span style="display:flex;"><span>Interface: en0
</span></span><span style="display:flex;"><span>Uplink bytes transferred: 69.921 MB
</span></span><span style="display:flex;"><span>Downlink bytes transferred: 278.340 MB
</span></span><span style="display:flex;"><span>Uplink Flow count: 16
</span></span><span style="display:flex;"><span>Downlink Flow count: 12
</span></span><span style="display:flex;"><span>Start: 13/05/2023, 15:04:13
</span></span><span style="display:flex;"><span>End: 13/05/2023, 15:04:27
</span></span><span style="display:flex;"><span>OS Version: Version 13.3.1 (a) (Build 22E772610a)
</span></span></code></pre></div><p>It supports Apple&rsquo;s Private Relay, offers some configuration options and allows setting up your own server. More info
<a href="https://cyberhost.uk/the-hidden-macos-speedtest-tool-networkquality/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Disastri (Disasters)</title>
      <link>https://nicolaiarocci.com/book-review-disastri/</link>
      <pubDate>Sun, 14 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-disastri/</guid>
      <description>&lt;p&gt;Daniil Charms was considered a children&amp;rsquo;s author and could not stand children all his life. While his whimsical fairy
tales populated illustrated books and magazines, giving him something to live on in the silence of his room, he also
feverishly wrote tales for adults, equally imaginative but inhabited by an excruciating melancholy, as in fairy tales went
wrong.&lt;/p&gt;
&lt;p&gt;At the dawn of the USSR, this desperate fantasy of his was tolerable only if it was confined where it was least
dangerous, in children&amp;rsquo;s literature. Back then, adults were the children to be motivated and consoled with uplifting
novels aimed at glorifying the rise of the proletariat, a literature Charms refused to adhere to.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Daniil Charms was considered a children&rsquo;s author and could not stand children all his life. While his whimsical fairy
tales populated illustrated books and magazines, giving him something to live on in the silence of his room, he also
feverishly wrote tales for adults, equally imaginative but inhabited by an excruciating melancholy, as in fairy tales went
wrong.</p>
<p>At the dawn of the USSR, this desperate fantasy of his was tolerable only if it was confined where it was least
dangerous, in children&rsquo;s literature. Back then, adults were the children to be motivated and consoled with uplifting
novels aimed at glorifying the rise of the proletariat, a literature Charms refused to adhere to.</p>
<p>Thus, while socialist realism raged outside, Daniil Charms uncovered impossible worlds in the folds of reality. Gossipy
older women tipping over the window, curious people breaking their watches trying to seize the moment, men buried alive
rejoicing at the beautiful funeral, birds equipped with teeth (or maybe not), deadly challenges at cucumber blows,
caterpillars with their snouts covered in dust.</p>
<p>This book is an arsenal of incredible stories circling for a long time, only clandestinely in <em>samizdats</em>, illegal books
recopied by hand or typed in secret. Credit goes to Paolo Nori, who revealed to the Italian readers the greatness of
this pioneer of the literature of the absurd. Nori selects and assembles hundreds of narrative fragments, alternating
with excerpts from the diaries, in which Charms lays bare his tragic everyday life. The fresco of tightrope walking
characters and unbelievable animals is thus interwoven with the minute account of a sour life lived on the fringes of
literary society until the gloomy eye of the Party rests on this wacky dissident.</p>
<p>The Soviet Union tried multiple times to erase Charms by letting him die in an asylum. They finally succeeded on
February 2, 1942, when famine killed him in the psychiatric clinic in which he was confined.</p>
<p>Most of these things were written when socialist realism triumphed around, and their author knew very well that he could
never publish them in his lifetime. Yet, by reading his diaries, all this &ldquo;nonsense,&rdquo; as Charmes defined his crazy
writing assembly, clearly emerges as the most crucial thing in his life.</p>
<p>I found the book cover excellent and perfectly fit, with this dandy figure seemingly strolling amongst imposing orthodox
buildings. According to Wikipedia, Charms loved to appear dressed like an English dandy and with a calabash pipe.</p>
<p><img alt="Disastri book cover" loading="lazy" src="/images/disastri-book-cover.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Story of Redis and its creator antirez</title>
      <link>https://nicolaiarocci.com/story-of-redis-and-its-creator-antirez/</link>
      <pubDate>Thu, 11 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/story-of-redis-and-its-creator-antirez/</guid>
      <description>&lt;p&gt;I read a well-researched story about Redis and its creator Salvatore Sanfilippo, also known as antirez. I was already
familiar with many details as I have been following him since OKNotizie and Segnalo, of which I was a user. At the time,
as a user, I exchanged a few emails with Salvatore, whom years later I had the pleasure of meeting in person, as we were
both speakers at several conferences.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I read a well-researched story about Redis and its creator Salvatore Sanfilippo, also known as antirez. I was already
familiar with many details as I have been following him since OKNotizie and Segnalo, of which I was a user. At the time,
as a user, I exchanged a few emails with Salvatore, whom years later I had the pleasure of meeting in person, as we were
both speakers at several conferences.</p>
<p>On his website, he apologizes for being unable to respond to all the mail he receives. Well, my experience is the
opposite. I remember one of our several mail exchanges. In 2013 I asked him for git help, and minutes later, he replied
with a custom script he had put together for dealing with that exact problem. Later on, as I was working on a git
presentation for Codemotion (I think), I fired a quick email asking permission to feature his script in my session. The
green light landed seconds later. Salvatore is the epitome of kindness and helpfulness.</p>
<p>As if his pronounced computer skills were not enough, with his latest sci-fi novel Wohpe (on my reading list), he proves
to be endowed with the most diverse capabilities.</p>
<p>Anyway, <a href="https://blog.brachiosoft.com/redis-en">here&rsquo;s the antirez &amp; Redis story</a> I mentioned. Worth reading it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Motorcycling the Tuscan Chianti</title>
      <link>https://nicolaiarocci.com/motorcycling-the-tuscan-chianti/</link>
      <pubDate>Tue, 09 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/motorcycling-the-tuscan-chianti/</guid>
      <description>&lt;p&gt;Last weekend I attended &lt;em&gt;Eroica 2023&lt;/em&gt;, a motorcycling event organized by the Italian branch of the &lt;a href=&#34;https:/tomccitalia.org&#34;&gt;Triumph Owners
Motorcycle Club&lt;/a&gt; I currently preside. We rode the &lt;a href=&#34;https://eroica.cc/en&#34;&gt;Eroica&lt;/a&gt; route, a legendary gravel bicycle race that runs
through the most beautiful territories of the Tuscan Chianti region. It was glorious. The weather was perfect, the food
was incredible, and the close-knit party of thirty T.O.M.C.C. bikers had great fun. We all ended up covered in an
astonishing amount of powder.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last weekend I attended <em>Eroica 2023</em>, a motorcycling event organized by the Italian branch of the <a href="https:/tomccitalia.org">Triumph Owners
Motorcycle Club</a> I currently preside. We rode the <a href="https://eroica.cc/en">Eroica</a> route, a legendary gravel bicycle race that runs
through the most beautiful territories of the Tuscan Chianti region. It was glorious. The weather was perfect, the food
was incredible, and the close-knit party of thirty T.O.M.C.C. bikers had great fun. We all ended up covered in an
astonishing amount of powder.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Hrb-t4M01FY?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p><em>Eroica 2023</em> was the first in a series of events we&rsquo;ll run throughout the summer and fall. I&rsquo;m looking forward to the
next ones.</p>
]]></content:encoded>
    </item>
    <item>
      <title>AI-curated minimalist news</title>
      <link>https://nicolaiarocci.com/ai-curated-minimalist-news/</link>
      <pubDate>Wed, 03 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/ai-curated-minimalist-news/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.newsminimalist.com&#34;&gt;Minimalist News&lt;/a&gt; is the first LLM project that excites me but in a nervous way. Quoting the About page:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We only publish significant news. To find them we use AI (ChatGPT-4) to read and analyze 1000 top news every day. For
each article it estimates magnitude, scale, potential and credibility. Then we combine these estimates to get the
final Significance score from 0 to 10. And now the best part: We&amp;rsquo;ll only send you the news scored 6.5 or higher.
Sometimes it&amp;rsquo;s 5 articles, sometimes 2, sometimes 8. And sometimes — none at all. But one thing is constant — you can
be sure that you haven&amp;rsquo;t missed anything important.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://www.newsminimalist.com">Minimalist News</a> is the first LLM project that excites me but in a nervous way. Quoting the About page:</p>
<blockquote>
<p>We only publish significant news. To find them we use AI (ChatGPT-4) to read and analyze 1000 top news every day. For
each article it estimates magnitude, scale, potential and credibility. Then we combine these estimates to get the
final Significance score from 0 to 10. And now the best part: We&rsquo;ll only send you the news scored 6.5 or higher.
Sometimes it&rsquo;s 5 articles, sometimes 2, sometimes 8. And sometimes — none at all. But one thing is constant — you can
be sure that you haven&rsquo;t missed anything important.</p></blockquote>
<p>The concept is brilliant and well executed, but I can&rsquo;t help but feel uncomfortable at the notion of an AI curating news
for me. Yet, this is the best use case for LLM/AI I&rsquo;ve seen until now.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica for .NET v3.4.8</title>
      <link>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.4.8/</link>
      <pubDate>Tue, 02 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.4.8/</guid>
      <description>&lt;p&gt;Fattura Elettronica for .NET v3.4.8 was &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronica/3.4.8&#34;&gt;released&lt;/a&gt; on NuGet today. The &lt;a href=&#34;https://fatturaelettronicaopensource.org/&#34;&gt;Fattura Elettronica&lt;/a&gt; project allows for the
validation and de/serialization of electronic invoices following the Italian Revenue Agency standards. As with the
previous one, this release also addresses a small undocumented behavior in validating the invoice. See the &lt;a href=&#34;https://github.com/FatturaElettronica/FatturaElettronica.NET/issues/396&#34;&gt;relevant
ticket&lt;/a&gt; for the details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Fattura Elettronica for .NET v3.4.8 was <a href="https://www.nuget.org/packages/FatturaElettronica/3.4.8">released</a> on NuGet today. The <a href="https://fatturaelettronicaopensource.org/">Fattura Elettronica</a> project allows for the
validation and de/serialization of electronic invoices following the Italian Revenue Agency standards. As with the
previous one, this release also addresses a small undocumented behavior in validating the invoice. See the <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET/issues/396">relevant
ticket</a> for the details.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Land and Sea</title>
      <link>https://nicolaiarocci.com/book-review-land-and-sea/</link>
      <pubDate>Mon, 01 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-land-and-sea/</guid>
      <description>&lt;p&gt;Land and Sea is an essay in short story form written in 1942 by Carl Schmitt. Subtitled &amp;ldquo;A consideration of world
history told to my daughter Anna,&amp;rdquo; this essay recounts and summarizes the geo-historical-legal evolution of our planet
since the discovery of the New World. The originality of the work lies in the author&amp;rsquo;s identification of the Earth-Sea
dichotomy as the driving force of human history.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Land and Sea book cover&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/terra-e-mare-book-cover.jpeg#center&#34;&gt;
I went into this book knowing very little about the author, Carl Schmitt, and the contents. From the first pages, I
considered it a bizarre work, wondering whether a solid basis existed behind some of the assumptions and events
narrated. Quoting the back cover of my Italian edition (Adelphi):&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Land and Sea is an essay in short story form written in 1942 by Carl Schmitt. Subtitled &ldquo;A consideration of world
history told to my daughter Anna,&rdquo; this essay recounts and summarizes the geo-historical-legal evolution of our planet
since the discovery of the New World. The originality of the work lies in the author&rsquo;s identification of the Earth-Sea
dichotomy as the driving force of human history.</p>
<p><img alt="Land and Sea book cover" loading="lazy" src="/images/terra-e-mare-book-cover.jpeg#center">
I went into this book knowing very little about the author, Carl Schmitt, and the contents. From the first pages, I
considered it a bizarre work, wondering whether a solid basis existed behind some of the assumptions and events
narrated. Quoting the back cover of my Italian edition (Adelphi):</p>
<blockquote>
<p>In a dazzling interweaving of historical interpretation and political theory, mythography and theology, philosophy and
esotericism, the great jurist thus enters a fascinating territory on the borderline between speculation and
imagination, where the search for the &ldquo;elemental&rdquo; goes &ldquo;to the threshold of eschatology.&rdquo; With a few strokes, Schmitt
traces millennia of history, unraveling its invisible plot, until he arrives at the decisive event: that &ldquo;planetary
spatial revolution&rdquo; from which the nomos of modern Europe was born. To then look beyond - and foreshadow, with
prophecy, the scenarios of the future world where we will be able to recognize our present.</p></blockquote>
<p>Land and Sea is an essay written in 1942 by a then-eminent and internationally acclaimed jurist, who convincingly joined
the german nazi party in 1933. Historical events in the text are inevitably narrated from an opinionated (and sometimes
distorted) point of view. This bizarre work left me unconvinced. I don&rsquo;t regret reading it, though.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The religious aspects of the corporate space race</title>
      <link>https://nicolaiarocci.com/the-religious-aspects-of-the-corporate-space-race/</link>
      <pubDate>Mon, 01 May 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-religious-aspects-of-the-corporate-space-race/</guid>
      <description>&lt;p&gt;A fascinating article surfaced on Nautilus last week. Mary-Jane Rubenstein, a professor of religion and science in
society at Wesleyan University, shares her concerns about the technical strides and aspirations of Elon Musk&amp;rsquo;s SpaceX,
the company&amp;rsquo;s mission to enable thousands of people to live on Mars, and the ethics of terraforming the planet to be
more like Earth. What&amp;rsquo;s intriguing, though, is Rubenstein&amp;rsquo;s thoughts about the religious underpinnings of the United
States space program and how even modern science is still hostage to imperialistic Christian ideas.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A fascinating article surfaced on Nautilus last week. Mary-Jane Rubenstein, a professor of religion and science in
society at Wesleyan University, shares her concerns about the technical strides and aspirations of Elon Musk&rsquo;s SpaceX,
the company&rsquo;s mission to enable thousands of people to live on Mars, and the ethics of terraforming the planet to be
more like Earth. What&rsquo;s intriguing, though, is Rubenstein&rsquo;s thoughts about the religious underpinnings of the United
States space program and how even modern science is still hostage to imperialistic Christian ideas.</p>
<blockquote>
<p>“I started realizing that religion shows up in the natural sciences and the contemporary world in a funny and alarming
way,” Rubenstein said. “Because sciences tend to think of themselves as something as far away as possible from
religion, as having freed themselves from God. To an extent that’s true. But in the process, they tend to generate
these big stories, big mythologies, about the origins and the ends of the world. And conjure characters who are
heroes, gods, and monsters. I started tracking the way that the natural sciences themselves generate new ways of
understanding the world that, a couple centuries ago, we would have called religion.”</p></blockquote>
<p>More <a href="https://nautil.us/the-race-to-colonize-mars-perpetuates-a-dangerous-religion-298323/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Cicero</title>
      <link>https://nicolaiarocci.com/quoting-cicero/</link>
      <pubDate>Sun, 30 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-cicero/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Not to know what happened before one was born is always to be a child.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I found this Cicero quote on &lt;em&gt;Lapham&amp;rsquo;s Quarterly&lt;/em&gt;&amp;rsquo;s &lt;a href=&#34;https://www.laphamsquarterly.org/about&#34;&gt;about page&lt;/a&gt;. A little &lt;a href=&#34;https://en.wikiquote.org/wiki/Cicero&#34;&gt;research&lt;/a&gt; dug out the supposedly
original version found in &lt;em&gt;Orator Ad M. Brutum&lt;/em&gt; (46 BC). It goes like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To be ignorant of what occurred before you were born is to remain always a child. For what is the worth of human life,
unless it is woven into the life of our ancestors by the records of history?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Not to know what happened before one was born is always to be a child.</p></blockquote>
<p>I found this Cicero quote on <em>Lapham&rsquo;s Quarterly</em>&rsquo;s <a href="https://www.laphamsquarterly.org/about">about page</a>. A little <a href="https://en.wikiquote.org/wiki/Cicero">research</a> dug out the supposedly
original version found in <em>Orator Ad M. Brutum</em> (46 BC). It goes like this:</p>
<blockquote>
<p>To be ignorant of what occurred before you were born is to remain always a child. For what is the worth of human life,
unless it is woven into the life of our ancestors by the records of history?</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Medieval Callings</title>
      <link>https://nicolaiarocci.com/book-review-medieval-callings/</link>
      <pubDate>Sat, 29 Apr 2023 06:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-medieval-callings/</guid>
      <description>&lt;p&gt;&lt;em&gt;Medieval Callings&lt;/em&gt; comprises eleven essays by internationally renowned medieval historians. Somewhat deceptively, only
Jacques Le Goff&amp;rsquo;s prestigious name appears on the front page, as he authored the introductive essay and handpicked and
curated the collection. Each piece presents a nuanced profile of a significant social or professional Middle Ages group.
Warrior knights, monks, high churchmen, criminals, lepers, shepherds, artists, and prostitutes, all prominent figures of
medieval society, are depicted here with great detail.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Medieval Callings</em> comprises eleven essays by internationally renowned medieval historians. Somewhat deceptively, only
Jacques Le Goff&rsquo;s prestigious name appears on the front page, as he authored the introductive essay and handpicked and
curated the collection. Each piece presents a nuanced profile of a significant social or professional Middle Ages group.
Warrior knights, monks, high churchmen, criminals, lepers, shepherds, artists, and prostitutes, all prominent figures of
medieval society, are depicted here with great detail.</p>
<p><img alt="Medieval Callings, Italin edition&rsquo;s book cover" loading="lazy" src="/images/uomo-medievale-book-cover.jpg#right">
The style varies according to the piece (and its author); some will inevitably be more fluent than others. Fundamental
is the introductory essay by Le Goff himself, which provides a useful general overview of the work and also clarifies
its stylistic choices. The Monk essay was crucial to me, as it surfaced abbeys and monasteries&rsquo; relevance and incredible
influence on medieval society.</p>
<p><em>Medieval Callings&rsquo;</em> innovative approach offers a valuable and intriguing perspective on the complex social dynamics of
feudal Europe. The work shows signs of age, having passed more than 30 years since its publication. There are probably
newer, modern studies that improve on these texts, but it still serves as a fundamental resource for uneducated readers
such as myself.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Interstellar Style of Sun Ra</title>
      <link>https://nicolaiarocci.com/the-interstellar-style-of-sun-ra/</link>
      <pubDate>Tue, 25 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-interstellar-style-of-sun-ra/</guid>
      <description>&lt;p&gt;Pitchfork has a great piece on Sun Ra and his legacy. It&amp;rsquo;s worth reading if you&amp;rsquo;re a fan, even more so if you know
nothing about him.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But what Sun Ra had done, and done best, was reminding earthlings everywhere that he wasn’t mortal. He was a
signifier of a life beyond the reality of this one. He was a visual reassurance of the presence of another world. He
brought the cosmos to the streets, and, most importantly, he was a reminder that one does not have to subscribe to
the status quo—musically, stylistically, politically, ideologically.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Pitchfork has a great piece on Sun Ra and his legacy. It&rsquo;s worth reading if you&rsquo;re a fan, even more so if you know
nothing about him.</p>
<blockquote>
<p>But what Sun Ra had done, and done best, was reminding earthlings everywhere that he wasn’t mortal. He was a
signifier of a life beyond the reality of this one. He was a visual reassurance of the presence of another world. He
brought the cosmos to the streets, and, most importantly, he was a reminder that one does not have to subscribe to
the status quo—musically, stylistically, politically, ideologically.</p></blockquote>
<p>More <a href="https://pitchfork.com/features/from-the-pitchfork-review/9866-the-interstellar-style-of-sun-ra/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The end of computer magazines in America (and elsewhere)</title>
      <link>https://nicolaiarocci.com/the-end-of-computer-magazines-in-america-and-elsewhere/</link>
      <pubDate>Wed, 19 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-end-of-computer-magazines-in-america-and-elsewhere/</guid>
      <description>&lt;p&gt;In the mid-to-late 80s, my excitement used to culminate by the end of the month when BYTE&amp;rsquo;s new issue would hit the
newsstands[^2]. In my small Italian hometown, only one, sometimes two, newsstands would sometime get a copy (BYTE was
published in the US and copies sent abroad were scarce; only major, close-to-the-train-station stands had a chance to
receive it). I wasn&amp;rsquo;t the only kid in town interested in that elusive one issue; I had an anonymous competitor. The race
was on every third week of the month, give or take. You see, the thing is, back then, computer magazines were the only
source of reliable, precious information on everything hardware and software. I could barely read English at that age.
Yet, I spent whole afternoons stubbornly reading the magazine cover to cover, probably understanding only fifty percent
of its content. Rather than at school, I learned most of my English by reading computer magazines.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In the mid-to-late 80s, my excitement used to culminate by the end of the month when BYTE&rsquo;s new issue would hit the
newsstands[^2]. In my small Italian hometown, only one, sometimes two, newsstands would sometime get a copy (BYTE was
published in the US and copies sent abroad were scarce; only major, close-to-the-train-station stands had a chance to
receive it). I wasn&rsquo;t the only kid in town interested in that elusive one issue; I had an anonymous competitor. The race
was on every third week of the month, give or take. You see, the thing is, back then, computer magazines were the only
source of reliable, precious information on everything hardware and software. I could barely read English at that age.
Yet, I spent whole afternoons stubbornly reading the magazine cover to cover, probably understanding only fifty percent
of its content. Rather than at school, I learned most of my English by reading computer magazines.</p>
<p>This morning, these memories were brought back to me while reading <a href="https://www.technologizer.com/2023/04/15/the-end-of-computer-magazines-in-america">The End of Computer Magazines in America</a> by Harry
McCracken. He was involved with the computer magazine industry in its golden age, so the article has exciting insights.
I also appreciated the several former colleagues and competitors who commented, helping frame the period. Computer
magazines are dead indeed, and it&rsquo;s a bittersweet sensation. Quoting McCracken&rsquo;s closing words:</p>
<blockquote>
<p>I do remain grateful that computer magazines existed. Their time has passed—but what a time it was.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Noam Chomsky on ChatGPT</title>
      <link>https://nicolaiarocci.com/noam-chomsky-on-chatgpt/</link>
      <pubDate>Sun, 09 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/noam-chomsky-on-chatgpt/</guid>
      <description>&lt;p&gt;Noam Chomsky&amp;rsquo;s essays are always worth reading, no matter the topic he decides to address, because, well, frankly, he&amp;rsquo;s
one of the brightest and most well-informed minds of our time. His criticism of OpenAI&amp;rsquo;s ChatGPT makes no exception. It
does an excellent job of explaining how LLMs work, the differences with human reasoning, and why, in his opinion, the
advent of artificial general intelligence is a long way to go, if ever.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Noam Chomsky&rsquo;s essays are always worth reading, no matter the topic he decides to address, because, well, frankly, he&rsquo;s
one of the brightest and most well-informed minds of our time. His criticism of OpenAI&rsquo;s ChatGPT makes no exception. It
does an excellent job of explaining how LLMs work, the differences with human reasoning, and why, in his opinion, the
advent of artificial general intelligence is a long way to go, if ever.</p>
<blockquote>
<p>However useful these programs may be in some narrow domains (they can be helpful in computer programming, for
example, or in suggesting rhymes for light verse), we know from the science of linguistics and the philosophy of
knowledge that they differ profoundly from how humans reason and use language. These differences place significant
limitations on what these programs can do, encoding them with ineradicable defects.</p></blockquote>
<p>More <a href="https://archive.is/AgWkn">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The real cost of interruption</title>
      <link>https://nicolaiarocci.com/the-real-cost-of-interruption/</link>
      <pubDate>Fri, 07 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-real-cost-of-interruption/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m just back from reading &lt;a href=&#34;https://contextkeeper.io/blog/the-real-cost-of-an-interruption-and-context-switching/&#34;&gt;Programmer Interrupted: The Real Cost of Interruption and Context Switching&lt;/a&gt;, an interesting
short piece in which I learned about at least two new things.&lt;/p&gt;
&lt;p&gt;First, &lt;em&gt;The Parable of the Two Watchmakers&lt;/em&gt;, introduced by Nobel Prize winner Herbert Simon, describes the complex
relationship between sub-systems and their larger wholes. In the context of the article, it helps explain, even for
non-programmers, the cost of an interruption. It also hints at a possible mitigation technique:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m just back from reading <a href="https://contextkeeper.io/blog/the-real-cost-of-an-interruption-and-context-switching/">Programmer Interrupted: The Real Cost of Interruption and Context Switching</a>, an interesting
short piece in which I learned about at least two new things.</p>
<p>First, <em>The Parable of the Two Watchmakers</em>, introduced by Nobel Prize winner Herbert Simon, describes the complex
relationship between sub-systems and their larger wholes. In the context of the article, it helps explain, even for
non-programmers, the cost of an interruption. It also hints at a possible mitigation technique:</p>
<blockquote>
<p>There once were two watchmakers, named Hora and Tempus, who made very fine watches. The phones in their workshops rang
frequently and new customers were constantly calling them. However, Hora prospered while Tempus became poorer and
poorer. In the end, Tempus lost his shop. What was the reason behind this?</p></blockquote>
<blockquote>
<p>The watches consisted of about 1000 parts each. The watches that Tempus made were designed such that, when he had to
put down a partly assembled watch, it immediately fell into pieces and had to be reassembled from the basic elements.
Hora had designed his watches so that he could put together sub-assemblies of about ten components each, and each
sub-assembly could be put down without falling apart. Ten of these sub-assemblies could be put together to make a
larger sub-assembly, and ten of the larger sub-assemblies constituted the whole watch.</p></blockquote>
<p>Second, larger computer screens help a programmer keep his mental model (and context) together. I&rsquo;m still deciding on
this one. Focusing on a single window or not having a lot of cruft around the screen helps solve complex code for me.
But toss anything John Carmack at me, and I will abide.</p>
<blockquote>
<p>The 640 x 480 resolution was the standard from 1990 to around 1996, but it was possible to get more screen real estate
back then. There is a famous photo of John Carmack working on Quake using a 28-inch 1080p monitor in 1995.</p></blockquote>
<blockquote>
<p>Why did he choose 45 kg monitor for about $10k in 1995? The higher screen real estate allowed for more code to be
visible at once, resulting in a more dense context. Productivity greatly increases when you have the ability to store
and access more detailed context. It&rsquo;s like having a larger desk to hold documents when studying for an exam or doing
any task that requires the use of multiple sources of information from a common domain, such as solving puzzles.</p></blockquote>
<p>The brilliant comic that opens the article is the perfect TL;DR for the Watchmakers parable.</p>
<p><img alt="This is why you shouldn&rsquo;t interrupt a programmer" loading="lazy" src="/images/ProgrammerInterrupted.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>ChatGPT is making up fake Guardian articles</title>
      <link>https://nicolaiarocci.com/chatgpt-is-making-up-fake-guardian-articles/</link>
      <pubDate>Thu, 06 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/chatgpt-is-making-up-fake-guardian-articles/</guid>
      <description>&lt;p&gt;Chris Moran, the Guardian’s head of editorial innovation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Last month one of our journalists received an interesting email. A researcher had come across mention of a Guardian
article, written by the journalist on a specific subject from a few years before. But the piece was proving elusive on
our website and in search. Had the headline perhaps been changed since it was launched? Had it been removed
intentionally from the website because of a problem we’d identified? Or had we been forced to take it down by the
subject of the piece through legal means?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Chris Moran, the Guardian’s head of editorial innovation:</p>
<blockquote>
<p>Last month one of our journalists received an interesting email. A researcher had come across mention of a Guardian
article, written by the journalist on a specific subject from a few years before. But the piece was proving elusive on
our website and in search. Had the headline perhaps been changed since it was launched? Had it been removed
intentionally from the website because of a problem we’d identified? Or had we been forced to take it down by the
subject of the piece through legal means?</p></blockquote>
<blockquote>
<p>The reporter couldn’t remember writing the specific piece, but the headline certainly sounded like something they
would have written. It was a subject they were identified with and had a record of covering. Worried that there may
have been some mistake at our end, they asked colleagues to go back through our systems to track it down. Despite the
detailed records we keep of all our content, and especially around deletions or legal issues, they could find no trace
of its existence.</p></blockquote>
<blockquote>
<p>Why? Because it had never been written.</p></blockquote>
<p>More <a href="https://www.theguardian.com/commentisfree/2023/apr/06/ai-chatgpt-guardian-technology-risks-fake-article">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica for .NET v3.4.7</title>
      <link>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.4.7/</link>
      <pubDate>Wed, 05 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.4.7/</guid>
      <description>&lt;p&gt;Fattura Elettronica for .NET v3.4.7 was &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronica/3.4.7&#34;&gt;released&lt;/a&gt; on NuGet today. The &lt;a href=&#34;https://fatturaelettronicaopensource.org&#34;&gt;Fattura Elettronica project&lt;/a&gt; allows for
the validation and de/serialization of electronic invoices adhering to the canon defined by the Italian Revenue Agency.&lt;/p&gt;
&lt;p&gt;This release refines how the one-cent tolerance is accounted for in validation checks of types 00421 and 00423. As is
often the case, there are subtle differences between the theoretical implementation defined in the official specs and
the actual validation implemented by the same Agency that released said specs. See the &lt;a href=&#34;https://github.com/FatturaElettronica/FatturaElettronica.NET/issues/394&#34;&gt;relevant ticket&lt;/a&gt; for the
details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Fattura Elettronica for .NET v3.4.7 was <a href="https://www.nuget.org/packages/FatturaElettronica/3.4.7">released</a> on NuGet today. The <a href="https://fatturaelettronicaopensource.org">Fattura Elettronica project</a> allows for
the validation and de/serialization of electronic invoices adhering to the canon defined by the Italian Revenue Agency.</p>
<p>This release refines how the one-cent tolerance is accounted for in validation checks of types 00421 and 00423. As is
often the case, there are subtle differences between the theoretical implementation defined in the official specs and
the actual validation implemented by the same Agency that released said specs. See the <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET/issues/394">relevant ticket</a> for the
details.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Essere Lupo (Being Wolf)</title>
      <link>https://nicolaiarocci.com/book-review-essere-lupo-being-wolf/</link>
      <pubDate>Mon, 03 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-essere-lupo-being-wolf/</guid>
      <description>&lt;p&gt;I saw a wolf: that&amp;rsquo;s the phrase Ulf, a hunter and former forestry inspector now in his seventies, has been brooding,
unable to confess to anyone since he spotted a majestic specimen at dawn on the first day of the year. Something clicks
inside him, and Ulf, one of the most respected men in the village in deep Sweden where he lives, feels an increasingly
solid and intimate connection with the creature. They both are hunters and loners, but why does he feel like an
intruder? Even the memory of his early experiences in the woods with his father, once a source of joy, changes in
flavor, just as pride in his hunting diaries fades, as they now only appear as a cold kill list. And his wife&amp;rsquo;s dry and
practical empathy, their comfortable daily routine of love and habits, the faithful companionship of his dog Zenta and
the many chases made with her in the snow are not enough: Ulf feels as lost among his stuffed trophies as among the
traditions and customs of a community whose violence he now perceives. A society that, he will discover to his cost, is
quick at oppressing when one is not aligned with its most deeply rooted values.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I saw a wolf: that&rsquo;s the phrase Ulf, a hunter and former forestry inspector now in his seventies, has been brooding,
unable to confess to anyone since he spotted a majestic specimen at dawn on the first day of the year. Something clicks
inside him, and Ulf, one of the most respected men in the village in deep Sweden where he lives, feels an increasingly
solid and intimate connection with the creature. They both are hunters and loners, but why does he feel like an
intruder? Even the memory of his early experiences in the woods with his father, once a source of joy, changes in
flavor, just as pride in his hunting diaries fades, as they now only appear as a cold kill list. And his wife&rsquo;s dry and
practical empathy, their comfortable daily routine of love and habits, the faithful companionship of his dog Zenta and
the many chases made with her in the snow are not enough: Ulf feels as lost among his stuffed trophies as among the
traditions and customs of a community whose violence he now perceives. A society that, he will discover to his cost, is
quick at oppressing when one is not aligned with its most deeply rooted values.</p>
<p><img alt="Being Wolf" loading="lazy" src="/images/being-wolf.jpeg#right">
The tension of the stakeouts, the contemplation of the woods in the long waits, the excitement of a trail to follow, the
scents and sounds of a wilderness where everyone is alone in front of himself: <em>Being Wolf</em> tells of a predator in
harmony with his world and of the human who, inspired by it,  questions and rethinks his place in nature. I found two
other themes well addressed: the hate and malice that often lurk beneath the surface of small, seemingly idyllic
communities and the comfort and serenity that a relationship of mutual trust, respect and love offers to aged partners
who stubbornly insist on loving and respect each other despite adversity, misunderstanding and betrayal.</p>
<p>This novel has yet to see an English edition, so as for the English title, I made it up from Essere Lupo of the Italian
edition. These quick notes offer me a chance to express my gratitude to Iperborea for their incredible work in
publishing so many exceptionally translated Northen-Europe works over the years.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Playing D&amp;D with ChatGPT as the DM</title>
      <link>https://nicolaiarocci.com/playing-dnd-with-chatgpt-as-the-dm/</link>
      <pubDate>Mon, 03 Apr 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/playing-dnd-with-chatgpt-as-the-dm/</guid>
      <description>&lt;p&gt;A dad reunites with his three kids, ages 26, 23 and 15, and they decide to do a D&amp;amp;D campaign together. Now, this alone
would be enough to catch my attention: I&amp;rsquo;ve been an avid D&amp;amp;D player as a boy, my older son has been playing too, and I
always dreamed of playing one day with my three kids and maybe my wife. But there&amp;rsquo;s more to this story. Tenzin, the
youngest son and long-time tabletop RPG gamer and DM, proposes to let OpenAI&amp;rsquo;s ChatGPT 4 be their DM.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A dad reunites with his three kids, ages 26, 23 and 15, and they decide to do a D&amp;D campaign together. Now, this alone
would be enough to catch my attention: I&rsquo;ve been an avid D&amp;D player as a boy, my older son has been playing too, and I
always dreamed of playing one day with my three kids and maybe my wife. But there&rsquo;s more to this story. Tenzin, the
youngest son and long-time tabletop RPG gamer and DM, proposes to let OpenAI&rsquo;s ChatGPT 4 be their DM.</p>
<blockquote>
<p>I feel like the transcript speaks for itself, but before reproducing it I will state for the historical record that my
mind is still exploding from from all the inevitable innovation and legal controversies this kind of usage of LLM
(Large Language Model) technologies will provoke in the coming months and years. Software development for this kind of
use case will never be the same again.</p></blockquote>
<p>The whole gaming session&rsquo;s transcript is available <a href="https://obie.medium.com/my-kids-and-i-just-played-d-d-with-chatgpt4-as-the-dm-43258e72b2c6">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Running .NET code in an isolated sandbox</title>
      <link>https://nicolaiarocci.com/running-dotnet-code-in-an-isolated-sandbox/</link>
      <pubDate>Thu, 23 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/running-dotnet-code-in-an-isolated-sandbox/</guid>
      <description>&lt;p&gt;Steve Sanderson is experimenting &lt;a href=&#34;https://nicolaiarocci.com/a-quick-preview-of-the-blazor-united-prototype-for-.net8/&#34;&gt;again&lt;/a&gt;, and when Steve plays with his toys, I pay attention. In a new video on his
YouTube channel, Steve introduces an experimental new .NET package that allows the creation of isolated instances of the
.NET runtime that will safely run code in a sandbox.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Steve Sanderson is experimenting <a href="/a-quick-preview-of-the-blazor-united-prototype-for-.net8/">again</a>, and when Steve plays with his toys, I pay attention. In a new video on his
YouTube channel, Steve introduces an experimental new .NET package that allows the creation of isolated instances of the
.NET runtime that will safely run code in a sandbox.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Web Performance meetup at DevRomagna</title>
      <link>https://nicolaiarocci.com/web-performance-meetup-at-devromagna/</link>
      <pubDate>Wed, 22 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/web-performance-meetup-at-devromagna/</guid>
      <description>&lt;p&gt;I know this is coming in a bit late; apologies, but&amp;hellip; We&amp;rsquo;re doing a Web Performance meetup at &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/events/291862771/&#34;&gt;DevRomagna&lt;/a&gt; today. Andrea
&amp;lsquo;Verlok&amp;rsquo; Verlicchi, a Google Developer Expert specialing in web performance, will share his extensive experience in web
performance and provide practical, high-impact, and easily applicable tips on improving performance in 2023.&lt;/p&gt;
&lt;p&gt;Info and signup &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/events/291862771/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I know this is coming in a bit late; apologies, but&hellip; We&rsquo;re doing a Web Performance meetup at <a href="https://www.meetup.com/it-IT/devromagna/events/291862771/">DevRomagna</a> today. Andrea
&lsquo;Verlok&rsquo; Verlicchi, a Google Developer Expert specialing in web performance, will share his extensive experience in web
performance and provide practical, high-impact, and easily applicable tips on improving performance in 2023.</p>
<p>Info and signup <a href="https://www.meetup.com/it-IT/devromagna/events/291862771/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting John Carmack</title>
      <link>https://nicolaiarocci.com/quoting-john-carmack/</link>
      <pubDate>Mon, 20 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-john-carmack/</guid>
      <description>&lt;p&gt;John Carmack, while advising on the advent of AI and its influence on the Software Engineering profession:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Software is just a tool to help accomplish something for people &amp;ndash; many programmers never understood that. Keep your
eyes on the delivered value, and don&amp;rsquo;t over-focus on the specifics of the tools.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I have often fallen into the over-focusing trap in my career. The whole thread is well worth reading:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Quoting John Carmack&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/quoting-john-carmack.jpg&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>John Carmack, while advising on the advent of AI and its influence on the Software Engineering profession:</p>
<blockquote>
<p>Software is just a tool to help accomplish something for people &ndash; many programmers never understood that. Keep your
eyes on the delivered value, and don&rsquo;t over-focus on the specifics of the tools.</p></blockquote>
<p>I have often fallen into the over-focusing trap in my career. The whole thread is well worth reading:</p>
<p><img alt="Quoting John Carmack" loading="lazy" src="/images/quoting-john-carmack.jpg"></p>
<p>(<a href="https://twitter.com/ID_AA_Carmack/status/1637087219591659520"><em>via</em></a>)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Italo Calvino</title>
      <link>https://nicolaiarocci.com/quoting-italo-calvino/</link>
      <pubDate>Fri, 17 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-italo-calvino/</guid>
      <description>&lt;p&gt;Quoting the last paragraph from Italo Calvino&amp;rsquo;s &lt;em&gt;Invisible Cities&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The inferno of the living is not something that will be; if there is one, it is what is already here, the inferno where we live every day, that we form by being together. There are two ways to escape suffering it. The first is easy for many: accept the inferno and become such a part of it that you can no longer see it. The second is risky and demands constant vigilance and apprehension: seek and learn to recognize who and what, in the midst of inferno, are not inferno, then make them endure, give them space.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quoting the last paragraph from Italo Calvino&rsquo;s <em>Invisible Cities</em>:</p>
<blockquote>
<p>The inferno of the living is not something that will be; if there is one, it is what is already here, the inferno where we live every day, that we form by being together. There are two ways to escape suffering it. The first is easy for many: accept the inferno and become such a part of it that you can no longer see it. The second is risky and demands constant vigilance and apprehension: seek and learn to recognize who and what, in the midst of inferno, are not inferno, then make them endure, give them space.</p></blockquote>
<p>My <em>Invisible Cities</em> review is available <a href="/book-review-invisible-cities/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: No Sleep Till Shengal</title>
      <link>https://nicolaiarocci.com/book-review-no-sleep-till-shengal/</link>
      <pubDate>Wed, 15 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-no-sleep-till-shengal/</guid>
      <description>&lt;p&gt;Zerocalcare is an Italian cartoonist whose strips, especially in the form of illustrated books, have surged to an iconic
level in the last decade. His drawing is excellent, but it is with his writing that, I think, he conquered fame. His
stories are fun to read and yet profound and vibrant, all at the same time. Also, he often touches on themes nobody else
covers, at least not in the comics world. It was the case with &lt;em&gt;Kobane Calling: Greetings from Northern Syria&lt;/em&gt;, his
graphic reportage from Syrian Kurdistan and the Syria-Turkey border. The author visited the area with other volunteers
to support the Kurdish resistance. I think &lt;em&gt;Kobane Calling&lt;/em&gt; did a lot in raising awareness of the Kurdish situation, at
least here in Italy (an English edition was published too.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Zerocalcare is an Italian cartoonist whose strips, especially in the form of illustrated books, have surged to an iconic
level in the last decade. His drawing is excellent, but it is with his writing that, I think, he conquered fame. His
stories are fun to read and yet profound and vibrant, all at the same time. Also, he often touches on themes nobody else
covers, at least not in the comics world. It was the case with <em>Kobane Calling: Greetings from Northern Syria</em>, his
graphic reportage from Syrian Kurdistan and the Syria-Turkey border. The author visited the area with other volunteers
to support the Kurdish resistance. I think <em>Kobane Calling</em> did a lot in raising awareness of the Kurdish situation, at
least here in Italy (an English edition was published too.)</p>
<p><img alt="No Sleep Till Shengal" loading="lazy" src="/images/no-sleep-till-shengal.jpg#right">
<em>No Sleep Till Shengal</em> recounts the author&rsquo;s return to Iraq, this time to visit the Yazidi community of Shengal and
document their living conditions and struggle as they are threatened by international tensions and protected by Kurdish
militias. <em>No Sleep Till Shengal</em> is a good book. Like his predecessor, it is humorous yet tense and touching. I felt like
something was amiss in this work, though, and I am not exactly sure what. There are a couple of repetitive passages,
perhaps a sign that the author needed to fill in the blanks, having less fresh content at hand. Maybe there&rsquo;s a slight
Deja Vu sensation induced by the previous work; I don&rsquo;t know. <em>No Sleep</em> is a solid second work on an already visited
theme. My affection for Zerocalcare is intact, but I&rsquo;d pick <em>Kobane Calling</em> over <em>No Sleep</em>, especially for a first
reading of this author.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.1.0 has just been released</title>
      <link>https://nicolaiarocci.com/eve-2.1.0-has-just-been-released/</link>
      <pubDate>Tue, 14 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.1.0-has-just-been-released/</guid>
      <description>&lt;p&gt;Today I released Eve v2.1, which comes with official Flask 2.2+ support and the ability to modify the pagination limit
on a per-resource basis thanks to the new &lt;code&gt;pagination_limit&lt;/code&gt; setting. You can find the release on &lt;a href=&#34;https://pypi.org/project/Eve/2.1.0/&#34;&gt;PyPI&lt;/a&gt;,
while the changelog is available &lt;a href=&#34;https://docs.python-eve.org/en/stable/changelog.html#version-v2-1-0&#34;&gt;here&lt;/a&gt;—special thanks to &lt;a href=&#34;https://github.com/thepieterdc&#34;&gt;Pieter De Clercq&lt;/a&gt; and &lt;a href=&#34;https://github.com/smeng9&#34;&gt;smeng9&lt;/a&gt; for the help with this release.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Eve 2.1.0 on PyPI&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/eve-2.1.0.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released Eve v2.1, which comes with official Flask 2.2+ support and the ability to modify the pagination limit
on a per-resource basis thanks to the new <code>pagination_limit</code> setting. You can find the release on <a href="https://pypi.org/project/Eve/2.1.0/">PyPI</a>,
while the changelog is available <a href="https://docs.python-eve.org/en/stable/changelog.html#version-v2-1-0">here</a>—special thanks to <a href="https://github.com/thepieterdc">Pieter De Clercq</a> and <a href="https://github.com/smeng9">smeng9</a> for the help with this release.</p>
<p><img alt="Eve 2.1.0 on PyPI" loading="lazy" src="/images/eve-2.1.0.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>I am speaking at WebDay 2023</title>
      <link>https://nicolaiarocci.com/i-am-speaking-at-webday-2023/</link>
      <pubDate>Mon, 13 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-speaking-at-webday-2023/</guid>
      <description>&lt;p&gt;On Thursday, I will be speaking in Milan at &lt;a href=&#34;https://www.webdayconf.it/&#34;&gt;WebDay 2023&lt;/a&gt;. Mine is a hands-on session on building a reliable and
continuous end-to-end testing environment for web apps using Microsoft Playwright. If you attended my &lt;a href=&#34;https://nicolaiarocci.com/my-session-at-wpc-2022/&#34;&gt;introductory
Playwright session at WPC&lt;/a&gt; last year, Thursday&amp;rsquo;s session would be the ideal follow-up to that one, as I
only briefly touched on CI deployments there.&lt;/p&gt;
&lt;p&gt;Drawing from my experience doing the whole thing in production, I&amp;rsquo;ll essentially be live testing a Blazor app, then take
the entire thing to remote CI via GitHub Actions. In the process, I&amp;rsquo;ll show some of the issues we faced, share how we
solved them, and offer some practices we adopted.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On Thursday, I will be speaking in Milan at <a href="https://www.webdayconf.it/">WebDay 2023</a>. Mine is a hands-on session on building a reliable and
continuous end-to-end testing environment for web apps using Microsoft Playwright. If you attended my <a href="https://nicolaiarocci.com/my-session-at-wpc-2022/">introductory
Playwright session at WPC</a> last year, Thursday&rsquo;s session would be the ideal follow-up to that one, as I
only briefly touched on CI deployments there.</p>
<p>Drawing from my experience doing the whole thing in production, I&rsquo;ll essentially be live testing a Blazor app, then take
the entire thing to remote CI via GitHub Actions. In the process, I&rsquo;ll show some of the issues we faced, share how we
solved them, and offer some practices we adopted.</p>
<p>WebDay 2023 will be a hybrid event, with over 380 in-person attendees and almost 1300 registered for live streaming.
After the exhilarating experience of being back on an actual stage at WPC a few months ago, I&rsquo;m excited to speak once
again in front of a real crowd.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Making C# and OmniSharp play well with Neovim</title>
      <link>https://nicolaiarocci.com/making-csharp-and-omnisharp-play-well-with-neovim/</link>
      <pubDate>Fri, 03 Mar 2023 08:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/making-csharp-and-omnisharp-play-well-with-neovim/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently moved away from my custom Neovim configuration to embrace &lt;a href=&#34;https://www.lazyvim.org/&#34;&gt;LazyVim&lt;/a&gt;. LazyVim is a Neovim setup with sane
default settings for options, autocmds, and keymaps. It boldly aims to transform Neovim into a full-fledged IDE that is
easy to extend and customize. It comes with a wealth of plugins pre-configured and ready to use, and it is also blazing
fast. Elijah Manor has a fantastic introductory video on YouTube; I suggest you take the time to look at it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve recently moved away from my custom Neovim configuration to embrace <a href="https://www.lazyvim.org/">LazyVim</a>. LazyVim is a Neovim setup with sane
default settings for options, autocmds, and keymaps. It boldly aims to transform Neovim into a full-fledged IDE that is
easy to extend and customize. It comes with a wealth of plugins pre-configured and ready to use, and it is also blazing
fast. Elijah Manor has a fantastic introductory video on YouTube; I suggest you take the time to look at it.</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/N93cTbtLCIM?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<!-- raw HTML omitted -->
So far I&rsquo;m delighted with the result. In the process, I learned about several useful plugins I now use regularly.</p>
<h3 id="neovim-trouble-with-c-and-omnisharp">Neovim trouble with C# and OmniSharp</h3>
<p>When I upgraded my old-<em>ish</em> Neovim (I am using nightly builds now), I started getting a weird error on every <code>.cs</code> file
I loaded:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Error executing vim.schedule lua callbaack: /usr/share/[...]/semantic_tokens.lua:342:E5248: Invalid character in group name.
</span></span></code></pre></div><p>A little investigation revealed that semantic tokens provided by
OmniSharp don&rsquo;t conform to the LSP specification, which triggers the error. I cloned the <em>omnisharp-roslyn</em> repo and dug
into the code hoping I could offer a quick fix. As it turns out, however, the issue is actually with <a href="https://github.com/dotnet/roslyn/blob/3cca4fdc3b125995bfd32b3a02b5d5c2d2b82504/src/Workspaces/Core/Portable/Classification/ClassificationTypeNames.cs#L97">Roslyn
itself</a>, not OmniSharp. There are tickets on both the <a href="https://github.com/neovim/neovim/issues/21391">Neovim</a> and the <a href="https://github.com/OmniSharp/omnisharp-roslyn/issues/2483">OmniSharp</a> repositories, but I fear
they&rsquo;ll stagnate there as non-relevant (<em>note to self</em>: maybe report the problem to the Roslyn folks? Alternatively,
propose a patched semantic provider to the <em>omnisharp-roslyn</em> maintainers.)</p>
<p>Anyway, a quick, hacky, and not future-proof fix is to customize Neovim (LazyVim) configuration like this:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>-- ~/.config/nvim/lua/plugins/omnisharp.lua (create <span style="font-weight:bold">if</span> needed)
</span></span><span style="display:flex;"><span><span style="font-weight:bold">return</span> {
</span></span><span style="display:flex;"><span>  <span style="font-style:italic">&#34;OmniSharp/omnisharp-vim&#34;</span>,
</span></span><span style="display:flex;"><span>  init = function()
</span></span><span style="display:flex;"><span>    require(<span style="font-style:italic">&#34;lazyvim.util&#34;</span>).on_attach(function(client, _)
</span></span><span style="display:flex;"><span>      <span style="font-weight:bold">if</span> client.name == <span style="font-style:italic">&#34;omnisharp&#34;</span> then
</span></span><span style="display:flex;"><span>        client.server_capabilities.semanticTokensProvider = {
</span></span><span style="display:flex;"><span>          full = vim.empty_dict(),
</span></span><span style="display:flex;"><span>          legend = {
</span></span><span style="display:flex;"><span>            tokenModifiers = { <span style="font-style:italic">&#34;static_symbol&#34;</span> },
</span></span><span style="display:flex;"><span>            tokenTypes = {
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;comment&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;excluded_code&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;identifier&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;keyword&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;keyword_control&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;number&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;operator&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;operator_overloaded&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;preprocessor_keyword&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;string&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;whitespace&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;text&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;static_symbol&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;preprocessor_text&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;punctuation&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;string_verbatim&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;string_escape_character&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;class_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;delegate_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;enum_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;interface_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;module_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;struct_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;type_parameter_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;field_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;enum_member_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;constant_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;local_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;parameter_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;method_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;extension_method_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;property_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;event_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;namespace_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;label_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_attribute_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_attribute_quotes&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_attribute_value&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_cdata_section&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_comment&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_delimiter&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_entity_reference&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_processing_instruction&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_doc_comment_text&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_attribute_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_attribute_quotes&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_attribute_value&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_cdata_section&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_comment&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_delimiter&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_embedded_expression&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_entity_reference&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_name&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_processing_instruction&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;xml_literal_text&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_comment&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_character_class&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_anchor&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_quantifier&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_grouping&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_alternation&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_text&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_self_escaped_character&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="font-style:italic">&#34;regex_other_escape&#34;</span>,
</span></span><span style="display:flex;"><span>            },
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>          range = true,
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>      end
</span></span><span style="display:flex;"><span>    end)
</span></span><span style="display:flex;"><span>  end,
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>It overrides the <code>on_attach</code> event to pass an LSP-digestible list of semantic tokens. And voilà, C# files are now loaded seamlessly.</p>
<p>I&rsquo;m not done yet. I&rsquo;m having another <a href="https://github.com/OmniSharp/omnisharp-roslyn/issues/2510">weird issue</a> with <em>.editorconfig</em> files. I&rsquo;m still triaging it, and will report back when (if) I sort it out.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Red Mars</title>
      <link>https://nicolaiarocci.com/book-review-red-mars/</link>
      <pubDate>Thu, 02 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-red-mars/</guid>
      <description>&lt;p&gt;Regarding space-related topics and scientific research, &lt;a href=&#34;https://caseyhandmer.wordpress.com/&#34;&gt;Casey Handmer&amp;rsquo;s blog&lt;/a&gt; is one of my references. So when Casey
started his &lt;a href=&#34;https://caseyhandmer.wordpress.com/2022/12/13/mars-trilogy-technical-commentary/&#34;&gt;Mars Trilogy Technical Commentary&lt;/a&gt; and I learned about Kim Stanley Robinson&amp;rsquo;s masterpiece, I was
instantly intrigued. In Casey&amp;rsquo;s opinion, KSR&amp;rsquo;s &lt;a href=&#34;https://en.wikipedia.org/wiki/Mars_trilogy&#34;&gt;Mars Trilogy&lt;/a&gt; is &amp;ldquo;one of the finest works of literature ever
composed.&amp;rdquo; It took a couple of weeks of futile resistance before I gave in and ordered the first book in the series, &lt;em&gt;Red
Mars&lt;/em&gt;, a 420 pages tome that attempts to depict a scientifically credible human colonization of Mars&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Regarding space-related topics and scientific research, <a href="https://caseyhandmer.wordpress.com/">Casey Handmer&rsquo;s blog</a> is one of my references. So when Casey
started his <a href="https://caseyhandmer.wordpress.com/2022/12/13/mars-trilogy-technical-commentary/">Mars Trilogy Technical Commentary</a> and I learned about Kim Stanley Robinson&rsquo;s masterpiece, I was
instantly intrigued. In Casey&rsquo;s opinion, KSR&rsquo;s <a href="https://en.wikipedia.org/wiki/Mars_trilogy">Mars Trilogy</a> is &ldquo;one of the finest works of literature ever
composed.&rdquo; It took a couple of weeks of futile resistance before I gave in and ordered the first book in the series, <em>Red
Mars</em>, a 420 pages tome that attempts to depict a scientifically credible human colonization of Mars<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>An incredible amount of research went into this book, and it shows. Still, there&rsquo;s never an overabundance of scientific
or nerdy details; quite the contrary, to be honest, and, at least to me, this is one of the book&rsquo;s weaknesses. It&rsquo;s
astonishing how pivotal moments in establishing the first human colony on the Red Planet are glossed over. One hundred
of Earth&rsquo;s best scientists travel to Mars to create the first human settlement. During their richly narrated, almost
two-year-long voyage, we get to know the main characters and learn the ins and outs of the first colonial spaceship.
Yet, when they finally reach the orbit, the reader is left with no clues on the undoubtedly dramatic first landing. The
settlement is already established in the next chapter, with a second one already in place on Phobos&rsquo; surface.</p>
<p><img alt="Red Mars" loading="lazy" src="/images/red-mars.jpg#right">
Omitting details such as the first landing is undoubtedly an editorial choice. Given the time scope of the narrated
adventure (by the end of the trilogy, it will span a few centuries), it probably makes sense, but I couldn&rsquo;t help but
feel betrayed in some way. The story is more about how humans could establish a society and cultural identity in a
remote colony, how such a community develops over time, and, more importantly, how and why conflicts emerge with the
distant home first and within the settlement itself later on. While reading, I often thought, &lsquo;Hey, this all reminds me
of the  American colonization!&rsquo; and then, &lsquo;I wonder how much percolated into S.A. Corey&rsquo;s <em>The Expanse</em>,&rsquo; terraforming
and Earth-Mars trouble playing prominent roles in both series. In many ways, and I know I am making enemies now, <em>Red
Mars</em> could have served well as a prequel to <em>The Expanse</em><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>One thing I found confusing at first but later came to appreciate is that the story isn&rsquo;t told from a single person&rsquo;s
perspective. Instead, it sprawls across an extensive cast of characters as it expands over time. Viewpoints shift from
one character to another, and people we thought we understood suddenly seem strange and different when seen through
someone else&rsquo;s eyes. The Mars society is messy, very human, and often petty, with few clear answers and no simple
solutions. In <em>Red Mars</em>, we don&rsquo;t get an optimistic portrayal of the future of human society. Here, <em>Star Trek</em>&rsquo;s
pacified civilization and the idealistic United Federation of Planets are far away to come, if ever.</p>
<p>Overall, I liked this book, probably a lot, but I don&rsquo;t think I will read the next installments in the series, at least
not right away. Maybe in a while, when Mars dust has settled.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>Red Mars</em> was first published in 1992. That&rsquo;s something to be considered when evaluating it. Also, some details tenderly show its age, like when characters look at &lsquo;videotapes&rsquo; recorded by remote satellites and surface cameras.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><em>Disclaimer</em>: I never read <em>The Expanse</em>; I only watched and loved the TV show. So yeah, I don&rsquo;t qualify for an informed opinion on that franchise, let alone compare it with another one.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[m]: <a href="https://fosstodon.org/@nicola">https://fosstodon.org/@nicola</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Hand dryers</title>
      <link>https://nicolaiarocci.com/hand-dryers/</link>
      <pubDate>Tue, 28 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/hand-dryers/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;It seems like hand dryers take forever to heat up, but that&amp;rsquo;s because evaporation cools your skin, so the hot air feels good until the water is gone.&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/hand-dryers.png&#34;&gt;
&lt;em&gt;&lt;a href=&#34;https://botsin.space/@xkcdbot/109937567703546899&#34;&gt;via&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="It seems like hand dryers take forever to heat up, but that&rsquo;s because evaporation cools your skin, so the hot air feels good until the water is gone." loading="lazy" src="/images/hand-dryers.png">
<em><a href="https://botsin.space/@xkcdbot/109937567703546899">via</a></em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Leiji Matsumoto (1938-2023)</title>
      <link>https://nicolaiarocci.com/leiji-matsumoto-1938-2023/</link>
      <pubDate>Fri, 24 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/leiji-matsumoto-1938-2023/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Leiji Matsumoto&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/leiji-matsumoto.jpg#right&#34;&gt;
On February 13, 2023, about ten days ago, [Leiji Matsumoto][3] left this world.
A phenomenal Japanese manga artist, he created several space operas that
influenced me as a kid. Matsumoto directed &lt;em&gt;Space Battleship Yamato&lt;/em&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, wrote
and illustrated &lt;em&gt;Galaxy Express 999&lt;/em&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, and then released the magnificent
&lt;em&gt;Space Pirate Captain Harlock&lt;/em&gt;. Regarding visual operas, I suspect my
fascination with space, astronomy and all things science has much more to do
with these three than with the Star Wars movies that came later, or Star Trek.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="Leiji Matsumoto" loading="lazy" src="/images/leiji-matsumoto.jpg#right">
On February 13, 2023, about ten days ago, [Leiji Matsumoto][3] left this world.
A phenomenal Japanese manga artist, he created several space operas that
influenced me as a kid. Matsumoto directed <em>Space Battleship Yamato</em><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, wrote
and illustrated <em>Galaxy Express 999</em><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, and then released the magnificent
<em>Space Pirate Captain Harlock</em>. Regarding visual operas, I suspect my
fascination with space, astronomy and all things science has much more to do
with these three than with the Star Wars movies that came later, or Star Trek.</p>
<p>What I did not know until the other day, however, is that Matsumoto worked with
Daft Punk. In 2001, the artist and his studio produced all the videos for Daft
Punk&rsquo;s <em>Discovery</em> album. I distinctly remember watching the <em>One More Time</em>
video and being blown away. It was fantastic and also fascinating in a strange
way, but I couldn&rsquo;t pinpoint the reason. Now I understand. I didn&rsquo;t make the
connection back then, but Matsumoto&rsquo;s touch immediately drew me back to my
childhood fantasies, themselves sprouting from the artist&rsquo;s animes.</p>
<p>In 2003, Toei Animation released <em>Interstella 5555</em>, an &ldquo;animated musical
science fiction film&rdquo; and a visual companion to the <em>Discovery</em> album. It has
no dialogue, minimal sound effects, and all (most?) of <em>Discovery</em>&rsquo;s music. I
watched it this morning and loved every moment of it.</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TvMzyewwf5A?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<!-- raw HTML omitted --></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>Space Battleship Yamato</em> was influential in the creation of many future series such as <em>Gundam</em>, <em>Evangelioon</em>, and <em>Macross</em>.
[3]: <a href="https://en.wikipedia.org/wiki/Leiji_Matsumoto">https://en.wikipedia.org/wiki/Leiji_Matsumoto</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[m]: <a href="https://fosstodon.org/@nicola">https://fosstodon.org/@nicola</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Matsumoto was inspired to create <em>Galaxy Express 999</em> by the idea of a steam train running through the stars in the novel <em>Night on the Galactic Railroad</em> by Kenji Miyazawa.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Awesome psql tips</title>
      <link>https://nicolaiarocci.com/awesome-psql-tips/</link>
      <pubDate>Thu, 23 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/awesome-psql-tips/</guid>
      <description>&lt;p&gt;Today I learned about &lt;a href=&#34;https://psql-tips.org&#34;&gt;psql-tips.org&lt;/a&gt; by Lætitia Avrot, an excellent
repository of &lt;code&gt;psql&lt;/code&gt; (the CLI tool, not the database itself) tips. I like how
one randomized tip is playfully served on the home page while the &lt;a href=&#34;https://psql-tips.org/psql_tips_all.html&#34;&gt;complete
list&lt;/a&gt; is always at hand.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned about <a href="https://psql-tips.org">psql-tips.org</a> by Lætitia Avrot, an excellent
repository of <code>psql</code> (the CLI tool, not the database itself) tips. I like how
one randomized tip is playfully served on the home page while the <a href="https://psql-tips.org/psql_tips_all.html">complete
list</a> is always at hand.</p>
]]></content:encoded>
    </item>
    <item>
      <title>On the state of developer conferences</title>
      <link>https://nicolaiarocci.com/on-the-state-of-developer-conferences/</link>
      <pubDate>Thu, 23 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-the-state-of-developer-conferences/</guid>
      <description>&lt;p&gt;Brian Rinaldi has an insightful post on &lt;a href=&#34;https://remotesynthesis.com/blog/developer-conferences/&#34;&gt;his blog&lt;/a&gt; about the current state of
developer conferences, where &amp;lsquo;current state&amp;rsquo; means post-COVID pandemic. Brian
is well-positioned to reason about this space as a long-time conference
organizer. I appreciate that he also takes the time to explain how the
developer conference business works. The core of his blog is about
post-pandemic conference attendance, which has plunged.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;independent, in-person developer conferences are hurting. Based on my own
observation as well as talks with organizers and sponsors that I have come to
know over the years, the average independent in-person event is still down
30-40% from pre-pandemic attendance levels. And often it seems to require
massive discounts or even giveaways to get to this level.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Brian Rinaldi has an insightful post on <a href="https://remotesynthesis.com/blog/developer-conferences/">his blog</a> about the current state of
developer conferences, where &lsquo;current state&rsquo; means post-COVID pandemic. Brian
is well-positioned to reason about this space as a long-time conference
organizer. I appreciate that he also takes the time to explain how the
developer conference business works. The core of his blog is about
post-pandemic conference attendance, which has plunged.</p>
<blockquote>
<p>independent, in-person developer conferences are hurting. Based on my own
observation as well as talks with organizers and sponsors that I have come to
know over the years, the average independent in-person event is still down
30-40% from pre-pandemic attendance levels. And often it seems to require
massive discounts or even giveaways to get to this level.</p></blockquote>
<p>And he offers an interesting theory on why that is:</p>
<blockquote>
<p>My hypothesis is that we’ve bifurcated the audience somewhat. The folks that
were there almost exclusively for the content have decided that they can do
so more cheaply and efficiently online via virtual conferences or recordings.
The folks that went for the networking as a primary driver, on the other
hand, are largely eschewing online events as not fulfilling their needs.
[&hellip;] So ultimately what we are left with is a lower in-person audience and a
lower virtual audience.</p></blockquote>
<p>As a conference speaker and meetup organizer, I noticed that online events saw
low attendance during the pandemic, and they still do today. When available,
recordings partially compensate, but only in audience terms. The problem is
online events are not conferences. &lsquo;Conference&rsquo; originates from the late Latin
&ldquo;conferentia,&rdquo; itself a derivative of &ldquo;conferre,&rdquo; a synonym for the collation
of &ldquo;bring together&rdquo;<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. A conference is a meeting to discuss some topics. The
get-together element is missing in online events, and networking is next to
impossible (live chats and &lsquo;virtual after-parties&rsquo; are just poor palliatives.)
In my book, hybrid events are even worse, as live streaming and recordings
discourage live attendance (at the <a href="https://www.meetup.com/it-IT/DevRomagna">DevRomagna meetups</a>, we often get asked
if live streaming or recordings will be available, and the answer is no -
either we do live streaming - and we sometimes do - or we do an in-person
event, but never a mix of the two.)</p>
<p>Going back to Brian&rsquo;s musings, I think I subscribe to them. I am not sure
attendance will ever get back to old numbers. I am afraid a good portion of
those who were regulars became disaffected, and gaining their attention back is
a hard gamble. YouTube and Twitch, I think, are phenomenal competitors, and the
pandemic hiatus threw a ton of fresh new viewers at them.</p>
<p>PS: Coincidentally, we&rsquo;re running an in-person meetup at DevRomagna <a href="https://nicolaiarocci.com/heading-to-go-a-look-at-building-a-video-encoder-meetup/">today</a>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>According to <a href="https://www.treccani.it/vocabolario/ricerca/conferenza/">Treccani</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[m]: <a href="https://fosstodon.org/@nicola">https://fosstodon.org/@nicola</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Sanguina Ancora (Still Bleeding)</title>
      <link>https://nicolaiarocci.com/book-review-sanguina-ancora-still-bleeding/</link>
      <pubDate>Fri, 17 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-sanguina-ancora-still-bleeding/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Book Cover: Sanguina Ancora, by Paolo Nori&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/book-cover-sanguina-ancora.jpg#right&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sanguina Ancora&lt;/em&gt; (Still Bleeding) is not a biography but a passionate and
informative tribute to Dostoevsky. The nonlinear, not literary style works and
the continuous back and forth between Dostoevsky&amp;rsquo;s epic and the author&amp;rsquo;s own
experiences as a scholar and Russian literature enthusiast is probably a good
idea as it helps stress the actualness of Dostoevsky&amp;rsquo;s opus.&lt;/p&gt;
&lt;p&gt;However, the continuous jumping in and out of the Russian&amp;rsquo;s life, though
sympathetic at first, gets tedious over time. While immersed in Dostoevsky&amp;rsquo;s
events, it is not always pleasant to be torn away only to end up in the Parma
lowlands for a few entertaining anecdotes (that these anecdotes tend to
gravitate around the author&amp;rsquo;s other works adds to the discomfort.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="Book Cover: Sanguina Ancora, by Paolo Nori" loading="lazy" src="/images/book-cover-sanguina-ancora.jpg#right"></p>
<p><em>Sanguina Ancora</em> (Still Bleeding) is not a biography but a passionate and
informative tribute to Dostoevsky. The nonlinear, not literary style works and
the continuous back and forth between Dostoevsky&rsquo;s epic and the author&rsquo;s own
experiences as a scholar and Russian literature enthusiast is probably a good
idea as it helps stress the actualness of Dostoevsky&rsquo;s opus.</p>
<p>However, the continuous jumping in and out of the Russian&rsquo;s life, though
sympathetic at first, gets tedious over time. While immersed in Dostoevsky&rsquo;s
events, it is not always pleasant to be torn away only to end up in the Parma
lowlands for a few entertaining anecdotes (that these anecdotes tend to
gravitate around the author&rsquo;s other works adds to the discomfort.)</p>
<p>That aside, the book contains precious information on Dostoevsky&rsquo;s life, opus,
Russian literature and society of the nineteenth century. Some random facts
from my reading notes:</p>
<ul>
<li>Dostoevsky&rsquo;s incredible tenacity in the face of early setbacks. The first
translation he worked on was aborted near the end, having discovered that the
novel had already been translated into Russian from French. The second was
published in a Russian magazine but heavily cut and, worse, without
attribution. Yet during all this time, he continued unceasingly, tirelessly,
fervently, day and night work what would become his first novel, <em>Poor Folk</em>
(an immediate hit.)</li>
<li>Writers in late 19th century Russia were astonishingly important. Tolstoy had
founded a kind of religious cult. Young people would gather in the evenings
to read Gogol. In those times, in Russia, writers were real stars.</li>
<li>Russian literature began with Pushkin. Before him, in the eighteenth century,
Russians who wrote did so by imitating the French and knew French better than
Russian, as did all the Russian nobles and educated people of the time.</li>
<li>Bulgakov, in <em>The Master and the Margarita</em><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, has one of his characters
say that Dostoevsky is immortal.</li>
<li>As great as the country is, there are no dialects in Russia. Also, Russian is
a spoken language first, and only then a written language (the Russian
alphabet has existed only since the 9th century, with Cyril and Methodius.)</li>
<li>Russians elected a monument to Arina, Pushkin&rsquo;s nanny who told him fairy
tales and made him love the language. She was illiterate.</li>
<li>Dostoevsky is arrested and sentenced to death for reading a letter aloud and
in public. With his comrades in his revolutionary circle, he undergoes a
false execution, an experience he will later give to the protagonist of <em>The
Idiot</em>. The five minutes the protagonist waits for the shooting is a
transcendental experience.</li>
<li>Lieutenant Frank Columbo, the protagonist of the famous TV show from
seventies, is inspired by Porfirij Petrovic, the detective from <em>Crime and
Punishment</em>.</li>
</ul>
<p>I&rsquo;ve got a lot of notes from this book, which is a good sign. Vasily Rizanov&rsquo;s
memorable quote on Dostoesky&rsquo;s writing, also reported in the book, is worth
mentioning:</p>
<blockquote>
<p>The miracle of Dostoevsky&rsquo;s writing lies in eliminating the distance between
the subject (the reader) and the object (the author), by virtue of which he
turns out to be the most familiar of all contemporary writers and, perhaps,
even of future writers, of all possible writers.</p></blockquote>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>One of my all-time favorites.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[m]: <a href="https://fosstodon.org/@nicola">https://fosstodon.org/@nicola</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting Solzhenitsyn</title>
      <link>https://nicolaiarocci.com/quoting-solzhenitsyn/</link>
      <pubDate>Thu, 16 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-solzhenitsyn/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The simple step of a courageous individual is not to take part in the lie.&lt;!-- raw HTML omitted --&gt;
&amp;ndash;Aleksandr Solzhenitsyn&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;Sepia-toned photo of Aleksandr Solzhenitsyn in middle age, hairline receeded, bearded, in an open-collar shirt, a tired expression on his face.&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/solzhenitsyn.jpg&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The simple step of a courageous individual is not to take part in the lie.<!-- raw HTML omitted -->
&ndash;Aleksandr Solzhenitsyn</p></blockquote>
<p><img alt="Sepia-toned photo of Aleksandr Solzhenitsyn in middle age, hairline receeded, bearded, in an open-collar shirt, a tired expression on his face." loading="lazy" src="/images/solzhenitsyn.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>The best time to own a domain</title>
      <link>https://nicolaiarocci.com/the-best-time-to-own-a-domain/</link>
      <pubDate>Thu, 09 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-best-time-to-own-a-domain/</guid>
      <description>&lt;p&gt;Jim Nielsen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That is why owning a domain (and publishing your content there) is like
planting a tree: it’s value that starts small and grows. The best time to own
a domain and publish your content there was 20 years ago. The second best
time is today.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More &lt;a href=&#34;https://blog.jim-nielsen.com/2023/best-time-to-own-a-domain/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jim Nielsen:</p>
<blockquote>
<p>That is why owning a domain (and publishing your content there) is like
planting a tree: it’s value that starts small and grows. The best time to own
a domain and publish your content there was 20 years ago. The second best
time is today.</p></blockquote>
<p>More <a href="https://blog.jim-nielsen.com/2023/best-time-to-own-a-domain/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Heading to Go: A Look at Building a Video Encoder (meetup)</title>
      <link>https://nicolaiarocci.com/heading-to-go-a-look-at-building-a-video-encoder-meetup/</link>
      <pubDate>Wed, 08 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/heading-to-go-a-look-at-building-a-video-encoder-meetup/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re doing a &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/events/291027334/&#34;&gt;DevRomagna meetup&lt;/a&gt; this month, and I think it will be a
super-interesting one. It&amp;rsquo;s titled &lt;em&gt;Heading to Go: A Look at Building a Video
Encoder&lt;/em&gt; and the presenter will be Daniel Enrico Botta, a C# software engineer
who recently switched to Go for his video encoding projects. Here&amp;rsquo;s the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This talk will discuss the experience of moving from C# to Go for a video
coding project. The pros and cons of using Go, a modern and efficient
programming language, and how it compares to other languages will be shown.
In addition, the use of FFmpeg, an open-source tool for video encoding, and
how it was used to create the video encoder will be discussed. Advice will be
given on using Go and Ffmpeg for future projects. Together, the benefits of
using these tools for video encoding will be understood.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We&rsquo;re doing a <a href="https://www.meetup.com/it-IT/devromagna/events/291027334/">DevRomagna meetup</a> this month, and I think it will be a
super-interesting one. It&rsquo;s titled <em>Heading to Go: A Look at Building a Video
Encoder</em> and the presenter will be Daniel Enrico Botta, a C# software engineer
who recently switched to Go for his video encoding projects. Here&rsquo;s the abstract:</p>
<blockquote>
<p>This talk will discuss the experience of moving from C# to Go for a video
coding project. The pros and cons of using Go, a modern and efficient
programming language, and how it compares to other languages will be shown.
In addition, the use of FFmpeg, an open-source tool for video encoding, and
how it was used to create the video encoder will be discussed. Advice will be
given on using Go and Ffmpeg for future projects. Together, the benefits of
using these tools for video encoding will be understood.</p></blockquote>
<p>Like me, Daniel has a C# background, so it will be interesting to see the whys
and hows he picked Golang for his video encoding work. I&rsquo;m curious about his
perspective on both languages and what he learned from adopting a new stack.
Leaving the safe path to adventure into unknown territory is a safe way to
broaden knowledge and improve self-confidence, or at least it was for me when I
added Python to my tool belt. In surprising and unexpected ways, most of the
new expertise also proved invaluable in my C# &amp; F# work.</p>
<p>The session will be held in person, in Italian. So if you&rsquo;re interested, j<a href="https://www.meetup.com/it-IT/devromagna/events/291027334/">oin us</a>!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Brad Mehldau plays I am the Walrus</title>
      <link>https://nicolaiarocci.com/brad-mehldau-plays-i-am-the-walrus/</link>
      <pubDate>Mon, 06 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/brad-mehldau-plays-i-am-the-walrus/</guid>
      <description>&lt;p&gt;Brad Mehldau plays Lennon/McCartney&amp;rsquo;&lt;em&gt;s I Am the Walrus&lt;/em&gt;, from his upcoming
album, &lt;em&gt;Your Mother Should Know: Brad Mehldau Plays the Beatles&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/lGvl6IdBJiA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Brad Mehldau plays Lennon/McCartney&rsquo;<em>s I Am the Walrus</em>, from his upcoming
album, <em>Your Mother Should Know: Brad Mehldau Plays the Beatles</em>.</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/lGvl6IdBJiA?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Making the latest C# language features available in older .NET versions</title>
      <link>https://nicolaiarocci.com/making-the-latest-csharp-language-features-available-in-older-dotnet-versions/</link>
      <pubDate>Sat, 04 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/making-the-latest-csharp-language-features-available-in-older-dotnet-versions/</guid>
      <description>&lt;p&gt;In a C# library I&amp;rsquo;ve been working on, I wanted to use C# 9.0&amp;rsquo;s &lt;code&gt;init&lt;/code&gt; keyword.
Quoting the &lt;a href=&#34;https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/init&#34;&gt;documentation&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The init keyword defines an accessor method in a property or indexer. An
init-only setter assigns a value to the property or the indexer element
&lt;strong&gt;only&lt;/strong&gt; during object construction. This enforces immutability so that once
the object is initialized, it can&amp;rsquo;t be changed again.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Consider the following class:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    public class Person
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        public string FirstName { get; init; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can initialize it like this:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In a C# library I&rsquo;ve been working on, I wanted to use C# 9.0&rsquo;s <code>init</code> keyword.
Quoting the <a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/init">documentation</a>:</p>
<blockquote>
<p>The init keyword defines an accessor method in a property or indexer. An
init-only setter assigns a value to the property or the indexer element
<strong>only</strong> during object construction. This enforces immutability so that once
the object is initialized, it can&rsquo;t be changed again.</p></blockquote>
<p>Consider the following class:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>    public class Person
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        public string FirstName { get; init; }
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>You can initialize it like this:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    <span style="font-weight:bold">var</span> person = new Person { FirstName = <span style="font-style:italic">&#34;John&#34;</span> };
</span></span></code></pre></div><p>But this will fail:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    <span style="font-weight:bold">var</span> person = new Person();
</span></span><span style="display:flex;"><span>    person.FirstName = <span style="font-style:italic">&#34;John&#34;</span>;  //Not allowed
</span></span></code></pre></div><p>For my project, which is a .NET Standard 2.0 library, I thought this approach
might be preferable to a parameter-enforced class constructor alternative.</p>
<p>To my surprise, however, when I tried the above, I got the following error:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>The predefined type &#39;System.Runtime.CompilerServices.IsExternalInit&#39; must be
</span></span><span style="display:flex;"><span>defined or imported in order to declare init-only setter
</span></span></code></pre></div><p>As it <a href="https://developercommunity.visualstudio.com/t/error-cs0518-predefined-type-systemruntimecompiler/1244809#TPIN-N1249582">turns out</a>, The <code>IsExternalInit</code> type is only included in the net5.0
(and subsequent) target frameworks, so one cannot use it right away in a
NetStandard 2.0 (or 2.1, for that matter) library.</p>
<p>In the dotnet world, when I encounter <em>&ldquo;type is not defined in version X&rdquo;</em>
scenario, I know I can get around the issue by making up the type on my own. A
quick lookup confirmed that this was the case, and the workaround is to add
the following somewhere in my source code:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>    namespace System.Runtime.CompilerServices
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        internal static class IsExternalInit {}
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>And presto, the <code>init</code> keyword is now fully available to my library.</p>
<p>While researching this matter, I stumbled into <a href="https://github.com/Sergio0694/PolySharp">PolySharp</a>,  a lovely
package that takes this workaround approach to new heights. What is it?</p>
<blockquote>
<p>PolySharp provides generated, source-only polyfills for C# language features,
to easily use all runtime-agnostic features downlevel. The package is
distributed as a source generator, so that it will automatically detect which
polyfills are needed depending on the target framework and project in use:
just add a reference to PolySharp, set your C# language version to latest,
and have fun!</p></blockquote>
<p>And it works! Just add a PolySharp reference, and almost all modern C# language
features become automagically available to your project, with no tricks around
polluting your code. What&rsquo;s also nice about PolySharp, is that it isn&rsquo;t a
dependency for your library; it only needs to be there at compile time.</p>
<p>Do you know what&rsquo;s funny? After all, I took a different route; no <code>init</code>
keyword is used anymore in my library, but that&rsquo;s for another story.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Flammarion engraving</title>
      <link>https://nicolaiarocci.com/flammarion-engraving/</link>
      <pubDate>Thu, 02 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/flammarion-engraving/</guid>
      <description>&lt;p&gt;I was reading &lt;a href=&#34;https://ia.net/topics/the-end-of-writing-ia-on-ai&#34;&gt;iA&amp;rsquo;s grumpy writing about GPT&lt;/a&gt; (with which I sympathize)
when my attention was captured by the image they added to their post. It was so
fascinating that I had to research it.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Flammarion engraving&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/Flammarion.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;As it turns out, this is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Flammarion_engraving&#34;&gt;Flammarion engraving&lt;/a&gt;, a famous wood engraving by
an unknown artist, so named because its first documented appearance is in
Camille Flammarion&amp;rsquo;s 1888 book &lt;em&gt;L&amp;rsquo;atmosphère: météorologie populaire&lt;/em&gt; (&amp;ldquo;The
Atmosphere: Popular Meteorology&amp;rdquo;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was reading <a href="https://ia.net/topics/the-end-of-writing-ia-on-ai">iA&rsquo;s grumpy writing about GPT</a> (with which I sympathize)
when my attention was captured by the image they added to their post. It was so
fascinating that I had to research it.</p>
<p><img alt="Flammarion engraving" loading="lazy" src="/images/Flammarion.jpg"></p>
<p>As it turns out, this is the <a href="https://en.wikipedia.org/wiki/Flammarion_engraving">Flammarion engraving</a>, a famous wood engraving by
an unknown artist, so named because its first documented appearance is in
Camille Flammarion&rsquo;s 1888 book <em>L&rsquo;atmosphère: météorologie populaire</em> (&ldquo;The
Atmosphere: Popular Meteorology&rdquo;).</p>
<p>The print depicts a man, clothed in a long robe and carrying a staff, at the
edge of the Earth, where it meets the sky. He kneels and passes his head,
shoulders, and right arm through the star-studded sky, discovering a marvelous
realm of circling clouds, fires and suns beyond the heavens. One of the
elements of the cosmic machinery closely resembles traditional pictorial
representations of the &ldquo;wheel in the middle of a wheel&rdquo; described in the
visions of the Hebrew prophet Ezekiel. The caption that accompanies the
engraving in Flammarion&rsquo;s book reads:</p>
<blockquote>
<p>A missionary of the Middle Ages tells that he had found the point where the
sky and the Earth touch&hellip;</p></blockquote>
<p>The Flammarion engraving has inspired and has been used by many writers,
artists, researchers, and jack-of-all-trades. The whole story is available at
the Wikipedia page linked above.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A quick preview of the Blazor United prototype for .NET8</title>
      <link>https://nicolaiarocci.com/a-quick-preview-of-the-blazor-united-prototype-for-.net8/</link>
      <pubDate>Sat, 28 Jan 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-quick-preview-of-the-blazor-united-prototype-for-.net8/</guid>
      <description>&lt;p&gt;Steve Sanderson, the original creator of Blazor, recently posted a quick peek
at some of the new Blazor prototypes they are experimenting with for .NET 8.&lt;/p&gt;
&lt;p&gt;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/48G_CEGXZZM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;!-- raw HTML omitted --&gt;
I think this looks great. Mixing client and server is a brilliant concept.
Essentially one would be served with server-side Blazor on the first landing.
While using the app, a background task would download the client-side stuff,
ready to be consumed at any subsequent access.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Steve Sanderson, the original creator of Blazor, recently posted a quick peek
at some of the new Blazor prototypes they are experimenting with for .NET 8.</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/48G_CEGXZZM?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<!-- raw HTML omitted -->
I think this looks great. Mixing client and server is a brilliant concept.
Essentially one would be served with server-side Blazor on the first landing.
While using the app, a background task would download the client-side stuff,
ready to be consumed at any subsequent access.</p>
<p>Blazor United is all experimental at the moment, but I&rsquo;m confident it will land
in one form or another, either in .NET 8 or later. I remember a few years ago
at a Microsoft MVP Summit in Redmond when Steve first introduced Blazor as &ldquo;an
experiment&rdquo;. If he puts in the effort to present his experiments to the public,
he&rsquo;s got approval for that, which means the project is a little more than just
an experiment at this point.</p>
<p>Blazor weakness so far has been more with the tooling than the features. Should
Blazor United come with some solid tooling, it will be a huge hit.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The days are long but years are short</title>
      <link>https://nicolaiarocci.com/the-days-are-long-but-years-are-short/</link>
      <pubDate>Fri, 27 Jan 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-days-are-long-but-years-are-short/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Days are long but years are short&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/long-days-short-years.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&#34;https://twitter.com/SahilBloom/status/1618296457966292992&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Above all, I liked the affection and serenity that shines, through all stages,
between father and son. A depiction of the circle of life I gladly subscribe to.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="Days are long but years are short" loading="lazy" src="/images/long-days-short-years.jpg"></p>
<p><em><a href="https://twitter.com/SahilBloom/status/1618296457966292992">Source</a></em></p>
<p>Above all, I liked the affection and serenity that shines, through all stages,
between father and son. A depiction of the circle of life I gladly subscribe to.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Barnes &amp; Noble&#39;s surprising turnaround</title>
      <link>https://nicolaiarocci.com/barnes-nobles-surprising-turnaround/</link>
      <pubDate>Wed, 25 Jan 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/barnes-nobles-surprising-turnaround/</guid>
      <description>&lt;p&gt;According to the always-interesting Ted Gioia, the recent turnaround of Barnes
&amp;amp; Noble is to be attributed to the company&amp;rsquo;s new CEO and his love of books.
Quite astonishingly James Daunt, who took the helm of B&amp;amp;N in late 2019, refused
to take promotional money from publishers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Daunt refused to play this game. He wanted to put the best books in the
window. He wanted to display the most exciting books by the front door. Even
more impressive, he let the people working in the stores make these
decisions. This is James Daunt&amp;rsquo;s superpower: He loves books.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>According to the always-interesting Ted Gioia, the recent turnaround of Barnes
&amp; Noble is to be attributed to the company&rsquo;s new CEO and his love of books.
Quite astonishingly James Daunt, who took the helm of B&amp;N in late 2019, refused
to take promotional money from publishers:</p>
<blockquote>
<p>Daunt refused to play this game. He wanted to put the best books in the
window. He wanted to display the most exciting books by the front door. Even
more impressive, he let the people working in the stores make these
decisions. This is James Daunt&rsquo;s superpower: He loves books.</p></blockquote>
<p>The <a href="https://tedgioia.substack.com/p/what-can-we-learn-from-barnes-and">whole piece</a> is worth reading. Of all the libraries in my hometown,
there&rsquo;s only one (not a franchise) doing the same, and I genuinely enjoy
walking up to their window to spot new titles. I appreciate that the owners
take their time to pick worthy books and that I get to contemplate their
opinionated selection. They also organize group readings and other activities
seldom found in franchise libraries. Their only downside, valid for all small
libraries, is that almost every time I need a particular title, it&rsquo;ll have to
be back-ordered, which sadly makes Amazon unbeatable.</p>
]]></content:encoded>
    </item>
    <item>
      <title>This is Water by David Foster Wallace</title>
      <link>https://nicolaiarocci.com/this-is-water-by-david-foster-wallace/</link>
      <pubDate>Sun, 22 Jan 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/this-is-water-by-david-foster-wallace/</guid>
      <description>&lt;p&gt;Slow Sunday morning, while surfing the YouTube ocean, I stumbled upon the audio
recording of David Foster Wallace&amp;rsquo;s This is Water speech. Any DFW fan knows
about the commencement speech he famously gave at Kenyon College in 2005, and
I&amp;rsquo;m probably one of the few who hadn&amp;rsquo;t yet listened to it. So this morning, I
hit the play button and was blown away by it. Unsurprisingly, I guess, as the
speech was met with universal acclaim.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Slow Sunday morning, while surfing the YouTube ocean, I stumbled upon the audio
recording of David Foster Wallace&rsquo;s This is Water speech. Any DFW fan knows
about the commencement speech he famously gave at Kenyon College in 2005, and
I&rsquo;m probably one of the few who hadn&rsquo;t yet listened to it. So this morning, I
hit the play button and was blown away by it. Unsurprisingly, I guess, as the
speech was met with universal acclaim.</p>
<p>I suspect my being an adult father of three kids played a role, as I was
nodding all the time, often feeling emotional about it. Anyway, <a href="https://youtu.be/DCbGM4mqEVw">here&rsquo;s the
YouTube recording</a> I&rsquo;m talking about, and <a href="https://web.archive.org/web/20080213082423/http://www.marginalia.org/dfw_kenyon_commencement.html">here&rsquo;s a transcription</a> I dug
out of the Internet Archive.</p>
<p>Spoiler warning, I&rsquo;m now going to quote <a href="https://en.wikipedia.org/wiki/This_Is_Water">Wikipedia</a>, where I found a good
summarization of the themes covered:</p>
<blockquote>
<p>The speech covers subjects including the difficulty of empathy, the
unimportance of being well-adjusted, and the apparent lonesomeness of adult
life. It suggests that higher education&rsquo;s overall purpose is to consciously
choose how to perceive others, think about meaning, and act appropriately in
everyday life. Wallace argues that the true freedom acquired through
education is the ability to be fully conscious and sympathetic. Authors
Robert K. Bolger and Scott Korb have said that Wallace used the speech to
outline his spiritual philosophy and the methods he used to find peace when
wrestling with anxiety and depression.</p></blockquote>
<p>I also learned on Wikipedia that the speech&rsquo;s themes were expanded in Wallace&rsquo;s
novel <em>The Pale King</em>, posthumously published in 2011. With all its
intimidating size, the Pale King has been sitting on my nightstand (aka reading
list) for ages. Maybe it&rsquo;s time to deal with it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Uomini, boschi e api</title>
      <link>https://nicolaiarocci.com/book-review-uomini-boschi-e-api/</link>
      <pubDate>Sat, 21 Jan 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-uomini-boschi-e-api/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I wish everyone could listen to the song of the partridges as the sun rises,
see the deer on pastures in spring, the larch trees reddened by autumn on the
edges of rocks, the darting of fish among the clear waters of streams, and
the bees gathering nectar from the flowering cherry trees. In these stories,
I write about village places. These natural environments are still livable,
about the beautiful social insects that are bees, but also about ancient jobs
that are slowly and inexorably disappearing.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I wish everyone could listen to the song of the partridges as the sun rises,
see the deer on pastures in spring, the larch trees reddened by autumn on the
edges of rocks, the darting of fish among the clear waters of streams, and
the bees gathering nectar from the flowering cherry trees. In these stories,
I write about village places. These natural environments are still livable,
about the beautiful social insects that are bees, but also about ancient jobs
that are slowly and inexorably disappearing.</p></blockquote>
<p>The book<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> delivers on the author&rsquo;s promise in the introduction. Mario Rigoni
Stern is an author I have always admired and loved. His biography is touching,
his themes are awe-inspiring, and his writing is simple, clean, and enjoyable.</p>
<p><img alt="Uomini, boschi e api book cover" loading="lazy" src="/images/uomini-boschi-api.jpg#right">
This work is a collection of short stories he wrote over the years, primarily
published in magazines and newspapers. The first part of the book, about
one-third, is about Rigoni Stern&rsquo;s struggles and experiences as a wartime
prisoner during WWII. The rest is mostly about his wilderness adventures,
either as a hunter or a nature-dweller (he spent most of his life living on the
Asiago plateau in the Italian alps.) As is often the case with Rigoni Stern,
his hunting adventures are proxies to show his deep connection, respect, and
empathy for the creatures he preys on, which is counter-intuitive for the
modern, educated reader.</p>
<p>Mario Rigoni Stern was one of the very last of his age when nature still played
a primary role in everyday life. Despite his early success as a writer, he was
lucky, or smart enough, to keep living in his relatively secluded place in the
mountains, from which he could observe the unstoppable transformation of our
society from afar.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I am afraid there&rsquo;s no English edition available. You could always read his WWII memoir and masterpiece, <em>The Sergeant in the Snow</em>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[m]: <a href="https://fosstodon.org/@nicola">https://fosstodon.org/@nicola</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Why give up drinking in your early twenties</title>
      <link>https://nicolaiarocci.com/why-give-up-drinking-in-your-early-twenties/</link>
      <pubDate>Sun, 01 Jan 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/why-give-up-drinking-in-your-early-twenties/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;On New Years Day of 2022, I stumbled out of bed and immediately lost my
vision, fell to the floor, and had to get my then-partner to help me back
into bed. This wasn’t the first time this had happened, and I knew what it
was straight away - I was having a migraine. In the previous decade I’d had
countless migraines, and they always followed the same pattern. I’d wake up
after a night out, attempt to get to the bathroom, lose my vision, and most
likely end up on the floor vomiting from the pain that I can only describe as
feeling like someone trying to hammer a nail into my skull.
The worst part about them? They were avoidable.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>On New Years Day of 2022, I stumbled out of bed and immediately lost my
vision, fell to the floor, and had to get my then-partner to help me back
into bed. This wasn’t the first time this had happened, and I knew what it
was straight away - I was having a migraine. In the previous decade I’d had
countless migraines, and they always followed the same pattern. I’d wake up
after a night out, attempt to get to the bathroom, lose my vision, and most
likely end up on the floor vomiting from the pain that I can only describe as
feeling like someone trying to hammer a nail into my skull.
The worst part about them? They were avoidable.</p></blockquote>
<p>More <a href="https://oscargws.substack.com/p/why-i-gave-up-drinking-in-my-twenties">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My favorite books of 2022</title>
      <link>https://nicolaiarocci.com/my-favorite-books-of-2022/</link>
      <pubDate>Sat, 31 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-favorite-books-of-2022/</guid>
      <description>&lt;p&gt;I only read &lt;a href=&#34;https://nicolaiarocci.com/books-i-have-read/&#34;&gt;17 books in 2022&lt;/a&gt;, confirming the slowdown of the last few
years. The total number of pages decreased too, albeit not too much compared to
the previous year. In 2021, though, there was a significant drop, as in 2020, I
read 28 books or 8073 pages. Stats have been going down since 2015, which is
interesting. Like &lt;a href=&#34;https://nicolaiarocci.com/three-good-books-i-read-in-2021/&#34;&gt;last year&lt;/a&gt;, I&amp;rsquo;m not sure why I&amp;rsquo;m reading less. More
tired? Less interested? I don&amp;rsquo;t know.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I only read <a href="/books-i-have-read/">17 books in 2022</a>, confirming the slowdown of the last few
years. The total number of pages decreased too, albeit not too much compared to
the previous year. In 2021, though, there was a significant drop, as in 2020, I
read 28 books or 8073 pages. Stats have been going down since 2015, which is
interesting. Like <a href="/three-good-books-i-read-in-2021/">last year</a>, I&rsquo;m not sure why I&rsquo;m reading less. More
tired? Less interested? I don&rsquo;t know.</p>
<p><img alt="Books I read in 2022 compared to previous years" loading="lazy" src="/images/books-read-in-2022.png"></p>
<p>This year I read more fiction than usual. I wouldn&rsquo;t say what I read was
uninteresting or dull; quite the contrary. Do the stats matter, though?
Probably not; I might be a bit obsessed with them. As long I enjoy what I read
and the time spent reading, I think I&rsquo;m fine.</p>
<p>Anyway, here&rsquo;s a selection of my favorite books for 2022. I picked three, but
they could easily be five (Italo Calvino&rsquo;s <em>Invisible Cities</em> and Nabokov&rsquo;<em>s
Mašen&rsquo;ka</em> made it to the shortlist.) In no particular order:</p>
<ul>
<li>
<p><em>Memoirs of Hadrian</em>, by Marguerite Yourcenar. Terrific work of historical
fiction. The memoirs are drafted by an elderly emperor Hadrian for his young
friend &ldquo;Mark,&rdquo; the future Marcus Aurelius. Hadrian does not flinch. He tells
of his many great successes but does not hide his mistakes and weaknesses. He
points out the former so that his protégé can steer clear of them; the latter
he investigates, not without the indulgence that every elder is entitled to.
My review is available <a href="/book-review-memoirs-of-hadrian/">here</a>.</p>
</li>
<li>
<p><em>Italica</em>, by Giacomo Papi. Italia is a remarkable collection of short
stories from Italy&rsquo;s twentieth century, all written by prominent Italian
writers of the period, including Italo Calvino, Elsa Morante, Beppe Fenoglio,
Natalia Ginzburg, and Giorgio Scerbanenco. Enlightening short essays
introduce each tale, helping contextualize the story. <a href="/book-review-italica/">Full review</a>.</p>
</li>
<li>
<p><em>Stoner</em>, by John Williams. Quoting <em>the New York Review of Books</em>: John
Williams&rsquo;s luminous and deeply moving novel is a work of quiet perfection.
William Stoner emerges from it not only as an archetypal American but as an
unlikely existential hero, standing, like a figure in a painting by Edward
Hopper, in stark relief against an unforgiving world. My review is <a href="/book-review-stoner/">here</a>.</p>
</li>
</ul>
<p>Overall, I read great books in 2022. I&rsquo;m now glancing at the dozen books
waiting for me on the shelf. I hope they&rsquo;ll provide me with the same level of
satisfaction, evasion, and entertainment as their predecessors.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Stoner</title>
      <link>https://nicolaiarocci.com/book-review-stoner/</link>
      <pubDate>Wed, 28 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-stoner/</guid>
      <description>&lt;p&gt;I tend to shy away from publishing cases, so &lt;em&gt;Stoner&lt;/em&gt; has been resting on my
yeah-maybe-one-day list for years. Over time I stumbled on notable mentions
that kept the book on the fringe of my attention zone. Then one day, I read a
brief and intriguing [review][2] in Giovanni Zagni&amp;rsquo;s excellent newsletter,
&lt;em&gt;Incertezze&lt;/em&gt;. Like me, Zagni suffers from the stay-away-from-editorial-cases
idiosyncrasy, but he finally gave in, read the thing, reread it, and finally
tagged it a modern classic. Zagni was convincing, yet it took another year
before I surrendered my weapons and took the book off the shelf. I immediately
realized I was in front of a beautiful book.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I tend to shy away from publishing cases, so <em>Stoner</em> has been resting on my
yeah-maybe-one-day list for years. Over time I stumbled on notable mentions
that kept the book on the fringe of my attention zone. Then one day, I read a
brief and intriguing [review][2] in Giovanni Zagni&rsquo;s excellent newsletter,
<em>Incertezze</em>. Like me, Zagni suffers from the stay-away-from-editorial-cases
idiosyncrasy, but he finally gave in, read the thing, reread it, and finally
tagged it a modern classic. Zagni was convincing, yet it took another year
before I surrendered my weapons and took the book off the shelf. I immediately
realized I was in front of a beautiful book.</p>
<p>The <em>New York Review of Books</em> has this to say about the novel:</p>
<blockquote>
<p>John Williams&rsquo;s luminous and deeply moving novel is a work of quiet
perfection. William Stoner emerges from it not only as an archetypal American
but as an unlikely existential hero, standing, like a figure in a painting by
Edward Hopper, in stark relief against an unforgiving world.</p></blockquote>
<p>I find this description perfectly fit. Like Hopper&rsquo;s paintings, John William&rsquo;s
prose is indeed sparse, detached and powerful.</p>
<p>The protagonist is a professor of English at the University of Missouri in the
first half of the twentieth century. From the outside, his life and attitude
appear ordinary and dull, and that&rsquo;s how most former students and colleagues
may remember him. And yet, as his life unfolds in the pages, from boyhood at
the dirt-poor family farm to college and then adulthood,  the reader soon
recognizes the William Stoner as a modern hero, incredibly resilient in the
face of continued and unremitting harassment from the people and events around
him.</p>
<p><img alt="Stoner by John Williams, book cover" loading="lazy" src="/images/stoner-book-cover.jpg#right">
The author John Williams grew up on a small farm in Texas and had a similar
escape to the University as Stoner&rsquo;s. Not coincidentally, I think, the author
and protagonist share resembling names. While not an autobiography, the novel
is probably imbued with the author&rsquo;s experiences.</p>
<p>Going back to Zagni&rsquo;s review, his opinion is the this novel was ahead of its
time, which would explain why it wasn&rsquo;t an immediate hit. Indeed,I was struck
by the precise and painful description of some characters&rsquo; struggles with
mental issues and past abuses and how these can unintentionally affect family
dynamics and persist over generations.</p>
<p>Stoner is a deceptively simple novel written in 1965 that tells facts of the
early twentieth century, yet it has much to say to the people of the modern
age.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>My paperback edition (Oscar Mondadori, Italian) includes a remarkable author interview. Also, while researching the book, I dug up an enlightening 2019 The Paris Review <a href="https://www.theparisreview.org/blog/2019/02/20/mrs-stoner-speaks-an-interview-with-nancy-gardner-williams/">interview</a> with Nancy Gardner Williams, his widow.
[1]: <a href="https://giovannizagni.substack.com/">https://giovannizagni.substack.com/</a>
[2]: <a href="https://giovannizagni.substack.com/p/stoner">https://giovannizagni.substack.com/p/stoner</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[m]: <a href="https://fosstodon.org/@nicola">https://fosstodon.org/@nicola</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>On implementing the ASP.NET Core 7 rate-limiting middleware</title>
      <link>https://nicolaiarocci.com/on-implementing-the-asp.net-core-7-rate-limiting-middleware/</link>
      <pubDate>Fri, 23 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-implementing-the-asp.net-core-7-rate-limiting-middleware/</guid>
      <description>&lt;p&gt;Today, my last self-assigned duty before the Christmas break was to migrate
our in-house rate-limiting implementation (based on the
&lt;a href=&#34;https://github.com/stefanprodan/AspNetCoreRateLimit&#34;&gt;AspNetCoreRateLimiting&lt;/a&gt; third-party package) to the new, shiny
&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/&#34;&gt;rate-limiting middleware&lt;/a&gt; introduced by ASP.NET Core 7. While the process
was relatively straightforward, I stumbled upon a few quirks I want to annotate
here.&lt;/p&gt;
&lt;p&gt;Our use case is simple. We use what the ASP.NET Core 7 documentation defines as
a &amp;ldquo;fixed window limiter.&amp;rdquo; It uses a specified time window to limit requests.
When the time window expires, a new time window starts, and the request limit
is reset. Consider the following code (for convenience, I&amp;rsquo;m using an extension
method):&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, my last self-assigned duty before the Christmas break was to migrate
our in-house rate-limiting implementation (based on the
<a href="https://github.com/stefanprodan/AspNetCoreRateLimit">AspNetCoreRateLimiting</a> third-party package) to the new, shiny
<a href="https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/">rate-limiting middleware</a> introduced by ASP.NET Core 7. While the process
was relatively straightforward, I stumbled upon a few quirks I want to annotate
here.</p>
<p>Our use case is simple. We use what the ASP.NET Core 7 documentation defines as
a &ldquo;fixed window limiter.&rdquo; It uses a specified time window to limit requests.
When the time window expires, a new time window starts, and the request limit
is reset. Consider the following code (for convenience, I&rsquo;m using an extension
method):</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>public static void ConfigureRateLimit(this IServiceCollection services)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    services.AddRateLimiter(x =&gt; 
</span></span><span style="display:flex;"><span>        x.AddFixedWindowLimiter(
</span></span><span style="display:flex;"><span>                policyName: &#34;fixed&#34;, options =&gt;
</span></span><span style="display:flex;"><span>                {
</span></span><span style="display:flex;"><span>                    options.PermitLimit 1;
</span></span><span style="display:flex;"><span>                    options.Window = TimeSpan.FromSeconds(10);
</span></span><span style="display:flex;"><span>                    options.QueueLimit 1;
</span></span><span style="display:flex;"><span>                }));
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>It sets a window of 10 seconds. Within that window, a maximum of one request is
allowed. Exceeding requests will be queued and served at window reset. Notice
that we defined &ldquo;fixed&rdquo; as the policy name.</p>
<p>Once our policy is configured, we must instrument the app instance to use the
rate limiter, then we call <code>RequireRateLimiting</code> on our endpoints:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>app.UseRouting();  // I&#39;m mentioning this line for good reason, see below
</span></span><span style="display:flex;"><span>app.UseRateLimiter();
</span></span><span style="display:flex;"><span>app.UseEndpoints(endpoints =&gt; { endpoints.MapControllers()
</span></span><span style="display:flex;"><span>    .RequireRateLimiting(&#34;fixed&#34;); });
</span></span></code></pre></div><p>Nothing else is needed, really, for such a simple scenario. We could be more
sophisticated. We could opt for more advanced options, like a &ldquo;sliding windows
limiter&rdquo; or a &ldquo;bucket token limiter&rdquo;; we could apply rate limiting only to
specific endpoints or controllers or mix and match these options. I chose to
ditch hard-coded settings and read them from the configuration file. My
<em>appsettings.json</em> contains the following (with different vaues):</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>  &#34;RateLimiter&#34;: {
</span></span><span style="display:flex;"><span>    &#34;PermitLimit&#34;: 1
</span></span><span style="display:flex;"><span>    &#34;Window&#34;: 10,
</span></span><span style="display:flex;"><span>    &#34;QueueLimit&#34;: 1
</span></span><span style="display:flex;"><span>  }
</span></span></code></pre></div><p>The <code>RateLimiter</code> class maps the json structure:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>public class RateLimiter
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    public int PermitLimit { get; set; }
</span></span><span style="display:flex;"><span>    public int Window { get; set; }
</span></span><span style="display:flex;"><span>    public int QueueLimit { get; set; }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>The updated code looks like this:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>public <span style="font-weight:bold">static</span> void ConfigureRateLimit(this IServiceCollection services, 
</span></span><span style="display:flex;"><span>    IConfiguration configuration)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">var</span> rateLimiter = new RateLimiter();
</span></span><span style="display:flex;"><span>    configuration.GetSection(<span style="font-style:italic">&#34;RateLimiter&#34;</span>).Bind(rateLimiter);
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    services.AddRateLimiter(x =&gt; 
</span></span><span style="display:flex;"><span>        x.AddFixedWindowLimiter(
</span></span><span style="display:flex;"><span>                policyName: <span style="font-style:italic">&#34;fixed&#34;</span>, options =&gt;
</span></span><span style="display:flex;"><span>                {
</span></span><span style="display:flex;"><span>                    options.PermitLimit = rateLimiter.PermitLimit;
</span></span><span style="display:flex;"><span>                    options.Window = TimeSpan.FromSeconds(rateLimiter.Window);
</span></span><span style="display:flex;"><span>                    options.QueueLimit = rateLimiter.QueueLimit;
</span></span><span style="display:flex;"><span>                }));
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>I wish I could say it all worked splendidly on the first try. The API was
running fine, but it was not rate-limited. It looked like the middleware was
not being invoked, or it somehow failed miserably and silently. After an
embarrassingly long time, I figured out the problem: <code>UseRateLimiter</code>
<em>must</em> be called after <code>UseRouting</code>.</p>
<p>Before:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>app.UseRateLimiter();
</span></span><span style="display:flex;"><span>app.UseRouting();
</span></span><span style="display:flex;"><span>app.UseEndpoints(endpoints =&gt; { endpoints
</span></span><span style="display:flex;"><span>    .MapControllers().RequireRateLimiting(&#34;fixed&#34;); });
</span></span></code></pre></div><p>After:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>app.UseRouting();
</span></span><span style="display:flex;"><span>app.UseRateLimiter();
</span></span><span style="display:flex;"><span>app.UseEndpoints(endpoints =&gt; { endpoints.MapControllers()
</span></span><span style="display:flex;"><span>    .RequireRateLimiting(&#34;fixed&#34;); });
</span></span></code></pre></div><p>Simply switching two lines saved the day. I looked high and low but could not
find any reference to this requirement. If intended, it should be mentioned in
the documentation. If it is a bug, it should be fixed (and I should
probably open at ticket about it.)</p>
<p>Anyways, now the API is rate-limited via the new middleware. The first request
sent via Postman goes through. The second, rapid-fired one is queued and served
at window reset, as expected. A third request within the same window is bounced
back.</p>
<p>However:</p>
<ol>
<li>You get a <code>503 Service Unavailable</code> response. I&rsquo;m not in favor of 500
replies for this case. Five-hundreds should be reserved for server errors,
and that&rsquo;s not what we are dealing with here. My previous implementation
served a more appropriate <code>429 Too Many Requests</code>.</li>
<li>No <code>Retry-After</code> header is included with the response. I think it&rsquo;s
mandatory to instruct clients on what to do next.</li>
</ol>
<p>Luckily, the rate-limiting middleware allows for ample customization. On
defining our policy, we can attach a custom function to the <code>OnRejected</code> event.
The code below is updated to address both issues above:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>public <span style="font-weight:bold">static</span> <span style="font-weight:bold">class</span> ServicesConfiguration
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    public <span style="font-weight:bold">static</span> void ConfigureRateLimit(this IServiceCollection services, 
</span></span><span style="display:flex;"><span>        IConfiguration configuration) {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">var</span> rateLimiter = new RateLimiter();
</span></span><span style="display:flex;"><span>        configuration.GetSection(<span style="font-style:italic">&#34;RateLimiter&#34;</span>).Bind(rateLimiter);
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>        services.AddRateLimiter(x =&gt; 
</span></span><span style="display:flex;"><span>            x.AddFixedWindowLimiter(
</span></span><span style="display:flex;"><span>                    policyName: <span style="font-style:italic">&#34;fixed&#34;</span>, options =&gt; {
</span></span><span style="display:flex;"><span>                        options.PermitLimit = rateLimiter.PermitLimit;
</span></span><span style="display:flex;"><span>                        options.Window = TimeSpan.FromSeconds(rateLimiter.Window);
</span></span><span style="display:flex;"><span>                        options.QueueLimit = rateLimiter.QueueLimit;
</span></span><span style="display:flex;"><span>                    })
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                // new code here:
</span></span><span style="display:flex;"><span>                .OnRejected = (context, _) =&gt; {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                // inject Retry-After header (too much line wrapping, I know)
</span></span><span style="display:flex;"><span>                <span style="font-weight:bold">if</span> (context.Lease.TryGetMetadata(MetadataName.RetryAfter, 
</span></span><span style="display:flex;"><span>                    out <span style="font-weight:bold">var</span> retryAfter)) {
</span></span><span style="display:flex;"><span>                    context.HttpContext.Response.Headers.RetryAfter =
</span></span><span style="display:flex;"><span>                        ((<span style="font-weight:bold">int</span>) retryAfter.TotalSeconds).ToString();
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>                // <span style="font-weight:bold">return</span> a different status code
</span></span><span style="display:flex;"><span>                context.HttpContext.Response.StatusCode = 
</span></span><span style="display:flex;"><span>                    StatusCodes.Status429TooManyRequests;
</span></span><span style="display:flex;"><span>                <span style="font-weight:bold">return</span> new();
</span></span><span style="display:flex;"><span>            });
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>And that&rsquo;s all there is to it. I dropped the AspNetCoreRateLimiting dependency.
That is one great piece of software, and I am grateful to its author Stefan
Prodan and his contributors. As mentioned in <a href="/my-top-7-new-features-in-.net-7/">My Top 7 New Features in .NET
7</a>, they recently released a package that allows using Redis as a
rate-limiting backend. I might adopt it in the future.</p>
<p>Complete documentation for ASP.NET Core 7 rate-limiting middleware is available
<a href="https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?view=aspnetcore-7.0">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Latewood</title>
      <link>https://nicolaiarocci.com/latewood/</link>
      <pubDate>Thu, 22 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/latewood/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;And we must remind ourselves that growth occurs in intervals: there are times
of growth, and there are times of non-growth. The latter isn’t a failure so
much as a necessary period of rest. Dormancy isn’t stagnant; it’s
potentiating. It’s patient. If you’ve grown a lot in the past however many
months or years and now feel that growth coming to a close, don’t fret right
away. Wait. Reflect on what you’ve learned. Look for signs of spring. Move to
where there’s water, if you need to. But don’t rush. There will be time again
for running and jumping, when you’re ready.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>And we must remind ourselves that growth occurs in intervals: there are times
of growth, and there are times of non-growth. The latter isn’t a failure so
much as a necessary period of rest. Dormancy isn’t stagnant; it’s
potentiating. It’s patient. If you’ve grown a lot in the past however many
months or years and now feel that growth coming to a close, don’t fret right
away. Wait. Reflect on what you’ve learned. Look for signs of spring. Move to
where there’s water, if you need to. But don’t rush. There will be time again
for running and jumping, when you’re ready.</p></blockquote>
<p>More <a href="https://aworkinglibrary.com/writing/latewood">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Candide</title>
      <link>https://nicolaiarocci.com/book-review-candide/</link>
      <pubDate>Sun, 18 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-candide/</guid>
      <description>&lt;p&gt;This short novel was a genuine surprise. I certainly didn&amp;rsquo;t expect Voltaire to
be this accessible, witty, sarcastic, and also outrageous for the era (1759).
Below the surface of a seemingly entertaining and often absurd sequence of
improbable events is a constant philosophical struggle. Quoting from the back
cover:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Candide is the story of a gentle man who, though pummeled and slapped in
every direction by fate, clings desperately to the belief that he lives in
&amp;ldquo;the best of all possible worlds.&amp;rdquo; On the surface a witty, bantering tale,
this eighteenth-century classic is actually a savage, satiric thrust at the
philosophical optimism that proclaims that all disaster and human suffering
is part of a benevolent cosmic plan.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This short novel was a genuine surprise. I certainly didn&rsquo;t expect Voltaire to
be this accessible, witty, sarcastic, and also outrageous for the era (1759).
Below the surface of a seemingly entertaining and often absurd sequence of
improbable events is a constant philosophical struggle. Quoting from the back
cover:</p>
<blockquote>
<p>Candide is the story of a gentle man who, though pummeled and slapped in
every direction by fate, clings desperately to the belief that he lives in
&ldquo;the best of all possible worlds.&rdquo; On the surface a witty, bantering tale,
this eighteenth-century classic is actually a savage, satiric thrust at the
philosophical optimism that proclaims that all disaster and human suffering
is part of a benevolent cosmic plan.</p></blockquote>
<p><img loading="lazy" src="/images/book-cover-candide.jpg#right">
His wondrous adventures around the world teach Candide that, contrary to the
teachings of his distinguished tutor Dr. Pangloss, all is not always for the
best.</p>
<p>With Candide, Voltaire ridicules religion, theologians, governments, armies,
philosophies, and philosophers (Leibniz being his first target). An erratic,
fantastical, picaresque novel with a fast-moving plot that enjoyed both great
success and scandal at the time of its release.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What was Dracula really like?</title>
      <link>https://nicolaiarocci.com/what-was-dracula-really-like/</link>
      <pubDate>Tue, 13 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/what-was-dracula-really-like/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s mind-blowing that today scientists can &amp;ldquo;extract genetic material from the
letters written [in 1475] by Vlad Dracula [&amp;hellip;] and, from that, build up a
picture of not only the physical makeup of the Wallachian warlord who became
known as Vlad the Impaler but also the environmental conditions in which he
lived.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Also, I&amp;rsquo;m &lt;em&gt;not&lt;/em&gt; surprised that similar investigations revealed that Mikhail
Bulgakov was under morphine when he wrote his masterpiece, The Master and
Margarita (one of my all-time favorite books).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s mind-blowing that today scientists can &ldquo;extract genetic material from the
letters written [in 1475] by Vlad Dracula [&hellip;] and, from that, build up a
picture of not only the physical makeup of the Wallachian warlord who became
known as Vlad the Impaler but also the environmental conditions in which he
lived.&rdquo;</p>
<p>Also, I&rsquo;m <em>not</em> surprised that similar investigations revealed that Mikhail
Bulgakov was under morphine when he wrote his masterpiece, The Master and
Margarita (one of my all-time favorite books).</p>
<p>Full article is available <a href="https://www.theguardian.com/books/2022/dec/11/dracula-vlad-the-impaler-letter-protein-clues">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>First impressions on JetBrains Rider 2022.3 update</title>
      <link>https://nicolaiarocci.com/first-impressions-on-jetbrains-rider-2022.3-update/</link>
      <pubDate>Mon, 12 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/first-impressions-on-jetbrains-rider-2022.3-update/</guid>
      <description>&lt;p&gt;Today I upgraded to JetBrains&amp;rsquo; Rider 2022.3. Startup speed has been
enhanced, and full .NET 7 and C# 11 support is included. So far,  my favorite
feature is the conversion of regular and verbatim strings into their raw
counterparts (it&amp;rsquo;s often the small, simple things.)&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/cs-to-raw-strings.gif&#34;&gt;&lt;/p&gt;
&lt;p&gt;My second best is the fulls upport for WSL2  remote development. This one took a
good while to come out of the trenches, but better late than never, I&amp;rsquo;d say.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I upgraded to JetBrains&rsquo; Rider 2022.3. Startup speed has been
enhanced, and full .NET 7 and C# 11 support is included. So far,  my favorite
feature is the conversion of regular and verbatim strings into their raw
counterparts (it&rsquo;s often the small, simple things.)</p>
<p><img loading="lazy" src="/images/cs-to-raw-strings.gif"></p>
<p>My second best is the fulls upport for WSL2  remote development. This one took a
good while to come out of the trenches, but better late than never, I&rsquo;d say.</p>
<p>And the new experimental UI? That&rsquo;s neat too.</p>
<p><img loading="lazy" src="/images/uiux-newui-thumb.png"></p>
<p>The full list of updates is available on their <a href="https://www.jetbrains.com/rider/whatsnew/2022-3/">What&rsquo;s New</a> page.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: When We Cease to Understand the World</title>
      <link>https://nicolaiarocci.com/book-review-when-we-cease-to-understand-the-world/</link>
      <pubDate>Sat, 10 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-when-we-cease-to-understand-the-world/</guid>
      <description>&lt;p&gt;When We Cease to Understand the World, by Benjamin Labatut, is a strange
narrative object. It mixes fact and fiction in imaginative ways, sometimes
making it hard for the reader to distinguish between them, which is probably a
testimonial to the experiment&amp;rsquo;s success. As I was reading, Wu Ming&amp;rsquo;s
&lt;a href=&#34;https://www.jstor.org/stable/10.5749/j.ctt1j7x9vm.10#metadata_info_tab_contents&#34;&gt;unidentified narrative objects (UNO) &lt;/a&gt; came to mind. If it doesn&amp;rsquo;t qualify
as UNO, it comes close enough. It certainly fits the &amp;lsquo;faction&amp;rsquo; (fact+fiction)
genre, if such a thing exists.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When We Cease to Understand the World, by Benjamin Labatut, is a strange
narrative object. It mixes fact and fiction in imaginative ways, sometimes
making it hard for the reader to distinguish between them, which is probably a
testimonial to the experiment&rsquo;s success. As I was reading, Wu Ming&rsquo;s
<a href="https://www.jstor.org/stable/10.5749/j.ctt1j7x9vm.10#metadata_info_tab_contents">unidentified narrative objects (UNO) </a> came to mind. If it doesn&rsquo;t qualify
as UNO, it comes close enough. It certainly fits the &lsquo;faction&rsquo; (fact+fiction)
genre, if such a thing exists.</p>
<p>The lives of brilliant scientists of the 19th century, whose discoveries
changed how we understand and perceive the world, are told by drawing on their
biographies and filling in, where necessary, with well-told, captivating
inventions. Some protagonists are well-known (Heisenberg, Schrödinger), and
others, while first-grade stars in their field, are relatively unknown to the
layman, or at least, they were to me.</p>
<p>Astronomer and physicist Karl Schwarzschild is one of them. In 1915 he provided
the first exact solution to the Einstein field equations of general relativity.
Karl accomplished this tremendous feat while serving on the Russian front
during World War I. On December 22, 1915, a letter contaikning the solution to
Einstein&rsquo;s dilemma was sent from the trenches. One month later, Einstein
acknowledged it with enthusiasm and then, only five months later, on May 11,
1916, Schwarzschild died from a disease he developed at the Russian front.</p>
<p>Mathematician Alexander Grothendieck is another one I didn&rsquo;t know about, whose
life was fascinating. A stateless mathematician who became the leading figure
in the creation of modern algebraic geometry, he received the Fields Medal in
1966. While still producing relevant work, Alexander withdrew from the
mathematical community and devoted himself to political and religious pursuits.
In 1991, he moved to the French village of Lasserre in the Pyrenees, where he
lived in seclusion, still working tirelessly on mathematics and his
philosophical and religious thoughts until he died in 2014.</p>
<p><img loading="lazy" src="/images/quando-abbiamo-smesso-di-capire-il-mondo.jpg#right">
And there&rsquo;s the extraordinary and controversial figure of Fritz Haber, the
german Nobel Prize chemist. His inventions allowed for the industrialization
and large-scale production of fertilizers and explosives. He became renowned as
the &ldquo;father of chemical warfare&rdquo; during World War I. His pioneering work
developing and weaponizing chlorine and other poisonous gases led to the cruel
death of tens of thousands of soldiers in WWI. His work led to the infamous
Zyklon B, responsible for killing millions of Jewish people in World War II
(Haber was of Jewish origins.)</p>
<p>Again, the problem with &lsquo;faction&rsquo; is that you never know whether you&rsquo;re reading
facts, making it hard to distinguish between actual stories and invention. Much
of fiction went into the main story, the gripping battle over quantum mechanics
between Heisenberg and Schrödinger, and in their biographies especially<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>A book worth reading.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>In 2020, I read a non-fictionalized account of Heisenberg&rsquo;s and Schrödinger&rsquo;s struggles with quantum in Carlo Rovelli&rsquo;s excellent <em>Helgoland</em>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Writing is Magic</title>
      <link>https://nicolaiarocci.com/writing-is-magic/</link>
      <pubDate>Fri, 09 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/writing-is-magic/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I find, more often than not, that I understand something much less well when
I sit down to write about it than when I&amp;rsquo;m thinking about it in the shower.
In fact, I find that I change my own mind on things a lot when I try write
them down. It really is a powerful tool for finding clarity in your own mind.
Once you have clarity in your own mind, you&amp;rsquo;re much more able to explain it
to others.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I find, more often than not, that I understand something much less well when
I sit down to write about it than when I&rsquo;m thinking about it in the shower.
In fact, I find that I change my own mind on things a lot when I try write
them down. It really is a powerful tool for finding clarity in your own mind.
Once you have clarity in your own mind, you&rsquo;re much more able to explain it
to others.</p></blockquote>
<p>More <a href="https://brooker.co.za/blog/2022/11/08/writing.html">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>JetBrains has left Russia</title>
      <link>https://nicolaiarocci.com/jetbrains-has-left-russia/</link>
      <pubDate>Wed, 07 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/jetbrains-has-left-russia/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;While it has been a very challenging and difficult time for the company, it
cannot even remotely be compared with the horrendous situation that the
people of Ukraine are facing on a daily basis, caused by the war. Once again,
we condemn this aggression, and have and will continue to stand by the people
of Ukraine, including our colleagues and their families. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More &lt;a href=&#34;https://blog.jetbrains.com/blog/2022/12/06/update-on-jetbrains-statement-on-ukraine/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using JetBrains products when I&amp;rsquo;m not in (neo)vim. For C#, Rider is
fantastic, and so is PyCharm for Python. The company is incredible, too, as
today&amp;rsquo;s bold move demonstrates. They moved 800 employees, got visas, new
locations and apartments, everything. Huge respect.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>While it has been a very challenging and difficult time for the company, it
cannot even remotely be compared with the horrendous situation that the
people of Ukraine are facing on a daily basis, caused by the war. Once again,
we condemn this aggression, and have and will continue to stand by the people
of Ukraine, including our colleagues and their families. </p></blockquote>
<p>More <a href="https://blog.jetbrains.com/blog/2022/12/06/update-on-jetbrains-statement-on-ukraine/">here</a>.</p>
<p>I&rsquo;m using JetBrains products when I&rsquo;m not in (neo)vim. For C#, Rider is
fantastic, and so is PyCharm for Python. The company is incredible, too, as
today&rsquo;s bold move demonstrates. They moved 800 employees, got visas, new
locations and apartments, everything. Huge respect.</p>
<p>I&rsquo;m lucky enough to have been awarded their <a href="https://www.jetbrains.com/community/opensource/#support">Open Source License</a> for many
years, so I&rsquo;m biased, but look, now I&rsquo;m even proud of supporting their products
<em>(<a href="https://social.telemetrydeck.com/@daniel/109472601034214313">via</a>)</em>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Making of Dune II</title>
      <link>https://nicolaiarocci.com/the-making-of-dune-ii/</link>
      <pubDate>Tue, 06 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-making-of-dune-ii/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Despite its name suggesting otherwise, Dune II was a first – a real-time
strategy game that sprang out of the box with almost every gameplay attribute
and control system seen in every RTS since. In direct lineage, it was the
father of the globally successful Command &amp;amp; Conquer franchise, in that its
code was used as a basis of the first game of the series. Yet in terms of
wider influence, the battles first fought out on the vibrant sands of Arrakis
continue to echo through modern videogaming.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Despite its name suggesting otherwise, Dune II was a first – a real-time
strategy game that sprang out of the box with almost every gameplay attribute
and control system seen in every RTS since. In direct lineage, it was the
father of the globally successful Command &amp; Conquer franchise, in that its
code was used as a basis of the first game of the series. Yet in terms of
wider influence, the battles first fought out on the vibrant sands of Arrakis
continue to echo through modern videogaming.</p></blockquote>
<p>More <a href="https://readonlymemory.vg/the-making-of-dune-ii/">here</a>, with beautiful illustrations to boost</p>
<p>Dune II is one of the few video game boxes I keep. It&rsquo;s comfortably resting in
the library behind me, along with <a href="/system-shock-is-back-home/">other jewels</a> from the distant past.</p>
<p><img alt="My Dune II box" loading="lazy" src="/images/dune2.jpg"></p>
<p>Reading the <em>Making of Dune II</em> took me down memory lane (<em><a href="https://news.ycombinator.com/item?id=33869118">via</a></em>).</p>
]]></content:encoded>
    </item>
    <item>
      <title>My Top 7 New Features in .NET 7</title>
      <link>https://nicolaiarocci.com/my-top-7-new-features-in-.net-7/</link>
      <pubDate>Sun, 04 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-top-7-new-features-in-.net-7/</guid>
      <description>&lt;p&gt;The other day we did a &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/events/289709131/&#34;&gt;.NET 7 Spotlight&lt;/a&gt; event at this month&amp;rsquo;s
&lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/&#34;&gt;DevRomagna&lt;/a&gt; meetup. The speakers were &lt;a href=&#34;https://twitter.com/imperugo&#34;&gt;Ugo Lattanzi&lt;/a&gt; and me. In my
session, I chose to talk about my top 7 new features in .NET 7 (pun intended.)
What follows is a mix of my preparation notes and what I ended up really
saying&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id=&#34;1-performance&#34;&gt;1. Performance&lt;/h2&gt;
&lt;p&gt;Since the initial release of &amp;ldquo;new dotnet&amp;rdquo; (.NET Core), performance has always
been a critical goal for the .NET team. Starting with .NET 5, performance gains
have been skyrocketing. .NET 6 was &lt;em&gt;a lot&lt;/em&gt; faster than 5, and now, well, I&amp;rsquo;m
surprised by the remarkable performance improvements in .NET 7. Stephen Toub
posted a remarkably long (255 printed pages!) &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7&#34;&gt;in-depth analysis of the
performance improvements in .NET 7&lt;/a&gt;. one That was followed by articles
dedicated to &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/performance-improvements-in-aspnet-core-7/&#34;&gt;ASP.NET Core 7&lt;/a&gt; and &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/dotnet-7-performance-improvements-in-dotnet-maui/&#34;&gt;MAUI 7&lt;/a&gt; performance gains. At .NETConf
2022, a particular slide caught everyone&amp;rsquo;s attention.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The other day we did a <a href="https://www.meetup.com/it-IT/devromagna/events/289709131/">.NET 7 Spotlight</a> event at this month&rsquo;s
<a href="https://www.meetup.com/it-IT/devromagna/">DevRomagna</a> meetup. The speakers were <a href="https://twitter.com/imperugo">Ugo Lattanzi</a> and me. In my
session, I chose to talk about my top 7 new features in .NET 7 (pun intended.)
What follows is a mix of my preparation notes and what I ended up really
saying<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<h2 id="1-performance">1. Performance</h2>
<p>Since the initial release of &ldquo;new dotnet&rdquo; (.NET Core), performance has always
been a critical goal for the .NET team. Starting with .NET 5, performance gains
have been skyrocketing. .NET 6 was <em>a lot</em> faster than 5, and now, well, I&rsquo;m
surprised by the remarkable performance improvements in .NET 7. Stephen Toub
posted a remarkably long (255 printed pages!) <a href="https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7">in-depth analysis of the
performance improvements in .NET 7</a>. one That was followed by articles
dedicated to <a href="https://devblogs.microsoft.com/dotnet/performance-improvements-in-aspnet-core-7/">ASP.NET Core 7</a> and <a href="https://devblogs.microsoft.com/dotnet/dotnet-7-performance-improvements-in-dotnet-maui/">MAUI 7</a> performance gains. At .NETConf
2022, a particular slide caught everyone&rsquo;s attention.</p>
<p><img loading="lazy" src="/images/dotnetconf22.png"></p>
<p>I recall seeing the same slide at the .NET 5 release, so this one is must be
updated version. I&rsquo;m more impressed with the gRPC graph than the big &ldquo;11x
faster than Node&rdquo; one. Being faster than Node doesn&rsquo;t break the news these days,
but being quicker than Go, C++ and Rust? That&rsquo;s one bold statement you have
right there.</p>
<p>An <a href="https://dusted.codes/how-fast-is-really-aspnet-core">exciting article</a> surfaced a while ago on this specific topic. In it,
Dustin Moris Gorski presents an in-depth analysis of the ASP.NET Core 7 code
used for the TechEmpower Framework Benchmark referenced in the above slide. The
results are&hellip; fascinating. That code is undoubtedly <em>not</em> what mere mortals
tend to run in their production systems. It is super-performance-optimized,
often ditching canonical, built-in, and wildly adopted features in favor of
low-level, high-performance and precisely hand-crafted alternatives. Dustin&rsquo;s
article is a masterpiece for several reasons; I suggest you invest your time
<a href="https://dusted.codes/how-fast-is-really-aspnet-core">reading it</a>.</p>
<p>But yeah, despite this glitch, the takeaway is that .NET 7 is speedy, faster
than previous versions, and on par with, if not (far?) superior to, most stacks
and frameworks. The <a href="https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7">Stephen Toub&rsquo;s article</a> is a testament to the massive
work done and the achievements obtained.</p>
<p>Most importantely, we get most of these speed benefits for free, just by
upgrading to .NET 7. And the good new is, the upgrade is as easy as changing
the framework moniker from, say, <code>net6.0</code> to <code>net7.0</code> and upgrading the
Microsoft dependencies to v7.0.0.</p>
<h2 id="2-c-11-required-modifier">2. C# 11 <code>required</code> modifier</h2>
<p>As a consequence of the C# release cycle alignment to that of.NET itself (which
is much faster), recent versions of C# see fewer features announcements than in
the past. A good thing in my opinion. Of the several appreciable new features
coming with C# 11, a remarkable one is the <a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/required"><code>required</code> modifier</a>.</p>
<p>When you enable nullable checks in a project, non-nullable string properties
are flagged with warning that they should be initialized with a non-null value
when exiting the constructor:</p>
<p><img loading="lazy" src="/images/required-keyword1.png"></p>
<p>A common workaround has been these properties them with a <code>null!</code> value. That
is like telling the compiler that we know they should be initialized with a
non-nullable, but well, let&rsquo;s initialize them with a null value first, just in
case. It&rsquo;ll all be sorted later in the code. Somewhat awkward and prone to
errors. Also, battling the compiler like that is a tedious task.</p>
<p>Enter the <code>required</code> keyword. When you flag a property with <code>required,</code> the
IntelliSense engine will report an error if the property value is not set <em>at
initialization</em>, not at declaration.</p>
<p><img loading="lazy" src="/images/required-keyword2.png"></p>
<p>When someone initializes our class instance, he/she&rsquo;s <em>required</em> to set an
explicit value for our property. Notice how we went from a warning (which
will compile) to an error (which won&rsquo;t compile). Once you start using this
feature, it feels so obvious and natural that you wonder why it wasn&rsquo;t there
right from start.</p>
<h2 id="3-c-11-raw-string-literals">3. C# 11 raw string literals</h2>
<p>In C# 11, wrapping a string with triple-double-quotes makes it a <a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-11.0/raw-string-literal">raw
literal</a>. Its main benefits are that no escaping of double-quotes is
necessary, and newlines are allowed within the string.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span><span style="font-weight:bold">var</span> xml = <span style="font-style:italic">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">          &lt;element attr=&#34;content&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">            &lt;body&gt;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">            &lt;/body&gt;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">          &lt;/element&gt;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">          &#34;&#34;&#34;</span>;
</span></span></code></pre></div><p>The code looks natural, and no runtime costs for specialized string
manipulation are required. One caveat is that string literals naturally remove
the indentation when producing the final literal value. The snippet above
prints as:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;element attr=&#34;content&#34;&gt;
</span></span><span style="display:flex;"><span>  &lt;body&gt;
</span></span><span style="display:flex;"><span>  &lt;/body&gt;
</span></span><span style="display:flex;"><span>&lt;/element&gt;
</span></span></code></pre></div><p>We can disable indentation removal like so:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span><span style="font-weight:bold">var</span> xml = <span style="font-style:italic">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">          &lt;element attr=&#34;content&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">            &lt;body&gt;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">            &lt;/body&gt;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">          &lt;/element&gt;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">&#34;&#34;&#34;</span>;
</span></span></code></pre></div><p>String interpolation is also supported:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span><span style="font-weight:bold">var</span> json = $$<span style="font-style:italic">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">             {
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">                &#34;summary&#34;: &#34;text&#34;,
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">                &#34;length&#34; : {{value.Length}},
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">             };
</span></span></span><span style="display:flex;"><span><span style="font-style:italic">             &#34;&#34;&#34;</span>
</span></span></code></pre></div><p>In hindsight, like the <code>required</code> modifier, raw string literals appear as
obvious.</p>
<h2 id="4-built-in-container-support">4. Built-in container support</h2>
<p>.NET 7 has <a href="https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk/">built-in container support</a>, meaning that <code>dotnet publish</code> can
now output to a container image instead of a directory. We control image names,
tags, and other settings (like the base image) via dedicated <code>.csproj</code> tags. Two
requirements:</p>
<ul>
<li>Docker must be running when we issue the <code>publish</code> command;</li>
<li>The <code>Microsoft.NET.Build.Containers</code> package must be added to the project as
a package reference.</li>
</ul>
<p>In my demo, I had a small console application that I published to a docker
image by simply issuing the following command:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>$ dotnet publish --os linux --arch x64 /t:PublishContainer -c Release
</span></span></code></pre></div><p>I did not mention a Dockerfile, and that&rsquo;s because it is not needed anymore.
All my projects deploy to docker containers and are already migrated to .NET 7.
I&rsquo;m currently using Dockerfiles, but I&rsquo;ll be experimenting with this
alternative in the coming weeks, both with builds and remote CI builds.</p>
<h2 id="5-native-aot">5. Native AOT</h2>
<p><a href="https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/">Native AOT</a> produces a standalone executable in the target platform&rsquo;s file
format, with no external dependencies. It&rsquo;s native, with no IL or JIT involved,
and provides fast startup time and a small, self-contained deployment.</p>
<p>In my demo, I just needed to add a <code>&lt;PublishAot&gt;true&lt;/PublishAot&gt;</code> tag to the
<code>.csproj</code>, and then the <code>dotnet publish -c Release</code> command produced a
single-file, macOS native executable. You can set the destination platform at
build-time like so:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>$ dotnet publish -r win-x64 -c Release
</span></span></code></pre></div><p>Native AOT will be determinant in a number of use cases, like
multi-cloud-deployments, lambda functions, and, in general, hyper-scale
services. ASP.NET Core is currently not supported, so we&rsquo;re limited to console
apps.</p>
<h2 id="6-and-7-rate-limiting-and-output-caching">6 and 7. Rate-limiting and output caching</h2>
<p>Ok, these are two, not one. Luckily, my pal Ugo, who was demoing ASP.NET Core 7
parts after me, took charge of showing these.</p>
<p>I briefly mentioned that rate-limiting and output caching are key features in
mature production systems. Until today, we had to bake them in-house or rely on
third-party packages. I&rsquo;ve been using LazyCache and AspNetCoreRateLimit myself.
The latter <a href="https://github.com/stefanprodan/AspNetCoreRateLimit/issues/382">recently acknowledged</a> the arrival of rate-limiting in .NET 7 and
embraced it in a new package that offers Redis as a rate-limiting backend.
<a href="https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/">Rate-limiting</a> and <a href="https://learn.microsoft.com/en-us/aspnet/core/performance/caching/output?view=aspnetcore-7.0">output caching</a> are now part of the ASP.NET Core
framework, and that&rsquo;s where they belong.</p>
<h2 id="8-minimal-apis-group-routes">8. Minimal APIs group routes</h2>
<p>I know I said 7. I don&rsquo;t use minimal APIs in production yet, but <a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-7.0#route-groups">group
routing</a> is beautiful and something I&rsquo;ll be employing on the first
occasion. During the meetup, an interesting (and much-expected) discussion
ensued on the usefulness of minimal APIs. Veterans of many battles don&rsquo;t deem
them necessary, especially in real-world use cases, which is actually accurate:
one can keep relying on the canonical MVC approach. The sentiment was that
Minimal APIs are mostly targeted to newcomers, which is probably true<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. As
someone coming from the Python REST ecosystem, I dig them a lot. They evolve
rapidly and I&rsquo;m sure we&rsquo;ll soon see them in action in complex, real scenarios.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>To Caesar what is Caesar&rsquo;s, short on time, I recycled both the idea and the materials from James Montemagno&rsquo;s <a href="https://www.youtube.com/watch?v=0BvCzZ9P7UY">excellent video</a> on the same the topic.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Back when Minimal APIs were about to debut, I wrote <em><a href="https://nicolaiarocci.com/will-.net-6-minimal-apis-turn-heads?">Will .NET 6 Minimal APIs turn heads?</a></em>, with some musings on their effectiveness and target audience.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>My Music in 2022 according to Spotify</title>
      <link>https://nicolaiarocci.com/my-music-in-2022-according-to-spotify/</link>
      <pubDate>Sat, 03 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-music-in-2022-according-to-spotify/</guid>
      <description>&lt;p&gt;Wrapped by Spotify, the 2022 edition just landed in my mailbox. This year I
listened to twenty-four different genres. My favorite was Indie Jazz, followed
by Hip Hop, Jazz, Electronica and Rock. I am a little puzzled about that Hip
Hop in second place. In total, I spent 14143 minutes listening to music, 80
percent more than other listeners in Italy did.&lt;/p&gt;
&lt;p&gt;My favorite track was &lt;a href=&#34;https://open.spotify.com/track/4v6soAl2R4sJB6Iyt2aiHw?si=5101c8519ddb4a2b&#34;&gt;Fear Of The Dawn&lt;/a&gt; by Jack White, followed by &lt;a href=&#34;https://open.spotify.com/track/3FoXWHV24HO9rpcwkYa9lF?si=773fe3def78c4423&#34;&gt;The
Beginning&lt;/a&gt; by Native Soul, &lt;a href=&#34;https://open.spotify.com/track/4HWC8Ymr2TlkTo97ttMiIq?si=10862b9eee7b496c&#34;&gt;Sorcery&lt;/a&gt; by The Toxic Avenger, &lt;a href=&#34;https://open.spotify.com/track/3Uxjvj6TXr742JOFa7qYn6?si=074fa76aa8c64b8b&#34;&gt;Spirals&lt;/a&gt; by
Django Django, and &lt;a href=&#34;https://open.spotify.com/track/2LRiyKKJf2RTuFx31DEU6E?si=57c827fd08b2499b&#34;&gt;Boy From Michigan&lt;/a&gt; by John Grant.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wrapped by Spotify, the 2022 edition just landed in my mailbox. This year I
listened to twenty-four different genres. My favorite was Indie Jazz, followed
by Hip Hop, Jazz, Electronica and Rock. I am a little puzzled about that Hip
Hop in second place. In total, I spent 14143 minutes listening to music, 80
percent more than other listeners in Italy did.</p>
<p>My favorite track was <a href="https://open.spotify.com/track/4v6soAl2R4sJB6Iyt2aiHw?si=5101c8519ddb4a2b">Fear Of The Dawn</a> by Jack White, followed by <a href="https://open.spotify.com/track/3FoXWHV24HO9rpcwkYa9lF?si=773fe3def78c4423">The
Beginning</a> by Native Soul, <a href="https://open.spotify.com/track/4HWC8Ymr2TlkTo97ttMiIq?si=10862b9eee7b496c">Sorcery</a> by The Toxic Avenger, <a href="https://open.spotify.com/track/3Uxjvj6TXr742JOFa7qYn6?si=074fa76aa8c64b8b">Spirals</a> by
Django Django, and <a href="https://open.spotify.com/track/2LRiyKKJf2RTuFx31DEU6E?si=57c827fd08b2499b">Boy From Michigan</a> by John Grant.</p>
<p>My favorite artists have been Max Gazzè (a recent rediscovery-and reappraisal),
Rosalía, Accademia Bizantina, Subsonica and Jack White. Again, color me a
little surprised. I like Max Gazzè, but I&rsquo;d swear I listened to many other
artists for at least the same amount of time, if not (way) more. But what do I
know? One cannot beat the algorithm, right?</p>
<p>My “music personality,” as Spotify calls it, would be that of a “serious
relationship: you carefully select the music and artists you listen to but have
a lot of affection to give. If you like an artist, then it’s serious.” Which I
have to admit is kind of my general attitude, not just toward music. Here&rsquo;s my
top 101 (not a typo) for 2022:</p>
<ul>
<li><a href="https://open.spotify.com/playlist/37i9dQZF1F0sijgNaJdgit?si=834dd8504bf3430b">My Top Songs of 2022</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>I am on Mastodon and I love it</title>
      <link>https://nicolaiarocci.com/i-am-on-mastodon-and-i-love-it/</link>
      <pubDate>Fri, 02 Dec 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-on-mastodon-and-i-love-it/</guid>
      <description>&lt;p&gt;Marcus Hutchins on Mastodon:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What I missed about Mastodon was its very different culture. Ad-driven social
media platforms are willing to tolerate monumental volumes of abusive users.
They’ve discovered the same thing the Mainstream Media did: negative emotions
grip people’s attention harder than positive ones. Hate and fear drives
engagement, and engagement drives ad impressions.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More &lt;a href=&#34;https://escapingtech.com/tech/opinions/i-was-wrong-about-mastodon-moderation.html&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have been on Mastodon for a few weeks now, and wow, what a breath of fresh
air. I&amp;rsquo;m only syndicating to Twitter (and have been for a while, as you might
have noticed) while I&amp;rsquo;m active and engaged on Masto. I know this is breaking my
&lt;a href=&#34;https://indieweb.org/POSSE&#34;&gt;POSSE&lt;/a&gt; stance so much that I&amp;rsquo;ve set up my own Masto instance so I could own my
content over there like I do with this website. I never switched from fosstodon
(which is an instance I like a lot), though. I&amp;rsquo;ll wait a little bit and then
decide on the move.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Marcus Hutchins on Mastodon:</p>
<blockquote>
<p>What I missed about Mastodon was its very different culture. Ad-driven social
media platforms are willing to tolerate monumental volumes of abusive users.
They’ve discovered the same thing the Mainstream Media did: negative emotions
grip people’s attention harder than positive ones. Hate and fear drives
engagement, and engagement drives ad impressions.</p></blockquote>
<p>More <a href="https://escapingtech.com/tech/opinions/i-was-wrong-about-mastodon-moderation.html">here</a>.</p>
<p>I have been on Mastodon for a few weeks now, and wow, what a breath of fresh
air. I&rsquo;m only syndicating to Twitter (and have been for a while, as you might
have noticed) while I&rsquo;m active and engaged on Masto. I know this is breaking my
<a href="https://indieweb.org/POSSE">POSSE</a> stance so much that I&rsquo;ve set up my own Masto instance so I could own my
content over there like I do with this website. I never switched from fosstodon
(which is an instance I like a lot), though. I&rsquo;ll wait a little bit and then
decide on the move.</p>
<p>What impresses me is the atmosphere and overall level of engagement on Masto. I
have 2.1k followers on Twitter and just a little over 100 on Masto, and yet,
the Masto feed is so much richer and more interesting, and the interaction
level is incomparable. The Masto vibe these days reminds me of Twitter when I
joined back in 2009. Better yet, of the old BBS days, or Usenet. Hopefully, it
will last, and, for the reasons outlined by Marcus&rsquo; post above (mandatory read,
IMHO), I am confident it will.</p>
<p><a href="https://fosstodon.org/@nicola">Join me on Mastodon</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Mašen&#39;ka</title>
      <link>https://nicolaiarocci.com/book-review-ma%C5%A1enka/</link>
      <pubDate>Wed, 30 Nov 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-ma%C5%A1enka/</guid>
      <description>&lt;p&gt;Masen&amp;rsquo;ka (or Mary) is Nabokov&amp;rsquo;s debut novel. It was written when he was in his
twenties, living as an émigré in Berlin, just like the story&amp;rsquo;s protagonist. In
the introduction of my Italian edition (Adelphi), the author admits that some
life events poured into the narration. The depiction of Ganin&amp;rsquo;s life in a
pension filled with fellow Russian ex-pats, and the relationships between them,
is undoubtedly reminiscent of Nabokov&amp;rsquo;s own experience.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Masen&rsquo;ka (or Mary) is Nabokov&rsquo;s debut novel. It was written when he was in his
twenties, living as an émigré in Berlin, just like the story&rsquo;s protagonist. In
the introduction of my Italian edition (Adelphi), the author admits that some
life events poured into the narration. The depiction of Ganin&rsquo;s life in a
pension filled with fellow Russian ex-pats, and the relationships between them,
is undoubtedly reminiscent of Nabokov&rsquo;s own experience.</p>
<p><img alt="Book cover: Masen&rsquo;ka" loading="lazy" src="/images/book-cover-masenka.jpg#right">
Several of the themes of this story will be recurrent in his later works:
memory, Russian ex-pat, nostalgia and a yearning for the past, which is, in
fact, the central theme here. Young Nabokov&rsquo;s prose is good but not as great as
in his later works. Here, we appreciate the beginnings of what will eventually
pupate and make Nabokov one of the greatest.</p>
<p>With this work, Nabokov tells us that no matter the pomp and nostalgia, one
must leave the past behind and let the present life flow.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Origins of Python</title>
      <link>https://nicolaiarocci.com/the-origins-of-python/</link>
      <pubDate>Sat, 26 Nov 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-origins-of-python/</guid>
      <description>&lt;p&gt;Yesterday the creator of the Python language, Guido van Rossum, &lt;a href=&#34;https://twitter.com/gvanrossum/status/1596268474518876160&#34;&gt;tweeted&lt;/a&gt;
about &lt;a href=&#34;https://inference-review.com/article/the-origins-of-python&#34;&gt;The Origins of Python&lt;/a&gt;, an essay by his mentor, Lambert Meertens.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;On Sunday, June 21, 1970, in an office building on Great Portland Street in
London, a teletype sprang to life. Under the heading &amp;ldquo;HAPPY FAMILIES,&amp;rdquo; the
machine rattled out a sequence of English sentences, such as &amp;ldquo;THE DOG SITS ON
THE BABY&amp;rdquo; and &amp;ldquo;UNCLE TED PLAYS WITH SISTER.&amp;rdquo; The &amp;ldquo;Happy Families&amp;rdquo; program
that produced this output had been written that same weekend by someone with
no prior programming experience, a participant in a workshop organized by the
Computer Arts Society offering a course in &amp;ldquo;non-numerical programming.&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday the creator of the Python language, Guido van Rossum, <a href="https://twitter.com/gvanrossum/status/1596268474518876160">tweeted</a>
about <a href="https://inference-review.com/article/the-origins-of-python">The Origins of Python</a>, an essay by his mentor, Lambert Meertens.</p>
<blockquote>
<p>&ldquo;On Sunday, June 21, 1970, in an office building on Great Portland Street in
London, a teletype sprang to life. Under the heading &ldquo;HAPPY FAMILIES,&rdquo; the
machine rattled out a sequence of English sentences, such as &ldquo;THE DOG SITS ON
THE BABY&rdquo; and &ldquo;UNCLE TED PLAYS WITH SISTER.&rdquo; The &ldquo;Happy Families&rdquo; program
that produced this output had been written that same weekend by someone with
no prior programming experience, a participant in a workshop organized by the
Computer Arts Society offering a course in &ldquo;non-numerical programming.&rdquo;</p></blockquote>
<blockquote>
<p>Almost fifty years later, on October 26, 2019, in Istanbul, the eyes of a
young woman lit up as she managed to get her very first program to run. She
was attending a workshop organized by Django Girls, an international
non-profit organization aiming to empower women through free, one-day
programming workshops.</p></blockquote>
<blockquote>
<p>The programming language used at the London workshop in 1970 was TELCOMP, a
simple unstructured language similar to BASIC—not BASIC as it is now, but
unstructured BASIC as it was then. The programming language taught at the
Istanbul workshop in 2019 was Python, a programming language designed by Guido
van Rossum that has become wildly popular, steadily gaining in popularity
since an inconspicuous public release in 1991. As far apart as these events
are, both in time and geography, an arc of history connects them.&rdquo;</p></blockquote>
<p>It is a magnificent article. If you&rsquo;re passionate about Python, and programming
languages in general, make sure to read it.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>In the same vein, another outstanding reading would be <a href="https://dl.acm.org/doi/pdf/10.1145/3386325">The Early History of F#</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: The Crow Comes Last</title>
      <link>https://nicolaiarocci.com/book-review-the-crow-comes-last/</link>
      <pubDate>Fri, 25 Nov 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-the-crow-comes-last/</guid>
      <description>&lt;p&gt;The Crow Comes Last is a collection of thirty short stories written between
1945 and 1948, primarily based on the author&amp;rsquo;s wartime experiences as a
resistance fighter during WWII and then in postwar Italy. Some are brutal,
others funny, and some are gritty. They all revolve around the themes he
perfectly defined while talking about his book:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I prefer to divide the subject into three parts, to highlight three thematic
lines of my work from those years. The first is the &amp;lsquo;Resistance&amp;rsquo; story (or at
any rate of war or violence), seen as an adventure of suspense or terror, a
type of fiction that quite a few of us did at that time. The second line is
also common to much fiction of those years and is the postwar picaresque
tale, stories coloured by elemental characters and appetites. In the third,
the landscape of the Riviera dominates, with boys or teenagers and animals.
This last line is a personal development of a &amp;rsquo;literature of memory. Needless
to say, the three lines often.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The Crow Comes Last is a collection of thirty short stories written between
1945 and 1948, primarily based on the author&rsquo;s wartime experiences as a
resistance fighter during WWII and then in postwar Italy. Some are brutal,
others funny, and some are gritty. They all revolve around the themes he
perfectly defined while talking about his book:</p>
<blockquote>
<p>I prefer to divide the subject into three parts, to highlight three thematic
lines of my work from those years. The first is the &lsquo;Resistance&rsquo; story (or at
any rate of war or violence), seen as an adventure of suspense or terror, a
type of fiction that quite a few of us did at that time. The second line is
also common to much fiction of those years and is the postwar picaresque
tale, stories coloured by elemental characters and appetites. In the third,
the landscape of the Riviera dominates, with boys or teenagers and animals.
This last line is a personal development of a &rsquo;literature of memory. Needless
to say, the three lines often.</p></blockquote>
<p><img alt="The Crow Comes Last" loading="lazy" src="/images/the-crow-comes-last.jpg#right">
Although mainly written in the neorealist style, many scenes are infused with
visionary, fable-like elements characteristic of Calvino&rsquo;s later fantasy
period. My favourites are <em>Adam, One Afternoon</em>, <em>Theft in the Cake Shop</em>, <em>The
Cat and the Policeman</em>, <em>Fear on the Foothpath</em>, and <em>The Crow Comes Last</em>.</p>
<p>Short story collections are not fancy these days and probably never have been.
Yet this is a book I would probably suggest to someone coming to Calvino for
the first time, as some of his full-length novels can sometimes feel too
&ldquo;esotheric&rdquo; to the newcomer.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Castle Rock Climb in Antarctica</title>
      <link>https://nicolaiarocci.com/castle-rock-climb-in-antarctica/</link>
      <pubDate>Fri, 18 Nov 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/castle-rock-climb-in-antarctica/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s regular hiking, and then there&amp;rsquo;s Antarctica hiking. Check out &lt;a href=&#34;https://brr.fyi/posts/castle-rock-climb&#34;&gt;brr&amp;rsquo;s
report of a Sunday&amp;rsquo;s hike&lt;/a&gt; from McMurdo&amp;rsquo;s base up to the tip of Castle
Rock, with spectacular views of Mount Erebus and the surroundings.&lt;/p&gt;
&lt;p&gt;brr&amp;rsquo;s Antarticta blog is a recent addition to my RSS feed collection. It&amp;rsquo;s
always interesting to follow people living and working in the most remote parts
of the world.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There&rsquo;s regular hiking, and then there&rsquo;s Antarctica hiking. Check out <a href="https://brr.fyi/posts/castle-rock-climb">brr&rsquo;s
report of a Sunday&rsquo;s hike</a> from McMurdo&rsquo;s base up to the tip of Castle
Rock, with spectacular views of Mount Erebus and the surroundings.</p>
<p>brr&rsquo;s Antarticta blog is a recent addition to my RSS feed collection. It&rsquo;s
always interesting to follow people living and working in the most remote parts
of the world.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.0.4 released</title>
      <link>https://nicolaiarocci.com/eve-2.0.4-released/</link>
      <pubDate>Thu, 10 Nov 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.0.4-released/</guid>
      <description>&lt;p&gt;I just released Eve 2.0.4, the REST API framework for #python. It&amp;rsquo;s available
on PyPI and includes a relevant security fix so you might want to update ASAP.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pypi.org/project/Eve/2.0.4/&#34;&gt;Package info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.python-eve.org/en/stable/&#34;&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>I just released Eve 2.0.4, the REST API framework for #python. It&rsquo;s available
on PyPI and includes a relevant security fix so you might want to update ASAP.</p>
<ul>
<li><a href="https://pypi.org/project/Eve/2.0.4/">Package info</a></li>
<li><a href="https://docs.python-eve.org/en/stable/">Docs</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Ravenna</title>
      <link>https://nicolaiarocci.com/book-review-ravenna/</link>
      <pubDate>Mon, 07 Nov 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-ravenna/</guid>
      <description>&lt;p&gt;&lt;em&gt;Nerdy prelude.&lt;/em&gt; Local Bulletin Board Systems (BBS) were all the
range when I was a teenager. With my group of local hackers, we hacked our way
into ITAPAC, the then-leading Italian packet-switching network (we are talking
pre-Internet era here.) Via ITAPAC, we&amp;rsquo;d connect to so-called &amp;ldquo;out-dial
systems&amp;rdquo; in the USA. From one of those, we&amp;rsquo;d finally call our target BBSes with
a local call at no cost. We felt so invincible! I signed up on Channel One BBS;
I think that was the name. This particular BBS was located in Cambridge, MA,
and was chock-full of public domain and shareware I could download. Anyways,
the SysOp sent me a postcard confirming my signup (an old-school paper postcard
delivered via international postal service). Receiving a postcard from the US
was exciting in itself, but what was startling was a handwritten note on the
postcard. It said, &amp;ldquo;Ravenna, city of beautiful mosaics.&amp;rdquo; I was shocked that
someone from Cambridge, MA, would know about my tiny, little hometown&amp;rsquo;s mosaics
and let me know.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Nerdy prelude.</em> Local Bulletin Board Systems (BBS) were all the
range when I was a teenager. With my group of local hackers, we hacked our way
into ITAPAC, the then-leading Italian packet-switching network (we are talking
pre-Internet era here.) Via ITAPAC, we&rsquo;d connect to so-called &ldquo;out-dial
systems&rdquo; in the USA. From one of those, we&rsquo;d finally call our target BBSes with
a local call at no cost. We felt so invincible! I signed up on Channel One BBS;
I think that was the name. This particular BBS was located in Cambridge, MA,
and was chock-full of public domain and shareware I could download. Anyways,
the SysOp sent me a postcard confirming my signup (an old-school paper postcard
delivered via international postal service). Receiving a postcard from the US
was exciting in itself, but what was startling was a handwritten note on the
postcard. It said, &ldquo;Ravenna, city of beautiful mosaics.&rdquo; I was shocked that
someone from Cambridge, MA, would know about my tiny, little hometown&rsquo;s mosaics
and let me know.</p>
<p>While Ravenna is relegated to a marginal role in the modern age, it played
a very significant one in ancient times. Quoting from the from the
backcover of the book:</p>
<blockquote>
<p>In 402 AD, after invading tribes broke through the Alpine frontiers of Italy
and threatened the imperial government in Milan, the young Emperor Honorius
made the momentous decision to move his capital to a small, easy defendable
city in the Po estuary - Ravenna. From then until 751 AD, Ravenna was first
the capital of the Western Roman Empire, then that of the immense kingdom of
Theoderic the Goth and finally the centre of Byzantine power in Italy.</p></blockquote>
<p><img loading="lazy" src="/images/book-cover-ravenna.jpg#right">
In her tome, Judith Herrin tells Ravenna&rsquo;s story from its time as the capital
of the Western Roman Empire to the late 8th century, when it inspired
Charlemagne&rsquo;s imperial and religious building projects in Aachen. This book&rsquo;s
576 pages are packed with dense information. Many political, military, and
spiritual characters&rsquo; in-life achievements and troubles build a complicated
narrative spanning four centuries. It helps that small, titled sections within
each chapter offer a palatable framework.</p>
<p>Herrin&rsquo;s monumental work is one to be admired and respected. I was especially
delighted when Pippin and his son Charlemagne came into play in the book&rsquo;s
final part. As I&rsquo;ve read <a href="/book-review-king-and-emperor-a-new-life-of-charlemagne/">King and Emperor, A New Life of Charlemagne</a>
recently, I could merge knowledge from the two works. The flow of events that
originated with the demise of the Western Roman Empire and, centuries later,
led to the first glimpse of &ldquo;Europe,&rdquo; as we intend it today, is much clearer
now.</p>
<p>Of Ravenna&rsquo;s glorious byzantine age, only the beautiful mosaics and the
baptisteries and churches containing them have survived for today&rsquo;s visitors to
enjoy.</p>
<p><em>&lsquo;O lone Ravenna! many a tale is told <!-- raw HTML omitted -->
Of thy great glories in the days of old&rsquo; <!-- raw HTML omitted -->
&ndash;Oscar Wilde</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Welcome to hell, Elon</title>
      <link>https://nicolaiarocci.com/welcome-to-hell-elon/</link>
      <pubDate>Sat, 29 Oct 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/welcome-to-hell-elon/</guid>
      <description>&lt;p&gt;As someone who&amp;rsquo;s been on board with Twitter since 2009, I have to admit that
I&amp;rsquo;m &lt;em&gt;very&lt;/em&gt; concerned with recent developments. I admire and respect Elon Musk
for his companies&amp;rsquo; achievements, especially in space and electric movement
industries, but the man himself, holy cow, what a drag.&lt;/p&gt;
&lt;p&gt;On The Verge, Nilay Patel&amp;rsquo;s brutal piece on the recent Twitter acquisition is
chock-full of brilliant insights on what it takes to run a modern commercial
social service.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As someone who&rsquo;s been on board with Twitter since 2009, I have to admit that
I&rsquo;m <em>very</em> concerned with recent developments. I admire and respect Elon Musk
for his companies&rsquo; achievements, especially in space and electric movement
industries, but the man himself, holy cow, what a drag.</p>
<p>On The Verge, Nilay Patel&rsquo;s brutal piece on the recent Twitter acquisition is
chock-full of brilliant insights on what it takes to run a modern commercial
social service.</p>
<blockquote>
<p>You fucked up real good, kiddo. Twitter is a disaster clown car company that
is successful despite itself, and there is no possible way to grow users and
revenue without making a series of enormous compromises that will ultimately
destroy your reputation and possibly cause grievous damage to your other
companies.</p></blockquote>
<blockquote>
<p>I say this with utter confidence because the problems with Twitter are not
engineering problems. They are political problems. Twitter, the company,
makes very little interesting technology; the tech stack is not the valuable
asset. The asset is the user base: hopelessly addicted politicians,
reporters, celebrities, and other people who should know better but keep
posting anyway. You! You, Elon Musk, are addicted to Twitter. You’re the
asset. You just bought yourself for $44 billion dollars.</p></blockquote>
<p>More <a href="https://www.theverge.com/2022/10/28/23428132/elon-musk-twitter-acquisition-problems-speech-moderation">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Brazilian Ju-Jitsu and me</title>
      <link>https://nicolaiarocci.com/brazilian-ju-jitsu-and-me/</link>
      <pubDate>Thu, 27 Oct 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/brazilian-ju-jitsu-and-me/</guid>
      <description>&lt;p&gt;I attended my first BJJ class a little more than a month ago. Going into it,
I was hesitant. After many years doing what most people today call
calisthenics, I wanted to try something new and challenging. But would it be
appropriate for me to get into martial arts at the age of fifty-two? When
I discovered that we have a branch of the renowned Roger Gracie Academy here in
my hometown, I thought it was time to find out.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I attended my first BJJ class a little more than a month ago. Going into it,
I was hesitant. After many years doing what most people today call
calisthenics, I wanted to try something new and challenging. But would it be
appropriate for me to get into martial arts at the age of fifty-two? When
I discovered that we have a branch of the renowned Roger Gracie Academy here in
my hometown, I thought it was time to find out.</p>
<p>I was simultaneously blown away and puzzled for the whole first two or three
weeks. I was surprised by how effective BJJ can be, even with only a few
classes. At the same time, martial arts are a new space for me. So many new
things to absorb in an uncharted, unfamiliar territory in which I often feel
lost, struggling for guidance. All trainees, from white to brown belts, and my
coach, have been extraordinarily supportive, always making me feel comfortable
despite me being the only grey beard on the tatami. I could see myself doing
BJJ for the foreseeable future, along with my calisthenics routine.</p>
<p>A couple of weeks ago, during a &ldquo;rolling&rdquo; (sparring) session with a fellow
white belt, I cracked a couple of ribs. I didn&rsquo;t immediately realize it,
though. I kept sparring. Later in the evening, the pain increased, but
I stubbornly went back for the rest of the week. The pain would go away. Only
it didn&rsquo;t. In my many years of strenuous training, whether running, swimming,
climbing or calisthenics, I had to deal with all kinds of injuries, yet it
taught me nothing. Here I am, at an age at which I&rsquo;m supposed to be the wise
guy in the room, recovering from an underestimated injury.</p>
<p>It&rsquo;s been two weeks, with several more to go before I fully recover. After much
consideration this morning, during my early walk (the only activity I can
perform without pain), I called my coach and told him I&rsquo;d stop training BJJ. At
my age, recovery takes longer; I&rsquo;m probably more subject to injury, and as it
appears, martial arts are not the smartest thing I can do to keep me in shape,
no matter how much I love them. I wish I had tried BJJ ten years ago, or maybe
twenty. I want to keep training for the long haul, and an impact sport does me
no good. As soon as I&rsquo;m recovered, I go back to calisthenics. Am I giving up
too soon? Maybe. I&rsquo;d love to progress in BJJ, and I&rsquo;m sure I would have a lot
of fun with it, but today, for once, I choose the known path of safety over the
unknown, exhilarating course of uncertainty.</p>
<p><img loading="lazy" src="/images/ju-jitsu.jpeg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>A lot of what is known about pirates is not true</title>
      <link>https://nicolaiarocci.com/a-lot-of-what-is-known-about-pirates-is-not-true/</link>
      <pubDate>Wed, 26 Oct 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-lot-of-what-is-known-about-pirates-is-not-true/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In 1701, in Middletown, New Jersey, Moses Butterworth languished in a jail,
accused of piracy. Like many young men based in England or her colonies, he
had joined a crew that sailed the Indian Ocean intent on plundering ships of
the Muslim Mughal Empire. Throughout the 1690s, these pirates marauded
vessels laden with gold, jewels, silk, and calico on pilgrimage toward Mecca.
After achieving great success, many of these men sailed back into the
Atlantic via Madagascar to the North American seaboard, where they quietly
disembarked in Charleston, Philadelphia, New Jersey, New York City, Newport,
and Boston, and made themselves at home.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>In 1701, in Middletown, New Jersey, Moses Butterworth languished in a jail,
accused of piracy. Like many young men based in England or her colonies, he
had joined a crew that sailed the Indian Ocean intent on plundering ships of
the Muslim Mughal Empire. Throughout the 1690s, these pirates marauded
vessels laden with gold, jewels, silk, and calico on pilgrimage toward Mecca.
After achieving great success, many of these men sailed back into the
Atlantic via Madagascar to the North American seaboard, where they quietly
disembarked in Charleston, Philadelphia, New Jersey, New York City, Newport,
and Boston, and made themselves at home.</p></blockquote>
<p>More <a href="https://www.neh.gov/humanities/2017/winter/feature/lot-what-known-about-pirates-not-true-and-lot-what-true-not-known">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Motorcycling the Foreste Casentinesi National Park</title>
      <link>https://nicolaiarocci.com/motorcycling-the-foreste-casentinesi-national-park/</link>
      <pubDate>Tue, 25 Oct 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/motorcycling-the-foreste-casentinesi-national-park/</guid>
      <description>&lt;p&gt;Last Saturday I went on a motorcycle trip with &lt;a href=&#34;https://tomccitalia.org&#34;&gt;my club&lt;/a&gt;. We had about forty
motorcycles, many coming from afar—a tremendous turnout considering how
advanced the season is. This event was particularly involving for me, as my
local group was in charge of the organization. We were going to visit the
&lt;a href=&#34;https://it.wikipedia.org/wiki/Parco_nazionale_delle_Foreste_Casentinesi%2C_Monte_Falterona_e_Campigna&#34;&gt;Foreste Casentinesi National Park&lt;/a&gt;, which isn&amp;rsquo;t far from our hometown.&lt;/p&gt;
&lt;p&gt;We know those roads and their surroundings well; we call them home, yet
I insisted on scouting the planned route not once but twice, and I think it was
crucial to the event&amp;rsquo;s success. On the narrow road that climbs to a mountain
pass, we spotted a mobile traffic light (for a road construction site) with
a long (six minutes!) red/green cycle. We arranged a plan in case the
motorcycle&amp;rsquo;s column split at the light: almost one kilometer past the red
light, there was a safe place where the forward group could safely stop off the
road and wait for the rest to rejoin. All the participants were informed at the
departure briefing: if you get stopped at the red light, don&amp;rsquo;t get
over-stressed: we&amp;rsquo;ll be waiting for you one kilometer down the road. You won&amp;rsquo;t
see us, but we&amp;rsquo;ll be waiting for you safely. Don&amp;rsquo;t rush it, and don&amp;rsquo;t stop to
phone us. We won&amp;rsquo;t be at the first apparently-good parking place but at the
second spot, which, despite not looking as good, is way safer (less gravel on
the ground). Situations like these can cause confusion and danger to a large
group of motorcycles roaming on narrow, steep mountain roads which are often in
poor conditiong. The reconnaissance ride allowed us to plan for several
potential pitfalls like this one.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last Saturday I went on a motorcycle trip with <a href="https://tomccitalia.org">my club</a>. We had about forty
motorcycles, many coming from afar—a tremendous turnout considering how
advanced the season is. This event was particularly involving for me, as my
local group was in charge of the organization. We were going to visit the
<a href="https://it.wikipedia.org/wiki/Parco_nazionale_delle_Foreste_Casentinesi%2C_Monte_Falterona_e_Campigna">Foreste Casentinesi National Park</a>, which isn&rsquo;t far from our hometown.</p>
<p>We know those roads and their surroundings well; we call them home, yet
I insisted on scouting the planned route not once but twice, and I think it was
crucial to the event&rsquo;s success. On the narrow road that climbs to a mountain
pass, we spotted a mobile traffic light (for a road construction site) with
a long (six minutes!) red/green cycle. We arranged a plan in case the
motorcycle&rsquo;s column split at the light: almost one kilometer past the red
light, there was a safe place where the forward group could safely stop off the
road and wait for the rest to rejoin. All the participants were informed at the
departure briefing: if you get stopped at the red light, don&rsquo;t get
over-stressed: we&rsquo;ll be waiting for you one kilometer down the road. You won&rsquo;t
see us, but we&rsquo;ll be waiting for you safely. Don&rsquo;t rush it, and don&rsquo;t stop to
phone us. We won&rsquo;t be at the first apparently-good parking place but at the
second spot, which, despite not looking as good, is way safer (less gravel on
the ground). Situations like these can cause confusion and danger to a large
group of motorcycles roaming on narrow, steep mountain roads which are often in
poor conditiong. The reconnaissance ride allowed us to plan for several
potential pitfalls like this one.</p>
<p>Anyways, I&rsquo;m rambling. It was a great late autumn trip. The woods are
spectacular this time of the year, which is why we hit that area with this
trip.</p>
<p><em>Update. A video recorded during the event is available on <a href="https://www.youtube.com/watch?v=rDoGXW9K7IM">YouTube</a></em>.</p>
<p><img loading="lazy" src="/images/foreste-casentinesi-tomcc-3.jpg">
<img loading="lazy" src="/images/foreste-casentinesi-tomcc-2.jpg">
<img loading="lazy" src="/images/foreste-casentinesi-tomcc-1.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>How to avoid unwanted calls on iPhone</title>
      <link>https://nicolaiarocci.com/how-to-avoid-unwanted-calls-on-iphone/</link>
      <pubDate>Thu, 20 Oct 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-avoid-unwanted-calls-on-iphone/</guid>
      <description>&lt;p&gt;Oh, joy. After many years with an iPhone, today I learned how to stop spam
calls with a single, not-really-super-secret move.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Settings &amp;gt; Phone &amp;gt; Silence Unknown Callers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&amp;rsquo;s it. Unknown callers now go straight to my recent calls list for me to
(eventually) review. Most importantly, the phone doesn&amp;rsquo;t ring.&lt;/p&gt;
&lt;p&gt;I initially had True Caller installed and enabled, which worked for a while.
Spammers use throw-away numbers anyway, so it&amp;rsquo;s super-hard for tools like that
to keep track. In Italy, we can enlist in a nationwide &amp;ldquo;oppositions register&amp;rdquo;.
Once a phone number is registered there, national call services can&amp;rsquo;t call it.
I signed up on the register&amp;rsquo;s opening day, which also worked for a few days.
There are ways for spammers to go around the register, such as calling from
abroad. I fell back to simply not answering unknown calls. That worked, but
unsolicited calls still caught my attention and muting the phone helped
only a little.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Oh, joy. After many years with an iPhone, today I learned how to stop spam
calls with a single, not-really-super-secret move.</p>
<pre><code>Settings &gt; Phone &gt; Silence Unknown Callers
</code></pre>
<p>That&rsquo;s it. Unknown callers now go straight to my recent calls list for me to
(eventually) review. Most importantly, the phone doesn&rsquo;t ring.</p>
<p>I initially had True Caller installed and enabled, which worked for a while.
Spammers use throw-away numbers anyway, so it&rsquo;s super-hard for tools like that
to keep track. In Italy, we can enlist in a nationwide &ldquo;oppositions register&rdquo;.
Once a phone number is registered there, national call services can&rsquo;t call it.
I signed up on the register&rsquo;s opening day, which also worked for a few days.
There are ways for spammers to go around the register, such as calling from
abroad. I fell back to simply not answering unknown calls. That worked, but
unsolicited calls still caught my attention and muting the phone helped
only a little.</p>
<p>The Silence Unknown Callers option has probably always been there, unbeknownst
to me. It&rsquo;s a godsend. Now my iPhone doesn&rsquo;t even try to ring anymore.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My session at WPC 2022</title>
      <link>https://nicolaiarocci.com/my-session-at-wpc-2022/</link>
      <pubDate>Wed, 19 Oct 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-session-at-wpc-2022/</guid>
      <description>&lt;p&gt;Yesterday I was at &lt;a href=&#34;https://www.wpc2022.it/&#34;&gt;WPC 2022&lt;/a&gt;, &amp;ldquo;the most important Italian conference on
Microsoft technologies&amp;rdquo;, where I presented a one-hour session titled &amp;ldquo;Reliable
end-to-end testing for modern web apps with Microsoft Playwright.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Attendance was great and there was a lot of excitement up in the air; it was
evident that people were happy to meet and interact in person again. After the
forced two years hiatus, it was great to be back at a big on-site conference,
let alone speak at it. I delivered my talk to a packed-full room of nodding,
smiling and questioning attendees, which felt fantastic.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday I was at <a href="https://www.wpc2022.it/">WPC 2022</a>, &ldquo;the most important Italian conference on
Microsoft technologies&rdquo;, where I presented a one-hour session titled &ldquo;Reliable
end-to-end testing for modern web apps with Microsoft Playwright.&rdquo;</p>
<p>Attendance was great and there was a lot of excitement up in the air; it was
evident that people were happy to meet and interact in person again. After the
forced two years hiatus, it was great to be back at a big on-site conference,
let alone speak at it. I delivered my talk to a packed-full room of nodding,
smiling and questioning attendees, which felt fantastic.</p>
<p><img loading="lazy" src="/images/wpc2022-1.jpg"></p>
<p>I think I&rsquo;m satisfied with my delivery, although I managed to screw up a few
things, most notably showing my Twitter password live (that was a funny
moment)<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I also forgot to mention a couple of things.</p>
<ul>
<li>I demoed CLI usage on Bash, but the kind people working on Playwright also
provide full Powershell support; the website defaults to Powershell for their
demo scripts;</li>
<li>I never mentioned the obvious: as you&rsquo;re testing your front-end application
with Playwright, you&rsquo;re actually performing a complete end-to-end test
involving your backend. There is great value in end-to-end testing. Several
times we caught subtle things that weren&rsquo;t a direct front-end issue but more
the result of the interaction with the backend. And yes (thanks to the guy who
asked), your testing environment must support the whole stack.</li>
</ul>
<p>The slide deck contains most of the code and bash commands I demoed live on
stage. It&rsquo;s nothing too original; I reproduced the examples on the official
website with a few variations and additions.






<div id="adobe-dc-view" style="border:0; display:block;padding: 0.6em 0;position:relative;left:50%;transform:translateX(-50%);height: 450px; width: 800px;"></div>
<script src="https://documentcloud.adobe.com/view-sdk/viewer.js"></script>
<script type="text/javascript">
	document.addEventListener("adobe_dc_view_sdk.ready", function(){ 
		var adobeDCView = new AdobeDC.View({clientId: "", divId: "adobe-dc-view"});
		adobeDCView.previewFile({
                content:{location: {url: "https://nicolaiarocci.com/pdf\/reliable-end-to-end-testing-of-modern-web-apps-with-microsoft-playwright.pdf"}},
			metaData:{fileName: "reliable-end-to-end-testing-of-modern-web-apps-with-microsoft-playwright.pdf"}
		}, {embedMode: "SIZED_CONTAINER", showDownloadPDF: false, showPrintPDF: false});
	});
</script>
</p>
<p>I had fun performing again in front of a real, live crowd. Perhaps the induced
break, unexpected and undesirable for many reasons, did me good.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Having two-factor authentication up made it all less stressful.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The high cost of living your life online</title>
      <link>https://nicolaiarocci.com/the-high-cost-of-living-your-life-online/</link>
      <pubDate>Wed, 05 Oct 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-high-cost-of-living-your-life-online/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Studies have found that high levels of social media use are connected with an
increased risk of symptoms of anxiety and depression. There appears to be
substantial evidence connecting people’s mental health and their online
habits. Furthermore, many psychologists believe people may be dealing with
psychological effects that are pervasive but not always obvious.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More &lt;a href=&#34;https://www.wired.com/story/privacy-psychology-social-media/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Studies have found that high levels of social media use are connected with an
increased risk of symptoms of anxiety and depression. There appears to be
substantial evidence connecting people’s mental health and their online
habits. Furthermore, many psychologists believe people may be dealing with
psychological effects that are pervasive but not always obvious.</p></blockquote>
<p>More <a href="https://www.wired.com/story/privacy-psychology-social-media/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Indiepeople</title>
      <link>https://nicolaiarocci.com/indiepeople/</link>
      <pubDate>Fri, 30 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/indiepeople/</guid>
      <description>&lt;p&gt;Ben Werdmuller has a terrific post up on his website. His &amp;ldquo;tortured&amp;rdquo; analogy of
the web and governments as platforms for people to build upon is fascinating.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I believe strongly in the indieweb principles of distributed ownership,
control, and independence. For me, the important thing is that this is how we
get to a diverse web. A web where everyone can define not just what they
write but how they present is by definition far more expressive, diverse, and
interesting than one where most online content and identities must be
squished into templates created by a handful of companies based on their
financial needs. In other words, the open web is far superior to a medium
controlled by corporations in order to sell ads. The former encourages
expression; the latter encourages consumerist conformity.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ben Werdmuller has a terrific post up on his website. His &ldquo;tortured&rdquo; analogy of
the web and governments as platforms for people to build upon is fascinating.</p>
<blockquote>
<p>I believe strongly in the indieweb principles of distributed ownership,
control, and independence. For me, the important thing is that this is how we
get to a diverse web. A web where everyone can define not just what they
write but how they present is by definition far more expressive, diverse, and
interesting than one where most online content and identities must be
squished into templates created by a handful of companies based on their
financial needs. In other words, the open web is far superior to a medium
controlled by corporations in order to sell ads. The former encourages
expression; the latter encourages consumerist conformity.</p></blockquote>
<p>Read it all <a href="https://werd.io/2022/indiepeople">here</a> (<a href="https://adactio.com/links/19486">via</a>).</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Tripitaka Koreana</title>
      <link>https://nicolaiarocci.com/the-tripitaka-koreana/</link>
      <pubDate>Tue, 27 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-tripitaka-koreana/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The Tripitaka Koreana - carved on 81258 woodblocks in the 13th century - is
the most successful large data transfer over time yet achieved by humankind.
52 million characters of information, transmitted over nearly 8 centuries
with zero data loss - an unequalled achievement.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The full story  is available &lt;a href=&#34;https://threadreaderapp.com/thread/1574546784365445136.html&#34;&gt;here&lt;/a&gt; (&lt;a href=&#34;https://twitter.com/incunabula/status/1574546784365445136&#34;&gt;via&lt;/a&gt;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The Tripitaka Koreana - carved on 81258 woodblocks in the 13th century - is
the most successful large data transfer over time yet achieved by humankind.
52 million characters of information, transmitted over nearly 8 centuries
with zero data loss - an unequalled achievement.</p></blockquote>
<p>The full story  is available <a href="https://threadreaderapp.com/thread/1574546784365445136.html">here</a> (<a href="https://twitter.com/incunabula/status/1574546784365445136">via</a>).</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Man Who Explains Italy</title>
      <link>https://nicolaiarocci.com/the-man-who-explains-italy/</link>
      <pubDate>Fri, 23 Sep 2022 08:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-man-who-explains-italy/</guid>
      <description>&lt;p&gt;The New Yorker, in &lt;em&gt;The Man Who Explains Italy&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Italian podcaster Francesco Costa thinks that the foreign press’s
fixation on creeping Fascism in the country is overblown and unhelpful. If
the center-right coalition wins, “Will Italy be a police state? No,” he said.
“Will it be very badly run? Yes.”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Full article is available
&lt;a href=&#34;https://www.newyorker.com/culture/persons-of-interest/the-man-who-explains-italy&#34;&gt;here&lt;/a&gt;.
I&amp;rsquo;ve been following Francesco Costa for a few years. He&amp;rsquo;s talented,
conscientious, brilliant, and gifted with good humor. He deserves to be
featured in The New Yorker.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The New Yorker, in <em>The Man Who Explains Italy</em>:</p>
<blockquote>
<p>The Italian podcaster Francesco Costa thinks that the foreign press’s
fixation on creeping Fascism in the country is overblown and unhelpful. If
the center-right coalition wins, “Will Italy be a police state? No,” he said.
“Will it be very badly run? Yes.”</p></blockquote>
<p>Full article is available
<a href="https://www.newyorker.com/culture/persons-of-interest/the-man-who-explains-italy">here</a>.
I&rsquo;ve been following Francesco Costa for a few years. He&rsquo;s talented,
conscientious, brilliant, and gifted with good humor. He deserves to be
featured in The New Yorker.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.0.2 released</title>
      <link>https://nicolaiarocci.com/eve-2.0.2-released/</link>
      <pubDate>Fri, 23 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.0.2-released/</guid>
      <description>&lt;p&gt;Eve 2.0.2 was &lt;a href=&#34;https://pypi.org/project/Eve/2.0.2/&#34;&gt;just released today&lt;/a&gt;. It fixes a problem introduced with v2.0
in which ETag generation failed if &lt;code&gt;uuidRepresentation&lt;/code&gt; was not set in
&lt;code&gt;MONGO_OPTIONS&lt;/code&gt;. See &lt;a href=&#34;https://github.com/pyeve/eve/issues/1486&#34;&gt;issue #1486&lt;/a&gt; for details. Many thanks
&lt;a href=&#34;https://github.com/tgm-git&#34;&gt;@tgm&lt;/a&gt; for reporting and then contributing the fix.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Eve 2.0.2 was <a href="https://pypi.org/project/Eve/2.0.2/">just released today</a>. It fixes a problem introduced with v2.0
in which ETag generation failed if <code>uuidRepresentation</code> was not set in
<code>MONGO_OPTIONS</code>. See <a href="https://github.com/pyeve/eve/issues/1486">issue #1486</a> for details. Many thanks
<a href="https://github.com/tgm-git">@tgm</a> for reporting and then contributing the fix.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: The Count of Monte Cristo</title>
      <link>https://nicolaiarocci.com/book-review-the-count-of-monte-cristo/</link>
      <pubDate>Fri, 16 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-the-count-of-monte-cristo/</guid>
      <description>&lt;p&gt;In my early morning stroll, I sometimes listen to audiobooks. This was the case
with The Count of Monte Cristo. Rai Radio 3, the third channel of the national
broadcasting service, has been airing &lt;a href=&#34;https://www.raiplaysound.it/programmi/adaltavoce&#34;&gt;Ad Alta Voce&lt;/a&gt; (Aloud) for many years.
In the program, top-tier actors read old and new literary classics. The quality
of these productions is astounding. Audio editions are often edited, which was
the case with The Count, as the unabridged edition surpasses the 1200-page
count (a little-known fact is that most printed editions are also edited for
brevity). Despite the edits, &lt;a href=&#34;https://www.raiplaysound.it/audiolibri/ilcontedimontecristo&#34;&gt;the audiobook&lt;/a&gt;, splendidly performed by &lt;a href=&#34;https://en.wikipedia.org/wiki/Andrea_Giordana&#34;&gt;Andrea
Giordana&lt;/a&gt;, comprises thirty-five installments, each about thirty minutes
long. That makes for a lot of strolling.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In my early morning stroll, I sometimes listen to audiobooks. This was the case
with The Count of Monte Cristo. Rai Radio 3, the third channel of the national
broadcasting service, has been airing <a href="https://www.raiplaysound.it/programmi/adaltavoce">Ad Alta Voce</a> (Aloud) for many years.
In the program, top-tier actors read old and new literary classics. The quality
of these productions is astounding. Audio editions are often edited, which was
the case with The Count, as the unabridged edition surpasses the 1200-page
count (a little-known fact is that most printed editions are also edited for
brevity). Despite the edits, <a href="https://www.raiplaysound.it/audiolibri/ilcontedimontecristo">the audiobook</a>, splendidly performed by <a href="https://en.wikipedia.org/wiki/Andrea_Giordana">Andrea
Giordana</a>, comprises thirty-five installments, each about thirty minutes
long. That makes for a lot of strolling.</p>
<p><img loading="lazy" src="/images/the-count-of-monte-cristo.jpg#right">
The Count was initially published in a literary magazine, in eighteen parts,
from August 1844 to January 1846. Entirely attributed to Alexandre Dumas, it
was also authored by Auguste Maquet; ghostwriters are not just an XX-ish century
thing. According to the legend, when the publication started, Dumas didn&rsquo;t know
how the story would end or how it would develop. Nonetheless, it was an
immediate hit that quickly became a literary classic with many film and TV
adaptions and an infinite number of copycats. The story, partially based on
<a href="https://en.wikipedia.org/wiki/Pierre_Picaud">real facts</a>, is well known and as intriguing, captivating and entertaining
as it could get for a mid-XIX century adventure novel. It helps that it is
rooted in notable historical events like the <a href="https://en.wikipedia.org/wiki/Bourbon_Restoration_in_France">Bourbon Restoration</a> and
Napoleon&rsquo;s <a href="https://en.wikipedia.org/wiki/Hundred_Days">Hundred Days</a>.</p>
<p>The audiobook does an excellent job at skipping the tedious parts while
focusing on the main narrative but still includes many characters and events.
It is sometimes hard to track them all, especially if your listening, or
reading, is discontinuous, like in my case.</p>
<p>Critics didn&rsquo;t go easy on this novel. Famously, Umberto Eco had this to say:
&ldquo;The Count of Monte Cristo is undoubtedly one of the most exciting novels ever
written, and on the other hand, it is one of the most poorly written novels of
all time and all literature.&rdquo; R.L Stevenson concurs: &ldquo;The first part of Monte
Cristo, up to the discovery of the treasure, is a perfect piece of knockout
storytelling; there has never been a man who has participated in these moving
adventures without a quiver, yet Faria is a papier-mâché character and Dantès
little more than a name. The sequel is but the prolongation of a mistake, dark,
bloody, unnatural and stupid.&rdquo;</p>
<p>I think I agree with both: The Count of Montecristo is rich of exciting
moments, intriguing events and unexpected plot twists. Yet, the composition is
often confusing (mainly in the second part) and, more importantly, too
many implausible coincidences occur throughout the story. Yet, it&rsquo;s a lot of
entertainment. What I found more compelling, however, are its social and
historical competence. I learned a lot by reading (listening to) this novel.</p>
<p>Being the book junkie I am, I went out and bought the unabridged tome. I can&rsquo;t
help it; I must possess the physical thing. The book is now happily resting in
my library, and I can move on.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Software quality is systemic</title>
      <link>https://nicolaiarocci.com/software-quality-is-systemic/</link>
      <pubDate>Thu, 15 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/software-quality-is-systemic/</guid>
      <description>&lt;p&gt;Jacob Kaplan-Moss&amp;rsquo;s hot take on software quality:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Software quality is more the result of a system designed to produce
quality, and not so much the result of individual performance&lt;/strong&gt;. That is:
a group of mediocre programmers working with a structure designed to produce
quality will produce better software than a group of fantastic programmers
working in a system designed with other goals.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This leads to the insightful conclusion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Instead of spending tons of time and effort on hiring because you believe
that you can “only hire the best”, direct some of that effort towards
building a system that produces great results out of a wider spectrum of
individual performance.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jacob Kaplan-Moss&rsquo;s hot take on software quality:</p>
<blockquote>
<p><strong>Software quality is more the result of a system designed to produce
quality, and not so much the result of individual performance</strong>. That is:
a group of mediocre programmers working with a structure designed to produce
quality will produce better software than a group of fantastic programmers
working in a system designed with other goals.</p></blockquote>
<p>This leads to the insightful conclusion:</p>
<blockquote>
<p>Instead of spending tons of time and effort on hiring because you believe
that you can “only hire the best”, direct some of that effort towards
building a system that produces great results out of a wider spectrum of
individual performance.</p></blockquote>
<p>But what does he mean by a <em>system designed for quality</em>? Read it all <a href="https://jacobian.org/2022/sep/9/quality-is-systemic/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Motorcycling the Dolomites with the club</title>
      <link>https://nicolaiarocci.com/motorcycling-the-dolomites-with-the-club/</link>
      <pubDate>Tue, 13 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/motorcycling-the-dolomites-with-the-club/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/dolomiti_tomcc_2022.JPG&#34;&gt;&lt;/p&gt;
&lt;p&gt;Last weekend I went on a motorcycle trip with &lt;a href=&#34;https://tomccitalia.org&#34;&gt;my club&lt;/a&gt;. Our goal was to
visit the beautiful Dolomites in the Italian Alps&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;. We had twenty
motorcycles on the road, evenly split between modern classics (Bonnevillles in
all their variations) and adventure bikes (Tigers new and old). A great turnout
considering that the weather forecast for the weekend wasn&amp;rsquo;t exactly great. Of
all the TOMCC members who registered, only two were missing because they tested
positive for COVID.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="/images/dolomiti_tomcc_2022.JPG"></p>
<p>Last weekend I went on a motorcycle trip with <a href="https://tomccitalia.org">my club</a>. Our goal was to
visit the beautiful Dolomites in the Italian Alps<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. We had twenty
motorcycles on the road, evenly split between modern classics (Bonnevillles in
all their variations) and adventure bikes (Tigers new and old). A great turnout
considering that the weather forecast for the weekend wasn&rsquo;t exactly great. Of
all the TOMCC members who registered, only two were missing because they tested
positive for COVID.</p>
<p>Seeing old and new friends and spending time together roaming the mountain
roads felt great. We even visited places I didn&rsquo;t know about, namely the <a href="https://www.agordinodolomiti.it/index.php/cosa-vedere/natura/lago-del-mis/">Soffia
Falls at Mis Lake</a> and <a href="https://www.castellodiandraz.it">Castle Andraz</a>. After lunch at <a href="https://en.wikipedia.org/wiki/Lake_Misurina">Malga
Misurina</a>, where the food was good and personnel not so much, we were
supposed to cover another long stretch of road up to the springs of the Piave
river. When we looked in that direction and saw the intimidating front of
blue/black clouds ready to open their floodgates on us, we changed our minds
and headed back to our base camp. We still got flooded, but certainly not as
much as if we&rsquo;d pressed on with the original plan. The next day, a handful of
us continued roaming the countryside for more fantastic views, corners, food,
and camaraderie.</p>
<p>I&rsquo;m grateful to Sandro (&ldquo;Momo&rdquo;) for organizing this event. I know very well how
demanding and stressful running a motorcycle event can be. So far, we&rsquo;ve always
been lucky to have people willing to take on the challenge and volunteer to
hold events all around the country. As long as this continues, we&rsquo;ll have
a bright future and lots of fun.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Last year, I went there with a fellow TOMCC member and recorded a YouTube video. Check it out <a href="/triumph-bonneville-dolomites-ride-2021/">here</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Smiling Bears</title>
      <link>https://nicolaiarocci.com/book-review-smiling-bears/</link>
      <pubDate>Mon, 12 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-smiling-bears/</guid>
      <description>&lt;p&gt;My perception of zoos has always been of prisons—places of suffering where
animals are held captive for human entertainment. &lt;em&gt;Smiling Bears&lt;/em&gt; offered a new
perspective. Some (hopefully most) zoos provide a safe harbor to abused and
rescued animals who could never return to their natural habitats. Zookeepers
like Else Poulsen care for these creatures, accompanying them in their
rehabilitation process. I imagine not all zoos and zookeepers meet these
standards, but it is reassuring to know these things happen.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>My perception of zoos has always been of prisons—places of suffering where
animals are held captive for human entertainment. <em>Smiling Bears</em> offered a new
perspective. Some (hopefully most) zoos provide a safe harbor to abused and
rescued animals who could never return to their natural habitats. Zookeepers
like Else Poulsen care for these creatures, accompanying them in their
rehabilitation process. I imagine not all zoos and zookeepers meet these
standards, but it is reassuring to know these things happen.</p>
<p><img loading="lazy" src="/images/smiling-bears.jpg#right">
Few people know bears as intimately as Else Poulsen. She has raised bears,
comforted bears, taught bears, learned from bears, had bears communicate their
needs to her, and nursed bears back to health. This book offers remarkable
insights into the complexity and richness of bears behavior and emotional life.
Individual bear stories are often touching, as is the relationship they develop
with their care keeper.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica v3.4 released</title>
      <link>https://nicolaiarocci.com/fatturaelettronica-v3.4-released/</link>
      <pubDate>Fri, 09 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronica-v3.4-released/</guid>
      <description>&lt;p&gt;Today I released v3.4 of &lt;a href=&#34;https://fatturaelettronicaopensource.org/&#34;&gt;FatturaElettronica&lt;/a&gt;, a .NET open source project
that allows validation and de/serialization of electronic invoices adhering to
the standard defined by the Italian &amp;ldquo;Agenzia delle Entrate&amp;rdquo;. It&amp;rsquo;s doing very
well for such a niche project, with downloads now well beyond the one hundred
thousand mark.&lt;/p&gt;
&lt;p&gt;Be aware that this release anticipates support for &lt;a href=&#34;https://www.agenziaentrate.gov.it/portale/web/guest/specifiche-tecniche-versione-1.7.1&#34;&gt;v1.7.1&lt;/a&gt; of the
specification going into effect on October 1, 2022. For more information, see
the appropriate &lt;a href=&#34;https://github.com/FatturaElettronica/FatturaElettronica.NET/issues/376&#34;&gt;ticket&lt;/a&gt; and the &lt;a href=&#34;https://fatturaelettronicaopensource.org/docs/changelog.html#v-34&#34;&gt;changelog&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released v3.4 of <a href="https://fatturaelettronicaopensource.org/">FatturaElettronica</a>, a .NET open source project
that allows validation and de/serialization of electronic invoices adhering to
the standard defined by the Italian &ldquo;Agenzia delle Entrate&rdquo;. It&rsquo;s doing very
well for such a niche project, with downloads now well beyond the one hundred
thousand mark.</p>
<p>Be aware that this release anticipates support for <a href="https://www.agenziaentrate.gov.it/portale/web/guest/specifiche-tecniche-versione-1.7.1">v1.7.1</a> of the
specification going into effect on October 1, 2022. For more information, see
the appropriate <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET/issues/376">ticket</a> and the <a href="https://fatturaelettronicaopensource.org/docs/changelog.html#v-34">changelog</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Docker Event Monitor</title>
      <link>https://nicolaiarocci.com/the-docker-event-monitor/</link>
      <pubDate>Thu, 08 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-docker-event-monitor/</guid>
      <description>How to get alerted when a docker container goes down, or (many) other things happen to it</description>
      <content:encoded><![CDATA[<p>I added a new tool to my amateurish DevOps toolbox. Developed in the open by
Tom Williams, the <a href="https://bitbucket.org/quaideman/dem">Docker Event Monitor is</a> a &ldquo;tiny container that monitors
the local Docker event system in real-time and sends notifications to various
integrations for event types that match the configuration. For example, you can
trigger an alert when a container is stopped, killed, runs out of memory or
health status change.&rdquo;</p>
<p>At its core sits a simple <a href="https://bitbucket.org/quaideman/dem/src/master/app/main.py">python script</a> that monitors the <code>docker.sock</code>
file for noticeable changes. The code is straightforward and looks safe to
me. It only took a few minutes to set DEM up so that our <code>alerts</code> channel on
Slack gets notified of any health status changes. Some handy options are
included; my favorite is <code>silence</code> to set a time window during which alerts are
not fired. It avoids unnecessary spam when routine maintenance goes off on your
stack.</p>
<p>I find <a href="https://bitbucket.org/quaideman/dem">DEM</a> a useful little tool for lightweight, simple deployments where
you&rsquo;re not employing heavy weaponry, like k8s.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.0.1 released</title>
      <link>https://nicolaiarocci.com/eve-2.0.1-released/</link>
      <pubDate>Wed, 07 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.0.1-released/</guid>
      <description>&lt;p&gt;Today I released &lt;a href=&#34;https://pypi.org/project/Eve/2.0.1/&#34;&gt;Eve 2.0.1&lt;/a&gt;, which contains an essential fix if you&amp;rsquo;re
using &lt;code&gt;MONGO_URI&lt;/code&gt; to connect to your MongoDB instance. See the &lt;a href=&#34;https://github.com/pyeve/eve/issues/1478&#34;&gt;relevant
ticket&lt;/a&gt; for details. I&amp;rsquo;ve also pinned Flask dependency to v2.1, as v2.2
brings some breaking changes that, you guessed it, break our CI runs. If you
think you can help wiht that, &lt;a href=&#34;https://github.com/pyeve/eve/issues/1485&#34;&gt;please do so&lt;/a&gt;. The complete changelog is
available &lt;a href=&#34;https://docs.python-eve.org/en/stable/changelog.html&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/eve-2.0.1.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released <a href="https://pypi.org/project/Eve/2.0.1/">Eve 2.0.1</a>, which contains an essential fix if you&rsquo;re
using <code>MONGO_URI</code> to connect to your MongoDB instance. See the <a href="https://github.com/pyeve/eve/issues/1478">relevant
ticket</a> for details. I&rsquo;ve also pinned Flask dependency to v2.1, as v2.2
brings some breaking changes that, you guessed it, break our CI runs. If you
think you can help wiht that, <a href="https://github.com/pyeve/eve/issues/1485">please do so</a>. The complete changelog is
available <a href="https://docs.python-eve.org/en/stable/changelog.html">here</a>.</p>
<p><img loading="lazy" src="/images/eve-2.0.1.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>How I stopped Spotify from draining both my RAM and CPU</title>
      <link>https://nicolaiarocci.com/how-i-stopped-spotify-from-draining-both-my-ram-and-cpu/</link>
      <pubDate>Mon, 05 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-i-stopped-spotify-from-draining-both-my-ram-and-cpu/</guid>
      <description>&lt;p&gt;A few days ago, I was browsing my Twitter feed when a &lt;a href=&#34;https://twitter.com/flaper87/status/1564899493572710400&#34;&gt;suggestion&lt;/a&gt; from my
friend &lt;a href=&#34;https://twitter.com/flaper87&#34;&gt;@flaper87&lt;/a&gt; caught my attention:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/flaper87-on-spotifyd.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;On my &amp;ldquo;comfortably old&amp;rdquo; MacBook Pro&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;, Spotify has been an absolute hog. The
simple act of opening it will require three hundred MBs. That&amp;rsquo;s a remarkable
amount of memory for staying idle and doing nothing useful. Let it play for
a few hours, and have fun glancing at CPU and RAM usage ramping up like there&amp;rsquo;s
no tomorrow. Just for the record, here&amp;rsquo;s Spotify memory usage at launch:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few days ago, I was browsing my Twitter feed when a <a href="https://twitter.com/flaper87/status/1564899493572710400">suggestion</a> from my
friend <a href="https://twitter.com/flaper87">@flaper87</a> caught my attention:</p>
<p><img loading="lazy" src="/images/flaper87-on-spotifyd.png"></p>
<p>On my &ldquo;comfortably old&rdquo; MacBook Pro<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, Spotify has been an absolute hog. The
simple act of opening it will require three hundred MBs. That&rsquo;s a remarkable
amount of memory for staying idle and doing nothing useful. Let it play for
a few hours, and have fun glancing at CPU and RAM usage ramping up like there&rsquo;s
no tomorrow. Just for the record, here&rsquo;s Spotify memory usage at launch:</p>
<p><img loading="lazy" src="/images/spotify-memory-usage.png"></p>
<p>So what exactly is <a href="https://github.com/Spotifyd/spotifyd">spotifyd</a>? An open source Spotify client
running as a UNIX daemon.</p>
<blockquote>
<p>Spotifyd streams music just like the official client, but is more lightweight
and supports more platforms. Spotifyd also supports the Spotify Connect
protocol, which makes it show up as a device that can be controlled from the
official clients<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p></blockquote>
<p>Slow Saturday morning, I decided to give the spotifyd/spotify-tui combo a try.
Setting up spotifyd on a Mac with homebrew is as simple as typing <code>brew install spotifyd</code> and then <code>brew services start spotifyd</code> to let it run as a service,
or one can opt to launch it as a stand-alone with <code>spotifyd --no-daemon</code>.</p>
<p>As I quickly learned, on a Mac, you need to edit the default configuration file
to update a couple of settings, as reported on the wiki. Namely, I had to set
<code>backend = 'portaudio'</code> and <code>volume_controller = 'softvol'</code>. While at it,
I also set <code>use_keyring = true</code> to avoid storing my Spotify password in the
file. Here&rsquo;s my current configuration settings:</p>
<pre><code>[global]
username = &quot;&lt;USERNAME&gt;&quot;
use_keyring = true

# On Linux, set both values to 'alsa'
backend = &quot;portaudio&quot;          
volume_controller = &quot;softvol&quot;  

bitrate = 320
volume_normalisation = true
normalisation_pregain = -10

# If set to true, audio data does NOT get cached.
no_audio_cache = false
cache_path = &quot;&lt;USER_LIBRARY&gt;/Application Support/Spotify/PersistentCache/Storage&quot;
</code></pre>
<p>One minor annoyance that doesn&rsquo;t prevent the server from running as intended
and is only noticeable when I run spotifyd as a stand-alone app is a recurring
and rather obscure &ldquo;No route to host&rdquo; warning message. There&rsquo;s an <a href="https://github.com/Spotifyd/spotifyd/issues/1026">open
ticket</a> about it. Other than that, spotifyd has been bliss. Most remarkably,
this is the memory usage after a few hours of non-stop streaming:</p>
<p><img loading="lazy" src="/images/spotifyd-memory-usage.png"></p>
<p>Quite an achievement, considering that we started at 300+ MBs.</p>
<p>I also installed <a href="https://github.com/Rigellute/spotify-tui">spotify-tui</a> in an attempt to use it as a replacement for
the official client. As much as I&rsquo;d love to use it (I love its UI/UX), I can&rsquo;t
say I&rsquo;m happy with it. It sometimes reports a server disconnect when, in fact,
the underlying spotifyd service is running fine (and I can connect and play
with it from the official client). Secondly, it is sluggish sometimes. Further
investigation revealed that the project is <a href="https://github.com/Rigellute/spotify-tui/issues/1000">not actively maintained</a>. For
the time being, I&rsquo;m connecting to spotifyd from the official iPhone app. I get
the lightweight service with the added benefit that I don&rsquo;t have to switch
windows when I want to interact with Spotify.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>mid-2012. Yes, I know. It&rsquo;s due for replacement later this year, when the M2 MacBook Pro 14&quot; is announced.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Spotifyd requires a Spotify Premium account.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The Women Who Built Grunge</title>
      <link>https://nicolaiarocci.com/the-women-who-built-grunge/</link>
      <pubDate>Sun, 04 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-women-who-built-grunge/</guid>
      <description>&lt;p&gt;This week the &amp;ldquo;Sunday Morning Reading Award&amp;rdquo; goes to &lt;a href=&#34;https://twitter.com/nerdygirly&#34;&gt;Lisa
Whittington-Hill&lt;/a&gt;, for her &lt;em&gt;The Women Who Built Grunge&lt;/em&gt; on Longreads:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bands like L7 and Heavens to Betsy were instrumental to the birth of the
grunge scene, but for decades were treated like novelties and sex objects.
Thirty years later, it’s time to reassess their legacy.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More &lt;a href=&#34;https://longreads.com/2022/06/29/the-women-who-built-grunge/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This week the &ldquo;Sunday Morning Reading Award&rdquo; goes to <a href="https://twitter.com/nerdygirly">Lisa
Whittington-Hill</a>, for her <em>The Women Who Built Grunge</em> on Longreads:</p>
<blockquote>
<p>Bands like L7 and Heavens to Betsy were instrumental to the birth of the
grunge scene, but for decades were treated like novelties and sex objects.
Thirty years later, it’s time to reassess their legacy.</p></blockquote>
<p>More <a href="https://longreads.com/2022/06/29/the-women-who-built-grunge/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>G.K. Chesterton on fairy tales, actually</title>
      <link>https://nicolaiarocci.com/g.k.-chesterton-on-fairy-tales-actually/</link>
      <pubDate>Fri, 02 Sep 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/g.k.-chesterton-on-fairy-tales-actually/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.robinrendle.com/notes/fairy-tales/&#34;&gt;Robin Rendle&lt;/a&gt; quoting Neil Gaiman, who is quoting G.K. Chesterton:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fairy tales, as G.K. Chesterton once said, are more than true. Not because
they tell us that dragons exist, but because they tell us that dragons can be
defeated.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I read &lt;a href=&#34;https://en.wikipedia.org/wiki/G._K._Chesterton#Literary&#34;&gt;somewhere&lt;/a&gt; that he based the Gilbert character from &lt;em&gt;The Sandman&lt;/em&gt;
on Chesterton, so it&amp;rsquo;s no surprise to find Gaiman quoting Chesterton in &lt;em&gt;Smoke
and Mirrors&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Wanting to find the work in which the quote first appeared, I did
a little research only to discover that G.K. Chesterton never actually wrote
it. According to &lt;a href=&#34;https://alleysiande.com/random-thoughts/gk-chesterton-an-actual-quote&#34;&gt;E.M. Goldsmith&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, Gaiman&amp;rsquo;s is a rework of the following
original quote:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://www.robinrendle.com/notes/fairy-tales/">Robin Rendle</a> quoting Neil Gaiman, who is quoting G.K. Chesterton:</p>
<blockquote>
<p>Fairy tales, as G.K. Chesterton once said, are more than true. Not because
they tell us that dragons exist, but because they tell us that dragons can be
defeated.</p></blockquote>
<p>I read <a href="https://en.wikipedia.org/wiki/G._K._Chesterton#Literary">somewhere</a> that he based the Gilbert character from <em>The Sandman</em>
on Chesterton, so it&rsquo;s no surprise to find Gaiman quoting Chesterton in <em>Smoke
and Mirrors</em>.</p>
<p>Wanting to find the work in which the quote first appeared, I did
a little research only to discover that G.K. Chesterton never actually wrote
it. According to <a href="https://alleysiande.com/random-thoughts/gk-chesterton-an-actual-quote">E.M. Goldsmith</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, Gaiman&rsquo;s is a rework of the following
original quote:</p>
<blockquote>
<p>Fairy Tales then, are not responsible for producing in children fear, or any
of the shapes of fear; fairy tales do not give the child the idea of the evil
or the ugly; that is in the child already, because it is in the world
already. <strong>Fairy tales do not give the child his first idea of bogey. What
fairy tales give the child is his first clear idea of the possible defeat of
bogey</strong>. The baby has known the dragon intimately ever since he had an
imagination. What the fairy tale provides for him is a St. George to kill the
dragon. Exactly what the fairy tale does is this: it accustoms him to
a series of clear pictures of <strong>the idea that these limitless terrors had
a limit, that these shapeless enemies have enemies in the knights of God,
that there is something in the universe more mystical than darkness, and
stronger than strong fear.</strong> &ndash;Tremendous Trifles (1909), XVII: &ldquo;The Red
Angel&rdquo;<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p></blockquote>
<p>An excellently simplified, actualized and de-Christianized rework, I&rsquo;d say.  On
the subject of fairy tales, E.M. Goldsmith has another quote that is worth
sharing:</p>
<blockquote>
<p>When we step into the family, by the act of being born, we do step into
a world which is incalculable, into a world which has its own strange laws,
into a world which could do without us, into a world we have not made. In
other words, when we step into the family we step into a fairy-tale.&quot;
–Heretics, CW, I, p.143 G.K. Chesterton.</p></blockquote>
<p>What great of a writer Chesterton was. No wonder Jorge Luis Borges and J.R.R.
Tolkien were some of his great estimators. On Chesterton, Borges supposedly<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>
said: &ldquo;Literature is one of the forms of happiness; perhaps no writer has given
me as many happy hours as Chesterton.&rdquo;</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Along with many others on the Internet, E.M. Goldsmith attributes the simplified quote to the popular TV show <em>Criminal Minds</em>. It&rsquo;d be interesting to find who quoted who here.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Further digging unearthed <em>The Red Angel</em> <a href="http://www.online-literature.com/chesterton/tremendous-trifles/17/">original text</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>G.K. Chesterton&rsquo;s <a href="https://it.wikipedia.org/wiki/Gilbert_Keith_Chesterton#Posterit%C3%A0_e_influenza_culturale">page</a> on the Italian edition of Wikipedia; suspiciously flagged with a citation-needed note.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>An account of the mother of all demos</title>
      <link>https://nicolaiarocci.com/an-account-of-the-mother-of-all-demos/</link>
      <pubDate>Wed, 31 Aug 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/an-account-of-the-mother-of-all-demos/</guid>
      <description>&lt;p&gt;As part of his captivating Hidden Heroes series, Steven Johnson publishes an
account of the mother of all demos.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;More than 50 years ago, Douglas Engelbart gave the &amp;ldquo;mother of all demos&amp;rdquo; that
transformed software forever. The computer world has been catching up with
his vision ever since.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;More &lt;a href=&#34;https://hiddenheroes.netguru.com/douglas-engelbart&#34;&gt;here&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As part of his captivating Hidden Heroes series, Steven Johnson publishes an
account of the mother of all demos.</p>
<blockquote>
<p>More than 50 years ago, Douglas Engelbart gave the &ldquo;mother of all demos&rdquo; that
transformed software forever. The computer world has been catching up with
his vision ever since.</p></blockquote>
<p>More <a href="https://hiddenheroes.netguru.com/douglas-engelbart">here</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>A stunning visualization of John Coltrane&#39;s &#39;Giant Steps&#39; solo</title>
      <link>https://nicolaiarocci.com/a-stunning-visualization-of-john-coltranes-giant-steps-solo/</link>
      <pubDate>Tue, 30 Aug 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-stunning-visualization-of-john-coltranes-giant-steps-solo/</guid>
      <description>&lt;p&gt;Open Culture &lt;a href=&#34;https://www.openculture.com/2022/08/watch-a-jaw-dropping-visualization-of-john-coltranes-giant-steps-solo.html&#34;&gt;shared&lt;/a&gt; a &amp;ldquo;jaw-dropping visualization of John Coltrane&amp;rsquo;s &amp;lsquo;Giant
Steps&amp;rsquo; solo.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/Pxw4AQLVLis?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;!-- raw HTML omitted --&gt;
Indeed, it is stunning, beautiful and valuable. A visualization like this makes
music much more accessible. Quoting Open Culture:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Coltrane’s complexity is daunting for the most accomplished musicians. How
much more so for non-musicians? It can seem like “you need a doctorate of
music to go anywhere near his recordings,” Nicholson writes. But “nothing
could be further from the truth.” With its dancing lines and circles,
Brother’s visualization gives us another way to appreciate the “sheer joy of
music making and the power and energy of his playing” that inspires students,
serious fans, and newcomers alike through “universal values that still speak
to us now.”&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Open Culture <a href="https://www.openculture.com/2022/08/watch-a-jaw-dropping-visualization-of-john-coltranes-giant-steps-solo.html">shared</a> a &ldquo;jaw-dropping visualization of John Coltrane&rsquo;s &lsquo;Giant
Steps&rsquo; solo.&rdquo;</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Pxw4AQLVLis?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<!-- raw HTML omitted -->
Indeed, it is stunning, beautiful and valuable. A visualization like this makes
music much more accessible. Quoting Open Culture:</p>
<blockquote>
<p>Coltrane’s complexity is daunting for the most accomplished musicians. How
much more so for non-musicians? It can seem like “you need a doctorate of
music to go anywhere near his recordings,” Nicholson writes. But “nothing
could be further from the truth.” With its dancing lines and circles,
Brother’s visualization gives us another way to appreciate the “sheer joy of
music making and the power and energy of his playing” that inspires students,
serious fans, and newcomers alike through “universal values that still speak
to us now.”</p></blockquote>
<p>I suddenly want all my music visualized like this.</p>
<p>My nerdiness alarm immediately went off, and I wanted to know more, so I dug
a little. Open Culture presentation is remarkable, but what&rsquo;s mind-boggling is
the author&rsquo;s <a href="https://medium.com/@harlan.j.brothers/giants-steps-the-fractal-structure-of-coltranes-iconic-solo-706ee8c8e79e">in-depth article</a> on the fractal structure of the solo. It&rsquo;s
all about fractals, baby!</p>
]]></content:encoded>
    </item>
    <item>
      <title>The indictment against Sparta</title>
      <link>https://nicolaiarocci.com/the-indictment-against-sparta/</link>
      <pubDate>Wed, 24 Aug 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-indictment-against-sparta/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://acoup.blog/&#34;&gt;Bret Devereaux&lt;/a&gt; has long been my go-to source for all things ancient and
military history. One thing I somehow missed reading from his incredibly
resourceful website is the &lt;a href=&#34;https://acoup.blog/2019/08/16/collections-this-isnt-sparta-part-i-spartan-school/&#34;&gt;This Isn&amp;rsquo;t Sparta&lt;/a&gt; series. He recently published
a three-year-anniversary series retrospective which promptly surfaced on my
RSS feed, giving me a chance to catch up over the holidays. The whole thing is
a very long read, with some installments more engaging than others but overall
very enjoyable, eye-opening, and information dense. In the just-published
retrospective, Bret writes:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://acoup.blog/">Bret Devereaux</a> has long been my go-to source for all things ancient and
military history. One thing I somehow missed reading from his incredibly
resourceful website is the <a href="https://acoup.blog/2019/08/16/collections-this-isnt-sparta-part-i-spartan-school/">This Isn&rsquo;t Sparta</a> series. He recently published
a three-year-anniversary series retrospective which promptly surfaced on my
RSS feed, giving me a chance to catch up over the holidays. The whole thing is
a very long read, with some installments more engaging than others but overall
very enjoyable, eye-opening, and information dense. In the just-published
retrospective, Bret writes:</p>
<blockquote>
<p>The series was thus intended to be set against the general public hagiography
of Sparta and its intended audience was what I’ve heard termed the ‘Sparta
Bro’ – the person for whom the Spartans represent a positive example (indeed,
often the pinnacle) of masculine achievement, often explicitly connected to
roles in law enforcement, military service and physical fitness (the
regularity with which that last thing is included is striking and suggests to
me the profound unseriousness of the argument). [&hellip;] In that light, I think
the series holds up fairly well.</p></blockquote>
<p>As a former 100% Sparta Bro, I qualified for the target audience. Paraphrasing
Marx, one could say that ignorance is the opium of the people. Take 300 the
movie.  I&rsquo;m glad I saw it as entirely ignorant of Sparta&rsquo;s &lsquo;real&rsquo; prowess, or
most fun would have been spoiled.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: A Captive West or the tragedy of Central Europe</title>
      <link>https://nicolaiarocci.com/book-review-a-captive-west-or-the-tragedy-of-central-europe/</link>
      <pubDate>Thu, 18 Aug 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-a-captive-west-or-the-tragedy-of-central-europe/</guid>
      <description>&lt;p&gt;Adelphi&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; prints in book form two unpublished speeches by Milan Kundera, one from
1967 and the other from 1983, in which the great Czech writer reflects on the
fate of the small nations in central Europe and the cultural drift of (western)
Europe as a whole. As we read along, thanks to Kundera&amp;rsquo;s acumen and depth of
analysis, we find many surprising ante-litteram references to today&amp;rsquo;s critical
situation (Russian-Ukrainian war).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Adelphi<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> prints in book form two unpublished speeches by Milan Kundera, one from
1967 and the other from 1983, in which the great Czech writer reflects on the
fate of the small nations in central Europe and the cultural drift of (western)
Europe as a whole. As we read along, thanks to Kundera&rsquo;s acumen and depth of
analysis, we find many surprising ante-litteram references to today&rsquo;s critical
situation (Russian-Ukrainian war).</p>
<p><img loading="lazy" src="/images/a-captive-west.jpg#right">
Reflecting on the fragmentary history of the Czech nation and on its shaky
equilibrium (as it will be evident shortly after that), in 1967, the writer
asks, &ldquo;Is the cultural value of our people such as to justify its [nation]
existence?&rdquo; And to this question, he then adds a second one: &ldquo;will this value
suffice in the future to protect it from losing its sovereignty?&rdquo; West Europe&rsquo;s
failure to understand the dilemma and its substantial indifference to the fate
of the small eastern nations, which Russia&rsquo;s totalitarian giant will eventually
swallow up, are co-responsible for this loss of living identity and culture.</p>
<p>In the second text (1983), Kundera questions the &ldquo;disappearance&rdquo; of Europe as
an ideal horizon (but also as a concrete force): united in the Middle Ages by
the Christian religion, in the 18th century by Enlightenment philosophy, and in
the modern age by the culture at large, what shared values constitute its
foundation today? Perhaps technology and the entertainment industry?</p>
<blockquote>
<p>It is not, therefore, political boundaries (inauthentic, always imposed by
invasions, conquests and occupations) that determine the Central European
aggregation. It is great common situations that bring peoples together, and
group them in ever-changing ways, within imaginary and ever-changing
boundaries, where the same memory, the same experience, and the same
traditions remain.</p></blockquote>
<p>If this unifying fabric is not there (and we need to understand by what threads
it is held fast), each small nation is bound to see its autonomous and free
existence called into question.</p>
<p>Thanks to Kundera&rsquo;s brilliant reflections, I could look into recent Central
Europe history from a different, non-western-centric perspective and get
precious insights into current events. Look at what is happening
today before our incredulous and appalled eyes.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I&rsquo;m not aware of any available English editions at this time, but it&rsquo;s likely that the transcriptions of the speeches can be found online.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Just an Ordinary Day</title>
      <link>https://nicolaiarocci.com/book-review-just-an-ordinary-day/</link>
      <pubDate>Thu, 18 Aug 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-just-an-ordinary-day/</guid>
      <description>&lt;p&gt;As a Shirley Jackson fan, I couldn&amp;rsquo;t pass on this new collection of unpublished
short stories. A good chunk of these was unheard of for thirty years until
someone unearthed some cardboard boxes in a Vermont barn and then sent them to
her heirs.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/luna-di-miele-mrs-smith.jpg#right&#34;&gt;
Unlike The Lottery, where all tales followed a distinct theme, Just an Ordinary
Day has little to unite the stories. Several genres are represented: classic
family stories, supernatural, horror, and unsettling accounts of day-to-day
life in the fifties all make up the list. Not all stories are of the same
level. While most are mature for prime time, a few could have used some more
tinkering, yet they were worth publishing as a precious testimony of an
(infinitely talented) writer&amp;rsquo;s creative process. At one point, two versions of
the same tale are put side by side, thus allowing a look into how Shirley
Jackson revised her stories and perfected them over time. I think my Italian
(Adelphi) edition includes a selection of the original collection of more than
fifty, which is probably a good thing (I read somewhere that a second book with
the missing pieces is planned).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As a Shirley Jackson fan, I couldn&rsquo;t pass on this new collection of unpublished
short stories. A good chunk of these was unheard of for thirty years until
someone unearthed some cardboard boxes in a Vermont barn and then sent them to
her heirs.</p>
<p><img loading="lazy" src="/images/luna-di-miele-mrs-smith.jpg#right">
Unlike The Lottery, where all tales followed a distinct theme, Just an Ordinary
Day has little to unite the stories. Several genres are represented: classic
family stories, supernatural, horror, and unsettling accounts of day-to-day
life in the fifties all make up the list. Not all stories are of the same
level. While most are mature for prime time, a few could have used some more
tinkering, yet they were worth publishing as a precious testimony of an
(infinitely talented) writer&rsquo;s creative process. At one point, two versions of
the same tale are put side by side, thus allowing a look into how Shirley
Jackson revised her stories and perfected them over time. I think my Italian
(Adelphi) edition includes a selection of the original collection of more than
fifty, which is probably a good thing (I read somewhere that a second book with
the missing pieces is planned).</p>
<p>I would probably not recommend this book as a first-time Jackson reading. Her
renowned fiction would be a better entry point<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, with The Lottery serving as her
must-read short-stories collection. Just an Ordinary Day is an excellent
addition to any Jackson collection, with some of its tales deserving
recognition at the top of her writing.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Somewhat recently, I reviewed <a href="/book-review-we-have-always-lived-in-the-castle/">We Have Always Lived in the Castle</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Italica</title>
      <link>https://nicolaiarocci.com/book-review-italica/</link>
      <pubDate>Fri, 29 Jul 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-italica/</guid>
      <description>&lt;p&gt;Suppose you are looking for a juicy and thought-provoking read on Italy&amp;rsquo;s
twentieth-century crucial moments. In that case, I heartily recommend Italica
by Giacomo Papi, a significant collection of short stories by prominent Italian
writers of the period including the likes of Italo Calvino,  Elsa Morante,
Beppe Fenoglio, Natalia Ginzburg, and Giorgio Scerbanenco. A short essay
introduces each tale. I thoughtfully appreciated these introductions, sometimes
even more so than the story itself, as they are quintessential to comprehending
the tale&amp;rsquo;s historical background. Papi&amp;rsquo;s remarks are insightful, brilliant,
well-written, well-documented, and often heavily data-driven.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Suppose you are looking for a juicy and thought-provoking read on Italy&rsquo;s
twentieth-century crucial moments. In that case, I heartily recommend Italica
by Giacomo Papi, a significant collection of short stories by prominent Italian
writers of the period including the likes of Italo Calvino,  Elsa Morante,
Beppe Fenoglio, Natalia Ginzburg, and Giorgio Scerbanenco. A short essay
introduces each tale. I thoughtfully appreciated these introductions, sometimes
even more so than the story itself, as they are quintessential to comprehending
the tale&rsquo;s historical background. Papi&rsquo;s remarks are insightful, brilliant,
well-written, well-documented, and often heavily data-driven.</p>
<p>The last three tales conceal prophecies about the near future, corresponding to
today&rsquo;s present. I was impressed by Primo Levi&rsquo;s 1971 Forehead Writing, where
a world in which everyone can become a testimonial for a product is described
vividly and bitingly. It&rsquo;s impossible not to think of what we see and display
on social media these days. Papi&rsquo;s comment in this regard is illuminating:</p>
<blockquote>
<p>With the selfie, photography ceased to be an instant captured by the observer
to become a representation of the one being shown. The double lens blurred
the boundary between observer and observed, turned the subject into the
object, the viewer into the spectacle.</p></blockquote>
<p><img alt="Italica, by Giacomo Papi" loading="lazy" src="/images/italica.jpg#right">
Italica brilliantly recapitulates a hundred years of Italian history through
the words of some of the best writers who lived through them. It talks about
the Great War, fascism, racial laws, the Merlin law, terrorism, &ldquo;Mani Pulite,&rdquo;
and other events and situations that have conditioned Italy&rsquo;s twentieth century
and still have after-effects in our lives today.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I&#39;m a Microsoft MVP once again</title>
      <link>https://nicolaiarocci.com/im-a-microsoft-mvp-once-again/</link>
      <pubDate>Wed, 27 Jul 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/im-a-microsoft-mvp-once-again/</guid>
      <description>&lt;p&gt;I am happy and humbled to have been awarded the Microsoft MVP Award for the
seventh consecutive year. July 1, the award assignation day, always comes with
curiosity and a bit of trepidation.&lt;/p&gt;
&lt;p&gt;Being a member of the MVP community has been a very positive experience for me,
especially in the years before COVID, when the MVP Summit, the main MVP event,
was held in person in Seattle at the Microsoft HQ. That assembly of experienced
developers from all over the world is an exhilarating experience. Smart guys
and gals from different cultures gather to meet the people responsible for
their daily drivers&amp;rsquo; tools and technologies. There are countless networking
possibilities, both with fellow MVPs and Microsoft personnel.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am happy and humbled to have been awarded the Microsoft MVP Award for the
seventh consecutive year. July 1, the award assignation day, always comes with
curiosity and a bit of trepidation.</p>
<p>Being a member of the MVP community has been a very positive experience for me,
especially in the years before COVID, when the MVP Summit, the main MVP event,
was held in person in Seattle at the Microsoft HQ. That assembly of experienced
developers from all over the world is an exhilarating experience. Smart guys
and gals from different cultures gather to meet the people responsible for
their daily drivers&rsquo; tools and technologies. There are countless networking
possibilities, both with fellow MVPs and Microsoft personnel.</p>
<p>For the last two years, the Summit has been an online event. I admit I&rsquo;ve had
a hard time following the sessions as work and family tended to get in the way.
The networking was, of course, next to zero. I miss the original MVP Summit. In
the absence of it, even just meeting the Italian MVPs has been a rare
occurrence. Hopefully, things will return to normal this year, although I&rsquo;m
doubtful.</p>
]]></content:encoded>
    </item>
    <item>
      <title>&#34;A project you maintain has been designated as critical&#34;</title>
      <link>https://nicolaiarocci.com/a-project-you-maintain-has-been-designated-as-critical/</link>
      <pubDate>Mon, 18 Jul 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-project-you-maintain-has-been-designated-as-critical/</guid>
      <description>&lt;p&gt;Last week, I got a mail from PyPI, the Python package index. They informed me
that one of my open source projects had been designated as &amp;lsquo;critical,&amp;rsquo; and
I was therefore required to enable two-factor authentication. If I didn&amp;rsquo;t
oblige, I would soon lose the ability to add new releases or modify the
project.&lt;/p&gt;
&lt;p&gt;The project in question was &lt;a href=&#34;https://python-cerberus.org/&#34;&gt;Cerberus&lt;/a&gt;. The &amp;lsquo;critical&amp;rsquo; designation happens
when a project has been in the top 1% of downloads over the prior six months.
Given that there are currently 388K packages on the Python Package Index,
I must admit that having one of my projects in the top 1% does feel good.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last week, I got a mail from PyPI, the Python package index. They informed me
that one of my open source projects had been designated as &lsquo;critical,&rsquo; and
I was therefore required to enable two-factor authentication. If I didn&rsquo;t
oblige, I would soon lose the ability to add new releases or modify the
project.</p>
<p>The project in question was <a href="https://python-cerberus.org/">Cerberus</a>. The &lsquo;critical&rsquo; designation happens
when a project has been in the top 1% of downloads over the prior six months.
Given that there are currently 388K packages on the Python Package Index,
I must admit that having one of my projects in the top 1% does feel good.</p>
<p>However, I was initially a bit baffled in that I would lose control of the
package if I didn&rsquo;t take action. I understand the motivation behind this move,
which is to improve the general security of the Python ecosystem. Still, the
imposition from above didn&rsquo;t feel quite right to me. After reading about the
rationale for the new requirement, I surrendered, went on PyPI and activated
2FA<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. In hindsight, I should have done that long ago, as I already use 2FA
on many other services.</p>
<p>A couple of days later, I was relieved to learn that my initial
&ldquo;1984-dictatorship-alert&rdquo; ring bell wasn&rsquo;t the only one to go off. On that day,
<a href="https://lucumr.pocoo.org/2022/7/9/congratulations/">Armin Ronacher&rsquo;s thoughts</a> on this very topic made the headlines on Hacker
News:</p>
<blockquote>
<p>The message to me as a maintainer is quite clear: once a project achieved
criticality, then the index wants to exercise a certain amount of control
[&hellip;] However when I create an Open Source project, I do not chose to create
a “critical” package. It becomes that by adoption over time. Right now the
consequence of being a critical package is quite mild: you only need to
enable 2FA. But a line has been drawn  now and I&rsquo;m not sure why it
wouldn&rsquo;t be in the index best interest to put further restrictions in place.</p></blockquote>
<p>I think Armin&rsquo;s post is worth reading. I share some of his concerns, although
I don&rsquo;t consider &lsquo;users vetting,&rsquo; as he suggests, a suitable alternative for
authentication (vetting solves a different problem).</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>It did help that the Python Software Foundation provided a limited number of [Titan Security Keys][4] to critical project maintainers. I could redeem two for free, and I have to say they are a joy to use.
[4]: <a href="https://store.google.com/product/titan_security_key">https://store.google.com/product/titan_security_key</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Hiking the Alta Via del Granito</title>
      <link>https://nicolaiarocci.com/hiking-the-alta-via-del-granito/</link>
      <pubDate>Fri, 15 Jul 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/hiking-the-alta-via-del-granito/</guid>
      <description>&lt;p&gt;Last year &lt;a href=&#34;https://nicolaiarocci.com/hiking-the-translagorai-25-years-later/&#34;&gt;I hiked the Translagorai route&lt;/a&gt; while accompanying my nephew and
his friend on their first hiking and wild camping experience.  To go full
circle, I soloed the &lt;a href=&#34;http://www.altaviadelgranito.com/&#34;&gt;Alta Via del Granito&lt;/a&gt; last weekend, which covers the
parts of the Lagorai mountain range not included in the Translagorai. The AVG is
supposed to be a three days effort, with overnights to be spent in managed huts
(&amp;ldquo;Rifugio&amp;rdquo;), but I wanted to make it in two days while camping in the
wilderness.  On Day One, I experimented with recording some moments on my GoPro.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last year <a href="/hiking-the-translagorai-25-years-later/">I hiked the Translagorai route</a> while accompanying my nephew and
his friend on their first hiking and wild camping experience.  To go full
circle, I soloed the <a href="http://www.altaviadelgranito.com/">Alta Via del Granito</a> last weekend, which covers the
parts of the Lagorai mountain range not included in the Translagorai. The AVG is
supposed to be a three days effort, with overnights to be spent in managed huts
(&ldquo;Rifugio&rdquo;), but I wanted to make it in two days while camping in the
wilderness.  On Day One, I experimented with recording some moments on my GoPro.</p>
<h3 id="day-one">Day one</h3>
<p>I left at five in the morning and arrived at Malga Sorgazza a few minutes ahead
of eight-thirty as planned. The biker-to-hiker transition was pretty quick, and
I finally took the trail at about nine.</p>
<p>The first section of the trail, from Malga Sorgazza to Costa Brunella Lake, is
a continuous and strenuous climb, initially in the woods. Fortunately, today
was a relatively chilly day after weeks of scorching climate. On the bike this
morning, I had to wear my rain jacket for chill protection, and I arrived at my
destination with numb hands. It took quite some time to warm them up.</p>
<p>Being finally on the trail and climbing up in the woods was invigorating.
I resisted the enthusiasm-induced temptation of accelerating and proceeded
slowly instead. It paid off, I think, as  I was still feeling fresh and strong
one hour later as I left the forest behind and started trampling the alpine
meadows.</p>
<p>The last stretch before the lake was a tricky incline over beautiful meadows,
with open views of Sorgazza Valley and its ranges. I&rsquo;ve never been here before,
but I knew what to expect, as Cima d&rsquo;Asta and the Alta Via are part of the
Loagorai Range I traversed last year while on the Translagorai. Brutal climbs
alternated with rapid descents; dark volcanic rocks covered with liches of all
kinds and colors, and lush green, high-altitude meadows.</p>
<p>A dam encloses Costa Brunella Lake. At some point, the trail takes you directly
to the foot of the dam, and it follows it for the entire length of its wall.
The lake is not much, partly because it&rsquo;s half empty given the drought this
season. The trail continued, climbing steadily and still a long way up to
Forcella Quarazza, where I arrived in good shape even though fatigue was
starting to set in.</p>
<p>Forcella Quarazza welcomed me with a spectacular view. The panorama opens to
the south, where you can oversee the Pre-Alps. Today was a beautifully clear
day because of yesterday&rsquo;s thunderstorms, though a bit windy.</p>
<p>The section from Forcella Quarazza to Forzellon de Rava is on technical
terrain, always uphill, in its last part especially. Almost at the Forzellon,
I wasn&rsquo;t paying enough attention and didn&rsquo;t notice a signal denoting a detour.
Instead, I followed animal tracks that led me to the ridge in a few minutes.
Fortunately, I immediately realized something wasn&rsquo;t right and looked back,
only to see my destination maybe fifty or sixty meters behind me, but I now had
to go around a small steep peak. A few minutes later, I was at the Forzellon,
back on track.</p>
<p>The next trail section connects the Forzellon with Forcella Ravetta at
a slightly lower elevation. It is a long, technical traverse under the
Caldenave peak. Here the view opens into this initially stony and wild valley
which, further down, reveals the Lago Grande standing right in front of the
hiker, on the other side of the valley, with a few alpine pastures and cabins
nearby. Toward Forcella Ravetta, two more lakes appear, again on the opposite
side, Lago di Mezzo and Lago Primo, below Monte Castelletto and Cima del Frate.
I came across a viper sunbathing on the trail stones. She didn&rsquo;t hear me; I was
coming from above, behind, and under her wind. Scared, she quickly crawled away
into the grass.</p>
<p>At Forcella Ravetta, I stopped for lunch. The marker there reported a mere 40
minutes descent to Rifugio Caldenave. At 1:15 pm, having woken at 4 am, it was
time for a break. Strong winds were blowing on the fork&rsquo;s north face, while the
South side was suitable for lighting my camping stove. The only incident here
was that I inadvertently knocked over the pan I had on the stove, spilling the
boiling water. With not much water left, only half a bottle, I only managed to
cook and take a sip. The Rifugio was not far away, so I wasn&rsquo;t worried about my
water supply. Surprisingly, there was a timid cell phone signal, and I could
text the family back home.</p>
<p>The descent to the Malga Caldeneva was beautiful and challenging, rocky first,
then in a long stream bed down until the rather characteristic Piana Caldenave,
an evocative, flat alpine clearing with a stream placidly running through it.
As I was leaving the gorge and entering the stream bed below the Forcella,
I spotted two young chamois descending nimbly to my left. At the Malga, I sat
for a few minutes and enjoyed strudel and beer. I try to support managers and
their families at these remote huts. They might live in beautiful secluded
places but also have a harsh life. Besides, I wanted a beer. And cake.
I refilled the bottles, too, readying them for the night camp.</p>
<p>I struggled too much to find the start of the trail that would take me up in
the heights again, under Forcella Buse Todesche. The canonical first stage of
the Alta Via ends here at Malga Caldenave, where one usually stays overnight.
However, I had planned to continue for a couple more hours.</p>
<p>A beautiful trail, this last one of the day, always uphill, first in
a beautiful forest and then on the highland grasslands. Climbing up through the
woods, one comes across an area called &ldquo;Laghi Della Val D&rsquo;inferno&rdquo; (Hell Valley
Lakes) that is striking, with these two to three shallow-water lakes scattered
among gooseberries and erratic boulders, enclosed by steep rock walls. One
expects to see a nymph or any other fairy creature pop up at any moment. I was
tempted to camp there, partly because I could have bathed in one of the small
lakes, but I decided to stick to the plan and continue.</p>
<p>I first arrivaed at cabin Lastei, which was not in good condition, and
continued to cabin Scagni, where I had planned to pitch my tent. The cabin
turned out to be in good condition. It was sufficiently clean, with a long
plank that, if there were even two of us, would have been impossible to take
advantage of. Me being alone, however, this cabin was perfect. I can avoid
setting up the tent and, more importantly, taking it down and storing it the
next day. A stream runs right in front of the cabin; I can use its water for
cooking, washing, and resupplying.</p>
<p>And I find myself sitting on this bench made out of a half-trunk at the cabin&rsquo;s
door. I&rsquo;m in a beautiful, solitary highland basin, and the sun is just about to
set down. Soon it won&rsquo;t warm me anymore, and I will have to take shelter
inside. Tomorrow&rsquo;s trail leads to a creek. I can hear it from here. I will fill
my bottles and maybe even take a quick bath before setting out. I&rsquo;m glad I&rsquo;ll
sleep between wooden walls tonight.</p>
<h3 id="day-two">Day two</h3>
<p>The night was good. I enjoyed the great silence inside and around the cabin. I
woke up in the morning with a cold nose, and I distinctly remember tucking my
head into the sleeping bag&rsquo;s hook during the night, so it must have been cold
outside, but in the sleeping bag, it was warm. I had not set the alarm; I knew
the sun would rise right before the lodge, so its light would filter through the
wooden boards. I slept a long time, from 8 pm to 7 am -super tired- and woke up
refreshed. It was warm when I went outside, with the sun beating down on the
lodge&rsquo;s wood. In about an hour, I had breakfast, got ready, tidied up and set
off again for the first leg of the day, the Forcella Buse Todesche.</p>
<p>This first part is lovely. You go up into fairy tale terrain: streams, meadows,
stones, and a few scattered saplings until you reach the fork. On the other
side, a very different landscape presents itself: steep terrain, pebbles and
the trail that follows the entire slope to the left, halfway up to Forcella
Magna. It is a long but not too strenuous section, slightly downhill more often
than uphill, very spectacular and scenic. Shortly after leaving the fork, you
get a glimpse of the final destination: Cima d&rsquo;Asta with Rifugio Brenteri
below, its lake (only a hint of it from that distance) and high, just below the
summit, the bivouac, an actual eagle&rsquo;s nest. I remember a lovely little
waterfall where I drank. At about fifteen minutes from Forcella Magna, right on
the ridgeline, is the Lasteati bivouac, a restored wartime barrack. This
bivouac also has only one sleeping place. Again, traveling alone offers so many
advantages from a practical-logistical point of view; one is that you can take
advantage of places that would typically be impractical, even for only two
people.</p>
<p>Forcella Magna Lake is beautiful, with nearby ruins of Great War emplacements.
At the fork, I made a mistake. Misled by an inscription painted on a large
boulder (&ldquo;Rifugio Brenteri&rdquo;), I immediately took the wrong trail. It was steep,
practically a straight climb up the northern side of the ridge. I soon realized
that something was not right. I checked the map only to confirm my concerns:
this was the trail that then led, yes, to the Rifugio but not following the
Alta Via. Wanting to follow the official path, I turned back. When I returned
to the Forcella, I noticed a much smaller rock positioned about ten meters
lower relative to the summit, which was marked with a south-west pointing arrow
and the AVG (Alta Via del Granito) initials. I&rsquo;d like to imagine that many
others fell to this, but rest assured, not consulting the map when I arrived at
the fork was a significant error on my part. It would appear that I tend to be
confused, distracted, or most likely both when, exhausted, I finally reach
mountain forks.</p>
<p>The new trail starts halfway up the hillside and is much more complicated than
the previous one. Full of slope changes, it crosses scree and scree-stones,
forcing one to pay full attention at all times. After half an hour, as
expected, the most challenging climb of the tour started—seven hundred meters
of relentless elevation gain on very technical terrain. I must admit that
I suffered here. Tired, I climbed on steep rocky terrain under a scorching sun
and tense winds for, I think, one hour and a half. Yes, it took a lot of effort
to reach Passo Secede at the top. When I departed the cabin in the morning,
I didn&rsquo;t expect I would be so exhausted at this point. Luckily for me, this
would also be the last climb for the day.</p>
<p>At the Pass, the view is spectacular on all sides. You get to contemplate the
whole main Lagorai range in all its glory. Right in front of you, the now
looming Cima d&rsquo;Asta with its deep lake stupendously nestled right at the foot
of the tall, 500-meter tall granite wall, and then, not too far from the lake
river, the plateau where the Rifugio resides. I had my lunch while
contemplating the views and pondering what to do next. From a distance, the
Rifugio looked adorable, but I knew I would find chaos there. It was
a beautiful mid-July Saturday, and Cima d&rsquo;Asta is the most visited peak in the
area. I was tired, even more than I had expected.</p>
<p>To complete the Alta Via, I only needed to reach the bottom of the valley and
return to my motorcycle. Still, my super-secret goal was to climb the Cima
d&rsquo;Asta, which would have required another 500 meters of elevation gain. There
I would sleep at the bivouac on the wall. However, all those crowds at the
Rifugio and around the lake changed my mind. At the summit, I would have found
dozens of people, and, more importantly, since the bivouac had only two beds,
it was very likely to find fully occupied. At that point, I would have had to
descend back to the lake and camp near the hut, something I wanted to avoid on
a Saturday night. So, after a bit of wavering, I opted for the descent.</p>
<p>As always in Lagorai, the return to the bottom was not trivial, not at all. It
was over a thousand meters drop on a steep and challenging trail down to the
forest road that only covers the last couple of kilometers to Malga Sorgazza.
I must also admit that during the descent, I was overtaken by several young
people descending nimbly and quickly, an unmistakable sign that times have
changed for me.</p>
<p>The motorcycle ride back was a three-and-a-half-hour non-stop ride home. I was
in an almost catatonic state for the first hour or so. Then, I slowly recovered
so much that I did not even feel the need to stop. With the mission
accomplished, I only wanted to get home as soon as possible, which doesn&rsquo;t mean
I ran fast on the road; quite the contrary, given my tiredness. I learned that
steady progress takes me home safely, pleasantly and often sooner than any
other option.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: The Rings of Saturn</title>
      <link>https://nicolaiarocci.com/book-review-the-rings-of-saturn/</link>
      <pubDate>Wed, 29 Jun 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-the-rings-of-saturn/</guid>
      <description>&lt;p&gt;W.G. Sebald is widely considered among the best modern German authors, so
I approached this book with curiosity and high expectations. The  Rings of
Saturn records the author&amp;rsquo;s walking tour along the East Coast of England. As
W.G. Sebald resides in the intellectual world, his tour naturally brings up
literary, cultural or historical reminiscences.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;The Rings of Saturn&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/the-rings-of-saturn.jpg#right&#34;&gt;
An astute Goodreads reviewer noted that Britain&amp;rsquo;s decline&amp;rsquo;s eccentric and
grotesque aspects are this work&amp;rsquo;s central theme. The peregrinations of Thomas
Browne&amp;rsquo;s skull, dubious capitalism, carpet bombing of Nazi Germany,
20th-century Imperialism, the case of Roger Casement, Belgian Congo genocide,
quasi-repatriation of Michael Hamburger, Tai-ping rebellion, Joseph Conrad&amp;rsquo;s
Congo excursion, Edward Fitzgerald&amp;rsquo;s life and times, etc.—and how these end,
or, indeed, constitute decay, dissolution and death. That&amp;rsquo;s a lot of output for
a few days-long walk-about.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>W.G. Sebald is widely considered among the best modern German authors, so
I approached this book with curiosity and high expectations. The  Rings of
Saturn records the author&rsquo;s walking tour along the East Coast of England. As
W.G. Sebald resides in the intellectual world, his tour naturally brings up
literary, cultural or historical reminiscences.</p>
<p><img alt="The Rings of Saturn" loading="lazy" src="/images/the-rings-of-saturn.jpg#right">
An astute Goodreads reviewer noted that Britain&rsquo;s decline&rsquo;s eccentric and
grotesque aspects are this work&rsquo;s central theme. The peregrinations of Thomas
Browne&rsquo;s skull, dubious capitalism, carpet bombing of Nazi Germany,
20th-century Imperialism, the case of Roger Casement, Belgian Congo genocide,
quasi-repatriation of Michael Hamburger, Tai-ping rebellion, Joseph Conrad&rsquo;s
Congo excursion, Edward Fitzgerald&rsquo;s life and times, etc.—and how these end,
or, indeed, constitute decay, dissolution and death. That&rsquo;s a lot of output for
a few days-long walk-about.</p>
<p>I learned about many people and events I was unaware of, and I&rsquo;m grateful for
that. The writing is excellent, as it is the Italian translation. But this work
lacks a solid central character; the narrator&rsquo;s travels don&rsquo;t tie its disparate
strands together adequately, making the whole not as gripping as desired.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 2.0 released</title>
      <link>https://nicolaiarocci.com/eve-2.0-released/</link>
      <pubDate>Wed, 08 Jun 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-2.0-released/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a long time coming, but I&amp;rsquo;m glad to announce that Eve 2 has finally
been released today. This release drops support for Python 2, Python 3.5 and
Python 3.6 hence the major version bump. Other than that, expect some fixes,
a new &lt;code&gt;uuidRepresentation&lt;/code&gt; setting for &lt;code&gt;MONGO_OPTIONS&lt;/code&gt;, and an alignment to the
latest Werkzeug/PyMongo idiosyncrasies. The full changelog is available on the
&lt;a href=&#34;https://docs.python-eve.org/en/stable/changelog.html#version-v2-0&#34;&gt;project website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Eve project has been out for ten years. As said &lt;a href=&#34;https://nicolaiarocci.com/is-eve-still-maintained/&#34;&gt;elsewhere&lt;/a&gt;, I believe it&amp;rsquo;s
mature and stable enough for most use cases. I consider it done in terms
of features, and it is now in &amp;lsquo;maintenance mode&amp;rsquo;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s been a long time coming, but I&rsquo;m glad to announce that Eve 2 has finally
been released today. This release drops support for Python 2, Python 3.5 and
Python 3.6 hence the major version bump. Other than that, expect some fixes,
a new <code>uuidRepresentation</code> setting for <code>MONGO_OPTIONS</code>, and an alignment to the
latest Werkzeug/PyMongo idiosyncrasies. The full changelog is available on the
<a href="https://docs.python-eve.org/en/stable/changelog.html#version-v2-0">project website</a>.</p>
<p>The Eve project has been out for ten years. As said <a href="/is-eve-still-maintained/">elsewhere</a>, I believe it&rsquo;s
mature and stable enough for most use cases. I consider it done in terms
of features, and it is now in &lsquo;maintenance mode&rsquo;.</p>
<p><img alt="Eve 2.0" loading="lazy" src="/images/eve2.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Invisible Cities</title>
      <link>https://nicolaiarocci.com/book-review-invisible-cities/</link>
      <pubDate>Fri, 27 May 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-invisible-cities/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Kublai Khan does not necessarily believe everything Marco Polo says when he
describes the cities visited on his expeditions, but the emperor of the
Tartars does continue listening to the young Venetian with greater attention
and curiosity than he shows any other messenger or explorer of his.&amp;rdquo; So
begins Italo Calvino&amp;rsquo;s compilation of fragmentary urban images. As Marco
tells the khan about Armilla, which &amp;ldquo;has nothing that makes it seem a city,
except the water pipes that rise vertically where the houses should be and
spread out horizontally where the floors should be,&amp;rdquo; the spider-web city of
Octavia, and other marvelous burgs, it may be that he is creating them all
out of his imagination, or perhaps he is recreating fine details of his
native Venice over and over again, or perhaps he is simply recounting some of
the myriad possible forms a city might take.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>&ldquo;Kublai Khan does not necessarily believe everything Marco Polo says when he
describes the cities visited on his expeditions, but the emperor of the
Tartars does continue listening to the young Venetian with greater attention
and curiosity than he shows any other messenger or explorer of his.&rdquo; So
begins Italo Calvino&rsquo;s compilation of fragmentary urban images. As Marco
tells the khan about Armilla, which &ldquo;has nothing that makes it seem a city,
except the water pipes that rise vertically where the houses should be and
spread out horizontally where the floors should be,&rdquo; the spider-web city of
Octavia, and other marvelous burgs, it may be that he is creating them all
out of his imagination, or perhaps he is recreating fine details of his
native Venice over and over again, or perhaps he is simply recounting some of
the myriad possible forms a city might take.</p></blockquote>
<p>Invisible Cities is a collection of thoughts taking the form of cities or
cities taking the form of thoughts. It is an aesthetic and allegorical
description of some fictional, mostly surreal cities. Some of the portrayals
are fabulous: these cities suddenly come to life in the reader&rsquo;s mind thanks to
Calvino&rsquo;s mastery, who manages to materialize absurd cities, which have nothing
of the cities we are used to observing day after day; yet they appear to us
almost natural, absolutely possible, and charged with a suggestiveness that no
earthly city could have. In addition to the vivid images, however, we will be
confronted with the thought that the shapes of those cities give rise to the
figure of their inhabitants, who may represent various sides of human nature.</p>
<p>I can&rsquo;t help but think of suggestive architectures mentioned in other works,
like Mervyn Peake&rsquo;s Gormenghast series or Hayao Miyazaki&rsquo;s animes. In Peake and
Miyazaki, architecture plays a fundamental and often active role (think of
Howl&rsquo;s Moving Castle). Likewise, Calvino&rsquo;s Cities are absolute protagonists,
while Marco Polo and the khan are mere means to the narration.</p>
<p><img alt="Le Città Invisibili" loading="lazy" src="/images/citta-invisibili.jpg#right">
Invisible Cities is one of Calvino&rsquo;s best works. Like others of his, it might
even appear light to the superficial reader while it&rsquo;s chock full of precious
insights and profound thoughts delivered by a master at the art.</p>
<blockquote>
<p>The inferno of the living is not something that will be; if there is one, it
is what is already here, the inferno where we live every day, that we form by
being together. There are two ways to escape suffering it. The first is easy
for many: accept the inferno and become such a part of it that you can no
longer see it. The second is risky and demands constant vigilance and
apprehension: seek and learn to recognize who and what, in the midst of
inferno, are not inferno, then make them endure, give them space. ― Italo
Calvino, Invisible Cities</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>I got Covid</title>
      <link>https://nicolaiarocci.com/i-got-covid/</link>
      <pubDate>Thu, 19 May 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-got-covid/</guid>
      <description>&lt;p&gt;After two years of avoiding it, I finally got Covid. First two days, I had
a few symptoms but was testing negative (it was likely to be Covid because one
of my daughters was positive.) On day three, I tested positive. It&amp;rsquo;s ten days
now, but only during the first three or four I didn&amp;rsquo;t feel good: a light fever,
pinching throat, some coughing and sleepiness, that&amp;rsquo;s all.  I did not have to
miss any working days (I&amp;rsquo;m self-employed) and only had to skip two of my daily
training routines&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;. I&amp;rsquo;m in my early fifties, healthy, fully vaccinated and
boosted.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>After two years of avoiding it, I finally got Covid. First two days, I had
a few symptoms but was testing negative (it was likely to be Covid because one
of my daughters was positive.) On day three, I tested positive. It&rsquo;s ten days
now, but only during the first three or four I didn&rsquo;t feel good: a light fever,
pinching throat, some coughing and sleepiness, that&rsquo;s all.  I did not have to
miss any working days (I&rsquo;m self-employed) and only had to skip two of my daily
training routines<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I&rsquo;m in my early fifties, healthy, fully vaccinated and
boosted.</p>
<p>These days, in our household, three out of four got the Covid. Our eldest son
is in Berlin at the university, but he got Covid one year ago when studying in
France. As I write, I learn that my brother and his wife have tested positive.
Hopefully, our elders will stay clear of it. I&rsquo;m so thankful for all the
science that makes this less terrible.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I&rsquo;ll have to pass on <a href="https://www.meetup.com/DevRomagna/events/285149575/">tonight&rsquo;s DevRomagna meetup</a>, though, and I&rsquo;m likely to skip next weekend&rsquo;s <a href="https://tomccitalia.org/evento/monte-baldo-2022/">planned motorcycle trip</a>—minor annoyances given the circumstances, but it still sucks.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Becoming the Emperor</title>
      <link>https://nicolaiarocci.com/becoming-the-emperor/</link>
      <pubDate>Wed, 18 May 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/becoming-the-emperor/</guid>
      <description>&lt;p&gt;Today, probably not just by coincidence, I came across &lt;a href=&#34;https://www.newyorker.com/magazine/2005/02/14/becoming-the-emperor&#34;&gt;Becoming the Emperor&lt;/a&gt;, an
excellent New Yorker piece from 2005 on Memoirs of Hadrian, Yourcenar&amp;rsquo;s other
works, and her peculiar career and life trajectory. Having just read the
Memoirs, I was glad to see several of &lt;a href=&#34;https://nicolaiarocci.com/book-review-memoirs-of-hadrian/&#34;&gt;my reading impressions&lt;/a&gt; confirmed.
I found the New Yorker article to be spot-on on Yourcenar&amp;rsquo;s prose and theme:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Actually, some of Yourcenar’s prose is marmoreal, but not so that you can’t
get through it. Also, it is beautiful. What made her remarkable, however, was
not so much her style as the quality of her mind. Loftiness served her well
as an artist: she was able to dispense love and justice, heat and cold in
equal parts. Above all, her high sense of herself gave her the strength to
take on a great topic: time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, probably not just by coincidence, I came across <a href="https://www.newyorker.com/magazine/2005/02/14/becoming-the-emperor">Becoming the Emperor</a>, an
excellent New Yorker piece from 2005 on Memoirs of Hadrian, Yourcenar&rsquo;s other
works, and her peculiar career and life trajectory. Having just read the
Memoirs, I was glad to see several of <a href="https://nicolaiarocci.com/book-review-memoirs-of-hadrian/">my reading impressions</a> confirmed.
I found the New Yorker article to be spot-on on Yourcenar&rsquo;s prose and theme:</p>
<blockquote>
<p>Actually, some of Yourcenar’s prose is marmoreal, but not so that you can’t
get through it. Also, it is beautiful. What made her remarkable, however, was
not so much her style as the quality of her mind. Loftiness served her well
as an artist: she was able to dispense love and justice, heat and cold in
equal parts. Above all, her high sense of herself gave her the strength to
take on a great topic: time.</p></blockquote>
<p>I was caught off-guard by the idea, conceived by many critics, that her writing
style resembles a man rather than a woman.</p>
<blockquote>
<p>First, many of her narratives were set in the past. Second, they often
involved towering passions compacted into tight, steel-band forms. [&hellip;] She
continued to embrace anti-sentimentality; indeed, she showed a fondness for
brutality. And those traits, together with her highly controlled prose,
encouraged reviewers to say—as they would say throughout her life—that she
wrote like a man. As one critic put it, he could not find in her work “those
often charming weaknesses&hellip; by which one identifies a feminine pen. The
hand does not yield, it does not caress the paper; it is clasped by an iron
gauntlet.” This opinion was fortified by the fact that most of her
protagonists were men.</p></blockquote>
<p>Intriguing and, now that I have been enlightened, shareable.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve-Swagger v0.2 released</title>
      <link>https://nicolaiarocci.com/eve-swagger-v0.2-released/</link>
      <pubDate>Tue, 17 May 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/eve-swagger-v0.2-released/</guid>
      <description>&lt;p&gt;I just released &lt;a href=&#34;https://pypi.org/project/Eve-Swagger/&#34;&gt;Eve-Swagger v0.2&lt;/a&gt; on PyPI. Eve-Swagger is a Swagger/OpenAPI
extension for &lt;a href=&#34;https://python-eve.org&#34;&gt;Eve&lt;/a&gt; powered RESTful APIs. This maintenance release addresses
a few issues and adds support for &lt;a href=&#34;https://github.com/rs/eve-auth-jwt&#34;&gt;eve-auth-jwt&lt;/a&gt;. Many thanks to &lt;a href=&#34;https://github.com/sildur&#34;&gt;Roberto
Romero&lt;/a&gt; for his contributions to this release.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Eve-Swagger 0.2&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/eve-swagger-0.2.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just released <a href="https://pypi.org/project/Eve-Swagger/">Eve-Swagger v0.2</a> on PyPI. Eve-Swagger is a Swagger/OpenAPI
extension for <a href="https://python-eve.org">Eve</a> powered RESTful APIs. This maintenance release addresses
a few issues and adds support for <a href="https://github.com/rs/eve-auth-jwt">eve-auth-jwt</a>. Many thanks to <a href="https://github.com/sildur">Roberto
Romero</a> for his contributions to this release.</p>
<p><img alt="Eve-Swagger 0.2" loading="lazy" src="/images/eve-swagger-0.2.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Memoirs of Hadrian</title>
      <link>https://nicolaiarocci.com/book-review-memoirs-of-hadrian/</link>
      <pubDate>Mon, 16 May 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-memoirs-of-hadrian/</guid>
      <description>&lt;p&gt;Memoirs of Hadrian and its author Marguerite Yourcenar have always induced
a cautious fear in me. I fretted the tome for high literary circles, one of
those texts so infused with learned quotations and obscure literary references
as to be utterly indigestible to the average reader. Despite their evident
reputation, I relegated the Memoirs to the bottom of my reading list for a long
time. When I stumbled on another reference to Yourcenar&amp;rsquo;s work a couple of
weeks ago, I finally decided to plunge and pull the Memoirs off the shelf.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Memoirs of Hadrian and its author Marguerite Yourcenar have always induced
a cautious fear in me. I fretted the tome for high literary circles, one of
those texts so infused with learned quotations and obscure literary references
as to be utterly indigestible to the average reader. Despite their evident
reputation, I relegated the Memoirs to the bottom of my reading list for a long
time. When I stumbled on another reference to Yourcenar&rsquo;s work a couple of
weeks ago, I finally decided to plunge and pull the Memoirs off the shelf.</p>
<p>It was immediately apparent that I was facing something exceptional. The
memoirs are drafted by an elderly emperor Hadrian for his young friend &ldquo;Mark,&rdquo;
the future Marcus Aurelius. Hadrian does not flinch. He tells of his many great
successes but does not hide his mistakes and weaknesses. The former he points
out so that his protégé can steer clear of them; the latter he investigates,
not without that indulgence that every elder is entitled to.</p>
<p>The emperor writes of practical things: the organization of the state and
turbulent provinces management (he devoted a significant part of his career to
visiting the remote provinces, so much that he was criticized for being too
absent from Rome), the conspiracies he foiled and the problematic management of
the enormous army, with all its quarrelsome commanders and legions. But Hadrian
also tells about his private life: the boundless ambition of his youth, the
passion for Hellenic culture and how it influenced his reign. He writes about
his fleeting loves and the relationship with the young Antinous, his only true
love, tragically lost way too soon. To overcome the trauma of the loss, Hadrian
does what is precluded to ordinary mortals: deifies his beloved. He establishes
a cult of  Antinous, which, surprisingly so in the eyes of modern man,
flourishes everywhere in the vast empire, taking different forms depending on
the receiving religion. Like any ordinary person, the emperor wonders about the
eternal questions that plague humanity. He offers answers to some while others
are left unanswered, impenetrable even to the divine emperor.</p>
<p><img alt="Memoirs of Hadrian" loading="lazy" src="/images/memoirs-of-hadrian.jpg#right">
The text is compelling, intimate and full of such accurate details that I soon
wondered whether what I was reading was a literary invention or a historical
document. The truth lies somewhere in between. According to the sources,
Hadrian did write an autobiography, but it is lost. The Memoirs is indeed
a work of fiction; the result, however, of meticulous historical research
carried out, between ups and downs, for thirty years. Everything that Hadrian
recounts is historically attested. Where doubts exist, the author chooses the
most reliable historical hypothesis, not failing at times to adjust, rehash, or
add where necessary. The author&rsquo;s notes, included in my edition, are invaluable
in fully understanding and appreciating the amount and quality of work done.
Yourcenar conceived the idea in 1924-25, when she was only 22 years old, only
to publish it in 1951. Nowadays, historical novels are common but not in the
early twentieth century, when the memoir letter form was probably unheard of.
The result is a daring and unconventional work for the time, a high-risk
publication that was instead an immediate success with both the public and the
critics who acclaimed it.</p>
<p>My long-held fears were unfounded after all. Although with some guilty delay,
this book goes straight into my all-time top ten.</p>
<p>See also: <em><a href="/becoming-the-emperor/">Becoming the Emperor</a></em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Stripe releases MarkDoc and that&#39;s a good thing</title>
      <link>https://nicolaiarocci.com/stripe-releases-markdoc-and-thats-a-good-thing/</link>
      <pubDate>Fri, 13 May 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/stripe-releases-markdoc-and-thats-a-good-thing/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://stripe.com/docs&#34;&gt;Stripe docs&lt;/a&gt; are a marvel, and every developer who&amp;rsquo;s had to deal with them knows
it. After years of painful PayPal interactions, I remember the amazement and
the feverish grin on my face the first time I landed on their API reference.
Stripe API is beautifully designed, but it&amp;rsquo;s the combination of good design and
excellent documentation that paved Stripe&amp;rsquo;s fulgid success.&lt;/p&gt;
&lt;p&gt;A few days ago, they unexpectedly released &lt;a href=&#34;https://markdoc.io/&#34;&gt;MarkDoc&lt;/a&gt;, the &amp;ldquo;powerful,
flexible, Markdown-based authoring framework&amp;rdquo; they use internally to build
their documentation. I skimmed through it only rapidly and, unsurprisingly, got
a great first impression.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://stripe.com/docs">Stripe docs</a> are a marvel, and every developer who&rsquo;s had to deal with them knows
it. After years of painful PayPal interactions, I remember the amazement and
the feverish grin on my face the first time I landed on their API reference.
Stripe API is beautifully designed, but it&rsquo;s the combination of good design and
excellent documentation that paved Stripe&rsquo;s fulgid success.</p>
<p>A few days ago, they unexpectedly released <a href="https://markdoc.io/">MarkDoc</a>, the &ldquo;powerful,
flexible, Markdown-based authoring framework&rdquo; they use internally to build
their documentation. I skimmed through it only rapidly and, unsurprisingly, got
a great first impression.</p>
<p>Fabrizio Ferri Benedetti, who <a href="https://passo.uno/about">knows better than me about docs</a>, published
a solid first-glance <a href="https://passo.uno/markdoc-review/">review of MarkDoc</a> that I think is worth reading.
Spoiler alert, I&rsquo;m quoting below his excellent closing thoughts.</p>
<blockquote>
<p>The secret to Stripe docs does not lie in superior tooling or magical markup
variants: rather, the reason for their success must be found in the quality
of their docs team, whose information architecture needs caused Markdoc to
happen. This is the kind of magic that happens when you provide enough
technical resources to your technical writers and trust them to do the right
thing.</p></blockquote>
<p><em>Update</em>: MarkDoc even received <a href="https://daringfireball.net/linked/2022/05/19/markdoc">John Gruber&rsquo;s endorsement</a>. That&rsquo;s quite an
achievement as Gruber is renowned for dismissing most Markdown extensions.</p>
]]></content:encoded>
    </item>
    <item>
      <title>In-person vs. online events</title>
      <link>https://nicolaiarocci.com/in-person-vs.-online-events/</link>
      <pubDate>Sun, 01 May 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/in-person-vs.-online-events/</guid>
      <description>&lt;p&gt;Last week, thanks to &lt;a href=&#34;https://twitter.com/verlok&#34;&gt;Andrea Verlicchi&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&amp;rsquo;s effort, we ran the first
in-person &lt;a href=&#34;https://www.meetup.com/it-IT/DevRomagna/&#34;&gt;DevRomagna&lt;/a&gt; event since 2019. We did some meetups during the
pandemic, some in 2020 and a couple in 2022, but they were all online.&lt;/p&gt;
&lt;p&gt;In theory, online meetups and DevRomagna are a match made in heaven. The
&lt;a href=&#34;https://en.wikipedia.org/wiki/Romagna&#34;&gt;Romagna region&lt;/a&gt; consists of small same-size towns scattered in the vast
countryside. To accommodate this, and in an attempt to encourage varied
participation, DevRomagna has always been a roaming meetup. We might be in one
place one month, and then, next month, we will likely move to another town.
With online meetups, attendance doesn&amp;rsquo;t have to commit to a commute saving
time and money and allowing everyone to participate in events that would
otherwise be too far away.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last week, thanks to <a href="https://twitter.com/verlok">Andrea Verlicchi</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>&rsquo;s effort, we ran the first
in-person <a href="https://www.meetup.com/it-IT/DevRomagna/">DevRomagna</a> event since 2019. We did some meetups during the
pandemic, some in 2020 and a couple in 2022, but they were all online.</p>
<p>In theory, online meetups and DevRomagna are a match made in heaven. The
<a href="https://en.wikipedia.org/wiki/Romagna">Romagna region</a> consists of small same-size towns scattered in the vast
countryside. To accommodate this, and in an attempt to encourage varied
participation, DevRomagna has always been a roaming meetup. We might be in one
place one month, and then, next month, we will likely move to another town.
With online meetups, attendance doesn&rsquo;t have to commit to a commute saving
time and money and allowing everyone to participate in events that would
otherwise be too far away.</p>
<p>But there&rsquo;s value in commitment. The other day, we gathered in a new cozy
venue (<a href="https://www.facebook.com/centro.vaina">Ca&rsquo; Vaina</a><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, a municipality-run youth center and coworking space)
where my friend <a href="https://twitter.com/gsantomaggio">Gabriele Santomaggio</a> talked about Kubernetes, service mesh
and isolation techniques he and his colleagues adopt at Vmware. After the talk,
some of us went for dinner in a nearby pizzeria. The pizza was good, and the
craft beer was great. We talked about many things like our jobs, our favorite
developer tools and languages, and all the nerdy stuff you&rsquo;d imagine.
Suggestions for new original presentations were thrown around, which is always
good. Most importantly, I got to know new people, including Ugo, a fellow
<a href="https://mvp.microsoft.com/">Microsoft MVP</a> from my area whom I somehow managed not to meet in all these
years. With Ugo, we are now planning a few hopefully engaging dotnet-centered
events.</p>
<p>All in all, it was a pleasant, fruitful evening spent with like-minded
individuals. We could have done an online event with, probably, a higher
attendance. I would&rsquo;ve saved some money and time (Imola, the town where the
meetup took place, is a half-hour drive, which includes a highway toll), but
I wouldn&rsquo;t get to meet Ugo at the table or see Gabriele after two years of
pandemic-inflicted hiatus.</p>
<p>More than one interested in the event asked if we would stream it, and my
answer was no for several reasons. I suspect that in-person attendance would
dwindle if we&rsquo;d stream our events, as we&rsquo;d be effectively discouraging active
participation. Also, it wouldn&rsquo;t be fair to the people who make an effort and
come to the venue. Recording the session and streaming them later might be an
option, but this would discourage live participation too. So, for the time
being, whenever possible, DevRomagna will stay true to its roots and remain
a live event. There might be exceptions, like if we have a foreign or far-away
guest or can&rsquo;t find a proper venue.</p>
<p>We&rsquo;re a local meetup, and &ldquo;local&rdquo; hardly conjugates with &ldquo;online.&rdquo;</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Andrea is a DevRomagna co-organizer now. I am happy to have him onboard.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Sorry for the Facebook link. I couldn&rsquo;t find a better reference.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Lone Rider</title>
      <link>https://nicolaiarocci.com/book-review-lone-rider/</link>
      <pubDate>Fri, 15 Apr 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-lone-rider/</guid>
      <description>&lt;p&gt;In 1982, at just twenty-three years old and halfway through her architectural
studies, Elspeth Beard left her family and friends in London and set off on
a 35,000-mile solo adventure around the world on her 1974 BMW R60/6.&lt;/p&gt;
&lt;p&gt;Exhausted by a recent breakup and with only a few savings scraped together from
her job in a pub, a tent, a few clothes and some tools, all packed on the back
of her bike, she was determined to prove herself.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In 1982, at just twenty-three years old and halfway through her architectural
studies, Elspeth Beard left her family and friends in London and set off on
a 35,000-mile solo adventure around the world on her 1974 BMW R60/6.</p>
<p>Exhausted by a recent breakup and with only a few savings scraped together from
her job in a pub, a tent, a few clothes and some tools, all packed on the back
of her bike, she was determined to prove herself.</p>
<p>After almost two and a half years, she returned to London, having lost much
weight but wiser by decades. She had ridden through unforgiving landscapes and
war-torn countries and witnessed civil uprisings that forced her to forge
documents. She had fended off multiple sexual attacks, biker gangs, and corrupt
police convinced she was a drug dealer. She had survived life-threatening
illnesses, personal losses, and brutal accidents that left permanent scars and
a black hole in her memory. She had also fallen in love with two very different
men.</p>
<p><img alt="Lone Rider" loading="lazy" src="/images/lone-rider.jpg#right">
This book is an absorbing account of a true adventure, not just a motorcycle
adventure, lived by a woman of exceptional character, strength, tenacity and
resilience.</p>
<p>Today it seems incredible that at the time, no one was interested in this story
and that thirty years had to pass before it was published. Distance in time is
sometimes felt, especially in the lack of details or how some parts of the
journey are glossed over. Fortunately, Beard kept an accurate diary, on which
she drew heavily. The result is, in any case, 336 compelling pages, well worth
reading.</p>
]]></content:encoded>
    </item>
    <item>
      <title>If you know your user is asking for help show them the damn help</title>
      <link>https://nicolaiarocci.com/if-you-know-your-user-is-asking-for-help-show-them-the-damn-help/</link>
      <pubDate>Wed, 13 Apr 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/if-you-know-your-user-is-asking-for-help-show-them-the-damn-help/</guid>
      <description>&lt;p&gt;One of my pet peeves has always been the many different, sometimes very
original ways in which CLI tools handle help requests. POSIX sets the canon:
&lt;code&gt;-h&lt;/code&gt; or &lt;code&gt;--help&lt;/code&gt; is how we ask for help. But no, some tools&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; want to be
original at the worst moment: when their users are struggling, looking for
guidance.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s somewhat consolatory to learn that I&amp;rsquo;m not alone in this fight. The other
day I landed on Clayton Craft&amp;rsquo;s blog. His [rant on the topic][2] splendidly
concludes with the following assessment:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One of my pet peeves has always been the many different, sometimes very
original ways in which CLI tools handle help requests. POSIX sets the canon:
<code>-h</code> or <code>--help</code> is how we ask for help. But no, some tools<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> want to be
original at the worst moment: when their users are struggling, looking for
guidance.</p>
<p>It&rsquo;s somewhat consolatory to learn that I&rsquo;m not alone in this fight. The other
day I landed on Clayton Craft&rsquo;s blog. His [rant on the topic][2] splendidly
concludes with the following assessment:</p>
<blockquote>
<p>If you know your user is asking for help, show them the damn help. It serves
no one to chide them for not guessing the specific way your app wants them to
ask for help. Better yet, support a more &ldquo;common&rdquo; way to allow users to ask
for help if your app doesn&rsquo;t already.</p></blockquote>
<p>I agree wholeheartedly.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I&rsquo;m looking at you, NuGet.
[2]: <a href="https://blog.craftyguy.net/cmdline-help/">https://blog.craftyguy.net/cmdline-help/</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Neuromancer and the birth of Cyberpunk</title>
      <link>https://nicolaiarocci.com/neuromancer-and-the-birth-of-cyberpunk/</link>
      <pubDate>Thu, 07 Apr 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/neuromancer-and-the-birth-of-cyberpunk/</guid>
      <description>&lt;p&gt;I went back to my library to check the year of my original &lt;em&gt;Neuromancer&lt;/em&gt; edition.
It&amp;rsquo;s 1993. For some context, I was 23 back then, with my software company
founded only a couple of years earlier. The World Wide Web was at its very
early stages. I distinctly remember getting out of that book dazed and
confused. Characters were two-dimensional at best. There was a certain lack of
exposition. The recurring streams of consciousness were complex for me to
follow&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;. I knew I had something powerful and innovative in my hands; I was
fascinated, but Gibson&amp;rsquo;s writing, I think, put me off&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;</description>
      <content:encoded><![CDATA[<p>I went back to my library to check the year of my original <em>Neuromancer</em> edition.
It&rsquo;s 1993. For some context, I was 23 back then, with my software company
founded only a couple of years earlier. The World Wide Web was at its very
early stages. I distinctly remember getting out of that book dazed and
confused. Characters were two-dimensional at best. There was a certain lack of
exposition. The recurring streams of consciousness were complex for me to
follow<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I knew I had something powerful and innovative in my hands; I was
fascinated, but Gibson&rsquo;s writing, I think, put me off<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>These musings were recently conjured by reading <em><a href="https://sabukaru.online/articles/how-neuromancer-birthed-cyberpunk">Neuromancer. The Birth of
Cyberpunk</a></em>, a fine, splendidly illustrated short essay on Gibson&rsquo;s
influence, published by Sabukaru Online (which feed I promptly added to my RSS
reader.).</p>
<blockquote>
<p>When Gibson penned his opening line ‘the sky above the port was the colour of
television, tuned to a dead channel’ he merged reality and the digital in
a way that seems almost prophetic today, as online footprints grow
exponentially and internet universes creep into reality. Instead of two
separate realms, there’s a ripple and blur.</p></blockquote>
<p>I might re-read the novel. I&rsquo;m curious about my opinion as a senior reader.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Not surprisingly, I&rsquo;m having a hard time following the <em>Ulysses</em> too.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>At the time, I didn&rsquo;t know that <em>Neuromancer</em> was Gibson&rsquo;s first novel.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The Sun in high resolution</title>
      <link>https://nicolaiarocci.com/the-sun-in-high-resolution/</link>
      <pubDate>Tue, 05 Apr 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-sun-in-high-resolution/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;The Sun in high resolkution&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/the-sun.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Sun as seen by Solar Orbiter in extreme ultraviolet light from a distance
of roughly 75 million kilometres. The image is a mosaic of 25 individual
images taken on 7 March by the high resolution telescope of the Extreme
Ultraviolet Imager (EUI) instrument. Taken at a wavelength of 17 nanometers,
in the extreme ultraviolet region of the electromagnetic spectrum, this image
reveals the Sun’s upper atmosphere, the corona, which has a temperature of
around a million degrees Celsius.  In total, the final image contains more
than 83 million pixels in a 9148 x 9112 pixel grid, making it the highest
resolution image of the Sun’s full disc and outer atmosphere, the corona,
ever taken.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="The Sun in high resolkution" loading="lazy" src="/images/the-sun.png"></p>
<blockquote>
<p>The Sun as seen by Solar Orbiter in extreme ultraviolet light from a distance
of roughly 75 million kilometres. The image is a mosaic of 25 individual
images taken on 7 March by the high resolution telescope of the Extreme
Ultraviolet Imager (EUI) instrument. Taken at a wavelength of 17 nanometers,
in the extreme ultraviolet region of the electromagnetic spectrum, this image
reveals the Sun’s upper atmosphere, the corona, which has a temperature of
around a million degrees Celsius.  In total, the final image contains more
than 83 million pixels in a 9148 x 9112 pixel grid, making it the highest
resolution image of the Sun’s full disc and outer atmosphere, the corona,
ever taken.</p></blockquote>
<p>High resolution image and more details on <a href="https://www.esa.int/ESA_Multimedia/Images/2022/03/The_Sun_in_high_resolution">ESA website</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to copy a file&#39;s path in macOS Finder</title>
      <link>https://nicolaiarocci.com/how-to-copy-a-files-path-in-macos-finder/</link>
      <pubDate>Mon, 04 Apr 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-copy-a-files-path-in-macos-finder/</guid>
      <description>&lt;p&gt;No matter how long I&amp;rsquo;ve possessed a Mac and how hard I try, there will always
be a helpful keyboard shortcut hidden somewhere that I don&amp;rsquo;t know about.&lt;/p&gt;
&lt;p&gt;Today I learned about holding the &lt;code&gt;Option&lt;/code&gt; key while clicking on the Copy
command in Finder. It activates the super-useful (and super-secret) &amp;ldquo;copy as
pathname&amp;rdquo; feature.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Credits: Jamie Smith&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/finder-menu-option.gif&#34;&gt;&lt;/p&gt;
&lt;p&gt;I spotted this trick on &lt;a href=&#34;https://www.jamieonkeys.dev/posts/keyboard-shortcuts/&#34;&gt;Jamie Smith&amp;rsquo;s website&lt;/a&gt;, where other handy shortcuts
(and the pretty gif above) reside.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>No matter how long I&rsquo;ve possessed a Mac and how hard I try, there will always
be a helpful keyboard shortcut hidden somewhere that I don&rsquo;t know about.</p>
<p>Today I learned about holding the <code>Option</code> key while clicking on the Copy
command in Finder. It activates the super-useful (and super-secret) &ldquo;copy as
pathname&rdquo; feature.</p>
<p><img alt="Credits: Jamie Smith" loading="lazy" src="/images/finder-menu-option.gif"></p>
<p>I spotted this trick on <a href="https://www.jamieonkeys.dev/posts/keyboard-shortcuts/">Jamie Smith&rsquo;s website</a>, where other handy shortcuts
(and the pretty gif above) reside.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Roumeli</title>
      <link>https://nicolaiarocci.com/book-review-roumeli/</link>
      <pubDate>Sat, 02 Apr 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-roumeli/</guid>
      <description>&lt;p&gt;&lt;em&gt;Roumeli&lt;/em&gt; describes Fermor&amp;rsquo;s travels around Northern Greece and Macedonia. He
visits secluded and remote areas and describes the rugged countryside and how
people of these remote regions live. As he meets Sarakatsan shepherds and
spends some time with them, visits the impressive monasteries of Meteora,
attempts to track a pair of Byron&amp;rsquo;s slippers in Missolonghi and investigates
Kravara and its secret language, he makes acute observations about these
communities and their history.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Roumeli</em> describes Fermor&rsquo;s travels around Northern Greece and Macedonia. He
visits secluded and remote areas and describes the rugged countryside and how
people of these remote regions live. As he meets Sarakatsan shepherds and
spends some time with them, visits the impressive monasteries of Meteora,
attempts to track a pair of Byron&rsquo;s slippers in Missolonghi and investigates
Kravara and its secret language, he makes acute observations about these
communities and their history.</p>
<p><img alt="Roumelia" loading="lazy" src="/images/rumelia.jpg#right">
His prose is rich, and his erudition is immense. His love for this long-lost
world is touchingly apparent. <em>Roumeli</em> is not just travel writing but a moving
celebration of Greece and its culture. Patrick Leigh Fermor is one of my
favorite authors and yet, of all of his books, this is not my favorite<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.
There&rsquo;s a certain lack of focus (the whole Crete divagation, while poetic and
evocative, has little to do with the context of this book<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>), and some
musings on Greeks&rsquo; nature, while interesting, tend to run long.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>PLF&rsquo;s <em>Mani: Travels in the Southern Peloponnese</em> and the whole <em>A Time of Gits</em>  trilogy are some of my all-time favorite travel books.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>On Fermor&rsquo;s activity as a secret agent in Crete during WWII, I greatly appreciated <em>Ill Met by Moonglight: The Abduction of General Kreipe</em>, by W. Stanley Moss.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>My Playwright session at WebDay 2022</title>
      <link>https://nicolaiarocci.com/my-playwright-session-at-webday-2022/</link>
      <pubDate>Fri, 01 Apr 2022 06:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-playwright-session-at-webday-2022/</guid>
      <description>&lt;p&gt;If you understand Italian, the recording of my Playwright session at
UGIdotNET&amp;rsquo;s &lt;a href=&#34;https://www.ugidotnet.org/e/2840/Web-Day-2022&#34;&gt;WebDay 2022&lt;/a&gt; is now available on YouTube&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;. Playwright is
a phenomenal cross-browser, cross-platform, cross-language, single-API,
mobile-friendly front-end testing tool.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m looking forward to giving the same session in English sooner or later, but
I should first win my laziness and start looking for exciting events with open
CFPs. If you happen to know one, please let me know.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/BaY9WIHUwFc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;A couple weeks later I also presented at &lt;a href=&#34;https://www.meetup.com/it-IT/DevRomagna/events/284626987/&#34;&gt;DevRomagna&lt;/a&gt;, the local meetup I run.
[rss]: &lt;a href=&#34;https://nicolaiarocci.com/index.xml&#34;&gt;https://nicolaiarocci.com/index.xml&lt;/a&gt;
[tw]: &lt;a href=&#34;http://twitter.com/nicolaiarocci&#34;&gt;http://twitter.com/nicolaiarocci&lt;/a&gt;
[nl]: &lt;a href=&#34;https://buttondown.email/nicolaiarocci&#34;&gt;https://buttondown.email/nicolaiarocci&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;</description>
      <content:encoded><![CDATA[<p>If you understand Italian, the recording of my Playwright session at
UGIdotNET&rsquo;s <a href="https://www.ugidotnet.org/e/2840/Web-Day-2022">WebDay 2022</a> is now available on YouTube<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Playwright is
a phenomenal cross-browser, cross-platform, cross-language, single-API,
mobile-friendly front-end testing tool.</p>
<p>I&rsquo;m looking forward to giving the same session in English sooner or later, but
I should first win my laziness and start looking for exciting events with open
CFPs. If you happen to know one, please let me know.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/BaY9WIHUwFc?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>A couple weeks later I also presented at <a href="https://www.meetup.com/it-IT/DevRomagna/events/284626987/">DevRomagna</a>, the local meetup I run.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Quoting David Foster Wallace</title>
      <link>https://nicolaiarocci.com/quoting-david-foster-wallace/</link>
      <pubDate>Thu, 31 Mar 2022 06:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quoting-david-foster-wallace/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Because here’s something else that’s true. In the day-to-day trenches of
adult life, there is actually no such thing as atheism. There is no such
thing as not worshipping. Everybody worships. The only choice we get is what
to worship. And an outstanding reason for choosing some sort of God or
spiritual-type thing to worship-be it J.C. or Allah, be it Yahweh or the
Wiccan mother-goddess or the Four Noble Truths or some infrangible set of
ethical principles-is that pretty much anything else you worship will eat you
alive. If you worship money and things-if they are where you tap real meaning
in life-then you will never have enough. Never feel you have enough. It’s the
truth.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Because here’s something else that’s true. In the day-to-day trenches of
adult life, there is actually no such thing as atheism. There is no such
thing as not worshipping. Everybody worships. The only choice we get is what
to worship. And an outstanding reason for choosing some sort of God or
spiritual-type thing to worship-be it J.C. or Allah, be it Yahweh or the
Wiccan mother-goddess or the Four Noble Truths or some infrangible set of
ethical principles-is that pretty much anything else you worship will eat you
alive. If you worship money and things-if they are where you tap real meaning
in life-then you will never have enough. Never feel you have enough. It’s the
truth.</p></blockquote>
<blockquote>
<p>Worship your own body and beauty and sexual allure and you will always feel
ugly, and when time and age start showing, you will die a million deaths
before they finally plant you. On one level, we all know this stuff
already-it’s been codified as myths, proverbs, clichés, bromides, epigrams,
parables: the skeleton of every great story. The trick is keeping the truth
up-front in daily consciousness. Worship power-you will feel weak and afraid,
and you will need ever more power over others to keep the fear at bay.
Worship your intellect, being seen as smart-you will end up feeling stupid,
a fraud, always on the verge of being found out. And so on.</p></blockquote>
<blockquote>
<p>&ndash;David Foster Wallace in &ldquo;<a href="https://web.archive.org/web/20080213082423/http://www.marginalia.org/dfw_kenyon_commencement.html">This is Water</a>&rdquo; (<a href="https://macwright.com/2022/03/29/recently.html">via</a>)</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>How multifactor authentication is breached</title>
      <link>https://nicolaiarocci.com/how-multifactor-authentication-is-breached/</link>
      <pubDate>Wed, 30 Mar 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-multifactor-authentication-is-breached/</guid>
      <description>&lt;p&gt;Dan Goodin at Ars Tecnica, on multifactor authentication (2FA/MFA):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Multifactor authentication (MFA) is a core defense that is among the most
effective at preventing account takeovers. In addition to requiring that
users provide a username and password, MFA ensures they must also use an
additional factor—be it a fingerprint, physical security key, or one-time
password—before they can access an account. Nothing in this article should be
construed as saying MFA isn’t anything other than essential.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dan Goodin at Ars Tecnica, on multifactor authentication (2FA/MFA):</p>
<blockquote>
<p>Multifactor authentication (MFA) is a core defense that is among the most
effective at preventing account takeovers. In addition to requiring that
users provide a username and password, MFA ensures they must also use an
additional factor—be it a fingerprint, physical security key, or one-time
password—before they can access an account. Nothing in this article should be
construed as saying MFA isn’t anything other than essential.</p></blockquote>
<blockquote>
<p>That said, some forms of MFA are stronger than others, and recent events show
that these weaker forms aren’t much of a hurdle for some hackers to clear. In
the past few months, suspected script kiddies like the Lapsus$ data extortion
gang and elite Russian-state threat actors (like Cozy Bear, the group behind
the SolarWinds hack) have both successfully defeated the protection.</p></blockquote>
<p>More
<a href="https://arstechnica.com/information-technology/2022/03/lapsus-and-solar-winds-hackers-both-use-the-same-old-trick-to-bypass-mfa/">here</a>.
The article is solid. It first introduces the various forms of MFA, then
explains the attack vectors used to bypass them (hint: they prey on distracted,
busy, or otherwise unaware people - we&rsquo;ve all been there.) I appreciate their
stressing that MFA is essential while raising awareness of the potential
pitfalls.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Three Days Well Spent</title>
      <link>https://nicolaiarocci.com/three-days-well-spent/</link>
      <pubDate>Sun, 20 Mar 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/three-days-well-spent/</guid>
      <description>&lt;p&gt;A few weeks ago, Giulia turned eighteen.  As a birthday gift, she asked for
a skiing weekend with me.  Our family&amp;rsquo;s precious little thing has
traditionally been spending the Christmas week skiing in the Alps.  We haven&amp;rsquo;t
gone as much as we&amp;rsquo;d like in recent years, so I was pleasantly surprised and
thrilled that she wanted to celebrate adulthood at our special place with her
dad.&lt;/p&gt;
&lt;p&gt;We left home Friday at five in the morning.  At ten, we were on the slopes,
admittedly feeling a little lost without the rest of the gang.  We quickly got
into the right mood, though.  We spent three glorious, precious days together.
We can rarely spend time together, just her and me, when in town.  This
morning, I walked on the beach thinking about those three days and pondering
how lucky a dad I am.  Her birthday gift turned out as an invaluable gift for
me.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few weeks ago, Giulia turned eighteen.  As a birthday gift, she asked for
a skiing weekend with me.  Our family&rsquo;s precious little thing has
traditionally been spending the Christmas week skiing in the Alps.  We haven&rsquo;t
gone as much as we&rsquo;d like in recent years, so I was pleasantly surprised and
thrilled that she wanted to celebrate adulthood at our special place with her
dad.</p>
<p>We left home Friday at five in the morning.  At ten, we were on the slopes,
admittedly feeling a little lost without the rest of the gang.  We quickly got
into the right mood, though.  We spent three glorious, precious days together.
We can rarely spend time together, just her and me, when in town.  This
morning, I walked on the beach thinking about those three days and pondering
how lucky a dad I am.  Her birthday gift turned out as an invaluable gift for
me.</p>
<p><img loading="lazy" src="/images/seceda.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Endurance: Shackleton&#39;s lost ship found in Antarctic</title>
      <link>https://nicolaiarocci.com/endurance-shackletons-lost-ship-found-in-antarctic/</link>
      <pubDate>Wed, 09 Mar 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/endurance-shackletons-lost-ship-found-in-antarctic/</guid>
      <description>&lt;p&gt;A few months ago I started &lt;a href=&#34;https://nicolaiarocci.com/book-review-endurance-shackletons-incredible-voyage/&#34;&gt;my review of Lansing&amp;rsquo;s &lt;em&gt;Endurance: Shackleton&amp;rsquo;s
Incredible Voyage&lt;/em&gt;&lt;/a&gt; with these words:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Of all the stories of maritime adventures I’ve read, that of the Endurance,
masterfully told by Alfred Lansing in this book, is the most incredible and
shocking.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And I meant that. As the book&amp;rsquo;s title suggests, that story is simply
unbelievable, yet true. Imagine my astonishment this morning at the news that
the Endurance was found in the depths of the Antarctic.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few months ago I started <a href="/book-review-endurance-shackletons-incredible-voyage/">my review of Lansing&rsquo;s <em>Endurance: Shackleton&rsquo;s
Incredible Voyage</em></a> with these words:</p>
<blockquote>
<p>Of all the stories of maritime adventures I’ve read, that of the Endurance,
masterfully told by Alfred Lansing in this book, is the most incredible and
shocking.</p></blockquote>
<p>And I meant that. As the book&rsquo;s title suggests, that story is simply
unbelievable, yet true. Imagine my astonishment this morning at the news that
the Endurance was found in the depths of the Antarctic.</p>
<blockquote>
<p>Scientists have found and filmed one of the greatest ever undiscovered
shipwrecks 107 years after it sank. The Endurance, the lost vessel of
Antarctic explorer Sir Ernest Shackleton, was found at the weekend at the
bottom of the Weddell Sea.</p></blockquote>
<p>More <a href="https://www.bbc.com/news/science-environment-60662541">here</a>, along with incredible footage.</p>
<p><img loading="lazy" src="/images/endurance.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Trusting third-party services with your data, a cautionary tale</title>
      <link>https://nicolaiarocci.com/trusting-third-party-services-with-your-data-a-cautionary-tale/</link>
      <pubDate>Sat, 05 Mar 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/trusting-third-party-services-with-your-data-a-cautionary-tale/</guid>
      <description>&lt;p&gt;Quoting [Nelson&amp;rsquo;s weblog][3]:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Goodreads lost my entire account last week. Nine years as a user, some 600
books and 250 carefully written reviews all deleted and unrecoverable. Their
support has not been helpful. In 35 years of being online I&amp;rsquo;ve never
encountered a company with such callous disregard for their users&amp;rsquo; data.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Ouch. A lesson learned the hard way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My plan now is to host my own blog-like collection of all my reading notes
like [Tom does][2].&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quoting [Nelson&rsquo;s weblog][3]:</p>
<blockquote>
<p>Goodreads lost my entire account last week. Nine years as a user, some 600
books and 250 carefully written reviews all deleted and unrecoverable. Their
support has not been helpful. In 35 years of being online I&rsquo;ve never
encountered a company with such callous disregard for their users&rsquo; data.</p></blockquote>
<p>Ouch. A lesson learned the hard way:</p>
<blockquote>
<p>My plan now is to host my own blog-like collection of all my reading notes
like [Tom does][2].</p></blockquote>
<p>One of the many reasons I don&rsquo;t write my reviews on Goodreads and host them on
my website instead is precisely the risk of losing them all one day<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. The same
with Twitter. I have been on Twitter since 2009 and was very active there.
I [witnessed][6] the BBS era. Since then, I&rsquo;ve seen oh-so-many &ldquo;too big to fail&rdquo;
services coming and going, I could fill a book.</p>
<p>Tweeting is quicker and faster, yes. So is writing a review on Goodreads. If
I don&rsquo;t feel like opening vim to write something, though, then it&rsquo;s probably
not worth sharing in the first place.</p>
<p>Posting on Goodreads or Twitter grants more visibility, that&rsquo;s for sure.
I understand that clicking a link to leave the platform is an effort that not
everyone is willing to make. I&rsquo;m probably losing followers on Twitter and
&lsquo;friends&rsquo; on Goodreads. That&rsquo;s fine<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. Those remaining are likely to be more
interested in my content and, ultimately, in me as a person.</p>
<p>Most of the stuff I write here is meant for myself anyway. If what I write
happens to also be interesting for other readers, that&rsquo;s cool, but it&rsquo;s not the
primary goal. I feel much better now that I own my content. The switch from
social media content production to [POSSE][4] was beneficial and is something
I advise everyone to do.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Other compelling reasons are not being okay with platforms profiling me or profiting from my content.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Besides, I wish more and more people would fall back to RSS for their content consumption. That&rsquo;s how I discover and collect content. Weblogs, YouTube channels, news and science sites, programming resources, and even top Twitter profiles all get digested by my RSS reader.
[2]: <a href="https://macwright.com/reading/">https://macwright.com/reading/</a>
[3]: <a href="https://www.somebits.com/weblog/tech/bad/goodreads-lost-all-my-data.html">https://www.somebits.com/weblog/tech/bad/goodreads-lost-all-my-data.html</a>
[4]: <a href="https://indieweb.org/POSSE">https://indieweb.org/POSSE</a>
[6]: /a-trip-down-memory-lane-fidonet-and-usenet/
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Thinking Fast and Slow</title>
      <link>https://nicolaiarocci.com/book-review-thinking-fast-and-slow/</link>
      <pubDate>Fri, 04 Mar 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-thinking-fast-and-slow/</guid>
      <description>&lt;p&gt;This book stands up to its fame. It&amp;rsquo;s chock-full of precious insights on our
decision-making and behavioral processes and how and why we humans are often
capable of making informed yet awful decisions. The bad news is that we can
hardly avoid most of these biases, no matter how hard we try and even if we
know about them. So-called experts in the field are subject to these same
biases: their short-term estimates and predictions can even be pretty good, but
they will fail miserably in the long term, like any other man or woman. There
are so many interesting tidbits in this text that it&amp;rsquo;s overwhelming. Some, if
not most of them, may even fall in the ordinary sense category, but the added
value here is we are being told why they fall in that class. Because I came to
reading it so late (it was published in 2011), this book might be the main
reason why some of these concepts are now common sense.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This book stands up to its fame. It&rsquo;s chock-full of precious insights on our
decision-making and behavioral processes and how and why we humans are often
capable of making informed yet awful decisions. The bad news is that we can
hardly avoid most of these biases, no matter how hard we try and even if we
know about them. So-called experts in the field are subject to these same
biases: their short-term estimates and predictions can even be pretty good, but
they will fail miserably in the long term, like any other man or woman. There
are so many interesting tidbits in this text that it&rsquo;s overwhelming. Some, if
not most of them, may even fall in the ordinary sense category, but the added
value here is we are being told why they fall in that class. Because I came to
reading it so late (it was published in 2011), this book might be the main
reason why some of these concepts are now common sense.</p>
<p><img alt="Thinking Fast and Slow" loading="lazy" src="/images/thinking-fast-and-slow.jpg#right">
The text is too long, though. It&rsquo;s almost 700 pages, and I suspect they could
have been half of that without sacrificing content. Kahneman won the Nobel
Prize for his behavioral finance and hedonic psychology research. He spent
a career researching these topics, and most of the biases and behaviors
mentioned in the text are his discoveries (with colleagues.) He tries hard to
be popular and mostly succeeds, especially in the first, second and third
parts, where the juiciest ah-ha moments await the reader. The rest is more
about his prospect theory and behavioral finance; it probably holds the most
relevant conclusions for an informed audience but suffers from repetitions and
perhaps too many examples, riddles and tests.</p>
<p>By pure coincidence, just the other day, 3 Quarks Daily <a href="https://3quarksdaily.com/3quarksdaily/2022/03/daniel-kahneman-thinking-fast-and-slow.html">posted</a> a 2011
Google Talk in which Kahneman was invited to talk about Thinking Fast and Slow.
I found it very good at explaining, let&rsquo;s say, the first part of the book
(System 1 and System 2, their interactions and their influence on everyday
human behavior.) Examples and stories mentioned are from the book. My
suggestion is first to watch the speech. It&rsquo;s 45 minutes well spent, then
decide if you want to invest in the book.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/CjVQJdIrDJ0?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

]]></content:encoded>
    </item>
    <item>
      <title>You&#39;re probably using the wrong dictionary</title>
      <link>https://nicolaiarocci.com/youre-probably-using-the-wrong-dictionary/</link>
      <pubDate>Tue, 01 Mar 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/youre-probably-using-the-wrong-dictionary/</guid>
      <description>&lt;p&gt;In 2014, James Somers sat down to write a beautiful, entertaining lament about
the state of today’s dictionaries and an argument in favor of the adoption of
Noah Webster’s 1913 edition.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t want you to conclude that it&amp;rsquo;s just a matter of aesthetics. Yes,
Webster&amp;rsquo;s definitions are prettier. But they are also better. They&amp;rsquo;re so much
better that to use another dictionary is to keep yourself forever at arm&amp;rsquo;s
length from the actual language.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In 2014, James Somers sat down to write a beautiful, entertaining lament about
the state of today’s dictionaries and an argument in favor of the adoption of
Noah Webster’s 1913 edition.</p>
<blockquote>
<p>I don&rsquo;t want you to conclude that it&rsquo;s just a matter of aesthetics. Yes,
Webster&rsquo;s definitions are prettier. But they are also better. They&rsquo;re so much
better that to use another dictionary is to keep yourself forever at arm&rsquo;s
length from the actual language.</p></blockquote>
<blockquote>
<p>Recall that the New Oxford, for the word &ldquo;fustian,&rdquo; gives &ldquo;pompous or
pretentious speech or writing.&rdquo; I said earlier that that wasn&rsquo;t even really
correct. Here, then, is Webster&rsquo;s definition: &ldquo;An inflated style of writing;
a kind of writing in which high-sounding words are used, above the dignity of
the thoughts or subject; bombast.&rdquo; Do you see the difference? What makes
fustian fustian is not just that the language is pompous—it&rsquo;s that this
pomposity is above the dignity of the thoughts or subject. It&rsquo;s using fancy
language where fancy language isn&rsquo;t called for. It&rsquo;s a subtle difference, but
that&rsquo;s the whole point: English is an awfully subtle instrument. A dictionary
that ignores these little shades is dangerous; in fact in those cases it&rsquo;s
worse than useless. It&rsquo;s misleading, deflating. It divests those words of their
worth and purpose.</p></blockquote>
<p>You can read it all <a href="http://jsomers.net/blog/dictionary">here</a>. It&rsquo;s worth your
time..</p>
<p>Not happy with the essay alone, he also added instructions on installing
Webster&rsquo;s on a Mac. Unfortunately, I could not get them to work on Catalina:
the DictUnifier app would crash as soon as I dragged the [dictionary file][4]
on it. A little research revealed that DictUnifier has a [problem with
Catalina][2]. The suggested workarounds did not work for me. In the process,
I learned that DictUnifier has gone unmaintained. Thankfully, a couple of years
ago a good soul released [DictConv][3], a &ldquo;Node.js version of DictUnifier&rdquo;.
DictConv did the trick. Webster&rsquo;s 1913 is now happily residing in my macOS
Dictionary.</p>
<p><img alt="Webster&rsquo;s 1913" loading="lazy" src="/images/webster1913.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>What Ukraine flag signifies</title>
      <link>https://nicolaiarocci.com/what-ukraine-flag-signifies/</link>
      <pubDate>Mon, 28 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/what-ukraine-flag-signifies/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;What the Ukraine flag signifies. A golden field of grain (Ukraine is the
world&amp;rsquo;s 4th largest exporter of barley and corn, and the 5th largest exporter
of wheat) beneath clear blue skies. Sky above grain, or freedom above bread (&lt;a href=&#34;https://twitter.com/TonycusGannicus/status/1497386976311492612&#34;&gt;source&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;Ukarine&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/ukraine.jpg&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;The story of Ukraine&amp;rsquo;s flag is rich and controversial. It &lt;a href=&#34;https://en.wikipedia.org/wiki/Flag_of_Ukraine#Yellow-blue_vs_blue-yellow&#34;&gt;appears to be true&lt;/a&gt;, however, that &amp;ldquo;blue sky over sunflowers&amp;rdquo; forms Ukrainians&amp;rsquo; conception of their flag.
[rss]: &lt;a href=&#34;https://nicolaiarocci.com/index.xml&#34;&gt;https://nicolaiarocci.com/index.xml&lt;/a&gt;
[tw]: &lt;a href=&#34;http://twitter.com/nicolaiarocci&#34;&gt;http://twitter.com/nicolaiarocci&lt;/a&gt;
[nl]: &lt;a href=&#34;https://buttondown.email/nicolaiarocci&#34;&gt;https://buttondown.email/nicolaiarocci&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;</description>
      <content:encoded><![CDATA[<blockquote>
<p>What the Ukraine flag signifies. A golden field of grain (Ukraine is the
world&rsquo;s 4th largest exporter of barley and corn, and the 5th largest exporter
of wheat) beneath clear blue skies. Sky above grain, or freedom above bread (<a href="https://twitter.com/TonycusGannicus/status/1497386976311492612">source</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.)</p></blockquote>
<p><img alt="Ukarine" loading="lazy" src="/images/ukraine.jpg"></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The story of Ukraine&rsquo;s flag is rich and controversial. It <a href="https://en.wikipedia.org/wiki/Flag_of_Ukraine#Yellow-blue_vs_blue-yellow">appears to be true</a>, however, that &ldquo;blue sky over sunflowers&rdquo; forms Ukrainians&rsquo; conception of their flag.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Parameter null-checking added to C# 11 Preview</title>
      <link>https://nicolaiarocci.com/paramter-null-checking-added-to-csharp-11-preview/</link>
      <pubDate>Sun, 27 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/paramter-null-checking-added-to-csharp-11-preview/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/&#34;&gt;first preview&lt;/a&gt; of C# 11 is out, and well, I think I like what I see.
I dig the new &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/#c-11-preview-list-patterns&#34;&gt;List patterns&lt;/a&gt; and am a fan of &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/#c-11-preview-allow-newlines-in-the-holes-of-interpolated-strings&#34;&gt;allowing newlines in the
&amp;ldquo;holes&amp;rdquo; of interpolated strings&lt;/a&gt;. &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/#c-11-preview-parameter-null-checking&#34;&gt;Parameter null-checking&lt;/a&gt; is a bit
contentious, and it&amp;rsquo;s good that they are releasing it in preview one and asking
for feedback.&lt;/p&gt;
&lt;p&gt;In a nutshell, they want to spare us a lot of boilerplate. Code like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public static void M(string s)
{
    if (s is null)
    {
        throw new ArgumentNullException(nameof(s));
    }
    // Body of the method
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Would be abbreviated by adding &lt;code&gt;!!&lt;/code&gt; to the parameter name:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The <a href="https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/">first preview</a> of C# 11 is out, and well, I think I like what I see.
I dig the new <a href="https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/#c-11-preview-list-patterns">List patterns</a> and am a fan of <a href="https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/#c-11-preview-allow-newlines-in-the-holes-of-interpolated-strings">allowing newlines in the
&ldquo;holes&rdquo; of interpolated strings</a>. <a href="https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/#c-11-preview-parameter-null-checking">Parameter null-checking</a> is a bit
contentious, and it&rsquo;s good that they are releasing it in preview one and asking
for feedback.</p>
<p>In a nutshell, they want to spare us a lot of boilerplate. Code like this:</p>
<pre><code>public static void M(string s)
{
    if (s is null)
    {
        throw new ArgumentNullException(nameof(s));
    }
    // Body of the method
}
</code></pre>
<p>Would be abbreviated by adding <code>!!</code> to the parameter name:</p>
<pre><code>public static void M(string s!!)
{
    // Body of the method
}
</code></pre>
<blockquote>
<p>Code will be generated to perform the null check. The generated null check
will execute before any of the code within the method. For constructors, the
null check occurs before field initialization, calls to base constructors,
and calls to this constructors.</p></blockquote>
<p>My initial reaction was, we don&rsquo;t need this; we got Nullable Reference Types.
NRTs however help at design time, to know whether a null is possible, while
parameter null-checking is meant for runtime.</p>
<p>According to Kathleen Dollard, the .NET Runtime itself removed nearly 20,000
lines of code using this new null-check syntax. That&rsquo;s one heck of a lot of
boilerplate removed.</p>
<p>I don&rsquo;t think I like the syntax, though. It&rsquo;s super concise, which is good, and
I appreciate putting the <code>!!</code> on the parameter rather than the type since
the parameter&rsquo;s value is being checked. Still, the two-punctuation character
seems a bit clumsy. Someone suggested adopting <code>notnull</code> instead:</p>
<pre><code>public void M(string s notnull) { // code }
</code></pre>
<p>I like this suggestion. I wouldn&rsquo;t want <code>notnull</code> on the left of the parameter
name. To the right? Count me in.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Eichmann in Jerusalem. A Report on the Banality of Evil</title>
      <link>https://nicolaiarocci.com/book-review-eichmann-in-jerusalem.-a-report-on-the-banality-of-evil/</link>
      <pubDate>Tue, 22 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-eichmann-in-jerusalem.-a-report-on-the-banality-of-evil/</guid>
      <description>&lt;p&gt;This book is not about the famous, daring, and in some ways fortunate capture
of Eichmann in Buenos Aires in 1960, nor about the covert transfer of the Nazi
officer to Israel. Instead, the volume recounts the 1961 trial in Jerusalem,
which ended with the defendant being sentenced to death. Hannah Arendt followed
the trial as a correspondent for &lt;em&gt;The New Yorker&lt;/em&gt;. She took notes, studied the
papers, and reconstructed the many witnesses&amp;rsquo; personal stories. Her work was
first published as articles in &lt;em&gt;The New Yorker&lt;/em&gt; and later revised and updated
as a book.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This book is not about the famous, daring, and in some ways fortunate capture
of Eichmann in Buenos Aires in 1960, nor about the covert transfer of the Nazi
officer to Israel. Instead, the volume recounts the 1961 trial in Jerusalem,
which ended with the defendant being sentenced to death. Hannah Arendt followed
the trial as a correspondent for <em>The New Yorker</em>. She took notes, studied the
papers, and reconstructed the many witnesses&rsquo; personal stories. Her work was
first published as articles in <em>The New Yorker</em> and later revised and updated
as a book.</p>
<p><img alt="Eichmann in Jerusalem, a Report on the Banality of Evil" loading="lazy" src="/images/eichmann-in-jerusalem.jpg#right">
Following the trial hearings, we are taken back to the years of the advent of
Nazism in Germany. The regime first incited and then actively advocated
anti-Semitism, a historically present sentiment in many parts of Europe and
beyond. These are the years of establishing the SS and other Nazi police
forces. Eichmann, penniless and unemployed, managed to join the SS ranks thanks
to an acquaintance. He was appointed to the Jewish emigration office, an
assignment he took seriously. He read books and became an &ldquo;expert on the Jewish
question&rdquo;. Over time, Eichmann career progressed as his office duties evolved,
from emigration to deportation and extermination. However, despite the
undoubted successes, Eichmann never managed to reach the highest levels of the
military hierarchy. He could never get close to his idol, the Führer. For what
reason?</p>
<p>Why couldn&rsquo;t he ever get into Hitler&rsquo;s inner circle? The critical point of
<em>Eichman in Jerusalem</em> is, I think, precisely the answer to this question.
According to Arendt&rsquo;s reconstruction, Eichmann was and always remained
a mediocre man. He was undoubtedly a good bureaucrat, an expert in organization
and logistics, but light years away from the brilliant and appealing person he
always aspired to be. Arendt makes no discount, reporting the many moments
during the process in which Eichmann reveals his true stature.</p>
<p>The banality of evil of the title lies precisely in this aspect: a modest
bureaucrat who merely fulfils his job slavishly, without questioning his role,
as a cog in the machine, can do evil. The Nazi machine exterminated six million
Jews, and the office Eichmann directed was the fulcrum of that tireless
activity. And yet, the man in charge, and with him, his subordinates, for the
most part, were ordinary people who carried out their tasks heads down, no
questions asked. How many Germans (and collaborators in the occupied countries)
did the same thing in those years?</p>
<p>Since its publication, the book has not ceased to raise controversy,
particularly concerning the role of Jewish Councils of Elders (Judenrat),
organizational structures imposed by Nazi Germany. Arendt proposes that they
actively collaborated in drawing up the lists of Jews to be deported. In any
case, <em>Eichmann in Jerusalem</em> is an exceptionally documented and well-argued
historical research. It is worth reading, especially so in our time when the
memory of time passed tends to fade away.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Jonny Greenwood pretended to play the keyboard when he first joined Radiohead</title>
      <link>https://nicolaiarocci.com/jonny-greenwood-pretended-to-play-the-keyboard-when-he-first-joined-radiohead/</link>
      <pubDate>Mon, 21 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/jonny-greenwood-pretended-to-play-the-keyboard-when-he-first-joined-radiohead/</guid>
      <description>&lt;p&gt;Kottke &lt;a href=&#34;https://kottke.org/22/02/jonny-greenwood-pretended-to-play-the-keyboard-when-he-first-joined-radiohead&#34;&gt;reports&lt;/a&gt; this juicy excerpt from Jonny Greenwood&amp;rsquo;s interview at npr:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thom [Yorke]&amp;rsquo;s band had a keyboard player — [whom] I think they didn&amp;rsquo;t get on
with because he played his keyboard so loud. And so when I got the chance to
play with them, the first thing I did was make sure my keyboard was turned
off &amp;hellip; I must have done months of rehearsals with them with this keyboard,
and they didn&amp;rsquo;t know that I&amp;rsquo;d already turned it off.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Kottke <a href="https://kottke.org/22/02/jonny-greenwood-pretended-to-play-the-keyboard-when-he-first-joined-radiohead">reports</a> this juicy excerpt from Jonny Greenwood&rsquo;s interview at npr:</p>
<blockquote>
<p>Thom [Yorke]&rsquo;s band had a keyboard player — [whom] I think they didn&rsquo;t get on
with because he played his keyboard so loud. And so when I got the chance to
play with them, the first thing I did was make sure my keyboard was turned
off &hellip; I must have done months of rehearsals with them with this keyboard,
and they didn&rsquo;t know that I&rsquo;d already turned it off.</p></blockquote>
<blockquote>
<p>They made quite a racket, quite a noise. It was all guitars and distortion
— and so I would pretend to play for weeks on end and Thom would say, &ldquo;I
can&rsquo;t quite hear what you&rsquo;re doing, but I think you&rsquo;re adding a really
interesting texture, because I can tell when you&rsquo;re not playing.&rdquo; And I&rsquo;m
thinking, &ldquo;No, you can&rsquo;t, because I&rsquo;m really not playing.&rdquo; And I&rsquo;d go home in
the evening and work out how to actually play chords and cautiously over the
next few months, I would start turning this keyboard up. And that&rsquo;s how
I started in with Radiohead.</p></blockquote>
<p>Full interview is available <a href="https://www.npr.org/2022/02/07/1078802881/radiohead-jonny-greenwood-the-power-of-the-dog">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How recycling pee could help save the world</title>
      <link>https://nicolaiarocci.com/how-recycling-pee-could-help-save-the-world/</link>
      <pubDate>Thu, 17 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-recycling-pee-could-help-save-the-world/</guid>
      <description>&lt;p&gt;Chelsea Wald in &lt;em&gt;Nature&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scientists say that urine diversion would have huge environmental and
public-health benefits if deployed on a large scale around the world. That’s
in part because urine is rich in nutrients that, instead of polluting water
bodies, could go towards fertilizing crops or feed into industrial processes.
According to Simha’s estimates, humans produce enough urine to replace about
one-quarter of current nitrogen and phosphorus fertilizers worldwide; it also
contains potassium and many micronutrients (see ‘What’s in urine’). On top of
that, not flushing urine down the drain could save vast amounts of water and
reduce some of the strain on ageing and overloaded sewer systems.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Chelsea Wald in <em>Nature</em>:</p>
<blockquote>
<p>Scientists say that urine diversion would have huge environmental and
public-health benefits if deployed on a large scale around the world. That’s
in part because urine is rich in nutrients that, instead of polluting water
bodies, could go towards fertilizing crops or feed into industrial processes.
According to Simha’s estimates, humans produce enough urine to replace about
one-quarter of current nitrogen and phosphorus fertilizers worldwide; it also
contains potassium and many micronutrients (see ‘What’s in urine’). On top of
that, not flushing urine down the drain could save vast amounts of water and
reduce some of the strain on ageing and overloaded sewer systems.</p></blockquote>
<p>More <a href="https://www.nature.com/articles/d41586-022-00338-6">here</a>.</p>
<p>The Fremen got it right from the get go.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Google Search is Dying</title>
      <link>https://nicolaiarocci.com/google-search-is-dying/</link>
      <pubDate>Tue, 15 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/google-search-is-dying/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Reddit is currently the most popular search engine. The only people who don’t
know that are the team at Reddit, who can’t be bothered to build a decent
search interface. So instead we resort to using Google, and appending the
word “reddit” to the end of our queries. [&amp;hellip;] Why are people searching
Reddit specifically? The short answer is that Google search results are
clearly dying. The long answer is that most of the web has become too
inauthentic to trust.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Reddit is currently the most popular search engine. The only people who don’t
know that are the team at Reddit, who can’t be bothered to build a decent
search interface. So instead we resort to using Google, and appending the
word “reddit” to the end of our queries. [&hellip;] Why are people searching
Reddit specifically? The short answer is that Google search results are
clearly dying. The long answer is that most of the web has become too
inauthentic to trust.</p></blockquote>
<p>More <a href="https://dkb.io/post/google-search-is-dying">here</a>.</p>
<p>I <a href="https://nicolaiarocci.com/yet-another-reason-to-use-duckduckgo/">switched to DuckDuckGo</a> a long time ago, and you probably should too.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Work in progress on Eve 2.0</title>
      <link>https://nicolaiarocci.com/work-in-progress-on-eve-2.0/</link>
      <pubDate>Sun, 13 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/work-in-progress-on-eve-2.0/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been back at the forge working on Eve 2.0. Version 2 will support Python
3.7+ and drop Python 2.7, 3.5 and 3.6. It will bring support for PyMongo 4+ as
well, along with several other minor fixes and improvements (&lt;a href=&#34;https://docs.python-eve.org/en/latest/changelog.html&#34;&gt;changelog&lt;/a&gt;).
It would be nice if you guys and gals, users of Eve, would give it a spin
before the release.&lt;/p&gt;
&lt;p&gt;I know. I &lt;a href=&#34;https://nicolaiarocci.com/is-eve-still-maintained/&#34;&gt;recently&lt;/a&gt; stated that Eve was in maintenance mode. All of
those considerations still apply, but what can I say? I want Eve 2 out.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been back at the forge working on Eve 2.0. Version 2 will support Python
3.7+ and drop Python 2.7, 3.5 and 3.6. It will bring support for PyMongo 4+ as
well, along with several other minor fixes and improvements (<a href="https://docs.python-eve.org/en/latest/changelog.html">changelog</a>).
It would be nice if you guys and gals, users of Eve, would give it a spin
before the release.</p>
<p>I know. I <a href="/is-eve-still-maintained/">recently</a> stated that Eve was in maintenance mode. All of
those considerations still apply, but what can I say? I want Eve 2 out.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The curious origins of Bluetooth&#39;s name</title>
      <link>https://nicolaiarocci.com/the-curious-origins-of-bluetooths-name/</link>
      <pubDate>Wed, 09 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-curious-origins-of-bluetooths-name/</guid>
      <description>&lt;p&gt;When Giulia came home from school today, she was anxious to tell me what she
learned about a Viking King and his legacy. She told me the story of King
Harald Gormsson, who ruled Denmark and Norway from c. 958 to c. 986. Harald is
mainly known for introducing Christianity to Denmark and consolidating his rule
over most Jutland and Zealand. However, what sparked my interest is that Harald
was nicknamed &amp;ldquo;Bluetooth&amp;rdquo;, and, in 1997, the Bluetooth wireless specification
design was named after him. The choice was based on an analogy that the
technology would unite devices the way Harald united the tribes of Denmark into
a single kingdom. Furthermore, the Bluetooth logo consists of the two
Scandinavian runes for his initials, H (ᚼ) and B (ᛒ)&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When Giulia came home from school today, she was anxious to tell me what she
learned about a Viking King and his legacy. She told me the story of King
Harald Gormsson, who ruled Denmark and Norway from c. 958 to c. 986. Harald is
mainly known for introducing Christianity to Denmark and consolidating his rule
over most Jutland and Zealand. However, what sparked my interest is that Harald
was nicknamed &ldquo;Bluetooth&rdquo;, and, in 1997, the Bluetooth wireless specification
design was named after him. The choice was based on an analogy that the
technology would unite devices the way Harald united the tribes of Denmark into
a single kingdom. Furthermore, the Bluetooth logo consists of the two
Scandinavian runes for his initials, H (ᚼ) and B (ᛒ)<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>The traditional explanation for his byname is that Harald must have had
a conspicuous bad tooth that appeared &ldquo;blue&rdquo; (i.e. &ldquo;black&rdquo;, as blár &ldquo;blue&rdquo;
meant &ldquo;blue-black&rdquo;, or &ldquo;dark-coloured&rdquo;). Another explanation is that he was
called &ldquo;blue thane&rdquo; (or &ldquo;dark thane&rdquo;) in England (with Anglo-Saxon thegn
corrupted to tan when the name came back into Old Norse).<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>Another interesting tidbit is that, according to Bluetooth&rsquo;s official website,
Bluetooth was only intended as a placeholder until marketing could come up with
something cool. Later, when it came time to select a serious name, Bluetooth
was to be replaced with either RadioWire or PAN (Personal Area Networking). PAN
was the front runner, but an exhaustive search discovered it already had tens
of thousands of hits throughout the internet. A full trademark search on
RadioWire couldn&rsquo;t be completed in time for launch, making Bluetooth the only
choice. The name caught on fast, and before it could be changed, it spread
throughout the industry, becoming synonymous with short-range wireless
technology<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>I&rsquo;m a sucker for stories like this in which technology pays proper tribute to
our past, without which it wouldn&rsquo;t exist in the first place.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Source: <a href="https://en.wikipedia.org/wiki/Harald_Bluetooth#Bluetooth_technology">Harald Bluetooth, Wikipedia</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Source: <a href="https://en.wikipedia.org/wiki/Harald_Bluetooth#Name">Harald Bluetooth, Wikipedia</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Source: <a href="https://en.wikipedia.org/wiki/Bluetooth#History">Bluetooth history, Wikipedia</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Modulations - History of Electronic Music</title>
      <link>https://nicolaiarocci.com/modulations-history-of-electronic-music/</link>
      <pubDate>Tue, 08 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/modulations-history-of-electronic-music/</guid>
      <description>&lt;p&gt;I stumbled upon &lt;a href=&#34;https://youtu.be/icpDt6aQDww&#34;&gt;Modulations&lt;/a&gt;, a documentary on &amp;ldquo;the evolution of electronic
music and its many genres. How the wide range of styles and scenes formed
through experimentations on sound formation.&amp;rdquo; This short film (75 minutes) is
packed with guest stars of all calibers&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;, some of them genuinely pivotal to the
evolution of electronic music. Indeed, the uninitiated mind gets to know a lot
of details and amenities on the first decade or so of electronic music.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I stumbled upon <a href="https://youtu.be/icpDt6aQDww">Modulations</a>, a documentary on &ldquo;the evolution of electronic
music and its many genres. How the wide range of styles and scenes formed
through experimentations on sound formation.&rdquo; This short film (75 minutes) is
packed with guest stars of all calibers<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, some of them genuinely pivotal to the
evolution of electronic music. Indeed, the uninitiated mind gets to know a lot
of details and amenities on the first decade or so of electronic music.</p>
<p>Perhaps it attempts to fit too much information into a tight timeline:
many guests, genres, places. There&rsquo;s a lot to unpack, and, inevitably, a lot is
left out. A series (like the excellent Hip-Hop Evolution recently aired on
Netflix) could better cover all the material. Unfortunately, Modulations was
released in 1998, when such an option wasn&rsquo;t even in the books. And this takes
us to my second qualm with this production: it of course doesn&rsquo;t cover the
recent years, let&rsquo;s say from early 2000s up to today. A second part would be
grand.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/icpDt6aQDww?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>A partial list I digged out includes the likes of John Cage, Afrika Bambaataa, Juan Atkins, Bundy Brown, DJ Spooky, Future Sound of London, Fumiya Tanaka, Hardfloor, Kodwo Eshun, Teo Macero, Christian Marclay, Giorgio Moroder, Robert Moog, Mixmaster Morris, Orbital, Prodigy, Simon Reynolds, Ed Rush, Karlheinz Stockhausen, Tetsu Inoue and Westbam.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>A historian perspective on blockchain technology</title>
      <link>https://nicolaiarocci.com/a-historian-perspective-on-blockchain-technology/</link>
      <pubDate>Mon, 07 Feb 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-historian-perspective-on-blockchain-technology/</guid>
      <description>&lt;p&gt;One of my recent discoveries is &lt;a href=&#34;https://acoup.blog/&#34;&gt;A Collection of Unmitigated Pedantry&lt;/a&gt; by
Bret Devereaux, an historian who&amp;rsquo;s been posting great content over the years.
His Fireside Fridays, for example, provide intriguing musings on varied topics.
In this week instalment, professor Devereaux takes on the different
applications of blockchain technology as seen from a historian&amp;rsquo;s perspective.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Really, this is less about the technologies themselves and more about the nature of states.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Because while I can offer no real opinion as to if any of these new
technologies will succeed in their technical objectives [&amp;hellip;], proponents of
these technologies typically envisage them eventually producing large social
effects, in particular they imagine that blockchain technology will create an
economic and social space outside of the control of the state, traditional
banking institutions or society at large. And here is a space where
a historian’s expertise is valuable and also almost completely lacking among
blockchain enthusiasts.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One of my recent discoveries is <a href="https://acoup.blog/">A Collection of Unmitigated Pedantry</a> by
Bret Devereaux, an historian who&rsquo;s been posting great content over the years.
His Fireside Fridays, for example, provide intriguing musings on varied topics.
In this week instalment, professor Devereaux takes on the different
applications of blockchain technology as seen from a historian&rsquo;s perspective.</p>
<blockquote>
<p>Really, this is less about the technologies themselves and more about the nature of states.</p></blockquote>
<blockquote>
<p>Because while I can offer no real opinion as to if any of these new
technologies will succeed in their technical objectives [&hellip;], proponents of
these technologies typically envisage them eventually producing large social
effects, in particular they imagine that blockchain technology will create an
economic and social space outside of the control of the state, traditional
banking institutions or society at large. And here is a space where
a historian’s expertise is valuable and also almost completely lacking among
blockchain enthusiasts.</p></blockquote>
<p>More <a href="https://acoup.blog/2022/02/04/fireside-friday-february-4-2022/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Passage To Parenthood</title>
      <link>https://nicolaiarocci.com/a-passage-to-parenthood/</link>
      <pubDate>Wed, 26 Jan 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-passage-to-parenthood/</guid>
      <description>&lt;p&gt;A very touching Akhil Sharma in &lt;em&gt;The New Yorker&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Not long after we began dating, my now wife, Christine, and I started making
up stories about the child we might have.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;We named the child—or, in the stories we told about him, he named
himself—Suzuki Noguchi. Among the things we liked about him was that he was
cheerfully indifferent to us. He did not wish to be either Irish (like
Christine) or Indian (like me). Suzuki was eight, and he chose this name
because he was into Japanese high fashion. When we told him that he couldn’t
just go around claiming to be Japanese, Suzuki said that he was a child of
God and who were we to say that God was not Japanese. In addition to being
a dandy, Suzuki was a criminal. He dealt in yellowcake uranium and trafficked
in endangered animals. Sometimes we asked him how his day at school had gone
and he would warn, “Do you really want to be an accessory after the fact?” We
imagined him banging on our bedroom door when we were having sex and
shouting, “Stop! You can’t get any child better than me.”&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A very touching Akhil Sharma in <em>The New Yorker</em>:</p>
<blockquote>
<p>Not long after we began dating, my now wife, Christine, and I started making
up stories about the child we might have.</p></blockquote>
<blockquote>
<p>We named the child—or, in the stories we told about him, he named
himself—Suzuki Noguchi. Among the things we liked about him was that he was
cheerfully indifferent to us. He did not wish to be either Irish (like
Christine) or Indian (like me). Suzuki was eight, and he chose this name
because he was into Japanese high fashion. When we told him that he couldn’t
just go around claiming to be Japanese, Suzuki said that he was a child of
God and who were we to say that God was not Japanese. In addition to being
a dandy, Suzuki was a criminal. He dealt in yellowcake uranium and trafficked
in endangered animals. Sometimes we asked him how his day at school had gone
and he would warn, “Do you really want to be an accessory after the fact?” We
imagined him banging on our bedroom door when we were having sex and
shouting, “Stop! You can’t get any child better than me.”</p></blockquote>
<blockquote>
<p>My wife was forty-eight and I was forty-seven, and we started inventing these
stories as a form of play. It also soothed some hurt part of us.</p></blockquote>
<p>More <a href="https://www.newyorker.com/magazine/2022/01/31/a-passage-to-parenthood">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Lay Back and Keep Smiling</title>
      <link>https://nicolaiarocci.com/lay-back-and-keep-smiling/</link>
      <pubDate>Sun, 23 Jan 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/lay-back-and-keep-smiling/</guid>
      <description>&lt;p&gt;Tomorrow we&amp;rsquo;re releasing a major project on which we&amp;rsquo;ve been working non-stop
for two and a half years. No matter how many years in the trenches, release day
always makes me a bit nervous. Experience does help. I know there will be
problems, and we will solve them. Some customers will complain, and those will
be the most vocal. The vast majority of them will appreciate the effort, enjoy
the features, and stay silent. That&amp;rsquo;s how it works. We&amp;rsquo;ll do just fine.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Tomorrow we&rsquo;re releasing a major project on which we&rsquo;ve been working non-stop
for two and a half years. No matter how many years in the trenches, release day
always makes me a bit nervous. Experience does help. I know there will be
problems, and we will solve them. Some customers will complain, and those will
be the most vocal. The vast majority of them will appreciate the effort, enjoy
the features, and stay silent. That&rsquo;s how it works. We&rsquo;ll do just fine.</p>
<p>As you can imagine, it&rsquo;s a working weekend for me. While hacking in the early
morning, I listened to <a href="https://open.spotify.com/playlist/1WjnPw3PbQJOsEpEgJsz5f?si=53a83f9c31484310">The Mildlife Very Fantastic Playlist</a> when a curious
tune caught my attention<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I glanced over to Spotify, and my eyes fell on
the most appropriate CD cover for launch day ever.</p>
<p><img alt="Laid Back&hellip;Keep Smiling" loading="lazy" src="/images/laidback-keepsmiling.jpg"></p>
<p>Whatever happens tomorrow, lay back and keep smiling.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Track #8, <em>Fly Away / Walking in the Sunshine</em>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Is Old Music Killing New Music?</title>
      <link>https://nicolaiarocci.com/is-old-music-killing-new-music/</link>
      <pubDate>Thu, 20 Jan 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/is-old-music-killing-new-music/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I had a hunch that old songs were taking over music streaming platforms—but
even I was shocked when I saw the most recent numbers. According to MRC Data,
old songs now represent 70% of the US music market. Those who make a living
from new music—especially that endangered species known as the working
musician—have to look at these figures with fear and trembling. But the news
gets worse.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I can&amp;rsquo;t say I can relate as my kids of ages 21, 18, and 16 do their best to
stay clear from the music I like, but anyways, Ted Gioia&amp;rsquo;s &lt;a href=&#34;https://tedgioia.substack.com/p/is-old-music-killing-new-music&#34;&gt;latest piece&lt;/a&gt; on
recent music trends is super-interesting.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I had a hunch that old songs were taking over music streaming platforms—but
even I was shocked when I saw the most recent numbers. According to MRC Data,
old songs now represent 70% of the US music market. Those who make a living
from new music—especially that endangered species known as the working
musician—have to look at these figures with fear and trembling. But the news
gets worse.</p></blockquote>
<p>I can&rsquo;t say I can relate as my kids of ages 21, 18, and 16 do their best to
stay clear from the music I like, but anyways, Ted Gioia&rsquo;s <a href="https://tedgioia.substack.com/p/is-old-music-killing-new-music">latest piece</a> on
recent music trends is super-interesting.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Automatic deletion of older records in Postgres</title>
      <link>https://nicolaiarocci.com/automatic-deletion-of-older-records-in-postgres/</link>
      <pubDate>Sun, 16 Jan 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/automatic-deletion-of-older-records-in-postgres/</guid>
      <description>&lt;p&gt;We have a Postgres cluster with a database for each user. Each database has
a table that records events, and we want this table to only record the last 15
days.&lt;/p&gt;
&lt;p&gt;If we were on MongoDB, we could use a &lt;a href=&#34;https://docs.mongodb.com/manual/core/capped-collections/&#34;&gt;capped collection&lt;/a&gt;, but we are in
Postgres, which does not have equivalent functionality. In Postgres, you have
to make do with something homemade. My first idea was to install a cron job in
the system. It would execute daily, deleting older events in each user
database.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We have a Postgres cluster with a database for each user. Each database has
a table that records events, and we want this table to only record the last 15
days.</p>
<p>If we were on MongoDB, we could use a <a href="https://docs.mongodb.com/manual/core/capped-collections/">capped collection</a>, but we are in
Postgres, which does not have equivalent functionality. In Postgres, you have
to make do with something homemade. My first idea was to install a cron job in
the system. It would execute daily, deleting older events in each user
database.</p>
<p>Before jumping in, I looked at what others do. One surprising popular approach
appears to be using <a href="https://www.postgresql.org/docs/current/sql-createtrigger.html">triggers</a>: older ones are pruned when a new row is
inserted in the table. For my use case, this seems unnecessarily taxing to the
system. I&rsquo;m happy with running a single maintenance task late in the night when
the system is underused. Two other solutions are <a href="https://www.pgadmin.org/docs/pgadmin4/latest/pgagent.html">pgAgent</a> or <a href="https://github.com/citusdata/pg_cron">pg_cron</a>.
pgAgent is an external UI tool, so hard No to pgAgent from me. pg_cron
essentially offers cron jobs baked into the database, which is good, but, like
pg_Agent, it requires you to install the tool itself, create a Postgres
extension, change Postgres configuration, optionally grant usage to a schema,
etc. There&rsquo;s also <a href="https://www.postgresql.org/docs/current/ddl-partitioning.html">partitioning</a>, which seems way overboard for our use
case. It seems that these approaches demand new dependencies and unnecessary
work for something I can easily accomplish by leveraging what is already
available, for free, in the system. So, it&rsquo;s good old Linux cron jobs for me.</p>
<p>Because we run Postgres in Docker, a little more work is involved, but overall,
the solution is pretty straightforward. Here is the script I came up with:</p>
<pre><code>readonly CONTAINER=$(docker ps -q -f name=postgres)
readonly USER=dbuser
docker exec -i $CONTAINER \
    psql -U $USER -d postgres -t \
        -c &quot;select datname from pg_database where datname like 'cus_%'&quot; | \
    xargs -n 1 -I&quot;{}&quot; docker exec -i $CONTAINER psql -U $USER -d {} -t \
        -c &quot;delete from mytable where datetime &lt; now() - interval '15 days'&quot;
</code></pre>
<p>First, we find the id of the docker container (it runs in a swarm, so we don&rsquo;t
have exact container names). We need it because we want to execute psql from
within the container. The second row sets a Postgres user other than the
default one. That&rsquo;s because we don&rsquo;t allow default user logins. Then comes the
Linux pipeline. First, we execute a query that returns all user database names;
then, we pipe those into the query that deletes obsolete rows. The query
executes against each target database. The script is then installed as a cron
job with something similar to:</p>
<pre><code>0 4 * * * /home/user/dir/cleanup.sh
</code></pre>
<p>Which ensures the script runs daily at 4 am. For a weekend task, I&rsquo;m happy with
the result.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Go James Webb</title>
      <link>https://nicolaiarocci.com/go-james-webb/</link>
      <pubDate>Mon, 10 Jan 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/go-james-webb/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s now old news that the &lt;a href=&#34;https://www.jwst.nasa.gov/index.html&#34;&gt;James Webb Telescope&lt;/a&gt; was successfully launched
on Christmas Day. But last Saturday marked another historic moment for this
incredible human artifact:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After a quarter-century of effort by tens of thousands of people, more than
$10 billion in taxpayer funding, and some 350 deployment mechanisms that had
to go just so, the James Webb Space Telescope fully unfurled its wings. The
massive spacecraft completed its final deployments, and, by God, the process
went smoothly.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s now old news that the <a href="https://www.jwst.nasa.gov/index.html">James Webb Telescope</a> was successfully launched
on Christmas Day. But last Saturday marked another historic moment for this
incredible human artifact:</p>
<blockquote>
<p>After a quarter-century of effort by tens of thousands of people, more than
$10 billion in taxpayer funding, and some 350 deployment mechanisms that had
to go just so, the James Webb Space Telescope fully unfurled its wings. The
massive spacecraft completed its final deployments, and, by God, the process
went smoothly.</p></blockquote>
<p>Ars Technica&rsquo;s Eric Berger has long been my go-to pusher for space-related
stuff. <a href="https://arstechnica.com/science/2022/01/remarkably-nasa-has-completed-deployment-of-the-webb-space-telescope/">His report</a> on Saturday&rsquo;s milestone is accurate and to the point as
usual. Today he has <a href="https://arstechnica.com/science/2022/01/all-hail-the-ariane-5-rocket-which-doubled-the-webb-telescopes-lifetime/">another article</a> on ESA Arianne 5&rsquo;s fundamental
contribution to the mission. I love how modern, successful space missions are
almost always the result of no-bullshit joint efforts by multiple international
actors.</p>
<p><em>Update:</em> The James Webb Telescope <a href="https://www.npr.org/2022/01/24/1075437484/james-webb-telescope-final-destination">has reached its final destination</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Moxie on Web3</title>
      <link>https://nicolaiarocci.com/moxie-on-web3/</link>
      <pubDate>Sat, 08 Jan 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/moxie-on-web3/</guid>
      <description>&lt;p&gt;An excellent article on Web3 has &lt;a href=&#34;https://moxie.org/2022/01/07/web3-first-impressions.html&#34;&gt;just appeared&lt;/a&gt; on Moxie Marlinspike&amp;rsquo;s
website. Being Moxie&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;, he&amp;rsquo;s not just speculating and rambling about stuff.
In an attempt to learn more about the so-called Web3 and the technologies
around it, he went all-in and built a couple of dApps himself. Then, he
produced an NFT and put it up for sale. What he found is, well, to put it
mildly, fascinating.&lt;/p&gt;
&lt;p&gt;Some of his insights on technology are also interesting. For example, on
distributed vs. centralized systems:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>An excellent article on Web3 has <a href="https://moxie.org/2022/01/07/web3-first-impressions.html">just appeared</a> on Moxie Marlinspike&rsquo;s
website. Being Moxie<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, he&rsquo;s not just speculating and rambling about stuff.
In an attempt to learn more about the so-called Web3 and the technologies
around it, he went all-in and built a couple of dApps himself. Then, he
produced an NFT and put it up for sale. What he found is, well, to put it
mildly, fascinating.</p>
<p>Some of his insights on technology are also interesting. For example, on
distributed vs. centralized systems:</p>
<blockquote>
<p>A protocol moves much more slowly than a platform. After 30+ years, email is
still unencrypted; meanwhile WhatsApp went from unencrypted to full e2ee in
a year. People are still trying to standardize sharing a video reliably over
IRC; meanwhile, Slack lets you create custom reaction emoji based on your
face. This isn’t a funding issue. If something is truly decentralized, it
becomes very difficult to change, and often remains stuck in time. That is
a problem for technology, because the rest of the ecosystem is moving very
quickly, and if you don’t keep up you will fail.</p></blockquote>
<p>His point on the urgency to reduce the burden of building software is also
poignant:</p>
<blockquote>
<p>At this point, software projects require an enormous amount of human effort.
Even relatively simple apps require a group of people to sit in front of
a computer for eight hours a day, every day, forever. This wasn’t always the
case, and there was a time when 50 people working on a software project
wasn’t considered a “small team.” As long as software requires such concerted
energy and so much highly specialized human focus, I think it will have the
tendency to serve the interests of the people sitting in that room every day
rather than what we may consider our broader goals.</p></blockquote>
<p>My foray into cryptocurrencies and blockchain happened almost ten years ago
when the craze started. After a few experiments, I tagged it all as a nerds
game and moved away. Moxie&rsquo;s article served me well in catching up on the whole
scene. Can&rsquo;t say I&rsquo;m thrilled by what I see.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>On Moxie himself, see the New Yorker article I featured <a href="https://nicolaiarocci.com/on-the-ceo-and-founder-of-signal/">a while ago</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Finnish Fairy Tales</title>
      <link>https://nicolaiarocci.com/book-review-finnish-fairy-tales/</link>
      <pubDate>Tue, 04 Jan 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-finnish-fairy-tales/</guid>
      <description>&lt;p&gt;Over the years, Iperborea, one of my favorite Italian publishers, has been
publishing an unofficial Nordic Tales series. Their renowned nordic fiction
series includes one fairy tale volume per year, usually published in December,
just for Christmas. The first book was Lapland Tales in 2014, and then they
continued with Danish, Icelandic, Swedish, Faroe,  Norwegian, Greenlandic and
then Finnish in 2021. I&amp;rsquo;ve been greedily reading each one of them, usually as
my last book of the year. This year I was a little bit late, as &lt;a href=&#34;https://nicolaiarocci.com/three-good-books-i-read-in-2021/&#34;&gt;reported&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Over the years, Iperborea, one of my favorite Italian publishers, has been
publishing an unofficial Nordic Tales series. Their renowned nordic fiction
series includes one fairy tale volume per year, usually published in December,
just for Christmas. The first book was Lapland Tales in 2014, and then they
continued with Danish, Icelandic, Swedish, Faroe,  Norwegian, Greenlandic and
then Finnish in 2021. I&rsquo;ve been greedily reading each one of them, usually as
my last book of the year. This year I was a little bit late, as <a href="https://nicolaiarocci.com/three-good-books-i-read-in-2021/">reported</a>.</p>
<p><img alt="Fiabe finlandesi" loading="lazy" src="/images/fiabe-finlandesi.jpg#right">
Until now, 2020&rsquo;s Greenlandic Legends has been my favorite, mainly because it&rsquo;s
partly different from the others, which all share a common Scandinavian
cultural background. In this regard, this year&rsquo;s Finnish Tales is even more
remarkable. Quoting the short, excellent final essay by the translators Giorgia
Ferrari and Sanna Maria Martin<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>:</p>
<blockquote>
<p>Within the Nordic panorama, Finland holds a unique position and has a precise
identity: entering Finnish culture means coming into contact with the
Finno-Ugric world, starting from the language, which has nothing to do with
the Scandinavian ones, which are only geographically close. At the same time,
Finland is anything but an island separated from its surroundings: its
particular position between East and West has made it, if anything,
a borderland, a point of intersection between different cultures, enriching
it with influences from both directions. And this can only be evident even in
popular tales.</p></blockquote>
<p>Indeed, in these tales, you find echoes of myths and tropes from Scandinavian
culture but always intertwined with unique Finnish themes. Notable examples
are:</p>
<ul>
<li>The <em>tietäjä</em>, whose supernatural power arises from great knowledge.</li>
<li>The <em>vetehinen</em>, a male (!!!) water spirit of the forest.</li>
<li>The <em>syöjätär</em>, the devourer, or the &ldquo;wicked mother.&rdquo;</li>
<li>The <em>nimikkopuu</em>, a tree planted on somebody&rsquo;s birth; tied to their destiny</li>
<li>The shamanic rituals, often associated with the use of magical words and songs</li>
</ul>
<p>The principal collector of Finnish folklore was Eero Salmelainen (1830-1867),
who published four seminal titles from which all of the stories in Finnish
Tales are selected. Of course, Grimm&rsquo;s influence is evident in Salmelainen&rsquo;s
work. Remarkably though, Salmelainen started his collection forty years later
than the Grimms. One reason might be that until then (and up until now, I might
add), Finnish folklore has always been hiding in the shadow of Kalevala&rsquo;s
poetic poetry.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Short, informative essays enrich each one of Iperborea&rsquo;s Nordic Tales volumes. These are essential in framing the content within the correct background, outlining the links between Nordic cultures, and revealing the sources. Take the Kalevala. I have had it in my library since many years ago, but I didn&rsquo;t correlate it with Finnish folklore until I saw it mentioned in the essay.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Three Good Books I Read in 2021</title>
      <link>https://nicolaiarocci.com/three-good-books-i-read-in-2021/</link>
      <pubDate>Fri, 31 Dec 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/three-good-books-i-read-in-2021/</guid>
      <description>&lt;p&gt;This year I&amp;rsquo;ve read twenty-one books or 5903 pages. That&amp;rsquo;s fewer books than
last year (28 / 8064), the year before (25 / 8394), and the one before that (30
/ 8447). Heck, I must look back at 2014 to score a win in my very own yearly
reading challenge. What surprises me is not much the number of books but the
pages I read, which constitutes a &lt;a href=&#34;https://twitter.com/nicolaiarocci/status/1214857647314362368&#34;&gt;more relevant metric&lt;/a&gt;. Over the previous
three years, that number stayed firmly over 8k while dropping to 6k this year.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This year I&rsquo;ve read twenty-one books or 5903 pages. That&rsquo;s fewer books than
last year (28 / 8064), the year before (25 / 8394), and the one before that (30
/ 8447). Heck, I must look back at 2014 to score a win in my very own yearly
reading challenge. What surprises me is not much the number of books but the
pages I read, which constitutes a <a href="https://twitter.com/nicolaiarocci/status/1214857647314362368">more relevant metric</a>. Over the previous
three years, that number stayed firmly over 8k while dropping to 6k this year.</p>
<p><img alt="My goodreads books stats for 2021" loading="lazy" src="/images/books-stats-2021-goodreads.png"></p>
<p>Should I be concerned? I don&rsquo;t know. No doubt I&rsquo;ve been super busy at work,
often feeling exhausted in the evening when I tend to read more. I suspect I&rsquo;ve
also been watching more TV than usual, probably due to the evening fatigue and
because I want to spend more time with Serena. The fact that I read more
non-fiction might play a role too. Fiction tends to be more addictive and more
inviting to the weary mind. We&rsquo;ll see what happens next year.</p>
<p>These are three books I especially enjoyed reading in 2021:</p>
<ul>
<li>
<p><em><a href="/book-review-we-have-always-lived-in-the-castle/">We Have Always Lived in the Castle</a></em>. This little Shirley Jackson
masterpiece stands out from my (admittedly small) 2021 fiction selection. Quoting
my own words from the review: &ldquo;This book is brilliant because it takes the canonical
witch/haunted house theme and flips it over, instantly reversing the
perspective. The story is told from within the house. Village folks are the bad
guys. Those who seem to be motivated by good intentions only fulfill their ego
or strive to behave with good manners, as society expects them to do. We cannot
help but feel at least a drop of compassion and sympathy for the devil.&rdquo;</p>
</li>
<li>
<p><em><a href="/book-review-endurance-shackletons-incredible-voyage/">Endurance. Shackleton&rsquo;s Incredible Voyage</a></em>. I&rsquo;ve read three maritime adventure
books this year, all excellent works. Alfred Lansing&rsquo;s report on Shackleton&rsquo;s
expedition is my pick because the story is outstanding and powerfully told.
&ldquo;Alfred Lansing has reconstructed all these events with great care, drawing
mainly on the many diaries kept by the crew and interviewing the few survivors
still alive. [&hellip;] the result is always smooth and dry, never yielding to
hyperbole or exaltation, always close to the facts, which on the other hand,
certainly do not need enrichment.&rdquo;</p>
</li>
<li>
<p><em><a href="/book-review-consider-the-lobster/">Consider the Lobster</a></em>. David Foster Wallace is one of my favorite authors and
this book does not delude. &ldquo;You may not have a strong interest in lobsters or
pornography, but the essays in this book are terrific.&rdquo;</p>
</li>
</ul>
<p>Honorable mention goes to  <em><a href="/book-review-about-the-meaning-of-life/">About the Meaning of Life</a></em>, <em><a href="/book-review-king-and-emperor-a-new-life-of-charlemagne/">King and
Emperor: A New Life of Charlemagne</a></em>, and <em><a href="/book-review-nomadland/">Nomadland</a></em>. See my <a href="/books-i-have-read/">Books
I Have Read</a> page for the list of books I read in 2021 and before.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Consider the Lobster</title>
      <link>https://nicolaiarocci.com/book-review-consider-the-lobster/</link>
      <pubDate>Tue, 28 Dec 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-consider-the-lobster/</guid>
      <description>&lt;p&gt;I found a Consider the Lobster &lt;a href=&#34;https://www.goodreads.com/review/show/14143044&#34;&gt;review&lt;/a&gt; on Goodreads that almost precisely
matches my thoughts on DFW and the book. Hence, given the lazy Christmas-break
mood I am in right now, I am conceding myself the right to copy-paste and edit
David&amp;rsquo;s review right away.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I know of nobody else who writes as thoughtfully and intelligently as DFW. That
he manages to write so informatively, with humor and genuine wit, on almost any
subject under the sun is mind-blowing – it&amp;rsquo;s also why I am willing to forgive
his occasional stylistic excesses. (Can you spell &amp;lsquo;footnote&amp;rsquo;?) You may not have
a strong interest in lobsters or pornography, but the essays in question are
terrific. The reporting on Ziegler and McCain is outstanding, heartbreakingly
so, because it makes the relative shallowness of most reporting painfully
evident.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I found a Consider the Lobster <a href="https://www.goodreads.com/review/show/14143044">review</a> on Goodreads that almost precisely
matches my thoughts on DFW and the book. Hence, given the lazy Christmas-break
mood I am in right now, I am conceding myself the right to copy-paste and edit
David&rsquo;s review right away.</p>
<hr>
<p>I know of nobody else who writes as thoughtfully and intelligently as DFW. That
he manages to write so informatively, with humor and genuine wit, on almost any
subject under the sun is mind-blowing – it&rsquo;s also why I am willing to forgive
his occasional stylistic excesses. (Can you spell &lsquo;footnote&rsquo;?) You may not have
a strong interest in lobsters or pornography, but the essays in question are
terrific. The reporting on Ziegler and McCain is outstanding, heartbreakingly
so, because it makes the relative shallowness of most reporting painfully
evident.</p>
<p><img alt="Consider the Lobster" loading="lazy" src="/images/consider-the-lobster.jpg#right">
Yes, I know all about his weaknesses - the digressions, the rampant footnote
abuse, the flaunting of his extraordinary erudition. I know all this, and
I don&rsquo;t care. Because when he is in top form, there&rsquo;s nobody else I would
instead read. The man is hilarious; I think he&rsquo;s a mensch, and I don&rsquo;t believe
he parades his erudition to prove how smart he is. I think he can&rsquo;t help
himself - it&rsquo;s a consequence of his wide-ranging curiosity. At heart, he&rsquo;s
a geek but a charming, hyper-articulate geek. Who is almost frighteningly
bright.</p>
<hr>
<p>If you have never read DFW, my advice would be to start with his non-fiction,
which is way more accessible than his fiction (with the notable exception of
The Brook of the System, which was my first adored DFW reading.)</p>
]]></content:encoded>
    </item>
    <item>
      <title>System Shock is Back Home</title>
      <link>https://nicolaiarocci.com/system-shock-is-back-home/</link>
      <pubDate>Mon, 27 Dec 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/system-shock-is-back-home/</guid>
      <description>&lt;p&gt;When The Digital Antiquarian released his &lt;a href=&#34;https://www.filfre.net/2021/03/system-shock/&#34;&gt;System Shock retrospective&lt;/a&gt;
earlier this year, I was in awe. System Shock was one of my favorite games back
in the day, and yes, in the quarrel between id Software&amp;rsquo;s DOOM and Looking
Glass&amp;rsquo;s System Shock, I was siding with the latter. I was so much more for
immersion and storyline than shoot &amp;rsquo;em-ups. The Antiquarian article is
excellent. If you&amp;rsquo;re into gaming history or, really, into computer&amp;rsquo;s history,
I urge you to read it all.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When The Digital Antiquarian released his <a href="https://www.filfre.net/2021/03/system-shock/">System Shock retrospective</a>
earlier this year, I was in awe. System Shock was one of my favorite games back
in the day, and yes, in the quarrel between id Software&rsquo;s DOOM and Looking
Glass&rsquo;s System Shock, I was siding with the latter. I was so much more for
immersion and storyline than shoot &rsquo;em-ups. The Antiquarian article is
excellent. If you&rsquo;re into gaming history or, really, into computer&rsquo;s history,
I urge you to read it all.</p>
<p>As I read Maher&rsquo;s post, I thought it would be great to fetch the original
System Shock box from my sparse collection of now ancient video games and keep
it by my side as I kept reading (I am known for lending myself to such romantic
gestures.) I reached for the bookshelf. Microprose&rsquo;s Falcon 3.0 was there along
with Origin&rsquo;s Ultima VII Serpent Isle and a few others, but System Shock was
missing. It was released in 1994. I was 24. A lot of time has passed since
then, but heck, I was sure I bought that game at the time. I have fond memories
of many thrilling nights exploring the SHODAN-controlled space station. In the
following days, I spent quite some time rummaging through all my belongings:
bookshelves, drawers, garage shelves, even the cellar to no avail. The System
Shock box was lost. Along with the careless disposal of Charlie, my Commodore
64, the loss of System Shock was one of my computer griefs.</p>
<p>Then, yesterday I went to visit my parents at their place. I was with Anna, my
third kid. We were chatting about what sons and parents usually talk about on
Christmas break when my dad mentioned that he&rsquo;d been reordering stuff around
the house and that I should probably take a close look at a couple of boxes he
put aside for me. They contained old things from when I lived with them. I went
to check on them. You never know; there might be some memorabilia like the
comics or the books I used to read. Imagine my surprise when the original
System Shock box surfaced out of the first box. Oh, joy! Best Dad&rsquo;s Christmas
present ever<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p><img alt="System Shock Box" loading="lazy" src="/images/system-shock-box.JPG#center"></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The original price tag is still there.  In 1994, the damn thing cost a whopping 139.900 Italian Lire (€72). Pirating was wild in those days, and I won&rsquo;t negate that most of my mojo came from dark channels back then, but when a worthy game appeared, I was ready to pay homage to the authors.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: About the Meaning of Life</title>
      <link>https://nicolaiarocci.com/book-review-about-the-meaning-of-life/</link>
      <pubDate>Sun, 26 Dec 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-about-the-meaning-of-life/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not a regular philosophy reader, much less of self-improvement guides. I&amp;rsquo;m
wary of the latter and too ignorant for the former. Yet, theologian Vito
Mancuso has intrigued me for some time. I followed his podcast on the &amp;ldquo;Four
Masters of Life&amp;rdquo;&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; and found it excellent. In it, Mancuso discusses his four
tutelary deities: &amp;ldquo;Socrates, the educator. Buddha, the physician. Confucius,
the politician. Jesus, the prophet.&amp;rdquo; I also listened to some TV interviews
where I always found him fascinating. In short, there was enough to make me
decide to read some of his work. From the back cover of the book:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m not a regular philosophy reader, much less of self-improvement guides. I&rsquo;m
wary of the latter and too ignorant for the former. Yet, theologian Vito
Mancuso has intrigued me for some time. I followed his podcast on the &ldquo;Four
Masters of Life&rdquo;<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and found it excellent. In it, Mancuso discusses his four
tutelary deities: &ldquo;Socrates, the educator. Buddha, the physician. Confucius,
the politician. Jesus, the prophet.&rdquo; I also listened to some TV interviews
where I always found him fascinating. In short, there was enough to make me
decide to read some of his work. From the back cover of the book:</p>
<blockquote>
<p>We know perfectly well what we want to have - wealth, pleasure, power - but
we no longer know who we want to be. In the severe crisis in which we are
immersed, we continually need adversaries to define our identities. We often
find ourselves, enemies, even of ourselves, in a sort of permanent inner war.
The philosophy of Vito Mancuso is a precious anchor in these difficult times:
renewing in us the desire for ancient reflections, it shows us the way to go
back to the deep roots of our consciousness and teaches us how the meaning
and direction of our life on this Earth must be rebuilt in small steps, day
by day, in the awareness that we are in the presence of something more
important than ourselves. Only in this way will we enter into harmony with
the logic that determines our path and love that natural simplicity within us
is the real secret to a worthy life, a life worth living, an authentic life.</p></blockquote>
<p><img alt="A proposito del senso della vita" loading="lazy" src="/images/a-proposito-del-senso-della-vita.jpg#right">
Ambitious, to say the least, especially considering that we are talking about
a short essay of a hundred pages at most. In the preface, we learn that the
content of this book is nothing more than the revised and expanded transcript
of a speech given by Mancuso during a summer event at a city library. Yet, we
should not be misled. About the Meaning of Life is not superficial. Instead, it
is a well-exposed and reasoned synthesis of Vito Mancuso&rsquo;s general thought on
the meaning of life, a theme to which the author has dedicated much of his
work. Mancuso&rsquo;s philosophy is in some ways original, especially in its
courageous detachment from the dominant Western Catholic doctrine from which he
comes (and to which he tends to return.)<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> The in-depth and never prejudicially
critical study of alternative philosophies, like those of the far East, is
evident and leaves its mark. The writing is always fluent, the reading pleasant
and rarely tricky. On rare occasions when we feel the lack of footholds, the
footnotes (pun intended) aid with valuable suggestions for further study. Yes,
a short text, but with dense content and lots of food for thought. It deserves
more readings. Some of Mancuso&rsquo;s major works, like the Four Masters of Life
mentioned above, are certainly recommended for a deeper investigation<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The first episode, <em>Socrates</em>, is available <a href="https://www.raiplaysound.it/audio/2020/11/quotChe-cosapos195168-un-maestro-I-quattro-cardini-della-spiritualit195160quot-con--Vito-Mancuso---1-puntata---Socrate-17ae3281-4536-4ee1-be21-248b347e8849.html">here</a> (Italian)&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Further research reveals that his line of thought has received some <a href="https://it.wikipedia.org/wiki/Vito_Mancuso#Critiche">relevant criticism</a>, in the catholic circles especially.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Unfortunately, I am not aware of English editions of Mancuso&rsquo;s works.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Migrating a Windows 10 VM to Windows 11 in Parallels Desktop: a story of TPM chips and BIOS upgrades</title>
      <link>https://nicolaiarocci.com/migrating-a-windows-10-vm-to-windows-11-in-parallels-desktop-a-story-of-tpm-chips-and-bios-upgrades/</link>
      <pubDate>Sat, 11 Dec 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/migrating-a-windows-10-vm-to-windows-11-in-parallels-desktop-a-story-of-tpm-chips-and-bios-upgrades/</guid>
      <description>&lt;p&gt;This weekend assignment was to upgrade a couple of old Windows 10 VMs to
Windows 11 in Parallels Desktop 17. I couldn&amp;rsquo;t do that right away because
Windows Update was complaining about the lack of the TPM chip. A little
research revealed that TPM chips only work on UEFI BIOS.  To check which BIOS
version was being used in my VMs, I used the msinfo32 (System Information)
application. It showed the BIOS to be of &amp;ldquo;Legacy&amp;rdquo; type. So my task was now to
switch it to UEFI.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This weekend assignment was to upgrade a couple of old Windows 10 VMs to
Windows 11 in Parallels Desktop 17. I couldn&rsquo;t do that right away because
Windows Update was complaining about the lack of the TPM chip. A little
research revealed that TPM chips only work on UEFI BIOS.  To check which BIOS
version was being used in my VMs, I used the msinfo32 (System Information)
application. It showed the BIOS to be of &ldquo;Legacy&rdquo; type. So my task was now to
switch it to UEFI.</p>
<p><img alt="Windows 10 BIOS in Legacy  mode" loading="lazy" src="/images/windows10-bios-legacy-mode.png"></p>
<p>I looked high and low with little luck. Parallels the product is incredible.
Not so much its documentation and online support.  At some point, I landed in
the Parallels forums, a vast ocean of scarcely useful threads from which
I usually try to stay the hell away. The Parallels personnel there has
a long-standing tendency to copy &amp; paste ready-made and irrelevant solutions.
Users are left to their own, and, luckily, one of them posted the <a href="https://forum.parallels.com/threads/process-for-converting-from-legacy-to-uefi-in-prep-for-win-11.354888/">perfect
solution</a> to my Legacy-to-UEFI BIOS migration problem. I am reposting it
here, with minor edits, for future reference (my future self <a href="https://nicolaiarocci.com/learn-in-public/">will be
grateful</a>):</p>
<ol>
<li>Back up your VM</li>
<li>Boot into your Windows 10 VM as usual</li>
<li>While holding down Shift key: Start -&gt; Power -&gt; Restart</li>
<li>Select Troubleshoot, then Advanced options</li>
<li>Select Command Prompt</li>
<li>Log in with your account and Microsoft password (not your pin)</li>
<li>Type: <code>mbr2gpt /validate</code> and hit return; this will check your hard disk</li>
<li>If there&rsquo;s a problem, type: <code>mbr2gpt /validate /allowFullOS</code> and hit return</li>
<li>Type <code>mbr2gpt /convert</code> and hit return. It will convert the MBR disk partition scheme to GUID. It might complain about WinRE or something, but generally, if it says &ldquo;conversion was a success,&rdquo; you can type <code>exit</code> and hit return to kill the command prompt and return to the advanced menu</li>
<li>Choose &ldquo;Turn off PC.&rdquo; You don&rsquo;t want to restart Windows yet</li>
<li>Find your VM file in the Finder, right-click on it, and choose: &ldquo;Show Package Contents.&rdquo;</li>
<li>Find the config.pvs file and open it with a text editor</li>
<li>Search for the section <code>&lt;Bios dyn_lists=&quot;&quot;&gt;</code></li>
<li>Change <code>&lt;EfiEnabled&gt;</code> from 0 to 1</li>
<li>Change <code>&lt;EfiSecureBoot&gt;</code> from 0 to 1</li>
<li>Save the file</li>
<li>Open the VM Configuration, go to the Hardware tab, click the &ldquo;+&rdquo;, and add the TPM Chip</li>
</ol>
<p>At this point you can run Windows 10 as you usually would. At fist launch,
right after the login, I got a critical error and a hard restart (the original
poster reported the same experience.) After that, the VM is stable. A quick
msinfo32 check confirms that the VM is now on UEFI BIOS.</p>
<p><img alt="Windows 10 BIOS in UEFI mode" loading="lazy" src="/images/windows10-bios-uefi-mode.png"></p>
<p>Should Windows Update still complain, that&rsquo;s probably because of the CPU
limitation check. You can disable it:</p>
<ol>
<li>Open the Registry Editor</li>
<li>Navigate to <code>HKEY_LOCAL_MACHINE\SYSTEM\Setup\MoSetup</code></li>
<li>Search for <code>AllowUpgradesWithUnsupportedTPMOrCPU</code></li>
<li>Change its value to 1</li>
<li>Restart the VM</li>
</ol>
<p>Personally, I did not need to alter the registry, and I got <em>very</em> old VMs to
upgrade. At the time of this writing, Windows 11 installation is at 94% and
I am confident it will be successful.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A big nail in the coffin of MySQL</title>
      <link>https://nicolaiarocci.com/a-big-nail-in-the-coffin-of-mysql/</link>
      <pubDate>Thu, 09 Dec 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-big-nail-in-the-coffin-of-mysql/</guid>
      <description>&lt;p&gt;After five years in Oracle&amp;rsquo;s MySQL team, Steinar H. Gunderson resigned a few
days ago. On the same day, he dropped the bomb on his &lt;a href=&#34;https://blog.sesse.net/blog/tech/2021-12-05-16-41_leaving_mysql&#34;&gt;blog&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;let me point out something that I&amp;rsquo;ve been saying both internally and
externally for the last five years (although never on a stage—which explains
why I&amp;rsquo;ve been staying away from stages talking about MySQL): &lt;strong&gt;MySQL is
a pretty poor database, and you should strongly consider using Postgres
instead&lt;/strong&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>After five years in Oracle&rsquo;s MySQL team, Steinar H. Gunderson resigned a few
days ago. On the same day, he dropped the bomb on his <a href="https://blog.sesse.net/blog/tech/2021-12-05-16-41_leaving_mysql">blog</a>:</p>
<blockquote>
<p>let me point out something that I&rsquo;ve been saying both internally and
externally for the last five years (although never on a stage—which explains
why I&rsquo;ve been staying away from stages talking about MySQL): <strong>MySQL is
a pretty poor database, and you should strongly consider using Postgres
instead</strong><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p></blockquote>
<p>As [@brandur][3] appropriately puts it, in the world of software engineering,
it rarely gets more definitive than that. And authoritative, I might add, given
both the role he covered at Oracle and his overall [track record][5]. The whole
short post is worth reading<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Emphasis is mine.
[3]: <a href="https://twitter.com/brandur/status/1467916216018903044">https://twitter.com/brandur/status/1467916216018903044</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Spoiler: he&rsquo;s not nice to MariaDB either.
[5]: <a href="https://www.sesse.net/">https://www.sesse.net/</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>On the incredible opportunities offered by Starship</title>
      <link>https://nicolaiarocci.com/on-the-incredible-opportunities-offered-by-starship/</link>
      <pubDate>Wed, 08 Dec 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-the-incredible-opportunities-offered-by-starship/</guid>
      <description>&lt;p&gt;Space-junkie me is back, this time reading about the innumerable opportunities
that SpaceX&amp;rsquo;s Starship will offer once it becomes operational, hopefully no
later than this year or the next. In his &lt;a href=&#34;https://caseyhandmer.wordpress.com/2021/11/17/science-upside-for-starship/&#34;&gt;Science Upside for Starship&lt;/a&gt;, the
exceptionally knowledgeable Casey Handmer makes a case for Starship relevance
in the future of space exploration by listing an astounding number of
reasonable use-cases for the vessel.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think it is relatively straightforward to think of cool things to do with
SpaceX Starships, so recent posts have focused on trying to understand the
more mixed consequences for incumbent industrial organizations that are not
ideally positioned to exploit the coming advances. It is, however, a fun
exercise to enumerate all the ways in which Starship and related technologies
can help execute bold, ambitious missions of scientific discovery.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Space-junkie me is back, this time reading about the innumerable opportunities
that SpaceX&rsquo;s Starship will offer once it becomes operational, hopefully no
later than this year or the next. In his <a href="https://caseyhandmer.wordpress.com/2021/11/17/science-upside-for-starship/">Science Upside for Starship</a>, the
exceptionally knowledgeable Casey Handmer makes a case for Starship relevance
in the future of space exploration by listing an astounding number of
reasonable use-cases for the vessel.</p>
<blockquote>
<p>I think it is relatively straightforward to think of cool things to do with
SpaceX Starships, so recent posts have focused on trying to understand the
more mixed consequences for incumbent industrial organizations that are not
ideally positioned to exploit the coming advances. It is, however, a fun
exercise to enumerate all the ways in which Starship and related technologies
can help execute bold, ambitious missions of scientific discovery.</p></blockquote>
<p>It&rsquo;s long-form, yes, but well worth it. Oh, and while you&rsquo;re at it, you might
as well read <a href="https://caseyhandmer.wordpress.com/2021/10/28/starship-is-still-not-understood/">Starship is Still Not Understood</a>, Casey&rsquo;s previous article on the
topic.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: A useless man</title>
      <link>https://nicolaiarocci.com/book-review-a-useless-man/</link>
      <pubDate>Sat, 04 Dec 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-a-useless-man/</guid>
      <description>&lt;p&gt;Sait Faik Abasıyanık is an acclaimed Turkish storyteller. &lt;em&gt;A useless man&lt;/em&gt; is
a collection of short stories that spans nearly two decades of the author&amp;rsquo;s
output, offering a glimpse into his imaginative and troubled mind. His
overflowing love for others (even sensual, with a preference for street kids)
combined with a &amp;ldquo;mal de vivre&amp;rdquo; that pushes him towards self-destruction are
apparent.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A useless man&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/a-useless-man.jpg#right&#34;&gt;
His passion for the most popular areas of Istanbul and, in contrast, the
atavistic nostalgia for the simple life of the nearby fishermen islets exudes
from these stories, which often run similar one after another. The composition
is sometimes complex, making the text hard to parse and comprehend. Several
novels are noteworthy, though, especially those narrated in third-person, where
the narrator is not involved. The author is holding back his poetic prowess and
the resulting text is more linear. Notable examples are &lt;em&gt;The samovar&lt;/em&gt;, on the
elaboration of mourning, and &lt;em&gt;A story for two&lt;/em&gt;, a touching story of friendship
between a bird and a fisherman. Some first-person ones are exceptional, too.
For example, &lt;em&gt;Milk&lt;/em&gt; is Sait Faik&amp;rsquo;s worthy tribute to Proust&amp;rsquo;s madeleine. One
short story on the protagonist&amp;rsquo;s struggle with a street kid was profoundly
touching.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Sait Faik Abasıyanık is an acclaimed Turkish storyteller. <em>A useless man</em> is
a collection of short stories that spans nearly two decades of the author&rsquo;s
output, offering a glimpse into his imaginative and troubled mind. His
overflowing love for others (even sensual, with a preference for street kids)
combined with a &ldquo;mal de vivre&rdquo; that pushes him towards self-destruction are
apparent.</p>
<p><img alt="A useless man" loading="lazy" src="/images/a-useless-man.jpg#right">
His passion for the most popular areas of Istanbul and, in contrast, the
atavistic nostalgia for the simple life of the nearby fishermen islets exudes
from these stories, which often run similar one after another. The composition
is sometimes complex, making the text hard to parse and comprehend. Several
novels are noteworthy, though, especially those narrated in third-person, where
the narrator is not involved. The author is holding back his poetic prowess and
the resulting text is more linear. Notable examples are <em>The samovar</em>, on the
elaboration of mourning, and <em>A story for two</em>, a touching story of friendship
between a bird and a fisherman. Some first-person ones are exceptional, too.
For example, <em>Milk</em> is Sait Faik&rsquo;s worthy tribute to Proust&rsquo;s madeleine. One
short story on the protagonist&rsquo;s struggle with a street kid was profoundly
touching.</p>
<p>I bought this book because I wanted to know more about Istanbul, a city I know
little or nothing about, and its people. I am only partially satisfied. Reading
it, I realized that the author was, of course,  not addressing the foreign
reader at all. He was writing, of course, for his people, the citizens of
Istanbul, and himself.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Chet Baker, born to be cool</title>
      <link>https://nicolaiarocci.com/chet-baker-born-to-be-cool/</link>
      <pubDate>Mon, 29 Nov 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/chet-baker-born-to-be-cool/</guid>
      <description>&lt;p&gt;A great piece of writing on jazz has recently been posted on The Smart Set. In
&lt;a href=&#34;https://www.thesmartset.com/born-to-be-cool/&#34;&gt;Born to be cool&lt;/a&gt;, Matthew Duffus writes about jazz trumpeter Chet Baker,
reporting about his troubled life, musical prowess, influence, and legacy. Some
facts are well known, like the reception and then the competition with trumpet
legends such as Miles Davis and Dizzy Gillespie; other tidbits are less known
(to me at least). On Baker legacy:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A great piece of writing on jazz has recently been posted on The Smart Set. In
<a href="https://www.thesmartset.com/born-to-be-cool/">Born to be cool</a>, Matthew Duffus writes about jazz trumpeter Chet Baker,
reporting about his troubled life, musical prowess, influence, and legacy. Some
facts are well known, like the reception and then the competition with trumpet
legends such as Miles Davis and Dizzy Gillespie; other tidbits are less known
(to me at least). On Baker legacy:</p>
<blockquote>
<p>As I hope this makes clear, with Baker, music is only part of the story. In
order to fully grasp his significance within popular culture, we must also
look at the mythos surrounding him and the often less salacious truth that
lies beneath that dramatic surface. It is only by looking concurrently at
Baker’s music and image that we can truly understand why he has endured
despite the existence of more technically-gifted trumpeters and impressive
vocalists. Many such musicians came to the fore throughout his tumultuous
lifetime, but few have captured the public’s attention or endured in the way
that Baker has. For all of his limited range, not to mention the dramatic
loss of the youthful good looks that are at the root of his image, he managed
to make a living as a musician for decades and has persisted in the popular
imagination and jazz fans’ collections almost 35 years after his death.</p></blockquote>
<p>I&rsquo;ve always listened to Barker with little attention, knowing and researching
little about the artist and his music. This article fills a hole. Also, I am
grateful to Duffus for letting me discover a gem like Live in Tokyo, an album
recorded on stage less than a year before his premature, tragic death and then
released posthumously. I am listening to it as I write this note, and man isn&rsquo;t
it just great.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Endurance, Shackleton&#39;s Incredible Voyage</title>
      <link>https://nicolaiarocci.com/book-review-endurance-shackletons-incredible-voyage/</link>
      <pubDate>Sun, 28 Nov 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-endurance-shackletons-incredible-voyage/</guid>
      <description>&lt;p&gt;Of all the stories of maritime adventures I&amp;rsquo;ve read, that of the Endurance,
masterfully told by Alfred Lansing in this book, is the most incredible and
shocking. Unbelievable to say, given the premise (a crew of 28 men stranded on
the Antarctic pack, camped on floating slabs of ice hundreds of miles from any
human settlement, at the gates of the Antarctic winter), but the story does not
end in tragedy. The original expedition failed, but what followed the capture
of Endurance (never was the name of a ship more prophetic) by the Antarctic ice
borders on the impossible, if not the miraculous.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Of all the stories of maritime adventures I&rsquo;ve read, that of the Endurance,
masterfully told by Alfred Lansing in this book, is the most incredible and
shocking. Unbelievable to say, given the premise (a crew of 28 men stranded on
the Antarctic pack, camped on floating slabs of ice hundreds of miles from any
human settlement, at the gates of the Antarctic winter), but the story does not
end in tragedy. The original expedition failed, but what followed the capture
of Endurance (never was the name of a ship more prophetic) by the Antarctic ice
borders on the impossible, if not the miraculous.</p>
<p>The merits of the expedition leader, Sir Ernest Shackleton, are, of course,
spectacular. Every decision he made and his care in leading the crew during
that year and a half of unspeakable suffering, sacrifice and hardship led them
all to safety. There was no shortage of hotheads and slackers, which made the
successful outcome even more impressive. Shackleton himself was not a saint.
For the sake of fame, success and money, he planned an expedition that had very
little chance of success, in which death was by far the most probable result.
And yet, he planned every detail with great care, never doubting the final
victory. More than anything else, what is surprising in this story is that no
saviour finally came to rescue the crew. They saved themselves. After more than
a year camped on drifting ice floes, driven by sea currents and Antarctic
winds, they finally landed on the deserted and unforgiving Elephant isle.
Shackleton once again had to take to the sea, leaving most of his men behind,
to cross the terrible Drake Channel on little more than an open lifeboat. This
one feature alone, the victorious crossing of the world-renown troubled waters
of Drake Channel on a lifeboat, was something never attempted before, nor ever
repeated afterwards, and would have been enough for history books. Once
miraculously landed in South Georgia, Shackleton and his men were not done yet.
They had to cross snow-capped mountains never before touched by man to reach an
outpost of whale fishers and finally set sail in a ship to return to retrieve
the men marooned on Elephant Island.</p>
<p><img alt="Endurance book cover" loading="lazy" src="/images/endurance.jpg#right">
Every moment of this story feels like an epic, fictional movie, but it&rsquo;s not.
It is reality as experienced firsthand by actual human beings. Alfred Lansing
has reconstructed all these events with great care, drawing mainly on the many
diaries kept by the crew, Shackleton himself included, and interviewing the few
survivors still alive. Lansing&rsquo;s work is precise, methodical, careful. Still,
the result is always smooth and at the same time dry, never yielding to
hyperbole or exaltation, always close to the facts, which on the other hand,
certainly do not need enrichment. A fantastic story, beautifully told.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I&#39;m a Moka guy</title>
      <link>https://nicolaiarocci.com/im-a-moka-guy/</link>
      <pubDate>Sat, 27 Nov 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/im-a-moka-guy/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a Moka guy, always have been. Admittedly, I also like so-called American
coffee and, of course, espresso. But every day at my place, I&amp;rsquo;ll have
a Moka-brewed coffee. Twice. As I wake up, and then in the afternoon before
getting back to work. I&amp;rsquo;ve been observing the pods frenzy spreading all around
me with curiosity and bewilderment in recent years, with dedicated retailers
opening (and often closing soon after) everywhere in my town. Bialetti&amp;rsquo;s Moka
coffee pots have always been around my life. Not disposable, for they are
pretty expensive even here in Italy, but common, everyday kitchen gadgets?
Absolutely.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m a Moka guy, always have been. Admittedly, I also like so-called American
coffee and, of course, espresso. But every day at my place, I&rsquo;ll have
a Moka-brewed coffee. Twice. As I wake up, and then in the afternoon before
getting back to work. I&rsquo;ve been observing the pods frenzy spreading all around
me with curiosity and bewilderment in recent years, with dedicated retailers
opening (and often closing soon after) everywhere in my town. Bialetti&rsquo;s Moka
coffee pots have always been around my life. Not disposable, for they are
pretty expensive even here in Italy, but common, everyday kitchen gadgets?
Absolutely.</p>
<p>So it was interesting to read Atlas Obscura&rsquo;s <a href="https://www.atlasobscura.com/articles/make-coffee-moka-pot">The Humble Brilliance of Italy&rsquo;s
Moka Coffee Pot</a> to learn more about Moka&rsquo;s roots, history (with the ups and
downs), and design relevance. Of all this stuff, I was only marginally aware.</p>
<blockquote>
<p>The Moka pot is a symbol of Italy: of postwar ingenuity and global culinary
dominance. It is in the Museum of Modern Art, the Cooper-Hewitt Smithsonian
Design Museum, and other temples to design. It is in the Guinness Book of
World Records as the world&rsquo;s most popular coffee maker and was for decades
commonplace to the point of ubiquity not only in Italy but in Cuba,
Argentina, Australia, and the United States. It&rsquo;s also widely misunderstood
and maligned, with approval in the modern coffee world coming perhaps a bit
too late, in only the past few years. Get one while you can.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Mathematics is politics</title>
      <link>https://nicolaiarocci.com/book-review-mathematics-is-politics/</link>
      <pubDate>Thu, 25 Nov 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-mathematics-is-politics/</guid>
      <description>&lt;p&gt;Mathematics as the study of relationships: in this aspect lies the similarity
and affinity with politics. And then the need in both cases to proceed with
stubbornness and trust, without fearing error which, as in all difficult
things, is not only lying in wait but inherent, and often, when it is
discovered, it is the stimulus and engine of new successes and goals. Hence the
need to respect rules and (not or, mind you) the compelling need for
revolutions. The parallel narration of the author&amp;rsquo;s life and the change, over
the years, of her own beliefs and points of view, makes this short essay more
credible and streamlines the story.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Mathematics as the study of relationships: in this aspect lies the similarity
and affinity with politics. And then the need in both cases to proceed with
stubbornness and trust, without fearing error which, as in all difficult
things, is not only lying in wait but inherent, and often, when it is
discovered, it is the stimulus and engine of new successes and goals. Hence the
need to respect rules and (not or, mind you) the compelling need for
revolutions. The parallel narration of the author&rsquo;s life and the change, over
the years, of her own beliefs and points of view, makes this short essay more
credible and streamlines the story.</p>
<blockquote>
<p>Mathematics was my apprenticeship to revolution because it taught me to
distrust absolute truths and unquestionable authorities. Democracy and
mathematics, from a political point of view, are similar: like all creative
processes, they can&rsquo;t stand remaining unchanged.</p></blockquote>
<p><img alt="La matematica è politica" loading="lazy" src="/images/matematica-politica.jpg#right">
Not a book for everyone, perhaps, but suitable to those who like to think and
be challenged with ideas. Background theme to which I am susceptible: the
necessity for school to illuminate our existences. I wouldn&rsquo;t say I liked the
frequent references to contingent situations in Italian politics. I bought an
short essay on the interconnections between mathematics and politics; I expect
it to make me fly high, far away from the quarrels and events of daily
politics. Also, sometimes the similarities between the two fields seem a bit
too far fetched.</p>
<p>I don&rsquo;t think this book is currently available in English. I read it in the
original Italian edition.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to automatically pull and deploy updated Docker images</title>
      <link>https://nicolaiarocci.com/how-to-automatically-pull-and-deploy-updated-docker-images/</link>
      <pubDate>Sun, 21 Nov 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-automatically-pull-and-deploy-updated-docker-images/</guid>
      <description>&lt;p&gt;We want our test and production stacks to be automatically updated every time
something new is pushed to the &lt;code&gt;test&lt;/code&gt; or &lt;code&gt;release&lt;/code&gt; branch. CI builds the docker
image on successful test runs, then stores it in our private registry. But how
do you automatically pull and deploy those updated images?&lt;/p&gt;
&lt;p&gt;I looked into the &lt;a href=&#34;https://containrrr.dev/watchtower/&#34;&gt;Watchtower&lt;/a&gt; project, which is interesting. You add
Watchtower to the stack, and it will diligently check for new versions of the
images used by the containers in the stack, pulling, building and deploying as
needed while the stack is up and running. In my experiments, however, I had
&lt;a href=&#34;https://github.com/containrrr/watchtower/issues/1113&#34;&gt;little luck&lt;/a&gt; in making it talk with our private registry. Also, I&amp;rsquo;m not too
fond of polluting my stack with foreign containers. I want my docker stack to
be simple, tidy, clean, and single-tasked.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We want our test and production stacks to be automatically updated every time
something new is pushed to the <code>test</code> or <code>release</code> branch. CI builds the docker
image on successful test runs, then stores it in our private registry. But how
do you automatically pull and deploy those updated images?</p>
<p>I looked into the <a href="https://containrrr.dev/watchtower/">Watchtower</a> project, which is interesting. You add
Watchtower to the stack, and it will diligently check for new versions of the
images used by the containers in the stack, pulling, building and deploying as
needed while the stack is up and running. In my experiments, however, I had
<a href="https://github.com/containrrr/watchtower/issues/1113">little luck</a> in making it talk with our private registry. Also, I&rsquo;m not too
fond of polluting my stack with foreign containers. I want my docker stack to
be simple, tidy, clean, and single-tasked.</p>
<p>I ended up doing something super simple. A cronjob routinely invokes a script
that pulls relevant images from our registry. If updated images are downloaded,
then the <code>docker stack up</code> command is issued.  Finally, a <code>docker image prune -af</code> ensures obsolete images are deleted. For the simplest scenario, where we
only need to take care of one image, the script looks like this:</p>
<pre><code>#!/bin/bash
set -e

readonly IMAGE=[image]
readonly TAG=[tag]

out=$(docker pull $IMAGE:$TAG)

if [[ $out != *&quot;up to date&quot;* ]]; then
    echo &quot;an updated image has been donwloaded for '$IMAGE:$TAG'&quot;
    # we actually launch a script here:
    docker stack up -c stack.yml mystack --with-registry-auth
    docker image prune -af
else
    echo &quot;no updates available for '$IMAGE:$TAG'&quot;
fi
</code></pre>
<p>I expected <code>docker pull</code> to return <code>1</code> on successful pulls; it turns out it
always returns <code>0</code>, so I&rsquo;m checking its output for confirmation (I got the hint
<a href="https://stackoverflow.com/a/51628017/323269">here</a>).</p>
<p>You might be wondering why we don&rsquo;t directly execute <code>docker stack up</code> in our
cronjob. It updates the stack resolving new images by default. The problem is
that, in our experience, it also briefly stops the services. Not an issue if
you run this command sporadically. We want our stacks refreshed minutes after
the initial developer push, though, so the cronjob runs frequently. With our
pre-fetch approach, actual deployment only happens when an updated image has
been found and downloaded.</p>
<p>Now, when I push to, say, <code>test</code> branch, I have the updated services up and
running a minute later, without me doing anything on the docker or server-side
of things. Mission accomplished, I guess, but I am sure there are other, better
ways around this problem. If you happen to know one, please let me know about
it (keep in mind, we don&rsquo;t use alternative orchestrators, just the built-in
&lsquo;swarm&rsquo; thing.)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Learn in public</title>
      <link>https://nicolaiarocci.com/learn-in-public/</link>
      <pubDate>Tue, 16 Nov 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/learn-in-public/</guid>
      <description>&lt;p&gt;Today I searched the internet for something, and the first result I got from
&lt;a href=&#34;https://duckduckgo.com/&#34;&gt;@duckduckgo&lt;/a&gt; was a note I wrote months ago to my future self; how meta is
that.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/duckduckgo-search.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.swyx.io/learn-in-public/&#34;&gt;Learn in public&lt;/a&gt;, it gives superpowers&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;. Also, in recent years, adopting
&lt;a href=&#34;https://indieweb.org/POSSE&#34;&gt;POSSE&lt;/a&gt; was the best thing I did for my personal development.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I should do better. Post more &lt;a href=&#34;https://nicolaiarocci.com/tags/til/&#34;&gt;TILs&lt;/a&gt;, for example.
[rss]: &lt;a href=&#34;https://nicolaiarocci.com/index.xml&#34;&gt;https://nicolaiarocci.com/index.xml&lt;/a&gt;
[tw]: &lt;a href=&#34;http://twitter.com/nicolaiarocci&#34;&gt;http://twitter.com/nicolaiarocci&lt;/a&gt;
[nl]: &lt;a href=&#34;https://buttondown.email/nicolaiarocci&#34;&gt;https://buttondown.email/nicolaiarocci&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;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Today I searched the internet for something, and the first result I got from
<a href="https://duckduckgo.com/">@duckduckgo</a> was a note I wrote months ago to my future self; how meta is
that.</p>
<p><img loading="lazy" src="/images/duckduckgo-search.png"></p>
<p><a href="https://www.swyx.io/learn-in-public/">Learn in public</a>, it gives superpowers<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Also, in recent years, adopting
<a href="https://indieweb.org/POSSE">POSSE</a> was the best thing I did for my personal development.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I should do better. Post more <a href="/tags/til/">TILs</a>, for example.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>My ASP.NET 5 migration to .NET 6</title>
      <link>https://nicolaiarocci.com/my-asp.net-5-migration-to-.net-6/</link>
      <pubDate>Sun, 14 Nov 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-asp.net-5-migration-to-.net-6/</guid>
      <description>&lt;p&gt;I spent the last few days migrating our ASP.NET REST services, MVC web
applications and Blazor server apps to .NET 6. Overall the process was pretty
straightforward. The few issues I went through were easy to solve and well
documented. Things got more involved with the EF Core 6 transition, especially
with the Npgsql Entity Framework Core Provider.&lt;/p&gt;
&lt;p&gt;The official &lt;a href=&#34;https://docs.microsoft.com/en-us/aspnet/core/migration/50-to-60&#34;&gt;ASP.NET Core 5.0 to 6.0 migration guide&lt;/a&gt; was my first stop. It
offers the perfect entry point, rich with in-depth links. At this stage, I am
not interested in switching to the new .NET 6 minimal hosting model (aka
Minimal APIs). I think it&amp;rsquo;s a significant improvement, and we will likely adopt
it for new projects, but our production projects aren&amp;rsquo;t going to be refactored
right away. Should minimal APIs also prove to be remarkably performant, we&amp;rsquo;ll
reconsider them&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I spent the last few days migrating our ASP.NET REST services, MVC web
applications and Blazor server apps to .NET 6. Overall the process was pretty
straightforward. The few issues I went through were easy to solve and well
documented. Things got more involved with the EF Core 6 transition, especially
with the Npgsql Entity Framework Core Provider.</p>
<p>The official <a href="https://docs.microsoft.com/en-us/aspnet/core/migration/50-to-60">ASP.NET Core 5.0 to 6.0 migration guide</a> was my first stop. It
offers the perfect entry point, rich with in-depth links. At this stage, I am
not interested in switching to the new .NET 6 minimal hosting model (aka
Minimal APIs). I think it&rsquo;s a significant improvement, and we will likely adopt
it for new projects, but our production projects aren&rsquo;t going to be refactored
right away. Should minimal APIs also prove to be remarkably performant, we&rsquo;ll
reconsider them<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>The first step was updating the target framework moniker to <code>net6.0</code>.</p>
<pre><code>&lt;Project Sdk=&quot;Microsoft.NET.Sdk.Web&quot;&gt;
  &lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;net6.0&lt;/TargetFramework&gt;
  &lt;/PropertyGroup&gt;
&lt;/Project&gt;
</code></pre>
<p>Then, I updated all <code>Microsoft.AspNetCore.*</code> and <code>Microsoft.Extensions.*</code> package
references to version 6.0.0.</p>
<pre><code>&lt;ItemGroup&gt;
  &lt;PackageReference Include=&quot;Microsoft.AspNetCore.JsonPatch&quot; Version=&quot;6.0.0&quot; /&gt;
  &lt;PackageReference Include=&quot;Microsoft.Extensions.Caching.[...]&quot; Version=&quot;6.0.0&quot; /&gt;
&lt;/ItemGroup&gt;
</code></pre>
<p>That&rsquo;s all I needed to do to update the MVC application. The only other thing
left for me was to update Dockerfile&rsquo;s <code>FROM</code> statements to pull the new .NET
6 image:</p>
<pre><code># build stage
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /build
[..]
# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
[..]
</code></pre>
<p>Migrating the WebApi/REST services required more work. I got a few errors and
warnings, either at compile or runtime. Let&rsquo;s go through them one by one.</p>
<h3 id="new-jsonserializer-source-generator-overloads">New <code>JsonSerializer</code> source generator overloads</h3>
<blockquote>
<p>The call is ambiguous between the following methods or properties:
&lsquo;JsonSerializer.Serialize(TValue, JsonSerializerOptions?)&rsquo; and
&lsquo;JsonSerializer.Serialize(TValue, JsonTypeInfo)&rsquo;&quot;</p></blockquote>
<p>In .NET 6, the <code>Sytem.Text.Json.JsonSerializer</code> <a href="https://docs.microsoft.com/en-us/dotnet/core/compatibility/serialization/6.0/jsonserializer-source-generator-overloads">acquired two new overloads</a> that
support pre-generated type information via source-generators. Previously, you
could write code that passed <code>null</code> (or <code>default</code>) as the value for the
<code>JsonSeralizerOptions</code> parameter:</p>
<pre><code>entity.Property(e =&gt; e.Value)
    .HasConversion(
        v =&gt; JsonSerializer.Serialize(v, null),
        v =&gt; JsonSerializer.Deserialize(v, null));
</code></pre>
<p>However, the new source-generator-enabled overloads will cause ambiguity if you
pass <code>null</code>. The solution was to add simply an explicit cast to the intended
target:</p>
<pre><code>entity.Property(e =&gt; e.Value)
    .HasConversion(
        v =&gt; JsonSerializer.Serialize(v, (JsonSerializerOptions)null), 
        v =&gt; JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));
</code></pre>
<h3 id="the-rngcryptoserviceprovider-is-now-obsolete">The <code>RNGCryptoServiceProvider</code> is now obsolete</h3>
<blockquote>
<p>SYSLIB0023: RNGCryptoServiceProvider is obsolete</p></blockquote>
<p>As it turns out, <code>RNGCryptoServiceProvider</code> is <a href="https://docs.microsoft.com/en-us/dotnet/fundamentals/syslib-diagnostics/syslib0023">marked as obsolete in .NET 6</a>. The
new preferred way to generate a random number is using one of the
<code>RandomNunmberGenerator</code> static methods.</p>
<pre><code>  // old
  using var rng = new RNGCryptoServiceProvider();
  var uintBuffer = new byte[sizeof(uint)];
  rng.GetBytes(uintBuffer);
  var num = BitConverter.ToUInt32(uintBuffer, 0);

  // new
  using var rng = RandomNumberGenerator.Create();
  var uintBuffer = new byte[sizeof(uint)];
  rng.GetBytes(uintBuffer);
  var num = BitConverter.ToUInt32(uintBuffer, 0);
</code></pre>
<p>The two issues above are essentially the only ones I met with .NET 6 itself. As
mentioned, I also encountered a few EF Core 6 annoyances. They are listed
below.</p>
<h3 id="new-imodelcachekeyfactorycreate-overload">New <code>IModelCacheKeyFactory.Create()</code> overload</h3>
<blockquote>
<p>The requested configuration is not stored in the read-optimized model, please
use DbContext.GetService&lt;IDesignTimeModel&gt;().Model.</p></blockquote>
<p>If, like me, you happen to have a custom <code>IModelCacheKeyFactory</code>
implementation, you will likely get this error at runtime. Starting with EF
Core 6, <a href="https://github.com/dotnet/EntityFramework.Docs/pull/3305/files">you must implement</a> the new overload of the <code>Create</code> method that
handles design-time model caching.</p>
<pre><code>// old
public class DynamicModelCacheKeyFactoryDesignTimeSupport : IModelCacheKeyFactory
{
   public object Create(DbContext context) =&gt; 
     context is DynamicContext dynamicContext
       ? (context.GetType(), dynamicContext.UseIntProperty)
       : (object)context.GetType();

    public object Create(DbContext context) =&gt; Create(context, false);
}

// new
public class DynamicModelCacheKeyFactoryDesignTimeSupport : IModelCacheKeyFactory
{
   public object Create(DbContext context, bool designTime) =&gt; 
     context is DynamicContext dynamicContext
       ? (context.GetType(), dynamicContext.UseIntProperty, designTime)
       : (object)context.GetType();

    public object Create(DbContext context) =&gt; Create(context, false);
}
</code></pre>
<h3 id="nested-optional-dependents-with-no-required-properties">Nested optional dependents with no required properties</h3>
<blockquote>
<p>Entity type &lsquo;[EntityType]&rsquo; is an optional dependent using table sharing and
containing other dependents without any required non shared property to
identify whether the entity exists. If all nullable properties contain a null
value in database then an object instance won&rsquo;t be created in the query
causing nested dependent&rsquo;s values to be lost. Add a required property to
create instances with null values for other properties or mark the incoming
navigation as required to always create an instance.</p></blockquote>
<p>The message above is a consequence of a <a href="https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-6.0/breaking-changes#high-impact-changes">high-impact breaking change</a> introduced
in EF Core 6.0. In the past, you could have models with nested optional dependents
sharing the same table, each with no required properties. In such
circumstances, data loss could occur (see the <a href="https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-6.0/breaking-changes#high-impact-changes">documentation</a> for details
and examples). My solution was to mark at least one property of dependent
models with the <code>RequiredAttribute</code> (which, in every single case, was the right
thing to do anyway)</p>
<h3 id="the-efcorenamingconventions-package-is-missing-a-method">The <code>EFCore.NamingConventions</code> package is missing a method</h3>
<blockquote>
<p>Method &lsquo;GetServiceProviderHashCode&rsquo; in type &lsquo;ExtensionInfo&rsquo; from assembly
&lsquo;EFCore.NamingConventions&quot;</p></blockquote>
<p>The message says it all: there&rsquo;s currently a missing method in the latest
stable version of the <code>EFCore.NamingConventions</code> package. At the time of this
writing, <code>v6.0</code> of the package has not been released, but there is a pre-release
available that includes the missing implementation. Switch to <code>v6.0.0-rc.1</code> and
you&rsquo;ll be fine (ticket is <a href="https://github.com/efcore/EFCore.NamingConventions/issues/108">here</a>). I&rsquo;m sure the new stable release will be
out by the time you read this.</p>
<p><em>Update: EFCore.NamingConventions v6 has now been released.</em></p>
<h3 id="the-npgsql-timestamps-breaking-change">The Npgsql timestamps breaking change</h3>
<p>While the above situations were quick to fix, the new, updated Npgsql provider
offers a different threat level. There&rsquo;s <a href="https://www.npgsql.org/efcore/release-notes/6.0.html#major-changes-to-timestamp-mapping">one significant breaking change</a>
that impacts <code>DateTime</code> fields (timestamps). As the documentation suggests, it is
possible to opt out of this change to preserve backward compatibility, but
I decided to take the plunge and embrace it. The short version is that
Postgres&rsquo;s <code>timestamp</code> fields (&rsquo;timestamps without timezone&rsquo;) are changed to
<code>timestampz</code> (&rsquo;timestamps with time zones&rsquo;). In the application, when dealing
with Npgsql, <code>DateTime</code> properties must be treated as UTC by setting the <code>Kind</code>
property to <code>DateTimeKind.UTC</code>. When you run the migration tool, a migration is
created to accomodate the change, which can impact existing data. Make sure you
read the <a href="https://www.npgsql.org/efcore/release-notes/6.0.html#migrating-columns-from-timestamp-to-timestamptz">detailed notes</a> to assess the impact on your data. I let the
migration run, then updated models configuration by setting a custom
<code>DateTimeUtcValueConverter</code> for DateTime properties:</p>
<pre><code>// custom DateTime converter
protected readonly ValueConverter DateTimeToUtcConverter = 
  new ValueConverter&lt;DateTime, DateTime&gt;(
    v =&gt; DateTime.SpecifyKind(v, DateTimeKind.Utc),
    v =&gt; v);

// Entity configuration 
internal class MyEntityConfiguratin : IEntityTypeConfiguration&lt;MyEntity&gt; 
{
  public override void Configure(EntityTypeBuilder&lt;MyEntity&gt; builder)
  {
    builder.Property(o =&gt; o.Date).HasConversion(DateTimeToUtcConverter);
  }
}
</code></pre>
<p>Now Postgres timestamps are stored as &rsquo;timestamp with timezone (timestampz).
Actual values are UTC as before. A custom converter is attached to the <code>Date</code>
property at the application level to ensure that values are correctly handled.</p>
<p>Our stack is now fully running on .NET 6. Upgrading a standard ASP.NET
5 project to .NET 6 revealed to be relatively straightforward. The EF Core
6.0 migration can be more involved, while the Npgsql 6 migration requires some
attention but, remember, you can always opt-out of the delicate timestamps
change. Was the upgrade worth it? I think so for a few reasons. First, .NET
6 is LTS, while .NET 5 will be out of support in six months. Second, .<a href="https://devblogs.microsoft.com/dotnet/announcing-net-6">NET 6 is
the fastest yet</a>, with a remarkable margin (EF Core 6 alone is <a href="https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-6.0/whatsnew#improved-performance-on-techempower-fortunes">70%
faster</a>.) While the primary migration is done, there are a lot of changes
and new features that are worth considering for our codebase, which is
something we will be doing in the upcoming weeks.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>My initial ramblings on Minimal APIs are available <a href="/will-.net-6-minimal-apis-turn-heads/">here</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The posthuman dog</title>
      <link>https://nicolaiarocci.com/the-posthuman-dog/</link>
      <pubDate>Sat, 06 Nov 2021 08:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-posthuman-dog/</guid>
      <description>&lt;p&gt;Flo, our dog, spent her whole fifteen-years long life with us. Many, many times
after she passed away, I wondered if she lived a happy dog life or not. In &lt;a href=&#34;https://aeon.co/essays/who-could-dogs-become-without-humans-in-their-lives&#34;&gt;The
posthuman dog&lt;/a&gt; (Aeon), Jessica Pierce poses a fascinating question that
somehow helps find answers to my troubling question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If humans were to disappear from the face of the Earth, what might dogs
become? And would they be better off without us?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Flo, our dog, spent her whole fifteen-years long life with us. Many, many times
after she passed away, I wondered if she lived a happy dog life or not. In <a href="https://aeon.co/essays/who-could-dogs-become-without-humans-in-their-lives">The
posthuman dog</a> (Aeon), Jessica Pierce poses a fascinating question that
somehow helps find answers to my troubling question:</p>
<blockquote>
<p>If humans were to disappear from the face of the Earth, what might dogs
become? And would they be better off without us?</p></blockquote>
<p>Unfortunately, the answer I can infer from the article is not very pleasant to
my guilt.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Is Eve still maintained?</title>
      <link>https://nicolaiarocci.com/is-eve-still-maintained/</link>
      <pubDate>Sat, 06 Nov 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/is-eve-still-maintained/</guid>
      <description>&lt;p&gt;Tonight someone opened &lt;a href=&#34;https://github.com/pyeve/eve/issues/1458&#34;&gt;a ticket&lt;/a&gt; on
the Eve repository. I jotted down a quick reply and was about to hit the
Comment button when I thought a more articulated reply was in order. I also
want it published on my website.&lt;/p&gt;
&lt;p&gt;So the question is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Is Eve still maintained?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;My reply goes like this:&lt;/p&gt;
&lt;p&gt;Hello, yes, &lt;a href=&#34;https://python-eve.org&#34;&gt;Eve&lt;/a&gt; is in &amp;lsquo;maintenance mode&amp;rsquo;, as I call
it. I don&amp;rsquo;t actively develop new features anymore. Still, I am more than
willing to code-review and merge relevant pull requests, especially so if they
are bug fixes or improvements over existing features.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Tonight someone opened <a href="https://github.com/pyeve/eve/issues/1458">a ticket</a> on
the Eve repository. I jotted down a quick reply and was about to hit the
Comment button when I thought a more articulated reply was in order. I also
want it published on my website.</p>
<p>So the question is:</p>
<blockquote>
<p>Is Eve still maintained?</p></blockquote>
<p>My reply goes like this:</p>
<p>Hello, yes, <a href="https://python-eve.org">Eve</a> is in &lsquo;maintenance mode&rsquo;, as I call
it. I don&rsquo;t actively develop new features anymore. Still, I am more than
willing to code-review and merge relevant pull requests, especially so if they
are bug fixes or improvements over existing features.</p>
<p>Long story short, after many years of development, the <a href="https://docs.python-eve.org/en/stable/funding.html">funding
campaign</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> that would have
allowed me to keep working on the project failed miserably. People are using
the framework worldwide, probably making a profit out of it, but they are not
interested in investing in it<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. The good news is that the framework is, I think,
stable and mature enough to meet most needs.</p>
<p>With <a href="https://python-cerberus.org">Cerberus</a>, I was lucky enough to find
a worthy, skilled  maintainer in the person of
<a href="https://github.com/funkyfuture">@funkyfuture</a>, who&rsquo;s keeping the project
going. I am hoping the same happens with Eve. So, if anyone familiar with the
code-base is willing to help, this is your moment to come forward. Maybe start
with triaging open tickets, maybe pull-request for some low-hanging fruits, and
then challenge yourself with more demanding tasks, like <a href="https://github.com/pyeve/eve/issues/1278">updating Eve to the
latest version of Cerberus</a>.</p>
<p>I had so <a href="https://www.patreon.com/nicolaiarocci">many things</a> planned for Eve.
Hopefully someone will join the ranks, maybe take the helm, and help bring it
to the next level.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>For some rationale behind the campaign, see <a href="http://nicolaiarocci.com/eve-and-cerberus-funding-campaign/">this post</a> from 2017.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>I must admit, this failure hit me hard.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: King and Emperor, A New Life of Charlemagne</title>
      <link>https://nicolaiarocci.com/book-review-king-and-emperor-a-new-life-of-charlemagne/</link>
      <pubDate>Sun, 31 Oct 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-king-and-emperor-a-new-life-of-charlemagne/</guid>
      <description>&lt;p&gt;In this scholarly biography by Janet L. Nelson, Charlemagne is stripped back
from the years of mythologizing and idolizing that have occurred since his
death. He is presented as distinctly human, and this book is the first time
I have felt I could reasonably understand Charlemagne as the man he was, not
the man he has since been painted to be. Moreover, Nelson is excellent in her
discussions of Charlemagne&amp;rsquo;s wives and their roles. For example, the
commonplace assumption that Fastrada was a cruel person is questioned, and she
emerges as a capable companion and queen instead.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this scholarly biography by Janet L. Nelson, Charlemagne is stripped back
from the years of mythologizing and idolizing that have occurred since his
death. He is presented as distinctly human, and this book is the first time
I have felt I could reasonably understand Charlemagne as the man he was, not
the man he has since been painted to be. Moreover, Nelson is excellent in her
discussions of Charlemagne&rsquo;s wives and their roles. For example, the
commonplace assumption that Fastrada was a cruel person is questioned, and she
emerges as a capable companion and queen instead.</p>
<p><img alt="Kind and Emperor: A New Life of Charlemagne" loading="lazy" src="/images/king-and-emperor.jpg#right">
Nelson is firm in her dissection of the source material. However, it can be
a challenge to weave critical discussion of sources and fluid narrative, and at
times this book leans a little on the dry side. Nelson does not speculate; she
instead focuses on what we know or can be reasonably inferred from the sources.
The downside is that some of the more exciting episodes from Charlemagne&rsquo;s life
are glossed over: the 792AD rebellion of Charlemagne&rsquo;s eldest son, Pippin,
receives only three pages of discussion, whereas Charlemagne&rsquo;s canal-building
project, which follows, receives double that. Personally, as a general reader
rather than a historian, I would have preferred more on the &ldquo;interesting bits&rdquo;
of Charlemagne&rsquo;s reign, but a more academic reader may not mind.</p>
<p>Overall, this is an excellent biography, and I would recommend it to an
informed reader. The scholarly attention to sources might deter the casual
reader, but the motivated ones will take profit from the effort.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Language of the Spirit, An Introduction to Classical Music</title>
      <link>https://nicolaiarocci.com/book-review-language-of-the-spirit-an-introduction-to-classical-music/</link>
      <pubDate>Tue, 26 Oct 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-language-of-the-spirit-an-introduction-to-classical-music/</guid>
      <description>&lt;p&gt;In this introduction to classical music, Jan Swafford explains the different
musical periods and their differences. Each period has its introductory
chapter, followed by chapters dedicated to the most influential composers of
the era. The choice is comprehensive and well cared for, with the most relevant
names well-investigated both in biography and works. For each composer,
Swafford also offers some listening suggestions. Biographies thicken as we get
into the contemporary era. Here, some are limited to just a page or two while
others, obviously those of the author&amp;rsquo;s preferred composers, remain as thorough
as those of the older periods.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this introduction to classical music, Jan Swafford explains the different
musical periods and their differences. Each period has its introductory
chapter, followed by chapters dedicated to the most influential composers of
the era. The choice is comprehensive and well cared for, with the most relevant
names well-investigated both in biography and works. For each composer,
Swafford also offers some listening suggestions. Biographies thicken as we get
into the contemporary era. Here, some are limited to just a page or two while
others, obviously those of the author&rsquo;s preferred composers, remain as thorough
as those of the older periods.</p>
<p>The introductory chapters to various musical eras (Baroque, Classical,
Romantic, Modernism and beyond) were, for me, the most interesting ones. In
these chapters, Swafford explains the changes in society, technology and taste
that influenced the musical styles, themselves a revelation of the spirit of
the time. In this sense, Language of the Spirit is not just a classical music
book but also a historical essay, often sharp and full of intriguing
information on the periods crossed.</p>
<p>The author&rsquo;s effort in using simple language, understandable even to the
uninitiated, is evident, and the goal is well achieved, for the most part.
Sometimes, however, albeit very rarely, it goes into the technical, where
someone like me, who lacks a solid background, might struggle.</p>
<p><img alt="Language of the Spirit: An Introduction to Classical Music" loading="lazy" src="/images/language-of-the-spirit.jpg#right">
The recommended listenings are excellent. For every single one, I wanted to
stop reading and listen to it. That&rsquo;s the approach recommended by the author,
but I never managed, too eager to finish the chapter. I then tried to make
a Spotify playlist out of them, failing miserably because of my pedantry;
I only wanted the suggested executions, often missing on Spotify.</p>
<p>Language of the Spirit is a recommended introduction to classical music and its
history. It allows the reader to collect a phenomenal list of composers and
their works while, at the same time, delving into the momentous changes faced
by (mainly European) society over the last few centuries.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I met with the wolves</title>
      <link>https://nicolaiarocci.com/i-met-with-the-wolves/</link>
      <pubDate>Wed, 20 Oct 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-met-with-the-wolves/</guid>
      <description>&lt;p&gt;I sit under a wild apple tree at the edge of the clearing. Like a plant,
I absorb the mild October sun. At the same time, I attentively listen to the
sounds of the forest. Suddenly I hear a stomping of dry leaves about twenty
meters ahead of me, slightly to my right. A wolf emerges out of the thicket. He
stops for a moment, glances around, then starts crossing the clearing. A few
moments and another wolf appears. After a brief pause, he follows his pal. They
parade right in front of me, sinuous, silent, and feral. They do not see or
hear me, and yet I am right there, by their side, in plain sight&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;. It is all
over in a few seconds. The couple leaves the clearing and disappears into the
forest. I stand sitting there, shocked and in complete awe.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I sit under a wild apple tree at the edge of the clearing. Like a plant,
I absorb the mild October sun. At the same time, I attentively listen to the
sounds of the forest. Suddenly I hear a stomping of dry leaves about twenty
meters ahead of me, slightly to my right. A wolf emerges out of the thicket. He
stops for a moment, glances around, then starts crossing the clearing. A few
moments and another wolf appears. After a brief pause, he follows his pal. They
parade right in front of me, sinuous, silent, and feral. They do not see or
hear me, and yet I am right there, by their side, in plain sight<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. It is all
over in a few seconds. The couple leaves the clearing and disappears into the
forest. I stand sitting there, shocked and in complete awe.</p>
<p>Incredibly, the scene above is real. It happened to me last Sunday, in the wild
Apennines, in a place I&rsquo;ve been visiting for years. I&rsquo;ve seen a lot of animals
there: wild boar, deer, badgers, foxes. I knew wolves frequent the area but
meeting them, in the plain day? No way. I dreamed about it, of course, but
never expected it would really happen.  I had goosebumps, and I still have them
now as I write this. I keep telling myself it&rsquo;s impossible. And yet, I have
photos on my cellphone. In the heat of the moment, I somehow managed to snap
a couple. My family confirms the wolves. It was not a dream.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>In hindsight, I think that having been sitting there motionless and not producing any sound for a long time did the trick. By pure luck, I also happened to be downwind to them.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Drama going on at the .NET Foundation</title>
      <link>https://nicolaiarocci.com/drama-going-on-at-the-.net-foundation/</link>
      <pubDate>Thu, 07 Oct 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/drama-going-on-at-the-.net-foundation/</guid>
      <description>&lt;p&gt;A few months after I released my first &lt;a href=&#34;https://fatturaelettronicaopensource.org/&#34;&gt;.NET open source project&lt;/a&gt; (a niche
one targeting the Italian fintech world), I was contacted by a representative
of Team Digitale, the digital innovation branch of the Italian Public
Administration. He suggested joining the Developers Italia initiative and
moving my project to the their organization on GitHub &amp;ldquo;to enjoy
enhanced visibility and broaden the audience&amp;rdquo;. I politely refused. I did not
doubt my counterpart&amp;rsquo;s good faith. At the same time, I was concerned about the
possible long-term consequences of a seemingly easy move. Moving a GitHub
project away from your profile or an organization you control means ceding
control over it. I was assured I would keep control of the project. But what
happens if sometime in the future, when people in charge might even have
changed, they revoke my access rights? As long as I am involved with my
project, I should be in control. Also, I was not convinced that the move would
help promote the project. We live in the search-engine age; people search for
solutions to their problems. I was, and still am, confident that if I did my
due diligence and my project is any good, people will find it&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few months after I released my first <a href="https://fatturaelettronicaopensource.org/">.NET open source project</a> (a niche
one targeting the Italian fintech world), I was contacted by a representative
of Team Digitale, the digital innovation branch of the Italian Public
Administration. He suggested joining the Developers Italia initiative and
moving my project to the their organization on GitHub &ldquo;to enjoy
enhanced visibility and broaden the audience&rdquo;. I politely refused. I did not
doubt my counterpart&rsquo;s good faith. At the same time, I was concerned about the
possible long-term consequences of a seemingly easy move. Moving a GitHub
project away from your profile or an organization you control means ceding
control over it. I was assured I would keep control of the project. But what
happens if sometime in the future, when people in charge might even have
changed, they revoke my access rights? As long as I am involved with my
project, I should be in control. Also, I was not convinced that the move would
help promote the project. We live in the search-engine age; people search for
solutions to their problems. I was, and still am, confident that if I did my
due diligence and my project is any good, people will find it<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Unfortunately, the worst-case scenario pictured above, or worse, appears to
be happening these days, not to me, but to the many open-source maintainers
who, in recent years, agreed to move their projects under the .NET Foundation
umbrella.  The drama is unfolding in these very same hours, and it is
painful. On my Twitter feed, I first noticed <a href="https://twitter.com/eric_sink/status/1445096990153613323">Eric Sink&rsquo;s note</a> on the issue.
The next day, a <a href="https://www.theregister.com/2021/10/05/microsoft_net_foundation_under_fire/">detailed article</a> surfaces on The Register. Then, just
yesterday, the Executive Director of the DNF posted an <a href="https://github.com/dotnet-foundation/Home/discussions/39">I am Sorry</a> message on
GitHub, which most maintainers consider disappointing, to say the least.
Maintainers see the ownership of their projects being moved over to DNF. Some
projects are transferred to GitHub Enterprise for no apparent reason. DNF
Executive Director opened a Pull Request, which was closed by the maintainers
and then reopened (twice!) by the Director (who also happens to be a former
maintainer). You can get all the details at the links above. The I am Sorry
thread is especially worth reading.</p>
<p>I think the foundation is well-intentioned. I question whether independent
open-source projects should belong there, though—maybe very few major and
commercially inclined ones. To offer legal protection, DNF needs some control
over its projects, and that&rsquo;s something not every maintainer is willing to give
away. On the other hand, maintainers might have underestimated the consequences
of moving their projects to DNF. I can feel their pain.</p>
<p>Overall, this is all concerning. As someone <a href="https://news.ycombinator.com/item?id=28759630">commented</a> on Hacker News, with the
.NET ecosystem, Microsoft has made so many surprisingly good moves in recent
years that there is room for a couple of fuck-ups, but this is a big one.
Besides, most maintainers involved in this drama are highly influential and
very well respected individuals in the .NET world. The DNF needs to get its
acts together and react immediately, at the risk of losing all of its credibility.</p>
<p><em>Update:</em> Executive director [has resigned][7]. Updates from DNF are due as
earsly as next week.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>One year later, someone from the same team got in touch and proposed the move again. I refused for the same reasons. The story is actually longer than that. A few months later, I was also invited to join Team Digitale. I even had a brief video call with their recruiter. I chukled when he realized I was a grey beard, not the typical just-out-of-college boy or girl they usually head-hunt.
[7]: <a href="https://github.com/dotnet-foundation/Home/discussions/40">https://github.com/dotnet-foundation/Home/discussions/40</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The word for web is forest</title>
      <link>https://nicolaiarocci.com/the-word-for-web-is-forest/</link>
      <pubDate>Thu, 30 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-word-for-web-is-forest/</guid>
      <description>&lt;p&gt;When I read &lt;em&gt;Entangled Life: How Fungi Make Our Worlds, Change Our Minds
&amp;amp; Shape Our Futures&lt;/em&gt; by Merlin Sheldrake&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;, I was stunned by the scale and
importance of the mycorrhizal network that lies beneath the surface of any
given forest in the world. The &amp;ldquo;wood wide web&amp;rdquo;, as scientists started to call
it, sounded like the perfect metaphor for such an incredibly efficient,
symbiotic relation between fungi and trees.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When I read <em>Entangled Life: How Fungi Make Our Worlds, Change Our Minds
&amp; Shape Our Futures</em> by Merlin Sheldrake<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, I was stunned by the scale and
importance of the mycorrhizal network that lies beneath the surface of any
given forest in the world. The &ldquo;wood wide web&rdquo;, as scientists started to call
it, sounded like the perfect metaphor for such an incredibly efficient,
symbiotic relation between fungi and trees.</p>
<p>In <a href="https://newpublic.org/article/1572/the-word-for-web-is-fores://newpublic.org/article/1572/the-word-for-web-is-forest">The Word for Web is Forest</a><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, Claire L. Evans brilliantly reverses the
perspective. If the wood wide web metaphor holds, we can see the world wide web
as a live, intermingled network of interconnected, initially decentralized and
perhaps symbiotic entities. The issues we face in the modern web are not
dissimilar from those faced by ill forests worldwide.</p>
<blockquote>
<p>The wood wide web has been a powerhouse metaphor for popularizing the
mutualistic relationships of healthy forests. But like a struggling forest,
the web is no longer healthy. It has been wounded and depleted in the pursuit
of profit. Going online today is not an invigorating walk through a green
woodland—it’s rush-hour traffic alongside a freeway median of diseased trees,
littered with the detritus of late capitalism. If we want to repair this
damage, we must look to the wisdom of the forest and listen to ecologists
like Simard when they tell us just how sustainable, interdependent,
life-giving systems work.</p></blockquote>
<p>Suzane Simard, the Canadian ecologist who revealed the cooperative nature of
forests, explains that Mother Trees (the eldest trees) serve as &ldquo;central hubs
of the wood wide web.  They are the strongest, the most resource-rich, with
taproots stretching far beneath the earth.&rdquo; When a Mother Tree dies, it shares
its resources with the forest while many other Mothers guarantee the
continuity and integrity of the ecosystem. This used to be the case with the
Web too, but not anymore.</p>
<blockquote>
<p>The web isn’t what it used to be. When the editors of Nature compared
mycorrhizal fungi to a computer network, the web was still predominantly
peer-to-peer, its users sharing their thoughts on personal home pages and
homespun message-boards. Online advertising was in its infancy. But as the
web has centralized, it has strayed further and further from the ideal
presented by the wood wide web [..] By selecting for the most inflammatory
and emotional content, Big Tech has algorithmically weeded the forest into
a field of commercial timber.</p></blockquote>
<p>Evans then proceeds to suggest that we should probably strive to imitate
mycorrhizal networks and (re?)build decentralized networks, with &ldquo;Mother nodes
&ndash; sites in the network bearing a responsibility of care.&rdquo; I&rsquo;ll stop here. Read
the <a href="https://newpublic.org/article/1572/the-word-for-web-is-fores://newpublic.org/article/1572/the-word-for-web-is-forest">article</a> now, there is a lot to absorb. She doesn&rsquo;t go into the details
of her proposed solution, but offers us an original, courageous and pregnant
point of view to consider.</p>
<p><img alt="Entangled life" loading="lazy" src="/images/entangled_life.jpg#center"></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>Entangled Life</em> is a great read. It also features one of the most beautiful book covers of the modern age.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>The just-recently published magazine hosting the article, <a href="https://newpublic.org/">New_Public</a>, appears as a promising source of future content.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>An nginx playground</title>
      <link>https://nicolaiarocci.com/an-nginx-playground/</link>
      <pubDate>Mon, 27 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/an-nginx-playground/</guid>
      <description>&lt;p&gt;Every single time I need nginx, I end up spending way too much time fiddling
around with its configuration. If you&amp;rsquo;re like me, rejoice! Julia Evans built
a lovely, helpful little tool called nginx playground.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hello! On Wednesday I was talking to a friend about how it would be cool to
have an nginx playground website where you can just paste in an nginx config
and test it out. And then I realized it might actually be pretty easy to
build, so got excited and started coding and I built it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Every single time I need nginx, I end up spending way too much time fiddling
around with its configuration. If you&rsquo;re like me, rejoice! Julia Evans built
a lovely, helpful little tool called nginx playground.</p>
<blockquote>
<p>Hello! On Wednesday I was talking to a friend about how it would be cool to
have an nginx playground website where you can just paste in an nginx config
and test it out. And then I realized it might actually be pretty easy to
build, so got excited and started coding and I built it.</p></blockquote>
<p>The playground is available <a href="https://nginx-playground.wizardzines.com/">here</a>. Make sure you also read <a href="https://jvns.ca/blog/2021/09/24/new-tool--an-nginx-playground/">Julia&rsquo;s
introduction</a> to the tool. In there, she recounts why and, more importantly,
how she built it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What getting old really feels like</title>
      <link>https://nicolaiarocci.com/what-getting-old-really-feels-like/</link>
      <pubDate>Sun, 26 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/what-getting-old-really-feels-like/</guid>
      <description>&lt;p&gt;In a new study published in Ageing and Society, researchers Sam Carr and Chao
Fang spent over 130 hours interviewing older people to understand what it&amp;rsquo;s
like to get old and cope with loneliness. The Conversation UK features their
report, appropriately titled &lt;a href=&#34;https://theconversation.com/loneliness-loss-and-regret-what-getting-old-really-feels-like-new-study-157731&#34;&gt;Loneliness, loss and regret: what getting old really
feels like&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We found that ageing brings about a series of inevitable losses that deeply
challenge people’s sense of connection to the world around them. Loneliness
can often be oversimplified or reduced to how many friends a person has or
how often they see their loved ones.But a particular focus for us was to
better understand what underpins feelings of loneliness in older people on
a deeper level. Researchers have used the term “existential loneliness” to
describe this deeper sense of feeling “separated from the world” – as though
there is an insurmountable gap between oneself and the rest of society. Our
objective was to listen carefully to how people experienced and responded to
this.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In a new study published in Ageing and Society, researchers Sam Carr and Chao
Fang spent over 130 hours interviewing older people to understand what it&rsquo;s
like to get old and cope with loneliness. The Conversation UK features their
report, appropriately titled <a href="https://theconversation.com/loneliness-loss-and-regret-what-getting-old-really-feels-like-new-study-157731">Loneliness, loss and regret: what getting old really
feels like</a>.</p>
<blockquote>
<p>We found that ageing brings about a series of inevitable losses that deeply
challenge people’s sense of connection to the world around them. Loneliness
can often be oversimplified or reduced to how many friends a person has or
how often they see their loved ones.But a particular focus for us was to
better understand what underpins feelings of loneliness in older people on
a deeper level. Researchers have used the term “existential loneliness” to
describe this deeper sense of feeling “separated from the world” – as though
there is an insurmountable gap between oneself and the rest of society. Our
objective was to listen carefully to how people experienced and responded to
this.</p></blockquote>
<p>A difficult yet worthwhile read.</p>
]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET 6 Migration Cheatsheet and FAQ</title>
      <link>https://nicolaiarocci.com/asp.net-6-migration-cheatsheet-and-faq/</link>
      <pubDate>Thu, 23 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/asp.net-6-migration-cheatsheet-and-faq/</guid>
      <description>&lt;p&gt;David Fowler has a very informative gist up on GitHub. It&amp;rsquo;s titled [Migration
to ASP.NET Core. NET6][3] and it&amp;rsquo;s filled with details, recipes and FAQs on
migrating an ASP.NET Core 5 web app to ASP.NET Core 6&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;. The focus is on the
new, streamlined hosting model, also known as Minimal APIs&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;. To be clear,
You don&amp;rsquo;t &lt;em&gt;have&lt;/em&gt; to move to the new model. As the FAQ section emphasizes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do I have to migrate to the new hosting model&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>David Fowler has a very informative gist up on GitHub. It&rsquo;s titled [Migration
to ASP.NET Core. NET6][3] and it&rsquo;s filled with details, recipes and FAQs on
migrating an ASP.NET Core 5 web app to ASP.NET Core 6<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. The focus is on the
new, streamlined hosting model, also known as Minimal APIs<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. To be clear,
You don&rsquo;t <em>have</em> to move to the new model. As the FAQ section emphasizes:</p>
<blockquote>
<p>Do I have to migrate to the new hosting model</p>
<p>No, you don&rsquo;t have to. It&rsquo;s the preferred way to host ASP.NET Core
applications from .NET 6 and onwards but you aren&rsquo;t forced to change your
project layout. This means you can upgrade from .NET 5 to .NET 6.0 by
changing the target framework in your project file from net5.0 to net6.0.</p></blockquote>
<p>.NET6 Release Candidate is out, so the guide is unlikely to receive updates,
but I&rsquo;m sure that David will be ready to do so if required.</p>
<p>We are about to release several brand new web services in the coming weeks.
They are all ASP.NET 5, currently in beta, but before release we&rsquo;re likely to
upgrade them to NET6. NET6 is LTS, NET5 isn&rsquo;t, and offers significant
advantages, remarkable [performance gains][2] included.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The Core tag was dropped in NET5, and it was a good move. The reason why the insist on using it with ASP.NET eludes me.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://nicolaiarocci.com/will-.net-6-minimal-apis-turn-heads/">Will .NET 6 Mininal APIs turn heads?</a> collects my thoughts on the subject.
[2]: <a href="https://nicolaiarocci.com/performance-improvements-in-.net6/">https://nicolaiarocci.com/performance-improvements-in-.net6/</a>
[3]: <a href="https://gist.github.com/davidfowl/0e0372c3c1d895c3ce195ba983b1e03d">https://gist.github.com/davidfowl/0e0372c3c1d895c3ce195ba983b1e03d</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Nausea</title>
      <link>https://nicolaiarocci.com/book-review-nausea/</link>
      <pubDate>Wed, 22 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-nausea/</guid>
      <description>&lt;p&gt;Antoine Roquentin, the protagonist of the novel, is a former adventurer who has
been living for three years in Bouville, a fictional French seaport town,
researching the life of an 18th-century diplomat. During his previous life
around the world, Antoine has seen many places, met many interesting people,
done exciting things. For the last three years, however, he&amp;rsquo;s been alone in
Bouville. He has no friends and no desire to make some or meet anyone. He&amp;rsquo;s
interested in nothing, not even in his work that he keeps neglecting. His days
are mostly spent walking around town, listening to conversations and observing
people around him. A &amp;ldquo;sweeting sickness&amp;rdquo; he calls nausea increasingly impinges
on almost everything he does and enjoys.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Antoine Roquentin, the protagonist of the novel, is a former adventurer who has
been living for three years in Bouville, a fictional French seaport town,
researching the life of an 18th-century diplomat. During his previous life
around the world, Antoine has seen many places, met many interesting people,
done exciting things. For the last three years, however, he&rsquo;s been alone in
Bouville. He has no friends and no desire to make some or meet anyone. He&rsquo;s
interested in nothing, not even in his work that he keeps neglecting. His days
are mostly spent walking around town, listening to conversations and observing
people around him. A &ldquo;sweeting sickness&rdquo; he calls nausea increasingly impinges
on almost everything he does and enjoys.</p>
<blockquote>
<p>Something has happened to me, I can&rsquo;t doubt it any more. It came as an
illness does, not like an ordinary certainty, not like anything evident. It
came cunningly, little by little; I felt a little strange, a little put out,
that&rsquo;s all. Once established it never moved, it stayed quiet, and I was able
to persuade myself that nothing was the matter with me, that it was a false
alarm. And now, it&rsquo;s blossoming.</p></blockquote>
<p>He has a relationship with a woman, but it is exclusively carnal: the two
exchange almost no words. Selt-Taught Man, an individual who spends his time at
the local library reading all books in alphabetical order, is one of his few
acquaintances. When Self-Taught Man invites Antoine for lunch, he notes on his
diary: &ldquo;I had as much desire to eat with him as I had to hang myself.&rdquo; Antoine
has no interest in relationships. They take too much effort.</p>
<blockquote>
<p>When you live alone you no longer know what it is to tell a story: the
plausible disappears at the same time as the friends.</p></blockquote>
<p><img alt="Nausea, by Jean Paul Sartre" loading="lazy" src="/images/nausea.jpg#right">
Antoine feels like he never lived but only existed. These days, we would
probably call Antoine&rsquo;s sickness with a different name, depression maybe. If
you ever felt like Antoine, Nausea is going to be a difficult read. If you
didn&rsquo;t, I suspect it will be hard for you to feel any sympathy for the
protagonist. Sartre writes beautifully, with razor-sharp precision. Despite his
attempts to refuse it, he won the Nobel Prize in Literature in 1964. Nausea was
Sartre&rsquo;s debut novel, and he always considered it his best fictional work.
Nausea, by Jean-Paul Sartre, is a challenging but rewarding read. I think
Sartre goes straight amongst the masters at describing the human condition.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The American Style of quotation mark punctuation makes no sense</title>
      <link>https://nicolaiarocci.com/the-american-style-of-quotation-mark-punctuation-makes-no-sense/</link>
      <pubDate>Thu, 16 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-american-style-of-quotation-mark-punctuation-makes-no-sense/</guid>
      <description>&lt;p&gt;Years ago, I &lt;a href=&#34;http://www.endore.it/Arretrati/9/Articoli/SuTolkienELeFiabe.pdf&#34;&gt;translated&lt;/a&gt; an essay by Terry Windling, &lt;a href=&#34;https://accademia.tolkieniana.net/tesi/endicott/tlkefiabeng.html&#34;&gt;On Tolkien and
Fairie-Stories&lt;/a&gt;, from American English to Italian. I remember arguing with
the author about her use of periods in quotations. Each quotation would end
with a period before the closing mark. I was puzzled. We don&amp;rsquo;t do that in
Italy. More importantly, I read many English texts where the period was left
outside the quotation itself. She insisted that her style was correct&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Years ago, I <a href="http://www.endore.it/Arretrati/9/Articoli/SuTolkienELeFiabe.pdf">translated</a> an essay by Terry Windling, <a href="https://accademia.tolkieniana.net/tesi/endicott/tlkefiabeng.html">On Tolkien and
Fairie-Stories</a>, from American English to Italian. I remember arguing with
the author about her use of periods in quotations. Each quotation would end
with a period before the closing mark. I was puzzled. We don&rsquo;t do that in
Italy. More importantly, I read many English texts where the period was left
outside the quotation itself. She insisted that her style was correct<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Today I learn that, in English, there are in fact two different and conflicting
quotation mark punctuation styles: American and British.</p>
<blockquote>
<p>There are different ways of combining quotation and punctuation marks. In the
American style, you almost always put periods and commas inside the quotation
marks [&hellip;] In the British style, however, you put periods and commas outside
the quotation marks, unless they are part of a complete sentence that is
fully contained between the quotation marks:</p></blockquote>
<p>In <a href="https://www.erichgrunewald.com/posts/the-american-style-of-quotation-mark-punctuation-makes-no-sense">The American Style of Quotation Mark Punctuation Makes No Sense</a> the
author illustrates the differences between the two styles, then argues that
&ldquo;the British approach makes more sense, so use that one.&rdquo; Whoops.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>In my rendition I moved the period after the end mark. Different languages, different rules.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Daft Punk&#39;s legendary Alive 2007 concert with remastered audio and 4K video</title>
      <link>https://nicolaiarocci.com/daft-punks-legendary-alive-2007-concert-with-remastered-audio-and-4k-video/</link>
      <pubDate>Wed, 08 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/daft-punks-legendary-alive-2007-concert-with-remastered-audio-and-4k-video/</guid>
      <description>&lt;p&gt;Someone did it &amp;ndash;the perfect Daft Punk tribute after their break up. Also ideal
for those hard-coding sessions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For the first time in 14 years, experience Daft Punk like never before! The
first professionally recorded live show; revived meticulously by remastering
and restoring the audio and video. The Alive 2007 show is considered a staple
in live performances featuring the signature &amp;lsquo;Pyramid&amp;rsquo; and groundbreaking
visuals, which is now complemented by a fully remastered audio track which
aims to maximize the experience. Presenting the ultimate authentic Daft Punk
experience.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Someone did it &ndash;the perfect Daft Punk tribute after their break up. Also ideal
for those hard-coding sessions.</p>
<blockquote>
<p>For the first time in 14 years, experience Daft Punk like never before! The
first professionally recorded live show; revived meticulously by remastering
and restoring the audio and video. The Alive 2007 show is considered a staple
in live performances featuring the signature &lsquo;Pyramid&rsquo; and groundbreaking
visuals, which is now complemented by a fully remastered audio track which
aims to maximize the experience. Presenting the ultimate authentic Daft Punk
experience.</p></blockquote>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/QmR4zLcORNc?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

]]></content:encoded>
    </item>
    <item>
      <title>Hiking the Translagorai 25 years later</title>
      <link>https://nicolaiarocci.com/hiking-the-translagorai-25-years-later/</link>
      <pubDate>Mon, 06 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/hiking-the-translagorai-25-years-later/</guid>
      <description>&lt;p&gt;A couple of weeks ago I went hiking the Translagorai, an 80 km-long trail that
traverses the whole Lagorai mountain range in the Alps. The route takes place
in a mountain environment where the anthropic pressure is reduced, especially
compared to the more famous nearby Dolomites destinations. There are very few
managed huts, most of which do not offer overnight stays, and relatively few
bivouacs (emergency huts, usually dislocated in the most isolated areas along
the hike). These characteristics make the Translagorai very attractive to
those looking for wild hikes to be travelled in complete self-sufficiency
with tent, food, etc. There is rich evidence (remains of barracks, trenches)
dating back to the First World War. Translagorai is a brutal, wild, restless,
and beautiful route reserved for well-trained, experienced mountain hikers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A couple of weeks ago I went hiking the Translagorai, an 80 km-long trail that
traverses the whole Lagorai mountain range in the Alps. The route takes place
in a mountain environment where the anthropic pressure is reduced, especially
compared to the more famous nearby Dolomites destinations. There are very few
managed huts, most of which do not offer overnight stays, and relatively few
bivouacs (emergency huts, usually dislocated in the most isolated areas along
the hike). These characteristics make the Translagorai very attractive to
those looking for wild hikes to be travelled in complete self-sufficiency
with tent, food, etc. There is rich evidence (remains of barracks, trenches)
dating back to the First World War. Translagorai is a brutal, wild, restless,
and beautiful route reserved for well-trained, experienced mountain hikers.</p>
<p>I did the route 25-ish years ago with a couple of friends. A tent, some food,
super-heavy backpacks, and off we went, up and down the ravines. Overall, it
was a great experience that also destroyed us. I have fond memories of those
days when</p>
<blockquote>
<p>the grass was greener, the light was brighter, with friends surrounded, the nights of wonder.</p></blockquote>
<p>I never thought I would go back and do the route again, especially not at 50.
As the saying goes, however, never say never. My nephew, to whom I somehow
passed on my love for wilderness, asked for advice on an exciting route to
take with a friend. I sent him a long email with a series of proposals for
two-three day tours. In the end, I made the mistake of mentioning the
Translagorai as a more brutal but satisfying alternative. I certainly didn&rsquo;t
expect them to choose it; I added it more as a comparison than anything else.
Yet, they were so excited about the prospect of venturing out on that route
that I couldn&rsquo;t convince them otherwise. A little apprehensive about the
difficulties they would face (they don&rsquo;t have much experience) and sensing
untold fears during the preparation chats, I ended up hinting that I could
accompany them if so they wished. I expected a polite refusal. Why would two
twenty-somethings want to spend four days alone in the wilderness with a gruff
fifty-year-old? To my surprise, they immediately said yes, and with great
relief, I think. I was part of the team. I couldn&rsquo;t believe it. Twenty-five
years later, I was going back, and I only had 48 hours to prepare.</p>
<p>Granted, we met more people than I expected or remembered, but other than that,
the route has remained pretty much unchanged. Back in the day, we didn&rsquo;t follow
the official, high-altitude course, which always stays on the crest of the
Lagorai range. This time we did, and I found it even more beautiful and
satisfying. I suspect I&rsquo;m more fit today than I was in my youth, which might
explain how I could happily follow these two young war machines for four full
days, high and down the trail, like there was no tomorrow. The two boys
impressed me beyond belief. If I provided some help, I think it was because of
the mountaineering experience, but sure as hell, they did not need help with
motivation and performance. When I made my first trip there, I&rsquo;m sure we
suffered much, much more pain, and we were about their age. Hiking equipment
has improved tenfold since the mid-90s, but today backpacks are still heavy.
Mountains, they certainly didn&rsquo;t flatten at all. We slept in tents and ate
our food, usually camping by some small, beautiful mountain lake or mountain
pass. That, also, hasn&rsquo;t changed.  I am happy to report that Translagorai is
still the king of badass wilderness routes in the Alps. Go there only if you
are ready, however, or it will tear you apart.</p>
<p><img loading="lazy" src="/images/translagorai3.jpg"> <em>If you look closely, you can see me standing between our
two tents pitched in the clearing. This pic was taken by the war
machines, who climbed the fork 200mt above the camp just to &ldquo;see if we get signal.&rdquo;</em>
<img loading="lazy" src="/images/translagorai1.jpg"> <em>Yours truly, overlooking the glacial valley some 1000
meters below</em>
<img loading="lazy" src="/images/translagorai2.jpg"> <em>Lago Brutto, one of the many beautiful small
lakes along the route</em>
<img loading="lazy" src="/images/translagorai4.jpg"> <em>Another campsite. We were supposed to spend the
night in a First-World War barrack along the route, but when we got there late
in the evening, it was in such poor conditions that we decided to continue
another hour, then detour a little to reach a small lake, past a mountain fork,
which the map showed as a possible pitch site. Situations like these is why you
want to have someone experienced with you.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Get the Fucking Vaccine Already, You Fucking Fucks</title>
      <link>https://nicolaiarocci.com/get-the-fucking-vaccine-already-you-fucking-fucks/</link>
      <pubDate>Sat, 04 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/get-the-fucking-vaccine-already-you-fucking-fucks/</guid>
      <description>&lt;p&gt;Wendy Molyneux, &lt;a href=&#34;https://www.mcsweeneys.net/articles/oh-my-fucking-god-get-the-fucking-vaccine-already-you-fucking-fucks&#34;&gt;writing unabashedly&lt;/a&gt; for McSweeney&amp;rsquo;s, summarizes all I have
to say on the COVID vaccine and never dared to say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You think vaccines don’t fucking work? Oh, fuck off into the trash, you
attention-seeking fuckworm-faced shitbutt. This isn’t even a point worth
discussing, you fuck-o-rama fuck-stival of ignorance. Vaccines got rid of
smallpox and polio and all the other disgusting diseases that used to kill
off little fucks like you en masse. Your relatives got fucking vaccinated and
let you live, and now here you are signing up to be killed by a fucking
disease against which there is a ninety-nine-percent effective vaccine. You
fucking moron. Go in the fucking ocean and fuck a piranha. Fuck. Fuck that.
Fuck you. Get vaccinated.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wendy Molyneux, <a href="https://www.mcsweeneys.net/articles/oh-my-fucking-god-get-the-fucking-vaccine-already-you-fucking-fucks">writing unabashedly</a> for McSweeney&rsquo;s, summarizes all I have
to say on the COVID vaccine and never dared to say:</p>
<blockquote>
<p>You think vaccines don’t fucking work? Oh, fuck off into the trash, you
attention-seeking fuckworm-faced shitbutt. This isn’t even a point worth
discussing, you fuck-o-rama fuck-stival of ignorance. Vaccines got rid of
smallpox and polio and all the other disgusting diseases that used to kill
off little fucks like you en masse. Your relatives got fucking vaccinated and
let you live, and now here you are signing up to be killed by a fucking
disease against which there is a ninety-nine-percent effective vaccine. You
fucking moron. Go in the fucking ocean and fuck a piranha. Fuck. Fuck that.
Fuck you. Get vaccinated.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Performance improvements in .NET6</title>
      <link>https://nicolaiarocci.com/performance-improvements-in-.net6/</link>
      <pubDate>Fri, 03 Sep 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/performance-improvements-in-.net6/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m pretty psyched about the upcoming .NET6 release. I&amp;rsquo;ve already &lt;a href=&#34;https://nicolaiarocci.com/will-.net-6-minimal-apis-turn-heads/&#34;&gt;touched&lt;/a&gt;
on ASP.NET 6 Minimal APIs. Continuing on the long-established tradition, the
team has also worked hard on the performance side of things. File IO, for
example, is seeing &lt;a href=&#34;https://devblogs.microsoft.com/dotnet/file-io-improvements-in-dotnet-6/&#34;&gt;impressive gains&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For .NET 6, we have made FileStream much faster and more reliable, thanks to
an almost entire re-write. For same cases, the async implementation is now
a few times faster! We also recognized the need of having more
high-performance file IO features: concurrent reads and writes,
scatter/gather IO and introduced new APIs for them. TL;DR File I/O is better,
stronger, faster!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m pretty psyched about the upcoming .NET6 release. I&rsquo;ve already <a href="https://nicolaiarocci.com/will-.net-6-minimal-apis-turn-heads/">touched</a>
on ASP.NET 6 Minimal APIs. Continuing on the long-established tradition, the
team has also worked hard on the performance side of things. File IO, for
example, is seeing <a href="https://devblogs.microsoft.com/dotnet/file-io-improvements-in-dotnet-6/">impressive gains</a>:</p>
<blockquote>
<p>For .NET 6, we have made FileStream much faster and more reliable, thanks to
an almost entire re-write. For same cases, the async implementation is now
a few times faster! We also recognized the need of having more
high-performance file IO features: concurrent reads and writes,
scatter/gather IO and introduced new APIs for them. TL;DR File I/O is better,
stronger, faster!</p></blockquote>
<p>If you have the time, make sure you read the whole blog post. Learning about
the low-level details on how they achieved such (pretty phenomenal) results is
fascinating. They&rsquo;re not stopping at file IO either. In another <a href="https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#is-that-all">lengthy blog
post</a>, they had to add a table of contents, or we would get lost in the myriad
of improvements.</p>
<blockquote>
<p>Don’t worry, I don’t cover all of them here, but grab a large mug of your
favorite hot beverage, and settle in: this post takes a rip-roarin’ tour
through ~400 PRs that, all together, significantly improve .NET performance
for .NET 6.</p></blockquote>
<p>There are <a href="https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-7/">a</a> <a href="https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-6/">ton</a> <a href="https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-5/">of</a> <a href="https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4/">new</a> <a href="https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-3/">things</a> <a href="https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-2/">coming</a> <a href="https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/">up</a>,
too, of course.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Proud tobea Flyer</title>
      <link>https://nicolaiarocci.com/book-review-proud-tobea-flyer/</link>
      <pubDate>Sat, 28 Aug 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-proud-tobea-flyer/</guid>
      <description>&lt;p&gt;I happened across this book by pure chance. After having ice cream in our
favourite place in Milano Marittima, my wife and I visited a small street
market with all kinds of booths. Of course, there was a used book stand toward
which I immediately gravitated. A quick scan revealed nothing of interest, so
I moved along. But Serena, who arrived at the booth moments after I left, knew
more. A simple, no-frills, cardboard-covered book which carried a giant PROUD
2BEA FLYER title on the spine caught her attention. As she opened it and
flipped through the pages, she immediately knew this was a unique item I would
love to have, so she bought it (for cheap!) along with another one, then let it
slip into a shopping bag, and then reached an unaware me.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I happened across this book by pure chance. After having ice cream in our
favourite place in Milano Marittima, my wife and I visited a small street
market with all kinds of booths. Of course, there was a used book stand toward
which I immediately gravitated. A quick scan revealed nothing of interest, so
I moved along. But Serena, who arrived at the booth moments after I left, knew
more. A simple, no-frills, cardboard-covered book which carried a giant PROUD
2BEA FLYER title on the spine caught her attention. As she opened it and
flipped through the pages, she immediately knew this was a unique item I would
love to have, so she bought it (for cheap!) along with another one, then let it
slip into a shopping bag, and then reached an unaware me.</p>
<p><img alt="Proud 2bea flyer sample 1" loading="lazy" src="/images/proudtobeaflyer1.jpg#right">
When I spotted the book lying in the bag, I inquired about it. Serena took it
out of the bag and handed it over to me with a smile. Imagine my surprise,
amazement and gratitude when I started browsing through hundreds of beautiful
works of art, all in the form of club flyers from all ages and musical genres.</p>
<blockquote>
<p>In what can best be described a well of hip Club Culture Graphics, Proud
2 B a Flyer rounds up the most exciting party announcements made for the
street. Before the explosion of popular musical forms in the past 40 years
art associated with music has been in corporate hands, with music companies
and commercial artists, but the club flyer has changed all that. The
evolution of the club flyer mirrors the musical movements that have used its
simple direct from to capture the imagination of their audiences. The early
techno scene employed flyers to great effect and diverse musical scenes
caught on quickly. Proud 2BEA Flyer brilliantly documents the flyer stylings
of the electronica scene and also includes special sections featuring Jazz,
Hip Hop and Brazilian music. Other fascinating selections are found in
chapters such as Drawing, Series, Unusual Shapes and Regular Nights. (<a href="https://www.hoepli.it/libro/proud-2bea-flyer/9788886416474.html">source</a>)</p></blockquote>
<p><img alt="Proud 2bea flyer sample 2" loading="lazy" src="/images/proudtobeaflyer2.jpg#right">
And indeed, this is an excellent collection of inspiring, mesmerizing works<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.
No text, just flyers. I have never been much of a  clubbing person, but
I always followed the music, of course, and was fascinated by the graphical
world around it. This book brings back memories of an age now gone when there
were no smartphones, and you only happened to know about an event when and if
you were lucky enough to be in the right place at the right time, to have
a chance to come across one of these street flyers.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I am sure my friend <a href="https://emmaboshi.net/">Emmaboshi</a> would love this special item. Some research suggests that the author, Matteo Sola, might be from Bologna, the same place where Emma practices his art, so maybe he knows about this book, or perhaps personally knows the author.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>How to read Windows-1252 encoded files with .NETCore and .NET5&#43;</title>
      <link>https://nicolaiarocci.com/how-to-read-windows-1252-encoded-files-with-.netcore-and-.net5-/</link>
      <pubDate>Fri, 27 Aug 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-read-windows-1252-encoded-files-with-.netcore-and-.net5-/</guid>
      <description>&lt;p&gt;Another day, another lesson learned: modern .NET does not support the
Windows-1252 encoding out of the box. Today my colleague was happily porting
a legacy NET4+ app to NET6. As usual, the port was super-easy; it would compile
and run just fine, so he was surprised when the app crashed reading a few
specific XML files. That&amp;rsquo;s when I was called in. A closer inspection revealed
a pattern: all those crashing files were Windows 1252-encoded (the rest, a vast
majority, were UTF-8.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Another day, another lesson learned: modern .NET does not support the
Windows-1252 encoding out of the box. Today my colleague was happily porting
a legacy NET4+ app to NET6. As usual, the port was super-easy; it would compile
and run just fine, so he was surprised when the app crashed reading a few
specific XML files. That&rsquo;s when I was called in. A closer inspection revealed
a pattern: all those crashing files were Windows 1252-encoded (the rest, a vast
majority, were UTF-8.)</p>
<p>It turns out that under NETCore/NET5+, to read Windows-1252 encoded files, we
first need to take a dependency on <code>System.Text.Encoding.CodePages</code>:</p>
<pre><code>dotnet add package System.Text.Encoding.CodePages
</code></pre>
<p>Then, we register a <code>CodePagesEncodingProvider</code> instance from the package:</p>
<pre><code>Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
</code></pre>
<p>Finally, on creating the XmlReader instance, we can set the encoding. To do
that, we need to pass an <code>XmlParserContext</code> instance, which allows us to
specify custom encoding:</p>
<pre><code># Create the parser context and set the encoding
var context = new XmlParserContext(null, null, null, XmlSpace.None)
context.Encoding = Encoding.GetEncoding(1252);

# Use the custom parser when reading the Xml
using (var r = XmlReader.Create(fileName, null, context))
{
    ...
}
</code></pre>
<p>And sure enough, all those troublesome XML files are no problem anymore. It
works on all platforms: Linux, macOS, and Windows.  That&rsquo;s a lot of tinkering
for a small task that required no effort in the past. However, it makes sense
as .NET is now cross-platform, and we want to reduce the app&rsquo;s footprint as
much as possible.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to restore a single Postgres database from a pg_dumpall dump</title>
      <link>https://nicolaiarocci.com/how-to-restore-a-single-postgres-database-from-a-pg_dumpall-dump/</link>
      <pubDate>Wed, 25 Aug 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-restore-a-single-postgres-database-from-a-pg_dumpall-dump/</guid>
      <description>&lt;p&gt;Today I learned how to restore a single Postgres database from a global dump
generated with &lt;a href=&#34;https://www.postgresql.org/docs/current/app-pg-dumpall.html&#34;&gt;&lt;code&gt;pg_dumpall&lt;/code&gt;&lt;/a&gt;. Now, &lt;code&gt;pg_dumpall&lt;/code&gt; is handy when you want to back
up an entire Postgres cluster. It will dump all databases and global objects in
a single text file. In contrast, &lt;a href=&#34;https://www.postgresql.org/docs/current/app-pgdump.html&#34;&gt;&lt;code&gt;pg_dump&lt;/code&gt;&lt;/a&gt;, the go-to tool for Postgres
backups, offers more control but only works with a single database and doesn&amp;rsquo;t
dump global objects, such as the roles/users linked to the database.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned how to restore a single Postgres database from a global dump
generated with <a href="https://www.postgresql.org/docs/current/app-pg-dumpall.html"><code>pg_dumpall</code></a>. Now, <code>pg_dumpall</code> is handy when you want to back
up an entire Postgres cluster. It will dump all databases and global objects in
a single text file. In contrast, <a href="https://www.postgresql.org/docs/current/app-pgdump.html"><code>pg_dump</code></a>, the go-to tool for Postgres
backups, offers more control but only works with a single database and doesn&rsquo;t
dump global objects, such as the roles/users linked to the database.</p>
<p>The problem with <code>pg_dumpall</code> comes when you want to restore just one database
from the dump file. That&rsquo;s not supported out of the box, but it is achievable
with some tinkering.</p>
<p>The <code>pg_dumpall</code> dump is a plain text file that contains all the SQL commands
needed to restore the cluster. All database instructions are there as well; we
only need to extract them. Say we have one &ldquo;mydb&rdquo; database that we need to
retrieve. Open the dump file and look for a string starting with &ldquo;connect
mydb&rdquo;. That&rsquo;s where our database instructions begin. Then look for the first
occurrence of &ldquo;PostgreSQL database dump complete&rdquo;. That&rsquo;s where the
instructions end. <a href="https://stackoverflow.com/a/48866503/323269">This</a> script, which I have to say makes clever use of <code>sed</code>,
will do just that for us:</p>
<pre><code>#!/bin/bash
[ $# -lt 2 ] &amp;&amp; { echo &quot;Usage: $0 &lt;postgresql dump&gt; &lt;dbname&gt;&quot;; exit 1; }
sed  &quot;/connect.*$2/,\$!d&quot; $1 | sed &quot;/PostgreSQL database dump complete/,\$d&quot;
</code></pre>
<p>The output will be to STDOUT; we want to pipe it into a file. If we named the
script <code>pg_extract.sh</code>, as I did, we&rsquo;d do:</p>
<pre><code>./pg_extract.sh dumpall.sql mydb &gt;&gt; mydb.dump
</code></pre>
<p>Now we have the specific DB dump, and we can restore it like this:</p>
<pre><code>psql (connection options) mydb &lt; mydb.dump
</code></pre>
<p>If the database still exists on the cluster, we first want to drop it, or we&rsquo;ll
only get error messages:</p>
<pre><code>psql (connection options) -d postgres -c &quot;DROP DATABASE IF EXISTS mydb&quot;
psql (connection options) -d postgres -c &quot;CREATE DATABASE mydb&quot;
</code></pre>
<p><code>DROP DATABASE</code> will fail if there are active connections. Either
<a href="https://stackoverflow.com/a/5408501/323269">force-drop</a> all active connections or tell your peers to leave the database
alone. Merging the above passages in a script is an option.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Travel is no cure for the mind</title>
      <link>https://nicolaiarocci.com/travel-is-no-cure-for-the-mind/</link>
      <pubDate>Mon, 23 Aug 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/travel-is-no-cure-for-the-mind/</guid>
      <description>&lt;p&gt;I stumbled upon a personal growth article this weekend, and that&amp;rsquo;s odd because
I tend to stay clear from such things. Yet I found it quite relevant, so much
that I thought I would &lt;a href=&#34;https://medium.com/personal-growth/travel-is-no-cure-for-the-mind-e449d3109d71&#34;&gt;share it&lt;/a&gt; (the delivery is also amusing, which is
something new for this kind of content).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s just another day… and you’re just doing what you need to do. You’re
getting things done, and the day moves forward in this continuous sequence of
checklists, actions, and respites. But at various moments of your routine,
you pause and take a good look at your surroundings. The scenes of your
everyday life. The blur of this all-too-familiar film. And you can’t help but
to wonder… If there is more to it all. For some reason — this country, this
city, this neighborhood, this particular street — is the place you are living
a majority of your life in. And it is this thought that allows a daydream to
seep in. You start thinking of all the other places you could be in this
world. Or more accurately, all the places you’d rather be in. Somewhere more
exciting. Somewhere new. Somewhere that can provide experiences that are
foreign to you.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I stumbled upon a personal growth article this weekend, and that&rsquo;s odd because
I tend to stay clear from such things. Yet I found it quite relevant, so much
that I thought I would <a href="https://medium.com/personal-growth/travel-is-no-cure-for-the-mind-e449d3109d71">share it</a> (the delivery is also amusing, which is
something new for this kind of content).</p>
<blockquote>
<p>It’s just another day… and you’re just doing what you need to do. You’re
getting things done, and the day moves forward in this continuous sequence of
checklists, actions, and respites. But at various moments of your routine,
you pause and take a good look at your surroundings. The scenes of your
everyday life. The blur of this all-too-familiar film. And you can’t help but
to wonder… If there is more to it all. For some reason — this country, this
city, this neighborhood, this particular street — is the place you are living
a majority of your life in. And it is this thought that allows a daydream to
seep in. You start thinking of all the other places you could be in this
world. Or more accurately, all the places you’d rather be in. Somewhere more
exciting. Somewhere new. Somewhere that can provide experiences that are
foreign to you.</p></blockquote>
<p>While I agree with the article, I&rsquo;d also mention that travel or putting some
distance from the Box of Daily Experience, as the author calls it, is a great
way to appreciate what we leave behind; to re-evaluate it from a different
perspective.</p>
<p>As I read the article, I kept thinking, this is not particularly original;
I read something like this before. Then, by the end of the piece, a note tells
us that the text is, in fact, an adaptation of Seneca&rsquo;s letter to Lucilius on
the subject of travel. Seneca&rsquo;s moral letters to Lucilius are just pure
awesomeness.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Nomadland</title>
      <link>https://nicolaiarocci.com/book-review-nomadland/</link>
      <pubDate>Sat, 21 Aug 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-nomadland/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Some call them homeless. The new nomads refer to themselves as &amp;lsquo;houseless&amp;rsquo;.
Many took to the road after their savings were obliterated by the Great
Recession. To keep their gas tanks and bellies full, they work long hours at
hard, physical jobs. In a time of flat wages and rising housing costs, they
have unshackled themselves from rent and mortgages as a way to get by. They
are surviving America.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Some call them homeless. The new nomads refer to themselves as &lsquo;houseless&rsquo;.
Many took to the road after their savings were obliterated by the Great
Recession. To keep their gas tanks and bellies full, they work long hours at
hard, physical jobs. In a time of flat wages and rising housing costs, they
have unshackled themselves from rent and mortgages as a way to get by. They
are surviving America.</p></blockquote>
<p><img alt="Nomadland book cover" loading="lazy" src="/images/nomadland_book_cover.jpg#right">
Jessica Bruder is a journalist. For three years, she followed the lives of
a group of nomads who live in their RVs or even in their cars, moving from one
seasonal work to the next in their pursuit to survive the collapse of their own
personal American Dream. Her writing is dry, concise, with little room for
personal feelings or ramblings, to the point that, at times, she sounds
distant, almost detached from the events being told. That isn&rsquo;t the case, as
you can tell by the second half of the book when she finally decides to take
the plunge and get herself a van to live herself the &ldquo;workcamper&rdquo; life. That is
a tipping point in the book. The author becomes the main character, the story
is personal, and the reader is more involved.</p>
<p>Bruder interviews many folks and followed a few of them in detail. Linda May,
amongst others, is the centrepiece of the story. Linda was 62 when she took
social security and was forced into living in a van. Most people living the
&ldquo;workcamper&rdquo; life are in what would be their retirement age. They are in their
60s, 70s and sometimes even 80s. Yet, they work very hard at their seasonal
jobs, like at Amazon warehouses as inventory scanners or in Minnesota and North
Dakota, for the seasonal harvest of sugar beets. These work experiences are
depicted with great detail. Bruder herself walked the plank and experienced how
demanding these assignments are on the body and the spirit (Amazon provides
painkillers to their aged employees). Despite all the difficulties, these
people carry on with great dignity and, often, upbeat attitude, well
represented by Linda, a lovely elderly woman.</p>
<p>I had no idea that the &ldquo;workcampers&rdquo; subculture existed in the USA. As someone
who has always been mildly fascinated by the RV life (like many others, we
sometimes fantasize about travelling the world in a camper when we retire),
I admit I was pretty shocked by this work, an engaging and very unsettling
read. I am grateful to Bruder for her hard-earned report.</p>
<blockquote>
<p>At one time there was a social contract that if you played by the rules (went
to school, got a job, and worked hard) everything would be fine. That’s no
longer true today. You can do everything right, just the way society wants
you to do it, and still end up broke, alone, and homeless.</p></blockquote>
<p>PS. By pure coincidence, I came across the awarded Nomandland movie only a few days
after finishing the book. It was great. At first, I was startled by the acting
of some roles. Then, by the final credits, I realized that it wasn&rsquo;t
professional actors who played those roles. It was the actual persons from the
book, Linda May included, who played themselves.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Finland&#39;s intriguing take on the homelessness problem</title>
      <link>https://nicolaiarocci.com/finlands-intriguing-take-on-the-homelessness-problem/</link>
      <pubDate>Tue, 03 Aug 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/finlands-intriguing-take-on-the-homelessness-problem/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In Finland, the number of homeless people has fallen sharply. The reason: The
country applies the “Housing First” concept. Those affected by homelessness
receive a small apartment and counselling – without any preconditions. 4 out
of 5 people affected thus make their way back into a stable life. And: All
this is cheaper than accepting homelessness.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Finland&amp;rsquo;s &lt;a href=&#34;https://scoop.me/housing-first-finland-homelessness/&#34;&gt;take on the homelessness problem&lt;/a&gt; is remarkable and gives hope.
I live in a small town where the problem is not as apparent as in, say, San
Francisco. Whenever I think back to my short time in San Francisco, I shudder
at the terrifying homelessness situation I met there. There, in San Francisco,
I realized the magnitude of &amp;ldquo;true liberalism&amp;rdquo;&amp;rsquo;s failure.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>In Finland, the number of homeless people has fallen sharply. The reason: The
country applies the “Housing First” concept. Those affected by homelessness
receive a small apartment and counselling – without any preconditions. 4 out
of 5 people affected thus make their way back into a stable life. And: All
this is cheaper than accepting homelessness.</p></blockquote>
<p>Finland&rsquo;s <a href="https://scoop.me/housing-first-finland-homelessness/">take on the homelessness problem</a> is remarkable and gives hope.
I live in a small town where the problem is not as apparent as in, say, San
Francisco. Whenever I think back to my short time in San Francisco, I shudder
at the terrifying homelessness situation I met there. There, in San Francisco,
I realized the magnitude of &ldquo;true liberalism&rdquo;&rsquo;s failure.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to remove a file from Git history</title>
      <link>https://nicolaiarocci.com/how-to-remove-a-file-from-git-history/</link>
      <pubDate>Fri, 30 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-remove-a-file-from-git-history/</guid>
      <description>&lt;p&gt;Today I learned how to remove a file from a git repository while also cleaning
it from the history. When you delete it with &lt;code&gt;git rm&lt;/code&gt; or &lt;code&gt;git rm --cached&lt;/code&gt;,
tracks remain in the commit history (the reflog). That might not be a big deal,
but if the file has sensitive contents that you want to disappear from version
control entirely, then you also want it cleaned from the reflog. That&amp;rsquo;s when
&lt;a href=&#34;https://git-scm.com/docs/git-filter-branch&#34;&gt;&lt;code&gt;git filter-branch&lt;/code&gt;&lt;/a&gt; comes to the rescue.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned how to remove a file from a git repository while also cleaning
it from the history. When you delete it with <code>git rm</code> or <code>git rm --cached</code>,
tracks remain in the commit history (the reflog). That might not be a big deal,
but if the file has sensitive contents that you want to disappear from version
control entirely, then you also want it cleaned from the reflog. That&rsquo;s when
<a href="https://git-scm.com/docs/git-filter-branch"><code>git filter-branch</code></a> comes to the rescue.</p>
<p>To be on the safe side, I first cloned the repository to a test directory:</p>
<pre><code>$ git clone &lt;REPOSITORY&gt; test
$ cd test
</code></pre>
<p>Once into the test directory, this is the command that saved the day:</p>
<pre><code># make sure you insert the whole file path, relative to the repository root
$ git filter-branch --force --index-filter \
  &quot;git rm --cached --ignore-unmatch PATH-TO-THE-FILE&quot; \
  --prune-empty --tag-name-filter cat -- --all
</code></pre>
<p>The command above will go through the history, find all commits where the file
is involved, and alter them to eliminate the file. Yes, history changes,
so a force-push will be required at the end.</p>
<p>To test that the file has indeed been removed, I used <code>git blame</code>:</p>
<pre><code>$ git blame PATH-TO-THE-FILE
fatal: no such path 'PATH-TO-THE-FILE' in HEAD
</code></pre>
<p>If the file needs to stay in the local directory, you can add it to
<code>.gitignore</code>:</p>
<pre><code>$ echo &quot;PATH-TO-THE-FILE&quot; &gt;&gt; .gitignore
$ git add .gitignore
$ git commit -m &quot;add FILE to .gitignore&quot;
</code></pre>
<p>Once everything was ready, I went back to the original clone directory,
replayed all the above, then force-pushed back to the remote:</p>
<pre><code>$ git push origin --force --all
</code></pre>
<p>If you have remote tags, those need to be force-pushed as well:</p>
<pre><code>$ git push origin --force --tags
</code></pre>
<p>In my case, the repository is private with no forks, so the changing
history was not a big deal for the few colleagues with access to it. Of
course, any other existing clone will need to be updated<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>In so many years with git, this is the very first time I had to do something
similar. Typically, you don&rsquo;t commit sensitive data to version control, but we
all make mistakes every once in a while, don&rsquo;t we?</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Keep in mind, eventual stashed changes will be lost after <code>git filter-branch</code>. Make sure you unstash before issuing the command.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>On GitHub Copilot</title>
      <link>https://nicolaiarocci.com/on-github-copilot/</link>
      <pubDate>Sat, 24 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-github-copilot/</guid>
      <description>&lt;p&gt;Like everyone else on the planet, I&amp;rsquo;ve been following &lt;a href=&#34;https://copilot.github.com/&#34;&gt;GitHub Copilot&lt;/a&gt; since
its launch. It is an impressive achievement and a remarkable milestone for the
deep learning industry, that&amp;rsquo;s for sure. We are obviously at the early stages
in deep learning applied to software development, and it is somewhat unsettling
to ponder what the future might hold in this field.&lt;/p&gt;
&lt;p&gt;Like many others, however, I worry about code quality issues and the risk of
license infringements&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;. I am also concerned that the advent of Copilot-like
tools might fundamentally change the software developer experience, if not the
software developer role as a whole, and for the worst.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Like everyone else on the planet, I&rsquo;ve been following <a href="https://copilot.github.com/">GitHub Copilot</a> since
its launch. It is an impressive achievement and a remarkable milestone for the
deep learning industry, that&rsquo;s for sure. We are obviously at the early stages
in deep learning applied to software development, and it is somewhat unsettling
to ponder what the future might hold in this field.</p>
<p>Like many others, however, I worry about code quality issues and the risk of
license infringements<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I am also concerned that the advent of Copilot-like
tools might fundamentally change the software developer experience, if not the
software developer role as a whole, and for the worst.</p>
<p>I wrote down some notes preparing for an in-depth Copilot article, but then
I stumbled on Jeremy Howard&rsquo;s &lsquo;[Is Copilot a blessing, or a curse?][3]&rsquo;. In
that piece, Jeremy covers all of my points and then some more. Also, given his
background, Jeremy&rsquo;s musings on deep learning carry way more weight than mine.
My advice is to read his article. I especially appreciate his critique on
Copilot&rsquo;s so-advertised role as &ldquo;AI pair programmer&rdquo;:</p>
<blockquote>
<p>GitHub markets Copilot as a “pair programmer”. But I’m not sure this really
captures what it’s doing. A good pair programmer is someone who helps you
question your assumptions, identify hidden problems, and see the bigger
picture. Copilot doesn’t do any of those things – quite the opposite, it
blindly assumes that your assumptions are appropriate and focuses entirely on
churning out code based on the immediate context of where your text cursor is
right now.</p></blockquote>
<p>He then mentions both <em>automation</em> and <em>anchoring</em> biases and explains how they
might influence the developers using advanced AI-powered automation tools like
Copilot.</p>
<p>The code proposed to Copilot seems to solve most problems, yes, but it appears
to average quality at best. Jeremy explains why: Copilot trains on public
repositories, with no filter on the overall quality of the material at hand
&ndash;something complicated to achieve, indeed. The developer is expected to
carefully review the suggestions, and that&rsquo;s where automation and anchoring
biases might affect judgment. Besides, who enjoys doing code reviews?
I certainly don&rsquo;t. Any day, I&rsquo;d instead take on the challenge and churn out my
own solution. Yes, it might require effort and time, or see me googling for
some help (those Stack Overflow hints have usually been reviewed, amended and
commented on by fellow programmers; both quality <em>and</em> review, right there).
When my solution works, I am thrilled. That feel of self-accomplishment and
satisfaction is what I enjoy the most. It&rsquo;s what I look forward to in the
morning when I sit at my desk.</p>
<p>I also don&rsquo;t want to renounce deep understanding. When we delegate code
creation, we&rsquo;re taking a step toward shallow knowledge in our field. Eric
Sink&rsquo;s &lsquo;[Will deep understanding still be valuable?][4]&rsquo; has an excellent
discussion around this topic:</p>
<blockquote>
<p>In my nearly 4 decades of writing code, I have consistently found that the
most valuable thing is to know how things work. Nothing in software
development is more effective than the ability to see deeper. [&hellip;] I am
utterly convinced that deep understanding is important. But increasingly,
I feel like I&rsquo;m swimming upstream. It seems like most people in our industry
care far more about &ldquo;how to do&rdquo; rather than &ldquo;how does it work&rdquo;.</p></blockquote>
<p>Copilot is great and feels like magic<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. And precisely for that reason, at my
company, we&rsquo;re not going to adopt it.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>For example, see Armin Ronacher&rsquo;s  on Copilot <a href="https://twitter.com/mitsuhiko/status/1410886329924194309">regurgitating famous, GPL-license code</a>.
[3]: <a href="https://www.fast.ai/2021/07/19/copilot/">https://www.fast.ai/2021/07/19/copilot/</a>
[4]: <a href="https://ericsink.com/entries/depth.html">https://ericsink.com/entries/depth.html</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Any sufficiently advanced technology is indistinguishable from magic <em>&ndash;Arthur C. Clark</em>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review. Eight Days in May: The Final Collapse of the Third Reich</title>
      <link>https://nicolaiarocci.com/book-review.-eight-days-in-may-the-final-collapse-of-the-third-reich/</link>
      <pubDate>Sun, 18 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review.-eight-days-in-may-the-final-collapse-of-the-third-reich/</guid>
      <description>&lt;p&gt;Volker Ullrich&amp;rsquo;s Eight Days in May describes the period from April 30, 1945,
the day of Hitler&amp;rsquo;s suicide, to May 8, the day of signing the German
capitulation, with significant jumps backwards in time and some hops in the
future. We&amp;rsquo;re covering only eight days, and the dictator dies on day one. What
essential events might ever have happened in such a short period? Well, many
pivotal ones, as this well-researched work shows us.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Volker Ullrich&rsquo;s Eight Days in May describes the period from April 30, 1945,
the day of Hitler&rsquo;s suicide, to May 8, the day of signing the German
capitulation, with significant jumps backwards in time and some hops in the
future. We&rsquo;re covering only eight days, and the dictator dies on day one. What
essential events might ever have happened in such a short period? Well, many
pivotal ones, as this well-researched work shows us.</p>
<p>The book is merciless towards Hitler&rsquo;s heirs and not accommodating at all
towards Germans of that age in general. Reading the behaviors and things said
in those days is gruesome. Under track are the horrible consequences of war and
concentration camps. The resulting picture is that of the supreme horrors and
mistakes that humanity can reach.</p>
<p>The text focuses on the protagonists of those days, the Nazi hierarchs (not
just the most infamously well known) and their Allies and Red Army
counterparts. There are few notable exceptions, like the story of Marlene
Dietrich, already a Hollywood star, who served as an American army officer and
returned to Germany to look for her sister lost in the fog of war. To her
dismay, she found that her sister had prospered, cooperating and taking advance
of the Nazi regime. Marlene bought her sisters&rsquo; silence, and for the rest of
her life, fiercely negated the very own existence of a sister.</p>
<p>I found the part on the German population and its shocked, instinctive reaction
to the regime&rsquo;s fall particularly informative. The immediate turncoat of most,
along with the lying denial of knowing anything about the atrocities.The
disturbing (George Orwell&rsquo;s word), immediate sympathy for the Allies. Also, the
eulogy for the few who courageously conducted a desperate, clandestine and
seemingly hopeless resistance within the Reich. It is especially relevant that
the author is German.</p>
<p><img alt="Eight Days in May book cover" loading="lazy" src="/images/eight-days-in-may.jpg#right">
This book leaves me stunned. It is always painful to read about that historical
period. The millions of deaths. The suffering. The atrocities. We need to keep
going back, walk the way over and over, never to forget, never to repeat. To
that end, Eight Days in May is a book everyone should read.</p>
<p>By May 8, 1945, Germany was a humiliated, devastated country. Most major cities
were annihilated, the economy had collapsed, and millions of people were
reduced to hunger. The contrast with today&rsquo;s Germany is mind-blowing. With the
help of the winning countries, sure, but predominantly and undoubtedly thanks
to grit and desire for rebirth, Germany resurged from the catastrophe as
a modern country and a sought-out model for democracy, economy, justice, and
reception of diverse cultures.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Internet is Rotting</title>
      <link>https://nicolaiarocci.com/the-internet-is-rotting/</link>
      <pubDate>Sat, 17 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-internet-is-rotting/</guid>
      <description>&lt;p&gt;Terrific piece by Jonathan Zittrain, on The Atlantic, on &lt;a href=&#34;https://www.theatlantic.com/technology/archive/2021/06/the-internet-is-a-collective-hallucination/619320/&#34;&gt;link rot and digital
preservation&lt;/a&gt;. I love how well documented and informative it is. Yet, it
remains perfectly approachable for both the non-knowledgeable reader and the
technically savvy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Too much has been lost already. The glue that holds humanity’s knowledge
together is coming undone.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;We need more content like this.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Terrific piece by Jonathan Zittrain, on The Atlantic, on <a href="https://www.theatlantic.com/technology/archive/2021/06/the-internet-is-a-collective-hallucination/619320/">link rot and digital
preservation</a>. I love how well documented and informative it is. Yet, it
remains perfectly approachable for both the non-knowledgeable reader and the
technically savvy.</p>
<blockquote>
<p>Too much has been lost already. The glue that holds humanity’s knowledge
together is coming undone.</p></blockquote>
<p>We need more content like this.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Yet Another Reason to Use DuckDuckGo</title>
      <link>https://nicolaiarocci.com/yet-another-reason-to-use-duckduckgo/</link>
      <pubDate>Fri, 16 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/yet-another-reason-to-use-duckduckgo/</guid>
      <description>&lt;p&gt;I couldn&amp;rsquo;t recall a &lt;a href=&#34;https://github.com/tmux/tmux&#34;&gt;tmux&lt;/a&gt; command, so I quickly reached for my trusted default
search engine DuckDuckGo. I typed &amp;ldquo;tmux cheat sheet&amp;rdquo; because, well, once
I found an excellent one which I wanted to summon again. To my surprise, the
&lt;a href=&#34;https://duckduckgo.com/?t=ffab&amp;amp;q=tmux+cheat+sheet&amp;amp;atb=v224-1&amp;amp;ia=cheatsheet&#34;&gt;search result&lt;/a&gt; included an in-page cheat sheet—a good one too.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;DuckDuckGo provides an in-page tmux cheat sheet&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/duckduckgo-tmux.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;It isn&amp;rsquo;t the first time that DuckDuckGo surprises me like that. Need a new
GUID? &lt;a href=&#34;https://duckduckgo.com/?q=new+guid&amp;amp;t=ffab&amp;amp;atb=v224-1&amp;amp;ia=answer&#34;&gt;Search for it&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I couldn&rsquo;t recall a <a href="https://github.com/tmux/tmux">tmux</a> command, so I quickly reached for my trusted default
search engine DuckDuckGo. I typed &ldquo;tmux cheat sheet&rdquo; because, well, once
I found an excellent one which I wanted to summon again. To my surprise, the
<a href="https://duckduckgo.com/?t=ffab&amp;q=tmux+cheat+sheet&amp;atb=v224-1&amp;ia=cheatsheet">search result</a> included an in-page cheat sheet—a good one too.</p>
<p><img alt="DuckDuckGo provides an in-page tmux cheat sheet" loading="lazy" src="/images/duckduckgo-tmux.png"></p>
<p>It isn&rsquo;t the first time that DuckDuckGo surprises me like that. Need a new
GUID? <a href="https://duckduckgo.com/?q=new+guid&amp;t=ffab&amp;atb=v224-1&amp;ia=answer">Search for it</a>.</p>
<p><img alt="DuckDuckGo comes with an in-page guid generation feature" loading="lazy" src="/images/duckduckgo-guid.png"></p>
<p>Need a quick QR code? <a href="https://duckduckgo.com/?q=qrcode+for+https%3A%2F%2Fnicolaiarocci.com&amp;t=ffab&amp;atb=v224-1&amp;ia=answer">Of course</a>.</p>
<p><img alt="DuckDuckGo comes with an in-page QR code generation feature" loading="lazy" src="/images/duckduckgo-qrcode.png"></p>
<p>DuckDuckGo should be everyone&rsquo;s default browser for many <a href="https://duckduckgo.com/spread">valid reasons</a>, and
in-page results for frequent searches (or <a href="https://duck.co/ia/dev">Istant Answers</a> as they call them)
sure isn&rsquo;t the most prominent one, but it is handy to have around. It is also of
some comfort to see that I&rsquo;m obviously not the only one forgetting tmux
commands.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Proust&#39;s Madeleine Was Originally a Slice of Toast</title>
      <link>https://nicolaiarocci.com/prousts-madeleine-was-originally-a-slice-of-toast/</link>
      <pubDate>Thu, 15 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/prousts-madeleine-was-originally-a-slice-of-toast/</guid>
      <description>&lt;p&gt;A long-sought first draft of Marcel Proust&amp;rsquo;s &amp;lsquo;In Search of Lost Time&amp;rsquo; surfaced
a few years ago. Its fascinating story and intriguing news are revealed in
a Tablet article titled &lt;a href=&#34;https://www.tabletmag.com/sections/arts-letters/articles/proust-madeleine-antisemitism-jewishness&#34;&gt;Proust&amp;rsquo;s Madeleine Was Originally a Slice Toast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Being the Tablet &amp;ldquo;a daily online magazine of Jewish news, ideas, and culture&amp;rdquo;,
it makes sense that a good part of the article focuses on Proust&amp;rsquo;s ambivalence
about his Jewishness. Still, there are many other interesting tidbits to be
learned. On the novel itself and its development, on some relevant characters
and their real-world counterparts, and Proust himself.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A long-sought first draft of Marcel Proust&rsquo;s &lsquo;In Search of Lost Time&rsquo; surfaced
a few years ago. Its fascinating story and intriguing news are revealed in
a Tablet article titled <a href="https://www.tabletmag.com/sections/arts-letters/articles/proust-madeleine-antisemitism-jewishness">Proust&rsquo;s Madeleine Was Originally a Slice Toast</a>.</p>
<p>Being the Tablet &ldquo;a daily online magazine of Jewish news, ideas, and culture&rdquo;,
it makes sense that a good part of the article focuses on Proust&rsquo;s ambivalence
about his Jewishness. Still, there are many other interesting tidbits to be
learned. On the novel itself and its development, on some relevant characters
and their real-world counterparts, and Proust himself.</p>
<blockquote>
<p>Most of these matters, as is natural in early drafts, differ from the final
versions: the iconic madeleine in these pages is the far more prosaic toast.
Sound, not just taste or the narrator’s position standing on cobblestones, is
added to the battery of things that can revive the past. Proust writes here,
after trying in vain to resuscitate a lost day of his youth, that &ldquo;I let my
spoon fall onto my plate. There was then produced exactly the same sound as
that of the hammer of the brakemen who that day struck the wheels of the
train at its stop. At that same moment the burning and blinded hour when this
noise rang out was revived for me …&rdquo; Perhaps most surprisingly, the Narrator,
here given his actual name, has a younger brother, an annoying one to boot,
who &ldquo;though only five-and-a-half years-old, was of a rather violent nature.&rdquo;</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Will .NET 6 Minimal APIs turn heads?</title>
      <link>https://nicolaiarocci.com/will-.net-6-minimal-apis-turn-heads/</link>
      <pubDate>Wed, 14 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/will-.net-6-minimal-apis-turn-heads/</guid>
      <description>&lt;p&gt;I am pretty excited about the [Minimal APIs][3] feature that is coming with
.NET 6. Three lines of code will be enough to build a fully functional REST
microservice&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var app = WebApplication.Create(args);
app.MapGet(&amp;quot;/&amp;quot;, () =&amp;gt; &amp;quot;Hello World!&amp;quot;);
await app.RunAsync();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you&amp;rsquo;re a seasoned ASP.NET MVC/WebApi developer, the snippet caught your
attention because, pre-.NET 6, achieving the same result will have you messing
with a lot of extra cruft&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;. I suspect, however, that this feature is not
primarily targeted at existing .NET developers. Developers new and old looking
at .NET for the first time, or those like me returning after a long break;
these are, I think, the designated audience.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am pretty excited about the [Minimal APIs][3] feature that is coming with
.NET 6. Three lines of code will be enough to build a fully functional REST
microservice<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>:</p>
<pre><code>var app = WebApplication.Create(args);
app.MapGet(&quot;/&quot;, () =&gt; &quot;Hello World!&quot;);
await app.RunAsync();
</code></pre>
<p>If you&rsquo;re a seasoned ASP.NET MVC/WebApi developer, the snippet caught your
attention because, pre-.NET 6, achieving the same result will have you messing
with a lot of extra cruft<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. I suspect, however, that this feature is not
primarily targeted at existing .NET developers. Developers new and old looking
at .NET for the first time, or those like me returning after a long break;
these are, I think, the designated audience.</p>
<p>A long time ago, I left C# and .NET behind <em>precisely</em> because I had to write
REST APIs, and back then, the options available in .NET were, to put it mildly,
cumbersome. Admittedly, there were other reasons for switching, like .NET not
being cross-platform - I wanted to run my APIs on Linux - and general
dissatisfaction with the Microsoft ecosystem. Long story short, I went with
Python. Check out this snippet from Flask&rsquo;s renowned <a href="https://flask.palletsprojects.com/en/2.0.x/quickstart/#a-minimal-application">Quickstart</a>:</p>
<pre><code>app = Flask(__name__)

@app.route(&quot;/&quot;)
def hello_world():
    return &quot;&lt;p&gt;Hello, World!&lt;/p&gt;&quot;
</code></pre>
<p>Launched with the compelling motto &lsquo;web development, one drop at a time&rsquo; and
presented as a &lsquo;micro&rsquo; web framework, Flask immediately caught my attention<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.
Cruft-free and elegant APIs are not a Flask (or Python, for the matter)
exclusive. A Node code snippet for a REST API would be similar. Now, with NET
6 Minimal APIs, we&rsquo;re finally matching the industry standard for code clarity
and simplicity. Moreover, .NET has better performance<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> and strongly typed
languages that offer excellent type inference (F# reigns supreme there, with C#
catching up nicely.) I&rsquo;d dare to say that the C# snippet is a winner. I mean,
look at that inline lambda, with no casts!</p>
<p>Minimal APIs typical use-case is everyone&rsquo;s favourite, microservices. I do not
doubt the delivery<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup><sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup>. The challenge, I think, is the actual adoption rate.
Whether veterans will adopt them or not (over time, they will) is relatively
significant, I guess. The critical question is, will Minimal APIs succeed in
attracting new developers to .NET?</p>
<p>That will mainly depend on communication. Will evangelism be robust, persistent
and persuasive enough? That&rsquo;s the tricky part. Every time I speak to the Python
or JavaScript crowd, I  am amazed that the majority don&rsquo;t even know that .NET
is now open-source, cross-platform, and blazingly performant. Most, if not all,
are tied to the old idea of a Windows-only, cumbersome, black-boxed,
enterprise-oriented offering. That&rsquo;s not the case anymore. .NET is on par with
the other cool stacks or is getting there very rapidly. I am afraid it&rsquo;s just
a little bit too late for the vast majority of the web development crowd to
take notice. It will take an enormous, coordinated effort to bring the message
across.</p>
<p>With the platform now ready, effective communication, branding, and evangelism
will eventually change the tide. Tutorials, getting-started guides, conference
talks, YouTube videos, and workshops should all be explicitly conceived for new
developers. The process started already. The observant can see the numerous
efforts being made in this area. Will it be enough to attract new crowds? It is
a hard bet, but I sure hope so because C# and F# are great languages, and NET
6 is modern, robust,  feature-rich, and powerful enough to go at war, and with
no fear.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>You will still be able to scale up to (or start right away with) a fully-functional WebApi/MVC application, with all its classes and controllers.
[3]: <a href="https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-4/#introducing-minimal-apis">https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-4/#introducing-minimal-apis</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Mind you. The dev team isn&rsquo;t just adding a layer of abstraction on top of the existing code. Quoting fellow MVP <a href="https://www.telerik.com/blogs/low-ceremony-high-value-tour-minimal-apis-dotnet-6">Dave Brock</a> &ldquo;With minimal APIs, the goal is to move out core API-building capabilities—the ones that only exist in MVC today—and allow them to be used outside of MVC. When extracting these components away to a new paradigm, you can rely on middleware-like performance.&rdquo;&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Long story short, besides lazily maintaining my Python open source <a href="/opensource">projects</a>, I am mostly back to C# these days.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Sure, all benchmarks should be taken with a grain of salt, but <a href="https://www.techempower.com/benchmarks/#section=data-r20&amp;hw=ph&amp;test=plaintext">check this out</a>. ASPCORE ranks at #2; Flask and Node #338 and #173 respectively. And NET 6 is expected to still improve on performance.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>For examples of real-life-scenarios, see Damian Edwards&rsquo; <a href="https://github.com/DamianEdwards/MinimalApiPlayground/blob/main/src/MinimalApiPlayground/Program.cs">Minimal APIs playground</a>.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p>Cool. As I am writing this, NET 6 Preview 6 is released, which adds <a href="https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-6/#configure-swagger-ui-with-minimal-apis">OpenAPI (Swagger UI) support</a> to Minimal APIs.&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Power to the Words</title>
      <link>https://nicolaiarocci.com/book-review-power-to-the-words/</link>
      <pubDate>Fri, 09 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-power-to-the-words/</guid>
      <description>&lt;p&gt;Vera Gheno&amp;rsquo;s &amp;ldquo;Potere alle Parole&amp;rdquo; (Power to the Words) is an essay on the
importance of appropriate use of the (Italian) language, not just in written
works but also and predominately in everyday life.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What would we think of a person who, having a vast wardrobe of beautiful
clothes, always wore the same suit out of laziness? These situations appear
unlikely; yet, they are examples of the attitude that many have towards their
language: they have access to an immense, incalculable patrimony, which out
of indolence, or fear, or inexperience, they use partially. Even if the
Italian does not need to be saved or preserved, we should love it more
because it is a magnificent instrument. It is a shame to limit ourselves to
only a superficial frequentation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Vera Gheno&rsquo;s &ldquo;Potere alle Parole&rdquo; (Power to the Words) is an essay on the
importance of appropriate use of the (Italian) language, not just in written
works but also and predominately in everyday life.</p>
<blockquote>
<p>What would we think of a person who, having a vast wardrobe of beautiful
clothes, always wore the same suit out of laziness? These situations appear
unlikely; yet, they are examples of the attitude that many have towards their
language: they have access to an immense, incalculable patrimony, which out
of indolence, or fear, or inexperience, they use partially. Even if the
Italian does not need to be saved or preserved, we should love it more
because it is a magnificent instrument. It is a shame to limit ourselves to
only a superficial frequentation.</p></blockquote>
<p>Vera Gheno is a sociolinguist. She teaches at the Universities of Florence and
Siena. She collaborates with the &ldquo;Accademia della Crusca&rdquo;, the most important
research institution of the Italian language and the oldest linguistic academy
in the world. She is also a phenomenal popularizer. I am sure that some
concepts and notions expressed here are well known to the knowledgeable person,
but this book is not targeted to that kind of reader. I think this work is
purposedly aiming at the general public.Yet, I suspect it would remain
enjoyable to those in the field mainly thanks to its always fresh and
entertaining style.</p>
<p><img alt="Potere alle Parole book cover" loading="lazy" src="/images/potere-alle-parole.jpg#right">
One of the many takeaways is that languages change, evolve, and constantly
adapt over time. Hence there is no standard, norm, or canon set in stone. New
words are minted continuously. At the same time, some others decay and slowly
disappear. Words initially borrowed from foreign languages (English, yes, but
also French, and many other unexpected ones, like Hungarian) enter the
dictionary to become part of the norm. We old farts should not be so quick to
condemn our kids&rsquo; slang: some of their jargon will soon be forgotten, some will
join the canon. The same happened, of course, in our time and forever before.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My DotNetPodcast interview</title>
      <link>https://nicolaiarocci.com/my-dotnetpodcast-interview/</link>
      <pubDate>Tue, 06 Jul 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-dotnetpodcast-interview/</guid>
      <description>&lt;p&gt;Today I was interviewed by &lt;a href=&#34;https://twitter.com/mauroservienti&#34;&gt;Mauro Servienti&lt;/a&gt; on the &lt;a href=&#34;https://www.spreaker.com/show/dotnetpodcast&#34;&gt;DotNetPodcast&lt;/a&gt;. The
theme was my experience as an open-source maintainer on both the Python and C#
stacks. We also discussed the ongoing evolution of the dotNET ecosystem,
touching on a few tangent topics.&lt;/p&gt;
&lt;p&gt;The recording is in Italian and is available below here.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Listen to &amp;ldquo;Python, Eve, open source
e fattura elettronica. Con Nicola Iarocci&amp;rdquo; on Spreaker.&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I was interviewed by <a href="https://twitter.com/mauroservienti">Mauro Servienti</a> on the <a href="https://www.spreaker.com/show/dotnetpodcast">DotNetPodcast</a>. The
theme was my experience as an open-source maintainer on both the Python and C#
stacks. We also discussed the ongoing evolution of the dotNET ecosystem,
touching on a few tangent topics.</p>
<p>The recording is in Italian and is available below here.</p>
<p><!-- raw HTML omitted -->Listen to &ldquo;Python, Eve, open source
e fattura elettronica. Con Nicola Iarocci&rdquo; on Spreaker.<!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>An unexpected return to the Alps</title>
      <link>https://nicolaiarocci.com/an-unexpected-return-to-the-alps/</link>
      <pubDate>Mon, 28 Jun 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/an-unexpected-return-to-the-alps/</guid>
      <description>&lt;p&gt;I recently had the unexpected opportunity of spending a few days in the Alps,
climbing and hiking with my daughters. After a few years of hiatus, it felt
great to be back romping.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Monte Stevia&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/monte-stevia.jpg#center&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I recently had the unexpected opportunity of spending a few days in the Alps,
climbing and hiking with my daughters. After a few years of hiatus, it felt
great to be back romping.</p>
<p><img alt="Monte Stevia" loading="lazy" src="/images/monte-stevia.jpg#center"></p>
]]></content:encoded>
    </item>
    <item>
      <title>A Beginner&#39;s Guide to Miles Davis</title>
      <link>https://nicolaiarocci.com/a-beginners-guide-to-miles-davis/</link>
      <pubDate>Sun, 27 Jun 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/a-beginners-guide-to-miles-davis/</guid>
      <description>&lt;p&gt;Sam Enright assembled a friendly &lt;a href=&#34;https://samenright.com/2021/06/06/a-beginners-guide-to-miles-davis/&#34;&gt;Beginner&amp;rsquo;s Guide to Miles Davis&lt;/a&gt;. If
you&amp;rsquo;ve always been curious about jazz but never really managed to get into it,
then this resource might serve as a good starting point. I cannot say I&amp;rsquo;m one
hundred per cent aligned with his choices, but we&amp;rsquo;re close. One remarkable
statement I concur with is this one:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jazz is so interesting to me because of its fusion of intricate underlying
structure with improvisation and spontaneity. As Ken Burns put it, jazz is
“familiar, but brand new every night”. Moreover, I enjoy the intellectual
demandingness of jazz as a genre. Jazz musicians seem to be the most
thoughtful and intelligent of any genre. Many of the more Avant Garde songs
mentioned in this post don’t sound good unless you’re really concentrating.
Some of it sounds cacophonous to a newcomer. This is why jazz is considerably
more difficult to get into than other genres and has a lack of listenership
among the youth.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Sam Enright assembled a friendly <a href="https://samenright.com/2021/06/06/a-beginners-guide-to-miles-davis/">Beginner&rsquo;s Guide to Miles Davis</a>. If
you&rsquo;ve always been curious about jazz but never really managed to get into it,
then this resource might serve as a good starting point. I cannot say I&rsquo;m one
hundred per cent aligned with his choices, but we&rsquo;re close. One remarkable
statement I concur with is this one:</p>
<blockquote>
<p>Jazz is so interesting to me because of its fusion of intricate underlying
structure with improvisation and spontaneity. As Ken Burns put it, jazz is
“familiar, but brand new every night”. Moreover, I enjoy the intellectual
demandingness of jazz as a genre. Jazz musicians seem to be the most
thoughtful and intelligent of any genre. Many of the more Avant Garde songs
mentioned in this post don’t sound good unless you’re really concentrating.
Some of it sounds cacophonous to a newcomer. This is why jazz is considerably
more difficult to get into than other genres and has a lack of listenership
among the youth.</p></blockquote>
<p>Sam put a lot of effort into his selection, and it shows. Should his list be
overwhelming for you, my shortcut advice would be: listen to Kind of Blue,
especially the first two tracks, So What and Freddie Freeloader. If they don&rsquo;t
move you, I am sorry, you&rsquo;re probably not a jazz person.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Triumph Bonneville Dolomites Ride 2021</title>
      <link>https://nicolaiarocci.com/triumph-bonneville-dolomites-ride-2021/</link>
      <pubDate>Wed, 16 Jun 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/triumph-bonneville-dolomites-ride-2021/</guid>
      <description>&lt;p&gt;So the motorcycle-touring season has started, albeit a little late this year
because of the COVID situation, and I&amp;rsquo;ve been avidly pursuing it. On Sunday,
I embarked on a 700 km trip from my place to the Dolomites and back.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a glorious day.  We (&lt;a href=&#34;https://nicolaiarocci.com/musings-on-an-unexpected-motorcycle-trip/&#34;&gt;Antonio&lt;/a&gt; and I) visited many renowned
Mountain Passes, enjoyed stunning views, ate great food and chatted like
there&amp;rsquo;s no tomorrow.&lt;/p&gt;
&lt;p&gt;I took my GoPro along with me. I wanted to record some scenes to inspire my
motorcycle club&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; comrades. However, I admit I was dubious that it would be
worth the hassle. Filming while driving would be difficult; editing and
assembling the cuts later would be tedious. Moreover, I have almost no
experience with this stuff.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So the motorcycle-touring season has started, albeit a little late this year
because of the COVID situation, and I&rsquo;ve been avidly pursuing it. On Sunday,
I embarked on a 700 km trip from my place to the Dolomites and back.</p>
<p>It&rsquo;s been a glorious day.  We (<a href="/musings-on-an-unexpected-motorcycle-trip/">Antonio</a> and I) visited many renowned
Mountain Passes, enjoyed stunning views, ate great food and chatted like
there&rsquo;s no tomorrow.</p>
<p>I took my GoPro along with me. I wanted to record some scenes to inspire my
motorcycle club<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> comrades. However, I admit I was dubious that it would be
worth the hassle. Filming while driving would be difficult; editing and
assembling the cuts later would be tedious. Moreover, I have almost no
experience with this stuff.</p>
<p>The video is available on YouTube, and I already know it&rsquo;s probably too long.
Ideally, it should feature live voice recording, possibly a second camera
point-of-view, and, heck, even some drone footage<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. But it&rsquo;s only the first
attempt; it will have to do.</p>
<p>Contrary to my expectations, filming on the go wasn&rsquo;t too stressful, and
editing was.. ok I guess. However, once it was done and I finally got to watch
it, I realized the obvious: it will primarily serve as a remarkable memory of
a glorious day. Eventually, it will also inspire some of my club comrades; but
that&rsquo;s now a secondary goal.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/s7SUZZ1dvd0?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The Triumph Owners MotorCycle Club (<a href="https://tomccitalia.org/">italy</a>; <a href="https://tomcc.org">international</a>)&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>For some quality moto vlogging, see the <a href="https://www.youtube.com/c/ItchyBoots">Itchy Boots</a> on YouTube
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Linus Torvalds addresses an anti-vaxxer</title>
      <link>https://nicolaiarocci.com/linus-torvalds-addresses-an-anti-vaxxer/</link>
      <pubDate>Mon, 14 Jun 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/linus-torvalds-addresses-an-anti-vaxxer/</guid>
      <description>&lt;p&gt;Linus Torvalds&amp;rsquo; &lt;a href=&#34;https://lore.kernel.org/ksummit/CAHk-=wiB6FJknDC5PMfpkg4gZrbSuC3d391VyReM4Wb0+JYXXA@mail.gmail.com/&#34;&gt;reply to an anti-vaxxer&lt;/a&gt; on the Linux kernel list is
a must-read. Pre-2018, Linus would have destroyed the poor chump. He&amp;rsquo;s
discouraging further discussion (Kernel list is not the place for that) while
providing crystal clear and detailed mRNA vaccine information, all without
renouncing to an opening salvo of his good-ole, grumpy style.&lt;/p&gt;
&lt;p&gt;As John Gruber &lt;a href=&#34;https://daringfireball.net/linked/2021/06/10/linus-torvalds&#34;&gt;affirms&lt;/a&gt;, this is one rant we can all get behind.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Linus Torvalds&rsquo; <a href="https://lore.kernel.org/ksummit/CAHk-=wiB6FJknDC5PMfpkg4gZrbSuC3d391VyReM4Wb0+JYXXA@mail.gmail.com/">reply to an anti-vaxxer</a> on the Linux kernel list is
a must-read. Pre-2018, Linus would have destroyed the poor chump. He&rsquo;s
discouraging further discussion (Kernel list is not the place for that) while
providing crystal clear and detailed mRNA vaccine information, all without
renouncing to an opening salvo of his good-ole, grumpy style.</p>
<p>As John Gruber <a href="https://daringfireball.net/linked/2021/06/10/linus-torvalds">affirms</a>, this is one rant we can all get behind.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Custom default values for not existing dictionary items (and a lesson learned)</title>
      <link>https://nicolaiarocci.com/custom-default-values-for-not-existing-dictionary-items-and-a-lesson-learned/</link>
      <pubDate>Fri, 11 Jun 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/custom-default-values-for-not-existing-dictionary-items-and-a-lesson-learned/</guid>
      <description>&lt;p&gt;When dealing with dictionaries, a typical problem is when an operation attempts
to retrieve an element using a key that does not exist in the dictionary. In
.NET, a &lt;code&gt;KeyNotFoundException&lt;/code&gt; is raised, and that&amp;rsquo;s the desired behaviour in
most circumstances. Sometimes, however, you know that your program will
frequently try to retrieve keys that do not exist. In such cases, it is more
efficient to use the &lt;code&gt;TryGetValue&lt;/code&gt; method:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This method returns the value associated with the specified key, if the key
is found; otherwise, the default value for the type of the value parameter is
returned (&lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2.trygetvalue?view=net-5.0&#34;&gt;source&lt;/a&gt;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When dealing with dictionaries, a typical problem is when an operation attempts
to retrieve an element using a key that does not exist in the dictionary. In
.NET, a <code>KeyNotFoundException</code> is raised, and that&rsquo;s the desired behaviour in
most circumstances. Sometimes, however, you know that your program will
frequently try to retrieve keys that do not exist. In such cases, it is more
efficient to use the <code>TryGetValue</code> method:</p>
<blockquote>
<p>This method returns the value associated with the specified key, if the key
is found; otherwise, the default value for the type of the value parameter is
returned (<a href="https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2.trygetvalue?view=net-5.0">source</a>)</p></blockquote>
<p>The devil hides in details. <code>TryGetValue</code> returns the default value for the
type of the <code>value</code> parameter. So, if you use <code>TryGetValue</code> to look into
a dictionary of strings, <code>null</code> is returned on a missing key. That is probably
ok in most cases. Howewer, if your logic requires a custom default value
instead, then you are out of luck. You have to set it yourself on <code>TryGetValue</code>
failure. A typical implementation would be:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    <span style="font-weight:bold">var</span> result = MyDictionary.TryGetValue(<span style="font-style:italic">&#34;key&#34;</span>, <span style="font-weight:bold">var</span> out value) 
</span></span><span style="display:flex;"><span>        <span style="">?</span> value
</span></span><span style="display:flex;"><span>        : <span style="font-style:italic">&#34;not found&#34;</span>;
</span></span></code></pre></div><p>It is a minor annoyance but still a hassle. Our solution has always been
a homemade <code>GetValueOrDefault</code> extension method, something like this:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    public <span style="font-weight:bold">static</span> TValue GetValueOrDefault&lt;TKey, TValue&gt; 
</span></span><span style="display:flex;"><span>        (this IDictionary&lt;TKey, TValue&gt; dictionary, TKey key, TValue defaultValue)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">return</span> dictionary.TryGetValue(key, <span style="font-weight:bold">var</span> out value) 
</span></span><span style="display:flex;"><span>            <span style="">?</span> value
</span></span><span style="display:flex;"><span>            : defaultValue;
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>Usage:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>    <span style="font-weight:bold">var</span> result = MyDictionary.GetValueOrDefault(<span style="font-style:italic">&#34;key&#34;</span>, <span style="font-style:italic">&#34;not found&#34;</span>);
</span></span></code></pre></div><p>We&rsquo;ve been using it since forever, and we are still using it even in recent
projects.</p>
<p>Today, as I was looking at something only tangentially related, I learned that
our extension method is obsolete, and it&rsquo;s been for a while. NetStandard
2.1 and NetCore 2 added a new extension method to the official API. It&rsquo;s
called, you guessed it, <a href="https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.collectionextensions.getvalueordefault?view=net-5.0"><code>GetValueOrDefault</code></a>. It extends
<code>ÌReadOnlyDictionary&lt;TKey, TValue&gt;</code>, so it applies to all generic dictionaries,
which is cool.</p>
<p>We could continue with our extension method. It has the advantage of working
across all .NET platforms, not just recent ones. Implementations are likely
similar, and there’s probably little (if any) performance difference (I am too
lazy to compare). With NETCore (now NET5), APIs have not only acquired
cross-platform compatibility and improved performance but they have also been
expanded and amended, something often not very apparent. Not to me, at least.</p>
<p>The point I want to make here, I think, is that nothing is set in stone. Today&rsquo;s
little event shows how my knowledge becomes stagnant over time. Setting apart
the time to learn new things is good, but acquired ones need sharping too.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Alpi Ribelli: Storie di montagna, resistenza e utopia</title>
      <link>https://nicolaiarocci.com/book-review-alpi-ribelli-storie-di-montagna-resistenza-e-utopia/</link>
      <pubDate>Sat, 05 Jun 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-alpi-ribelli-storie-di-montagna-resistenza-e-utopia/</guid>
      <description>&lt;p&gt;The idea behind this book is fascinating. As the subtitle suggests, the book
collects stories of rebel mountaineers of all kinds. Some chose to disobey
orders; others built refuges of resistance, outposts of autonomy and
laboratories of social innovation.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Alpi Ribelli book cover&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/alpi-ribelli-book-cover.jpeg#right&#34;&gt;
The collection is rich and varied. We go from the heretics who went with Fra
Dolcino to the partisans who stopped the Nazi fascists in the mountains of
Cuneo and Belluno, up to the contemporary movements against the high-speed
train in the Susa Valley. Some high-profile mountain climbers are present as
well. Tita Piaz, the Dolomiti Devil; the Nuovo Mattino climbers who, inspired
by the revolution going in Yosemite , let go of the classic &amp;ldquo;fight with the
Alp&amp;rdquo; approach to mountain climbing; the very notable (and totally unknown to
me) story of Guido Rossa, worker, trade unionist, and fantastic rock climber.
The Italian Alpine Club internal struggle from which the Mountain Wilderness
association originated.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The idea behind this book is fascinating. As the subtitle suggests, the book
collects stories of rebel mountaineers of all kinds. Some chose to disobey
orders; others built refuges of resistance, outposts of autonomy and
laboratories of social innovation.</p>
<p><img alt="Alpi Ribelli book cover" loading="lazy" src="/images/alpi-ribelli-book-cover.jpeg#right">
The collection is rich and varied. We go from the heretics who went with Fra
Dolcino to the partisans who stopped the Nazi fascists in the mountains of
Cuneo and Belluno, up to the contemporary movements against the high-speed
train in the Susa Valley. Some high-profile mountain climbers are present as
well. Tita Piaz, the Dolomiti Devil; the Nuovo Mattino climbers who, inspired
by the revolution going in Yosemite , let go of the classic &ldquo;fight with the
Alp&rdquo; approach to mountain climbing; the very notable (and totally unknown to
me) story of Guido Rossa, worker, trade unionist, and fantastic rock climber.
The Italian Alpine Club internal struggle from which the Mountain Wilderness
association originated.</p>
<p>Enrico Camanni, the author, is essentially a journalist, and it shows. I know
him since the mid-90s when he was the editorial director of the then best
mountain magazine, Alp. I might be wrong, but I suspect that this work is
mainly composed of articles previously written for magazines and other works,
here edited and enriched. That is not necessarily a negative, but I find the
prose sometimes short-lived, other times emphatic, erratic in some ways.</p>
<p>Overall a good book. I appreciated some reflections and considerations,
especially those around the now unbreakable, intertwined bonds between the
lowlands and the highlands.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Open Source: What Happens When the Free Lunch Ends?</title>
      <link>https://nicolaiarocci.com/open-source-what-happens-when-the-free-lunch-ends/</link>
      <pubDate>Fri, 04 Jun 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/open-source-what-happens-when-the-free-lunch-ends/</guid>
      <description>&lt;p&gt;The article I&amp;rsquo;m linking today is authored by Aaron Stannard and focuses on &lt;a href=&#34;https://aaronstannard.com/dotnetoss-free-lunch-ends/&#34;&gt;the
drama currently going on in the .NET Open Source ecosystem&lt;/a&gt;. We&amp;rsquo;ve all been
there. A dependency we took aeons ago goes unmaintained or changes its
licensing model. Why does this happen? Because at some point, projects need to
become sustainable or else they fail.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;hellip;] it&amp;rsquo;s inexpensive for maintainers to support a small number of users
with relatively similar demands - but once a project achieves critical mass
and the demand on the maintainers exceeds their desire to supply, something
will have to give.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The article I&rsquo;m linking today is authored by Aaron Stannard and focuses on <a href="https://aaronstannard.com/dotnetoss-free-lunch-ends/">the
drama currently going on in the .NET Open Source ecosystem</a>. We&rsquo;ve all been
there. A dependency we took aeons ago goes unmaintained or changes its
licensing model. Why does this happen? Because at some point, projects need to
become sustainable or else they fail.</p>
<blockquote>
<p>[&hellip;] it&rsquo;s inexpensive for maintainers to support a small number of users
with relatively similar demands - but once a project achieves critical mass
and the demand on the maintainers exceeds their desire to supply, something
will have to give.</p></blockquote>
<p>Case in point, IdentityServer. The license change was, in my opinion, long
overdue. The new agreement is very reasonable; the package remains free for
most users. I understand the so-called &ldquo;Procurement Rage.&rdquo;</p>
<blockquote>
<p>[&hellip;] once maintainers affix a dollar amount as the entry fee to benefit from
all of their institutionalized knowledge and expertise developers now have no
choice other than violating the license terms (legal won&rsquo;t stand for that) or
dealing with the procurement bureaucracy to allocate company money for the
purchase.</p></blockquote>
<p>Procurement is undoubtedly an obstacle to open-source adoption within the
Enterprise. Yet, it is true that there is no such a thing as a free lunch.
Either be prepared to pay or send some value back to your dependencies, in one
form or another (the article lists several great options). The conclusion is
just perfect:</p>
<blockquote>
<p>Creating virtuous cycles where you continuously exchange value with OSS
producers is the inevitable conclusion to the “Open Source Sustainability
Crisis” - and everyone will be better off for it. So you should start the
conversation with your team and find some projects to support - because it’s
in your own self-interest to see them sustained.</p></blockquote>
<p>I subscribe to every single word. I find this case even more disheartening
because most protesters are asking Microsoft to roll their own alternative. No
gratitude or sympathy, nothing, really, for the people who worked hard for
years, covering complex and strategic subjects such as authentication and
authorization, providing excellent value for free.  Baby-crying and asking
Microsoft to &ldquo;solve the problem&rdquo; is so sad. It&rsquo;s also so typical of certain
Enterprise culture. They just don&rsquo;t understand open-source or, just for
convenience, they pretend not to get it.</p>
<p>It should also be mentioned that there already exist some valid, open-source,
IdentityServer alternatives (IS4 included.) These should be the default go-to
solution for those who abandon ship. The last thing we need is yet another
&ldquo;official&rdquo; package by the behemoth. If anything, we need more variance,
certainly not less.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Trade Wars 2002 and its connection to Eve Online</title>
      <link>https://nicolaiarocci.com/trade-wars-2002-and-its-connection-to-eve-online/</link>
      <pubDate>Sat, 29 May 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/trade-wars-2002-and-its-connection-to-eve-online/</guid>
      <description>&lt;p&gt;Trade Wars 2002 was a  great 1991 online game I hosted on one of my BBSes &lt;a href=&#34;https://nicolaiarocci.com/a-trip-down-memory-lane-fidonet-and-usenet/&#34;&gt;back
in the day&lt;/a&gt;. Not sure if it was Lorien or Phoenix BBS; it might have been
the latter given the game&amp;rsquo;s release date. I totally forgot TW2002 until
yesterday when I spotted this &lt;a href=&#34;https://if50.substack.com/p/1991-trade-wars-2002&#34;&gt;1991: Trade Wars 2002&lt;/a&gt; article on the &lt;em&gt;50
Years of Text Games&lt;/em&gt; newsletter.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Trade Wards 2002&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/trade-wars-2002.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;I humbly confess that, until yesterday, I never made the obvious connection
between TW2002 and Eve Online. That&amp;rsquo;s quite startling considering that I&amp;rsquo;ve
been a beta player first and then an avid Eve player for a few years (Eve was
also the last game I seriously played on a computer.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Trade Wars 2002 was a  great 1991 online game I hosted on one of my BBSes <a href="https://nicolaiarocci.com/a-trip-down-memory-lane-fidonet-and-usenet/">back
in the day</a>. Not sure if it was Lorien or Phoenix BBS; it might have been
the latter given the game&rsquo;s release date. I totally forgot TW2002 until
yesterday when I spotted this <a href="https://if50.substack.com/p/1991-trade-wars-2002">1991: Trade Wars 2002</a> article on the <em>50
Years of Text Games</em> newsletter.</p>
<p><img alt="Trade Wards 2002" loading="lazy" src="/images/trade-wars-2002.png"></p>
<p>I humbly confess that, until yesterday, I never made the obvious connection
between TW2002 and Eve Online. That&rsquo;s quite startling considering that I&rsquo;ve
been a beta player first and then an avid Eve player for a few years (Eve was
also the last game I seriously played on a computer.)</p>
<p>In retrospect, what&rsquo;s surprising is that Station Interaction, possibly the best
trait of TW2002, never really made it to Eve Online (not in my playing
timeframe, at least).</p>
<blockquote>
<p>The StarDock was a key addition to Martin’s version of the game that went
a long way toward making its galaxy feel more like a dynamic, living place.
It’s filled with things to do: shop, gamble, visit a theatre to watch
ASCII-art sci-fi parody “movies” (short animations) with titles like Vulcan
Thunder. But more interesting are the chances for community interaction. The
StarDock’s tavern provides a range of different ways to interact with fellow
players: among other options, you can pay credits to post a public message
that everyone will see, add to the graffiti scrawled on the bathroom wall, or
pay a “grimy Trader” in the back room to learn information about other
players, such as what sector their ship was last seen in. The grimy trader
could share a huge selection of hints and useful info about the game state,
provided you could think of the right things to ask him about and had the
credits to pay.</p></blockquote>
<p>And of course:</p>
<blockquote>
<p>The StarDock also holds secrets: the large menu of available commands doesn’t
show all the options available. Pressing a key not listed on the menu would
describe your character exploring the seedier, lesser-known parts of the
station. A particular unlisted key would lead you to a locked door and a secret
password which, once learned—from the grimy Trader, perhaps, or another
player—admits you to the Underground, where nefarious players can buy illicit
goods and coordinate against law-abiding Federation forces.</p></blockquote>
<p>Eve was (probably still is) a fantastic concept. I was Jexter the Caldari. With
my friend Fist, we founded a small roleplaying space-pirate group known as
Jokers. Back in our time, I think <a href="https://oldforums.eveonline.com/?a=topic&amp;threadID=356966">we made the news</a>.</p>
<p><img alt="Eve&rsquo;s Online 2009 Space Station" loading="lazy" src="/images/eve-online-space-station.png"></p>
<p>But what we found always missing was space station interaction. Besides
a generic system-wide chat, nothing encouraged players to spend time (and
roleplay!) while their ships were docked at those stunning space stations.
That&rsquo;s something TW2002 nailed down to near perfection. I wish Eve had that. It
could have kept me in the game for far longer.</p>
]]></content:encoded>
    </item>
    <item>
      <title>So tired of Homebrew messing up with my stuff</title>
      <link>https://nicolaiarocci.com/so-tired-of-homebrew-messing-up-with-my-stuff/</link>
      <pubDate>Tue, 25 May 2021 08:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/so-tired-of-homebrew-messing-up-with-my-stuff/</guid>
      <description>&lt;p&gt;Pardon me while I&amp;rsquo;m venting out my frustration. I am so tired of Homebrew
messing up with my stuff. It used to be the perfect tool for the right job
until they decided to auto-brew-update-and-cleanup at every new install.
Another day another issue, today with vim not running anymore:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dyld: Library not loaded: /usr/local/opt/lua/lib/liblua.5.3.dylib
Referenced from: /user/local/bin/vi
Reason: image not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lua has suddenly gone missing. Ah, but of course. I installed something with
Homebrew this morning. The fix is to &lt;code&gt;brew reinstall vim&lt;/code&gt;, which then leads to
the following error:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Pardon me while I&rsquo;m venting out my frustration. I am so tired of Homebrew
messing up with my stuff. It used to be the perfect tool for the right job
until they decided to auto-brew-update-and-cleanup at every new install.
Another day another issue, today with vim not running anymore:</p>
<pre><code>dyld: Library not loaded: /usr/local/opt/lua/lib/liblua.5.3.dylib
Referenced from: /user/local/bin/vi
Reason: image not found
</code></pre>
<p>Lua has suddenly gone missing. Ah, but of course. I installed something with
Homebrew this morning. The fix is to <code>brew reinstall vim</code>, which then leads to
the following error:</p>
<pre><code>Error: python@3.9 the bottle needs the Apple Command LIne Tools to be installed.
You can install them, if desired, with:
xcode-select --install
</code></pre>
<p>An <code>xcode-select install</code> and another <code>brew reinstall</code> later, vim is back home.
It&rsquo;s only a minor annoyance —only a few wasted minutes, but the point is, they
didn&rsquo;t need to be wasted. If you&rsquo;re frequently installing stuff via Homebrew,
this is quite a common, unpleasant occurrence (python virtual environments
being hit with alarming frequency).</p>
<p>I know that one can disable automatic cleanups by setting the
<code>HOMEBREW_NO_INSTALL_CLEANUP</code> environment variable. I will end up doing that
out of frustration sooner or later. Again, the point is I should not need to do
that.  It all adds unnecessary friction, especially for someone who&rsquo;s been
religiously running manual cleanups (I concede that an un-maintained brew cache
can grow to <em>very</em> sizable dimensions).</p>
<p>Homebrew is still an essential tool; just not so enjoyable anymore. It&rsquo;s not
like we have a valid alternative at hand, anyway.</p>
]]></content:encoded>
    </item>
    <item>
      <title>On Programming and Writing</title>
      <link>https://nicolaiarocci.com/on-programming-and-writing/</link>
      <pubDate>Tue, 25 May 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-programming-and-writing/</guid>
      <description>&lt;p&gt;My brilliant friend Salvatore Sanfilippo (otherwise known as antirez of Redis
fame) has an interesting write-up on &lt;a href=&#34;http://antirez.com/news/135&#34;&gt;his website&lt;/a&gt;. How similar is
programming to prose writing? After getting his own feet wet with novel
writing, he is convinced that the two activities share many common traits.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One year ago I paused my programming life and started writing a novel, with
the illusion that my new activity was deeply different than the previous one.
A river of words later, written but more often rewritten, I’m pretty sure of
the contrary: programming big systems and writing novels have many common
traits and similar processes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>My brilliant friend Salvatore Sanfilippo (otherwise known as antirez of Redis
fame) has an interesting write-up on <a href="http://antirez.com/news/135">his website</a>. How similar is
programming to prose writing? After getting his own feet wet with novel
writing, he is convinced that the two activities share many common traits.</p>
<blockquote>
<p>One year ago I paused my programming life and started writing a novel, with
the illusion that my new activity was deeply different than the previous one.
A river of words later, written but more often rewritten, I’m pretty sure of
the contrary: programming big systems and writing novels have many common
traits and similar processes.</p></blockquote>
<p>It is a worthy read. I especially appreciate his conclusions on what
programming can actually learn from writing:</p>
<blockquote>
<p>I believe programming, in this regard, can learn something from writing: when
writing the first core of a new system, when the original creator is still
alone, isolated, able to do anything, she should pretend that this first core
is her only bullet. During the genesis of the system she should rewrite this
primitive kernel again and again, in order to find the best possible design. My
hypothesis is that this initial design will greatly inform what will happen
later: growing organically something that has a good initial structure will
result in a better system, even after years of distance from the original
creation, and even if the original core was just a tiny faction of the future
mass the system would eventually assume.</p></blockquote>
<p>I suspect that his line of reasoning might be influenced by some sort
of confirmation bias<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.  We are inclined to notice similarities between our
own activities, especially so when we perform them passionately. While common
patterns emerge naturally, differences, even remarkable ones, tend to go
unnoticed.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The term <em>confirmation bias</em> is probably misused in this context. I am sure there is a better definition; it just eludes me and my own ignorance.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: The Voice of the Sirens. The Greeks and the art of persuasion</title>
      <link>https://nicolaiarocci.com/book-review-the-voice-of-the-sirens.-the-greeks-and-the-art-of-persuasion/</link>
      <pubDate>Sat, 15 May 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-the-voice-of-the-sirens.-the-greeks-and-the-art-of-persuasion/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;According to a famous and fortunate Homeric expression, words are winged, not
so much like birds but rather like arrows, which cut the air quickly to go
straight to the target and break through the listener&amp;rsquo;s heart. The Greeks
have always known that the word is used to convince and show truth and
correctness. But they also know that it has a magical force in it: it can
turn into a spell, capable of dominating and dragging the listener&amp;rsquo;s soul; to
bewitch like music and to heal like medicine; but, above all, to deceive and
mislead.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>According to a famous and fortunate Homeric expression, words are winged, not
so much like birds but rather like arrows, which cut the air quickly to go
straight to the target and break through the listener&rsquo;s heart. The Greeks
have always known that the word is used to convince and show truth and
correctness. But they also know that it has a magical force in it: it can
turn into a spell, capable of dominating and dragging the listener&rsquo;s soul; to
bewitch like music and to heal like medicine; but, above all, to deceive and
mislead.</p></blockquote>
<p>Laura Pepe teaches ancient greek law at the University of Milan. In her career,
she published many academic works and also scientific divulgation books. The
Voice of the Sirens falls in the latter category.</p>
<p>For the ancients, the Sirens were horrifying monsters, half birds and half
women. Yet, they had something that made them irresistible: the voice,
persuasive and captivating. In this book, along with other similar mythological
figures such as Circe, Calypso and Elena, Sirens are protagonists of a journey
that starts from Homer and focuses on the Athens of the 5th century. Athens,
the city of democracy and, even before that, of the word. Retracing
little-known stories and famous passages of prose and poetry, Professor Pepe
investigates the incredible potential of <em>peithó</em>, persuasion, the word that
both seduces and convinces.</p>
<p><img alt="La Voce delle Sirene" loading="lazy" src="/images/la-voce-delle-sirene.jpg#right">
The word, the most powerful sovereign, can carry out the most divine deeds: it
knows how to convince the true and the just, but it can also deceive and
mislead. Pepe shows its strengths by looking at the protagonists of politics
who address people gathered in assembly, and then at accusers and accused, who
work hard to convince the court&rsquo;s judges. Finally, she looks at the masters of
persuasion, the sophists, who were also active in 5th century Athens.</p>
<p>Professor Pepe does a great job at reminding us how and why Ancient Greece</p>
<ul>
<li>between history, myth, poems and philosophy - has shaped our way of thinking
and dealing with the world. In almost thousands of years, we have significantly
progressed in many incredible ways. Yet the mechanisms that drive modern
societies have evolved only marginally and, what&rsquo;s humbling, the fundamental
questions raised by the great minds of that age remain unanswered<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Unfortunately, I am not aware of any international edition currently available for this book. It deserves one.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Flask 2.0</title>
      <link>https://nicolaiarocci.com/flask-2.0/</link>
      <pubDate>Fri, 14 May 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/flask-2.0/</guid>
      <description>&lt;p&gt;Flask 2.0 has just been released. Along with it come many other major satellite
releases: Werkzeug 2.0, Jinja 3.0, Click 8.0, ItsDangerous 2.0, and MarkupSafe
2.0.&lt;/p&gt;
&lt;p&gt;Across all projects, Python 3.6+ is now required, and comprehensive type
annotations are supported. At a glance, I&amp;rsquo;d say that the biggest news is async
views in Flask 2. Work has also been done around Werkzeug &lt;code&gt;Request&lt;/code&gt; and
&lt;code&gt;Response&lt;/code&gt; classes to allow for better sync and async in the future (it&amp;rsquo;s not
a public API yet.) Jinja, Click and ItsDangerous come with a lot of new
niceties. Details are available on the &lt;a href=&#34;https://palletsprojects.com/blog/flask-2-0-released/&#34;&gt;Pallets website&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Flask 2.0 has just been released. Along with it come many other major satellite
releases: Werkzeug 2.0, Jinja 3.0, Click 8.0, ItsDangerous 2.0, and MarkupSafe
2.0.</p>
<p>Across all projects, Python 3.6+ is now required, and comprehensive type
annotations are supported. At a glance, I&rsquo;d say that the biggest news is async
views in Flask 2. Work has also been done around Werkzeug <code>Request</code> and
<code>Response</code> classes to allow for better sync and async in the future (it&rsquo;s not
a public API yet.) Jinja, Click and ItsDangerous come with a lot of new
niceties. Details are available on the <a href="https://palletsprojects.com/blog/flask-2-0-released/">Pallets website</a>.</p>
<p>Flask is, of course, the giant on which shoulders the whole <a href="https://python-eve.org">Eve</a> project rests.
To say that the Pallets team has been working hard at the forge is an
understatement—huge congrats to all of them.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Grim Secret of Nordic Happiness</title>
      <link>https://nicolaiarocci.com/the-grim-secret-of-nordic-happiness/</link>
      <pubDate>Wed, 12 May 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-grim-secret-of-nordic-happiness/</guid>
      <description>&lt;p&gt;For decades Scandinavian countries have been renowned for their educational
systems, low levels of corruption, sustainable economy, social justice, overall
quality of life. According to &lt;a href=&#34;https://slate.com/news-and-politics/2021/04/finland-happiness-lagom-hygge.html&#34;&gt;Jukka Savolainen on Slate&lt;/a&gt;, the reason why
Finns have now been dominating the World Happiness Report four years in a row
has little to do with these factors and more with their life expectations.&lt;/p&gt;
&lt;p&gt;Savolainen perspective is interesting because he is a Finn living in the US. He
experienced the Scandinavian system first hand, then moved to a (very)
different culture.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>For decades Scandinavian countries have been renowned for their educational
systems, low levels of corruption, sustainable economy, social justice, overall
quality of life. According to <a href="https://slate.com/news-and-politics/2021/04/finland-happiness-lagom-hygge.html">Jukka Savolainen on Slate</a>, the reason why
Finns have now been dominating the World Happiness Report four years in a row
has little to do with these factors and more with their life expectations.</p>
<p>Savolainen perspective is interesting because he is a Finn living in the US. He
experienced the Scandinavian system first hand, then moved to a (very)
different culture.</p>
<blockquote>
<p>The Nordic ethos stands in particularly stark contrast to the American
culture characterized by &ldquo;extreme emphasis upon the accumulation of wealth as
a symbol of success,&rdquo; as observed by the sociologist Robert K. Merton in the
1930s.</p></blockquote>
<p>In comparing the different lifestyles, he also touches on the social
differences. Scandinavian people are not famous for their openness or the
quality of their small talk, that&rsquo;s for sure. I do admire their low-aspirations
attitude, which is well described in the article.</p>
<blockquote>
<p>Moreover, they embrace a cultural orientation that sets realistic limits to
one&rsquo;s expectations for a good life. [&hellip;] People are socialized to believe
that what they have is as good as it gets—or close enough. This mindset
explains why Finns are the happiest people in the world despite living in
small apartments, earning modest incomes—with even more limited purchasing
power thanks to high prices and taxes—and, unlike Iceland, having never even
made it to the World Cup!</p></blockquote>
<p>I have always been fascinated by the North. When I went to Stockholm to present
at Pycon Sweden, I fell in love with the city. I was lucky, though. We were in
May, and the weather was beautiful all week. Daylight lasted until midnight. To
my enthusiasm, the locals objected I should come back in the winter season to
really appreciate what living in the North entails. As a Mediterranean guy,
I imagine I might soon feel the long for warmer climates and still, the dream
of moving North persists.</p>
]]></content:encoded>
    </item>
    <item>
      <title>dotnet SmtpClient should not be used</title>
      <link>https://nicolaiarocci.com/dotnet-smtpclient-should-not-be-used/</link>
      <pubDate>Tue, 04 May 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/dotnet-smtpclient-should-not-be-used/</guid>
      <description>&lt;p&gt;I am very late to the party, but today I learned that the good old dotnet
&lt;code&gt;SmptClient&lt;/code&gt; is considered obsolete and should not be used. Quoting the
documentation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We don&amp;rsquo;t recommend using the SmtpClient class for new development because
SmtpClient doesn&amp;rsquo;t support many modern protocols. Use MailKit or other
libraries instead. (&lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient?view=net-5.0&amp;amp;viewFallbackFrom=netcore-5.0#remarks&#34;&gt;source&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Interestingly, Microsoft is recommending a third-party open-source library as an
alternative. I hope we&amp;rsquo;ll see more of that in the future.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am very late to the party, but today I learned that the good old dotnet
<code>SmptClient</code> is considered obsolete and should not be used. Quoting the
documentation:</p>
<blockquote>
<p>We don&rsquo;t recommend using the SmtpClient class for new development because
SmtpClient doesn&rsquo;t support many modern protocols. Use MailKit or other
libraries instead. (<a href="https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient?view=net-5.0&amp;viewFallbackFrom=netcore-5.0#remarks">source</a>)</p></blockquote>
<p>Interestingly, Microsoft is recommending a third-party open-source library as an
alternative. I hope we&rsquo;ll see more of that in the future.</p>
<p>I just finished integrating <a href="https://github.com/jstedfast/MailKit">MailKit</a> in our backend. I must say that I&rsquo;m
pleasantly surprised by its rich feature-set and the elegant and
straightforward design, which makes getting on-board super easy. It&rsquo;s built on
top of the excellent MimeKit, after all, and authored by the very same author
Jeffrey Stedfast.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: One Man Caravan</title>
      <link>https://nicolaiarocci.com/book-review-one-man-caravan/</link>
      <pubDate>Sun, 02 May 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-one-man-caravan/</guid>
      <description>&lt;p&gt;Robert Edison Fulton was the first solo round-the-world motorcycle tourer. He
made his worldwide trip on a two-cylinder Douglas motorcycle between July 1932
and December 1933, more or less 90 years ago. On his way from London to the
colonial Middle East, Fulton crossed Nazi Germany. Some of the countries and
places he passed do not exist anymore. Most have changed dramatically; others,
not so much.  I suspect, for example, that his adventures in Syria,
Afghanistan, or at the Indian-Pakistani borders might have been written today.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Robert Edison Fulton was the first solo round-the-world motorcycle tourer. He
made his worldwide trip on a two-cylinder Douglas motorcycle between July 1932
and December 1933, more or less 90 years ago. On his way from London to the
colonial Middle East, Fulton crossed Nazi Germany. Some of the countries and
places he passed do not exist anymore. Most have changed dramatically; others,
not so much.  I suspect, for example, that his adventures in Syria,
Afghanistan, or at the Indian-Pakistani borders might have been written today.</p>
<p>Fulton was in his early twenties when he started his journey. The book was
published only a few years later, in 1937. Stories were still fresh and not
conditioned by the passing age. That is important because within the next
decade the world would change forever. Take Japan. There he is greeted by
a flock of enthusiast, merry motorcyclists who will accompany him across the
country, celebrating the strong bond between the United States and the Rising
Sun. In few years, the same situation will be inconceivable.</p>
<p><img alt="One Man Caravan book cover" loading="lazy" src="/images/one-man-caravan.jpg#right">
This book is not your typical motorcycle log. It is about stories, people, and
societies more than routes, timetables, and usual motorcycle porn. The Author
might happily skip thousands of miles across some undoubtedly incredible
terrain just because he feels the urge to tell about that memorable encounter
he had in Teheran or Tokyo or that otherwise small insignificant Malaysian
village.</p>
<p>The tone is often naive and amusing. Even dramatic events are often narrated in
a light, entertaining fashion. But make no mistake, this was a genuine
adventure, filled with thrilling and dangerous moments. It is somewhat
startling that the Author could cross so many God-forsaken places only to get
his bike stolen when he was back home in New York. Thankfully he got it back
one week later.</p>
<p>In few occurrences, a colonial attitude surfaces. That might sound jarring to
the modern educated reader, but we have to put it all in context. After all, in
1932, Fulton was the offspring of a wealthy American family. He was studying in
London when he left to explore the world in reply to a dare. Given the premise,
I think he instead emerges as a curious, unassuming person who is willing to
learn, understand and, of course, explore.</p>
<p>In the same years, Patrick Leigh Fermor, another young student, embarked on
a similar journey. He went all the way across Europe down to Constantinople, on
foot. Leigh Fermor memories are also available for your reading pleasure in
a remarkable three-book series<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Together, the stories of these two fearless
authors draw a great picture of an age when the world was still enormous and
divided into many diverse, often isolated cultures and societies.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>First one being <em>A Time of Gifts: On Foot to Constantinople: from the Hook of Holland to the Middle Danube</em>. Browse some of his books in my <a href="/books-i-have-read">reading list</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Git Worktree vs Git Savepoints</title>
      <link>https://nicolaiarocci.com/git-worktree-vs-git-savepoints/</link>
      <pubDate>Thu, 29 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/git-worktree-vs-git-savepoints/</guid>
      <description>&lt;p&gt;The official Git documentation presents the following example as a valid
use-case for the &lt;code&gt;worktree&lt;/code&gt; command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You are in the middle of a refactoring session and your boss comes in and
demands that you fix something immediately. You might typically use
git-stash&lt;a href=&#34;https://git-scm.com/docs/git-worktree&#34;&gt;1&lt;/a&gt; to store your changes away temporarily. However, your working
tree is in such a state of disarray (with new, moved, and removed files and
other bits and pieces strewn around) that you don&amp;rsquo;t want to risk disturbing
any of it. (&lt;a href=&#34;https://git-scm.com/docs/git-worktree&#34;&gt;source&lt;/a&gt;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The official Git documentation presents the following example as a valid
use-case for the <code>worktree</code> command:</p>
<blockquote>
<p>You are in the middle of a refactoring session and your boss comes in and
demands that you fix something immediately. You might typically use
git-stash<a href="https://git-scm.com/docs/git-worktree">1</a> to store your changes away temporarily. However, your working
tree is in such a state of disarray (with new, moved, and removed files and
other bits and pieces strewn around) that you don&rsquo;t want to risk disturbing
any of it. (<a href="https://git-scm.com/docs/git-worktree">source</a>)</p></blockquote>
<p>If you don&rsquo;t know about <code>worktree</code>, you should check it out. It is a handy,
powerful yet little known command. I don&rsquo;t use it, however. It will check out
a new branch to a new directory, and I don&rsquo;t like that. I prefer to keep the
simple, default 1:1 relationship between the repository and the file system.
Managing multiple working trees seems like an unnecessary complication when
similar results can be achieved with a few aliases.</p>
<p>Indeed, for the use-case above, my workflow revolves around three git-aliases.
Over the years, I collected many. Most of them (like the ones mentioned here)
are not my doing. I stumbled upon them somewhere, tinkered as needed, and then
incorporated them into my daily workflow.</p>
<h2 id="git-save"><code>git save</code></h2>
<p>This adds all changes, including untracked files, to the staging area and then
commits with a <code>SAVEPOINT</code> message. When an emergency hits and I need to
quickly switch context, I&rsquo;ll just <code>git save</code> and check out to a new branch to
do whatever I am tasked to do. When I&rsquo;m done, I&rsquo;ll switch back to my original
branch, <code>git undo</code>(see below), and resume work. It&rsquo;s easily configured with:</p>
<pre><code>$ git config --global alias.save '!git add -A &amp;&amp; git commit -m &quot;SAVEPOINT&quot;'
</code></pre>
<h2 id="git-wip"><code>git wip</code></h2>
<p><code>wip</code> is similar to <code>save</code>. It stages all tracked changes and then commits with
a <code>WIP</code> message. So yes, it offers the same features as above but leaves
untracked files unstaged, a significant difference. Like above, when done with
the extra work, I&rsquo;ll switch back, <code>git undo</code>, and resume. Set it up with:</p>
<pre><code>$ git config --global alias.wip '!git add -u &amp;&amp; git commit -m &quot;WIP&quot;'
</code></pre>
<h2 id="git-undo"><code>git undo</code></h2>
<p>This alias allows me to quickly resume work after a <code>save</code> or <code>wip</code>. It undoes
the last commit but keeps its changes, with files unstaged. It can also be used
in other circumstances (for those, however, I have a functionally identical
<code>r1</code> alias at hand). Configure with:</p>
<pre><code>$ git config —-global alias.undo 'reset HEAD^ —-mixed'
</code></pre>
<h2 id="git-wipe"><code>git wipe</code></h2>
<p>This is a special, use-with-caution one. It adds changes in the working tree to
a <code>WIPE SAVEPOINT</code> commit, then it wipes the commit. At that point, the working
tree is clean, but I can still go back to that work if the need arises (via
reflog). Seldom used, this <code>wipe</code> comes in handy when I have some experimental
code that is not going into production and yet, I want to keep it around. Set
it up with:</p>
<pre><code>$ git config --global alias.wipe \
    '!git add -A &amp;&amp; git commit -qm &quot;WIPE SAVEPOINT&quot; &amp;&amp; git reset HEAD~1 --hard'
</code></pre>
<p>If you are not familiar with the git reflog, you might want to stay clear from
<code>wipe</code>, though.</p>
<p>One advantage of this workflow is that saved changes will stay with their
relevant branch. When you get back to it, <code>git log</code> will hint at what happened
when you left. Assuming it is a private branch, you might even decide to push
it for backup before starting the hotfix work.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Earth Restored</title>
      <link>https://nicolaiarocci.com/earth-restored/</link>
      <pubDate>Sun, 25 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/earth-restored/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Only 24 people have journeyed far enough to see the whole Earth against the
black of space. The images they brought back changed our world. Here is
a selection of the most beautiful photographs of Earth — iconic images and
unknown gems — digitally restored to their full glory.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Toby Ord&amp;rsquo;s recent &lt;a href=&#34;https://www.tobyord.com/earth&#34;&gt;Earth Restored&lt;/a&gt; project is
a must-see.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Only 24 people have journeyed far enough to see the whole Earth against the
black of space. The images they brought back changed our world. Here is
a selection of the most beautiful photographs of Earth — iconic images and
unknown gems — digitally restored to their full glory.</p></blockquote>
<p>Toby Ord&rsquo;s recent <a href="https://www.tobyord.com/earth">Earth Restored</a> project is
a must-see.</p>
]]></content:encoded>
    </item>
    <item>
      <title>New Eve-Swagger and Flask-Sentinel releases</title>
      <link>https://nicolaiarocci.com/new-eve-swagger-and-flask-sentinel-releases/</link>
      <pubDate>Sat, 24 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/new-eve-swagger-and-flask-sentinel-releases/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s maintenance day in my little Python world. I just released new versions of
two small but apparently quite popular packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://pypi.org/project/Eve-Swagger/&#34;&gt;eve-swagger&lt;/a&gt;, the OpenAPI/Swager
extensions for &lt;a href=&#34;https://python-eve.org&#34;&gt;Eve&lt;/a&gt;-powered APIs, hits v0.1.4. It&amp;rsquo;s
just a single fix for API breakage introduced with the previous release;
details available
&lt;a href=&#34;https://github.com/pyeve/eve-swagger/blob/master/CHANGES.rst&#34;&gt;here&lt;/a&gt;. Thanks to
Asger Gitz-Johansen for the help with this release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://pypi.org/project/Flask-Sentinel/&#34;&gt;Flask-Sentinel&lt;/a&gt;, an Oauth2 Provider
for Flask, hits v0.0.8. This also is a small release that fixes 500 errors if
you were using unpinned versions of redis. This time, my gratitude goes to Adrian Cin.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s maintenance day in my little Python world. I just released new versions of
two small but apparently quite popular packages:</p>
<ul>
<li>
<p><a href="https://pypi.org/project/Eve-Swagger/">eve-swagger</a>, the OpenAPI/Swager
extensions for <a href="https://python-eve.org">Eve</a>-powered APIs, hits v0.1.4. It&rsquo;s
just a single fix for API breakage introduced with the previous release;
details available
<a href="https://github.com/pyeve/eve-swagger/blob/master/CHANGES.rst">here</a>. Thanks to
Asger Gitz-Johansen for the help with this release.</p>
</li>
<li>
<p><a href="https://pypi.org/project/Flask-Sentinel/">Flask-Sentinel</a>, an Oauth2 Provider
for Flask, hits v0.0.8. This also is a small release that fixes 500 errors if
you were using unpinned versions of redis. This time, my gratitude goes to Adrian Cin.</p>
</li>
</ul>
<p>Enjoy.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I am a Mars Helicopter Contributor</title>
      <link>https://nicolaiarocci.com/i-am-a-mars-helicopter-contributor/</link>
      <pubDate>Tue, 20 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-a-mars-helicopter-contributor/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;The Mars Helicopter Contributor badge&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/mars-achievement.webp#right&#34;&gt;
As I was browsing my RSS feed this morning, I came across a [new blog][1] from
Nat Friedman over at GitHub. The piece was titled &amp;ldquo;Open source goes to Mars&amp;rdquo;,
and, of course, it caught my interest. In the article, Nat announced a Mars
2020 Helicopter Mission badge added to GitHub profiles contributing to
open-source projects and libraries used by Ingenuity. Some time ago, like many
others, I was granted the Arctic Code Vault badge, so I am familiar with the
concept. I quickly dismissed the information as &amp;ldquo;nice, not gonna get it&amp;rdquo; and
moved along.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="The Mars Helicopter Contributor badge" loading="lazy" src="/images/mars-achievement.webp#right">
As I was browsing my RSS feed this morning, I came across a [new blog][1] from
Nat Friedman over at GitHub. The piece was titled &ldquo;Open source goes to Mars&rdquo;,
and, of course, it caught my interest. In the article, Nat announced a Mars
2020 Helicopter Mission badge added to GitHub profiles contributing to
open-source projects and libraries used by Ingenuity. Some time ago, like many
others, I was granted the Arctic Code Vault badge, so I am familiar with the
concept. I quickly dismissed the information as &ldquo;nice, not gonna get it&rdquo; and
moved along.</p>
<p>Later during the day, I got a mail from an Eve contributor. In between other
things, he briefly congratulated me on my new GitHub badge. I went to check my
profile, only to find that, indeed, I am a Mars Helicopter Contributor. I was
bewildered. To my knowledge, I never worked on something even remotely related
to the Ingenuity mission.</p>
<p>Years ago, I received a package from a software team at a private space agency
whose name I cannot tell. They sent me a lot of cool swag and a hand-written
letter signed by all team members. In it, I learned that they had been using
one of my open-source projects with success. They added that I should take
pride, as my work was used in one of their renowned space ships projects. The
package was their way to express gratitude. If you&rsquo;ve attended any of my talks
in the past, you probably know this story. You might have seen me wearing one
of their t-shirts too. I knew my work was used in many places; I certainly did
not expect it was contributing to a space ship program.</p>
<p>So when I reached for my profile page on GitHub today, I was confused, yes, but
not wholly unprepared. And indeed, there it is, the new, shiny Mars Helicopter
Contributor badge. A quick investigation revealed that I earned it as a Flask
contributor. To be honest, I don&rsquo;t even remember contributing to it<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I know
I&rsquo;ve used it extensively, of course, as [Eve][4] inherits from and builds on it.</p>
<p><img alt="The Mars Helicopter Contributor badge" loading="lazy" src="/images/mars-profile-badge.png"></p>
<p>So, what to make of all of this? I am happy, of course. I have a badge of
honor to show off to my kids later this evening. I appreciate the intent:</p>
<blockquote>
<p>“Many of the people who are getting a badge probably have no idea their
software is being used to fly a helicopter on another planet,” says GitHub
Senior Director of Developer Relations Martin Woodward. “We wanted to make
sure everyone was recognized for their contributions to this incredible human
achievement.” (<a href="https://github.com/readme/nasa-ingenuity-helicopter">source</a>)</p></blockquote>
<p>These badges surely help raise awareness of open-source relevance in the
modern-day world. I am grateful for it. I have to say, however, that I am not
a fan of the current gamification process going on at GitHub. I cringed when
I saw the &ldquo;How do you feel today&rdquo; box in my profile page a while ago<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. This
Achievements feature looks good on the surface. Still, it leans itself to be
leveraged in many different, even subtle ways. Let&rsquo;s hope for the best.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>A quick <code>git shortlog -sne</code> on the flask repo confirms the rumors.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>It seems gone now?
[4]: <a href="https://github.com/pyeve/">https://github.com/pyeve/</a>
[1]: <a href="https://github.blog/2021-04-19-open-source-goes-to-mars/">https://github.blog/2021-04-19-open-source-goes-to-mars/</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Adding is favoured over subtracting in problem solving (and software systems)</title>
      <link>https://nicolaiarocci.com/adding-is-favoured-over-subtracting-in-problem-solving-and-software-systems/</link>
      <pubDate>Sun, 18 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/adding-is-favoured-over-subtracting-in-problem-solving-and-software-systems/</guid>
      <description>&lt;p&gt;Consider the 10x10 grids of green and white boxes below. How would you
make them symmetrical? Most people would add green boxes to the emptier half of
the grid rather than remove them from the fuller half. &lt;em&gt;Even when the latter
would have been more efficient&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/asymmetrical-grid.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;The case, along with a similar problem revolving around the stability of
a peculiar lego structure, is reported by an &lt;a href=&#34;https://www.nature.com/articles/d41586-021-00592-0&#34;&gt;intriguing Nature article&lt;/a&gt; on
the topic of psychology and human behaviour. The paper linked to the piece
demonstrates that people consistently consider changes that add components over
those that subtract them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Consider the 10x10 grids of green and white boxes below. How would you
make them symmetrical? Most people would add green boxes to the emptier half of
the grid rather than remove them from the fuller half. <em>Even when the latter
would have been more efficient</em>.</p>
<p><img loading="lazy" src="/images/asymmetrical-grid.jpg"></p>
<p>The case, along with a similar problem revolving around the stability of
a peculiar lego structure, is reported by an <a href="https://www.nature.com/articles/d41586-021-00592-0">intriguing Nature article</a> on
the topic of psychology and human behaviour. The paper linked to the piece
demonstrates that people consistently consider changes that add components over
those that subtract them.</p>
<blockquote>
<p>What are the implications of Adams and colleagues’ findings? There are many
real-world consequences of failing to consider that situations can often be
improved by removing rather than adding. For instance, when people feel
dissatisfied with the decor of their home, they might address the situation
by going on a spending spree and acquiring more furniture — even if it would
be equally effective to get rid of a cluttering coffee table.  [&hellip;] On
a grander scale, the favouring of additive solutions by individual
decision-makers might contribute to problematic societal phenomena, such as
the increasing expansion of formal organizations4 and the near-universal but
environmentally unsustainable quest for economic growth. (<a href="https://www.nature.com/articles/d41586-021-00592-0">source</a>)</p></blockquote>
<p>Is the innate tendency to favour additive solutions contributing to the entropy
of the software systems we build? And if so, isn&rsquo;t over-engineering, the
scarecrow of software systems,  its most apparent consequence? I&rsquo;m in no way an
expert in human behaviour and its implications in software engineering. Still,
my bet is on a hard yes on both questions.</p>
]]></content:encoded>
    </item>
    <item>
      <title>SQLite is the only database you will ever need in most cases</title>
      <link>https://nicolaiarocci.com/sqlite-is-the-only-database-you-will-ever-need-in-most-cases/</link>
      <pubDate>Sat, 17 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/sqlite-is-the-only-database-you-will-ever-need-in-most-cases/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The name SQLite is a nice name, but the &amp;ldquo;lite&amp;rdquo; part is misleading, it sounds
like it is only useful for tiny things - which is very wrong. SQLite should
be named AwesomeSQL, because that is what it is. SQLite is probably the only
database you will ever need in most cases&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Yeah. &lt;a href=&#34;https://unixsheikh.com/articles/sqlite-the-only-database-you-will-ever-need-in-most-cases.html&#34;&gt;This article&lt;/a&gt; resonates with me. SQLite is the de-facto standard
engine for embedded systems. But it should also be the go-to database for all
those websites and services that don&amp;rsquo;t need to scale to multiple machines.
Which, in the real world, happens way more frequently than we all imagine.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The name SQLite is a nice name, but the &ldquo;lite&rdquo; part is misleading, it sounds
like it is only useful for tiny things - which is very wrong. SQLite should
be named AwesomeSQL, because that is what it is. SQLite is probably the only
database you will ever need in most cases</p></blockquote>
<p>Yeah. <a href="https://unixsheikh.com/articles/sqlite-the-only-database-you-will-ever-need-in-most-cases.html">This article</a> resonates with me. SQLite is the de-facto standard
engine for embedded systems. But it should also be the go-to database for all
those websites and services that don&rsquo;t need to scale to multiple machines.
Which, in the real world, happens way more frequently than we all imagine.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: The Silence, A Novel</title>
      <link>https://nicolaiarocci.com/book-review-the-silence-a-novel/</link>
      <pubDate>Sun, 11 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-the-silence-a-novel/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;It is Super Bowl Sunday in the year 2022. Five people, dinner, an apartment
on the east side of Manhattan. The retired physics professor and her husband
and her former student waiting for the couple who will join them from what
becomes a dramatic flight from Paris. The conversation ranges from a survey
telescope in North-central Chile to a favorite brand of bourbon to Einstein’s
1912 Manuscript on the Special Theory of Relativity. Then something happens
and the digital connections that have transformed our lives are severed. What
follows is a dazzling and profoundly moving conversation about what makes us
human.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>It is Super Bowl Sunday in the year 2022. Five people, dinner, an apartment
on the east side of Manhattan. The retired physics professor and her husband
and her former student waiting for the couple who will join them from what
becomes a dramatic flight from Paris. The conversation ranges from a survey
telescope in North-central Chile to a favorite brand of bourbon to Einstein’s
1912 Manuscript on the Special Theory of Relativity. Then something happens
and the digital connections that have transformed our lives are severed. What
follows is a dazzling and profoundly moving conversation about what makes us
human.</p></blockquote>
<p><img alt="The Silence (book cover)" loading="lazy" src="/images/the-silence.jpg#right">
What happens when our technology suddenly abandons us? In this novella, DeLillo
explores the immediate consequences of such an event. It&rsquo;s a brief exploration,
though. We don&rsquo;t get to go too far into the story. The book ends abruptly, and
we&rsquo;re left stranded there, pondering and wondering. I imagine this is
intentional. Upon reflection, I concede the author&rsquo;s goal is achieved, but
I have to say, my immediate feeling is unfinished work.</p>
<p>The writing meets DeLillo&rsquo;s high standards. If you&rsquo;ve read him before, you&rsquo;ll
recognize his peculiar style at first sight. The idea is also good, albeit not
super-original.</p>
<p>I found The Silence to be good, but not as good as I expected. After reading
Underworld, the bar is set pretty damn high. Anything from DeLillo should
pertain to the mind-boggling department. This novel fits more in the ok
department. It could serve as a great, gentle introduction to DeLillo, though,
as his other works can indeed be intimidating.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Real Book (of Jazz)</title>
      <link>https://nicolaiarocci.com/the-real-book-of-jazz/</link>
      <pubDate>Thu, 08 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-real-book-of-jazz/</guid>
      <description>&lt;p&gt;What a fascinating read. It sits right at the intersection of two of my (too
many) vicious interests: Jazz music and books.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Since the mid-1970s, almost every jazz musician has owned a copy of the same
book. It has a peach-colored cover, a chunky, 1970s-style logo, and a black
plastic binding. It’s delightfully homemade-looking—like it was printed by
a bunch of teenagers at a Kinkos. And inside is the sheet music for hundreds
of common jazz tunes—also known as jazz “standards”—all meticulously notated
by hand. It’s called the Real Book.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>What a fascinating read. It sits right at the intersection of two of my (too
many) vicious interests: Jazz music and books.</p>
<blockquote>
<p>Since the mid-1970s, almost every jazz musician has owned a copy of the same
book. It has a peach-colored cover, a chunky, 1970s-style logo, and a black
plastic binding. It’s delightfully homemade-looking—like it was printed by
a bunch of teenagers at a Kinkos. And inside is the sheet music for hundreds
of common jazz tunes—also known as jazz “standards”—all meticulously notated
by hand. It’s called the Real Book.</p></blockquote>
<blockquote>
<p>But if you were going to music school in the 1970s, you couldn’t just buy
a copy of the Real Book at the campus bookstore. Because the Real Book… was
illegal. The world’s most popular collection of Jazz music was a totally
unlicensed publication. It was a self-published book created without
permission from music publishers or songwriters. It was duplicated at
photocopy shops and sold on street corners, out of the trunks of cars, and
under the table at music stores where people used secret code words to make
the exchange. The full story of how the Real Book came to be this bootleg
bible of jazz is a complicated one. It’s a story about what happens when an
insurgent, improvisational art form like Jazz gets codified and becomes
something that you can learn from a book.</p></blockquote>
<p>The whole story, both as text or podcast, is available <a href="https://99percentinvisible.org/episode/the-real-book/">here</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quicker window snapping on macOS</title>
      <link>https://nicolaiarocci.com/quicker-window-snapping-on-macos/</link>
      <pubDate>Tue, 06 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quicker-window-snapping-on-macos/</guid>
      <description>&lt;p&gt;I never see my macOS desktop. It&amp;rsquo;s always cluttered with way too many open
windows. When I spot those fantastic, tidy and clean Desktops on the internet,
I envy their owners. I wonder if and how they manage to keep those desktops
tidy like that the whole workday. It must feel so good.&lt;/p&gt;
&lt;p&gt;I try to keep my windows well arranged. The typical setup might be two windows,
from two different apps, tiled side by side. Maybe the browser, or Postman, on
the right, and my favourite editor on the left. Stuff like that.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I never see my macOS desktop. It&rsquo;s always cluttered with way too many open
windows. When I spot those fantastic, tidy and clean Desktops on the internet,
I envy their owners. I wonder if and how they manage to keep those desktops
tidy like that the whole workday. It must feel so good.</p>
<p>I try to keep my windows well arranged. The typical setup might be two windows,
from two different apps, tiled side by side. Maybe the browser, or Postman, on
the right, and my favourite editor on the left. Stuff like that.</p>
<p><a href="https://hookshot.app/">Hookshot</a> is excellent for doing just that. I discovered this tiny little
app a few weeks ago, thanks to <a href="https://www.robinrendle.com/notes/hookshot">Robin Rendle</a>. Before, I was using Moom,
which is also good. I like Hookshot&rsquo;s dead-simple keyboard shortcuts. Once the
single modifier key combo <em>Control+Command</em> clicks, you&rsquo;re done. Rearranging
windows becomes a no-brainer. In a way, the experience reminds me of Vim and
its unique muscle-memory superpower. The ten days trial ended today, and
I purchased the license right away.</p>
]]></content:encoded>
    </item>
    <item>
      <title>School assignments that count: simulating the COVID outbreak with the C language</title>
      <link>https://nicolaiarocci.com/school-assignments-that-count-simulating-the-covid-outbreak-with-the-c-language/</link>
      <pubDate>Mon, 05 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/school-assignments-that-count-simulating-the-covid-outbreak-with-the-c-language/</guid>
      <description>&lt;p&gt;Giulia got an exciting assignment from her teacher:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Write a C program that simulates (a simplified version of) COVID outbreak
spreading across a population of 200 people. When a healthy person comes into
contact with a sick person, the healthy person becomes ill, too. After some
time, a sick person will recover. A recovered person cannot infect a healthy
person nor become sick again after coming in contact with a sick person.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Giulia got an exciting assignment from her teacher:</p>
<blockquote>
<p>Write a C program that simulates (a simplified version of) COVID outbreak
spreading across a population of 200 people. When a healthy person comes into
contact with a sick person, the healthy person becomes ill, too. After some
time, a sick person will recover. A recovered person cannot infect a healthy
person nor become sick again after coming in contact with a sick person.</p></blockquote>
<p>In more prosaic terms: the world comprises a 30*50 cell grid. Of these, 200
cells are randomly selected to be alive. Throughout the simulation, each of
these cells can be in one of the following three states: healthy, sick, or
recovered. If a cell is ill, at the next cycle, all neighbouring cells will
also be diseased. A cell stays sick for 14 cycles. At cycle 15, it is healed.
The simulation ends when all 200 cells are either recovered or healthy.</p>
<p>Giulia&rsquo;s implementation was fine, but a couple of subtle bugs prevented it from
succeeding, and that&rsquo;s how I got involved. In general, she doesn&rsquo;t ask for
help, nor do I ask her about her progress. If she reaches out to me, it&rsquo;s only
for serious trouble, and when that happens, I enjoy working with her. Besides,
while I do a lot C# these days, I don&rsquo;t do C since aeons ago, so it&rsquo;s great to
get back to it every once in a while.</p>
<p><img alt="first cyckle" loading="lazy" src="/images/covid-sim-prima-esecuzione.png">
Above, the healthy population inhabiting its 1500-cells world, right before the outbreak.</p>
<p><img alt="intermediate" loading="lazy" src="/images/covid-sim-esecuzione-intermedia.png">
Halfway through the simulation, 86 cells are healthy, 46 are sick, and 68 are
healed.</p>
<p><img alt="final cycle" loading="lazy" src="/images/covid-sim-ultima-esecuzione.png">
End of the simulation. It doesn&rsquo;t matter how many times you run it; the number
of people who were never infected is stunningly low by the end. Moreover,
a simulation like this one, albeit simplified, reveals how dramatically an epidemic
can spread if not contained with social distancing.</p>
<p>I was pleasantly surprised by this assignment. Here we have a teacher who
doesn&rsquo;t constraint herself to the standard, well-established routine. Instead,
she keeps her students engaged and challenges them. At the same time, she takes
the chance to educate them on the current sanitary emergency. Giulia tells me
that her teacher was inspired by a March 2020 Washington Post article: <em><a href="https://www.washingtonpost.com/graphics/2020/world/corona-simulator/">Why
outbreaks like coronavirus spread exponentially, and how to &ldquo;flatten the
curve.&rdquo;</a></em> That&rsquo;s excellent work. It includes several animated simulations,
Giulia&rsquo;s assignment being one of them.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: In the Heart of the Sea, The Tragedy of the Waleship Essex</title>
      <link>https://nicolaiarocci.com/book-review-in-the-heart-of-the-sea-the-tragedy-of-the-waleship-essex/</link>
      <pubDate>Fri, 02 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-in-the-heart-of-the-sea-the-tragedy-of-the-waleship-essex/</guid>
      <description>&lt;p&gt;While reading &lt;a href=&#34;https://nicolaiarocci.com/book-review-erebus-the-story-of-a-ship/&#34;&gt;Erebus, The Story of a Ship&lt;/a&gt;, my attention was caught by
a brief mention of the Whaleship Essex.  Being the sucker that I am for
exploration and dramatic adventure stories from the early days, I researched
it, only to surface with Nathaniel Philbricks&amp;rsquo; In The Heart of the Sea in my
hands.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the Heart of the Sea brings to new life the incredible story of the wreck
of the whaleship Essex - an event as mythic in its own century as the Titanic
disaster in ours, and the inspiration for the climax of Moby-Dick. In
a harrowing page-turner, Nathaniel Philbrick restores this epic story to its
rightful place in American history.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>While reading <a href="/book-review-erebus-the-story-of-a-ship/">Erebus, The Story of a Ship</a>, my attention was caught by
a brief mention of the Whaleship Essex.  Being the sucker that I am for
exploration and dramatic adventure stories from the early days, I researched
it, only to surface with Nathaniel Philbricks&rsquo; In The Heart of the Sea in my
hands.</p>
<blockquote>
<p>In the Heart of the Sea brings to new life the incredible story of the wreck
of the whaleship Essex - an event as mythic in its own century as the Titanic
disaster in ours, and the inspiration for the climax of Moby-Dick. In
a harrowing page-turner, Nathaniel Philbrick restores this epic story to its
rightful place in American history.</p></blockquote>
<p>In The Heart of the Sea is a nonfiction work. By telling the story of the Essex
Whaleship&rsquo;s final voyage, it successfully brings back the difficult, dangerous,
and adventurous lives of the 19th-century whalers.</p>
<p>The book is organized into four main parts. In the first part, the author
recounts Nantucket&rsquo;s culture and it&rsquo;s people way of life. The isle of Nantucket
was the then flourishing world capital of the whale-hunting industry.  It is
difficult for a modern-world citizen to conceive how big a deal the
whale-hunting industry was back then. Just think that, back then, all the
street lamps and most common lamps were burning - you guessed it - whale oil.</p>
<p>In the second part, we follow the Whaleship Essex and its crew as they hunt
sperm whales across the Atlantic Ocean and the Pacific. This is where we learn
what living the whale-hunter life on board an 18th-century ship was like, and
let me tell you, it wasn&rsquo;t pretty. We also get to know most crew members,
starting from Captain George Pollard Jr. and First Mate Owen Chase. They
will both have a prominent role in the events that will follow.</p>
<p>The third part is the earth of the story. Essex&rsquo;s wreck was caused by an
enraged sperm whale. After the disaster, the crew then had to go through
a dramatic ordeal. They were alone, on three tiny whaleboats in the middle of
the Pacific, 3.700km west of South America, with scarce food and water.  The
choices they made at that moment were crucial. Unfortunately, they weren&rsquo;t
the right ones. I think this is an essential point in the story. Ignorance, and
superstitions, induced the survivors to make the wrong call on their next move,
which led to terrible, unbearable consequences.</p>
<p>The fourth part follows the survivors as they come back to the isle and then
spend the rest of their lives struggling to arrive at peace with the events
they lived and the actions they were forced to commit during their 1820 ordeal
(Philbrick just <em>loves</em> using this world, &ldquo;ordeal&rdquo;.)</p>
<p><img alt="In the Heart of the Sea (book cover)" loading="lazy" src="/images/in-the-heart-of-the-sea.jpg#right">
I thoroughly enjoyed this book. Philbrick did a great job reconstructing and
then telling the events in a fascinating, engaging way. Not that the story
needed embellishments, really. Having read the account of the disaster compiled
by First Mate Owen Chase, Hermann Melville used it as inspiration for his
Moby-Dick. Philbrick actually tries to reconstruct Melville&rsquo;s encounters with
both Captain Pollard and First Mate Chase. I appreciate how the author always
informs the reader when he&rsquo;s entering speculation territory.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Hitchhiker’s Guide to Online Anonymity</title>
      <link>https://nicolaiarocci.com/the-hitchhikers-guide-to-online-anonymity/</link>
      <pubDate>Thu, 01 Apr 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-hitchhikers-guide-to-online-anonymity/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is a maintained technical guide that aims to provide introduction to
various online tracking techniques, online id verification techniques and
guidance to creating and maintaining (truly) anonymous online identities
including social media accounts safely and legally. No pre-requisites besides
English reading are required.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;At a glance, I suspect most people will be tempted to dismiss &lt;a href=&#34;https://anonymousplanet.org/index.html&#34;&gt;The Hitchhiker&amp;rsquo;s
Guide to Online Anonymity&lt;/a&gt; as borderline paranoia. But make no mistake, it
is a great resource. Granted, not everyone on the Internet is interested in
anonymous identities (I am not) or concerned about NSA or the Mossad hunting
them down. People have different threat levels.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>This is a maintained technical guide that aims to provide introduction to
various online tracking techniques, online id verification techniques and
guidance to creating and maintaining (truly) anonymous online identities
including social media accounts safely and legally. No pre-requisites besides
English reading are required.</p></blockquote>
<p>At a glance, I suspect most people will be tempted to dismiss <a href="https://anonymousplanet.org/index.html">The Hitchhiker&rsquo;s
Guide to Online Anonymity</a> as borderline paranoia. But make no mistake, it
is a great resource. Granted, not everyone on the Internet is interested in
anonymous identities (I am not) or concerned about NSA or the Mossad hunting
them down. People have different threat levels.</p>
<p>Ideally, however, everyone should have a basic understanding of how his/her
activities can be tracked down on the Internet. The Hitchhiker&rsquo;s Guide does
a great job at panning out of all that. Armed with this kind of knowledge, we
can then decide our threat level and act accordingly. The website is also
chocked-full of links to valuable resources.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Half-century of service</title>
      <link>https://nicolaiarocci.com/half-century-of-service/</link>
      <pubDate>Mon, 29 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/half-century-of-service/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.gyford.com/phil/writing/2021/03/18/half-century-notes/&#34;&gt;Phil&lt;/a&gt; and &lt;a href=&#34;https://adactio.com/journal/17974&#34;&gt;Jeremy&lt;/a&gt; both turned 50 this year. They took the opportunity
to write some half-century notes. Having turned 50 myself and inspired by them,
I thought I would do the same.&lt;/p&gt;
&lt;h3 id=&#34;0-10&#34;&gt;0-10&lt;/h3&gt;
&lt;p&gt;I see the light 50 years ago in Molise, a southern region of Italy that also
happens to be the smallest and less known. One year later, my brother joins the
family. Our parents are from a small village in Molise heights. When I am
three, my family moves to Nigeria, following my dad, who is employed in the oil
field. We spend about two years there. The memories from that period are
scavenged from some clips recorded by my dad at the time. A female monkey used
to live in our garden. Our home was part of a walled complex. Two soldiers were
guarding the entrance, night and day. The wall, I remember, was built with
wooden pales, very much like those wild-west forts from the old movies. When we
move back, it is for the North-Eastern part of Italy, in the Ferrara province
first, and then in Ravenna. I guess there&amp;rsquo;s not a lot to say about this decade;
the usual baby-son-of-a-middle-class-emigrant-family routine applies here.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://www.gyford.com/phil/writing/2021/03/18/half-century-notes/">Phil</a> and <a href="https://adactio.com/journal/17974">Jeremy</a> both turned 50 this year. They took the opportunity
to write some half-century notes. Having turned 50 myself and inspired by them,
I thought I would do the same.</p>
<h3 id="0-10">0-10</h3>
<p>I see the light 50 years ago in Molise, a southern region of Italy that also
happens to be the smallest and less known. One year later, my brother joins the
family. Our parents are from a small village in Molise heights. When I am
three, my family moves to Nigeria, following my dad, who is employed in the oil
field. We spend about two years there. The memories from that period are
scavenged from some clips recorded by my dad at the time. A female monkey used
to live in our garden. Our home was part of a walled complex. Two soldiers were
guarding the entrance, night and day. The wall, I remember, was built with
wooden pales, very much like those wild-west forts from the old movies. When we
move back, it is for the North-Eastern part of Italy, in the Ferrara province
first, and then in Ravenna. I guess there&rsquo;s not a lot to say about this decade;
the usual baby-son-of-a-middle-class-emigrant-family routine applies here.</p>
<h3 id="10-20">10-20</h3>
<p>Teenage turmoil. I&rsquo;m an insecure, shy adolescent with way too much imagination
and lots of unreleased energy to handle. The neighbourhood offers a good pack
of friends. I tend to keep most of my super-fancy thoughts to myself. It does
not help that I get strange looks when I try to share them with friends. Midway
into the decade, I find out about computers. Claudio, who&rsquo;s living next door,
has a Sinclair Spectrum ZX. I am fascinated by it. After some little moral
suasion, my dad gets me a Commodore 64, which I immediately nick-name Charlie.
It unlocks a universe of possibilities.</p>
<p>At school, I meet Serena. In 1987, at seventeen, I overcome my shyness, go to
the local computer shop, and ask if they&rsquo;d be interested in sponsoring the
first Bulletin Board System, or BBS, in town. Freddy, the guy at the counter,
replies with a convinced yes. A few weeks later, Lorien BBS is alive and
kicking from the shop&rsquo;s backroom. Around it, a gang of local wanna-be hackers
gathers. Among them is Stefano. I graduate from Ravenna&rsquo;s accounting school
with a computer-programming degree.</p>
<h3 id="20-30">20-30</h3>
<p>I spend one hell of a challenging year in the navy. It&rsquo;s my first experience
away from home, discipline is rigid, and the Gulf War is in full swing. After
three months of training, I am deployed as a signaler on board a navy ship in
the Mediterranean sea. When I get back from the navy and am about to enroll in
the Computer Science course at the University of Bologna, Stefano and Freddy
come up with this weird idea that we could start a software company.
I enthusiastically agree. It&rsquo;s the early 90s, I am 21, and the world is my
oyster. We begin with courses, then pivot to what we were set to do: writing
computer programs and selling them. The original Lorien BBS from the 80s moves
into new offices and becomes Phoenix BBS, a fully-fledged FidoNet node<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>MS-DOS is dominating the market. We bet on Windows 3.1 and start writing
software for it. One week I spend at my desk, hacking code; the next week,
I load my car&rsquo;s trunk with my software and travel around Italy, proposing my
boxes to computer stores. At that time, software was sold on floppy disks,
along with a printed manual, all packaged in cardboard boxes. I remember
resellers asking why in the world we were selling Windows software when
everyone was on MS-DOS. Later on, to leverage our now developed resellers'
network, we begin distributing third-party products, mainly anti-virus
software: McAfee and, later, Norton and others. The Internet appears out of
nowhere, and I don&rsquo;t immediately grasp its innovative potential. I marry
Serena. We live in a house we bought years before, with help from my family and
a 20-year loan.  Besides hacking at computers, my hobbies are hiking and
climbing the Alps.</p>
<h3 id="30-40">30-40</h3>
<p>In 2000 our first son Marco is born. Giulia arrives four years later. Then
comes Anna in 2006. Meanwhile, Serena goes back from teaching to being an
epidemiologist, and then she eventually sets back again into teaching math in
high school. I slow down on hiking and climbing and take on running, even
competitively, and swimming. We sell our home, a townhouse, and move into
a flat with an extra bedroom. In the process, we extinguish the loan. We are
now debt-free, and it feels good. I miss the tiny little garden we had; we
traded it for more indoor space: three kids and all. The company grows; we hire
people. The 2000-2010 decade is a fast-paced one for me. A lot of work. The
Millennium Bug; the advent of the Euro. I write the second installment of our
company&rsquo;s primary software product, an accounting application. By the
mid-2000s, we are selling it all across the country with success.</p>
<p>Software distribution is a bitch, however. It grants high revenues but tiny,
close-to-none profits. Meanwhile, the market has shifted from a network of
myriads of small, independent, local computer shops to big franchises and,
a bit later, malls. Many computer shops are forced to close down or join the
franchise, losing their independence. Also, the software starts selling on the
Internet. While our self-produced accounting application keeps selling well and
for a good profit, third-party software distribution comes to a halt.
Producers, anti-virus houses especially, are now by-passing independent
software distributors like us, making direct deals with franchising chains and
malls. Professional accounting applications are not attractive to malls and
franchises, as they are all about consumers. Our infrastructure, built to
accommodate for high volumes thanks to distribution deals, is now an incumbent.
Struggling to survive, we pivot into selling our software online<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. That&rsquo;s
when the world economic crisis of 2008 hits the streets.</p>
<h3 id="40-50">40-50</h3>
<p>We barely survive, not without scratches and pain. We&rsquo;re essentially back where
we started. Only a handful of us, revenues significantly reduced. Expenses,
however, are also dramatically reduced. In 2012 we are all remote workers. Our
premises (that we own) are rented. Somehow in the process, or maybe because of
the process, I start open-sourcing some of my work<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>. That leads to
a surprising and somewhat winding path where I emerge as an open-source author,
conference speaker, consultant, and teacher. Somehow I am awarded the MongoDB
Master and then Microsoft MVP awards. All of this is very rewarding personally
and emotionally and is much needed after all the struggle. The smaller and
agile company structure allows us to keep going. I drop running in favor of
body-weight training (I think it is now called calisthenics). I finally get
myself a motorcycle<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>; I always dreamed of owning one. Kids have grown.
Marco, our first son, is currently studying in France at the university, and
the girls are in their teenage years, doing what teenagers do.</p>
<p>Like I think everyone else, looking back, I often question some choices I made
in my life. Ditching university to co-found a company at 21 was, of course,
fundamental. Another pivotal moment was in the mid-2000s when the crisis hit us
hard. I could have parted ways with my colleagues and attempt new ventures. But
it&rsquo;s all in vain. We&rsquo;re left with what we have. I am proud of many achievements
and don&rsquo;t regret the mistakes. I (we) learned from them, and they also were, to
some extent, the vectors for new opportunities.</p>
<h3 id="next">Next</h3>
<p>We&rsquo;re about to launch the third installment of our main application. We&rsquo;ve been
working hard on it, and I can&rsquo;t wait to see it being used by our beloved
clients. This decade and the next one will see me still hacking and working on
computers. More or less of the same? Possibly. Thankfully, I still love my
profession. I can&rsquo;t wait to see how our kids pursue their path in life. We will
be accompanying them from a distance and when necessary. The world is their
oyster.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I wrote a little about my time as a BBS Sysop, see <a href="https://nicolaiarocci.com/a-trip-down-memory-lane-fidonet-and-usenet/">here</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>In 2021 I gave a talk about our switch to the online market. Both <a href="https://speakerdeck.com/nicola/online">slides</a> and <a href="https://www.youtube.com/watch?v=Al2VAa3jdm4">video</a> are available (Italian).&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>See my <a href="/opensource/">Open Source</a> page. Also, I have a presentation titled <a href="https://speakerdeck.com/nicola/my-story-with-python-and-open-source">My Story With Open Source</a>. I presented it at <a href="/speaking/">several conferences</a>.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>A Triumph Bonneville T120. I also ended up founding and running the Italian branch of the <a href="https://tomccitalia.org">Triumph Owners Motorcycle Club</a>.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Get better at programming by learning how things work</title>
      <link>https://nicolaiarocci.com/get-better-at-programming-by-learning-how-things-work/</link>
      <pubDate>Sat, 27 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/get-better-at-programming-by-learning-how-things-work/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;When we talk about getting better at programming, we often talk about
testing, writing reusable code, design patterns, and readability. All of
those things are important. But in this blog post, I want to talk about
a different way to get better at programming: learning how the systems you’re
using work! This is the main way I approach getting better at programming.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Once again, Julia Evans has great sensible advice up on &lt;a href=&#34;https://jvns.ca/blog/learn-how-things-work/&#34;&gt;her site&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>When we talk about getting better at programming, we often talk about
testing, writing reusable code, design patterns, and readability. All of
those things are important. But in this blog post, I want to talk about
a different way to get better at programming: learning how the systems you’re
using work! This is the main way I approach getting better at programming.</p></blockquote>
<p>Once again, Julia Evans has great sensible advice up on <a href="https://jvns.ca/blog/learn-how-things-work/">her site</a>.</p>
<p>I appreciate her note on how today we work with so many complex systems that it
is next to impossible to understand all of them.  The experienced developer
comes at peace with that, acknowledges ignorance, and, more importantly,
understands when it&rsquo;s worth digging deeper. In other words:</p>
<blockquote>
<p>Being a senior developer is less about knowing absolutely everything and more
about quickly being able to recognize when you don’t know something and learn
it.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Write libraries, not services? Not so fast</title>
      <link>https://nicolaiarocci.com/write-libraries-not-services-not-so-fast/</link>
      <pubDate>Thu, 25 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/write-libraries-not-services-not-so-fast/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://catern.com/services.html&#34;&gt;Write libraries instead of services&lt;/a&gt; is an interesting article I read
a while ago. I cannot get it off my head. In an attempt to clear up my mind,
I decided to sit down and write about it. I have been writing libraries for
a good part of my life. Most of my earlier dev-work resides on thousands of
computers in the form of libraries. More recently, I have been writing and
deploying remote services. Libraries versus Services is a topic I care about.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://catern.com/services.html">Write libraries instead of services</a> is an interesting article I read
a while ago. I cannot get it off my head. In an attempt to clear up my mind,
I decided to sit down and write about it. I have been writing libraries for
a good part of my life. Most of my earlier dev-work resides on thousands of
computers in the form of libraries. More recently, I have been writing and
deploying remote services. Libraries versus Services is a topic I care about.</p>
<p>Let&rsquo;s jump into the article.</p>
<blockquote>
<p>A service has constant administration costs which are paid by the service
provider. A properly designed library instead moves these costs to the users
of the library.</p></blockquote>
<p>This ignores the issue of support. You are going to have to support your users.
Support comes at a cost. I would argue that, given the distributed nature of
libraries, supporting them can become <em>very</em> costly. Your library is probably
residing in a myriad of diverse, local environments. Issues are hard to
replicate or reason about. It is hard to isolate your own code from the
surrounding environment.</p>
<blockquote>
<p>People say, &ldquo;services are easy because you can upgrade them centrally, so you
can avoid slow-to-upgrade users making everyone&rsquo;s lives worse.&rdquo; But this
assumes that slow-to-upgrade users can have negative effects on everyone
else. If one user can&rsquo;t have a negative impact on other users, then you don&rsquo;t
care if some users are slow to upgrade; they&rsquo;re only hurting themselves.</p></blockquote>
<p>Again, support. Those slow-to-upgrade users are going to not just hurt but
torture your support service with years-old obsolete issues.  If you think it&rsquo;s
the user&rsquo;s responsibility to keep dependencies up to date, good luck with that.
That assumes that developers adopting the library control their deployments,
which isn&rsquo;t often the case. They might employ the library in a desktop
application distributed to dozens (or thousands) of end-users. It could be next
to impossible for them to make sure that all their deployments are up to speed.
Old versions are a pain point and one (if not the most) significant cost
factor. Maintaining a service comes at a cost too, and you&rsquo;ll likely need to
offer some sort of support there as well. A service, however, ensures that all
your users are on the same version, which tremendously reduces the support
effort.</p>
<p>When weighting costs, support must be factored in, along with all the rest:
development, maintenance, distribution, documentation, etc.  Maybe the
article&rsquo;s author has the luxury of not having to deal with support himself.
Still, there&rsquo;s someone else at his company who has to do that.</p>
<p>A service, on the other hand, represents a single point of failure. If it goes
down, all users are immediately affected<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. By contrast, a nasty bug in your
library will only affect the unlucky users on that version. Now, <em>this</em> makes
a significant advantage for distributed libraries.</p>
<p>Your service, however, will talk to all languages via REST, GraphQL, or any
other interface of choice. The library will usually speak just one language.
Yes, you might provide language-specific SDKs for your service, but that&rsquo;s just
an option.</p>
<p>Do you need to hold state? If you do, most of the time, a service will be
a better option. With state comes responsibility, however. You have to
ensure regular backups, resilience, and maintenance, all of them at a cost.</p>
<p>The author suggests a few approaches to circumventing library limitations. Some
are reasonable, like dynamic linking where it is applicable (not all stacks
support it). Others, quite frankly, I don&rsquo;t understand.</p>
<p>Many factors influence the choice between service and library, use case and
prevailing circumstances being the main ones. I am not even sure they are
comparable, as they tend to solve different problems.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I know first hand. We&rsquo;ve recently been impacted by a catastrophic event that happened to one of our providers. Our services went down and, with them, a good part of our users. How we overcame the situation and what we learned in the process would probably be worth telling, maybe in a future article.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>How to add an empty directory to a Git repository</title>
      <link>https://nicolaiarocci.com/how-to-add-an-empty-directory-to-a-git-repository/</link>
      <pubDate>Mon, 22 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-add-an-empty-directory-to-a-git-repository/</guid>
      <description>&lt;p&gt;How do you add an empty directory to a Git repository? It&amp;rsquo;s a classic, and yet,
I have to look it up every single time. Git does not support this out of the
box:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Currently the design of the Git index (staging area) only permits files to be
listed, and nobody competent enough to make the change to allow empty
directories has cared enough about this situation to remedy it. Directories
are added automatically when adding files inside them. That is, directories
never have to be added to the repository, and are not tracked on their own.
You can say &lt;code&gt;git add &amp;lt;dir&amp;gt;&lt;/code&gt; and it will add the files in there. &lt;strong&gt;If you really
need a directory to exist in checkouts you should create a file in it&lt;/strong&gt;.
.gitignore works well for this purpose; you can leave it empty or fill in
the names of files you do not expect to show up in the directory.
(&lt;a href=&#34;https://git.wiki.kernel.org/index.php/GitFaq#Can_I_add_empty_directories.3F&#34;&gt;source&lt;/a&gt;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>How do you add an empty directory to a Git repository? It&rsquo;s a classic, and yet,
I have to look it up every single time. Git does not support this out of the
box:</p>
<blockquote>
<p>Currently the design of the Git index (staging area) only permits files to be
listed, and nobody competent enough to make the change to allow empty
directories has cared enough about this situation to remedy it. Directories
are added automatically when adding files inside them. That is, directories
never have to be added to the repository, and are not tracked on their own.
You can say <code>git add &lt;dir&gt;</code> and it will add the files in there. <strong>If you really
need a directory to exist in checkouts you should create a file in it</strong>.
.gitignore works well for this purpose; you can leave it empty or fill in
the names of files you do not expect to show up in the directory.
(<a href="https://git.wiki.kernel.org/index.php/GitFaq#Can_I_add_empty_directories.3F">source</a>)</p></blockquote>
<p>The same answer offers a workaround: just save an empty .gitignore file into
the directory. At that point, <code>git status</code> shows the file as untracked. We can
add it to the repository, and <em>presto</em>, our folder ends up captured in version
control.</p>
<p>I don&rsquo;t like using .gitignore for this. That file serves a different,
unrelated goal. Finding it in an otherwise empty directory would cause
puzzlement to my colleagues and my future self in six months. For better
semantic and clarity, what I do is add a <code>.keep</code> file instead:</p>
<pre><code>$ touch mydir/.keep
</code></pre>
<p>Same trick. Better semantics. When I pull this repository in six months, I will
immediately grasp what&rsquo;s going on (an alternative would be a README.md file
with an explanation.)</p>
<p>Of course, if the dir is meant to fill-up over time, but we still want to
ignore its future contents in version control, then .gitignore is the right
tool for the job. Something like this would work (I <a href="https://stackoverflow.com/questions/115983/how-can-i-add-an-empty-directory-to-a-git-repository">dug it up</a> on Stack
Overflow, where else):</p>
<pre><code># Ignore everything in this directory
*
# Except this file
!.gitignore
</code></pre>
<p>I should probably adopt the #tirl tag, as in &ldquo;Today I Re-Learned.&rdquo;</p>
]]></content:encoded>
    </item>
    <item>
      <title>My Pusher of Digital Memorabilia</title>
      <link>https://nicolaiarocci.com/my-pusher-of-digital-memorabilia/</link>
      <pubDate>Sun, 21 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-pusher-of-digital-memorabilia/</guid>
      <description>&lt;p&gt;If you are a grumpy old geek like me, you are probably a sucker for vintage
computer games too. I don&amp;rsquo;t play games. Not anymore. I still enjoy reading
about them, though. I guess it&amp;rsquo;s mostly nostalgia. I also believe that the
mid-80s up to the mid-90s really was the golden age of computer games. In my
book, innovation started with Infocom&amp;rsquo;s text adventures and soft-ended with
Origin&amp;rsquo;s Ultima Online. After that, it&amp;rsquo;s been a constant evolution. &amp;ldquo;Harder,
better, faster, stronger&amp;rdquo;, yes, but hardly a revolution.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you are a grumpy old geek like me, you are probably a sucker for vintage
computer games too. I don&rsquo;t play games. Not anymore. I still enjoy reading
about them, though. I guess it&rsquo;s mostly nostalgia. I also believe that the
mid-80s up to the mid-90s really was the golden age of computer games. In my
book, innovation started with Infocom&rsquo;s text adventures and soft-ended with
Origin&rsquo;s Ultima Online. After that, it&rsquo;s been a constant evolution. &ldquo;Harder,
better, faster, stronger&rdquo;, yes, but hardly a revolution.</p>
<p>My pusher of digital memorabilia is Jimmy Maher, also known as [The Digital
Antiquarian][5]. One month ago, he wrote a [fantastic article][3] on Origin&rsquo;s
Ultima VIII Pagan. Then, just the other day, he doubled down with a [terrific
piece][4] on Looking Glass&rsquo; System Shock. Both are games I played fervidly<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Maher is not kind to Pagan:</p>
<blockquote>
<p>But then, for the eighth game in the mainline Ultima series, Origin decided
to try something just a little bit different. They made a game in which you
played a thoughtless jerk moving on rails through a linear series of events;
in which you never went to Britannia at all, but stayed instead on
a miserable hellhole of a world called Pagan; in which you spent the whole
game adventuring alone (after all, who would want to adventure with a jerk
like you?); in which the core mechanics were jumping between pedestals like
Super Mario and pounding your enemies over the head with your big old hammer.</p></blockquote>
<p>It hurts to admit it, but he&rsquo;s exactly right. Nonetheless, I enjoyed exploring
Pagan&rsquo;s world. When I later joined the Ultima Online Beta, it was amazing to
see that the same graphic engine and all of Pagan&rsquo;s art were recycled.</p>
<p><img alt="System Shock" loading="lazy" src="/images/system-shock.jpg#right">
System Shock was a game I loved. I found it to be revolutionary. Games like
this one were precisely the kind of entertainment I strived for: immersive
simulations.</p>
<blockquote>
<p>[&hellip;] Moving through said spaces, picking up bits and pieces of the horrible
events which have unfolded there, quickly becomes highly unnerving. The sense
of embodied realism that clings to every aspect of the game is key to the
sense of genuine, oppressive fear it creates in its player. Tellingly,
Looking Glass liked to call System Shock a “simulation,” even though it
simulates nothing that has ever existed in the real world. The word is rather
shorthand for its absolute commitment to the truth — fictional truth, yes,
but truth nevertheless — of the world it drops you into.</p></blockquote>
<p>I have always been a System Shock guy more than a DOOM person. I really like
how Maher compares the two games and the software companies that produced them,
more or less in the same time-span<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>In Maher&rsquo;s reconstructions, what I find to be more appealing is not the games
themselves with their mechanics but rather the history behind them. How the
dev-team conceived and then developed their projects.</p>
<p>After so many years, I am thankful to Maher for bringing these two games back
to memory. Now, I am impatiently waiting for his Ultima Online installment.
I know it <em>must</em> be on his list, right?</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>In my library, I keep the original Pagan box as a relic, along with Ultima VII Serpent Island and a few other titles from around that age:  Spectrum Holobyte&rsquo;s Falcon 3.0, Command and Conquer, Dune II Battle for Arrakis, Ultima Online: Charter Edition, and a few others.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>By the way, if you haven&rsquo;t already, I strongly advise you to read <em>Masters of Doom: How Two Guys Created an Empire and Transformed Pop Culture</em> by David Kushner.
[3]: <a href="https://www.filfre.net/2021/02/ultima-viii-or-how-to-destroy-a-gaming-franchise-in-one-easy-step/">https://www.filfre.net/2021/02/ultima-viii-or-how-to-destroy-a-gaming-franchise-in-one-easy-step/</a>
[4]: <a href="https://www.filfre.net/2021/03/system-shock/">https://www.filfre.net/2021/03/system-shock/</a>
[5]: <a href="https://www.filfre.net/">https://www.filfre.net/</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Materada</title>
      <link>https://nicolaiarocci.com/book-review-materada/</link>
      <pubDate>Fri, 19 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-materada/</guid>
      <description>&lt;p&gt;I am very ignorant about the Istrian Peninsula&amp;rsquo;s history, a gap I always wanted
to fill. After some research, Fulvio Tomizza&amp;rsquo;s book, Materada, surfaced as
a good fit to fill this gap. It&amp;rsquo;s a semi-biographic historical novel set in the
Istria of the author&amp;rsquo;s youth. Fulvio Tomizza was born in Giurizzani di
Materada, Istria, in 1935. He had to go through all the torments caused in that
disputed area by Fascism first (forced Italianization, cultural suppression),
and then by the Second World War and the terrible events that followed: the
Foibe massacres and the Istrian-Dalmatian exodus.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am very ignorant about the Istrian Peninsula&rsquo;s history, a gap I always wanted
to fill. After some research, Fulvio Tomizza&rsquo;s book, Materada, surfaced as
a good fit to fill this gap. It&rsquo;s a semi-biographic historical novel set in the
Istria of the author&rsquo;s youth. Fulvio Tomizza was born in Giurizzani di
Materada, Istria, in 1935. He had to go through all the torments caused in that
disputed area by Fascism first (forced Italianization, cultural suppression),
and then by the Second World War and the terrible events that followed: the
Foibe massacres and the Istrian-Dalmatian exodus.</p>
<p>In the spring of 1955, in the countryside around the village of Materada,
Francesco Koslovic &ndash;even his name straddles two cultures&ndash; world is falling
apart. Following the Paris Peace Treaties of 1947, Istrian-Italians and
Dalmatian-Italians, who have long and peacefully inhabited the area with
Croatian and Slovene communities, have to choose. Abandon their homes and
the hard-worked atavistic land, migrate to Italy, become Italian, or stay in
a now-hostile territory. Francesco and his brother have to make the call with
their families. They had a portion of their land confiscated by the Yugoslavian
regime. They know the situation is dire. But this is their promised land.  As
they procrastinate and time goes by, most farmers around them, the friends who
make their community, slowly but inevitably leave along with their families.
The sense of abandonment is palpable.</p>
<p><img alt="Materada, by Fulvio Tomizza (book cover)" loading="lazy" src="/images/materada.jpg#right">
This novel tells the experience the author had to experience himself, along
with his own family. He moved to Trieste in 1954. Throughout his whole life,
however, he kept going back to Materada, to his roots. Writing this tale must
have been a cathartic effort. Initially, I had a hard time connecting with the
story. That happened, I think, <em>precisely</em> because of my ignorance about
surrounding historical events. Materada was a great, painful, worthwhile read.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Battling with SSH, cron jobs, and macOS Keyring</title>
      <link>https://nicolaiarocci.com/battling-with-ssh-cron-jobs-and-macos-keyring/</link>
      <pubDate>Wed, 17 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/battling-with-ssh-cron-jobs-and-macos-keyring/</guid>
      <description>&lt;p&gt;So today, I was setting up a cronjob on my trusty MacBook Pro. The goal was to
backup some folders from a remote Linux server via rsync. The script is simple.
It goes something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rsync -avz -e &amp;quot;ssh -i ~/.ssh/my_rsa_keyfile&amp;quot; myuser@myserver:remotedir/ ~/localdir/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Launched by hand, it works seamlessly. Call it from a cron job via crontab, and
I get a permission denied error. I then enabled ssh &lt;code&gt;-v&lt;/code&gt; option to gather
a little intel on what was actually going on. As it turns out, the exact
error was:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So today, I was setting up a cronjob on my trusty MacBook Pro. The goal was to
backup some folders from a remote Linux server via rsync. The script is simple.
It goes something like this:</p>
<pre><code>rsync -avz -e &quot;ssh -i ~/.ssh/my_rsa_keyfile&quot; myuser@myserver:remotedir/ ~/localdir/
</code></pre>
<p>Launched by hand, it works seamlessly. Call it from a cron job via crontab, and
I get a permission denied error. I then enabled ssh <code>-v</code> option to gather
a little intel on what was actually going on. As it turns out, the exact
error was:</p>
<pre><code>`read_passphrase: can't open /dev/tty: Device not configured`
</code></pre>
<p>Quite puzzling. Long story short, the error message was misleading. It took me
an embarrassingly long time to figure out what the real problem was. The
identity file I was using has a passphrase, which is saved in macOS Keyring.
When the <code>ssh -i</code> command is launched via cron, no Keyring is used. Not unless
you explicitly instruct ssh to do. See, my <code>~/.ssh/config</code> file was something
like this:</p>
<pre><code>Host *
    ServerAliveInterval 360
    AddKeysToAgent yes

[...]

Host myserver
    HostName 123.123.123.123
    User myuser
</code></pre>
<p>See, in <code>myserver</code> section there was no <code>Usekeychain</code> option. Launching the
script interactively worked because of <code>AddkeysToAgent</code> in the general section.
It enables the ssh-agent for the current terminal session, for all hosts. But
cron jobs, well, they don&rsquo;t run in the same session, and certainly don&rsquo;t run
the agent. I could eval the agent in the script, of course, but the
simplest solution was to update <code>myserver</code> section:</p>
<pre><code>Host myserver
    HostName 123.123.123.123
    Usekeychain yes
    User myuser
</code></pre>
<p>Now ssh knows it should use the keychain when resolving <code>myserver</code> RSA key,
even when no agent is running. I am not sure why I did not have <code>Usekeychain</code>
there; I do have it enabled for other hosts in the same file. As said, I wasted
way too much time on this issue. At least, I hope my experience will be useful
to someone else, or, more likely, to my future self in a few months or years.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to Write Good Software Documentation</title>
      <link>https://nicolaiarocci.com/how-to-write-good-software-documentation/</link>
      <pubDate>Tue, 16 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-write-good-software-documentation/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;There is a secret that needs to be understood in order to write good software
documentation: there isn’t one thing called documentation, there are four.
They are: tutorials, how-to guides, technical reference and explanation. They
represent four different purposes or functions, and require four different
approaches to their creation. Understanding the implications of this will
help improve most documentation - often immensely.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I dig Daniele Procida&amp;rsquo;s take on &lt;a href=&#34;https://documentation.divio.com/&#34;&gt;writing good software documentation&lt;/a&gt;. It
just makes sense. The system is simple, comprehensive, and, crucial,
universally-applicable. The &amp;ldquo;four different functions&amp;rdquo; scheme works equally
well if you are writing for a technical-savvy audience or the general public,
which is excellent. The users I&amp;rsquo;m writing for are software developers, in some
cases, and desktop or web application users in others.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>There is a secret that needs to be understood in order to write good software
documentation: there isn’t one thing called documentation, there are four.
They are: tutorials, how-to guides, technical reference and explanation. They
represent four different purposes or functions, and require four different
approaches to their creation. Understanding the implications of this will
help improve most documentation - often immensely.</p></blockquote>
<p>I dig Daniele Procida&rsquo;s take on <a href="https://documentation.divio.com/">writing good software documentation</a>. It
just makes sense. The system is simple, comprehensive, and, crucial,
universally-applicable. The &ldquo;four different functions&rdquo; scheme works equally
well if you are writing for a technical-savvy audience or the general public,
which is excellent. The users I&rsquo;m writing for are software developers, in some
cases, and desktop or web application users in others.</p>
<p>I also like how he goes deep into explaining how and why each function has
a different goal, should be isolated and written differently from others.</p>
<blockquote>
<p>Each of them requires a <strong>distinct mode of writing</strong>. People working with
software need these four different kinds of documentation at different times,
in different circumstances - so software usually needs them all, and they
should all be integrated into your documentation. And documentation needs to
be explicitly structured around them, and they all must be kept separate and
distinct from each other.</p></blockquote>
<p>Last but not least, the framework itself serves as a guide for the author.</p>
<blockquote>
<p>This division makes it obvious to both author and reader what material, and
what kind of material, goes where. It tells the author <strong>how to write</strong>, and
<strong>what to write</strong>, and <strong>where to write it</strong>. It saves the author from
wasting a great deal of time trying to wrestle the information they want to
impart into a shape that makes sense, because each of these kinds of
documentation has only one job.</p></blockquote>
<p>I wish I had this resource at hand when I was writing the docs for <a href="/opensource/">my open
source projects</a>. I think will adopt this framework on the next occasion,
which will be very soon.</p>
<p>@<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter*</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to Shrink a WSL2 Virtual Disk</title>
      <link>https://nicolaiarocci.com/how-to-shrink-a-wsl2-virtual-disk/</link>
      <pubDate>Fri, 12 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-shrink-a-wsl2-virtual-disk/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I discovered you can use the &amp;ldquo;diskpart&amp;rdquo; tool to compact a VHDX. This allows
you to shrink a WSL2 virtual disk file, reclaiming disk space. It appeared to
work for me without any data corruption, taking the file size down from 100GB
to 15GB. (&lt;a href=&#34;https://stephenreescarter.net/how-to-shrink-a-wsl2-virtual-disk/&#34;&gt;source&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I adore Parallels &amp;ldquo;reclaim disk space&amp;rdquo; feature. Just the other day, I got back
70GB off my Windows Guest in a breeze. I&amp;rsquo;m coming from VirtualBox, where
reclaiming disk space is a significant pain. I would expect &lt;code&gt;optimize-vhd&lt;/code&gt; to
achieve the goal with WSL2, but it&amp;rsquo;s nice to know there are alternatives, like
Stephen&amp;rsquo;s above&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I discovered you can use the &ldquo;diskpart&rdquo; tool to compact a VHDX. This allows
you to shrink a WSL2 virtual disk file, reclaiming disk space. It appeared to
work for me without any data corruption, taking the file size down from 100GB
to 15GB. (<a href="https://stephenreescarter.net/how-to-shrink-a-wsl2-virtual-disk/">source</a>)</p></blockquote>
<p>I adore Parallels &ldquo;reclaim disk space&rdquo; feature. Just the other day, I got back
70GB off my Windows Guest in a breeze. I&rsquo;m coming from VirtualBox, where
reclaiming disk space is a significant pain. I would expect <code>optimize-vhd</code> to
achieve the goal with WSL2, but it&rsquo;s nice to know there are alternatives, like
Stephen&rsquo;s above</p>
]]></content:encoded>
    </item>
    <item>
      <title>You Have to Write As Though Your Parents Are Dead</title>
      <link>https://nicolaiarocci.com/you-have-to-write-as-though-your-parents-are-dead/</link>
      <pubDate>Fri, 12 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/you-have-to-write-as-though-your-parents-are-dead/</guid>
      <description>&lt;p&gt;The Literary Hub has a great short &lt;a href=&#34;https://lithub.com/ian-mcewan-on-bach-philip-roth-and-living-an-episodic-life/&#34;&gt;interview&lt;/a&gt; with Ian McEwan.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What’s the best writing advice you’ve ever received?&lt;/strong&gt;
When I was living in London at the start of my career in the mid-1970s,
I became friends with Philip Roth, who took an avuncular interest in my work.
Where many others thought my writing was wild and weird, he thought I wasn’t
being wild enough. He once came to my apartment and spread the typescript of
my first novel (The Cement Garden) over the floor. He was on his hands and
knees, moving the chapters around. What he wanted was for me to be bolder,
crazier. He said, “You have to write as though your parents are dead.” My
parents were alive. I took that advice.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The Literary Hub has a great short <a href="https://lithub.com/ian-mcewan-on-bach-philip-roth-and-living-an-episodic-life/">interview</a> with Ian McEwan.</p>
<blockquote>
<p><strong>What’s the best writing advice you’ve ever received?</strong>
When I was living in London at the start of my career in the mid-1970s,
I became friends with Philip Roth, who took an avuncular interest in my work.
Where many others thought my writing was wild and weird, he thought I wasn’t
being wild enough. He once came to my apartment and spread the typescript of
my first novel (The Cement Garden) over the floor. He was on his hands and
knees, moving the chapters around. What he wanted was for me to be bolder,
crazier. He said, “You have to write as though your parents are dead.” My
parents were alive. I took that advice.</p></blockquote>
<p>Great advice. How often do we restrain from writing, posting, or expressing our
thoughts because of our shyness? Or fear of being judged? Besides, I would take
any advice from someone who has this to say about Bach:</p>
<blockquote>
<p><strong>Which non-literary piece of culture—film, TV show, painting, song—could you
not imagine your life without?</strong> Since the age of 16, my constant resource has
been the music of Bach. Piano first, then all the rest. Like all music, it is
as abstract as literature is specific, but Bach’s inventions are more so—like
the processes of thought before language, deeply human without saying
anything at all. In his music I think I confront the most naked demonstration
of genius. Wrapped inside the beauty is a form of merriness and a joyful
pulse. The same pieces that thrilled me in my teens—the Goldberg Variations,
the Well-tempered Clavier—thrill me now.</p></blockquote>
<p>I loved how he saved the day by brilliantly answering the most boring writer
question of all times.</p>
<blockquote>
<p><strong>What time of day do you write?</strong> The morning. My philosopher friend Galen
Strawson divides humanity into those who feel they are living in a constantly
unfolding narrative, a life story that informs our every moment, and those
who existence is discontinuous. I now understand that I belong in this latter
group, even while I’ve often persuaded myself I was in the first. [&hellip;] Now
I can relax. I belong with those whose lives are lived in discrete patches.
We can, of course, remember our childhoods, our first loves, our failures and
joys when asked to, but almost all of our daily experience is disconnected
from any awareness of the past. We also acknowledge that most of that past is
lost to us forever. We, the non-narrativists, or episodists, wake in the
mornings and we begin anew. I am my own blank sheet. As the day wears on,
familiar concerns—domestic, professional, political, crowd in. The thing
about that waiting desk is that you must turn up—and get there before the
blank sheet that is you turns dog-eared.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Cleaning Up Your Postgres Database</title>
      <link>https://nicolaiarocci.com/cleaning-up-your-postgres-database/</link>
      <pubDate>Tue, 09 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/cleaning-up-your-postgres-database/</guid>
      <description>&lt;p&gt;I am an application/backend developer who has to quibble with databases more
often than desired. I can get my way around Postgres pretty well, but I can
always use a hint or two, especially when it comes to fine-tuning and
performance.&lt;/p&gt;
&lt;p&gt;I stumbled upon &lt;a href=&#34;http://blog.crunchydata.com/blog/cleaning-up-your-postgres-database&#34;&gt;Cleaning Up Your Postgres Databases&lt;/a&gt;. It offers useful
advice on spotting performance bottlenecks in your Postgres database. Take the
cache and index hit queries, for example.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The first thing you&amp;rsquo;re going to want to look at is your cache hit ratio and
index hit ratio. Your cache hit ratio is going to give the percentage of time
your data is served from within memory vs. having to go to disk. Generally
serving data from memory vs. disk is going to orders of magnitude faster,
thus the more you can serve from memory the better. For a typical web
application making a lot of short requests I&amp;rsquo;m going to target &amp;gt; 99% here.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am an application/backend developer who has to quibble with databases more
often than desired. I can get my way around Postgres pretty well, but I can
always use a hint or two, especially when it comes to fine-tuning and
performance.</p>
<p>I stumbled upon <a href="http://blog.crunchydata.com/blog/cleaning-up-your-postgres-database">Cleaning Up Your Postgres Databases</a>. It offers useful
advice on spotting performance bottlenecks in your Postgres database. Take the
cache and index hit queries, for example.</p>
<blockquote>
<p>The first thing you&rsquo;re going to want to look at is your cache hit ratio and
index hit ratio. Your cache hit ratio is going to give the percentage of time
your data is served from within memory vs. having to go to disk. Generally
serving data from memory vs. disk is going to orders of magnitude faster,
thus the more you can serve from memory the better. For a typical web
application making a lot of short requests I&rsquo;m going to target &gt; 99% here.</p></blockquote>
<p>I will be trying them real soon. Like, today.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: The Library at Night</title>
      <link>https://nicolaiarocci.com/book-review-the-library-at-night/</link>
      <pubDate>Sat, 06 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-the-library-at-night/</guid>
      <description>&lt;p&gt;As any other bookworm worth its salt, I digested a generous amount of books on
books and the history of libraries. Alberto Manguel&amp;rsquo;s The Library at Night was
last, and that is a pity. It probably arrived just a little too late on my
shelves. I wish I found it at the beginning of my reading journey when my
enthusiasm for libraries and their contents was pristine.&lt;/p&gt;
&lt;p&gt;Manguel&amp;rsquo;s writing is mesmerizing and capable. The lover of libraries and their
books (in that order because this text is more about libraries than the books
they contain) will undoubtedly fall into the rabbit hole and devour this book.
Check this out:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As any other bookworm worth its salt, I digested a generous amount of books on
books and the history of libraries. Alberto Manguel&rsquo;s The Library at Night was
last, and that is a pity. It probably arrived just a little too late on my
shelves. I wish I found it at the beginning of my reading journey when my
enthusiasm for libraries and their contents was pristine.</p>
<p>Manguel&rsquo;s writing is mesmerizing and capable. The lover of libraries and their
books (in that order because this text is more about libraries than the books
they contain) will undoubtedly fall into the rabbit hole and devour this book.
Check this out:</p>
<blockquote>
<p>But at night, when the library lamps are lit, the outside world disappears
and nothing but this space of books remains in existence. To someone standing
outside, in the garden, the library at night appears like a vast vessel of
some sort, like that strange Chinese villa that, in 1888, the capricious
Empress Cixi caused to be built in the shape of a ship marooned in a garden
lake of her Summer Palace. In the dark, with the windows lit and the rows of
books glittering, the library is a closed space, a universe of self-serving
rules that pretend to replace or translate those of the shapeless universe
beyond.</p></blockquote>
<p><img alt="The Library at Night (book cover)" loading="lazy" src="/images/the_library_at_night.jpg#right">
This book is a treasure chest filled with remarkable, carefully crafted gems.
With books like this one, I feel bad for not taking notes as I read. Each
chapter is on a topic: the library as power, as order, shape, shadow, mind,
workshop, and the list goes on. Some are more exciting than others, but overall
the selection is rich, varied, and original enough to keep the reader
entertained all along. The author&rsquo;s library, assembled during his whole life,
spent a &ldquo;professional reader&rdquo; (not kidding, as a teenager, he was reading books
for a now-blind Jorge Luis Borges) and collecting books all-along while moving
across three continents, is the recurring theme. One way or another, you&rsquo;ll
find it mentioned in every chapter, and for good reasons, because it must have
been formidable<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>The text mentions a remarkable number of ancient and modern authors with their
works. The author shows his culture, but not in a pedantic or annoying way. One
chapter is about the advent of digital libraries. I share his preference for
the printed form. He goes a great length into explaining why old school is
better, and I tend to agree with most of his reasoning. I think, however, that
he is too dismissive of the digital form. It brings so many previously
unthinkable features. He acknowledges some. It has always been my dream to own
both forms of all my books: printed and digital. If there were one service that
allowed me to buy both at once, at the same price, I would be all-in.</p>
<p>Last but not least, my favorite quote from the book:</p>
<blockquote>
<p>Immensely generous, my books make no demands on me but offer all kind of
illuminations.</p></blockquote>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><strong>Spoiler alert</strong>. I researched into the matter. It turns out that Manguel&rsquo;s library counted 40,000 titles. In 2020, he <a href="https://www.theglobeandmail.com/arts/books/article-alberto-manguel-to-donate-40000-works-to-lisbons-centre-for-research/">donated them all</a> to Lisbon&rsquo;s Centre for Research into the History of Reading.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Semantic Versioning Will Not Save You</title>
      <link>https://nicolaiarocci.com/semantic-versioning-will-not-save-you/</link>
      <pubDate>Thu, 04 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/semantic-versioning-will-not-save-you/</guid>
      <description>&lt;p&gt;The always brilliant Hynek recently posted &lt;a href=&#34;https://hynek.me/articles/semver-will-not-save-you/&#34;&gt;Semantic Versioning Will Not Save
You&lt;/a&gt;. Primarily targeted at &lt;em&gt;consumers&lt;/em&gt; of SemVer-versioned packages, it is
full of insightful advice.&lt;/p&gt;
&lt;p&gt;From my perspective as an open-source maintainer, I can tell you that
versioning is hard. Judging when a new release is going to break backward
compatibility is not as simple as it might seem on the surface, and Hynek does
a great job explaining why. Sometimes it is also hard for me to tell if
a change in a codebase classifies as a new feature, small improvement, or
fix—subtle differences. In the context of SemVer, it matters a lot because
version numbers have a meaning. Consumers will likely decide whether to upgrade
or not based on that meaning.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The always brilliant Hynek recently posted <a href="https://hynek.me/articles/semver-will-not-save-you/">Semantic Versioning Will Not Save
You</a>. Primarily targeted at <em>consumers</em> of SemVer-versioned packages, it is
full of insightful advice.</p>
<p>From my perspective as an open-source maintainer, I can tell you that
versioning is hard. Judging when a new release is going to break backward
compatibility is not as simple as it might seem on the surface, and Hynek does
a great job explaining why. Sometimes it is also hard for me to tell if
a change in a codebase classifies as a new feature, small improvement, or
fix—subtle differences. In the context of SemVer, it matters a lot because
version numbers have a meaning. Consumers will likely decide whether to upgrade
or not based on that meaning.</p>
<p>Admittedly, and precisely because I did not feel comfortable giving guarantees,
the <a href="https://hynek.me/articles/semver-will-not-save-you/">Eve</a> project has been <a href="https://0ver.org/">0-versioned</a> for seven years. Seven years!
I wanted it to be mature, battle-tested and stable; only then would I feel
comfortable going 1.0. In Eve&rsquo;s case, 1.0 means not only &ldquo;stable&rdquo; but also
&ldquo;done.&rdquo; All major features are in, and they are stable. I am not alone, of
course. Flask, the web-framework on which Eve builds, has been 0-versioned for
many years too. I&rsquo;ve also been on the receiving hand of SemVer-related issues,
check the Eve backlog. The same happened with my other projects (<a href="https://python-cerberus.org">Cerberus</a>
is the exception as it has no dependencies.)</p>
<p>Hynek&rsquo;s point, I think, is that SemVer is a just convention. At each new
release, a semantic-versioned package expresses the maintainer&rsquo;s intention, but
there are no guarantees.</p>
<blockquote>
<p>This does not mean that SemVer is bad or worthless. Knowing the intentions of
a maintainer can be valuable – especially when things break. Because that’s
all SemVer is: a TL;DR of the changelog. What it does mean though, is that
you can’t rely on the semantic meaning of SemVer and <strong>you must treat every
update as potentially breaking</strong>.</p></blockquote>
<p>Make sure you read the Taking Responsibility section. It has sound advice on
protecting your project from dependency hell.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Reverse engineering an obfuscated codebase and fixing it in the process</title>
      <link>https://nicolaiarocci.com/reverse-engineering-an-obfuscated-codebase-and-fixing-it-in-the-process/</link>
      <pubDate>Tue, 02 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/reverse-engineering-an-obfuscated-codebase-and-fixing-it-in-the-process/</guid>
      <description>&lt;p&gt;Today&amp;rsquo;s mandatory reading is &lt;a href=&#34;https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/&#34;&gt;How I cut GTA Online loading times by 70%&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As someone who&amp;rsquo;s been fighting the protection/obfuscation cat &amp;amp; mouse game for
twenty+ years, let me tell you one thing. The way this guy reverse-engineered
parts of the GTA5 codebase and then proceeded to single-handly triage and fix
a long-standing (7+ years) performance issue is simply mindblowing. All he had
to work with were heavily obfuscated dlls.  This also shows how we, the
protectors, are always playing a losing game.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today&rsquo;s mandatory reading is <a href="https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/">How I cut GTA Online loading times by 70%</a>.</p>
<p>As someone who&rsquo;s been fighting the protection/obfuscation cat &amp; mouse game for
twenty+ years, let me tell you one thing. The way this guy reverse-engineered
parts of the GTA5 codebase and then proceeded to single-handly triage and fix
a long-standing (7+ years) performance issue is simply mindblowing. All he had
to work with were heavily obfuscated dlls.  This also shows how we, the
protectors, are always playing a losing game.</p>
<blockquote>
<p>There seems to be some sort of an obfuscation/encryption at play here that
has replaced most instructions with gibberish. Not to worry, we simply need
to dump the game&rsquo;s memory while it&rsquo;s executing the part we want to look at.
The instructions have to be de-obfuscated before running one way or another.</p></blockquote>
<p>Make sure you read this <a href="https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/">stuff</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>On the CEO and founder of Signal</title>
      <link>https://nicolaiarocci.com/on-the-ceo-and-founder-of-signal/</link>
      <pubDate>Mon, 01 Mar 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-the-ceo-and-founder-of-signal/</guid>
      <description>&lt;p&gt;Last weekend&amp;rsquo;s reading list also included &lt;a href=&#34;https://www.newyorker.com/magazine/2020/10/26/taking-back-our-privacy&#34;&gt;Taking Back Our Privacy&lt;/a&gt;, yet
another&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; New Yorker piece but this time signed by Anna Wiener. This article is
a long-read on Moxie Marlinspike, co-founder and CEO of Signal. Moxie is
a childhood nickname. That alone signals (pun intended) an original
personality. I mean, how many times have you heard of a CEO going by his
childhood nickname?&lt;/p&gt;
&lt;p&gt;Indeed the personal story of Marlinspike, along with that of the ascent of
Signal, is fascinating. I did not know, for example, that in 2013 he met Brian
Acton, founder of WhatsApp. Brian expressed interest in adding end-to-end
encryption into WhatsApp. Then came Facebook&amp;rsquo;s acquisition, and, for obvious
reasons, Signal Protocol never landed into the messaging service. The story was
not over, however:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last weekend&rsquo;s reading list also included <a href="https://www.newyorker.com/magazine/2020/10/26/taking-back-our-privacy">Taking Back Our Privacy</a>, yet
another<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> New Yorker piece but this time signed by Anna Wiener. This article is
a long-read on Moxie Marlinspike, co-founder and CEO of Signal. Moxie is
a childhood nickname. That alone signals (pun intended) an original
personality. I mean, how many times have you heard of a CEO going by his
childhood nickname?</p>
<p>Indeed the personal story of Marlinspike, along with that of the ascent of
Signal, is fascinating. I did not know, for example, that in 2013 he met Brian
Acton, founder of WhatsApp. Brian expressed interest in adding end-to-end
encryption into WhatsApp. Then came Facebook&rsquo;s acquisition, and, for obvious
reasons, Signal Protocol never landed into the messaging service. The story was
not over, however:</p>
<blockquote>
<p>That year, Acton left Facebook, later attributing his departure to
intractable differences about privacy practices. At the heart of the conflict
was tension with Facebook’s top executives, Sheryl Sandberg and Mark
Zuckerberg, who wanted to extend Facebook’s targeted-ad network to WhatsApp.
End-to-end encryption precluded the collection of message content that would
be valuable to advertisers. In early 2018, Acton and Marlinspike announced
the formation of the Signal Foundation, a nonprofit. Acton, the foundation’s
chairman and sole member, seeded it with a no-interest, fifty-million-dollar
loan.</p></blockquote>
<p>What a plot twist. What&rsquo;s even more remarkable is Moxie&rsquo;s personal biography.
He is not your average startup co-founder, not by any mean. He kind stands at
the interconnection between activism, ethical hacking, and anarchy, and yet
he&rsquo;s the CEO of a booming startup.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>See <a href="/the-activists-who-embrace-nuclear-power/">The Activists Who Embrace Nuclear Power</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>The Activists Who Embrace Nuclear Power</title>
      <link>https://nicolaiarocci.com/the-activists-who-embrace-nuclear-power/</link>
      <pubDate>Sun, 28 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-activists-who-embrace-nuclear-power/</guid>
      <description>&lt;p&gt;Today, my Sunday long-reading list included New Yorker&amp;rsquo;s &lt;a href=&#34;https://www.newyorker.com/tech/annals-of-technology/the-activists-who-embrace-nuclear-power&#34;&gt;The Activists Who
Embrace Nuclear Power&lt;/a&gt; by Rebecca Tuhus-Dubrow. Can nuclear power possibly
be a viable solution for climate change? Twenty or even ten years ago, my
answer would have been a big fat No. Today? Not so sure anymore.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today, the looming disruptions of climate change have altered the risk
calculus around nuclear energy. James Hansen, the NASA scientist credited
with first bringing global warming to public attention, in 1988, has long
advocated a vast expansion of nuclear power to replace fossil fuels. Even
some environmental groups that have reservations about nuclear energy [&amp;hellip;]
have recognized that abruptly closing existing reactors would lead to a spike
in emissions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, my Sunday long-reading list included New Yorker&rsquo;s <a href="https://www.newyorker.com/tech/annals-of-technology/the-activists-who-embrace-nuclear-power">The Activists Who
Embrace Nuclear Power</a> by Rebecca Tuhus-Dubrow. Can nuclear power possibly
be a viable solution for climate change? Twenty or even ten years ago, my
answer would have been a big fat No. Today? Not so sure anymore.</p>
<blockquote>
<p>Today, the looming disruptions of climate change have altered the risk
calculus around nuclear energy. James Hansen, the NASA scientist credited
with first bringing global warming to public attention, in 1988, has long
advocated a vast expansion of nuclear power to replace fossil fuels. Even
some environmental groups that have reservations about nuclear energy [&hellip;]
have recognized that abruptly closing existing reactors would lead to a spike
in emissions.</p></blockquote>
<p>I am surprised that the author, who clearly researched the topic well, did not
mention Bill Gates&rsquo; <a href="https://www.forbes.com/sites/scottcarpenter/2020/08/31/bill-gates-nuclear-firm-says-new-reactor-can-backstop-grid-with-molten-salt-storage/">Mini-Reactors</a> approach to the problem. It might have
been a deliberate choice, as at some point, she does note that &ldquo;scientists are
working on smaller, more nimble nuclear reactors.&rdquo;</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to increase upload file size in ASP.NET Core</title>
      <link>https://nicolaiarocci.com/how-to-increase-upload-file-size-in-asp.net-core/</link>
      <pubDate>Fri, 26 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/how-to-increase-upload-file-size-in-asp.net-core/</guid>
      <description>&lt;p&gt;Today I learned the hard way that since ASP.NET Core 2.0, the request body has
acquired a default size limit at 30MB (~28.6 MiB).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the request body size exceeds the configured max request body size limit,
the call to Request.Body.ReadAsync will throw an IOException. If this
exception is uncaught, Kestrel will respond with a 413 Payload Too Large
response and HttpSys will respond with a generic 500 Internal Server Error
response (&lt;a href=&#34;https://github.com/aspnet/Announcements/issues/267&#34;&gt;source&lt;/a&gt;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned the hard way that since ASP.NET Core 2.0, the request body has
acquired a default size limit at 30MB (~28.6 MiB).</p>
<blockquote>
<p>If the request body size exceeds the configured max request body size limit,
the call to Request.Body.ReadAsync will throw an IOException. If this
exception is uncaught, Kestrel will respond with a 413 Payload Too Large
response and HttpSys will respond with a generic 500 Internal Server Error
response (<a href="https://github.com/aspnet/Announcements/issues/267">source</a>).</p></blockquote>
<p>This will be a breaking change if your endpoint is expected to handle large
uploads. The solution is simple, just decorate your MVC action or controller
with the <code>RequestSizeLimit</code> attribute, like so:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>    [HttpPost]
</span></span><span style="display:flex;"><span>    [RequestSizeLimit(100_000_000)]
</span></span><span style="display:flex;"><span>    public IActionResult MyAction([FromBody] MyViewModel data)
</span></span><span style="display:flex;"><span>    {
</span></span></code></pre></div><p><code>DisableRequestSizeLimit</code> can be used to make request size unlimited. This
effectively restores pre-2.0.0 behavior for just the attributed action or
controller. You can also change or disable the limit programmatically, either
on a per-request basis or globally (see the instructions at this <a href="https://github.com/aspnet/Announcements/issues/267">link</a>.)</p>
<p>In my case, however, disabling the request limit was not enough. Because my
endpoint is expecting an <code>IFormFile</code> argument, I also had to set the
<code>RequestFormLimits</code> attribute:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>    [HttpPost]
</span></span><span style="display:flex;"><span>    [DisableRequestSizeLimit,
</span></span><span style="display:flex;"><span>    RequestFormLimits(MultipartBodyLengthLimit = int.MaxValue, 
</span></span><span style="display:flex;"><span>        ValueLengthLimit = int.MaxValue)]
</span></span><span style="display:flex;"><span>    public async Task&lt;ActionResult&gt; BulkAdd(string schema, IFormFile file)
</span></span><span style="display:flex;"><span>    {
</span></span></code></pre></div><p>Please note that all of this happened on a .NET 5 Linux application with
Kestrel running behind nginx. As pointed out at the link above, if you&rsquo;re
running behind IIS, then the limit is disabled, and the usual <em>web.config</em>
limit applies.</p>
<p>For future reference, <a href="https://github.com/dotnet/aspnetcore/blob/main/src/Servers/Kestrel/Core/src/KestrelServerLimits.cs">here</a> are the current Kestrel limits.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Five Minutes to Make You Love Classical Music</title>
      <link>https://nicolaiarocci.com/five-minutes-to-make-you-love-classical-music/</link>
      <pubDate>Thu, 25 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/five-minutes-to-make-you-love-classical-music/</guid>
      <description>&lt;p&gt;I already &lt;a href=&#34;https://nicolaiarocci.com/what-i-listen-to-while-programming&#34;&gt;mentioned&lt;/a&gt; what background music (or sounds) I like when I am
coding. In that list, I included classical music. I know classical is not
exactly a favorite. Not in my field, at least. I suspect the vast majority of
people disregard it in advance, not really knowing what they&amp;rsquo;re missing out on,
just because, well, you know, it&amp;rsquo;s dinosaurs stuff. If you are among them, you
should reconsider and repent your sins. But have no worries, and rejoice, for
I am here to save your soul.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I already <a href="/what-i-listen-to-while-programming">mentioned</a> what background music (or sounds) I like when I am
coding. In that list, I included classical music. I know classical is not
exactly a favorite. Not in my field, at least. I suspect the vast majority of
people disregard it in advance, not really knowing what they&rsquo;re missing out on,
just because, well, you know, it&rsquo;s dinosaurs stuff. If you are among them, you
should reconsider and repent your sins. But have no worries, and rejoice, for
I am here to save your soul.</p>
<p>Zachary Woolfe, The New York Times&rsquo;s classical music editor, has been working
on <a href="https://www.nytimes.com/interactive/2020/arts/music/five-minutes-love-music.html">Five Minutes To Make You Love Classical Music</a>. This remarkable project aims
at &ldquo;hooking readers on classical music, five minutes at a time.&rdquo;</p>
<blockquote>
<p>Once a month online, about 15 musicians, pop-culture figures and Times
writers and editors each select the piece they would play for a friend tied
to a theme, be it an instrument, composer, genre or voice type. The series
aims to make classical music accessible to readers as a Top 40 track [&hellip;].
You don&rsquo;t need to know the difference between a cadenza and a concerto. &ldquo;It&rsquo;s
about pure pleasure and exploration.&rdquo; (<a href="https://www.nytimes.com/2021/02/03/insider/five-minutes-love-classical-music.html">source</a>)</p></blockquote>
<p>I find this project interesting for many reasons, the main one being the
variance of choices and themes. Picks are often excellent and not obvious. This
is, I think, because of the wide range of people involved with the selections.
You may have Yo-Yo Ma suggest a Concerto for the Cello installment, and then
Mark Hamill or Condoleeza Rice propose a listening for the Mozart segment. How
about Cecilia Bartoli for Baroque music?</p>
<p>Mind you, I am not a classical music expert. I just try and like to listen to
good music, regardless of the genre. I am probably the ideal target for
a project like this, which explains why I keep coming back. My favorite?
Probably <a href="https://www.nytimes.com/2020/06/03/arts/music/five-minutes-classical-music-cello.html">Five Minutes That Will Make You Love the Cello</a>, although I am
having a hard time accepting that Bach&rsquo;s Suite No. 1 is not included in the
selection (Suite No. 5 is, though.)</p>
<p>Official NYT playlists for the series are available on Spotify and, I presume,
other platforms. I know because I wasted a couple hours building my own before
finding out.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Musings on Python&#39;s Pattern Matching</title>
      <link>https://nicolaiarocci.com/musings-on-pythons-pattern-matching/</link>
      <pubDate>Tue, 23 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/musings-on-pythons-pattern-matching/</guid>
      <description>&lt;p&gt;Pattern Matching &lt;a href=&#34;https://lwn.net/Articles/845480/&#34;&gt;is coming&lt;/a&gt; to Python, and I am not sure I like it. Don&amp;rsquo;t get me
wrong, I love pattern matching. I use it all the time in F#. I am sure that
once it lands in the language, it will be wildly adopted.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s the problem with Python&amp;rsquo;s pattern matching? The community, some core
developers included, has expressed &lt;a href=&#34;https://discuss.python.org/t/gauging-sentiment-on-pattern-matching/5770&#34;&gt;several concerns&lt;/a&gt;. The Python Steering
Council has acknowledged them and is willing to look into improvements should
they be proposed. I am not going into the details here. You can look them up
yourself. Let&amp;rsquo;s just say that there are a few gotchas, like the requirement to
use dotted names as constants, to prevent them from being interpreted as
capture variables instead (doh!) The lack of local scope bites hard here.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Pattern Matching <a href="https://lwn.net/Articles/845480/">is coming</a> to Python, and I am not sure I like it. Don&rsquo;t get me
wrong, I love pattern matching. I use it all the time in F#. I am sure that
once it lands in the language, it will be wildly adopted.</p>
<p>So what&rsquo;s the problem with Python&rsquo;s pattern matching? The community, some core
developers included, has expressed <a href="https://discuss.python.org/t/gauging-sentiment-on-pattern-matching/5770">several concerns</a>. The Python Steering
Council has acknowledged them and is willing to look into improvements should
they be proposed. I am not going into the details here. You can look them up
yourself. Let&rsquo;s just say that there are a few gotchas, like the requirement to
use dotted names as constants, to prevent them from being interpreted as
capture variables instead (doh!) The lack of local scope bites hard here.</p>
<p>If we look at pattern matching in isolation, it is undoubtedly desirable. There
ought to be a reason why every language on the planet is trying to adopt it. Is
it pythonic? I doubt it. With all its corner cases and the odd syntax, I think
that the current design adds quite a bit of complexity to the language. As
someone <a href="https://news.ycombinator.com/item?id=26083779">noted</a>, core dev Larry Hastings puts it well:</p>
<blockquote>
<p>I dislike the syntax and semantics expressed in PEP 634. I see the match
statement as a DSL contrived to look like Python and to be used inside of
Python, but with very different semantics. When you enter a PEP 634 match
statement, the rules of the language change completely, and code that looks
like existing Python code does something surprisingly very different (<a href="https://discuss.python.org/t/gauging-sentiment-on-pattern-matching/5770/21">source</a>)</p></blockquote>
<p>I especially agree with this sentiment, and I am still quoting Hastings:</p>
<blockquote>
<p><strong>I think the bar for adding new syntax to Python at this point in its life
should be set very high</strong>. The language is already conceptually pretty large,
and every new feature means new concepts one must learn if one is to read an
arbitrary blob of someone else&rsquo;s Python code. The bigger the new syntax, the
higher the bar should become, and so the bigger payoff the new syntax has to
provide.</p></blockquote>
<p>Unfortunately, I feel like this trend of getting away from pythonic-Python has
been going on for a while. As my friend Alessandro Molina mentioned just today:</p>
<blockquote>
<p>I have been thinking about how Python has been moving away from its own Zen
since the time of &ldquo;async&rdquo; keyword. Convenience rarely values added
complexity. Never been a big fan of adding keywords that will be misused by
the majority to deal with the vertical needs of a minority (<a href="https://twitter.com/__amol__/status/1364205630928617473">source</a>)</p></blockquote>
<p>He was referring to group exceptions, not pattern matching. Still, his tweet
struck a nerve as I was busy writing down these thoughts.</p>
<p>More generally, I am concerned with all the recent attempts to take features
from functional languages and bring them over to object-oriented languages.
It&rsquo;s not just a Python thing; C# just ported Records, pattern matching, and
a few other things over from F#/ML. I understand that like 85% of the software
development crowd is into object-oriented languages, but look, it&rsquo;s going to
exceptionally hard to successfully and seamlessly move features from apples to
oranges.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Lasting Lessons of John Conway&#39;s Game of Life</title>
      <link>https://nicolaiarocci.com/the-lasting-lessons-of-john-conways-game-of-life/</link>
      <pubDate>Sat, 20 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-lasting-lessons-of-john-conways-game-of-life/</guid>
      <description>&lt;p&gt;In March 1970, Dr. John Conway sent the &amp;ldquo;fatal&amp;rdquo; (as he later referred to it)
letter to Martin Gardner. He was submitting ideas for Gardner&amp;rsquo;s Mathematical
Games column in Scientific American.&lt;/p&gt;
&lt;p&gt;The New York Times features a good article on the fifty-year parable of The
Game of Life. What&amp;rsquo;s appreciable, they asked some of Life&amp;rsquo;s most steadfast
friends to reflect upon its influence and lessons over half a century. Among
them, Brian Eno, who, being Brian Eno, has some smart things to say:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In March 1970, Dr. John Conway sent the &ldquo;fatal&rdquo; (as he later referred to it)
letter to Martin Gardner. He was submitting ideas for Gardner&rsquo;s Mathematical
Games column in Scientific American.</p>
<p>The New York Times features a good article on the fifty-year parable of The
Game of Life. What&rsquo;s appreciable, they asked some of Life&rsquo;s most steadfast
friends to reflect upon its influence and lessons over half a century. Among
them, Brian Eno, who, being Brian Eno, has some smart things to say:</p>
<blockquote>
<p>[The Game of] Life shows you two things. The first is sensitivity to initial
conditions. A tiny change in the rules can produce a huge difference in the
output, ranging from complete destruction (no dots) through stasis (a frozen
pattern) to patterns that keep changing as they unfold.</p></blockquote>
<blockquote>
<p>The second thing Life shows us is something that Darwin hit upon when he was
looking at Life, the organic version. Complexity arises from simplicity! That
is such a revelation; we are used to the idea that anything complex must
arise out of something more complex. Human brains design airplanes, not the
other way around. Life shows us complex virtual &ldquo;organisms&rdquo; arising out of
the interaction of a few simple rules — so goodbye &ldquo;Intelligent Design.&rdquo;</p></blockquote>
<ul>
<li><a href="https://www.nytimes.com/2020/12/28/science/math-conway-game-of-life.html">The Lasting Lessons of John Conway&rsquo;s Game of Life</a>, on NYT</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Perseverance made it to Mars on twenty-year-old hardware</title>
      <link>https://nicolaiarocci.com/perseverance-made-it-to-mars-on-twenty-year-old-hardware/</link>
      <pubDate>Fri, 19 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/perseverance-made-it-to-mars-on-twenty-year-old-hardware/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a space junkie. So tonight, like all the other space junkies on the planet,
I watched in awe as Perseverance seamlessly and beautifully landed on the
surface of Mars. This is a phenomenal achievement. Of course, I will eagerly
follow her&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; progress.&lt;/p&gt;
&lt;p&gt;As I was following the live broadcast, I wondered: What kind of hardware and
software runs all this incredible technology? It was launched in 2020, so it
must be some cutting-edge stuff. As it turns out, that isn&amp;rsquo;t really the case.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m a space junkie. So tonight, like all the other space junkies on the planet,
I watched in awe as Perseverance seamlessly and beautifully landed on the
surface of Mars. This is a phenomenal achievement. Of course, I will eagerly
follow her<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> progress.</p>
<p>As I was following the live broadcast, I wondered: What kind of hardware and
software runs all this incredible technology? It was launched in 2020, so it
must be some cutting-edge stuff. As it turns out, that isn&rsquo;t really the case.</p>
<p>Perseverance computer uses the BAE RAD750 radiation-hardened single board
computer<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. Released twenty years ago (2001), the RAD750 is based on the
PowerPC 750, designed by IBM and Motorola and released in 1997<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>. The exact
same computer is mounted on Curiosity<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>, which launched ten years ago.</p>
<blockquote>
<p>It basically has the power of a circa 1992 Pentium 1 chip and will be
responsible for handling the entire avionics architecture of the rover
designed and programmed by NASA&rsquo;s Jet Propulsion Laboratory (JPL) ([source][6])</p></blockquote>
<p>From the same source, we learn that at least good-ole RAD750 is not left alone:</p>
<blockquote>
<p>The &lsquo;old school&rsquo; RDA750 computer will work in tandem with a series of
field-programmable gate array (FPGA) computers to control such things as the
drivetrain, wheels, suspension and cameras.</p></blockquote>
<p>I could not find any reliable information on the programming languages
involved. I am guessing a mix of C/C++ and maybe Ada, as is typical of the
aerospace industry. The operating system itself is VxWorks<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>, a real-time
operating system initially released in 1987. This is a fascinating piece of
software.</p>
<p>Two considerations come to mind. First, and I am repeating myself here, what
a phenomenal achievement this landing is. As we watched the broadcast, I told
my wife: these guys are literally making the future of humanity. What did
I know that they&rsquo;re making it on twenty-year-old technology. Second. We,
ordinary people, might all be using way more power (and grid) than is really
needed.</p>
<p><em>Updated on February 23th, 2021:</em></p>
<p>On Monday, NASA released [a video][7] of Perseverance&rsquo;s descent to the red
planet. If it looks like aliens are descending on the surface, it&rsquo;s because,
well, that is what happens. We are the aliens. NASA also released an absolutely
mind-blowing [recording][8] of sounds from Mars&rsquo;s surface.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>As a non-native speaker, I was surprised (and delighted) to note that they refer to the drone as &lsquo;her&rsquo;&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://en.wikipedia.org/wiki/Perseverance_(rover)#Design">Perseverance</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://en.wikipedia.org/wiki/RAD750">The RAD750</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://en.wikipedia.org/wiki/Comparison_of_embedded_computer_systems_on_board_the_Mars_rovers">Comparison of embedded computer systems on board the Mars rovers</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p><a href="https://en.wikipedia.org/wiki/VxWorks">VxVorks</a>
[6]: <a href="https://www.cio.com/article/3569577/the-technology-aboard-the-mars-rover-perseverance-an-inside-look.html">https://www.cio.com/article/3569577/the-technology-aboard-the-mars-rover-perseverance-an-inside-look.html</a>
[7]: <a href="https://youtu.be/4czjS9h4Fpg">https://youtu.be/4czjS9h4Fpg</a>
[8]: <a href="https://soundcloud.com/nasa/first-sounds-from-mars-filters-out-rover-self-noise">https://soundcloud.com/nasa/first-sounds-from-mars-filters-out-rover-self-noise</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: We Have Always Lived in the Castle</title>
      <link>https://nicolaiarocci.com/book-review-we-have-always-lived-in-the-castle/</link>
      <pubDate>Thu, 18 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-we-have-always-lived-in-the-castle/</guid>
      <description>&lt;p&gt;I came back to reading Shirley Jackson almost by coincidence. I had just
finished watching The Haunting of Hill House, and, as I always do with stuff
that tickles my curiosity, I was doing a little research on it. That&amp;rsquo;s how
I learned that the TV Series is loosely based on a novel by the same name
written by&amp;hellip; Shirley Jackson.&lt;/p&gt;
&lt;p&gt;Still imbued by the TV Series&amp;rsquo;s atmospheres, now knowing about its connection
with Jackson, I was ready for another dive into her literature of psychological
suspense and terror. Terror, not horror. Because one thing to appreciate in
Jackson&amp;rsquo;s writing is that she relies on the former rather than the latter. To
elicit emotion in the reader, she uses the tension between characters&amp;rsquo; psyches
and the complex relationships between mysterious events. Stephen King opens his
own novel, Firestarter, with this dedication: &amp;ldquo;In memory of Shirley Jackson,
who never needed to raise her voice.&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I came back to reading Shirley Jackson almost by coincidence. I had just
finished watching The Haunting of Hill House, and, as I always do with stuff
that tickles my curiosity, I was doing a little research on it. That&rsquo;s how
I learned that the TV Series is loosely based on a novel by the same name
written by&hellip; Shirley Jackson.</p>
<p>Still imbued by the TV Series&rsquo;s atmospheres, now knowing about its connection
with Jackson, I was ready for another dive into her literature of psychological
suspense and terror. Terror, not horror. Because one thing to appreciate in
Jackson&rsquo;s writing is that she relies on the former rather than the latter. To
elicit emotion in the reader, she uses the tension between characters&rsquo; psyches
and the complex relationships between mysterious events. Stephen King opens his
own novel, Firestarter, with this dedication: &ldquo;In memory of Shirley Jackson,
who never needed to raise her voice.&rdquo;</p>
<p>We Have Always Lived in the Castle is a masterpiece. Let&rsquo;s just marvel for
a moment at the mastery of the incipit:</p>
<blockquote>
<p>My name is Mary Katherine Blackwood. I am eighteen years old, and I live with
my sister Constance. I have often thought that with any luck at all, I could
have been born a werewolf, because the two middle fingers on both my hands
are the same length, but I have had to be content with what I had. I dislike
washing myself, and dogs, and noise. I like my sister Constance, and Richard
Plantagenet, and Amanita phalloides, the death-cup mushroom. Everyone else in
my family is dead.</p></blockquote>
<p><img alt="We Have Always Lived in the Castle(book cover)" loading="lazy" src="/images/we_have_always_lived_in_the_castle.jpg#right">
Tone and pace are subtly, masterfully set right there in the opening paragraph.
The main character is already outlined. In hindsight, by the end of the book,
we can tell that we were hinted at a lot more than we initially thought. As
I was reading, I could not help but think how clear and terse Jackson&rsquo;s prose
is. Only apparently simple, it draws scenes and characters with gem-cut
precision. The unsaid does matter.</p>
<p>As Jonathan Lethem once noted, all of Jackson&rsquo;s work creates an atmosphere of
strangeness and contact with a vast intimacy with everyday evil&hellip; and how that
intimacy affects a village, a family, a self. This is, in fact, true for all
the three Jacksons&rsquo; works I read. Another common theme is the persecution of
people who exhibit &ldquo;otherness&rdquo; or become outsiders in small communities, like
those found in remote villages. This mirrors the author&rsquo;s own experience. When
she moved with her husband from New York to a small, rural Vermont village,
they were isolated and ostracized by the local community. According to Letham,
mainly because of anti-Semitism and anti-intellectualism.</p>
<p>In We Have Always Lived in the Castle, however, there is room for love and
devotion. Only, they are probably extreme or distorted in sinister and
remarkable ways.</p>
<p>This book is brilliant because it takes the canonical witch/haunted house theme
and flips it over, instantly reversing the perspective. The story is told from
within the house. Village folks are the bad guys. Those who seem to be
motivated by good intentions are only fulfilling their own ego or striving to
behave with good manners, as society expects them to do. We cannot help but
feel at least a drop of compassion and sympathy for the devil.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Seven years ago at FOSDEM</title>
      <link>https://nicolaiarocci.com/seven-years-ago-at-fosdem/</link>
      <pubDate>Mon, 15 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/seven-years-ago-at-fosdem/</guid>
      <description>&lt;p&gt;About seven years ago, I presented the Eve Framework in a very crowded Python
room at FOSDEM 2014 in Brussels. If you don&amp;rsquo;t know about FOSDEM, well, you
should check it out. Every year thousands of developers who recognize
themselves with the free and open-source movement gather in Brussels from all
over the world. And I mean thousands of them. According to Wikipedia, since
2011, the meeting hosts about 4,000 visitors every year. It&amp;rsquo;s huge, and it&amp;rsquo;s
a one of its kind.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>About seven years ago, I presented the Eve Framework in a very crowded Python
room at FOSDEM 2014 in Brussels. If you don&rsquo;t know about FOSDEM, well, you
should check it out. Every year thousands of developers who recognize
themselves with the free and open-source movement gather in Brussels from all
over the world. And I mean thousands of them. According to Wikipedia, since
2011, the meeting hosts about 4,000 visitors every year. It&rsquo;s huge, and it&rsquo;s
a one of its kind.</p>
<p>In 2021, FOSDEM was held online. I already <a href="/upcoming-speaking-engagements-with-ramblings/">mentioned</a> how I miss live events. In
that post, I also wrote:</p>
<blockquote>
<p>Any conference junkie will tell you that she/he attends for the people first,
and only then for the sessions themselves. At these events, the most exciting
stuff happens in the corridors, usually during breaks.</p></blockquote>
<p>At that FOSDEM seven years ago, I experienced one of those corridor moments. It
did not really happen in a corridor, however.</p>
<p>I was at the Delirium Cafe one night, with my good friend (and exceptionally
skilled Pythonista) <a href="https://www.amazon.com/Alessandro-Molina/e/B07F8CTSHW?ref_=dbs_p_ebk_r00_abau_000000">Alessandro Molina</a> at my side. Many other conference
attendees were there, and we were all having fun doing what nerds do when they
gather for a night in the pub. We were sitting at this big round table, me,
Alessandro, and three other guys I did not know yet. We all started chatting,
enjoying ourselves over a few rounds of tasty Belgian beer. In front of me was
sitting this friendly, obviously brilliant (if a little shy) guy from
Switzerland. At some point, I don&rsquo;t remember why, we were talking about PyPy,
and getting technical about it. This guy was giving me a rundown on the
ins-and-outs of PyPy, and well, I was surprised at how profound his knowledge
was. In passing, I said that Alessandro and I knew one guy from the core team,
Antonio Cuni. Then I mentioned the original author of the project, Armin Rigo,
I think complimenting him on that significant achievement. The guy in front of
me nodded and then smiled at me. And then came this weird, jarring moment of
silence. That&rsquo;s when my friend Alessandro nudged me and whispered, &ldquo;Hey man,
that&rsquo;s Armin Rigo sitting there. Right in front of you.&rdquo; We all had a good
laugh. The next round was on me.</p>
<p>It&rsquo;s small moments like these that make attending (and presenting at)
conferences worth it.</p>
<p>PS. I had all the hints—the brilliant guy from Switzerland who knows PyPy like
the back of his hand. Someone wasn&rsquo;t so smart on that night.</p>
<figure>
    <img loading="lazy" src="/images/fosdem2014_python_room.jpg"
         alt="The Python room at FOSDEM 2014"/> <figcaption>
            <p><em>The Python room at FOSDEM 2014</em></p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/fosdem2014.jpg"
         alt="With Alessandrio at FOSDEM 2014"/> <figcaption>
            <p><em>With Alessandro at FOSDEM 2014</em></p>
        </figcaption>
</figure>

]]></content:encoded>
    </item>
    <item>
      <title>Troubles with VirtualBox and the Windows Subsystem for Linux</title>
      <link>https://nicolaiarocci.com/troubles-with-virtualbox-and-the-windows-subsystem-for-linux/</link>
      <pubDate>Sun, 14 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/troubles-with-virtualbox-and-the-windows-subsystem-for-linux/</guid>
      <description>&lt;p&gt;Today I learned the hard way: don&amp;rsquo;t you dare running a vanilla install of
VirtualBox together with Windows Subsystem for Linux v2 (WSL2). It won&amp;rsquo;t work.
That&amp;rsquo;s because WSL2 uses Hyper-V under the hood, which is incompatible with
VirtualBox.&lt;/p&gt;
&lt;p&gt;According to the &lt;a href=&#34;https://docs.oracle.com/en/virtualization/virtualbox/6.0/admin/hyperv-support.html&#34;&gt;official documentation&lt;/a&gt; for VirtualBox v6.0:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oracle VM VirtualBox can be used on a Windows host where Hyper-V is running.
&lt;strong&gt;This is an experimental feature&lt;/strong&gt;. No configuration is required. Oracle VM
VirtualBox detects Hyper-V automatically and uses Hyper-V as the
virtualization engine for the host system.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I learned the hard way: don&rsquo;t you dare running a vanilla install of
VirtualBox together with Windows Subsystem for Linux v2 (WSL2). It won&rsquo;t work.
That&rsquo;s because WSL2 uses Hyper-V under the hood, which is incompatible with
VirtualBox.</p>
<p>According to the <a href="https://docs.oracle.com/en/virtualization/virtualbox/6.0/admin/hyperv-support.html">official documentation</a> for VirtualBox v6.0:</p>
<blockquote>
<p>Oracle VM VirtualBox can be used on a Windows host where Hyper-V is running.
<strong>This is an experimental feature</strong>. No configuration is required. Oracle VM
VirtualBox detects Hyper-V automatically and uses Hyper-V as the
virtualization engine for the host system.</p></blockquote>
<p>Well, that did not prove to be true in my case. Hence the experimental clause,
I guess. A little googling revealed that, indeed, it did work for a while, then
a new Windows 10 release broke it again:</p>
<blockquote>
<p>The Hyper-V API became a viable reality with 1803, practically with 1809. And
it went fine with 1903. And it broke with 1909. Please use your favorite
search engine for &ldquo;Immature API&rdquo;&hellip; (<a href="https://forums.virtualbox.org/viewtopic.php?f=6&amp;t=90853&amp;start=195#p465333">source</a>)</p></blockquote>
<p>Even if it did work, however, you&rsquo;d run into some (possibly) severe
performance degradation. Quoting from the same official documentation page:</p>
<blockquote>
<p>When using this feature, some host systems might experience significant
Oracle VM VirtualBox performance degradation.</p></blockquote>
<p>If you don&rsquo;t need to run WSL2 and your VMs simultaneously, one workaround is to
disable WSL2 in the Windows Features.  There, you have to disable Hyper-V,
Virtual Machine Platform, and Windows Subsystem for Windows. Yes, I had to
explicitly disable all three of them. When you eventually reactivate them, WSL2
will start working again, configurations included.</p>
<p>Another option is to fallback to WSL1. That will work. Unlike WSL2, WSL1 does
not run in a VM. Also, converting back and forth between WSL1 and WLS2 is dead
simple. I did not go this route because, well, I like the performance that
comes with WSL2. I also plan to use VirtualBox only rarely, when I need to test
new versions of our desktop application&rsquo;s installation procedure.</p>
<p>This is all not ideal, of course. The situation is evolving. <a href="https://github.com/MicrosoftDocs/WSL/issues/536">This ticket</a>
on the WSL documentation repository is probably the place to watch for updates.</p>
<p>Hopefully, soon, once the currently &ldquo;immature API&rdquo; stabilizes, I will be able
to come back to this article, edit it, and note that now everything works as
expected.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What I listen to while programming</title>
      <link>https://nicolaiarocci.com/what-i-listen-to-while-programming/</link>
      <pubDate>Fri, 12 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/what-i-listen-to-while-programming/</guid>
      <description>&lt;p&gt;What music do you listen to while programming?&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; For me, it&amp;rsquo;s usually jazz,
classical, electronic, lots of it, or nothing. There are some specialized
websites and podcasts I sometimes recur to, like [Music for Programming][1].
Several Spotify playlists I dig a lot, [Every Day I&amp;rsquo;m Nerdin&amp;rsquo;][2] being one of
them. What can I say? I am musically omnivore.&lt;/p&gt;
&lt;p&gt;However, I recently discovered something different: the [Field Recordings
podcast][3]. &amp;ldquo;A podcast where audio-makers stand silently in fields (or things
that could be broadly interpreted as fields).&amp;rdquo; I am told it was launched last
year, just about when the COVID lockdowns started, by acclaimed UK audio artist
and producer Eleanor McDowall. It&amp;rsquo;s free, updated daily with submissions coming
from all over the world, and holds many treasures. Most episodes are short, I&amp;rsquo;d
say around the 5 minutes mark, with some notable exceptions like [The Sound of
2020][4], &amp;ldquo;A slow weave of some of 2020&amp;rsquo;s Field Recordings in chronological
order&amp;rdquo;. One of my favorites has got to be the &amp;ldquo;[Inside the log burner][5]&amp;rdquo;
episode by Chris Attaway (Devoran, Cornwall, UK, January 2021):&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>What music do you listen to while programming?<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> For me, it&rsquo;s usually jazz,
classical, electronic, lots of it, or nothing. There are some specialized
websites and podcasts I sometimes recur to, like [Music for Programming][1].
Several Spotify playlists I dig a lot, [Every Day I&rsquo;m Nerdin&rsquo;][2] being one of
them. What can I say? I am musically omnivore.</p>
<p>However, I recently discovered something different: the [Field Recordings
podcast][3]. &ldquo;A podcast where audio-makers stand silently in fields (or things
that could be broadly interpreted as fields).&rdquo; I am told it was launched last
year, just about when the COVID lockdowns started, by acclaimed UK audio artist
and producer Eleanor McDowall. It&rsquo;s free, updated daily with submissions coming
from all over the world, and holds many treasures. Most episodes are short, I&rsquo;d
say around the 5 minutes mark, with some notable exceptions like [The Sound of
2020][4], &ldquo;A slow weave of some of 2020&rsquo;s Field Recordings in chronological
order&rdquo;. One of my favorites has got to be the &ldquo;[Inside the log burner][5]&rdquo;
episode by Chris Attaway (Devoran, Cornwall, UK, January 2021):</p>
<blockquote>
<p>&ldquo;I was prepping a fire in our log burner on a cold, blustery day here in
Devoran, Cornwall and the wind whistling through the vents was really creepy!
So I stuck my Zoom inside and recorded it for a bit. It was like it had its
own little atmosphere and weather inside!&rdquo;</p></blockquote>
<p>At my desk churning out code, I hit play, and that stove is instantly
teleported here, right by my side. I can almost feel its warmth. Indeed,
there&rsquo;s something cathartic about listening to these sound fragments from all
over the world.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>As I write this, news of the passing of Chick Corea hit me. Today his <em>Plays</em> album is on repeat.
[5]: <a href="https://fieldrecordings.xyz/2021/01/12/inside-the-log-burner-devoran-cornwall-in-january-2021-by-chris-attaway/">https://fieldrecordings.xyz/2021/01/12/inside-the-log-burner-devoran-cornwall-in-january-2021-by-chris-attaway/</a>
[4]: <a href="https://fieldrecordings.xyz/2020/12/14/the-sound-of-2020/">https://fieldrecordings.xyz/2020/12/14/the-sound-of-2020/</a>
[3]: <a href="https://fieldrecordings.xyz/">https://fieldrecordings.xyz/</a>
[2]: <a href="https://open.spotify.com/playlist/1itC2kKqIqun8OU05J5G8v?si=iYtyuKAfT4ejArv1aaT4FQ">https://open.spotify.com/playlist/1itC2kKqIqun8OU05J5G8v?si=iYtyuKAfT4ejArv1aaT4FQ</a>
[1]: <a href="http://www.musicforprogramming.net/">http://www.musicforprogramming.net/</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>When Homebrew breaks your Python virtual environment</title>
      <link>https://nicolaiarocci.com/when-homebrew-breaks-your-python-virtual-environment/</link>
      <pubDate>Mon, 08 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/when-homebrew-breaks-your-python-virtual-environment/</guid>
      <description>&lt;p&gt;Ever had your old, trusty Python virtual environment fail on you? I sure did.
Sometimes, when I activate or switch between virtual environments, I get the
following error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ workon eve
dyld: Library not loaded: @executable_path/../.Python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I never really took the time to look into it. When this happens, because I am
in a rush (and because I am a lazy old fart), I shrug it off, recreate the
virtual environment on the spot, and get back to work.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ever had your old, trusty Python virtual environment fail on you? I sure did.
Sometimes, when I activate or switch between virtual environments, I get the
following error:</p>
<pre><code>$ workon eve
dyld: Library not loaded: @executable_path/../.Python
</code></pre>
<p>I never really took the time to look into it. When this happens, because I am
in a rush (and because I am a lazy old fart), I shrug it off, recreate the
virtual environment on the spot, and get back to work.</p>
<p>My friend Justin Mayer knows better. The other day, he posted a <a href="https://justinmayer.com/posts/homebrew-python-is-not-for-you/">short
insightful article</a> about this very same issue:</p>
<blockquote>
<p>Perhaps you heard stories about why you shouldn’t use the system-bundled
Python, so instead you use Homebrew to install Python and then use its
interpreter to create a virtual environment. A month later, you activate that
same environment, and when you try to use it, you see this inscrutable error:
(&hellip;) What happened? The Python interpreter referenced by the virtual
environment… no longer exists. But how can that be? You didn’t change
anything! You didn’t change anything… but Homebrew did.</p></blockquote>
<p>Homebrew is the culprit. If you have been affected (and if you have done any
length of serious Python work, you have), then go <a href="https://justinmayer.com/posts/homebrew-python-is-not-for-you/">read</a> Justin&rsquo;s piece. He
explains the whys and then goes into the hows you solve the problem for good.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: The Water Dancer</title>
      <link>https://nicolaiarocci.com/book-review-the-water-dancer/</link>
      <pubDate>Sat, 06 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-the-water-dancer/</guid>
      <description>&lt;p&gt;The Water Dancer is the debut novel for Ta-Nehisi Coates, an author and
journalist best known for his nonfiction works. Set in a slave plantation
located in pre-civil war Virginia, this is a bold and ambitious story about
slavery. From the editor &lt;a href=&#34;https://www.penguinrandomhouse.com/books/550171/the-water-dancer-by-ta-nehisi-coates/&#34;&gt;website&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Young Hiram Walker was born into bondage. When his mother was sold away,
Hiram was robbed of all memory of her—but was gifted with a mysterious power.
Years later, when Hiram almost drowns in a river, that same power saves his
life. This brush with death births an urgency in Hiram and a daring scheme:
to escape from the only home he’s ever known.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The Water Dancer is the debut novel for Ta-Nehisi Coates, an author and
journalist best known for his nonfiction works. Set in a slave plantation
located in pre-civil war Virginia, this is a bold and ambitious story about
slavery. From the editor <a href="https://www.penguinrandomhouse.com/books/550171/the-water-dancer-by-ta-nehisi-coates/">website</a>:</p>
<blockquote>
<p>Young Hiram Walker was born into bondage. When his mother was sold away,
Hiram was robbed of all memory of her—but was gifted with a mysterious power.
Years later, when Hiram almost drowns in a river, that same power saves his
life. This brush with death births an urgency in Hiram and a daring scheme:
to escape from the only home he’s ever known.</p></blockquote>
<p><img alt="The Water Dancer, book cover" loading="lazy" src="/images/water_dancer_cover.jpg#right">
Given the premise, one might expect an action-packed escape story. Instead, the
rhythm is deliberately slow-paced, and the tone is quiet. In fact, some
reviewers find the book a little slow. I disagree. It&rsquo;s calm, yes, but
definitely not slow. Hiram Walker, the main character, has this quiet attitude.
Because he is the narrator, we see the world from his own perspective.</p>
<p>Coates prose is excellent if sometimes a little meandering. Several times while
reading, I was brought back to scenes from Quentin Tarantino&rsquo;s Django
Unchained. Mind you, this novel is nothing at all like Django. There is
violence, and brutality too, but they stay under trace. Yet, somehow this novel
manages to validate the movie&rsquo;s events; it makes them very believable.</p>
<p>I was a little disconcerted when supernatural elements started pouring into the
story. The plot deviating from the historic genre into what, fantasy? Then it
landed on me. This work is obviously the result of long and passionate
research. If fantastical elements are introduced, it must be because they fit
with the story somehow. A little research reveals that, indeed, that is the
case. Myths of slaves escaping their condition by magic means or powerful
ritual songs were deep-rooted within their culture. In this novel, legend
becomes reality. What I initially found to be jarring turns out to be the
perfect plot-twist, the expedient that allows the story to unfold.</p>
<p>The Underground Railroad, the network of secret routes and safe houses used by
the enslaved to escape into the free states of the North, is a fascinating
subject. I did not know about it, and I am grateful to this book for teaching
me.</p>
<p>I think this book does an excellent job at recounting slavery from the enslaved
(or the Tasked, as the author calls them) viewpoint and their culture.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Strong opinions on software development</title>
      <link>https://nicolaiarocci.com/strong-opinions-on-software-development/</link>
      <pubDate>Wed, 03 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/strong-opinions-on-software-development/</guid>
      <description>&lt;p&gt;After six years in the field, Chris has &lt;a href=&#34;https://chriskiehl.com/article/thoughts-after-6-years&#34;&gt;shared&lt;/a&gt; his strong opinions on
software development practices, languages, and methodologies. I like his
attitude. Willingness to continuously put one&amp;rsquo;s personal views under scrutiny,
eventually adapting or even changing them as needed, is not a common trait. Not
in our field. While I generally agree with most of his opinions, I feel the
urge to comment on a few of them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Typed languages are better when you&amp;rsquo;re working on a team of people with
various experience levels&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>After six years in the field, Chris has <a href="https://chriskiehl.com/article/thoughts-after-6-years">shared</a> his strong opinions on
software development practices, languages, and methodologies. I like his
attitude. Willingness to continuously put one&rsquo;s personal views under scrutiny,
eventually adapting or even changing them as needed, is not a common trait. Not
in our field. While I generally agree with most of his opinions, I feel the
urge to comment on a few of them.</p>
<blockquote>
<p>Typed languages are better when you&rsquo;re working on a team of people with
various experience levels</p></blockquote>
<p>Typed languages are better, period.</p>
<blockquote>
<p>Software architecture probably matters more than anything else. A shitty
implementation of a good abstraction causes no net harm to the code base.
A bad abstraction or missing layer causes everything to rot.</p></blockquote>
<p>Perfect. I am stealing this line.</p>
<blockquote>
<p>Clever code isn&rsquo;t usually good code. Clarity trumps all other concerns.</p></blockquote>
<p>Good <em>and</em> clever code is very possible, though. Agree on the second part.</p>
<blockquote>
<p>Bad code can be written in any paradigm</p></blockquote>
<p>Ça va sans dire</p>
<blockquote>
<p>So called &ldquo;best practices&rdquo; are contextual and not broadly applicable. Blindly
following them makes you an idiot</p></blockquote>
<p>Not following them also makes you an idiot.</p>
<blockquote>
<p>Designing scalable systems when you don&rsquo;t need to makes you a bad engineer.</p></blockquote>
<p>But how do I know in advance whether I need to be scalable or not? Not always
an easy call. Also, scalability doesn&rsquo;t necessarily imply complexity.</p>
<blockquote>
<p>In general, RDBMS &gt; NoSql</p></blockquote>
<p>In general, use the right tool for the right job.</p>
<blockquote>
<p>Functional programming is another tool, not a panacea.</p></blockquote>
<p>The jury is out on this one. In my admittedly limited experience, functional
programming tends to win over OOP. It&rsquo;s not a coincidence that most OOP
languages keep adding functional features (looking at you, C#.).</p>
<blockquote>
<p>Pencil and paper are the best programming tools and vastly under used</p></blockquote>
<p>Old fart me concurs.</p>
<blockquote>
<p>Trading purity in exchange for practicality is usually a good call</p></blockquote>
<p>Don&rsquo;t get carried away with that.</p>
<blockquote>
<p>Talking directly to the customer always reveals more about the problem, in
less time, and with higher accuracy</p></blockquote>
<p><em>:s/always/sometimes</em></p>
<blockquote>
<p>The word &ldquo;scalable&rdquo; has a mystical and stupefying power over the mind of the
software engineer. Its mere utterance can whip them into a depraved frenzy.
Grim actions have been justified using this word</p></blockquote>
<p>I plea guilty on this one.</p>
<blockquote>
<p>Despite being called &ldquo;engineers,&rdquo; most decision are pure cargo-cult with no
backing analysis, data, or numbers</p></blockquote>
<p>I am a software craftsman.</p>
<blockquote>
<p>People who stress over code style, linting rules, or other minutia are insane
weirdos</p></blockquote>
<p>I am an insane weirdo.</p>
<blockquote>
<p>Code coverage has absolutely nothing to do with code quality</p></blockquote>
<p>It also has nothing to do with <em>tests</em> quality.</p>
<blockquote>
<p>Monoliths are pretty good in most circumstances</p></blockquote>
<p><em>:s/most/some</em></p>
<blockquote>
<p>TDD purists are just the worst. Their frail little minds can&rsquo;t process the
existence of different workflows.</p></blockquote>
<p>Ouch. This hurts.</p>
<p>I am not sure I would have had so many well-formed opinions only six years in.
Read them all on <a href="https://chriskiehl.com/article/thoughts-after-6-years">Chris&rsquo; website</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Great Unbundling according to Benedict Evans</title>
      <link>https://nicolaiarocci.com/the-great-unbundling-according-to-benedict-evans/</link>
      <pubDate>Tue, 02 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-great-unbundling-according-to-benedict-evans/</guid>
      <description>&lt;p&gt;As a non-native English reader, I had to look up the true meaning of
&amp;ldquo;Unbundling&amp;rdquo; as a neologism. According to Wikipedia&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unbundling is a neologism to describe how the ubiquity of mobile devices,
Internet connectivity, consumer web technologies, social media and
information access in the 21st century is affecting older institutions
(education, broadcasting, newspapers, games, shopping, etc.) by &amp;ldquo;break[ing]
up the packages they once offered (possibly even for free), providing
particular parts of them at a scale and cost unmatchable by the old
order.&amp;rdquo; Unbundling has been called &amp;ldquo;the great disruptor.&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As a non-native English reader, I had to look up the true meaning of
&ldquo;Unbundling&rdquo; as a neologism. According to Wikipedia</p>
<blockquote>
<p>Unbundling is a neologism to describe how the ubiquity of mobile devices,
Internet connectivity, consumer web technologies, social media and
information access in the 21st century is affecting older institutions
(education, broadcasting, newspapers, games, shopping, etc.) by &ldquo;break[ing]
up the packages they once offered (possibly even for free), providing
particular parts of them at a scale and cost unmatchable by the old
order.&rdquo; Unbundling has been called &ldquo;the great disruptor.&rdquo;</p></blockquote>
<p>Every year Benedict Evans, former Andreessen Howoritz partner and now
independent analyst, produces a big presentation digging into macro and
strategic trends in the tech industry. This year, <em>The Great Unbundling</em>.</p>
<blockquote>
<p>Covid brought shock and a lot of broken habits to tech, but mostly, it
accelerates everything that was already changing. 20 trillion dollars of
retail, brands, TV and advertising is being overturned, and software is
remaking everything from cars to pharma. Meanwhile, China has more smartphone
users than Europe and the USA combined, and India is close behind</p>
<ul>
<li>technology and innovation will be much more widely spread. For that and
lots of other reasons, tech is becoming a regulated industry, but if we step
over the slogans, what does that actually mean? Tech is entering its second
50 years.</li>
</ul></blockquote>
<p>I find this work to be worth studying. It draws a detailed, informed picture of
what happened in technology and the economy these last years. It also offers
insights, with some foresight, into what might come next.</p>
<p>Find the presentation at <a href="https://www.ben-evans.com/presentations">ben-evans.com</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Upcoming speaking engagements, with ramblings</title>
      <link>https://nicolaiarocci.com/upcoming-speaking-engagements-with-ramblings/</link>
      <pubDate>Fri, 29 Jan 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/upcoming-speaking-engagements-with-ramblings/</guid>
      <description>&lt;p&gt;I am presenting at two different events in February next month. Given the
current COVID situation, that is entirely unexpected. In 2020 I only gave &lt;a href=&#34;https://nicolaiarocci.com/speaking&#34;&gt;four
talks&lt;/a&gt;, three of which were virtual. I am not holding my breath for 2021.
Conferences are going virtual all year-long. Next year too, most likely.&lt;/p&gt;
&lt;p&gt;There are some clear advantages in going virtual, but the final result is a net
negative. Any conference junkie will tell you that she/he attends for the
people first, and only then for the sessions themselves. At these events, the
most exciting stuff happens in the corridors, usually during breaks. A little
story here. You might know that I run a motorcycle club. Well, the very idea of
founding it was actually ignited by a corridor chat, few minutes after
I delivered a session. Replicating this kind of in-person interaction online
is, well, next to impossible.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am presenting at two different events in February next month. Given the
current COVID situation, that is entirely unexpected. In 2020 I only gave <a href="/speaking">four
talks</a>, three of which were virtual. I am not holding my breath for 2021.
Conferences are going virtual all year-long. Next year too, most likely.</p>
<p>There are some clear advantages in going virtual, but the final result is a net
negative. Any conference junkie will tell you that she/he attends for the
people first, and only then for the sessions themselves. At these events, the
most exciting stuff happens in the corridors, usually during breaks. A little
story here. You might know that I run a motorcycle club. Well, the very idea of
founding it was actually ignited by a corridor chat, few minutes after
I delivered a session. Replicating this kind of in-person interaction online
is, well, next to impossible.</p>
<p>As a speaker, I miss presenting live. A simple glance at the audience helps me
assess how&rsquo;s going and eventually adjust my talk direction. The Q&amp;A session at
the end? That is often a matter of eye contact and body language. Not to
mention the &ldquo;offline session&rdquo; that follows if your presentation had any degree
of success. With online delivery, that&rsquo;s all lost.</p>
<p>Also, I suspect not many online attendees actually pay due attention, not
compared to the same session presented in-person.  I know that&rsquo;s true for me.
When I&rsquo;m comfortably sitting at my desk, too many things compete for my
attention. Every possible distraction is just one click away. And then there&rsquo;s
the family. And my cat, of course.</p>
<p>Speaking of attendance, I would not be surprised to find that many people who
sign up for the event won&rsquo;t actually show up. Again, I know because it
happens to me all the time.  The commitment I have to put in for attending an
in-person conference is much higher, making it more likely that I will actually
participate.</p>
<p>Organizers, on the other hand, are incredible. They do a fantastic job in
attempting to provide an experience as close as possible to the real one. They
are the true heroes of this kind of event. They always have been, even more so
now that we&rsquo;re forced to go virtual. Remember to always have a word of
gratitude for your fellow organizer. She/he deserves that.</p>
<p>Alright, enough with the rambling. Here&rsquo;s where I&rsquo;m presenting next month:</p>
<ul>
<li><strong>Python REST APIs for Humans</strong> at <a href="https://codegen2021.azurewebsites.net/">CloudGen 2021</a></li>
<li><strong>Introduction to F# and functional languages</strong> at <a href="https://scottishsummit.com/">Scottish Summit 2021</a></li>
</ul>
<p>One significant advantage of virtual conferences is that anybody can take part
no matter where she/he lives on the planet. So, maybe you will fancy join us?</p>
]]></content:encoded>
    </item>
    <item>
      <title>The unreasonable effectiveness of simple HTML</title>
      <link>https://nicolaiarocci.com/the-unreasonable-effectiveness-of-simple-html/</link>
      <pubDate>Thu, 28 Jan 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/the-unreasonable-effectiveness-of-simple-html/</guid>
      <description>&lt;p&gt;We&amp;rsquo;ve seen other articles pointing the finger at unnecessarily bloated
websites. Terence Eden&amp;rsquo;s &lt;em&gt;&lt;a href=&#34;https://shkspr.mobi/blog/2021/01/the-unreasonable-effectiveness-of-simple-html/&#34;&gt;On the unreasonable effectiveness of simple
HTML&lt;/a&gt;&lt;/em&gt; deserves mention, I think, for two reasons. First, the delivery is
incredibly effective. Second, it is effective because of the storytelling.&lt;/p&gt;
&lt;p&gt;By enveloping the message into an original short, touching story, he achieves
two goals. First, he captures the reader&amp;rsquo;s attention; second, he makes the
experience memorable. Please, go and read it; I&amp;rsquo;ll wait here.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We&rsquo;ve seen other articles pointing the finger at unnecessarily bloated
websites. Terence Eden&rsquo;s <em><a href="https://shkspr.mobi/blog/2021/01/the-unreasonable-effectiveness-of-simple-html/">On the unreasonable effectiveness of simple
HTML</a></em> deserves mention, I think, for two reasons. First, the delivery is
incredibly effective. Second, it is effective because of the storytelling.</p>
<p>By enveloping the message into an original short, touching story, he achieves
two goals. First, he captures the reader&rsquo;s attention; second, he makes the
experience memorable. Please, go and read it; I&rsquo;ll wait here.</p>
<p>In the second paragraph, we&rsquo;re already knee-deep into the story:</p>
<blockquote>
<p>In the middle, a young woman sits on a hard plastic chair. She is surrounded
by canvas-bags containing her worldly possessions. She doesn’t look like she
is in a great emotional place right now. Clutched in her hands is a games
console – a PlayStation Portable. She stares at it intensely; blocking out
the world with Candy Crush. Or, at least, that’s what I thought.</p></blockquote>
<p>Then, in the second to last paragraph, when the story is long over, notice the
expedient of echoing elements from the story (the woman&rsquo;s chair; the small
obsolete device; both uncomfortable) to reinforce the message:</p>
<blockquote>
<p>Go sit in an uncomfortable chair, in an uncomfortable location, and stare at
an uncomfortably small screen with an uncomfortably outdated web browser. How
easy is it to use the websites you’ve created?</p></blockquote>
<p>For added momentum, the last paragraph reconciliates the story and the
message—worth a read. Style notes aside, of course, unless your website serves
static content, some Javascript is probably going to be unavoidable. The point
still stands, though: do not overdo it. Or, as Confucius would say, do not use
a cannon to kill a mosquito.</p>
]]></content:encoded>
    </item>
    <item>
      <title>On the short, tormented life of Phil Katz</title>
      <link>https://nicolaiarocci.com/on-the-short-tormented-life-of-phil-katz/</link>
      <pubDate>Fri, 22 Jan 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-the-short-tormented-life-of-phil-katz/</guid>
      <description>&lt;p&gt;Bless the Internet Archive and its Wayback Machine. With it, we can go back in
time and read &lt;a href=&#34;https://web.archive.org/web/20000829071343/http://www2.jsonline.com/news/state/may00/katz21052000a.asp&#34;&gt;The short, tormented life of computer genius Phil
Katz&lt;/a&gt;, an unusually detailed and accurate article published in the April 14,
2000 issue of the Milwaukee Journal Sentinel.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When he was found dead April 14, Phil Katz was slumped against a nightstand
in a south side hotel, cradling an empty bottle of peppermint schnapps. The
genius who built a multimillion-dollar software company known worldwide for
its pioneering &amp;ldquo;zip&amp;rdquo; files had died of acute pancreatic bleeding caused by
chronic alcoholism. He was alone, estranged long ago from his family and
a virtual stranger to employees of his own company, PKWare Inc. He was 37.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Bless the Internet Archive and its Wayback Machine. With it, we can go back in
time and read <a href="https://web.archive.org/web/20000829071343/http://www2.jsonline.com/news/state/may00/katz21052000a.asp">The short, tormented life of computer genius Phil
Katz</a>, an unusually detailed and accurate article published in the April 14,
2000 issue of the Milwaukee Journal Sentinel.</p>
<blockquote>
<p>When he was found dead April 14, Phil Katz was slumped against a nightstand
in a south side hotel, cradling an empty bottle of peppermint schnapps. The
genius who built a multimillion-dollar software company known worldwide for
its pioneering &ldquo;zip&rdquo; files had died of acute pancreatic bleeding caused by
chronic alcoholism. He was alone, estranged long ago from his family and
a virtual stranger to employees of his own company, PKWare Inc. He was 37.</p></blockquote>
<p>In the late 80s, when the culmination of Katz&rsquo;s work on compression algorithms,
PKZIP, emerged as the clear winner of the so-called &ldquo;compressors war,&rdquo; <a href="http://nicolaiarocci.com/a-trip-down-memory-lane-fidonet-and-usenet/">I was
running my own little BBS</a>, Lorien, which later evolved into Phoenix BBS,
a fully-fledged FidoNet node. When Lorien went first online in 1987, most if
not all downloadables were in ARC format. Three years later, in 1990, when
Phoenix emerged from Lorien&rsquo;s ashes, ZIP archives ruled the world. Fast forward
30 years. A couple of days ago, I wrote C# code that receives data streams over
a REST API and then stores them as ZIP files.</p>
<p>I would be hard-pressed to find another piece of shareware, single-handly
developed software that has been as influential, pervasive, and widespread in
the industry as PKZIP from PKWare. Of course, Linux and SQLite, although both
came later (the former in 1991, the latter in the spring of 2000.)</p>
<p>Katz&rsquo;s story is indeed a cautionary tale of genius, torment, and horrible
demise. I cannot help but wonder: would his life trajectory have been different
had he not been so successful? Probably not, given the details revealed in
the article, but who knows. For sure, the tormented story of Phil Katz leaves
me with one clear takeaway. Success does not grant happiness.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Book Review: Erebus, The Story of a Ship</title>
      <link>https://nicolaiarocci.com/book-review-erebus-the-story-of-a-ship/</link>
      <pubDate>Wed, 13 Jan 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/book-review-erebus-the-story-of-a-ship/</guid>
      <description>&lt;p&gt;I finished reading &lt;em&gt;Erebus: The Story of a Ship&lt;/em&gt; by Michael Palin, an excellent
book on the dramatic adventures of the HMS Erebus with her sister ship, the HMS
Terror, first in James Clark Ross&amp;rsquo;s Antarctic expedition of 1839-43, and then
during Franklin’s ill-fated Arctic expedition in search of the Northwest
Passage. I knew Michael Palin as a member of the Monty Python comedy group. As
it turns out, since 1980, he has also made many travel documentaries and books.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I finished reading <em>Erebus: The Story of a Ship</em> by Michael Palin, an excellent
book on the dramatic adventures of the HMS Erebus with her sister ship, the HMS
Terror, first in James Clark Ross&rsquo;s Antarctic expedition of 1839-43, and then
during Franklin’s ill-fated Arctic expedition in search of the Northwest
Passage. I knew Michael Palin as a member of the Monty Python comedy group. As
it turns out, since 1980, he has also made many travel documentaries and books.</p>
<p>I first became interested in these two ships’ Arctic adventure after watching
the fictionalized TV series <em>The Terror</em> with my son Marco. As a former navy
sailor myself, I appreciated how they realistically reconstructed the
claustrophobic every-day life on board the Victorian age ships. However, I did
not enjoy how the script soon took part from the real events, turning the story
into something closer to Jurassic Park, and that’s where I stopped watching the
series.</p>
<p><img alt="Erebus: The Story of a Ship (book cover)" loading="lazy" src="/images/erebus_cover.jpg#right">
This book, instead, is incredibly well-researched and written. To help tell the
story, Palin has traveled to various locations across the world – Tasmania, the
Falklands, the Canadian Arctic – to search for local information and experience
the terrain and the conditions that would have confronted the Erebus and her
crew. For anyone interested in history, exploration and heroic tales, this is
a book for you.</p>
<p><em>Enjoyed this post? Subscribe to the <a href="https://buttondown.email/nicolaiarocci">newsletter</a> or follow @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Five Good Books I Read in 2020</title>
      <link>https://nicolaiarocci.com/five-good-books-i-read-in-2020/</link>
      <pubDate>Mon, 04 Jan 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/five-good-books-i-read-in-2020/</guid>
      <description>&lt;p&gt;Here are five books I read in 2020 that I would recommend. I read several fine
books last year, so please check out my &lt;a href=&#34;https://nicolaiarocci.com/books-i-have-read/&#34;&gt;reading history&lt;/a&gt; if you are unsatisfied
with this selection.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Mani%3A_Travels_in_the_Southern_Peloponnese&#34;&gt;Mani: Travels in the Southern Peloponnese&lt;/a&gt;, by &lt;a href=&#34;https://en.wikipedia.org/wiki/Patrick_Leigh_Fermor&#34;&gt;Patrick Leigh
Fermor&lt;/a&gt;&lt;/em&gt;. I love Patrick Leigh Fermor. Over the years, I read almost
everything he wrote. He has been described as &amp;ldquo;a cross between Indiana Jones,
James Bond, and Graham Greene,&amp;rdquo; and for a good reason. He bridges the genres of
adventure story, travel writing, and memoir to reveal an ancient world living
alongside the twentieth century. Here he carries the reader with him on his
journeys among the Greeks of the mountains, exploring their history and
time-honored lore. The Mani, at the tip of Greece&amp;rsquo;s-and Europe&amp;rsquo;s-southernmost
peninsula, is one of the most isolated regions of the world. Cut off from the
rest of the country by the high range of the Taygetus and hemmed in by the
Aegean and Ionian seas, it is a land where the past is still very much a part
of its people&amp;rsquo;s daily lives.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Here are five books I read in 2020 that I would recommend. I read several fine
books last year, so please check out my <a href="https://nicolaiarocci.com/books-i-have-read/">reading history</a> if you are unsatisfied
with this selection.</p>
<p><em><a href="https://en.wikipedia.org/wiki/Mani%3A_Travels_in_the_Southern_Peloponnese">Mani: Travels in the Southern Peloponnese</a>, by <a href="https://en.wikipedia.org/wiki/Patrick_Leigh_Fermor">Patrick Leigh
Fermor</a></em>. I love Patrick Leigh Fermor. Over the years, I read almost
everything he wrote. He has been described as &ldquo;a cross between Indiana Jones,
James Bond, and Graham Greene,&rdquo; and for a good reason. He bridges the genres of
adventure story, travel writing, and memoir to reveal an ancient world living
alongside the twentieth century. Here he carries the reader with him on his
journeys among the Greeks of the mountains, exploring their history and
time-honored lore. The Mani, at the tip of Greece&rsquo;s-and Europe&rsquo;s-southernmost
peninsula, is one of the most isolated regions of the world. Cut off from the
rest of the country by the high range of the Taygetus and hemmed in by the
Aegean and Ionian seas, it is a land where the past is still very much a part
of its people&rsquo;s daily lives.</p>
<p><em>Bonus tip</em>. The book that got me hooked with Patrick Leigh Fermor is <em><a href="https://en.wikipedia.org/wiki/A_Time_of_Gifts">A Time of
Gifts</a></em>, a memoir of the first part of his journey on foot across Europe,
from the Hook of Holland to Constantinople in 1933/34. A fascinating read.</p>
<p><em><a href="https://en.wikipedia.org/wiki/In_Search_of_Lost_Time#Volume_One:_Swann's_Way">Swann&rsquo;s Way</a>, by <a href="https://en.wikipedia.org/wiki/Marcel_Proust">Marcel Proust</a></em>. This is the first volume of Marcel
Proust&rsquo;s <em>In Search of Lost Time</em>, arguably the twentieth century&rsquo;s finest novel.
Indeed, while reading the first part, a boy&rsquo;s impressions of his family and
neighbors, all brought dazzling back to life years later by the taste of
a madeleine, I could appreciate why Marcel Proust is considered the best writer
of all time. The second part, the short novel <em>Swann in Love</em>, &ldquo;an incomparable
study of sexual jealousy,&rdquo; which follows, is also excellent. I have to admit
I kept postponing this book basically for all my life, as I was intimidated by
its fame. I am glad I finally got to read it as a mature adult but make no
mistake, this book is a must-read, in due time, for any avid reader.</p>
<p><em><a href="https://en.wikipedia.org/wiki/The_Master_and_Margarita">The Master and Margarita</a>, by <a href="https://en.wikipedia.org/wiki/Mikhail_Bulgakov">Mikhail Bulgakov</a></em>. An audacious
revision of Faust and Pontius Pilate&rsquo;s stories, <em>The Master and Margarita</em> is
recognized as one of the essential classics of modern Russian literature. I was
surprised by both the audacity and modernity of the story and Bulgakov&rsquo;s own
writing style. Of all the scenes, those that probably impressed me the most
were Satan&rsquo;s ball and Margarita&rsquo;s flight. <em>The Master and Margarita</em> is a true
masterpiece. With <em>Swann&rsquo;s Way</em>, it sits right there at the top of my classics
stack.</p>
<p><em><a href="https://en.wikipedia.org/wiki/Helgoland_(book)">Helgoland</a>, by <a href="https://en.wikipedia.org/wiki/Carlo_Rovelli">Carlo Rovelli</a></em>. Carlo Rovelli is a theoretical
physicist and writer. His work is mainly in quantum gravity, where he is among
the founders of the loop quantum gravity theory. In this book, Rovelli
recounts the story of what has been acknowledged as the most radical scientific
revolution of modern times: quantum physics. In June 1925, in Helgoland, a bare
and windswept isle in the North Sea, a 23 years old Werner Heisenberg started
it all. Since then, in almost one century, quantum physics revealed many
controversial if not disturbing new ideas, most of them confirmed over time,
leading to all kinds of technological innovations. I don&rsquo;t think this book has
been translated to languages other than Italian as of yet. By googling a little
bit around, I found English translations announced by Penguin and other
editors.</p>
<p><em><a href="https://en.wikipedia.org/wiki/De_Brevitate_Vitae_%28Seneca%29">De Brevitate Vitae (On the Shortness of Life)</a>, by <a href="https://en.wikipedia.org/wiki/Seneca_the_Younger">Seneca</a></em>. I am
impressed by this short book. I expected it to be a challenging, hard descent
into the ancient philosopher&rsquo;s mind. It was a joyful read instead. Even today,
Seneca&rsquo;s writings offer potent insights into the art of living, the importance
of reason and morality and continue to provide profound guidance to many
through their eloquence, lucidity, and timeless wisdom.</p>
<h2 id="on-a-more-personal-note">On a more personal note</h2>
<p>I strive to read good books. Of course, defining what makes a good book is is
very subjective. In my case, good books challenge my understanding of the world
in which I live. That might sound too broad (and ambitious) of a goal, and
probably it is. I tend to read all kinds of different books: novels, essays,
classics, with non-fiction gravitating towards topics such as history, science,
and, only more recently, economy and finance. As you might have guessed from
the list above, lately, I have been reading classics a lot. I don&rsquo;t read too
many programming or computer science books. Not these days anyway. As I get
older, I prefer to distance myself from the topics I focus on at work all day
long.</p>
<p>Reading is my zen mode. I do other activities that achieve similar results,
such as walking, hiking, motorcycling and working out, but reading, I come to
recognize, reigns supreme. It&rsquo;s been with me since I was a kid and, also,
compared to the other activities, it is very affordable in terms of time and
effort.</p>
<p>I read 28 books in 2020. It appears I have performed slightly below my recent
average. I once <a href="https://twitter.com/nicolaiarocci/status/1214857647314362368?s=20">commented on Twitter</a> that &ldquo;the number of books per year&rdquo;
does not make for a useful metric. At the very least, it doesn&rsquo;t tell the whole
story. Take 2018 and 2019. In 2018 I read 30 books; in 2019 I only read 25. It
sounds like a steep decline until we look at the &ldquo;pages read per year&rdquo; metric.
As it turns out, I actually read more in 2019 than in 2018 (8394 vs. 8322. Ok,
it&rsquo;s more of a tie.)</p>
<p><em>Enjoyed this post? Subscribe to the <a href="https://buttondown.email/nicolaiarocci">newsletter</a> or follow @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>HttpResponseMessage.Content is non-nullable in NET5</title>
      <link>https://nicolaiarocci.com/httpresponsemessage.content-is-non-nullable-in-net5/</link>
      <pubDate>Fri, 04 Dec 2020 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/httpresponsemessage.content-is-non-nullable-in-net5/</guid>
      <description>Today I learned the hard way that NET5 changed the HttpResponseMessage.Content type from nullable to non-nullable</description>
      <content:encoded><![CDATA[<p>Today I was happily migrating some C# projects to Net 5 when I stumbled upon
something unexpected. My focus was on a library (a NetStandard2.0 REST API
client, an SDK) and its associated test suite. The test project was a NetCore
3.1 application.</p>
<p>As you can imagine, being a REST API client, the library does a lot of talking
with a remote Web Service. It does that by leveraging the almightly
<code>System.Net.HttpClient.</code> The library has a private, static
<code>HttpResponseMessage</code> parser method. Its job is, well, to parse all responses
from the remote. It looks for known, expected headers, gracefully handle them,
and then deserializes the response content, if there is any.</p>
<p>The test suite has one primary task: to ensure that the SDK can adequately
handle the request-response cycle. It does that by mocking
a <code>HttpMessageHandler,</code> which is then used by the library HttpClient on every
test run.</p>
<p>Until this morning, all 239 tests were passing just fine. Then, I switched the
test project&rsquo;s target framework moniker (TFM) to <code>net5.0</code>. Suddenly, most tests
went red.</p>
<p>With no code changes, only a rebuild after the TFM switch, I knew I was up
to something weird.</p>
<p>A couple of debug breakpoints later, I was back looking at my little response
parser, contemplating the following, rather innocent-looking line:</p>
<pre><code>if (httpResponseMessage.Content == null) return (response, token);
</code></pre>
<p>Its purpose is to skip deserialization if there no content in the response.
I knew all the failing tests had no response content.</p>
<p>When the caller (the test suite in this case) is a NetCore 3.1 application, it
passes a <code>HttpResponseMessage</code> whose <code>Content</code> value is null, as expected.
Instead, it appears that when a NET5 application invokes the same method, the
<code>HttpResponseMessage.Content</code> carries an obscure <code>EmtpyContent</code> value.
Unexpected and, more importantly, undocumented (at least to my knowledge<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.)</p>
<p>A not-so-quick investigation revealed that, in fact, sometime during the NET5
development process, the type of <code>HttpResponseMessage.Content</code> has changed from
nullable to non-nullable<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<pre><code>if (httpResponseMessage.Content == null || 
    httpResponseMessage.Content.Headers.ContentLength == 0)
    return response;
</code></pre>
<p>The double condition makes sure that no matter the calling moniker, we&rsquo;ll
handle it just fine.</p>
<p>There we go. All tests are green again.</p>
<p><em>Enjoyed this post? Subscribe to the <a href="http://eepurl.com/b-_Pzz">newsletter</a> or follow @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</em></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://docs.microsoft.com/en-us/dotnet/core/compatibility/5.0">Breaking changes in .NET 5.0</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://github.com/dotnet/runtime/pull/35910">Make HttpResponseMessage.Content non-nullable</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Events and callbacks in the Python language</title>
      <link>https://nicolaiarocci.com/events-and-callbacks-in-the-python-language/</link>
      <pubDate>Mon, 17 Aug 2020 07:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/events-and-callbacks-in-the-python-language/</guid>
      <description>&lt;p&gt;So last week I got an email from my friend Michael Kennedy. Michael runs the
&lt;a href=&#34;https://training.talkpython.fm/&#34;&gt;TalkPython Training&lt;/a&gt; website, arguably the best place where you can learn
Python today. He also hosts two popular Python podcasts: &lt;a href=&#34;https://talkpython.fm/&#34;&gt;TalkPython&lt;/a&gt; and
&lt;a href=&#34;https://pythonbytes.fm/&#34;&gt;PythonBytes&lt;/a&gt;, the latter co-hosted with Brian Okken. He is super active in
the Python space, so much that he received the Python Software Foundation
Fellow Membership back in 2018. I first met Michael back in 2014, I think, at
MongoDB Headquarters in New York, where we were both invited as part of the
MongoDB Masters program. We shared a C#/.NET background, which was something of
note in that context, and I remember Michael being curious about me embracing
Python and my first open-source release in that space. Fun times.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So last week I got an email from my friend Michael Kennedy. Michael runs the
<a href="https://training.talkpython.fm/">TalkPython Training</a> website, arguably the best place where you can learn
Python today. He also hosts two popular Python podcasts: <a href="https://talkpython.fm/">TalkPython</a> and
<a href="https://pythonbytes.fm/">PythonBytes</a>, the latter co-hosted with Brian Okken. He is super active in
the Python space, so much that he received the Python Software Foundation
Fellow Membership back in 2018. I first met Michael back in 2014, I think, at
MongoDB Headquarters in New York, where we were both invited as part of the
MongoDB Masters program. We shared a C#/.NET background, which was something of
note in that context, and I remember Michael being curious about me embracing
Python and my first open-source release in that space. Fun times.</p>
<p>Anyways, back to his email. He mentioned my little <a href="https://github.com/pyeve/events/">Events</a> library and told
me that they covered it in <a href="https://pythonbytes.fm/episodes/show/194/events-and-callbacks-in-the-python-language">episode #194</a> of the PythonBytes podcast. I was
delighted, of course, and a little surprised too, as Events has been out for
several years. Like its bigger brother <a href="https://github.com/pyeve/cerberus/">Cerberus</a>, I built Events as I was
working on the <a href="https://github.com/pyeve/eve/">Eve</a> project. Unlike Cerberus, which got a lot of traction
on its own (outside of the Eve eco-system), Events did not get a lot of
attention. Not as a stand-alone at least. People are leveraging its features
every time they use <a href="https://docs.python-eve.org/en/stable/features.html#eventhooks">event hooks</a> in Eve, but, albeit mentioned in the
documentation, few realize that they can add support for dynamic
callbacks directly to their projects.</p>
<p>Michael mentioning Events in the podcast was gratifying. He also published
a gist with a <a href="https://gist.github.com/mikeckennedy/7235543fd5964bebabe1e3546ce67d91">concrete usage example</a>, and then he went ahead and submitted
a pull request with some documentation improvements, with some more PRs to come
in the future.</p>
<p>But what exactly is Events? The C# language provides a handy way to declare,
subscribe to, and fire events. Technically, an event is a &ldquo;slot&rdquo; where callback
functions (event handlers) can be attached to - a process referred to as
&ldquo;subscribing to an event.&rdquo; Events is a little handy package that encapsulates
the core to C# event subscription and firing, to make it feel like a natural
part of the Python language. Not surprisingly, Events is dubbed <em>Python Event
Handling, the C# Style.</em></p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&gt;&gt;&gt; def something_changed(reason):
</span></span><span style="display:flex;"><span>...     print &#34;something changed because %s&#34; % reason
</span></span><span style="display:flex;"><span>...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; from events import Events
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; events = Events()
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; events.on_change += something_changed
</span></span></code></pre></div><p>Multiple callback functions can subscribe to the same event. When the event
fires, all attached event handlers are invoked in sequence. To fire the event,
perform a call on the slot:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&gt;&gt;&gt; events.on_change(&#39;it had to happen&#39;)
</span></span><span style="display:flex;"><span>&#39;something changed because it had to happen&#39;
</span></span></code></pre></div><p>Intrigued? I sure hope so. Check out the <a href="https://github.com/pyeve/events/">Events repository</a> on GitHub.</p>
<p><em>Enjoyed this post? Subscribe to the <a href="http://eepurl.com/b-_Pzz">newsletter</a> or follow @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Musings on an unexpected motorcycle trip</title>
      <link>https://nicolaiarocci.com/musings-on-an-unexpected-motorcycle-trip/</link>
      <pubDate>Thu, 23 Jul 2020 07:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/musings-on-an-unexpected-motorcycle-trip/</guid>
      <description>&lt;p&gt;I went on a motorcycle trip. A fellow TOMCC&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; member was planning a solo
trip to Campo Imperatore (&amp;ldquo;Emperor&amp;rsquo;s Fields&amp;rdquo;), the well known alpine
meadow in the Apennine ridge. He called me as he was looking for some advice,
and well, I ended up joining him.&lt;/p&gt;
&lt;p&gt;What sparked my interest was the destination, of course, because Campo
Imperatore is a superb place to visit, especially on a motorcycle, but also
Antonio&amp;rsquo;s peculiar take on the journey. By self-admission, he is old-school.
His motorcycle forays, no matter how long they are, all have something in
common: as little technology as possible. He also goes out of his league to
avoid highways and, god forbid, toll-roads. He is keen on secondary roads and,
most importantly, he does not plan any route. Antonio will write down a few
waypoints on paper, just the names of maybe two or three places worth visiting,
and that&amp;rsquo;s it. If the trip is going to be very long, he might take a (paper)
road atlas with him. The little details, like filling the gaps between
waypoints, or how one would go to reach the waypoints themselves, well, they
are all left out for the adventure.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I went on a motorcycle trip. A fellow TOMCC<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> member was planning a solo
trip to Campo Imperatore (&ldquo;Emperor&rsquo;s Fields&rdquo;), the well known alpine
meadow in the Apennine ridge. He called me as he was looking for some advice,
and well, I ended up joining him.</p>
<p>What sparked my interest was the destination, of course, because Campo
Imperatore is a superb place to visit, especially on a motorcycle, but also
Antonio&rsquo;s peculiar take on the journey. By self-admission, he is old-school.
His motorcycle forays, no matter how long they are, all have something in
common: as little technology as possible. He also goes out of his league to
avoid highways and, god forbid, toll-roads. He is keen on secondary roads and,
most importantly, he does not plan any route. Antonio will write down a few
waypoints on paper, just the names of maybe two or three places worth visiting,
and that&rsquo;s it. If the trip is going to be very long, he might take a (paper)
road atlas with him. The little details, like filling the gaps between
waypoints, or how one would go to reach the waypoints themselves, well, they
are all left out for the adventure.</p>
<p>By this point, most motorcyclists will roll their eyes, and quit reading. We
are there to enjoy the ride, right, not to role-play the cowboy riding down the
lone adventurous path. Nuances like planning the fastest route to the
destination, gas stops, places to eat, well, those are all dealt with GPSes,
and other apps like, say, TripAdvisor. That&rsquo;s right. But frankly, Antonio&rsquo;s
old-style take to motorcycle traveling is intriguing to me and also
challenging. Motorcycling is about freedom. And what is the best freedom than
being free to change and choose the route arbitrarily, at every single
crossroad if so you desire?</p>
<p>It is remarkable, by the way, how something mundane until not too long ago
looks ancient by today&rsquo;s standards: in another life, many years ago, I was
a traveling salesman (actually I was half programmer, half salesman, but that&rsquo;s
another story, maybe for another post.) Back then, using road atlases and maps
was the norm. I would waste hours bent over maps, just trying to figure out my
way around. Today, no one, maybe except the oldster, uses paper maps.</p>
<p>So we met early on Saturday, at a truckers bar not too far away from my place.
At that point, Antonio had already covered a steady 140KM, 2-hours long road
stretch. To my relief, he had his old-school road atlas with him. We both had
a strong black coffee, then off we went, southbound.</p>
<p>As expected, we had to stop every once in a while to check our bearings. We had
to ask for directions a couple of times. And yes, of course, we ended up
logging way more kilometers (and time) than we would have logged if we followed
my TomTom directions (admittedly, I had it with me tucked somewhere - I could
not resist the urge to take it along.)</p>
<p>We reached the beautiful town of Teramo at nine in the evening, about twelve
hours after we departed. We found ourselves a cozy place for the night, had
a quick shower, and then off we went down the historic town center, looking for
a meal and a glass of wine. The next day, more or less the same story, but
including the incredible views over Gran Sasso, the visit to Campo Imperatore,
and other scenic places along the route.</p>
<p><img alt="Evidence that Antonio&rsquo;s Triumph Trophy successfully made it to Campo Imperatore." loading="lazy" src="/images/triumph_trophy_campo_imperatore.jpeg">
<em>Evidence that Antonio&rsquo;s Triumph Trophy successfully made it to Campo Imperatore.</em></p>
<p>I breathe technology for a living, but from time to time, I do have to
disconnect. In the past, I used to achieve disconnection with several
activities like hiking, climbing, running, or even reading a good book. I find
that riding a motorcycle, bet it for a quick, post-work evening cruise around
town, or an extended, multi-day road trip instead, that gives me just that.
Surprisingly, though, because when I was hiking on a trail, or puffing and
sweating while hanging off a Dolomites wall, I sure as hell was not too fond of
the occasional motorcycle noise down the road.</p>
<p>This trip with Antonio taught me that unbound motorcycling, with just a clean
sheet, can be even more liberating. I thought it could be stressful; it turns
out it can be exciting instead. Going analog is good. Embracing the chance of
getting lost is good. Running some (reasonable) risk is good as well.  After
that trip, I got back to my everyday coding refreshed, internal batteries
replenished, likely just as much as they would after a mountain hike, climb, or
run. The added benefit was learning about beautiful new unknown places, seeing
terrific, unexpected views, meeting and talking to new people along the road.</p>
<p>Not all motorcycle adventures can be this bold, though. The following weekend
I went on another motorcycle trip, this time with my spouse. We visited the
beautiful Tuscany. She would not appreciate the braveness (or stupidity) of
leaving with no plans and no route. And that is ok.</p>
<p>With Antonio, we are now determined to make gypsy trips (as we ended up calling
them) an annual event. Rare enough stay desirable, frequent enough to remain
a tradition.</p>
<p>And now, back to coding.</p>
<p>PS. In terms of disconnecting, reading a good book still reigns supreme. It
also happens to be both more affordable and more accessible than, say,
motorcycling.</p>
<p><em>Enjoyed this post? Subscribe to the <a href="http://eepurl.com/b-_Pzz">newsletter</a> or follow @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</em></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Triumph Owners Motorcycle Club, of which I happen to run the <a href="https://tomccitalia.org">Italian branch</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>A trip down memory lane: FidoNet and Usenet</title>
      <link>https://nicolaiarocci.com/a-trip-down-memory-lane-fidonet-and-usenet/</link>
      <pubDate>Thu, 09 Jul 2020 07:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/a-trip-down-memory-lane-fidonet-and-usenet/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://technicshistory.com/&#34;&gt;Creatures of Thought&lt;/a&gt; is a project I discovered just recently. It is about the
history of science and technology, and it revolves around two primary tracks:
The Switch and The Backbone. The former covers the digital switch; the latter
is the story of how the world got online. Both sections are well written,
researched, and curated. The latest installment of The Backbone covers Usenet&amp;rsquo;s
invention, then FidoNet, and well, it sent me on a mesmerizing trip down
memory lane.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://technicshistory.com/">Creatures of Thought</a> is a project I discovered just recently. It is about the
history of science and technology, and it revolves around two primary tracks:
The Switch and The Backbone. The former covers the digital switch; the latter
is the story of how the world got online. Both sections are well written,
researched, and curated. The latest installment of The Backbone covers Usenet&rsquo;s
invention, then FidoNet, and well, it sent me on a mesmerizing trip down
memory lane.</p>
<p>In 1987 I was the operator (sysop) behind Lorien, the first online bulletin
board system (BBS) that went online in my area. It was running in the back room
of the local computer shop (appropriately named Computer House.) They had
graciously sponsored my initiative with a desk, a PC/XT clone (which featured
a 20MB hard disk), a green display monochrome monitor, and a 1200 baud modem if
memory serves me well. At home, I only had a Commodore 64 with a 300 baud
modem, so the XT with a speedy 1200 modem was luxury to me.</p>
<p>The shop was the only one in town, and a ragtag group of individuals frequented
it. They met there to discuss all-things hardware and software, with the main
thing being the smuggling floppy-disks and data-cassettes loaded with pirated
games. As you can imagine, some of these hackers were immediately intrigued by
the 17-year-old kid in the back room who was obscurely hacking at a PC all day
long. It was the modem, however, with all its blinking lights, that caught the
most attention. Modems back then, in Italy, were extremely rare. The original
Hayes modems mentioned in the article, they existed only in our dreams.</p>
<p>Soon a small yet vibrant user base, mostly comprised of local hackers,
developed around Lorien BBS. Among them, the guy who later became my
co-founder, which I think tells a lot about the relevance of that teenager
experience (to this day, almost 30 years later, we still work together.) Long
story short, at some point in history (1990), Lorien evolved into Phoenix BBS.
Phoenix was hosted in our brand new company office, was running on a PC/AT
machine, boasted an 80MB hard disk, and a 2400 baud modem.</p>
<p>Most relevant to me, Phoenix was an active node of the FidoNet network. I had
wanted to join FidoNet since the very first Lorien days. Tom Jennings, the
creator of FidoNet, was a legend to me. Back then, however, long-distance phone
calls were costly, and the computer shop could not afford them (FidoNet nodes
used nightly, mostly long-distance, phone calls to keep in sync with each
other.) Now at our company, we didn&rsquo;t have a higher budget, but we were free to
allocate money differently. According to <a href="https://nodehist.fidonet.org.ua/?name=Nicola+Iarocci">FidoNet records</a>, Phoenix was initially
node <code>2:332/24</code> of the network. A couple of months later, for some reason, which
I cannot recall, we became node <code>2:332/304</code>. The same records show that at some
point in 1993, we hit 9600 baud on connection speed and that the BBS was active
for another four years.</p>
<p>It makes sense. By 1994 the Internet and the World Wide Web had come to life.
Everyone quickly moved on there, and FidoNet became ghost town. Game over.</p>
<p>If you want to learn (a lot) more about those seminal years, do not miss
the article that spawned all these memories. Here is an excerpt:</p>
<blockquote>
<p>But even as the poor man’s ARPANET spread across the globe, microcomputer
hobbyists,  with far fewer resources than even the smallest of colleges, were
still largely cut off from the experience of electronic communication. But
they soon began their own shoe-string experiments in low-cost peer-to-peer
networking, starting with something called bulletin boards.</p></blockquote>
<p><a href="https://technicshistory.com/2020/06/25/the-era-of-fragmentation-part-4-the-anarchists/">The Era of Fragmentation, Part 4: The Anarchists</a></p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>How to Present Over Video Conference</title>
      <link>https://nicolaiarocci.com/how-to-present-over-video-conference/</link>
      <pubDate>Tue, 23 Jun 2020 07:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/how-to-present-over-video-conference/</guid>
      <description>&lt;p&gt;As a non-native English speaker, presenting at conferences has always been super
challenging and intimidating. It&amp;rsquo;s even worse now that we&amp;rsquo;re forced into
online presenting because of the COVID19 situation. James Whittaker has a good
post on the topic, with great advice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Remember, the inability to see and hear your audience is disconcerting but it
doesn’t mean you should give up. There are much bigger audiences in the wide
world that you will not have local access to. Getting good at video
presentations means expanding your audience and increasing your influence.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As a non-native English speaker, presenting at conferences has always been super
challenging and intimidating. It&rsquo;s even worse now that we&rsquo;re forced into
online presenting because of the COVID19 situation. James Whittaker has a good
post on the topic, with great advice:</p>
<blockquote>
<p>Remember, the inability to see and hear your audience is disconcerting but it
doesn’t mean you should give up. There are much bigger audiences in the wide
world that you will not have local access to. Getting good at video
presentations means expanding your audience and increasing your influence.</p></blockquote>
<p><a href="https://medium.com/@docjamesw/how-to-present-over-video-conference-a026b75a8195">How to Present Over Video Conference</a></p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica for .NET v3.0 released</title>
      <link>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.0-released/</link>
      <pubDate>Sat, 06 Jun 2020 07:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronica-for-.net-v3.0-released/</guid>
      <description>It features full support for latest specifications by the Italian Public Administration (v1.6), and is now delivered with a single package model.</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/FatturaElettronica/FatturaElettronica.NET">FatturaElettronica for .NET</a> 3.0 is now available on <a href="https://www.nuget.org/packages/FatturaElettronica/3.0.0">NuGet</a>. It brings full support for the <a href="https://www.agenziaentrate.gov.it/portale/documents/20143/2370834/Allegato+A+-+Specifiche+tecniche+vers+1.6_.pdf/a9917ec2-29a3-4f4a-a7d0-93af96fcaad5">latest technical specifications</a> (v1.6.1) issued by the Italian Public Administration. These come with a number of relevant changes, which were originally supposed to be effective starting May 4, 2020. We were ready well in advance (v3.beta-1 package was available on March 20) but then, because of the COVID19 situation (and, I suspect, pressure from relevant &ldquo;not-ready-to-deliver&rdquo; software companies) the deadline was pushed forward to October 1, 2020.</p>
<p>So yes, you have plenty of time, but the good news is you can upgrade today and spare yourself some of the inevitable pain that comes with uprading your software too close to the deadline. Just download FatturaElettronica 3.0 and upgrade your projects. The new format is mostly backwards-compatible, which means that it will read and write old format (pre-v1.6) XML files just fine. In fact, companies have been using v3.0 beta since March with no issues. I am confident that the upgrade process will be relatively straightforward.</p>
<p>Just keep in mind that v3 unifies all FatturaElettronica packages (Core, Extensions, and FatturaElettronica itself) into one, single package. This makes all the powerful extension methods available right away, and also simplifies the development, building, and installation processes. If you were using the Extensions package before, and after the upgrade you get warning messages, then you need to uninstall the Extensions and Core packages, which are not needed as stand-alones anymore.</p>
<h3 id="how-to-install">How to install</h3>
<p>.NET CLI:</p>
<pre><code>dotnet add package FatturaElettronica --version 3.0.0
</code></pre>
<p>Package Manager:</p>
<pre><code>Install-Package FatturaElettronica -Version 3.0.0
</code></pre>
<p>Package Reference:</p>
<pre><code>&lt;PackageReference Include=&quot;FatturaElettronica&quot; Version=&quot;3.0.0&quot; /&gt;
</code></pre>
<p>packet CLI:</p>
<pre><code>paket add FatturaElettronica --version 3.0.0
</code></pre>
<p>As always, make sure you read the <a href="https://fatturaelettronicaopensource.org/docs/changelog.html">changelog</a>. Most importantly in this case, for a rundown on the new specifications and the upgraded file format, check out the <a href="https://www.agenziaentrate.gov.it/portale/documents/20143/2370834/Allegato+A+-+Specifiche+tecniche+vers+1.6_.pdf/a9917ec2-29a3-4f4a-a7d0-93af96fcaad5">new specifications</a>.</p>
<p>Lastly, this is your friendly reminder that if you are using this package in a revenue-generating project, it is your best interest to consider <a href="https://fatturaelettronicaopensource.org/#supporta-il-progetto">supporting it</a>.</p>
<p>Enjoy!</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Rumors of Windows Forms death have been greatly exaggerated</title>
      <link>https://nicolaiarocci.com/rumors-of-windows-forms-death-have-been-greatly-exaggerated/</link>
      <pubDate>Sun, 19 Apr 2020 09:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/rumors-of-windows-forms-death-have-been-greatly-exaggerated/</guid>
      <description>.NET 5 brings support for Windows Task Dialog to Windows Forms, and that is relevant for a number of reasons.</description>
      <content:encoded><![CDATA[<p>Apparently, .NET 5 brings support for Windows TaskDialog to Windows Forms, and
that is relevant for several reasons. Before I dig in, let me start by
addressing your inevitable question right away.</p>
<p>In essence, yes, Windows Forms is old technology. It has been around since like
20 years ago, and yes, newer Windows UI frameworks have (or try to have)
traction today, but no, that is not a good reason for Microsoft to let WinForms
rest in peace. See the thing is right now, as I am writing this piece, there
are <em>millions</em> of desktop applications running on Windows machines all around
the world and rest assured, an essential portion of them is running on, you
guessed it, your good old Windows Forms.</p>
<p>I know first hand how essential is WinForms today. An application I wrote with
Forms many years ago, at the end of the 90s, still pays a good portion of my
income. Incidentally, that one application (along with its weight on my salary)
is why that single twitter stood out on my feed this morning.</p>
<p>Windows Forms is so relevant that it is now part of NETCore (soon to be
rebranded NET 5.) By the way, bringing Windows Forms into NETCore was
a monumental piece of work. At the time of this writing, the Designer (the main
reason, I think, behind Forms incredible success) is receiving its final touches
before the final release.</p>
<p>So with that out of the way, let me elaborate on why this tweet is important.
One thing is supporting an admittedly old technology for legacy reasons, and
a different one is to keep improving it. Yes, the NETCore port was great, but it was
just that, a port. We have not seen relevant new features such a long time that
everyone assumed nothing new was going to happen in this space. After all, it
makes sense with WPF, then UWP taking the stage in recent years. Then, out of
the blue comes this little precious new feature.</p>
<p>It is not a coincidence that TaskDialog support comes as a community
contribution. The author is Konstantin Preißer
(<a href="https://github.com/kpreisser">@kpreisser</a>), and he improves on a little
fundamental pillar of Windows Forms, the MessageBox. Quoting from his <a href="https://github.com/dotnet/winforms/issues/146">original
ticket</a>:</p>
<blockquote>
<p>On Windows Vista and higher, the Task Dialog is available that provides many
more features than a Message Box. While you can show a Message Box in
WinForms and WPF, there is no &ldquo;official&rdquo; implementation of the Task Dialog
yet in .NET WinForms/WPF (&hellip;) Do you think a Task Dialog could also be added
directly to WinForms/WPF?</p></blockquote>
<p>Now, this ticket dates December 4, 2018. That&rsquo;s almost one and a half years
ago. Since then, he&rsquo;s been hard at work. Then just yesterday, 169 commits, 59
files changed, <a href="https://github.com/dotnet/winforms/pull/1133">his pull request</a>
was merged by Igor Velikorossov (<a href="https://github.com/RussKie">@RussKie</a>) into
the official dotnet/winforms repository. Big props to Igor, by the way, who
spent all that time code-reviewing more than 10K lines of code.</p>
<p>So let&rsquo;s recap what we are dealing with here—one monster open-source,
community-driven contribution to an old, stagnant yet relevant Microsoft stack.
If, like me, you come from the &ldquo;old Microsoft&rdquo; era, you know how the previous
sentence would sound impossible only a handful years ago. To add to that, let&rsquo;s
ponder on Microsoft personnel taking the time to carefully peer-review, then
accept and merge the whole thing and, finally, celebrate the event on
social networks and whatnot:</p>
<blockquote>
<p>Thank you for your patience and commitment. We made the history my friend,
the first major addition to Windows Forms in 15 years! Hope you have
a champagne on ice, it is time to pop the cork. - <a href="https://github.com/dotnet/winforms/pull/1133#issuecomment-615850774">@RussKie on
GitHub</a></p></blockquote>
<p>I think we can reasonably say that yes, the rumors of Windows Forms death have
been greatly exaggerated. That is primarily due to Microsoft going the full
monty on open-source and, secondarily, on the fantastic community that has been
growing around its core technology.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 1.0 has been released</title>
      <link>https://nicolaiarocci.com/eve-1.0-has-been-released/</link>
      <pubDate>Sat, 21 Dec 2019 09:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/eve-1.0-has-been-released/</guid>
      <description>&lt;p&gt;Seven years since the first commit, I am glad to announce that Eve v1.0 has been released. &lt;a href=&#34;https://pypi.org/project/Eve/1.0/&#34;&gt;Check it out on PyPI.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are using Eve, Cerberus, FatturaElettronica for .NET or any other one of my open source projects in a revenue-generating product, it would make business sense to sponsor my open source development. Learn how to do that at &lt;a href=&#34;https://github.com/sponsors/nicolaiarocci&#34;&gt;my GitHub Sponsors page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Eve 1.0&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/Eve1.0.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Happy holidays to all of you and have a wonderful start in the new year.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Seven years since the first commit, I am glad to announce that Eve v1.0 has been released. <a href="https://pypi.org/project/Eve/1.0/">Check it out on PyPI.</a></p>
<p>If you are using Eve, Cerberus, FatturaElettronica for .NET or any other one of my open source projects in a revenue-generating product, it would make business sense to sponsor my open source development. Learn how to do that at <a href="https://github.com/sponsors/nicolaiarocci">my GitHub Sponsors page</a>.</p>
<p><img alt="Eve 1.0" loading="lazy" src="/images/Eve1.0.png"></p>
<p>Happy holidays to all of you and have a wonderful start in the new year.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica for .NET v2.0</title>
      <link>https://nicolaiarocci.com/fatturaelettronica-for-.net-v2.0/</link>
      <pubDate>Wed, 13 Mar 2019 09:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronica-for-.net-v2.0/</guid>
      <description>FatturaElettronica for .NET version 2.0 is out today. It brings support for Fattura Semplificata, at the cost of few minor breaking changes.</description>
      <content:encoded><![CDATA[<p>Today I pushed version 2.0 of <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET">FatturaElettronica</a> to NuGet. This release
comes with full support for <a href="https://www.agenziaentrate.gov.it/wps/content/Nsilib/Nsi/Schede/Comunicazioni/Fatture+e+corrispettivi/Fatture+e+corrispettivi+ST/ST+invio+di+fatturazione+elettronica/?page=ivacomimp">Fattura Semplificata</a>, something that has
been on the back-burner for a while. Special thanks to <a href="https://github.com/tanogae">Gaetano Pizzol</a>
for single-handly contributing this feature.</p>
<p>Now for the bad news. Since we were to add a new invoice type whereas so far
we only had one, I decided to take the plunge and break backward
compatibility a little bit. The relevant changes are as follows:</p>
<ol>
<li><code>Fattura</code> class renamed as <code>FatturaOrdinaria</code>;</li>
<li><code>FatturaOrdinaria</code>, its whole hierarchy, and validators moved to the new <code>FatturaElettronica.Ordinaria</code> namespace;</li>
</ol>
<p>These changes leave us with what I think is a cleaner and symmetric API surface. We now have:</p>
<ol>
<li><code>FatturaOrdinaria.cs</code> in the <code>FatturaElettronica.Ordinaria</code> namespace;</li>
<li>A new <code>FatturaSemplificata.cs</code> in the <code>FatturaElettronica.Semplificata</code> namespace;</li>
<li>A new <code>FatturaBase</code> abstract class in root <code>FatturaElettronica</code> namespace;</li>
</ol>
<p>So yes, you will have to recompile after the update. However, you will find
that the changes needed are marginal:</p>
<pre><code># using FatturaElettronica;
using FatturaElettronica.Ordinaria;  # new

# var fattura = new Fattura();
var fattura = new FatturaOrdinaria();  # new
</code></pre>
<p>Satellite projects <a href="https://github.com/FatturaElettronica/FatturaElettronica.Core">Core</a>, <a href="https://github.com/FatturaElettronica/FatturaElettronica.Core">Extensions</a>, and <a href="https://github.com/FatturaElettronica/FatturaElettronica.Core">Forms</a> are also
available on NuGet with a matching version number. By the way, in case you
did not know, the Extensions package just recently saw the addition of a
<code>WriteHtml</code> extension method, prompted by <a href="https://github.com/AlexBream">Alessandro Scardova</a>.</p>
<p>I want to take a moment to mention the vibrant community that is growing
around this project. As of today, we count <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET/graphs/contributors">ten contributors</a> to the main
project alone, and many others have been chiming in either by opening
tickets, mailing me, or providing suggestions at the various events that I
attend. The contribution rate is a meaningful metric to me. After the years
spent in the Python open-source community, I came back hoping I could help
and encourage the growth of the Italian open source movement within the .NET
eco-system.</p>
<p>Considering the relatively small audience for this project, the adoption rate
is also satisfying. I think the main package recently surpassed 13K
downloads.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Building a RESTful WebApi with F# and NetCore</title>
      <link>https://nicolaiarocci.com/building-a-restful-webapi-with-fsharp-and-netcore/</link>
      <pubDate>Sun, 24 Feb 2019 09:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/building-a-restful-webapi-with-fsharp-and-netcore/</guid>
      <description>In this article, we build a simple WebApi with F# and NetCore. Target is C# developers who want to know more about functional languages and F# in particular.</description>
      <content:encoded><![CDATA[<p>It is a common misconception that F# is just for data science, machine
learning, and quantitative finance; in the .NET eco-system you turn to C#
for enterprise and web development and, eventually, you&rsquo;ll look at F# for
serious number crunching.</p>
<p>While it is undoubtedly true that functional languages are ideally suited for
solving numerical problems, some of them - and F# in particular - are
perfectly fine for tackling so many different domains other than scientific
ones. F# is a cross-platform, functional-first, general purpose language.
Stress on functional-first and general purpose. Line-of-business applications
are almost always perfect candidates for F# development. On this topic, I
recommend you take a look at Scott Wlaschin&rsquo;s &ldquo;<a href="https://fsharpforfunandprofit.com/posts/fsharp-is-the-best-enterprise-language/">Why F# is the best enterprise
language</a>&rdquo;</p>
<p>On my part I am going to show you how easily we can build a RESTful WebAPI
with F# on NetCore, taking no compromises on its C# counterpart.</p>
<h2 id="create-build-run">Create, build, run</h2>
<p>Open up your terminal and type the following:</p>
<pre><code>$ dotnet new webapi -o MyWebApi -lang f#
The template &quot;ASP.NET Core Web API&quot; was created successfully.
</code></pre>
<p>The command above creates the <code>MyWebApi</code> directory and initializes an F#
WebApi project in it, which you can build right away:</p>
<pre><code>$ cd MyWebApi &amp;&amp; dotnet build
Microsoft (R) Build Engine version 15.9.20+g88f5fadfbe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

Build succeeded.
    0 Warning(s)
    0 Error(s)
</code></pre>
<p>And while we are at it, let&rsquo;s launch it:</p>
<pre><code>$ dotnet bin/Debug/&lt;dotnetcoreapp_version&gt;/MyWebApi.dll
Now listening on: http://localhost:5000
Now listening on: https://localhost:5001
Application started. Press Ctrl+C to shut down.
</code></pre>
<p>Our WebApi is up and running, ready for us to play with it:</p>
<pre><code>$ curl -k https://localhost:5001/api/values
[&quot;value1&quot;,&quot;value2&quot;]
</code></pre>
<p>The <code>-k</code> option tells <code>curl</code> to skip certificate verification on the https
connection to localhost. Alternatively, you can open the same URL from your
browser.</p>
<p>We did not write a single line of code, and yet we have a web API up and
running. Yes, this is the same experience we get when we create a C# WebApi
project. If you want to see that, try launching the same <code>dotnet new</code>
command, minus the <code>-lang</code> option.</p>
<h2 id="show-me-the-code">Show me the code</h2>
<p>These days I use Visual Studio Code and the Unix (MacOS) terminal for most of
my development, be it Python, JavaScript, C#, or F#. If you are on Visual
Studio, you should still be able to follow along.</p>
<p>Let&rsquo;s fire up VSCode:</p>
<pre><code>code .
</code></pre>
<p>The F# development experience in VSCode is excellent thanks to the <a href="http://ionide.io/">Ionide
project</a>, an open source cross-platform package for F# development. It
brings IntelliSense, tooltips, document formatting, syntax checking, error
highlighting, and more to VSCode. Just go to the Extensions tab and search
for Ionide. Once you install and activate the extension, a brand new F# tab
appears in VSCode. Click it. This tab lets you look at the project from the
F# perspective.</p>
<p>In F#, the file order matters. That&rsquo;s a consequence of another important
rule: in F#, the order in we define types does matter. Files at the bottom of
the project can access types and values defined above them, but not the other
way around. In the F# tab, stuff is ordered for you by dependency. You can
add new files, or move them up and down the hierarchy as needed.</p>
<p>Click on <code>Contollers/ValuesControllers.fs</code>, so we can view its code. It
begins like this:</p>
<pre><code>namespace MyWebApi.Controllers

open Microsoft.AspNetCore.Mvc
</code></pre>
<p>F# namespaces work like C# ones. They allow you to organize data types and
modules (not functions!) and yes, you can nest them in a hierarchy. The
<code>open</code> statement, you guessed it, is F# flavor of C#&rsquo;s <code>using</code>.</p>
<p>But! Where are the curly braces? Well, the thing is, in F# we don&rsquo;t need
curly braces. Don&rsquo;t run away now; we&rsquo;ll get back to this.</p>
<p>Let&rsquo;s go on with the code review:</p>
<pre><code>[&lt;Route(&quot;api/[controller]&quot;)&gt;]
[&lt;ApiController&gt;]
type ValuesController () =
    inherit ControllerBase()
</code></pre>
<p>We decorate the <code>ValuesController</code> type (think C# classes) with two
attributes. First one defines the general route to the controller endpoints
(<code>/api/values/</code>); the second one informs .NET that <code>ValuesController</code> is, in
fact, a controller.</p>
<p>Finally, we get to look at one of the controller members:</p>
<pre><code>[&lt;HttpGet&gt;]
member this.Get() =
    let values = [|&quot;value1&quot;; &quot;value2&quot;|]
    ActionResult&lt;string[]&gt;(values)
</code></pre>
<p>Again, very much like with C#, we have an attribute binding an HTTP method to
this member (<code>Get</code>). Every time a GET request hits the controller route,
<code>Get</code> executes. What&rsquo;s more interesting here, however, is the member scope.</p>
<p>For starters, no curly braces. F#, like Python and others, is a
whitespace-significant language: we indent code to tell the compiler that
we&rsquo;re in a nested scope. At first, coming from other .NET languages, this
might come as a shock. It sure was for me, although I had to make this jump
way back when I got first into Python.</p>
<p>Secondly, the <code>values</code> assignment has no type declaration what-so-ever. It
looks like we&rsquo;re dealing with a dynamic language like JavaScript or, again,
Python. Only, F# is static. In F# you rarely have to specify types, and
that&rsquo;s thanks to its powerful type inference system. If you hover your mouse
over the <code>values</code> word, you&rsquo;ll see that good old IntelliSense is on duty, as
usual, reporting <code>values</code> as an array of strings.</p>
<p>F# type inference is so robust that sometimes can feel like magic, but it is
not. It follows a set of precedence rules that drive the compiler. The result
is that you get the best of both worlds: a language that is concise as a
dynamic one, yet it is strongly typed and compiled, as a static one. By the
way: thanks of type inference, F# functions are implicitly generic.</p>
<p>Combined with the removal of noise, such as curly braces and semicolons, you
will find that the type inference system makes writing, reading and, more
importantly, reasoning about code a pleasant experience.</p>
<p>So why do we have to declare <code>ActionResult</code> type on the following line?
Because that&rsquo;s a .NET BCL type, not an F# type. Type inference won&rsquo;t work as
well when applied to the BCL. Fortunately, the compiler (IntelliSense) will
let you know when an explicit type is needed.</p>
<p>Notice that on the last line there is no <code>return</code>. In F#, <code>return</code> is
implicit. I should probably mention immutability. That <code>values</code> array over
there, is immutable like all F# types are unless they are explicitly made
mutable with the <code>mutable</code> keyword. Immutability is a <em>big</em> deal in
functional languages.</p>
<p>Let&rsquo;s assume that we want to replace this template code with something more
meaningful. Maybe we have a repository object that allows us to retrieve data
from a backend. This repository an external C# package and it has this nice
<code>Find(Expression&lt;Func&lt;T, bool&gt;&gt;)</code> method that we want to leverage, to enable
filtering on our API endpoint.</p>
<ol>
<li>The client can use a query string (<code>?name=john</code>);</li>
<li>If included, parse the query into a lambda expression (<code>x =&gt; x.Name==john</code>);</li>
<li>Pass the lambda to repository&rsquo;s <code>Find</code> method;</li>
<li>Return lookup results to the client.</li>
</ol>
<p>For simplicity, we don&rsquo;t want to support multiple query keys, or various
values for the same key;</p>
<p>We want to achieve this:</p>
<pre><code>[&lt;HttpGet&gt;]
member this.Get() =
    let filter = getFilter this.Request.Query
    let result = repository.Find&lt;License&gt;(filter).Result;

    ActionResult&lt;License List&gt;(result)
</code></pre>
<p>On the first line, we pass the query to the <code>getFilter</code> helper function. In
F# there&rsquo;s no notion of wrapping function arguments with parenthesis. Again,
succinctness. <code>getFilter</code> will return either <code>null</code> if there is no query
string or a lambda filter.</p>
<p>On the second line, we invoke the <code>Find</code> method, passing our filter to it. We
then send back the results to the client. Notice that we are returning a
<code>List&lt;Value&gt;</code> or, in F# syntax, a <code>Value List</code>. We do not have to update the
<code>Get</code> signature. Type inference quietly takes note.</p>
<p>With the general business logic out of our way, let&rsquo;s get to the only
remaining piece of the puzzle, the <code>getFilter</code> function. For this, it is
probably a good idea to add a <code>Helpers.fs</code> file, with a <code>Helpers</code> module in
it.</p>
<pre><code>namespace MyWebApi

open Microsoft.AspNetCore.Http
open System.Linq.Expressions
open System

module private Helpers =

    let getFilter (query:IQueryCollection)  =

        let expr (key:string, value) =
            let entity=Expression.Parameter(typeof&lt;'T&gt;)
            let body= Expression.Equal(Expression.Property(entity, key), Expression.Constant(value))
            Expression.Lambda&lt;Func&lt;'T, bool&gt;&gt;(body, entity)

        match query.Count with
        | 0 -&gt; null
        | _ -&gt;
            query
            |&gt; Seq.head
            |&gt; fun kvp -&gt; (kvp.Key, kvp.Value |&gt; Seq.head)
            |&gt; expr
</code></pre>
<p>Now, this is interesting. We briefly touched on the fact that namespaces
can&rsquo;t hold functions. You use modules for that (F# modules can also store
types, however, like namespaces.). Here we define a <code>Helpers</code> module, with
one function <code>getFilter</code> in it. To use this module in <code>ValueController</code>, we
will need to <code>open MyWebApi.Helpers</code> there. Alternatively, we could decorate
the module with the <code>[&lt;AutoOpen&gt;]</code> attribute, so that adopters do not need to
open it explicitly. <code>AutoOpen</code> is a nice feature, but please don&rsquo;t overuse
it.</p>
<p>Let&rsquo;s look at <code>getFilter</code> implementation. First, we define an inner function
<code>expr</code>. It takes a key-value tuple (one argument, not two!), does its magic,
and, returns a lambda expression with the required signature of <code>Func&lt;'T, bool&gt;</code>. This code is not particularly interesting; you would do something
similar in C#. Notice, however, that we are forced to declare the type one of
the tuple values. That&rsquo;s because the compiler needs to know which of the (way
too many) overloads of <code>Expression.Property</code> we want to use. We could
strongly type the second argument instead; it would be the same. Also, take
note of how we declare a generic type in F#. The convention is not to use
uppercase as we do here, you typically use <code>'a</code> for example, but <code>'T</code> is also
ok. I tend to use ``T` when I am working on the boundaries between the BCL
and F#, like in here.</p>
<p>The <code>match...with</code> block is the heart of <code>getFilter</code>.</p>
<pre><code>        match query.Count with
        | 0 -&gt; null
        | _ -&gt; ...
</code></pre>
<p>It matches <code>query.Count</code> value with some alternatives.</p>
<ul>
<li>if no items are in the query, then return null;</li>
<li>any other value (<code>_</code> is a catchall), do something else.</li>
</ul>
<p>Pattern matching is super interesting in F#. You can think of <code>match...with</code>
as a <code>switch/case</code> on steroids. Here, let&rsquo;s stress one of its many features:
exhaustive checking. We used the catchall <code>_</code> symbol on the second branch.
Had we used a specific value instead, the compiler would throw an &ldquo;incomplete
pattern matching&rdquo; error. Think of how many subtle bugs this feature alone
cuts out.</p>
<p>Let&rsquo;s now consider the second and last branch in our pattern matching code.
All the time in our code, no matter the language, we call a sequence of
methods. In this concatenation, the output of one method serves as the input
for the next. In these situations we have two options: either we use a
temporary variable to hold the result of one method call, then we pass said
variable to the next, or, if the call sequence is not too long, we nest one
method call within the other. In both cases, code quickly becomes hard to
read and, what&rsquo;s worse, it becomes difficult to grasp its intentions. F#
<em>forward pipe</em> operator aims to solve this problem. Let&rsquo;s look back at our
pipeline:</p>
<pre><code>query |&gt; Seq.head |&gt; fun kvp -&gt; (kvp.Key, kvp.Value |&gt; Seq.head) |&gt; expr
</code></pre>
<p>In his book <a href="https://manning.com/books/get-programming-with-f-sharp">Get Programming with F#</a>, Isaac Abraham provides us with what
I think is the best explanation of what the forward pipe operator means:</p>
<blockquote>
<p>Take the value on the left-hand side of the pipe and flip it over to the
right-hand side as the last argument to the function. [&hellip;] The beauty of
this is that as long as the output of one function matches the input of the
next one, any function can be chained with another one.</p></blockquote>
<p>Once it clicks, you&rsquo;ll love it.</p>
<p>We start with <code>query</code>, our input argument, which is pipelined (passed) to the
<code>Seq.head</code> function. This function returns the first element (head) of the
input sequence. Now, <code>query</code> is an <code>IQueryCollection</code>, which happens to
implement <code>IEnumerable</code> which, in turn, is an alias for F# <code>seq&lt;'T&gt;</code> so yes,
<code>query</code> is a sequence. Here we don&rsquo;t want to support multiple keys, so we
only take the first one. Next up in the pipeline we have an inline function
or lambda. This one accepts the <code>kvp</code> argument (a <code>KeyValuePair</code>) and returns
a tuple with <code>kvp</code> key and the value. The lambda is interesting because it
comes with a nested pipeline. Querystrings can come with multiple values for
the same key (i.e. <code>?name=john&amp;name=mike</code>), so <code>kvp.Value</code> is itself a
sequence of strings. Again, we don&rsquo;t support multiple key values, so we keep
the first one. The last step in our pipeline is, of course, the call to our
<code>expr</code> function, which will take the tuple as input, and return the
corresponding expression filter.</p>
<p>One last thing. Remember that explicit type declaration we had to add to
<code>expr</code>&rsquo;s input tuple? That one was weird, although it did have a reason.
Let&rsquo;s refactor our code to be more compact, so we inline <code>expr</code> into the
pipeline:</p>
<pre><code>let getFilter (query:IQueryCollection)  =

    match query.Count with
    | 0 -&gt; null
    | _ -&gt;
        query
        |&gt; Seq.head
        |&gt; fun kvp -&gt; (kvp.Key, kvp.Value |&gt; Seq.head)
        |&gt; fun (key, value) -&gt;
            let entity=Expression.Parameter(typeof&lt;'T&gt;)
            let body= Expression.Equal(Expression.Property(entity, key), Expression.Constant(value))
            Expression.Lambda&lt;Func&lt;'T, bool&gt;&gt;(body, entity)
</code></pre>
<p>See? Now we don&rsquo;t need to declare <code>key</code> type. It is inferred from the input
function (the left-hand side of the pipe!)</p>
<h2 id="wrapping-up">Wrapping up</h2>
<p>Building and running a RESTful API with F# is simple. Sure, the template code
above does not look very functional, and it isn&rsquo;t. Once you get more
confident with F#, you should probably move to functional web frameworks,
like <a href="https://github.com/giraffe-fsharp/Giraffe">Giraffe</a>. The takeaway point I am trying to make, however, is that
F# with pure NetCore delivers. Functional purists may shiver, but my advice
is that you begin doing F# right away, solving problems that you are already
familiar with.</p>
<p>I learned about F# back in 2010-11 when it was very new, and I immediately
fell in love with it. Then I spent years and years waiting for the right
project, the one with a perfect &ldquo;functional fit&rdquo; that would allow me to use
F# in the real world. Guess what? It never happened. Either we had a good
candidate but we were in a hurry, so no time for learning, or we got
&ldquo;less-than-ideal-for-functional&rdquo; projects (in our mind) to work on.</p>
<p>Then I was tasked to write yet another RESTful web service. We have plenty
scattered around, both in Python and C#. RESTful services have been my bread
and butter for such a long time; I even went around to release a Python REST
framework called <a href="https://github.com/pyeve/eve/">Eve</a>.</p>
<p>This time, I thought, I am going to do it differently. This time, I am going
down the F# rabbit hole. What I found at the bottom of it was pure joy.</p>
<hr>
<p>PS: That fictional repository we&rsquo;ve been using, well, that&rsquo;s a concrete
thing, an open source project I have been working on called Boxroom. When it
is ready for prime time, I will post about it here on my site. Interested?
Join the newsletter; a link is right down here.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>NuGet Gems: DeepEqual</title>
      <link>https://nicolaiarocci.com/nuget-gems-deepequal/</link>
      <pubDate>Sat, 26 Jan 2019 09:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/nuget-gems-deepequal/</guid>
      <description>&lt;p&gt;This handy little package does one simple thing, and it does it well. According to its description, DeepEqual is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An extensible deep comparison library for .NET.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I am sure you too have come across this a few times. You have some code that shuffles around objects, and at some point, you&amp;rsquo;d like to make sure that two instances of the same class are, indeed, equal. And no, you don&amp;rsquo;t mean &amp;ldquo;equal&amp;rdquo; as in &lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/equality-comparisons#reference-equality&#34;&gt;reference equality&lt;/a&gt;. That&amp;rsquo;s easy to achieve with .NET. Most of the time, what you want is to check for &lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/how-to-define-value-equality-for-a-type&#34;&gt;value equality&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This handy little package does one simple thing, and it does it well. According to its description, DeepEqual is:</p>
<blockquote>
<p>An extensible deep comparison library for .NET.</p></blockquote>
<p>I am sure you too have come across this a few times. You have some code that shuffles around objects, and at some point, you&rsquo;d like to make sure that two instances of the same class are, indeed, equal. And no, you don&rsquo;t mean &ldquo;equal&rdquo; as in <a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/equality-comparisons#reference-equality">reference equality</a>. That&rsquo;s easy to achieve with .NET. Most of the time, what you want is to check for <a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/how-to-define-value-equality-for-a-type">value equality</a>.</p>
<p>Now, when it comes to value equality, there are a few things you can do in .NET: override <code>Object.Equals()</code> (which, by the way, if the type is a reference type, by default will check for reference equality), implement the <code>IEquatable</code> interface, override the <code>==</code> operator or, most commonly, a combination of these techniques.</p>
<p>The problem with this is, it can get messy real quick, especially if you are checking instances of non-sealed classes. Quoting the <a href="https://docs.microsoft.com/en-us/dotnet/api/system.object.equals?view=netframework-4.7.2">documentation</a>&rsquo;s <em>Note for Callers</em>:</p>
<blockquote>
<p>When you call the Equals method to test for equality, you should know whether the current instance overrides Object. Equals and understand how a particular call to an Equals method is resolved. Otherwise, you may be performing a test for equality that is different from what you intended, and the method may return an unexpected value (source).</p></blockquote>
<p>Sometimes you don&rsquo;t know the inner details about the classes you are playing with. Also, at least in my case, many times I am performing these checks in my tests, not in the application itself. Implementing all this comparison logic just for the sake of testing would be, in my opinion, overkill.</p>
<p>Sometimes (most of the times?), you only need to make sure two instances are equal by value, and very deeply at that. DeepEqual comes in handy:</p>
<pre><code>bool result = object1.IsDeepEqual(object2);
</code></pre>
<p>Simple as that. Again, I find this package invaluable especially when doing tests. Actually, I suspect I am <em>only</em> using it in my test. When used inside a test, you can call <code>ShouldDeepEqual</code>:</p>
<pre><code>object1.ShouldDeepEqual(object2);
</code></pre>
<p>This method throws an exception with a detailed description of the differences between the two objects. You can pass a custom comparison as the second argument to the <code>ShouldDeepEqual</code> method, to override the default behavior. You can also customize the behavior inline, using the <code>WithDeepEqual</code> extension method:</p>
<pre><code>object1.WithDeepEqual(object2)
   .SkipDefault&lt;MyEntity&gt;()
   .IgnoreSourceProperty(x =&gt; x.Id)
   .Assert()
</code></pre>
<p>I have been using this package for a long time. At some point, I even <a href="https://github.com/jamesfoster/DeepEqual/pull/27">submitted a pull request</a> to port it to NetStandard. Despite a lot of people loving it, the pull request was left there unnoticed for quite some time. I was asked to release a fork, I declined (somebody else did). In the end, the package author came back from the void to release a new, NetStandard compatible, update, which is fantastic. Sometimes in open source, it takes a little patience.</p>
<p>Enjoy.</p>
<ul>
<li><a href="https://github.com/jamesfoster/DeepEqual">DeepEqual</a></li>
</ul>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronica for .NET v0.9 has been released</title>
      <link>https://nicolaiarocci.com/fatturaelettronica-for-.net-v0.9-has-been-released/</link>
      <pubDate>Sat, 27 Oct 2018 09:05:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronica-for-.net-v0.9-has-been-released/</guid>
      <description>&lt;p&gt;FatturaElettronica for .NET v0.9 has been released. The companion Extensions
package also hits v0.4.&lt;/p&gt;
&lt;p&gt;The main new feature is the &lt;code&gt;FromJson()&lt;/code&gt; extension method which allows, you
guessed it, for deserialization of a JSON stream into a &lt;code&gt;Fattura&lt;/code&gt; class
instance:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c#&#34; data-lang=&#34;c#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;&#34;&gt;var&lt;/span&gt; fattura = Fattura.CreateInstance(Instance.Privati);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fattura.FromJson(&lt;span style=&#34;font-weight:bold&#34;&gt;new&lt;/span&gt; JsonTextReader(&lt;span style=&#34;font-weight:bold&#34;&gt;new&lt;/span&gt; StringReader(json)));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-style:italic&#34;&gt;// or, if FatturaElettronica.Extensions v0.4 is being used:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fattura.FromJson(json);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-style:italic&#34;&gt;// Invoice is now ready for inspection.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;&#34;&gt;var&lt;/span&gt; documento &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; fattura.Body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;&#34;&gt;var&lt;/span&gt; dati = documento.DatiGenerali.DatiGeneraliDocumento;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Console.WriteLine(&lt;span style=&#34;font-style:italic&#34;&gt;$&amp;#34;fatt. num. {dati.Numero} del {dati.Data}&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I should probably mention that FatturaElettronica.Core 0.4 is also out, and
that that is the actual place where all the new juice comes from, courtesy of
&lt;a href=&#34;https://github.com/emazv72&#34;&gt;Emanuele Zavallone&lt;/a&gt;. You don&amp;rsquo;t have to directly install Core, it will be
pulled down for you by the main packages.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>FatturaElettronica for .NET v0.9 has been released. The companion Extensions
package also hits v0.4.</p>
<p>The main new feature is the <code>FromJson()</code> extension method which allows, you
guessed it, for deserialization of a JSON stream into a <code>Fattura</code> class
instance:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c#" data-lang="c#"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="">var</span> fattura = Fattura.CreateInstance(Instance.Privati);
</span></span><span style="display:flex;"><span>    fattura.FromJson(<span style="font-weight:bold">new</span> JsonTextReader(<span style="font-weight:bold">new</span> StringReader(json)));
</span></span><span style="display:flex;"><span>    <span style="font-style:italic">// or, if FatturaElettronica.Extensions v0.4 is being used:</span>
</span></span><span style="display:flex;"><span>    fattura.FromJson(json);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-style:italic">// Invoice is now ready for inspection.</span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">foreach</span> (<span style="">var</span> documento <span style="font-weight:bold">in</span> fattura.Body)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="">var</span> dati = documento.DatiGenerali.DatiGeneraliDocumento;
</span></span><span style="display:flex;"><span>        Console.WriteLine(<span style="font-style:italic">$&#34;fatt. num. {dati.Numero} del {dati.Data}&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>I should probably mention that FatturaElettronica.Core 0.4 is also out, and
that that is the actual place where all the new juice comes from, courtesy of
<a href="https://github.com/emazv72">Emanuele Zavallone</a>. You don&rsquo;t have to directly install Core, it will be
pulled down for you by the main packages.</p>
<p>So enjoy, and go get them while they are hot:</p>
<ul>
<li>FatturaElettronica for .NET (<a href="https://www.nuget.org/packages/FatturaElettronica/">nuget</a>, <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET">github</a>)</li>
<li>FatturaElettronica Extensions (<a href="https://www.nuget.org/packages/FatturaElettronica.Extensions/">nuget</a>, <a href="https://github.com/FatturaElettronica/FatturaElettronica.Extensions">github</a>)</li>
</ul>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.8.1 has been released</title>
      <link>https://nicolaiarocci.com/eve-0.8.1-has-been-released/</link>
      <pubDate>Fri, 05 Oct 2018 09:01:01 +0200</pubDate>
      <guid>https://nicolaiarocci.com/eve-0.8.1-has-been-released/</guid>
      <description>&lt;p&gt;Just a quick note to report that &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve v0.8.1&lt;/a&gt; is out and &lt;a href=&#34;https://pypi.org/project/Eve/&#34;&gt;ready to
rock&lt;/a&gt;. It brings a number of fixes, some improvements as well as a couple
of new features. Check out the &lt;a href=&#34;http://docs.python-eve.org/en/latest/changelog.html&#34;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Join the &lt;a href=&#34;http://eepurl.com/b-_Pzz&#34;&gt;newsletter&lt;/a&gt; to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @&lt;a href=&#34;http://twitter.com/nicolaiarocci&#34;&gt;nicolaiarocci&lt;/a&gt; on twitter.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Just a quick note to report that <a href="http://python-eve.org">Eve v0.8.1</a> is out and <a href="https://pypi.org/project/Eve/">ready to
rock</a>. It brings a number of fixes, some improvements as well as a couple
of new features. Check out the <a href="http://docs.python-eve.org/en/latest/changelog.html">changelog</a> for details.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Lettura di fatture elettroniche con firma digitale in .NET (.p7m)</title>
      <link>https://nicolaiarocci.com/lettura-di-fatture-elettroniche-con-firma-digitale-in-.net-.p7m/</link>
      <pubDate>Thu, 27 Sep 2018 11:23:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/lettura-di-fatture-elettroniche-con-firma-digitale-in-.net-.p7m/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Sorry folks. Because of its target audience, this post is in Italian.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Ho appena rilasciato &lt;a href=&#34;https://github.com/FatturaElettronica/FatturaElettronica.Extensions&#34;&gt;FatturaElettronica.Extensions&lt;/a&gt;. Si tratta di un package che
estende &lt;a href=&#34;https://github.com/FatturaElettronica/FatturaElettronica.NET&#34;&gt;FatturaElettronica.NET&lt;/a&gt; aggiungendo (per ora) un solo extension method:
&lt;code&gt;ReadXmlSigned&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Il metodo si affianca all&amp;rsquo;esistente &lt;code&gt;ReadXml&lt;/code&gt; ed accetta un file in formato
standard fattura elettronica già firmato digitalmente (estensione .p7m), lo
legge, verifica che le firme siano valide, quindi lo carica in un oggetto
&lt;code&gt;FatturaElettronica&lt;/code&gt; che lo rappresenta interamente:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Sorry folks. Because of its target audience, this post is in Italian.</p></blockquote>
<p>Ho appena rilasciato <a href="https://github.com/FatturaElettronica/FatturaElettronica.Extensions">FatturaElettronica.Extensions</a>. Si tratta di un package che
estende <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET">FatturaElettronica.NET</a> aggiungendo (per ora) un solo extension method:
<code>ReadXmlSigned</code></p>
<p>Il metodo si affianca all&rsquo;esistente <code>ReadXml</code> ed accetta un file in formato
standard fattura elettronica già firmato digitalmente (estensione .p7m), lo
legge, verifica che le firme siano valide, quindi lo carica in un oggetto
<code>FatturaElettronica</code> che lo rappresenta interamente:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c#" data-lang="c#"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">using</span> <span style="font-weight:bold">System</span>;
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">using</span> <span style="font-weight:bold">FatturaElettronica</span>;
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">using</span> <span style="font-weight:bold">FatturaElettronica.Extensions</span>;
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">using</span> <span style="font-weight:bold">FatturaElettronica.Impostazioni</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">namespace</span> <span style="font-weight:bold">DemoApp</span>
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">class</span> <span style="font-weight:bold">Program</span>
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="font-weight:bold">static</span> <span style="font-weight:bold">void</span> Main(<span style="">string</span>[] args)
</span></span><span style="display:flex;"><span>            {
</span></span><span style="display:flex;"><span>                <span style="">var</span> fattura = Fattura.CreateInstance(Instance.Privati);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                <span style="font-style:italic">// lettura da file con firma digitale</span>
</span></span><span style="display:flex;"><span>                fattura.ReadXmlSigned(<span style="font-style:italic">&#34;IT02182030391_31.xml.p7m&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                <span style="font-style:italic">// la fattura è ora pronta per l&#39;uso</span>
</span></span><span style="display:flex;"><span>                <span style="font-weight:bold">foreach</span> (<span style="">var</span> documento <span style="font-weight:bold">in</span> fattura.Body)
</span></span><span style="display:flex;"><span>                {
</span></span><span style="display:flex;"><span>                    <span style="">var</span> dati = documento.DatiGenerali.DatiGeneraliDocumento;
</span></span><span style="display:flex;"><span>                    Console.WriteLine(<span style="font-style:italic">$&#34;fatt. num. {dati.Numero} del {dati.Data}&#34;</span>);
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>Come già per il fratello maggiore, Extensions è rilasciato con <a href="http://github.com/FatturaElettronica/FatturaElettronica.Extensions/blob/master/LICENSE">licenza open
source BSD</a>. Il package è già <a href="https://www.nuget.org/packages/FatturaElettronica.Extensions/">disponibile su nuget</a> ed
è NetStandard 2.0, quindi compatibile con un gran numero di piattaforme.</p>
<p>Per informazioni dettagliate vi rimando al repository su <a href="https://github.com/FatturaElettronica/FatturaElettronica.Extensions">GitHub</a>.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Code Magazine: Learn Python with Visual Studio</title>
      <link>https://nicolaiarocci.com/code-magazine-learn-python-with-visual-studio/</link>
      <pubDate>Fri, 06 Jul 2018 09:11:07 +0200</pubDate>
      <guid>https://nicolaiarocci.com/code-magazine-learn-python-with-visual-studio/</guid>
      <description>&lt;p&gt;On the July/August issue of &lt;a href=&#34;https://www.codemag.com/Magazine/Issue/2234cd29-d38d-43ae-a08e-e8c4d277b061&#34;&gt;Code Magazine&lt;/a&gt;, available both printed and
online, you can find my article &lt;em&gt;Learn Python with Visual Studio&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Code Magazine&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/codemag.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;From the incipit:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the Stack Overflow Developer Survey for 2018, Python sits comfortably in
the first place as the most wanted programming language, with JavaScript and
Go coming second and third. Python also ranks third in the &amp;ldquo;most loved&amp;rdquo;
category.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Despite the age (20 years and counting), Python’s popularity keeps growing,
and for good reasons. It’s reliable, flexible, easy to learn, open-source,
and cross-platform since the beginning. It also helps that, over time, it
enjoys a robust and active developer community and incredibly rich eco-system
of free libraries supporting all kind of usages: Web applications and
services, desktop apps, scientific computing, scripting—you name it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On the July/August issue of <a href="https://www.codemag.com/Magazine/Issue/2234cd29-d38d-43ae-a08e-e8c4d277b061">Code Magazine</a>, available both printed and
online, you can find my article <em>Learn Python with Visual Studio</em>.</p>
<p><img alt="Code Magazine" loading="lazy" src="/images/codemag.jpg"></p>
<p>From the incipit:</p>
<blockquote>
<p>In the Stack Overflow Developer Survey for 2018, Python sits comfortably in
the first place as the most wanted programming language, with JavaScript and
Go coming second and third. Python also ranks third in the &ldquo;most loved&rdquo;
category.</p></blockquote>
<blockquote>
<p>Despite the age (20 years and counting), Python’s popularity keeps growing,
and for good reasons. It’s reliable, flexible, easy to learn, open-source,
and cross-platform since the beginning. It also helps that, over time, it
enjoys a robust and active developer community and incredibly rich eco-system
of free libraries supporting all kind of usages: Web applications and
services, desktop apps, scientific computing, scripting—you name it.</p></blockquote>
<blockquote>
<p>Surprisingly enough, not many .NET developers know that their favorite
development tool, Visual Studio, offers superb support for Python. In this
article, you’ll see how you can leverage your hard-acquired Visual Studio
skills to work immediately and efficiently with this fantastic language.</p></blockquote>
<p>Continue reading on <a href="https://www.codemag.com/Article/1807081/Learn-Python-with-Visual-Studio">Code Magazine website</a>.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.8 has been released</title>
      <link>https://nicolaiarocci.com/eve-0.8-has-been-released/</link>
      <pubDate>Thu, 10 May 2018 10:46:13 +0200</pubDate>
      <guid>https://nicolaiarocci.com/eve-0.8-has-been-released/</guid>
      <description>&lt;p&gt;I am pleased to announce that the latest version of Eve, v0.8, has been
released. As always, this release has been carefully crafted with love and
passion by yours truly, with the help of a fantastic bunch of contributors.&lt;/p&gt;
&lt;p&gt;Highlights include data-validation-on-steroids thanks to the full support for
Cerberus 1.x, also recently released, partial media requests (think media
streaming), new hooks which allow you to attach custom callbacks to aggregation
and soft deletion events, some new query operators, support for the mongo
decimal type, and more. There are also many critical fixes and improvements.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am pleased to announce that the latest version of Eve, v0.8, has been
released. As always, this release has been carefully crafted with love and
passion by yours truly, with the help of a fantastic bunch of contributors.</p>
<p>Highlights include data-validation-on-steroids thanks to the full support for
Cerberus 1.x, also recently released, partial media requests (think media
streaming), new hooks which allow you to attach custom callbacks to aggregation
and soft deletion events, some new query operators, support for the mongo
decimal type, and more. There are also many critical fixes and improvements.</p>
<p>Please note that v0.8 does not support Python 2.6 and 3.3 anymore. For the few
vintage developers left out there, I also released v0.7.9, which is the last
version with support for these legacy Python versions (no new features there,
though).</p>
<p>Before upgrading, make sure you check the breaking changes.</p>
<ul>
<li><a href="https://pypi.org/project/Eve/">Eve on PyPI</a></li>
<li><a href="http://python-eve.org">Project website</a></li>
<li><a href="http://python-eve.org/changelog">Changelog</a></li>
</ul>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Mac Notification Center does not work: the Quick Fix</title>
      <link>https://nicolaiarocci.com/mac-notification-center-does-not-work-the-quick-fix/</link>
      <pubDate>Thu, 12 Apr 2018 10:06:35 +0200</pubDate>
      <guid>https://nicolaiarocci.com/mac-notification-center-does-not-work-the-quick-fix/</guid>
      <description>&lt;p&gt;I had this happen to me a few times already. Notification Center on the Mac
goes completely numb: no more notifications and the list is empty. I&amp;rsquo;m writing
down the fix, so I do not have to google the forums once again the next time.&lt;/p&gt;
&lt;p&gt;Open the Terminal, then:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# this usually fails, as the notification server is already running
launchctl load -w /System/Library/LaunchAgents/com.apple.notificationcenterui.plist

# kills and restarts the notification center - fixed!.
killall NotificationCenter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Join the &lt;a href=&#34;http://eepurl.com/b-_Pzz&#34;&gt;newsletter&lt;/a&gt; to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @&lt;a href=&#34;http://twitter.com/nicolaiarocci&#34;&gt;nicolaiarocci&lt;/a&gt; on twitter.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I had this happen to me a few times already. Notification Center on the Mac
goes completely numb: no more notifications and the list is empty. I&rsquo;m writing
down the fix, so I do not have to google the forums once again the next time.</p>
<p>Open the Terminal, then:</p>
<pre><code># this usually fails, as the notification server is already running
launchctl load -w /System/Library/LaunchAgents/com.apple.notificationcenterui.plist

# kills and restarts the notification center - fixed!.
killall NotificationCenter
</code></pre>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Announcing my first online course</title>
      <link>https://nicolaiarocci.com/announcing-my-first-online-course/</link>
      <pubDate>Thu, 15 Mar 2018 09:16:52 +0100</pubDate>
      <guid>https://nicolaiarocci.com/announcing-my-first-online-course/</guid>
      <description>&lt;p&gt;I am super excited to announce the launch of &lt;a href=&#34;https://training.talkpython.fm/courses/explore_eve/eve-building-restful-mongodb-backed-apis-course&#34;&gt;Eve: Building RESTful APIs with
MongoDB and Flask&lt;/a&gt;, a brand new TalkPython Training course.&lt;/p&gt;
&lt;p&gt;Authoring this course has been a new experience for me, and I must say that
I very much enjoyed every minute of it. Finding myself in the exciting position
being at the same time both the project author and the instructor, I did my
best to focus on the typical issues I know from experience most people face
when they start setting up their first RESTful web service with Flask and Eve.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am super excited to announce the launch of <a href="https://training.talkpython.fm/courses/explore_eve/eve-building-restful-mongodb-backed-apis-course">Eve: Building RESTful APIs with
MongoDB and Flask</a>, a brand new TalkPython Training course.</p>
<p>Authoring this course has been a new experience for me, and I must say that
I very much enjoyed every minute of it. Finding myself in the exciting position
being at the same time both the project author and the instructor, I did my
best to focus on the typical issues I know from experience most people face
when they start setting up their first RESTful web service with Flask and Eve.</p>
<p><img alt="alt" loading="lazy" src="/images/talkpython-course.png"></p>
<p>Conveniently priced at $49 it&rsquo;s five hours long, and it&rsquo;s for anyone who wants
to leverage Eve to build robust RESTful APIs quickly. We do assume you know
basic Python concepts but advanced features and knowledge of MongoDB, Flask,
and REST is not required.</p>
<p>We dive deep into all major aspects of the Eve REST framework. After a quick
introduction to MongoDB and Flask, we&rsquo;ll dig into Eve, build our schemas and
endpoints and start serving HTTP clients right away, and that&rsquo;s just the
beginning.</p>
<p>In this course, you will:</p>
<ul>
<li>Create a new Eve web service application</li>
<li>Define data schemas for the service and MongoDB</li>
<li>Issue queries from the client straight into the service</li>
<li>Validate inbound data (including custom rules)</li>
<li>Add and configure paging for large datasets</li>
<li>Project responses for just the data you need</li>
<li>Switch between JSON and XML per client request</li>
<li>Secure your service with authentication</li>
<li>Add event hooks such as pre-insert actions</li>
<li>Limit the rate of your clients to avoid abuse</li>
<li>Deploy your service</li>
<li>Learn how to consume the service with JavaScript, Python and Postman</li>
<li>And lots more</li>
</ul>
<p>View the <a href="https://training.talkpython.fm/courses/explore_eve/eve-building-restful-mongodb-backed-apis-course#course_outline">full course outline</a></p>
<p>I am a firm believer that code is taught best when it&rsquo;s hands-on and real. In
this course, live coding happens before your eyes, and you will see the entire
application built in front of your eyes.</p>
<p>Interested? <a href="https://training.talkpython.fm/courses/explore_eve/eve-building-restful-mongodb-backed-apis-course">Jump to the course page right now!</a>.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Quick fix: MongoDB fails when saving Decimal fields</title>
      <link>https://nicolaiarocci.com/quick-fix-mongodb-fails-when-saving-decimal-fields/</link>
      <pubDate>Thu, 23 Nov 2017 11:05:28 +0100</pubDate>
      <guid>https://nicolaiarocci.com/quick-fix-mongodb-fails-when-saving-decimal-fields/</guid>
      <description>&lt;p&gt;So today I was trying to store some decimal fields on a MongoDB 3.4
instance and I kept failing, miserably.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;https://www.mongodb.com/products/compass&#34;&gt;Compass&lt;/a&gt; I was getting a somewhat obscure &amp;ldquo;connection lost&amp;rdquo; message on
every save attempt. Upgrading to Mongo 3.4.10 (I was on 3.4.4) improved things,
as the error message was now hinting at the &lt;code&gt;setFeatureCompatibilityVersion&lt;/code&gt;
setting which, apparently, was preventing some features to be made available.&lt;/p&gt;
&lt;p&gt;Now that made sense, as this specific database had been upgraded all
the way from up Mongo 2.6. A &lt;a href=&#34;https://docs.mongodb.com/master/reference/command/setFeatureCompatibilityVersion/#dbcmd.setFeatureCompatibilityVersion&#34;&gt;quick lookup&lt;/a&gt; revealed that, when upgrading to
3.4, &lt;code&gt;setFeatureCompatibilityVersion&lt;/code&gt; is automatically set to &lt;code&gt;&amp;quot;3.2&amp;quot;&lt;/code&gt;. As we
all know, support for Decimal type only comes with Mongo 3.4.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So today I was trying to store some decimal fields on a MongoDB 3.4
instance and I kept failing, miserably.</p>
<p>In <a href="https://www.mongodb.com/products/compass">Compass</a> I was getting a somewhat obscure &ldquo;connection lost&rdquo; message on
every save attempt. Upgrading to Mongo 3.4.10 (I was on 3.4.4) improved things,
as the error message was now hinting at the <code>setFeatureCompatibilityVersion</code>
setting which, apparently, was preventing some features to be made available.</p>
<p>Now that made sense, as this specific database had been upgraded all
the way from up Mongo 2.6. A <a href="https://docs.mongodb.com/master/reference/command/setFeatureCompatibilityVersion/#dbcmd.setFeatureCompatibilityVersion">quick lookup</a> revealed that, when upgrading to
3.4, <code>setFeatureCompatibilityVersion</code> is automatically set to <code>&quot;3.2&quot;</code>. As we
all know, support for Decimal type only comes with Mongo 3.4.</p>
<p>Setting <code>setFeatureCompatibilityVersion</code> to <code>&quot;3.4&quot;</code> was the obvious fix, and
I am now happily storing decimals with my documents. As I was on a standalone
dev instance all I had to do was hop on the mongo shell and fire the following
command:</p>
<pre><code>db.adminCommand( { setFeatureCompatibilityVersion: &quot;3.4&quot; } )
</code></pre>
<p>If you are on a replica set, then make sure to hit your primary with the above
command. For all the details, see the <a href="https://docs.mongodb.com/master/reference/command/setFeatureCompatibilityVersion/#dbcmd.setFeatureCompatibilityVersion">documentation</a>.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Spesometro Open Source per .NET</title>
      <link>https://nicolaiarocci.com/spesometro-open-source-per-.net/</link>
      <pubDate>Thu, 05 Oct 2017 09:37:00 +0200</pubDate>
      <guid>https://nicolaiarocci.com/spesometro-open-source-per-.net/</guid>
      <description>&lt;p&gt;&lt;em&gt;apologies, this post is about an Italian open source release, so it’s
going to be in Italian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/FatturaElettronica/Spesometro.NET&#34;&gt;Spesometro.NET&lt;/a&gt; è un nuovo progetto open source che ho rilasciato con la &lt;a href=&#34;http://gestionaleamica.com&#34;&gt;mia
azienda&lt;/a&gt;. Si tratta di un package .NET che permette di leggere, scrivere
e convalidare lo Spesometro o, come è chiamato formalmente, la Comunicazione
delle Fatture Emesse e Ricevute.&lt;/p&gt;
&lt;p&gt;Si tratta di un adempimento che in tempi recenti, per ragioni che non è il caso
di affrontare in questo articolo, ha causato grosse difficoltà sia ai fornitori
di soluzioni software che, e soprattutto, agli utenti finali di dette
soluzioni.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>apologies, this post is about an Italian open source release, so it’s
going to be in Italian</em></p>
<p><a href="https://github.com/FatturaElettronica/Spesometro.NET">Spesometro.NET</a> è un nuovo progetto open source che ho rilasciato con la <a href="http://gestionaleamica.com">mia
azienda</a>. Si tratta di un package .NET che permette di leggere, scrivere
e convalidare lo Spesometro o, come è chiamato formalmente, la Comunicazione
delle Fatture Emesse e Ricevute.</p>
<p>Si tratta di un adempimento che in tempi recenti, per ragioni che non è il caso
di affrontare in questo articolo, ha causato grosse difficoltà sia ai fornitori
di soluzioni software che, e soprattutto, agli utenti finali di dette
soluzioni.</p>
<p>Vista la nostra attività, anche noi ci siamo trovati subito in prima linea,
schiacciati tra l&rsquo;incudine (l&rsquo;aspettativa di migliaia di piccole aziende che
usano il software <a href="http://gestionaleamica.com">Amica</a>) e il martello (le scadenze incalzanti
e i problemi tecnici imposti dalla Pubblica Amministrazione). Non senza
difficoltà siamo riusciti a consegnare la soluzione una settimana prima della
scadenza ufficiale (alla quale sono seguite diverse proroghe, ma questa
è un&rsquo;altra storia).</p>
<p>Come già fatto in passato per la <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET">Fattura Elettronica</a>, anche per questo
progetto abbiamo deciso il rilascio con licenza open source. Potete
contribuire al codice, aprire ticket laddove necessario, installarlo ed usarlo
nelle vostre applicazioni. In questo articolo vediamo come usarlo.</p>
<h3 id="caratteristiche-di-spesometronet">Caratteristiche di Spesometro.NET</h3>
<p>Il package mette a disposizione una classe <code>Spesometro</code> che rappresenta per
intero il <a href="http://www.agenziaentrate.gov.it/wps/file/Nsilib/Nsi/Strumenti/Specifiche+tecniche/Specifiche+tecniche+comunicazioni/Fatture+e+corrispettivi+ST/Allegato+XML+Dati+Fattura/Formato+XMLdati_fattura.xls">tracciato ufficiale</a> dello Spesometro 2017. Una istanza di questa
classe può essere usata per leggere, modificare e salvare un file spesometro
conforme allo standard. E&rsquo; anche disponibile una intera collezione di
validatori che consentono di certificare che lo Spesometro sia conforme alle
regole di convalida ufficiali.</p>
<p>Spesometro.NET è rilasciato una licenza libera <a href="https://raw.githubusercontent.com/FatturaElettronica/Spesometro.NET/master/LICENSE">BSD</a> ed è <a href="https://github.com/dotnet/standard/blob/master/docs/versions/netstandard2.0.md">NetStandard
2.0</a>, cosa che consente di utilizzarlo su un ampio numero di piattaforme.</p>
<h3 id="come-usare-spesometronet">Come usare Spesometro.NET</h3>
<p>Sul repository su GitHub troverete una semplice applicazione NetCore di
esempio. La stessa è anche disponibile nel <a href="https://github.com/FatturaElettronica/Spesometro.NET/blob/master/README.md">README</a> a corredo. esempio. Qui
ne ripercorriamo le caratteristiche principali.</p>
<p>Leggere uno spesometro già esistente è semplice quanto leggere un qualunque
file XML:</p>
<script src="https://gist.github.com/nicolaiarocci/7cc61d67968014251018309fd76bb233.js"></script>

<p>Una volta caricato uno spesometro possiamo manipolarlo liberamente.
Qui aggiungiamo alle fatture emesse un committente (cliente) con una nostra
fattura emessa nei suoi confronti.</p>
<script src="https://gist.github.com/nicolaiarocci/caa1db341314bb10a85c47e01397e9ae.js"></script>

<p>I validatori consentono di assicurarsi che le proprietà siano impostate
correttamente rispetto alle regola di convalida previste dallo standard.</p>
<script src="https://gist.github.com/nicolaiarocci/e9c08dc66e1df5f5a2f3eb991edcf07a.js"></script>

<p>Infine, salvare lo spesometro su file un XML conforme alle
specifiche della PA è banale:</p>
<script src="https://gist.github.com/nicolaiarocci/4a5efe298d9ea3df47513acbff41af82.js"></script>

<p>Ricordo che il file così creato dovrà essere firmato digitalmente prima di
poter essere consegnato, pena il rigetto. Per quanto riguarda il nome del file,
va rispettata una convenzione. Il file avrà sempre un nome costruito questo
modo: <code>IT&lt;codicefiscaleazienda&gt;_DF_&lt;progressivounivoco&gt;.XML</code>. Il codice univoco
di presentazione può essere numerico o alfanumerico, e deve sempre essere di
cinque caratteri. Un esempio potrebbe essere: <code>IT01180680937_DF_00001.XML</code>. Le
lettere devono essere sempre maiuscole, altrimenti il file verrà scartato.</p>
<h3 id="installazione">Installazione</h3>
<p>Spesometro è un package NuGet quindi tutto quel che serve è eseguire
<code>Install-Package Spesometro</code> dalla Package Console o dalla command line, oppure
usare il comando equivalente in Visual Studio.</p>
<h3 id="conclusioni">Conclusioni</h3>
<p>Rilasciare il progetto <a href="https://github.com/FatturaElettronica/FatturaElettronica.NET">Fattura Elettronica</a> con licenza open source si
è rivelata una ottima iniziativa e, viste le difficoltà in cui molti si trovano
con lo Spesometro, crediamo e speriamo di fare cosa buona e giusta anche con
questo secondo rilascio. Come al solito non esistate a mettervi in contatto per
qualunque suggerimento, consiglio, o problema riscontrato.</p>
<p>PS: nota a margine, anche Fattura Elettronica è stato aggiornato. La versione
0.7 è su nuget, ed è anch&rsquo;essa NetStandard compatibile.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Python Workload now officially supported in Visual Studio 2017</title>
      <link>https://nicolaiarocci.com/python-workload-now-officially-supported-in-visual-studio-2017/</link>
      <pubDate>Thu, 11 May 2017 16:16:06 +0200</pubDate>
      <guid>https://nicolaiarocci.com/python-workload-now-officially-supported-in-visual-studio-2017/</guid>
      <description>&lt;p&gt;Visual Studio 2017 just received an update (&lt;a href=&#34;https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes&#34;&gt;version 15.2&lt;/a&gt;). Among other
nice things, this update brings full support for Python back into the official
release of VS2017. As you might recall (see my &lt;a href=&#34;https://nicolaiarocci.com/python-support-in-visual-studio-2017-or-the-lack-thereof/&#34;&gt;old whiny post&lt;/a&gt;), previously
Python was only available with Visual Studio 2017 Preview (a separate install).&lt;/p&gt;
&lt;p&gt;I just upgraded my copy of Visual Studio, added the Python Development Workload
to it via the VS Installer, and finally (and very happily) uninstalled the
whole Visual Studio Preview thingie.  Alleluja!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Visual Studio 2017 just received an update (<a href="https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes">version 15.2</a>). Among other
nice things, this update brings full support for Python back into the official
release of VS2017. As you might recall (see my <a href="https://nicolaiarocci.com/python-support-in-visual-studio-2017-or-the-lack-thereof/">old whiny post</a>), previously
Python was only available with Visual Studio 2017 Preview (a separate install).</p>
<p>I just upgraded my copy of Visual Studio, added the Python Development Workload
to it via the VS Installer, and finally (and very happily) uninstalled the
whole Visual Studio Preview thingie.  Alleluja!</p>
<p>In case you are wondering what this is all about, well you should know that
Python in Visual Studio is very powerful. The Release Notes provide a quick
overview:</p>
<blockquote>
<p>We have enhanced the Python development workload in Visual Studio to maximize
your productivity in Python. We offer improved IntelliSense, web development
projects, Git, and VSTS integration to save you time and effort on everyday
tasks. Use world class debugging (local, remote, cross-platform, and
Python/native) and profiling tools to improve the quality and performance of
your Python code.</p></blockquote>
<p>You can also check out my <a href="https://speakerdeck.com/nicola/python-on-windows-like-a-boss">Python on Windows Like a Boss</a> talk (although
I guess it will kind of suck without the live demo), or jump over to the
official <a href="https://www.visualstudio.com/vs/python">Python information page</a>.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>How to convert a PCL (Portable) project to NetStandard</title>
      <link>https://nicolaiarocci.com/how-to-convert-a-pcl-portable-project-to-netstandard/</link>
      <pubDate>Wed, 10 May 2017 09:47:05 +0200</pubDate>
      <guid>https://nicolaiarocci.com/how-to-convert-a-pcl-portable-project-to-netstandard/</guid>
      <description>&lt;p&gt;I have been upgrading a few projects from their original PCL profiles (now
deemed obsolete) to the &lt;a href=&#34;https://docs.microsoft.com/it-it/dotnet/articles/standard/library&#34;&gt;Net Standard&lt;/a&gt; platform specification. It turned out
to be a relatively straightforward process, but it does have its small hurdles,
especially so if in the meantime you also want to transition to the new,
streamlined, &lt;code&gt;.csproj&lt;/code&gt; format as the migration will leave you with a now
obsolete &lt;code&gt;project.json&lt;/code&gt; project. In this article, I will cover upgrading
a project from Portable Class Library to NetStandard. In a follow-up post,
I plan to write about the switch from &lt;code&gt;project.json&lt;/code&gt; to the new &lt;code&gt;.csproj&lt;/code&gt;
format.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have been upgrading a few projects from their original PCL profiles (now
deemed obsolete) to the <a href="https://docs.microsoft.com/it-it/dotnet/articles/standard/library">Net Standard</a> platform specification. It turned out
to be a relatively straightforward process, but it does have its small hurdles,
especially so if in the meantime you also want to transition to the new,
streamlined, <code>.csproj</code> format as the migration will leave you with a now
obsolete <code>project.json</code> project. In this article, I will cover upgrading
a project from Portable Class Library to NetStandard. In a follow-up post,
I plan to write about the switch from <code>project.json</code> to the new <code>.csproj</code>
format.</p>
<p>So let us take the <a href="https://github.com/pyeve/Eve.NET/">Eve.NET</a> project as an example. It makes a good
candidate because it is an open source project, so you can go and have a look
at the source code <a href="https://github.com/pyeve/Eve.NET/tree/v0.2">before</a> and <a href="https://github.com/pyeve/Eve.NET/tree/netstandard">after</a> the switch from PCL to
NetStandard.</p>
<p>The first step was, of course, opening the project in Visual Studio 2017. If
you are on an older VS version, you should upgrade. For many valid reasons
indeed, among them the fact that Visual Studio 2017 comes with a built-in
option to switch a project to NetStandard.</p>
<p><img loading="lazy" src="/images/netstandard1.png"></p>
<p>As you can see, before the upgrade Eve.NET was a Profile259 PCL project. As
metioned, Visual Studio offers the option to switch to the .NET Platform
Standard. By clicking the link, you get a fair warning that <em>you might not be
able to use the same APIs when targeting NetStandard</em>. That makes sense
because, as you probably know already, NetStandard is an API specification
while a PCL essentially is the intersection (or lowest common denominator) of
the APIs available on target platforms. PCL compatibility has never been the
design goal of NetStandard.</p>
<p>Generally speaking, NetStandard offers a wider range of APIs compared to most
PCL profiles and, most importantly, is planned to go through a cycle of
incremental upgrades of the API specification, each one denoted by a version
number. We already went from 1.0 to 1.6, with 2.0 currently being developed.
<a href="https://github.com/dotnet/standard/blob/master/docs/netstandard-20/README.md">NetStandard 2</a> will be a significant milestone, just give a look at the
<a href="https://raw.githubusercontent.com/dotnet/standard/master/docs/versions/netstandard2.0_diff.md">impressive diff</a> between 1.6 and 2.0. A <em>lot</em> of open source projects are
eagerly waiting on NetStandard 2 release (Q3 2017).</p>
<p>Upon confirming the switch, you might get the following show-stopper (I did):</p>
<p><img loading="lazy" src="/images/netstandard2.png"></p>
<p>This dialog will pop up if your project never has opted-in for NuGet 3.0. If
this is the case, you have to go back, uninstall all NuGet packages, then
attempt the switch again. When the migration is complete, you will have to
re-install the packages, provided that they are compatible with NetStandard. In
Eve.NET case the only dependency is Json.NET, which supports NetStandard 1.3,
which also means that Eve cannot support previous NetStandard versions.</p>
<p>Now, if you give a look at the installed packages, you will find that you have
a couple of new entries: <code>NETStandard.Library</code>, which is pretty
self-explanatory, and <code>Microsoft.NETCore.Portable.Compatibility</code>. This one will
only appear when you convert from a PCL: a brand new NetStandard project will
not take a dependency on it. If you are not using any legacy code, like NET
4.0-only, or Silverlight, you should be able to drop this dependency safely (I
did with no consequences).</p>
<p>The project is now NetStandard and ready to be used on all the platforms
supporting your chosen version: NETCore, Windows, Xamarin, UWP, you name it.</p>
<p>However, you will soon notice that the project has gained a <code>project.json</code>
file. It is ok, it works just fine, but it is obsolete: with Visual Studio 2017
project.json was abandoned for a new, streamlined and pretty darn powerful,
<code>.csproj</code> project file. In the next article, I will show you how to move your
project forward by dropping <code>project.json</code> and embracing the new project type
(and other niceties, like dropping the <code>.nuspec</code> file in the process).</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve and Cerberus funding campaign</title>
      <link>https://nicolaiarocci.com/eve-and-cerberus-funding-campaign/</link>
      <pubDate>Thu, 27 Apr 2017 11:23:05 +0200</pubDate>
      <guid>https://nicolaiarocci.com/eve-and-cerberus-funding-campaign/</guid>
      <description>&lt;p&gt;Last February I published &lt;a href=&#34;https://nicolaiarocci.com/the-state-of-the-eve-rest-framework-project/&#34;&gt;The State of Eve REST Framework&lt;/a&gt;. Among other
things in that post, I mentioned that I was looking for ways that would allow
me to allocate more time to the project (and its satellites).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I really feel like I should put more effort into Eve, Cerberus and satellite
projects Eve-Swagger, Flask-Sentinel, Eve.NET, etc. I love working on these
projects and I know a lot of people rely on them. Also, I have big ideas that
I would like to play with. At this point in time however, I cannot afford
allocating more time to not-paying-the-bill activities.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last February I published <a href="https://nicolaiarocci.com/the-state-of-the-eve-rest-framework-project/">The State of Eve REST Framework</a>. Among other
things in that post, I mentioned that I was looking for ways that would allow
me to allocate more time to the project (and its satellites).</p>
<blockquote>
<p>I really feel like I should put more effort into Eve, Cerberus and satellite
projects Eve-Swagger, Flask-Sentinel, Eve.NET, etc. I love working on these
projects and I know a lot of people rely on them. Also, I have big ideas that
I would like to play with. At this point in time however, I cannot afford
allocating more time to not-paying-the-bill activities.</p></blockquote>
<p>Well, I went and looked at the possibilities, and finally settled down on
a model which would probably be best defined as a blend between the Vue.js and
the Django REST framework models.</p>
<p>Effective now, the Eve REST framework, Cerberus, and the whole eco-system are
<a href="https://www.patreon.com/nicolaiarocci">collaboratively funded projects</a>. If you run a business and are using
either Eve or Cerberus a revenue-generating product, it would make business
sense to sponsor their development: it ensures the project that your product
relies on stays healthy and actively maintained. Individual users are also
welcome to make either a recurring pledge or a one-time donation if Eve and/or
Cerberus have helped you in your work or personal projects. Every single
sign-up makes a significant impact towards making Eve possible.</p>
<p>Rest assured, Eve continues to be open-source and permissively licensed.
It is also maintained and developed in my free time, and by the awesome
community which has matured around it. I firmly believe, however, that it is in
the commercial best-interest for users of the project to invest in its ongoing
development (make sure you check the exciting <em>Things I Would Be Working On</em>
section on the Patreon page).</p>
<p>To join the backer ranks, check out <a href="https://www.patreon.com/nicolaiarocci">Eve campaign on Patreon</a>, or donate via
<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=7U7G7EWU7EPNW">PayPal</a>.</p>
<p>Thank you, <em>Nicola</em>.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Python support in Visual Studio 2017 or the lack thereof</title>
      <link>https://nicolaiarocci.com/python-support-in-visual-studio-2017-or-the-lack-thereof/</link>
      <pubDate>Wed, 08 Mar 2017 10:41:17 +0100</pubDate>
      <guid>https://nicolaiarocci.com/python-support-in-visual-studio-2017-or-the-lack-thereof/</guid>
      <description>&lt;p&gt;So yesterday Visual Studio 2017 was released. Big news. Lots of &lt;a href=&#34;https://www.visualstudio.com/vs/whatsnew/&#34;&gt;cool
stuff&lt;/a&gt;. As I write this I am watching the &lt;a href=&#34;https://launch.visualstudio.com&#34;&gt;live stream&lt;/a&gt; of the
2 days-long launch event. If you want to learn about Python support in VS2017
though, you have to dig deeper and head over to the &lt;a href=&#34;https://blogs.msdn.microsoft.com/pythonengineering/2017/03/07/python-support-in-vs2017/&#34;&gt;Python Engineering&lt;/a&gt;
blog at Microsoft.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&#34;https://nicolaiarocci.com/python-workload-pulled-off-visual-studio-2017-rc3/&#34;&gt;expected&lt;/a&gt;, the official release is actually coming out with no support for
Python. It will come in a few months. Bummer. In the meanwhile however you can go and grab the
(also newly released) &lt;a href=&#34;https://visualstudio.com/vs/preview?wt.mc_id=blogs_msdn_python&#34;&gt;Visual Studio Preview&lt;/a&gt;. This new kid on the block
has the ability to be installed and used side-by-side with the official release
and will be used - you guessed it - as an early preview of what’s coming next for Visual Studio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So yesterday Visual Studio 2017 was released. Big news. Lots of <a href="https://www.visualstudio.com/vs/whatsnew/">cool
stuff</a>. As I write this I am watching the <a href="https://launch.visualstudio.com">live stream</a> of the
2 days-long launch event. If you want to learn about Python support in VS2017
though, you have to dig deeper and head over to the <a href="https://blogs.msdn.microsoft.com/pythonengineering/2017/03/07/python-support-in-vs2017/">Python Engineering</a>
blog at Microsoft.</p>
<p>As <a href="https://nicolaiarocci.com/python-workload-pulled-off-visual-studio-2017-rc3/">expected</a>, the official release is actually coming out with no support for
Python. It will come in a few months. Bummer. In the meanwhile however you can go and grab the
(also newly released) <a href="https://visualstudio.com/vs/preview?wt.mc_id=blogs_msdn_python">Visual Studio Preview</a>. This new kid on the block
has the ability to be installed and used side-by-side with the official release
and will be used - you guessed it - as an early preview of what’s coming next for Visual Studio.</p>
<p>Two key things to note here:</p>
<ul>
<li>Everything that is in Visual Studio 2017 is also in Visual Studio Preview;</li>
<li>They are two separate installations with separate workloads and settings.</li>
</ul>
<p>Now you might be thinking that two installs are overkill, and I concur. Because
Preview includes all the official features, you might also think that you can
probably get away with only installing Visual Studio Preview. That would work,
but here is the catch: Visual Studio Preview has no support for paid product
offerings. So if you are a Professional or Enterprise user well, you are out of
luck.</p>
<p>This is not ideal. Python pulled out of RC3 was understandable, although
unsettling. Not included with the official release? Not pretty. For most
people, I suspect, the gimmicks required to get Python to work with Visual
Studio 2017 are unbearable. Personally, I will fallback to other solutions and
wait until Python Workload gets merged back with the official offering.</p>
<p>I am still convinced that in the long run Visual Studio with its Python
Workload will become the best option to do Python on Windows (Visual Studio
Code being the second best candidate). I mean, look at this beauty:</p>
<p><img loading="lazy" src="/images/PythonVsPreview.png"></p>
<p>Combined with the VsVim extension it makes Python coding on Windows almost as
great as Vim+bash I&rsquo;ve been using so far, but within Visual Studio which I use
for all my other coding (don&rsquo;t get me started on C# in Vim. That is material
for another post maybe.) I am also totally sympathetic with the dev team.
I have been in this business for longer than I care to admit and I do know
these things happen. But still, there is no dobut that this unfortunate
incident marks a serious setback.</p>
<p>In less than one month I will be givin a talk at PyCon Italy. It is titled
<a href="https://www.pycon.it/conference/talks/python-tools-for-visual-studio-ovvero-python-windows-like-a-boss-and-for-free">Python on Windows Like a Boss</a> and the heart of it was of course going be
the Python Workload for Visual Studio 2017. With this turn of events I will
probably end up going on stage with the previous version of the tool, and
Visual Studio 2015.</p>
<p>Or I will bite the bullet and install 35 gigs of mostly duplicated software.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Setting the default timezone in AppVeyor build worker (and C# 7.0 support)</title>
      <link>https://nicolaiarocci.com/setting-the-default-timezone-in-appveyor-and-c-sharp-7-support/</link>
      <pubDate>Sat, 25 Feb 2017 16:48:09 +0100</pubDate>
      <guid>https://nicolaiarocci.com/setting-the-default-timezone-in-appveyor-and-c-sharp-7-support/</guid>
      <description>&lt;p&gt;So yesterday I pushed some code over to GitHub, then went off to work on
a different project. A few seconds later I got an email from &lt;a href=&#34;https://www.appveyor.com&#34;&gt;AppVeyor&lt;/a&gt;
telling me that my CI build worker was reporting a failure. I was surprised as
just ahead of the push I had tests all green in local.&lt;/p&gt;
&lt;p&gt;Turned out failure was on an equality assertion between two date values:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/appveyor-failure-on-date-fields.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;As you can see the mismatch was &lt;em&gt;precisely&lt;/em&gt; two hours. That always rings a Time
Zone alarm bell in my head. I was under the assumption that since my time zone
was correctly set in my account settings, the workers would pick it up. Well as
it turns out, that is not the case as that setting is only used for
notifications and NuGet feeds. The AppVeyor app worker runs on UTC by default.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So yesterday I pushed some code over to GitHub, then went off to work on
a different project. A few seconds later I got an email from <a href="https://www.appveyor.com">AppVeyor</a>
telling me that my CI build worker was reporting a failure. I was surprised as
just ahead of the push I had tests all green in local.</p>
<p>Turned out failure was on an equality assertion between two date values:</p>
<p><img loading="lazy" src="/images/appveyor-failure-on-date-fields.png"></p>
<p>As you can see the mismatch was <em>precisely</em> two hours. That always rings a Time
Zone alarm bell in my head. I was under the assumption that since my time zone
was correctly set in my account settings, the workers would pick it up. Well as
it turns out, that is not the case as that setting is only used for
notifications and NuGet feeds. The AppVeyor app worker runs on UTC by default.</p>
<p>Solution was straightforward. I edited the <code>appveyor.yml</code> file and instructed
the worker to launch <code>tzutil</code> and set the desired time zone immediately, before
anything else is executed:</p>
<script src="https://gist.github.com/nicolaiarocci/afbce25a393067e3e22e2f3f706f548a.js"></script>

<p>And that was it. Remember, you can use <code>tzutil /l</code> on your local box to get
a list of the available timezones.</p>
<p>Another minor (and temporary) issue I have with AppVeyor is that they do not
officially support C# 7.0 yet. Try using an inline temporary variable in your
code. Tests will be green in local and happily fail on AppVeyor, as the VM runs
MSBuild 14. The Visual Studio 2017 RC image is in beta and not available in the
Environment settings unless you explictly ask for it <a href="https://github.com/appveyor/ci/issues/1179">here</a>. They are quick
to reply though and then, not without some more fiddling (see the post at the
top of the thread), you can get C# 7.0 features to run seamlessly in the VM.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Python Workload pulled off Visual Studio 2017 RC3</title>
      <link>https://nicolaiarocci.com/python-workload-pulled-off-visual-studio-2017-rc3/</link>
      <pubDate>Sat, 18 Feb 2017 10:48:29 +0100</pubDate>
      <guid>https://nicolaiarocci.com/python-workload-pulled-off-visual-studio-2017-rc3/</guid>
      <description>&lt;p&gt;So how do you install the awesome &lt;a href=&#34;https://www.visualstudio.com/vs/python/&#34;&gt;Python Development Tools&lt;/a&gt; on the latest
Visual Studio 2017 RC? That might seem a stupid question considering that the
Data Science and Python Development workload has been available with every
Release Candidate so far. You simply select the workload during the
installation and you&amp;rsquo;re done, right? Not quite.&lt;/p&gt;
&lt;p&gt;I found out the hard way this morning as I wanted to install VS 2017 RC3 on my
development machine and, to my surprise, I could not find Python Development
anywhere on the workloads window (which itself is a huge improvement over the
VS 2015 install experience, by the way). Easy, I thought, they moved it to some
secondary &amp;ldquo;optional workloads&amp;rdquo; tab, but a quick scan did not reveal any of
that.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So how do you install the awesome <a href="https://www.visualstudio.com/vs/python/">Python Development Tools</a> on the latest
Visual Studio 2017 RC? That might seem a stupid question considering that the
Data Science and Python Development workload has been available with every
Release Candidate so far. You simply select the workload during the
installation and you&rsquo;re done, right? Not quite.</p>
<p>I found out the hard way this morning as I wanted to install VS 2017 RC3 on my
development machine and, to my surprise, I could not find Python Development
anywhere on the workloads window (which itself is a huge improvement over the
VS 2015 install experience, by the way). Easy, I thought, they moved it to some
secondary &ldquo;optional workloads&rdquo; tab, but a quick scan did not reveal any of
that.</p>
<p>Concerned now, I turned to the <a href="https://www.google.com/?gfe_rd=cr&amp;ei=Lh2oWNCJENCv8wfrtaqYDA&amp;gws_rd=cr#q=python+tools+visual+studio+2017+rc3">Oracle of All Things</a> only to find that the
Python Workload has been pulled off the Visual Studio 2017 RC3 (January 2017).
It was actually reported in the <a href="https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes">release notes</a>:</p>
<blockquote>
<p>Removed the Data Science and Python Development workloads as some of the
components weren’t meeting the release requirements, such as translation to
non-English languages. They will be available soon as separate downloads.</p></blockquote>
<p>When I glanced over them I (and probably you too) did not notice this little
paragraph. But wait, it&rsquo;s even worse than you would expect:</p>
<blockquote>
<p>Upgrading to current version will remove any previously installed Python and
Data Science workloads/components.</p></blockquote>
<p>That&rsquo;s right. If you upgrade to RC3 you win a wipe out of your Python
environment. Further research revelead an open <a href="https://github.com/Microsoft/PTVS/issues/2099">ticket</a> on GitHub.
Apparently they are working on a way to install the Python and Data Science
workloads on top of an existing VS 2017 install, but I would not hold my breath
on it:</p>
<blockquote>
<p>Thanks everyone for the support and understanding. It&rsquo;s still not clear to us
how we&rsquo;re going to be releasing Python support, but the plan is definitely to
have something when VS 2017 releases next month.</p></blockquote>
<p>Since the official VS 2017 release is planned early next month it is very
likely that we will just have to wait until then. In the meantime, you better
have a VS 2015 sitting side by side with your brand new, mutilated, Visual
Studio 2017. Or you switch to Visual Studio Code, which offers fantastic
support for Python.</p>
<p>Or you fallback to good ole trusted Vim, like I did.</p>
<p>UPDATE (Feb 22, 2017). There&rsquo;s now an <a href="https://blogs.msdn.microsoft.com/pythonengineering/2017/02/22/python-in-vs2017/">official post</a> up at the Microsoft
Python Engineering blog, by Steve Dower. Looks like using Python with Visual
Studio 2017 will initially require a separate &ldquo;preview&rdquo; build of VS itself.
Only months later Python support will be merged to the official bundle.</p>
<p>UPDATE (Mar 8, 2017). I posted a <a href="https://nicolaiarocci.com/python-support-in-visual-studio-2017-or-the-lack-thereof/">follow-up article</a>, as VS2017 has finally
been released.</p>
<p><em>Join the <a href="http://eepurl.com/b-_Pzz">newsletter</a> to get an email alert when a new post surfaces on
this site. If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on twitter.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>The state of the Eve REST framework project</title>
      <link>https://nicolaiarocci.com/the-state-of-the-eve-rest-framework-project/</link>
      <pubDate>Mon, 06 Feb 2017 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/the-state-of-the-eve-rest-framework-project/</guid>
      <description>&lt;p&gt;A new major release of the &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve REST API Framework&lt;/a&gt; is finally out with
a number of cool new features (MongoDB Aggregations!), few fixes, and a couple
of minor breaking changes. On the Eve blog you can find a &lt;a href=&#34;http://blog.python-eve.org/eve-07-released&#34;&gt;detailed article&lt;/a&gt;
about this important release.&lt;/p&gt;
&lt;p&gt;I am glad to report that the &lt;a href=&#34;https://github.com/RedTurtle/eve-sqlalchemy&#34;&gt;Eve-SQLAlchemy&lt;/a&gt; community extension, which
allows SQL databases to serve as Eve backends, has seen a surge of activity
around it. There is a new maintainer, Dominik Kellner, and a bunch of active
contributors. Work is being done to align the extension with latest Eve
release. If interested, please join the efforts there. Speaking of community
extensions, only a few days ago &lt;a href=&#34;https://github.com/petrjasek/eve-elastic&#34;&gt;Eve-Elastic&lt;/a&gt; version 2 has been released
too.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A new major release of the <a href="http://python-eve.org">Eve REST API Framework</a> is finally out with
a number of cool new features (MongoDB Aggregations!), few fixes, and a couple
of minor breaking changes. On the Eve blog you can find a <a href="http://blog.python-eve.org/eve-07-released">detailed article</a>
about this important release.</p>
<p>I am glad to report that the <a href="https://github.com/RedTurtle/eve-sqlalchemy">Eve-SQLAlchemy</a> community extension, which
allows SQL databases to serve as Eve backends, has seen a surge of activity
around it. There is a new maintainer, Dominik Kellner, and a bunch of active
contributors. Work is being done to align the extension with latest Eve
release. If interested, please join the efforts there. Speaking of community
extensions, only a few days ago <a href="https://github.com/petrjasek/eve-elastic">Eve-Elastic</a> version 2 has been released
too.</p>
<p>Next major release will of course be version 0.8 and it should come relatively
soon. It will be focused on adding <a href="http://python-cerberus.org">Cerberus 1.0</a> support. That will add
superpowers and more flexibility to areas like data validation and API
endpoints definition. Work on adding Cerberus 1 to Eve <a href="https://github.com/nicolaiarocci/eve/pull/917">has actually been
ongoing</a>. In fact, we were ready to release the feature with the current
release, but I decided against it as I wanted to deliver all the new features
before the inevitable breaking changes that will come with Cerberus 1. The
idea is to let most users take advantage of new features with as little effort
as possible. They will then have the option to bite the bullet and upgrade to
0.8 at their own pace.</p>
<p>The current release has been cooking for a long time, way more than
I anticipated. I have simply been too busy with normal day work, the kind of
activity that pays the bills. That is good for me I guess, but not so much for
the project. I really feel like I should put more effort into Eve, Cerberus and
satellite projects Eve-Swagger, Flask-Sentinel, Eve.NET, etc. I love
working on these projects and I know a lot of people rely on them. Also, I have
big ideas that I would like to play with. At this point in time however,
I cannot afford allocating more time to not-paying-the-bill activities. Rest
assured the project is not going stale. Worse case scenario, nothing changes
and it will just proceed at current pace. But I have been wondering what would
allow me to put more into it.</p>
<p>I am particulary fond of the <a href="https://fund.django-rest-framework.org/topics/funding/">collaboratively funded project</a> model adopted
by the Django REST Framework, and I wonder if it would work for Eve too. Of
course I know that Eve is a smaller project with a smaller ecosystem. I also
know however that many companies and institutions, big and small are using Eve
in production and with good results. In the past I even did the occasional
consulting gig for them. Maybe some would be willing to help with some form of
financing and/or sponsorship, adopting the project in exchange for some
visibility and, more importantly, project growth?</p>
<p>If you have some advice to share on this topic, <a href="mailto:nicola@nicolaiarocci.com">please do so</a>. I am very
hesitant and unsure about this whole thing. Part of me just wants to keep going
the way it&rsquo;s always been, as with any form of financing also comes more
responsability. The other half of me wants to work more on this thing, make it
bigger. Eventually we will get there but, unless something changes, it will
take quite some time.</p>
<p>By the way, next March I am speaking about RESTful Web Services at
<a href="http://rome2017.codemotionworld.com">Codemotion Rome 2017</a>. Presentation will include a Eve live demo, so if
you are interested in Eve and/or want to see me fail miserably and blow it up
on stage, join me there. Tickets are still available, <a href="http://rome2017.codemotionworld.com/talk-detail/?detail=4921">talk will be in
English</a>, and March is a great season to visit Rome. See ya&rsquo;ll there.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to build and deploy a private NuGet server on IIS or Azure</title>
      <link>https://nicolaiarocci.com/how-to-build-and-deploy-a-private-nuget-server-on-iis-or-azure/</link>
      <pubDate>Mon, 09 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/how-to-build-and-deploy-a-private-nuget-server-on-iis-or-azure/</guid>
      <description>&lt;p&gt;Recently I had to build and deploy a private NuGet server. The
official &lt;a href=&#34;https://docs.nuget.org/ndocs/hosting-packages/overview&#34;&gt;documentation&lt;/a&gt; is quite good, but I did hit some
(admittedly small) hitches along the way, so I thought I might as well share
the whole process. Hopefully this post will be helpful to the next guy or gal
adventuring down the same path.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If I don&amp;rsquo;t need to convince you on the usefulness and importance of packages
in modern software development, then you can safely jump to &lt;a href=&#34;#the-case-for-private-nuget-feeds&#34;&gt;The case for
private NuGet feeds&lt;/a&gt;, and spare yourself
some of my ramblings.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently I had to build and deploy a private NuGet server. The
official <a href="https://docs.nuget.org/ndocs/hosting-packages/overview">documentation</a> is quite good, but I did hit some
(admittedly small) hitches along the way, so I thought I might as well share
the whole process. Hopefully this post will be helpful to the next guy or gal
adventuring down the same path.</p>
<p><em>If I don&rsquo;t need to convince you on the usefulness and importance of packages
in modern software development, then you can safely jump to <a href="#the-case-for-private-nuget-feeds">The case for
private NuGet feeds</a>, and spare yourself
some of my ramblings.</em></p>
<h2 id="why-you-should-package">Why you should package</h2>
<p>Before I get down to business allow me a little digression to stress the
importance of packaging, even for small teams. Packaging is not new. The
practice is considered to be well settled, even in the .NET community where it
became mainstream in relatively recent times with the advent of NuGet (2010).
Nonetheless, I have seen the discussion going <em>oh</em> so many times, even in
recent times, in shops big and small: <em>should we package in the first place</em>?
Yes you should.</p>
<p>You don&rsquo;t want to just get along with loose .dll files being distributed
(zipped or not) by hand, email, or any other means. We have all done it at some
point or another. Over time even that single, very simple, self-contained
library file is going to outgrow itself. New releases will happen. Some of
those releases might happen to be outright broken. Bugs and/or regressions will
surface. They always do. Maybe your library will take on a few dependencies.
Good luck getting all your peers to upgrade or downgrade painlessly.</p>
<p>And yes I know. Nowadays we have version control systems. A team can simply
share code via git. But often times you don&rsquo;t necessarily want/can share the
code with your colleagues. More importantly, in most scenarios your peers only
need the features that your library offers, not the burden that comes with
adding your project to their solution and then keeping their clones up to date.
They simply need to add a reference to your library. It might make sense to
keep everything fluid (no release, no package) at the very early stages, when
your API is not ironed out yet but really, just don&rsquo;t. Especially so if you
can rely on a private NuGet feed which you can setup to allow for all kind of
dirty (and inadvisable) tricks, like enabling package overwriting which is
disabled on the public feed.</p>
<p>Packages are the way to go. They give you versioning and dependency management.
They also encorage a distribution model made of small, mostly self-contained
files, which is both a best and common pattern (just look at the path taken by
Microsoft itself with the .NET Core distribution model).</p>
<h2 id="the-case-for-private-nuget-feeds">The case for private NuGet feeds</h2>
<p>Now, with that out of the way, let&rsquo;s give a look at the official NuGet feed.
According to the <a href="http://blog.nuget.org/20160622/NuGet-API-key-expiration.html">NuGet blog</a> itself:</p>
<blockquote>
<p>NuGet.org is growing blazingly fast. The past couple of years have seen
a tremendous growth in the usage of packages from the NuGet gallery.</p></blockquote>
<p>But let&rsquo;s just dig into that giant haystack for a little while. Just a quick
glance will suffice to determine that the feed is a big mess. Besides the top
packages, the tip of the iceberg, you will easily spot a <em>whole lot</em> of
packages that are clearly intended to be only consumed by a handful of people.
Descriptions are often very short, to the point of being unintelligible.
Sometimes they are totally (purposely?) cryptic, or just speak some kind of
internal lingo. Heck, even the package names are at times so obscure that
I don&rsquo;t even get a hint at what they are supposed to do.</p>
<p><img alt="Really?" loading="lazy" src="/images/nuget-random-package.png"></p>
<p>Mind you, this is not limited to the NuGet ecosystem. If we look at the <a href="https://pypi.python.org/pypi">Python
Package Index</a> for example, we find the same exact situation: 95K+ packages,
many of which are totally unintelligible unless you know what you are looking
for. And don&rsquo;t get me started with <a href="https://www.npmjs.com">npm</a>, which reigns supreme with its
astounding 350,000 packages count.</p>
<p>I cannot help but think that many packages would better sit in a private NuGet
server. I would not be surprised to learn one day that people are publishing to
the public feed just because they don&rsquo;t know they can build their own private
server or, even if they do, they think it is just not worth the effort.</p>
<p>Private servers are not a tool just for the enterprise. Small teams
will benefit from them too. Aside from the obvious <em>we don’t want/can’t
share our packages with the public</em> there are other good reasons to have one.
Setting a server up is cheap (host on IIS or Azure), easy, and allows you
total control over the feed.</p>
<h2 id="private-nuget-feed-options">Private NuGet feed options</h2>
<p>The NuGet framework supports local feeds with three options:</p>
<ul>
<li>Local feed. This is a suitable network file share used to store your
pages. Very simple. Probably a good solution if you don&rsquo;t need to share
your packages outside your LAN.</li>
<li>NuGet.Server. Packages are made available through a HTTP server, local
or remote.</li>
<li>NuGet Gallery. Packages are hosted using the NuGet Gallery Project available on GitHub. This is the same tool used to host the official feed, with all the features like
web browsing and searching, admin interface, etc.</li>
</ul>
<p>There are also third-party NuGet hosting services that support remote private
feeds.</p>
<p>In this article we will look at NuGet.Server option. This is an actual
package provided by the .NET Foundation. It creates an ASP.NET application that
can host a package feed on any server that runs IIS. It is simple and quick to
setup, and it is ideal for small teams and simple scenarios. Its biggest
drawback is that it does not keep state: it does not rely on a local database
to store download counts, user logins, etc. If you need that level of detail then you want to
look at the NuGet Gallery option. What the NuGet.Server packages does, in
practice, is making a folder on the server available through HTTP(S). Visual
Studio and <code>nuget.exe</code> can then add the server to the list of available
sources and consume it along with other feeds, like the public one.</p>
<p>If you played with NuGet.Server in the past and found it slow for large number
of packets, please give it another shot now. Besides some internal
optimizations, in recent times it has been updated to use the <a href="http://blog.nuget.org/20160113/Accelerate-your-NuGet.Server.html">Expanded Folder
Format</a> and its performance has skyrocketed since then.</p>
<h2 id="create-a-nuget-server-in-visual-studio">Create a NuGet Server in Visual Studio</h2>
<p>In Visual Studio select File &gt; New &gt; Project to create a new project. In order
to get the latest version of NuGet.Server, make sure you set the target
framework to .NET Framework 4.6 or above.</p>
<p><img alt="New VS project with .NET 4.6 or above" loading="lazy" src="/images/nuget-server-1.png"></p>
<p>Give the application an appropriate name and click OK. In the following dialog
pick the Empty ASP.NET Web Application template and click OK.</p>
<p>Next you need to install the NuGet.Server package itself. Right-click the
project name and select Manage NuGet Packages. In the NuGet Package Manager
search and install the latest version of NuGet.Server.</p>
<p><img alt="Install the NuGet.Server package" loading="lazy" src="/images/nuget-server-2.png"></p>
<p>Alternatively, you can of course install from the Package Manager Console with
<code>Install-Package NuGet.Server</code>.</p>
<p>The installation process will install the needed dependencies and take care of
converting your empty application into an actual package server. It achieves
that by overwriting the default <code>web.config</code> to include custom application
settings (to which we will get in a second), and by creating a deafult
<code>Packages</code> folder where your packages will reside. When you are asked if you
want to overwrite the current <code>web.config</code>, say YES.</p>
<p>When the process is complete your server is ready to run. Just hit Ctrl+F5 (no
debug) and Edge will fire up at the following page:</p>
<p><img alt="NuGet server up and running" loading="lazy" src="/images/nuget-server-3.png"></p>
<h2 id="adding-packages-to-the-feed">Adding packages to the feed</h2>
<p>Now, if you go back to the project and inspect the newly created <code>Packages</code>
folder, you will find that it is empty except for a readme file, which
makes sense since we have not added any package to our repository yet. The readme
says that you can simply drag (or paste) your <code>.nupkg</code> files into the folder in
order to make them available to clients.</p>
<p>That works. I suspect, though, that it used to work better back when
NuGet Server did not support the Expanded Folder Format. At the time of this
writing (v2.11.3 of the package), dragging packages is an awkward process for
a couple of reasons. First, you also need to remember to set the Copy to Output
Directory property to <em>Copy Always</em> for every file added this way (that&rsquo;s not
mentioned in the readme). Second, as soon as the app is up and runnig it will
reconstruct the folder by moving package files, each one into their own
sub-folder, as the Expanded Folder Format implies. This will leave your project
with orphaned files. My suggestion is to simply use your newly created server
the way it is supposed to be: just push your packages to it via <code>nuget.exe</code>.</p>
<p>Initially your NuGet Server will not allow clients to push packages. You first
need to set an API key in <code>web.config</code>, then clients will need to use the key
when pushing to the server. As you can see, the <code>apiKey</code> value is blank by
default.</p>
<p><img alt="NuGet API key setting in web.config" loading="lazy" src="/images/nuget-server-4.png"></p>
<p>The key will have to be shared by all clients, so make sure you hand it only to
authorized personnel. While you are at it, also make sure that it as strong as
it can get. And yes I agree. Along with being statless, the shared API key
requirement is probably the biggest drawback to the NuGet.Server option.</p>
<p>If your server is secured by other means (e.g. it sits in a firewalled
company network), or if you just want to perform some local testing, you can
switch the API key requirement off by setting <code>requireApiKey</code> to <code>false</code>.</p>
<p>Once your API key is properly configured you can start pushing from the command
line:</p>
<pre><code>nuget.exe push {package file} {apikey} -Source http://localhost:50227/api/v2/package 
</code></pre>
<p>As you can see are still running on localhost. It&rsquo;s almost time to publish our
NuGet server to IIS or Azure. Let&rsquo;s first give a look at a couple interesting
options we have in <code>web.config</code>.</p>
<h2 id="allow-overriding-on-push">Allow overriding on Push</h2>
<p>As I mentioned in my ramblings above, a private feed offers some more
control over the feed compared to the public one. On nuget.org you cannot override an
existing package version, period. On you own server you have to option to allow
that. Just set <code>allowOverrideExistingPackageOnPush</code> to <code>true</code> (it is disabled by
default, and for good reasons).</p>
<h2 id="soft-deletes-delist">Soft deletes (delist)</h2>
<p>When a client has a valid API key it can not only push, but also delete
packages. By default the <code>delete</code> command will do just that, delete the package
file from the repository. On your server you can change that behavior and opt
for delisting on <code>delete</code> instead. Just set <code>enableDelisting</code> to <code>true</code>.</p>
<p>Be careful however as a delisted package can still be donwloaded by clients
that explictly specify the version, as correctly reported in the comments for
the option.</p>
<h2 id="change-the-default-folder">Change the default folder</h2>
<p>If you dislike <code>~/Packages</code> as your packages repository, you can set
<code>packagesPath</code> to something other than the default blamk value. This can be
a virtual or physical path.</p>
<h2 id="deploy-to-iis-or-azure">Deploy to IIS or Azure</h2>
<p>There is nothing special about deploying the server application to either IIS
or Azure. It is just a normal web application and we can leverage Visual
Studio&rsquo;s Web Deploy feature to achieve our goal.</p>
<p>In the Solution Explorer right click on the project name and hit Publish. In
the Publish dialog, if you are publishing to Azure select Microsoft App
Service. Sign-if if you need to, and then pick an appropriate service name.</p>
<p><img alt="Ready to deploy on Azure" loading="lazy" src="/images/nuget-server-5.png"></p>
<p>Hit Publish. At the end of the process Edge will open your remote welcome page.</p>
<p><img alt="The NuGet server is up and running on Azure" loading="lazy" src="/images/nuget-server-6.png"></p>
<p>You can start to push packages right away.</p>
<p>If publishing to IIS in the Publish dialog select the Custom option and fill in
server name (IP address works too), site name, username and password. The
Destination URL is not strictly necessary. When I first tried this, pushes were
failing despite the server app being up and running. The issue was that the
application did not have write access to the Packages folder, so you might want
to check that too.</p>
<h2 id="consume-the-feed-from-visual-studio">Consume the feed from Visual Studio</h2>
<p>Once your server is up and running you can add it as a NuGet Source in Visual
Studio. Go to Tools &gt; Options and browse to NuGet Package Manager &gt; Package
Sources. Alternatively, right click on the project in the Solution Explorer,
hit Manage NuGet Packages and then hit the gear icon next to the Package Source
combo.</p>
<p><img alt="NuGet sources in Visual Studio" loading="lazy" src="/images/nuget-server-7.png"></p>
<p>Add your server to the list of available sources. As you can see in my case
I have nuget.org, a local folder and the test server for this article
available. Hit OK once your server has been added. At this point when you go to
the NuGet Package Manager window your Package source combo will also list your
private server and you can install packages from there.</p>
<p><img alt="NuGet server in VS for Mac" loading="lazy" src="/images/nuget-server-8.png"></p>
<p>The screenshot above is from Visual Studio for Mac. It shows the actual private
feed we use for development. All our packages are nicely listed there, with no
interference from the public feed. The public feed is only one click away and,
both on Mac and Windows, you can search on all available feeds at once, wich is
super convenient.</p>
<h2 id="wrap-up">Wrap up</h2>
<p>NuGet.Server makes setting up a private NuGet feed a breeze. It does have a few
drawbacks. If you can live with it being stateless and not allowing for
individual API keys, then this package is probably your best option. The full
NuGet Gallery project is still available if you need more power.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
<p><em>Special thanks to fellow Microsft MVP &amp; Regional Director <a href="https://mvp.microsoft.com/it-it/PublicProfile/8464?fullName=andrea%20saltarello">Andrea
Saltarello</a> for peer reviewing this article before publication.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 1.0 has been released</title>
      <link>https://nicolaiarocci.com/cerberus-1-0-released/</link>
      <pubDate>Thu, 01 Sep 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-1-0-released/</guid>
      <description>&lt;p&gt;After a one year long development cycle I am proud to announce that version 1.0 of &lt;a href=&#34;http://python-cerberus.org&#34;&gt;Cerberus&lt;/a&gt;, the data validation and transformation tool for Python, is finally out. A while ago I wrote an article on the &lt;a href=&#34;http://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/&#34;&gt;new features and breaking changes&lt;/a&gt; that come with it, so please check it out carefully along with the &lt;a href=&#34;http://docs.python-cerberus.org/en/stable/changelog.html&#34;&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I just wish to reiterate my gratitude towards all the contributors to the project. The ones who specifically worked on this awesome release, those who made it all possible, are: Matthew Ellison, Dominik Kellner, David Kirkendall, Damián Nohales, calve, Jonathan Huot, Roman Redkovich and of course the one and the only Frank Sachsenheim, whose role was pivotal to this release.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>After a one year long development cycle I am proud to announce that version 1.0 of <a href="http://python-cerberus.org">Cerberus</a>, the data validation and transformation tool for Python, is finally out. A while ago I wrote an article on the <a href="http://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/">new features and breaking changes</a> that come with it, so please check it out carefully along with the <a href="http://docs.python-cerberus.org/en/stable/changelog.html">changelog</a>.</p>
<p>I just wish to reiterate my gratitude towards all the contributors to the project. The ones who specifically worked on this awesome release, those who made it all possible, are: Matthew Ellison, Dominik Kellner, David Kirkendall, Damián Nohales, calve, Jonathan Huot, Roman Redkovich and of course the one and the only Frank Sachsenheim, whose role was pivotal to this release.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve SDK for .NET v0.2 is out in the wild</title>
      <link>https://nicolaiarocci.com/eve-sdk-for-net-v0-2-is-out-in-the-wild/</link>
      <pubDate>Tue, 02 Aug 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-sdk-for-net-v0-2-is-out-in-the-wild/</guid>
      <description>&lt;p&gt;I just released a long overdue update to &lt;a href=&#34;https://github.com/nicolaiarocci/Eve.NET/&#34;&gt;Eve.NET&lt;/a&gt;. This release marks a significant improvement over the previous one, which was more a prototype than a real package. New features are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PostAsync()&lt;/code&gt; supports bulk inserts&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DeleteAsync()&lt;/code&gt; supports bulk deletes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAsync()&lt;/code&gt; has a &lt;code&gt;softDelete&lt;/code&gt; option to include soft-deleted documents with query results&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAsync()&lt;/code&gt; has a &lt;code&gt;rawQuery&lt;/code&gt; option to pass raw Eve queries to the server&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BearerAuthenticator&lt;/code&gt; class adds support for Bearer Token authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several fixes made it into this release and, most importantly, I switched to portable Profile259 which offers support for the following platforms: Xamarin.iOS, Xamarin.Android, WinPhone 8.1, Windows 8, .NET 4.5+. Yes, that means no more support for .NET 4.0. See the &lt;a href=&#34;https://github.com/nicolaiarocci/Eve.NET/blob/master/CHANGES&#34;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just released a long overdue update to <a href="https://github.com/nicolaiarocci/Eve.NET/">Eve.NET</a>. This release marks a significant improvement over the previous one, which was more a prototype than a real package. New features are as follows:</p>
<ul>
<li><code>PostAsync()</code> supports bulk inserts</li>
<li><code>DeleteAsync()</code> supports bulk deletes</li>
<li><code>GetAsync()</code> has a <code>softDelete</code> option to include soft-deleted documents with query results</li>
<li><code>GetAsync()</code> has a <code>rawQuery</code> option to pass raw Eve queries to the server</li>
<li><code>BearerAuthenticator</code> class adds support for Bearer Token authentication</li>
</ul>
<p>Several fixes made it into this release and, most importantly, I switched to portable Profile259 which offers support for the following platforms: Xamarin.iOS, Xamarin.Android, WinPhone 8.1, Windows 8, .NET 4.5+. Yes, that means no more support for .NET 4.0. See the <a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/CHANGES">changelog</a> for details.</p>
<p>Eve.NET v0.2 is on NuGet so you can install it either from Visual Studio or with the Package Manager console. Enjoy!</p>
<p>If you want to get in touch, I am <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Introducing SimpleObjectCache a simple cross-platform object cache for .NET systems</title>
      <link>https://nicolaiarocci.com/introducing-simpleobjectcache-a-simple-cross-platform-object-cache-for-net-systems/</link>
      <pubDate>Wed, 20 Jul 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introducing-simpleobjectcache-a-simple-cross-platform-object-cache-for-net-systems/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nicolaiarocci/SimpleObjectCache&#34;&gt;SimpleObjectCache&lt;/a&gt; is a very simple permanent, cross-platform, asynchronous key-value object cache for .NET. It comes with built-in &lt;a href=&#34;https://www.sqlite.org&#34;&gt;SQLite 3&lt;/a&gt; support. Alternative backends can be added by implementing the &lt;code&gt;IObjectCache&lt;/code&gt; or &lt;code&gt;IBulkObjectCache&lt;/code&gt; interfaces.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;First, you need to set the &lt;code&gt;ApplicatioName&lt;/code&gt;. This is also going to be the folder where your cache will reside. Depending on the host OS the location of this folder might be different. On Windows it would be something like &lt;code&gt;C:\ProgramData\&amp;lt;ApplicationName&amp;gt;\SimpleObjectCache&lt;/code&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/nicolaiarocci/SimpleObjectCache">SimpleObjectCache</a> is a very simple permanent, cross-platform, asynchronous key-value object cache for .NET. It comes with built-in <a href="https://www.sqlite.org">SQLite 3</a> support. Alternative backends can be added by implementing the <code>IObjectCache</code> or <code>IBulkObjectCache</code> interfaces.</p>
<h2 id="how-it-works">How it works</h2>
<p>First, you need to set the <code>ApplicatioName</code>. This is also going to be the folder where your cache will reside. Depending on the host OS the location of this folder might be different. On Windows it would be something like <code>C:\ProgramData\&lt;ApplicationName&gt;\SimpleObjectCache</code>.</p>
<p>Let’s instantiate SimpleObjectCache so we can use it:</p>
<script src="https://gist.github.com/nicolaiarocci/8ad25dc8a892adb6a7428a3e5177edcd.js"></script>

<p>Now we create a <code>Person</code>, then store it into our cache.</p>
<script src="https://gist.github.com/nicolaiarocci/a45090fde90ce0fb210a1c000c9bd9ae.js"></script>

<p>As we insert an object into the cache we can also set its expiration date:</p>
<script src="https://gist.github.com/nicolaiarocci/61e55e36e4e602a4ef025bf08df6617b.js"></script>

<p>Inserting an object with an already existing key, which we just did, will overwrite the previous object with the same key. Retrieving the object is a matter of providing its key:</p>
<script src="https://gist.github.com/nicolaiarocci/30a890e120b10f0d4258d0e5f34e40f8.js"></script>

<p>To remove the object from the cache we use the <code>Invalidate</code> method:</p>
<script src="https://gist.github.com/nicolaiarocci/303a88046f0ad546f22eed84f45d6099.js"></script>

<p>Bulk inserts are also possible:</p>
<script src="https://gist.github.com/nicolaiarocci/2654b88bc3f7fe818dfa8ac862599728.js"></script>

<p>Note that we just set the Tom and Mike expiration date to yesterday. Now let’s add John again. For him however, we set an expiration date which is bigger than Tom’s and Mike’s:</p>
<script src="https://gist.github.com/nicolaiarocci/abf9444dc7d87b175d6249506d5ef568.js"></script>

<p>The <code>Vacuum</code> method removes expired objects from the cache. So Tom and Mike, whose dates are passed, are going to be purged by the following command:</p>
<script src="https://gist.github.com/nicolaiarocci/729bf7604e06caacffbf761054829c74.js"></script>

<p>Now let’s get all the available <code>Person</code> objects from the cache.</p>
<script src="https://gist.github.com/nicolaiarocci/a69e45d088d6d104ebe20a480405d6ba.js"></script>

<p>Since Tom and Mike are gone, we only got one object back, and that’s our very own little John.</p>
<h2 id="installation">Installation</h2>
<p>SimpleObjectCache is on <a href="https://www.nuget.org/packages/SimpleObjectCache/">NuGet</a>. Run the following command on the Package Manager Console:</p>
<script src="https://gist.github.com/nicolaiarocci/758165b8800d9dba483b8a50373d964c.js"></script>

<p>Or install via the NuGet Package Manager in Visual Studio.</p>
<h2 id="wrapping-it-up">Wrapping it up</h2>
<p>We needed a simple cache that we could use as a component of our cross-platform storage system (more on that in a future post). We wanted the cache to also run seamlessly on the old .NET 4.0 framework. Unfortunately <a href="https://github.com/akavache/Akavache">Akavache</a>, to which this project is blatantly inspired, does not run on .NET4, so I decided to roll out my own simplified alternative. This project also offered a great occasion get my feet wet with bait-and-switch portable classes and a few other interesting challenges.</p>
<p>Currently supported platforms are iOS and Android (Xamarin) and .NET Framework versions 4.0 and .NET 4.5+.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>EveGenie makes Eve schema generation a breeze</title>
      <link>https://nicolaiarocci.com/evegenie-makes-eve-schema-generation-breeze/</link>
      <pubDate>Wed, 15 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/evegenie-makes-eve-schema-generation-breeze/</guid>
      <description>&lt;p&gt;Released by the nice folks at Drud, &lt;a href=&#34;https://github.com/drud/evegenie&#34;&gt;EveGenie&lt;/a&gt; is a tool for making &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; schema generation easier.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eve’s schema definitions are full of features, but can take a good amount of time to create when dealing with lots of complex resources. From our experience, it’s often helpful to describe an endpoint in JSON before creating it as an Eve schema. This allows you to make quick decisions about the structure of your entities without spending time moving schema code around. This is where EveGenie comes in.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Released by the nice folks at Drud, <a href="https://github.com/drud/evegenie">EveGenie</a> is a tool for making <a href="http://python-eve.org">Eve</a> schema generation easier.</p>
<blockquote>
<p>Eve’s schema definitions are full of features, but can take a good amount of time to create when dealing with lots of complex resources. From our experience, it’s often helpful to describe an endpoint in JSON before creating it as an Eve schema. This allows you to make quick decisions about the structure of your entities without spending time moving schema code around. This is where EveGenie comes in.</p></blockquote>
<p>EveGenie saves time by creating a ready to use Python Eve schema from a very simple JSON representation of a set of resources.</p>
<p>Interested? Good! Matt Tucker (<a href="https://twitter.com/ultimateboy">@ultimateboy</a>) has a <a href="http://www.drud.com/evegenie-python-eve-schema-generation-done-fast/">getting started with EveGenie</a> article up for you, so make sure to check it out.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve REST API Framework v0.6.4 now available</title>
      <link>https://nicolaiarocci.com/eve-0-6-4-just-released/</link>
      <pubDate>Wed, 08 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-6-4-just-released/</guid>
      <description>&lt;p&gt;Quick note to let you all know that &lt;a href=&#34;https://pypi.python.org/pypi/Eve/0.6.4&#34;&gt;Eve v0.6.4&lt;/a&gt; is out with a few significant &lt;a href=&#34;http://python-eve.org/changelog#version-0-6-4&#34;&gt;updates&lt;/a&gt;. Thanks to James Stewart for contributing to this release.&lt;/p&gt;
&lt;p&gt;Work on v0.7, which will include MongoDB Aggregation Framework support (&lt;a href=&#34;http://python-eve.org/features.html#mongodb-aggregation-framework&#34;&gt;docs&lt;/a&gt;) and many other &lt;a href=&#34;http://python-eve.org/changelog#version-0-7&#34;&gt;new features&lt;/a&gt;, continues steadily.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quick note to let you all know that <a href="https://pypi.python.org/pypi/Eve/0.6.4">Eve v0.6.4</a> is out with a few significant <a href="http://python-eve.org/changelog#version-0-6-4">updates</a>. Thanks to James Stewart for contributing to this release.</p>
<p>Work on v0.7, which will include MongoDB Aggregation Framework support (<a href="http://python-eve.org/features.html#mongodb-aggregation-framework">docs</a>) and many other <a href="http://python-eve.org/changelog#version-0-7">new features</a>, continues steadily.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Meet Eve-Swagger the swagger.io extension for your Eve powered REST API</title>
      <link>https://nicolaiarocci.com/announcing-eve-swagger/</link>
      <pubDate>Mon, 06 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/announcing-eve-swagger/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nicolaiarocci/eve-swagger&#34;&gt;Eve-Swagger&lt;/a&gt; is a swagger.io extension for &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; powered RESTful APIs. It has been around for a while on GitHub but I never managed to officially release it. So rejoice! it is now available on PyPI.&lt;/p&gt;
&lt;p&gt;But what is Swagger, and why is it useful to your RESTful API? With a Swagger-enabled API you can get interactive documentation, client SDK generation and discoverability, all for free. From &lt;a href=&#34;http://swagger.io&#34;&gt;Swagger website&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Swagger is a simple yet powerful representation of your RESTful API. With the largest ecosystem of API tooling on the planet, thousands of developers are supporting Swagger in almost every modern programming language and deployment environment. With a Swagger-enabled API, you get interactive documentation, client SDK generation and discoverability.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/nicolaiarocci/eve-swagger">Eve-Swagger</a> is a swagger.io extension for <a href="http://python-eve.org">Eve</a> powered RESTful APIs. It has been around for a while on GitHub but I never managed to officially release it. So rejoice! it is now available on PyPI.</p>
<p>But what is Swagger, and why is it useful to your RESTful API? With a Swagger-enabled API you can get interactive documentation, client SDK generation and discoverability, all for free. From <a href="http://swagger.io">Swagger website</a>:</p>
<blockquote>
<p>Swagger is a simple yet powerful representation of your RESTful API. With the largest ecosystem of API tooling on the planet, thousands of developers are supporting Swagger in almost every modern programming language and deployment environment. With a Swagger-enabled API, you get interactive documentation, client SDK generation and discoverability.</p></blockquote>
<p>When Eve-Swagger is installed and properly configured your Eve API exposes
a special <code>/api-docs</code> endpoint which returns a 100% swagger-compliant JSON
response. This JSON can then be processed by the swagger tools like <a href="https://github.com/swagger-api/swagger-ui">Swagger
UI</a> and <a href="http://editor.swagger.io/#/">Swagger Editor</a>. Here we can appreciate Swagger UI providing API
documentation out of the box (click to zoom):</p>
<p><img alt="Swagger UI" loading="lazy" src="/images/Screen-Shot-2016-06-06-at-15.13.04.png"></p>
<p>Like most Eve extensions Eve-Swagger comes as a standard Flask Blueprint and, as such, using it is very simple:</p>
<script src="https://gist.github.com/nicolaiarocci/7720dd28f2e74e77c94edcb487aa5102.js"></script>

<p>Once the blueprint has been registered all you have to do is add a <code>SWAGGER_INFO</code> node to your settings. It maps to a swagger <a href="http://swagger.io/specification/#infoObject">infoObject</a> and contains some simple, human readable information. The extension will also scan your endpoint settings to figure out the API graph and document it. Of course, in order to not to clutter your launch script, you could (and probably should) set <code>SWAGGER_INFO</code> in your <a href="http://python-eve.org/config">configuration file</a>.</p>
<p>Installation is super easy:</p>
<script src="https://gist.github.com/nicolaiarocci/a7d2e3d8451f13907de6347448346c00.js"></script>

<p>This is just version 0.0.2 so many parts might still be moving, but you are encouraged to start using it right away. Also if you appreciate this extension please let me know by either starring it on GitHub or with a tweet or email, so I will know that I should really try hard and allocate more time to this project. As always, feel free to contribute via pull request!</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 1.0 is coming and it is going to be awesome</title>
      <link>https://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/</link>
      <pubDate>Wed, 01 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://python-cerberus.org&#34;&gt;Cerberus&lt;/a&gt; is a lightweight and extensible data validation library for Python. Beta has been around since 2012. During this time Cerberus has been serving as the validation system for &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; core. It has been also adopted by a &lt;a href=&#34;https://github.com/search?q=from+cerberus+import+Validator&amp;amp;type=Code&amp;amp;utf8=%E2%9C%93&#34;&gt;quite a lot&lt;/a&gt; open source projects, averaging around 18K downloads per month on PyPI and collecting some remarkable &lt;a href=&#34;https://speakerdeck.com/nicola/cerberus?slide=56&#34;&gt;endorsements&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All things considered, I would dare to claim that Cerberus is battle tested to death. This is, in fact, one reason why I believe that the time for a canonical and stable release has come. Another reason is that next release is a major one. It brings a ton of important &lt;a href=&#34;http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0&#34;&gt;new features&lt;/a&gt; along with very significant code refactoring and a redesigned, powerful &lt;a href=&#34;http://docs.python-cerberus.org/en/latest/api.html&#34;&gt;API&lt;/a&gt;. Third, next release &lt;a href=&#34;http://docs.python-cerberus.org/en/latest/changelog.html#breaking-changes&#34;&gt;breaks&lt;/a&gt; backward compatibility, and we want to signal that in the version number.&lt;/p&gt;
&lt;p&gt;So next Cerberus release will be 1.0. If you have been following the development this will come as no surprise, as a Release Candidate has been out for a while. As a Cerberus user you will want to take the plunge and upgrade to 1.0 because well, it is just too cool to be true. If new to Cerberus you will also want to adopt 1.0 right away, for the same reason. If you are new however, make sure you get the &lt;a href=&#34;https://cerberus.readthedocs.io/en/latest/usage.html#cerberus-usage&#34;&gt;basics covered&lt;/a&gt; before reading further. By the way, at latest PyCon Italy I gave a talk on Cerberus which also included a preview of several 1.0 features. You can check the &lt;a href=&#34;https://speakerdeck.com/nicola/cerberus&#34;&gt;slides&lt;/a&gt; to get a general idea of the tool, its usage, and upcoming features.&lt;/p&gt;
&lt;p&gt;Let’s now look at some of the relevant features and changes introduced with Cerberus 1.0. For a (mostly) accurate list of changes and new features, have a look at the &lt;a href=&#34;http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0&#34;&gt;changelog&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://python-cerberus.org">Cerberus</a> is a lightweight and extensible data validation library for Python. Beta has been around since 2012. During this time Cerberus has been serving as the validation system for <a href="http://python-eve.org">Eve</a> core. It has been also adopted by a <a href="https://github.com/search?q=from+cerberus+import+Validator&amp;type=Code&amp;utf8=%E2%9C%93">quite a lot</a> open source projects, averaging around 18K downloads per month on PyPI and collecting some remarkable <a href="https://speakerdeck.com/nicola/cerberus?slide=56">endorsements</a>.</p>
<p>All things considered, I would dare to claim that Cerberus is battle tested to death. This is, in fact, one reason why I believe that the time for a canonical and stable release has come. Another reason is that next release is a major one. It brings a ton of important <a href="http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0">new features</a> along with very significant code refactoring and a redesigned, powerful <a href="http://docs.python-cerberus.org/en/latest/api.html">API</a>. Third, next release <a href="http://docs.python-cerberus.org/en/latest/changelog.html#breaking-changes">breaks</a> backward compatibility, and we want to signal that in the version number.</p>
<p>So next Cerberus release will be 1.0. If you have been following the development this will come as no surprise, as a Release Candidate has been out for a while. As a Cerberus user you will want to take the plunge and upgrade to 1.0 because well, it is just too cool to be true. If new to Cerberus you will also want to adopt 1.0 right away, for the same reason. If you are new however, make sure you get the <a href="https://cerberus.readthedocs.io/en/latest/usage.html#cerberus-usage">basics covered</a> before reading further. By the way, at latest PyCon Italy I gave a talk on Cerberus which also included a preview of several 1.0 features. You can check the <a href="https://speakerdeck.com/nicola/cerberus">slides</a> to get a general idea of the tool, its usage, and upcoming features.</p>
<p>Let’s now look at some of the relevant features and changes introduced with Cerberus 1.0. For a (mostly) accurate list of changes and new features, have a look at the <a href="http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0">changelog</a>.</p>
<h2 id="transformation-and-normalization">Transformation and normalization</h2>
<p>Big news in the normalization department. Similar to <code>validated()</code>, the new <code>normalized()</code> method returns a normalized copy of a document without validating it.</p>
<script src="https://gist.github.com/nicolaiarocci/d67e66bd0970225cfdd032952d9ed651.js"></script>

<h3 id="renaming-of-fields">Renaming of Fields</h3>
<p>You can now define a field to be renamed before any further processing.</p>
<script src="https://gist.github.com/nicolaiarocci/19346b40a34a3a99f512d3a9e97744b2.js"></script>

<p>To let a callable rename a field or arbitrary fields, you can define a handler for renaming. If the constraint is a string, it points to a custom method.</p>
<script src="https://gist.github.com/nicolaiarocci/2eddf9ae965e66f7b2ed7bb84453dd2e.js"></script>

<p>If the constraint is an iterable, the value is processed through that chain.</p>
<script src="https://gist.github.com/nicolaiarocci/0b9f72c1e6f480f90cb845adc26b28f5.js"></script>

<h3 id="purging-unknown-fields">Purging Unknown Fields</h3>
<p>After renaming, unknown fields will be purged if the <code>purge_unknown</code> property of a <code>Validator</code> instance is <code>True</code>.</p>
<script src="https://gist.github.com/nicolaiarocci/2bc43cfb27b4148a50a217ee6fae9671.js"></script>

<p>You can set the property per keyword-argument upon initialization or as rule for subdocuments like <code>allow_unknown</code>. The default is <code>False</code>.</p>
<h3 id="default-values">Default Values</h3>
<p>You can set default values for missing fields in the document by using the default rule.</p>
<script src="https://gist.github.com/nicolaiarocci/829129d3a30dcf29aadee2173139690d.js"></script>

<p>You can also define a default setter callable to set the default value dynamically. The callable gets called with the current (sub)document as the only argument. If the constraint is a string, it points to a custom method.</p>
<script src="https://gist.github.com/nicolaiarocci/a9731d22994c23312f9c2569d3c58e02.js"></script>

<h3 id="value-coercion">Value Coercion</h3>
<p>Coercion has been introduced with 0.9. It allows you to apply a callable to a value before the document is validated. The return value of the callable replaces the new value in the document. This can be used to convert values or sanitize data before it is validated.</p>
<script src="https://gist.github.com/nicolaiarocci/85ba0667defc1f54486ce45b851ca548.js"></script>

<p>If the constraint is an iterable, the value is processed through that chain.</p>
<script src="https://gist.github.com/nicolaiarocci/20fd9437713f77d4cc9365162b5675eb.js"></script>

<p>Please note that <code>coerce</code> kicks in with <code>validate()</code>, not with <code>normalized()</code>.</p>
<h2 id="schema-validation">Schema Validation</h2>
<p>This is another area the is seeing a lot of changes and new, powerful things.</p>
<h3 id="registries">Registries</h3>
<p>Schema registries are awesome if your schemas shall include references to themselves (recursion) and if they contain a lot of reused parts and are supposed to be serialized. There are two default registries in the cerberus module namespace. You can use <code>schema_registry</code> to store definitions for schemas which can later be re-used:</p>
<script src="https://gist.github.com/nicolaiarocci/d7bf19da6a6505bacf7a4be7ad0058d1.js"></script>

<p>And you can extend <code>rules_set_registry</code> with rules-sets which can then be referenced in validation schemas:</p>
<script src="https://gist.github.com/nicolaiarocci/c82f6a8e255cd408d02afca8d2be0012.js"></script>

<h3 id="schema-constraints-in-docstrings">Schema Constraints in docstrings</h3>
<p>Validation schemas themselves are validated when passed to the validator or a new set of rules is set for a document’s field. A <code>SchemaError</code> is raised when an invalid validation schema is encountered.</p>
<p>Now you can provide constraints as literal Python expression in the docstring of the rule’s implementing method to validate the arguments given in a schema for that rule. Either the docstring contains solely the literal or the literal is placed at the bottom of the docstring preceded by the following sentence: <code>The rule's arguments are validated against this schema</code>.</p>
<p>The example below is comes directly from Cerberus’ own test suite:</p>
<script src="https://gist.github.com/nicolaiarocci/71575bca60ba1993e5e59cdc3f3a9f1a.js"></script>

<h2 id="validation-rules">Validation Rules</h2>
<h3 id="forbidden"><code>forbidden</code></h3>
<p>Opposite to <code>allowed</code>, this new rule validates if a value is any but one of the defined values:</p>
<script src="https://gist.github.com/nicolaiarocci/b7ea2a0170c2e67e0b1c5d59cff80879.js"></script>

<h3 id="min-max"><code>min</code>, <code>max</code></h3>
<p>Up to 0.9 you could only use <code>min</code> and <code>max</code> to compare numeric types. Now they define minimum and maximum values allowed for any types that implement comparison operators.</p>
<script src="https://gist.github.com/nicolaiarocci/2e356654c5bd0f98f95473bf27ef2d2e.js"></script>

<h3 id="keyschema"><code>keyschema</code></h3>
<p>For better consistency, the <code>propertyschema</code> rule has been renamed to <code>keyschema</code>. This is the counterpart to <code>valueschema</code> and validates the <em>keys</em> of a <code>dict</code>.</p>
<script src="https://gist.github.com/nicolaiarocci/f553cf446a986058a836a08206076573.js"></script>

<h3 id="type"><code>type</code></h3>
<p>Data type validation now also supports the <code>binary</code> type.</p>
<h2 id="breaking-changes">Breaking Changes</h2>
<p>This is a major release which breaks backward compatibility in several ways. Don’t worry, these changes are for the better. However, if you are upgrading, then you should really take the time to read the list of changes in the <a href="http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0">changelog</a> and consider their impact on your codebase, especially so if you have custom validators sitting around. For your convenience, there are also some <a href="http://docs.python-cerberus.org/en/latest/upgrading.html">upgrade notes</a> available.</p>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>Cerberus 1.0 would not exist in its current form without the incredible work done by Frank “<a href="https://github.com/funkyfuture">funkyfuture</a>” Sachsenheim. After his initial, timid, set of v0.9 contributions, Frank went on a rage. He really adopted the project and went on touching on every aspect of it: documentation, new features, proposal, fixes, refactoring, ticket triaging, you-name-it. His efforts have been instrumental in taking the project to the next level. As a token of appreciation for his work, I’m tagging this release with the <code>funkyfuture</code> codename.</p>
<p>Of course he was not alone. Other contributors were Matthew Ellison, Dominik Kellner, Damián Nohales, calve, Roman Redkovich. And then are all the other people who helped by opening tickets and spreading the word around. Thank you all, folks.</p>
<h2 id="closing-notes">Closing notes</h2>
<p>Cerberus 1.0 is an important milestone. I consider the API to be reasonably stable and, once it is released, I plan to let it settle down for a while. Release Candidate will stay out for a couple more weeks, which is ideal for you to experiment a little bit before the final release.</p>
<p>If you are a Eve user you probably see the potential that new Cerberus can offer to your RESTful API, especially in the normalization department. Don’t get too excited though as I do not plan on immediately adding Cerberus 1.0 to Eve. Next Eve release (v0.7), which is also upcoming, will be focused on MongoDB Aggregation Framework and other things. That is more than enough for a major release. I am targeting the following release (v0.8) for Cerberus 1.0 support.</p>
<p>So, have fun with New Cerberus. As usual, please report any issue on the <a href="https://github.com/nicolaiarocci/cerberus/issues">ticket</a> system.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica per la PA v0.2.1</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-per-la-pa-v0-2-1/</link>
      <pubDate>Mon, 23 May 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-per-la-pa-v0-2-1/</guid>
      <description>&lt;p&gt;Ho appena pubblicato su NuGet l’ultimo aggiornamento di &lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/&#34;&gt;FatturaElettronicaPA&lt;/a&gt;, il package .NET per la compilazione e convalida delle fatture elettroniche per la Pubblica Amministrazione. Si tratta della &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronicaPA/0.2.1&#34;&gt;versione 0.2.1&lt;/a&gt; che fa proprie le novità annunciate il 9 Maggio scorso:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A partire dal 9 maggio 2016 sono introdotti nuovi controlli sui file trasmessi al Sistema di Interscambio. Per consentire il necessario adeguamento al nuovo regime di verifiche, fino al 31 luglio 2016 il mancato superamento di uno o più di questi nuovi controlli non comporterà lo scarto del file ma solo una segnalazione che verrà riportata all’interno della Ricevuta di consegna o della Notifica di mancata consegna. Dal 1 agosto 2016 i file che non dovessero superare uno o più di questi controlli verranno scartati.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ho appena pubblicato su NuGet l’ultimo aggiornamento di <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/">FatturaElettronicaPA</a>, il package .NET per la compilazione e convalida delle fatture elettroniche per la Pubblica Amministrazione. Si tratta della <a href="https://www.nuget.org/packages/FatturaElettronicaPA/0.2.1">versione 0.2.1</a> che fa proprie le novità annunciate il 9 Maggio scorso:</p>
<blockquote>
<p>A partire dal 9 maggio 2016 sono introdotti nuovi controlli sui file trasmessi al Sistema di Interscambio. Per consentire il necessario adeguamento al nuovo regime di verifiche, fino al 31 luglio 2016 il mancato superamento di uno o più di questi nuovi controlli non comporterà lo scarto del file ma solo una segnalazione che verrà riportata all’interno della Ricevuta di consegna o della Notifica di mancata consegna. Dal 1 agosto 2016 i file che non dovessero superare uno o più di questi controlli verranno scartati.</p></blockquote>
<p>Se per ora i nuovi controlli non sono vincolanti, lo saranno a partire dal 1 agosto. Poiché si tratta di una serie di convalide sui conteggi consiglio di passare alla versione 0.2.1 al più presto, così da verificare che in effetti le vostre fatture elettroniche siano in linea con le aspettative della PA: potreste avere qualche sorpresa.</p>
<p>Nel nostro caso, per esempio, abbiamo dovuto prendere atto che gli importi imponibili relativi alle aliquote IVA, così come le corrispondenti imposte, devono essere indicati al lordo degli eventuali sconti generali del documento, pena il rifiuto dello stesso da parte del sistema di interscambio. Date una occhiata al <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/blob/master/CHANGES">changelog</a> per l’elenco completo delle novità.</p>
<p>Voglio aggiungere un commento sulle modalità di pubblicazione degli aggiornamenti tecnici da parte di Agenzia Entrate/Sogei. Sebbene siano dotati di data e numero di versione, questi sono da considerarsi, ad essere buoni, puramente indicativi. Per esempio l’attuale <a href="http://www.fatturapa.gov.it/export/fatturazione/sdi/Elenco_Controlli_V1.2.pdf">versione 1.2</a> dell’elenco controlli è stata aggiornata “silenziosamente” un paio di giorni dopo la pubblicazione (hanno aggiunto una tolleranza di 1 Euro al controllo 00422). Così lo sviluppatore incauto che si limiti a controllare la data e il numero di versione del documento rischia di vedersi respingere fatture per lui del tutto corrette, a meno che non di prenda la briga di verificare, riga per riga, la corrispondenza tra la documentazione in suo possesso e quella disponibile sul sito in quel momento. Chiaramente in PA non hanno idea di cosa sia il <a href="http://semver.org/">Semantic Versioning</a>.</p>
<p>Un ringraziamento al mio collega Stefano Gardini. Il suo nome non compare nelle commit ma, quando si stratta di fatturazione e contabilità, è come se ci fosse.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My Crazy Speaking Month</title>
      <link>https://nicolaiarocci.com/crazy-speaking-month/</link>
      <pubDate>Mon, 09 May 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/crazy-speaking-month/</guid>
      <description>&lt;p&gt;April was definitely my crazy Speaking Month. After an almost one year long self-imposed conference hiatus, I was challenged to deliver four different talks, attend two discussion panels, give one live demo and release one interview. All in a three weeks period span. First I went to &lt;a href=&#34;http://www.pycon.it&#34;&gt;PyCon Sette&lt;/a&gt; in Florence. A few days later a plane took me to St. Petersburg, Russia, for &lt;a href=&#34;http://www.it-sobytie.ru/en/events/5862&#34;&gt;PiterPy&lt;/a&gt;. Finally, the next weekend I was in Rome for the &lt;a href=&#34;https://mvp.microsoft.com&#34;&gt;Western Europe Microsoft MVP Community Day&lt;/a&gt;. In the meantime several Channel 9 TecHeroes episodes were due for release. This was of course super exciting. And challenging.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>April was definitely my crazy Speaking Month. After an almost one year long self-imposed conference hiatus, I was challenged to deliver four different talks, attend two discussion panels, give one live demo and release one interview. All in a three weeks period span. First I went to <a href="http://www.pycon.it">PyCon Sette</a> in Florence. A few days later a plane took me to St. Petersburg, Russia, for <a href="http://www.it-sobytie.ru/en/events/5862">PiterPy</a>. Finally, the next weekend I was in Rome for the <a href="https://mvp.microsoft.com">Western Europe Microsoft MVP Community Day</a>. In the meantime several Channel 9 TecHeroes episodes were due for release. This was of course super exciting. And challenging.</p>
<p>This post is not much (or only) about my talks or performance, but hopefully more around the different communities I got a chance to interact with.</p>
<h2 id="pycon-sette-florence">PyCon Sette, Florence</h2>
<p>PyCon Italy is like home to me. Here, back in 2012, I gave my first Python talk which also happened to be my first English talk ever. Back then Italy was hosting EuroPython 2012, the general assembly of the European Python community, so we had people flying in from all over the continent (and beyond). And I was there all alone, a .NET guy who knew no one, pretending to teach pythonistas how to <a href="https://speakerdeck.com/nicola/developing-restful-web-apis-with-python-flask-and-mongodb">properly build a REST API powered by MongoDB and Flask</a>. Talk about putting myself out of my comfort zone. That talk was important for many reasons, I won’t go into them, suffice to say that, without it, the <a href="http://python-eve.org">Eve</a> project would not exist now.</p>
<p>The following years I went back with more talks. After the three booming EuroPython years we saw the number of PyCon attendees drop from the 700s to the about 150 at PyCon Cinque. Following that first post-EuroPython event however the numbers started to raise. Fast. So fast, in fact, that this year we ended up celebrating the all-time high of 575 attendees. An impressive result, as it almost tops EuroPython numbers. We owe a lot to the skill, expertise and braveness of the PyCon Italy organizers. They are simply awesome, and tireless. Such a result, however, also a is a testimony of how strong, vibrant and resilient the Italian community around Python is.</p>
<p>This year I was there to give my first <a href="https://speakerdeck.com/nicola/cerberus">Cerberus talk</a>. The room was packed full, everything went smoothly (at least from my perspective) and when all was done and said I was left with the impression that the project was well received. My only regret is that I totally forgot to submit the talk for the English track. I also took part in the Python Web Framework Royal Rumble, a panel in which Django, Flask, Pyramid and TurboGear champions were to fight each other. I was <a href="https://speakerdeck.com/nicola/flask-web-development-one-drop-at-a-time">defending the Flask flag</a>, and it was a lot of fun.</p>
<p>The Italian Python community is cozy and friendly as always, stronger than ever. PyCon in Florence keeps improving its already high standard. My only suggestion would be to reverse the English/Italian tracks ratio. I would go for an all-English conference with just one track for Italian language. I am sure a lot of guests would flock in from nearby countries. I mean who would not want to visit Florence, and Tuscany Plus, many pythonistas already have very fond memories from the Italian EuroPython years and I am sure they would love to come back.</p>
<h2 id="piterpy-st-petersburg">PiterPy, St. Petersburg</h2>
<p>PiterPy is an important and very well organized Python event which gathers attendees not only from St. Petersburg, but also from other Russian cities and nearby countries.</p>
<p>I was invited by the conference organizers to talk about project Eve. I was honoured, excited and curious to meet fellow pythonistas from the Eastern Europe. Other headliners were Chris Ewing, Gael Varoquaux, Hynek Schlawack, Simone Soldateschi and Fabio Natali. As you can tell, we all have different backgrounds and specialize on different things, as it should be when you want to present your audience with different interesting aspects of your stack of choice.</p>
<p>I did my <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve talk</a> and then even managed to sneak in lightening talk on Cerberus. I was also interviewed by Vladimir Filonov (I think the recording is due out soon) and to my surprise the interview was not on my open source activity but rather on the Italian Python community. It turns out that in Russia they care a lot about the community, and they are eager to know more about other Python communities scattered all around Europe. Freaking awesome, if you ask me.</p>
<p>Organizers were professional and friendly all the time, letting me feel comfortable right from the start. In fact I was just off the plane when I met with Maxim Klymyshyn, who took me from the Airport to the conference location. The venue itself (Original Sokos Olympia Garden, conveniently located close to St. Petersburg’s city center) was probably one of the best, if not the best, conference venue I ever been at. And what about the attendees? They were very welcoming with their international guests and language barrier was not an issue as many of them speak very good English (often better than mine). Be warned however, when given the opportunity they will not hesitate to challenge the unwary speaker with the hardest of questions. I am told (by the attendees themselves) that this is in fact a trait of the Russian people. They won’t be shy when they have something to say. As a speaker, I really appreciated the attitude!</p>
<p>The day after the conference a cultural trip to <a href="https://en.wikipedia.org/wiki/Catherine_Palace">Catherine Palace</a> in Pushkin was planned for both speakers and attendees. That was terrific. Should you go to St. Petersburg, on a business trip or just as a tourist, make sure you visit Catherine Palace. You won’t regret it.</p>
<p>My eternal gratitude goes to Vladimir Shulyak and Dmitry Nazarov for taking me and my new buddy Chris Ewing out for diner and then on a super nice walk around the city center. Special thanks to Serge Matveenko, Diana Lyubavskaya and the rest of the team for inviting us and, most importantly, for putting up such a great event. I am sure PiterPy will soon become a relevant event within the international community.</p>
<h2 id="western-europe-mvp-community-day-rome">Western Europe MVP Community Day, Rome</h2>
<p>This was my first time as a MVP to a Microsoft event. Not only that. This was actually a MVP-only event and I was there to give a talk to experienced MVPs who, for the most part, have been in the program for years. Kind of intimidating, although I was reassured by the fact that my proposal had been voted by the MVP community itself.</p>
<p>Like at my first Python conference years ago I knew no one there, not personally at least, so it took some balls win my shyness and introduce myself to the first person I recognized, that one being <a href="https://mvp.microsoft.com/it-it/PublicProfile/4020723?fullName=Alessandro%20%20Del%20Sole">Alessandro Del Sole</a>, a long time MVP veteran. He and his pals were super nice and only moments after introducing myself to them I was already feeling part of the community. A very empowering feeling. Later during the evening and even more so the following day, at the conference, I got to meet and know a lot of new friends, all very knowledgeable in their craft, which is awesome.</p>
<p>I would say that the focus of the event was about Microsoft’s new openness toward other stacks and communities, which also helped in making me feel comfortable. I gave my <a href="https://speakerdeck.com/nicola/real-life-net-cross-platform">Real Life .NET Cross Platform</a> talk, with good feedback. SimpleCache, which was used as an example project and wasn’t really the main topic, got a lot of interest so I may actually release it on NuGet soon (blog post coming). My highlight for the event though, would be Karen Juhl keynote during which I suddenly realized that a picture of me, along with quotes from <a href="nicolaiarocci.com/look-mum-im-an-mvp/">one of my articles</a>, was being shown on stage. It took me a few seconds to realize what was going on, as it was totally unexpected. That was crazy, and mesmerizing. Later, when I got to talk with Karen, I learned that that very same slide has been used at several MVP events across Europe. So exciting!</p>
<p>The conference was closed by an Open Source Communities Panel, to which I was invited as a member of multiple communities.</p>
<p>The next day I was at the OpenDomus.net event, where I got a chance to repeat my cross platform talk (this time in Italian), and then to give a live demo of Ubuntu Bash on Windows. That one was interesting, and surprising I think, for many attendees. A few days later, with <a href="https://twitter.com/_geniodelmale?lang=it">Lorenzo Barbieri</a>, we recorded a Best of Build 2016 episode on the same topic (link below).</p>
<h2 id="techeroes-interlude">TecHeroes Interlude</h2>
<p>April and March were also the months in which I and Lorenzo Barbieri recorded and released a few MSDN TecHeroes Italy episodes:</p>
<ul>
<li><a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-VSVim-Editor">Vim for Visual Studio</a></li>
<li><a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Python-tools-per-Visual-Studio">Python Tools for Visual Studio</a></li>
<li><a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids">CoderDojo Coding Clubs for Kids</a></li>
<li><a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform">Real Life .NET Cross Platform</a></li>
<li><a href="https://channel9.msdn.com/Shows/Best-of-Build--Italy/Bash-su-Ubuntu-su-Windows">Bash on Ubuntu on Windows</a> (actually a Best of Build episode)</li>
</ul>
<h2 id="wrapping-it-up">Wrapping it up</h2>
<p>As I mentioned at the OSS panel I am lucky to have an active role in more than one community and to work every day with diverse technologies. Now, most of the times the problems tackled by these stacks are, in fact, the same. Besides the obvious differences in semantics, what really changes and is most interesting to me is the approach, the path if you will, taken by each individual stack. For me, being exposed to multiple approaches and therefore getting a chance to appreciate the differences, the pros and cons of each one (which tend to vary depending on the situation at hand) has been invaluable. I could (and probably should) fill a blog post with the things I learned working on Python that I am now using, with profit, in C#. And vice-versa.</p>
<p>And what about the communities? Different communities, again, expose me to different cultures. That is a good thing. Being rooted into a community is great but being active in multiple communities is even better, in essence for the same reasons you’d want to become a polyglot programmer.</p>
<p>So my invite is to get involved once again, no matter how active and fit you are into a stack and its community. Try something totally new, even if it doesn’t really sound like something immediately useful to you. Because you know, cross-pollination is a good thing. And you get to party twice the time, too.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve REST API Framework v0.6.2 is out</title>
      <link>https://nicolaiarocci.com/eve-rest-api-framework-v0-6-2-is-out/</link>
      <pubDate>Mon, 14 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-rest-api-framework-v0-6-2-is-out/</guid>
      <description>&lt;p&gt;Today I released &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; 0.6.2. It includes many fixes and improvements over the previous releases. Areas addressed are CORS management, soft deletes, token authentication, oplog, data validation, and others. Please see the &lt;a href=&#34;http://python-eve.org/changelog&#34;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;Work on v0.7 is also ongoing. It will include new features such as support for the MongoDB Aggregation Framework (&lt;a href=&#34;http://python-eve.org/features.html#mongodb-aggregation-framework&#34;&gt;docs&lt;/a&gt;) and a few breaking changes, so you might want to check it out in advance.&lt;/p&gt;
&lt;p&gt;Special thanks to Arnau Orriols, Cyril Bonnard, Hamdy, Luca Di Gaspero, Manquer, Nick Park, Patrick Decat, Prayag Verma, Ralph Smith, Stratos Gerakakis, Valerie Coffman and Wei Guan who contributed to this release.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released <a href="http://python-eve.org">Eve</a> 0.6.2. It includes many fixes and improvements over the previous releases. Areas addressed are CORS management, soft deletes, token authentication, oplog, data validation, and others. Please see the <a href="http://python-eve.org/changelog">changelog</a> for details.</p>
<p>Work on v0.7 is also ongoing. It will include new features such as support for the MongoDB Aggregation Framework (<a href="http://python-eve.org/features.html#mongodb-aggregation-framework">docs</a>) and a few breaking changes, so you might want to check it out in advance.</p>
<p>Special thanks to Arnau Orriols, Cyril Bonnard, Hamdy, Luca Di Gaspero, Manquer, Nick Park, Patrick Decat, Prayag Verma, Ralph Smith, Stratos Gerakakis, Valerie Coffman and Wei Guan who contributed to this release.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Real Life .NET Cross Platform</title>
      <link>https://nicolaiarocci.com/real-life-net-cross-platform/</link>
      <pubDate>Fri, 11 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/real-life-net-cross-platform/</guid>
      <description>&lt;p&gt;There is a new episode up at Channel9 TecHeroes. It is called &lt;a href=&#34;https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform&#34;&gt;Real Life .NET Cross Platform&lt;/a&gt; and it is about developing production-ready, cross-platform applications with today’s .NET. In the interview we talk about &lt;a href=&#34;https://github.com/CIR2000/Amica.vNext.SimpleCache&#34;&gt;SimpleCache&lt;/a&gt;, an asynchronous, permanent and cross-platform key-value object cache powered by SQLite3. The project is still a work in progress so there is no NuGet package available yet, but it is quite usable already. The &lt;a href=&#34;https://speakerdeck.com/nicola/real-life-net-cross-platform&#34;&gt;talk slides&lt;/a&gt; are also available.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There is a new episode up at Channel9 TecHeroes. It is called <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform">Real Life .NET Cross Platform</a> and it is about developing production-ready, cross-platform applications with today’s .NET. In the interview we talk about <a href="https://github.com/CIR2000/Amica.vNext.SimpleCache">SimpleCache</a>, an asynchronous, permanent and cross-platform key-value object cache powered by SQLite3. The project is still a work in progress so there is no NuGet package available yet, but it is quite usable already. The <a href="https://speakerdeck.com/nicola/real-life-net-cross-platform">talk slides</a> are also available.</p>
]]></content:encoded>
    </item>
    <item>
      <title>CoderDojo interview at Channel 9</title>
      <link>https://nicolaiarocci.com/my-coderdojo-interview-at-chennel-9-techeroes/</link>
      <pubDate>Fri, 04 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/my-coderdojo-interview-at-chennel-9-techeroes/</guid>
      <description>&lt;p&gt;I was recently interviewed at Channel 9 TecHeroes. Topic was CoderDojo, the network of free computer programming clubs for young people. The show is run by Microsoft Italy, so the interview is in Italian. &lt;a href=&#34;https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids&#34;&gt;Enjoy the show&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was recently interviewed at Channel 9 TecHeroes. Topic was CoderDojo, the network of free computer programming clubs for young people. The show is run by Microsoft Italy, so the interview is in Italian. <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids">Enjoy the show</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Look mum, I’m a MVP</title>
      <link>https://nicolaiarocci.com/look-mum-im-an-mvp/</link>
      <pubDate>Sat, 02 Jan 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/look-mum-im-an-mvp/</guid>
      <description>&lt;p&gt;A few hours ago I was notified that I have been awarded with the Microsoft MVP Award for Development Technologies.&lt;/p&gt;
&lt;p&gt;This came totally unexpected. Especially so considering that during the last few years I have been splitting my time between Microsoft and other open source technologies. My public work has mostly been on Python and MongoDB. Yes I also released .NET open source projects in the meantime (more are coming soon) and yes, I wrote a few articles here and on the MSDN Blog, attended Microsoft events and did interviews. But really, I did not expect these activities to have an impact. This is probably why only a couple minutes from learning about the award I was suffering Impostor Syndrome symptoms.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few hours ago I was notified that I have been awarded with the Microsoft MVP Award for Development Technologies.</p>
<p>This came totally unexpected. Especially so considering that during the last few years I have been splitting my time between Microsoft and other open source technologies. My public work has mostly been on Python and MongoDB. Yes I also released .NET open source projects in the meantime (more are coming soon) and yes, I wrote a few articles here and on the MSDN Blog, attended Microsoft events and did interviews. But really, I did not expect these activities to have an impact. This is probably why only a couple minutes from learning about the award I was suffering Impostor Syndrome symptoms.</p>
<p>Now however, as I ponder on the whole issue a little bit, I start to realise how this could probably make (at least some sort of) sense. New Microsoft has been eager to catalyse attention and interest from the open source community and, in a broader sense, from people not yet accustomed to the brand. In light of this, people who have been active in communities other than Microsoft’s and have also been exposed to different technologies, mindsets and approaches to common IT problems could indeed offer some value. Or at least that’s how I am reading it right now.</p>
<p>So a new chapter is unfolding in my twenty-five years long love/hate relationship with Microsoft. It is my intent to live up to this award, for which I am very grateful.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.6.1 has been released</title>
      <link>https://nicolaiarocci.com/eve-0-6-1-has-been-released/</link>
      <pubDate>Thu, 29 Oct 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-6-1-has-been-released/</guid>
      <description>&lt;p&gt;A new version of &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt;, the REST API framework for Humans, has been released today. Following the 0.6 milestone released one month ago, v0.6.1 introduces some fixes and few new important features. Upgrade is strongly encouraged. As always, a &lt;a href=&#34;http://python-eve.org/changelog#version-0-6-1&#34;&gt;changelog&lt;/a&gt; with full list of updates is available.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A new version of <a href="http://python-eve.org">Eve</a>, the REST API framework for Humans, has been released today. Following the 0.6 milestone released one month ago, v0.6.1 introduces some fixes and few new important features. Upgrade is strongly encouraged. As always, a <a href="http://python-eve.org/changelog#version-0-6-1">changelog</a> with full list of updates is available.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My talk at Percona Live 2015</title>
      <link>https://nicolaiarocci.com/my-talk-at-percona-live-2015/</link>
      <pubDate>Fri, 16 Oct 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/my-talk-at-percona-live-2015/</guid>
      <description>&lt;p&gt;The slides of my talk at Percona Live 2015 (Amsterdam) are &lt;a href=&#34;https://speakerdeck.com/nicola/mongodb-and-rest-apis-a-match-made-in-heaven&#34;&gt;online&lt;/a&gt;. It was titled “MongoDB and REST APIs a Match Made in Heaven” and it was meant as an introduction to Mongo, REST principles and the Eve python framework.&lt;/p&gt;
&lt;p&gt;Overall it has been a pleasant experience, although I found that splitting 300 attendees through seven concurrent tracks ultimately led to too much fragmentation. People often found themselves with 2-3 interesting talks all happening simultaneously, and just had to pick one.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The slides of my talk at Percona Live 2015 (Amsterdam) are <a href="https://speakerdeck.com/nicola/mongodb-and-rest-apis-a-match-made-in-heaven">online</a>. It was titled “MongoDB and REST APIs a Match Made in Heaven” and it was meant as an introduction to Mongo, REST principles and the Eve python framework.</p>
<p>Overall it has been a pleasant experience, although I found that splitting 300 attendees through seven concurrent tracks ultimately led to too much fragmentation. People often found themselves with 2-3 interesting talks all happening simultaneously, and just had to pick one.</p>
<p>I could only stay one day so I missed all side events, speakers dinner included, which was a bummer.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Custom endpoint handlers with Eve</title>
      <link>https://nicolaiarocci.com/building-custom-endpoint-handlers-with-eve/</link>
      <pubDate>Mon, 24 Aug 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/building-custom-endpoint-handlers-with-eve/</guid>
      <description>&lt;p&gt;On &lt;a href=&#34;https://stackoverflow.com/questions/24134383/servicing-html-requests-with-eve/&#34;&gt;Stack Overflow&lt;/a&gt; and the Eve &lt;a href=&#34;https://groups.google.com/forum/?hl=en#!topic/python-eve/LM9kZkgq3vA&#34;&gt;mailing list&lt;/a&gt;, but also in my mailbox and even on Twitter, I get a lot of enquiries on how to build custom endpoints within a Eve-powered RESTful application. Now, since within Eve all endpoints are fully customizable, what they really mean is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do I setup endpoints without any binding to a data entity, just connected to a custom method?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;They would like to call something like &lt;code&gt;/mycustomendpoint&lt;/code&gt; and get the response from a method they have defined somewhere in the Python sources. The standard endpoint-entity mapping provided by Eve covers 90% of their needs, but sometimes they just need endpoints that have nothing to do with data entities.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On <a href="https://stackoverflow.com/questions/24134383/servicing-html-requests-with-eve/">Stack Overflow</a> and the Eve <a href="https://groups.google.com/forum/?hl=en#!topic/python-eve/LM9kZkgq3vA">mailing list</a>, but also in my mailbox and even on Twitter, I get a lot of enquiries on how to build custom endpoints within a Eve-powered RESTful application. Now, since within Eve all endpoints are fully customizable, what they really mean is:</p>
<blockquote>
<p>How do I setup endpoints without any binding to a data entity, just connected to a custom method?</p></blockquote>
<p>They would like to call something like <code>/mycustomendpoint</code> and get the response from a method they have defined somewhere in the Python sources. The standard endpoint-entity mapping provided by Eve covers 90% of their needs, but sometimes they just need endpoints that have nothing to do with data entities.</p>
<p>This is very easy to achieve. I’m writing it down so I can point people to this post in the future.</p>
<h2 id="eve-_is_-flask">Eve <em>is</em> Flask</h2>
<p><a href="http://python-eve.org">Eve</a> is a Flask application and I really mean it since it is, in fact, a Flask subclass. Eve adds out-of-the-box <a href="http://python-eve.org/features">RESTful capabilities</a> to the Flask micro-framework. Most of the time you will be happy with just Eve’s own features but remember, the full <a href="http://flask.pocoo.org">Flask</a> (and <a href="http://werkzeug.pocoo.org">Werkzeug</a> at a lower level) features set is also part of your arsenal.</p>
<blockquote>
<p>Whatever you can do with Flask, you can do with Eve</p></blockquote>
<p>So yes, of course you can easily set some functions to be invoked when a custom endpoint is hit with a request. The following snippet is a slightly modified version of Flask’s very own <a href="http://flask.pocoo.org/docs/0.10/quickstart/#a-minimal-application">Quickstart</a> tutorial:</p>
<script src="https://gist.github.com/nicolaiarocci/01ea2cd1068afc99f9e38f0bb9afcabf.js"></script>

<p>By decorating the <code>hello_world</code> method with the <code>route</code> decorator we added a new endpoint to the application. Each time a request to <code>/hello</code> comes in, it will be routed to our custom method. Of course the regular API endpoints (either defined in <code>settings.py</code>, passed as a dict at launch, or registered live by calling the <code>register_resource</code> method) will also be available.</p>
<p>If you have an <a href="http://python-eve.org/authentication.html">Eve authentication class</a> securing regular API endpoints, you can apply it to your custom endpoint too. Just add a <code>requires_auth</code> decorator:</p>
<script src="https://gist.github.com/nicolaiarocci/3fc0379e083266f20faf12b209108aa9.js"></script>

<p>Say that you saved the above snippet as <em>run.py</em> and also have your RESTful endpoints properly <a href="http://python-eve.org/config">configured</a>. Launch the script:</p>
<script src="https://gist.github.com/nicolaiarocci/697f85ee10b7e0c0b601fdd21b171a15.js"></script>

<p>You can now point your browser to <code>http://localhost:5000/hello/</code> and enjoy the application greeting. Or you can consume any other configured API endpoint.</p>
<p>As all of Flask features are at your fingertips you might as well opt for registering a <a href="http://flask.pocoo.org/docs/0.10/blueprints/">blueprint</a>, which is what the awesome <a href="https://github.com/charlesflynn/eve-docs">Eve-Docs</a> extension is doing in order to provide a static HTML <code>/docs</code> endpoint on top of any Eve powered API.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronicaPA for .NET has been updated</title>
      <link>https://nicolaiarocci.com/fatturaelettronicapa-for-net-has-been-updated/</link>
      <pubDate>Tue, 14 Jul 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronicapa-for-net-has-been-updated/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA&#34;&gt;FatturaElettronicaPA&lt;/a&gt; has just been updated to v0.1.4. With this release invoice bodies (&lt;code&gt;FatturaElettronicaBody&lt;/code&gt; items) are also validated. As always, you can install the package directly from &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronicaPA/&#34;&gt;NuGet&lt;/a&gt;. See the &lt;a href=&#34;http://nicolaiarocci.com/fattura-elettronica-open-source/&#34;&gt;original post&lt;/a&gt; for more info. Also don’t forget to check the &lt;a href=&#34;https://github.com/FatturaElettronicaPA&#34;&gt;related projects&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update: v0.1.6 has also been released.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA">FatturaElettronicaPA</a> has just been updated to v0.1.4. With this release invoice bodies (<code>FatturaElettronicaBody</code> items) are also validated. As always, you can install the package directly from <a href="https://www.nuget.org/packages/FatturaElettronicaPA/">NuGet</a>. See the <a href="http://nicolaiarocci.com/fattura-elettronica-open-source/">original post</a> for more info. Also don’t forget to check the <a href="https://github.com/FatturaElettronicaPA">related projects</a>.</p>
<p>Update: v0.1.6 has also been released.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 0.9 has been released</title>
      <link>https://nicolaiarocci.com/cerberus-0-9-has-been-released/</link>
      <pubDate>Tue, 30 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-0-9-has-been-released/</guid>
      <description>&lt;p&gt;A few days ago &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus&#34;&gt;Cerberus 0.9&lt;/a&gt; was released. It includes a bunch of new cool features, let’s browse through some of them.&lt;/p&gt;
&lt;h2 id=&#34;collection-rules&#34;&gt;Collection rules&lt;/h2&gt;
&lt;p&gt;First up is the new set of &lt;code&gt;anyof&lt;/code&gt;, &lt;code&gt;allof&lt;/code&gt;, &lt;code&gt;noneof&lt;/code&gt; and &lt;code&gt;oneof&lt;/code&gt; validation rules. &lt;code&gt;anyof&lt;/code&gt; allows you to list multiple sets of rules to validate against. The field will be considered valid if it validates against one set in the list. For example, to verify that a property is a number between 0 and 10 or 100 and 110, you could do the following:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few days ago <a href="https://github.com/nicolaiarocci/cerberus">Cerberus 0.9</a> was released. It includes a bunch of new cool features, let’s browse through some of them.</p>
<h2 id="collection-rules">Collection rules</h2>
<p>First up is the new set of <code>anyof</code>, <code>allof</code>, <code>noneof</code> and <code>oneof</code> validation rules. <code>anyof</code> allows you to list multiple sets of rules to validate against. The field will be considered valid if it validates against one set in the list. For example, to verify that a property is a number between 0 and 10 or 100 and 110, you could do the following:</p>
<pre><code>&gt;&gt;&gt; schema = {
...     'prop1': {
...         'type': 'number',
...         'anyof': [
...             {'min': 0, 'max': 10}, 
...             {'min': 100, 'max': 110}
...         
...         ]
...     }
... }

&gt;&gt;&gt; doc = {'prop1': 5}
&gt;&gt;&gt; v.validate(document, schema)
True

&gt;&gt;&gt; doc = {'prop1': 105}
&gt;&gt;&gt; v.validate(document, schema)
True

&gt;&gt;&gt; doc = {'prop1': 55}
&gt;&gt;&gt; v.validate(document, schema)
False
</code></pre>
<p><code>allof</code> is the same as <code>anyof</code>, except that all rule collections in the list must validate. Same pattern applies to <code>noneof</code> (no rule in collection must validate) and <code>oneof</code> (only one rule in collection must validate).</p>
<h2 id="type-coercion">Type coercion</h2>
<p>Type coercion allows you to apply a callable to a value before any other validators run. The return value of the callable replaces the new value in the document. This can be used to convert values or sanitize data before it is validated.</p>
<pre><code>&gt;&gt;&gt; v = Validator({'amount': {'type': 'integer'}})
&gt;&gt;&gt; v.validate({'amount': '1'})
False

&gt;&gt;&gt; v = Validator({
...     'amount': {
...         'type': 'integer', 
...         'coerce': int
...     }
... })
&gt;&gt;&gt; v.validate({'amount': '1'})
True
&gt;&gt;&gt; v.document
{'amount': 1}

&gt;&gt;&gt; to_bool = lambda v: v.lower() in ['true', '1']
&gt;&gt;&gt; v = Validator({
...     'flag': {
...         'type': 'boolean', 
...         'coerce': to_bool
...     }
... })
&gt;&gt;&gt; v.validate({'flag': 'true'})
True

&gt;&gt;&gt; v.document
{'flag': True}
</code></pre>
<h2 id="properties-keys-validation">Properties (keys) validation</h2>
<p><code>propertyschema</code> is the counterpart to <code>valueschema</code> (also new, it replaces the now deprecated <code>keyschema</code>) and validates the keys of a dictionary.</p>
<pre><code>&gt;&gt;&gt; schema = 'a_dict': {
...     'type': 'dict', 
...     'propertyschema': {
...         'type': 'string', 
...         'regex': '[a-z]+'
...     }
... }

&gt;&gt;&gt; document = {'a_dict': {'key': 'value'}}
&gt;&gt;&gt; v.validate(document, schema)
True

&gt;&gt;&gt; document = {'a_dict': {'KEY': 'value'}}
&gt;&gt;&gt; v.validate(document, schema)
False
</code></pre>
<h2 id="list-of-types">List of types</h2>
<p>The <code>type</code> rule can now be a list of types, to allow for different type of values for the field.</p>
<pre><code>&gt;&gt;&gt; v = Validator({
...     'quotes': {
...         'type': ['string', 'list']
...     }
... })

&gt;&gt;&gt; v.validate({'quotes': 'Hello world!'})
True

&gt;&gt;&gt; v.validate({'quotes': ['Do not disturb my circles!', 
...                        'Heureka!']})
True

&gt;&gt;&gt; v = Validator({
...     'quotes': {
...         'type': ['string', 'list'], 
...         'schema': {'type': 'string'}
...     }
... })

&gt;&gt;&gt; v.validate({'quotes': 'Hello world!'})
True 

&gt;&gt;&gt; v.validate({'quotes': [1, 'Heureka!']})
False

&gt;&gt;&gt; v.errors
{'quotes': {0: 'must be of string type'}}
</code></pre>
<p>And there is more so make sure you check the <a href="https://cerberus.readthedocs.org/en/latest/#changelog">changelog</a> before upgrading. No breaking changes but there’s at least one deprecation, as mentioned.</p>
<p>Fun fact: Cerberus is currently getting 3x the downloads of his sister project <a href="https://github.com/nicolaiarocci/eve">Eve</a>, the REST API Framework for which the tool was originally conceived. Interesting if you consider that Eve is featuring 10x the GitHub stars. Fun, but not really surprising since Cerberus probably has a broader audience.</p>
<p>Special thanks to Frank Sachsenheim, Tobias Betz, Brett and C.D. Clark III for their valuable contributions to this release.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Monolith vs Microservices</title>
      <link>https://nicolaiarocci.com/monolith-vs-microservices/</link>
      <pubDate>Thu, 04 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/monolith-vs-microservices/</guid>
      <description>&lt;p&gt;I spent the last couple days in Paris with a bunch of smart architects and developers who are about to deal with a complex Monolithic-to-Microservices architecture transition.&lt;/p&gt;
&lt;p&gt;On my flight back to Italy I jotted down a few thoughts on the topic and then, this morning, the first thing that comes up on my newsfeed is &lt;a href=&#34;http://martinfowler.com/bliki/MonolithFirst.html&#34;&gt;Monolith First&lt;/a&gt; by Martin Fowler. Stunning, because the essay content totally resonates with my own notes, so much that it would perfectly serve as a recap for them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I spent the last couple days in Paris with a bunch of smart architects and developers who are about to deal with a complex Monolithic-to-Microservices architecture transition.</p>
<p>On my flight back to Italy I jotted down a few thoughts on the topic and then, this morning, the first thing that comes up on my newsfeed is <a href="http://martinfowler.com/bliki/MonolithFirst.html">Monolith First</a> by Martin Fowler. Stunning, because the essay content totally resonates with my own notes, so much that it would perfectly serve as a recap for them.</p>
<blockquote>
<p>Going directly to a microservices architecture is risky, so consider building a monolithic system first. Split to microservices when, and if, you need it.</p></blockquote>
<p>And also, perhaps more importantly:</p>
<blockquote>
<p>A more common approach is to start with a monolith and gradually peel off microservices at the edges. Such an approach can leave a substantial monolith at the heart of the microservices architecture, but with most new development occurring in the microservices while the monolith is relatively quiescent.</p></blockquote>
<p>I find it fascinating that there is a chance that my notes and the essay were written (by astral coincidence?) in the very same minutes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Composition vs. Inheritance: How to Choose?</title>
      <link>https://nicolaiarocci.com/composition-vs-inheritance-how-to-choose/</link>
      <pubDate>Tue, 26 May 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/composition-vs-inheritance-how-to-choose/</guid>
      <description>&lt;p&gt;Steven Lowe piece on &lt;a href=&#34;http://www.thoughtworks.com/insights/blog/composition-vs-inheritance-how-choose&#34;&gt;Composition vs. Inheritance&lt;/a&gt; is a must read. Just to wet your appetite, let me quote the opening paragraph:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the beginning, there was no inheritance and no composition, only code. And the code was unwieldy, repetitive, blocky, unhappy, verbose, and tired. Copy and Paste were the primary mechanisms of code reuse. Procedures and functions were rare, newfangled gadgets viewed with suspicion. Calling a procedure was expensive! Separating pieces of code from the main logic caused confusion! It was a Dark Time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Steven Lowe piece on <a href="http://www.thoughtworks.com/insights/blog/composition-vs-inheritance-how-choose">Composition vs. Inheritance</a> is a must read. Just to wet your appetite, let me quote the opening paragraph:</p>
<blockquote>
<p>In the beginning, there was no inheritance and no composition, only code. And the code was unwieldy, repetitive, blocky, unhappy, verbose, and tired. Copy and Paste were the primary mechanisms of code reuse. Procedures and functions were rare, newfangled gadgets viewed with suspicion. Calling a procedure was expensive! Separating pieces of code from the main logic caused confusion! It was a Dark Time.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica Open Source: Web Service PA</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-open-source-web-service-pa/</link>
      <pubDate>Thu, 21 May 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-open-source-web-service-pa/</guid>
      <description>&lt;p&gt;&lt;em&gt;this post is about an all-Italian open source release, so it’s going to be in Italian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il progetto &lt;a href=&#34;http://nicolaiarocci.com/fattura-elettronica-open-source/&#34;&gt;Fattura Elettronica Open Source&lt;/a&gt; si è arricchito di un nuovo strumento: &lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.WebServices&#34;&gt;Web Services&lt;/a&gt;. Il namespace &lt;code&gt;FatturaElettronicaPA.WebServices&lt;/code&gt; raccoglie una serie di client C# che consentono di consultare i Web Service per la Fattura Elettronica messi a disposizione dalla Pubblica Amministrazione.&lt;/p&gt;
&lt;p&gt;Sono disegnati in maniera da esporre tutti la stessa interfaccia ed essere al tempo stesso semplici e leggeri. Al momento lavorano in modalità sincrona ma l’obiettivo è di renderli tutti asincroni.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>this post is about an all-Italian open source release, so it’s going to be in Italian</em></p>
<p>Il progetto <a href="http://nicolaiarocci.com/fattura-elettronica-open-source/">Fattura Elettronica Open Source</a> si è arricchito di un nuovo strumento: <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.WebServices">Web Services</a>. Il namespace <code>FatturaElettronicaPA.WebServices</code> raccoglie una serie di client C# che consentono di consultare i Web Service per la Fattura Elettronica messi a disposizione dalla Pubblica Amministrazione.</p>
<p>Sono disegnati in maniera da esporre tutti la stessa interfaccia ed essere al tempo stesso semplici e leggeri. Al momento lavorano in modalità sincrona ma l’obiettivo è di renderli tutti asincroni.</p>
<h2 id="come-usare-i-web-service">Come usare i Web Service</h2>
<p>Prendiamo per esempio il Web Service che consente di convalidare un Codice Univoco di Fatturazione e recuperare le informazioni relative all’ufficio:</p>
<pre><code>var ws = new CodiceUnivocoFatturazioneWebService()

// Authorization Id ricevuto dall'ente.
ws.AuthId = &quot;&lt;auth Id&gt;&quot;;
// Codice univoco dell'ufficio che ci interessa
ws.CodiceUfficio = &quot;KN3VNW&quot;;

ws.PerformRequest();
if (ws.Ufficio == null) return;

// &quot;Ravenna&quot;
Console.WriteLine(ws.Ufficio.Comune);
</code></pre>
<p>Molto semplice. Gli altri WebService (sono sette in tutto) operano secondo lo stesso schema. Ricordo che per l’utilizzo dei Web Services della Pubblica Amministrazione è necessario richiedere una specifica autorizzazione. L’Authorization Id è gratuito ed il rilascio è immediato, ma bisogna compilare un apposito <a href="http://www.indicepa.gov.it/registr-user-ws/ws-registrazione-start.php">questionario</a>.</p>
<h2 id="installazione">Installazione</h2>
<p>FatturaElettronicaPA.WebServices è su <a href="https://www.nuget.org/packages/FatturaElettronicaPA.WebServices/">NuGet</a> quindi tutto quel che serve è eseguire:</p>
<pre><code>PM&gt; Install-Package FatturaElettronicaPA.WebServices
</code></pre>
<p>dalla Package Console, oppure usare il comando equivalente in Visual Studio.</p>
<p>La libreria è una portable class library e gira senza modifiche sui seguenti ambienti: .NET Framework 4.0 e superiori; Xamarin.iOS; Xamarin.Android; Windows Phone 8; Windows Store apps (Windows 8); Silverlight 5.0. Enjoy!</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>On my trip to Microsoft Build 2015</title>
      <link>https://nicolaiarocci.com/on-my-trip-to-microsoft-build-2015/</link>
      <pubDate>Fri, 08 May 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/on-my-trip-to-microsoft-build-2015/</guid>
      <description>&lt;p&gt;Last week I was in San Francisco for Build 2015, the annual conference event held by Microsoft and aimed toward software and web developers. Overall it has been a great experience. I especially enjoyed the opportunity to speak with Microsoft executives, Program Managers and developers about the new stuff they are cooking up and, in general, about that New Microsoft we all have been experiencing as of late (I have a &lt;a href=&#34;http://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/&#34;&gt;guest post&lt;/a&gt; on MSDN Italy on that topic).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last week I was in San Francisco for Build 2015, the annual conference event held by Microsoft and aimed toward software and web developers. Overall it has been a great experience. I especially enjoyed the opportunity to speak with Microsoft executives, Program Managers and developers about the new stuff they are cooking up and, in general, about that New Microsoft we all have been experiencing as of late (I have a <a href="http://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/">guest post</a> on MSDN Italy on that topic).</p>
<p>In this week TecHeroes <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Build-2015-innovazione-e-cambiamento#0m05s">episode</a> I am interviewed along with my buddy <a href="http://www.matteocollina.com/#biography">Matteo Collina</a>. At about 1m 20s in the episode Matteo and I share a few considerations on Open Source projects and technologies that really caught our attention at the conference, and of course on Microsoft in general. It is all in Italian by the way.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Little MongoDB Book 2nd Italian Edition</title>
      <link>https://nicolaiarocci.com/the-little-mongodb-book-2nd-italian-edition/</link>
      <pubDate>Mon, 04 May 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/the-little-mongodb-book-2nd-italian-edition/</guid>
      <description>&lt;p&gt;The second edition of the &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34;&gt;Little MongoDB Book Italian Edition&lt;/a&gt; is finally up. It is aligned to MongoDB 2.6 and includes a much needed introduction to the Aggregation Frameworks. Enjoy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The second edition of the <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/">Little MongoDB Book Italian Edition</a> is finally up. It is aligned to MongoDB 2.6 and includes a much needed introduction to the Aggregation Frameworks. Enjoy.</p>
]]></content:encoded>
    </item>
    <item>
      <title>F# Vs C#</title>
      <link>https://nicolaiarocci.com/f-vs-c/</link>
      <pubDate>Mon, 20 Apr 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/f-vs-c/</guid>
      <description>&lt;p&gt;I have another guest post up at the official MSDN Team Blog. Titled &lt;a href=&#34;http://blogs.msdn.com/b/italy/archive/2015/04/17/f-vs-c.aspx&#34;&gt;F# Versus C#&lt;/a&gt;, it is an attempt at a gentle introduction to F# for the Italian C# developer.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have another guest post up at the official MSDN Team Blog. Titled <a href="http://blogs.msdn.com/b/italy/archive/2015/04/17/f-vs-c.aspx">F# Versus C#</a>, it is an attempt at a gentle introduction to F# for the Italian C# developer.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica Open Source Update</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-open-source-update/</link>
      <pubDate>Fri, 17 Apr 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-open-source-update/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://fatturaelettronicaopensource.org/&#34;&gt;Fattura Elettronica Open Source&lt;/a&gt; has been updated to v0.1.3 a few days ago and is available on &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronicaPA/&#34;&gt;NuGet&lt;/a&gt;. Sources are on &lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA&#34;&gt;GitHub&lt;/a&gt;. It fixes a deserialization issue with the &lt;code&gt;ReadXML&lt;/code&gt; method.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://fatturaelettronicaopensource.org/">Fattura Elettronica Open Source</a> has been updated to v0.1.3 a few days ago and is available on <a href="https://www.nuget.org/packages/FatturaElettronicaPA/">NuGet</a>. Sources are on <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA">GitHub</a>. It fixes a deserialization issue with the <code>ReadXML</code> method.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Talk Python To Me Podcast Episode #1: EVE RESTful APIs for Humans</title>
      <link>https://nicolaiarocci.com/talk-python-to-me-podcast-episode-1-eve-restful-apis-for-humans/</link>
      <pubDate>Wed, 01 Apr 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/talk-python-to-me-podcast-episode-1-eve-restful-apis-for-humans/</guid>
      <description>&lt;p&gt;I was lucky enough be the first guest for the shiny new &lt;a href=&#34;http://www.talkpythontome.com&#34;&gt;Talk Python To Me Podcast&lt;/a&gt; hosted by Michael Kennedy. In this episode we talk about Eve an my other open source releases, which gives us an excuse to touch on a variety of topics such as Polyglot Programming, New Microsoft and the .NET evolution, MongoDB and the Open Source eco-system as seen from the point of view of an old fart who has been spending most of his career in closed systems.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was lucky enough be the first guest for the shiny new <a href="http://www.talkpythontome.com">Talk Python To Me Podcast</a> hosted by Michael Kennedy. In this episode we talk about Eve an my other open source releases, which gives us an excuse to touch on a variety of topics such as Polyglot Programming, New Microsoft and the .NET evolution, MongoDB and the Open Source eco-system as seen from the point of view of an old fart who has been spending most of his career in closed systems.</p>
<p><a href="http://www.talkpythontome.com/episodes/show/1/eve-restful-apis-for-humans"><img alt="Talk Python To Me" loading="lazy" src="/images/Screen-Shot-2015-04-01-at-10.16.08.png"></a></p>
<p>Michael has a great lineup ready for the next episodes, so make sure you subscribe to his show. It is also available on <a href="https://itunes.apple.com/us/podcast/talk-python-to-me-python-conversations/id979020229">iTunes</a>.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>New Releases for Cerberus and Eve</title>
      <link>https://nicolaiarocci.com/new-releases-for-cerberus-and-eve/</link>
      <pubDate>Tue, 17 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/new-releases-for-cerberus-and-eve/</guid>
      <description>&lt;p&gt;Yesterday &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus&#34;&gt;Cerberus 0.8.1&lt;/a&gt; was released with a few little &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus/blob/master/CHANGES&#34;&gt;fixes&lt;/a&gt;, one of them being more a new feature than a fix really: sub-document fields can now be set as field dependencies by using a ‘dotted’ notation.&lt;/p&gt;
&lt;p&gt;So, suppose we set the following validation schema:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;schema = {
  &#39;test_field&#39;: {
    &#39;dependencies&#39;: [
      &#39;a_dict.foo&#39;, 
      &#39;a_dict.bar&#39;
    ]
  },
  &#39;a_dict&#39;: {
    &#39;type&#39;: &#39;dict&#39;,
      &#39;schema&#39;: {
        &#39;foo&#39;: {&#39;type&#39;: &#39;string&#39;},
        &#39;bar&#39;: {&#39;type&#39;: &#39;string&#39;}
      }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, we can validate a document like this:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday <a href="https://github.com/nicolaiarocci/cerberus">Cerberus 0.8.1</a> was released with a few little <a href="https://github.com/nicolaiarocci/cerberus/blob/master/CHANGES">fixes</a>, one of them being more a new feature than a fix really: sub-document fields can now be set as field dependencies by using a ‘dotted’ notation.</p>
<p>So, suppose we set the following validation schema:</p>
<pre><code>schema = {
  'test_field': {
    'dependencies': [
      'a_dict.foo', 
      'a_dict.bar'
    ]
  },
  'a_dict': {
    'type': 'dict',
      'schema': {
        'foo': {'type': 'string'},
        'bar': {'type': 'string'}
      }
  }
}
</code></pre>
<p>Then, we can validate a document like this:</p>
<pre><code>&gt;&gt;&gt; v = Validator(schema)
&gt;&gt;&gt; document = {
      'test_field': 'foobar', 
      'a_dict': {'foo': 'foo'}
    }

&gt;&gt;&gt; v.validate(document, schema)
False

&gt;&gt;&gt; v.errors
{'test_field': &quot;field 'a_dict.bar' is required&quot;}
</code></pre>
<p>This release will not work with Eve 0.5.2 or less so if you want to use Cerberus 0.8.1 with Eve make sure you upgrade to <a href="https://pypi.python.org/pypi/Eve">Eve 0.5.3</a>, released today. By the way, yesterday we hit 2K stargazers and 70 contributors on the <a href="https://github.com/nicolaiarocci/eve">Eve repository</a>, quite the milestone!</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Attention is a Resource</title>
      <link>https://nicolaiarocci.com/attention-is-a-resource/</link>
      <pubDate>Sun, 15 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/attention-is-a-resource/</guid>
      <description>&lt;p&gt;Today, the New York Times’ SundayReview features a great column by Matthew B. Crawford: &lt;a href=&#34;http://www.nytimes.com/2015/03/08/opinion/sunday/the-cost-of-paying-attention.html&#34;&gt;The Cost of Paying Attention&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention is a resource; a person has only so much of it […] What if we saw attention in the same way that we saw air or water, as a valuable resource that we hold in common? Perhaps, if we could envision an “attentional commons,” then we could figure out how to protect it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, the New York Times’ SundayReview features a great column by Matthew B. Crawford: <a href="http://www.nytimes.com/2015/03/08/opinion/sunday/the-cost-of-paying-attention.html">The Cost of Paying Attention</a>.</p>
<blockquote>
<p>Attention is a resource; a person has only so much of it […] What if we saw attention in the same way that we saw air or water, as a valuable resource that we hold in common? Perhaps, if we could envision an “attentional commons,” then we could figure out how to protect it.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Sam Altman on Machine Intelligence</title>
      <link>https://nicolaiarocci.com/sam-altman-on-machine-intelligence/</link>
      <pubDate>Sat, 07 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sam-altman-on-machine-intelligence/</guid>
      <description>&lt;p&gt;Sam Altman has a great short series on the development of superhuman machine intelligence (SMI). &lt;a href=&#34;http://blog.samaltman.com/machine-intelligence-part-1&#34;&gt;Machine intelligence, Part 1&lt;/a&gt; is on why machine intelligence is something that we should be afraid of while &lt;a href=&#34;http://blog.samaltman.com/machine-intelligence-part-2&#34;&gt;Part 2&lt;/a&gt; is on what we should do about it. And then there’s &lt;a href=&#34;http://blog.samaltman.com/technology-predictions&#34;&gt;Technology predictions&lt;/a&gt;, the perfect closer.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Sam Altman has a great short series on the development of superhuman machine intelligence (SMI). <a href="http://blog.samaltman.com/machine-intelligence-part-1">Machine intelligence, Part 1</a> is on why machine intelligence is something that we should be afraid of while <a href="http://blog.samaltman.com/machine-intelligence-part-2">Part 2</a> is on what we should do about it. And then there’s <a href="http://blog.samaltman.com/technology-predictions">Technology predictions</a>, the perfect closer.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I wrote a thing about New Microsoft</title>
      <link>https://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/</link>
      <pubDate>Wed, 04 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/</guid>
      <description>&lt;p&gt;I have a guest post up at the official Italian &lt;a href=&#34;http://blogs.msdn.com/b/italy/archive/2015/03/03/guest-post-una-giornata-all-azure-open-day-in-compagnia-di-una-nuova-microsoft.aspx&#34;&gt;MSDN Team Blog&lt;/a&gt;. It’s about the new Microsoft I met last Wednesday at the Azure Open Day in Milan.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have a guest post up at the official Italian <a href="http://blogs.msdn.com/b/italy/archive/2015/03/03/guest-post-una-giornata-all-azure-open-day-in-compagnia-di-una-nuova-microsoft.aspx">MSDN Team Blog</a>. It’s about the new Microsoft I met last Wednesday at the Azure Open Day in Milan.</p>
]]></content:encoded>
    </item>
    <item>
      <title>So Why Exactly Is HTTP/2 So Cool?</title>
      <link>https://nicolaiarocci.com/so-why-exactly-is-http2-so-cool/</link>
      <pubDate>Tue, 24 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/so-why-exactly-is-http2-so-cool/</guid>
      <description>&lt;p&gt;Today must read is &lt;a href=&#34;https://www.mnot.net/blog/2014/01/30/http2_expectations&#34;&gt;Nine Things to Expect from HTTP/2&lt;/a&gt;, brewed for us by one of the HTTP/2 core designers, Mark Nottingham. Ten well spent minutes of your time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today must read is <a href="https://www.mnot.net/blog/2014/01/30/http2_expectations">Nine Things to Expect from HTTP/2</a>, brewed for us by one of the HTTP/2 core designers, Mark Nottingham. Ten well spent minutes of your time.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.5.2 ‘Giulia’ is Out</title>
      <link>https://nicolaiarocci.com/eve-0-5-2-giulia-is-out/</link>
      <pubDate>Mon, 23 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-5-2-giulia-is-out/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pypi.python.org/pypi/Eve&#34;&gt;Eve 0.5.2&lt;/a&gt; has just been released with a bunch of interesting fixes and documentation updates. See the &lt;a href=&#34;http://python-eve.org/changelog#version-0-5-2&#34;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://pypi.python.org/pypi/Eve">Eve 0.5.2</a> has just been released with a bunch of interesting fixes and documentation updates. See the <a href="http://python-eve.org/changelog#version-0-5-2">changelog</a> for details.</p>
]]></content:encoded>
    </item>
    <item>
      <title>March To Triumph As A Mentor</title>
      <link>https://nicolaiarocci.com/march-triumph-mentor/</link>
      <pubDate>Wed, 11 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/march-triumph-mentor/</guid>
      <description>&lt;p&gt;If you have time to read just one thing today, then make sure it is &lt;a href=&#34;http://emptysqua.re/blog/mentoring/&#34;&gt;March To Triumph As A Mentor&lt;/a&gt;, an essay on Mentoring by A. Jesse Jiryu Davis.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you have time to read just one thing today, then make sure it is <a href="http://emptysqua.re/blog/mentoring/">March To Triumph As A Mentor</a>, an essay on Mentoring by A. Jesse Jiryu Davis.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica Open Source</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-open-source/</link>
      <pubDate>Tue, 10 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-open-source/</guid>
      <description>&lt;p&gt;&lt;em&gt;this post is about an all-italian open source release, so it’s going to be in italian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/FatturaElettronicaPA&#34;&gt;FatturaElettronicaPA&lt;/a&gt; è un nuovo progetto open source che ho rilasciato qualche giorno fa assieme alla &lt;a href=&#34;http://gestionaleamica.com&#34;&gt;mia azienda&lt;/a&gt;. Si tratta di una libreria C# che permette di leggere, scrivere e convalidare le Fatture Elettroniche aderenti alle specifiche del &lt;a href=&#34;http://www.fatturapa.gov.it/export/fatturazione/sdi/Specifiche_tecniche_del_formato_FatturaPA_V1.1.pdf&#34;&gt;sistema di interscambio&lt;/a&gt; della Pubblica Amministrazione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>this post is about an all-italian open source release, so it’s going to be in italian</em></p>
<p><a href="https://github.com/FatturaElettronicaPA">FatturaElettronicaPA</a> è un nuovo progetto open source che ho rilasciato qualche giorno fa assieme alla <a href="http://gestionaleamica.com">mia azienda</a>. Si tratta di una libreria C# che permette di leggere, scrivere e convalidare le Fatture Elettroniche aderenti alle specifiche del <a href="http://www.fatturapa.gov.it/export/fatturazione/sdi/Specifiche_tecniche_del_formato_FatturaPA_V1.1.pdf">sistema di interscambio</a> della Pubblica Amministrazione.</p>
<p>Rilasciata come <a href="https://msdn.microsoft.com/en-us/library/gg597391%28v=vs.110%29.aspx">Portable Class Library</a>, FatturaElettronicaPA gira senza modifiche sui seguenti ambienti:</p>
<ul>
<li>.NET Framework 4.0 e superiori,</li>
<li>Xamarin.iOS</li>
<li>Xamarin.Android</li>
<li>Windows Phone 8</li>
<li>Windows Store apps (Windows 8)</li>
<li>Silverlight 5.0</li>
</ul>
<h2 id="come-usare-la-fattura-elettronica-pa">Come usare la Fattura Elettronica PA</h2>
<p>Usarla è molto semplice. Prima creiamo una istanza di <code>FatturaElettronica</code>:</p>
<pre><code>// instanzia una nuova fattura elettronica
FatturaElettronica fattura = new FatturaElettronica();
</code></pre>
<p>Quindi leggiamo da un file standard SDI. E’ sufficiente passare un <code>XmlReader</code> attivo al metodo <code>FatturaElettronica.ReadXml()</code>:</p>
<pre><code>// lettura da file XML compatibile con formato SDI1.1
var s = new XmlReaderSettings {IgnoreWhitespace = true};
var r = XmlReader.Create(&quot;IT01234567890_11111.xml&quot;, s);
fattura.ReadXml(r);
</code></pre>
<p>La fattura si aggiorna cambiando i valori delle sue proprietà. Qui aggiorniamo il regime fiscale del mittente. Basterebbe una sola riga di codice; usiamo tre linee per una migliore leggibilità:</p>
<pre><code>// modifica valore
var header = fattura.FatturaElettronicaHeader
var prestatore = header.CedentePrestatore
prestatore.DatiAnagrafici.RegimeFiscale = &quot;RF11&quot;;
</code></pre>
<p>Convalidare una fattura è un gioco da ragazzi. La proprietà <code>Error</code> conterrà tutti gli errori eventualmente riscontrati.</p>
<pre><code>// convalida documento
if (!fattura.IsValid) {
    Debug.WriteLine(fattura.Error);
}
</code></pre>
<p>Stampiano la fattura come flusso JSON:</p>
<pre><code>// serializzazione JSON
var json = fattura.ToJson(JsonOptions.Indented);
Debug.WriteLine(json);
</code></pre>
<p>Infine, salvarla su file standard SDI è solo questione di aprire un file con <code>XmlWriter</code> e passarlo al metodo <code>WriteXml</code>:</p>
<pre><code>// serializzazione XML secondo lo standard SDI 1.1
var s = new XmlWriterSettings { Indent = true };

XmlWriter w;
var fileName = &quot;IT01234567890_11111.xml&quot;
using (w = XmlWriter.Create(fileName, s)) {
    fattura.WriteXml(w);
}
</code></pre>
<h2 id="installazione">Installazione</h2>
<p>FatturaElettronicaPA è un package <a href="https://www.nuget.org/packages/FatturaElettronicaPA/">NuGet</a>. Per installarlo è sufficiente usare la Package Console manualmente:</p>
<pre><code>PM&gt; Install-Package FatturaElettronicaPA
</code></pre>
<p>oppure usare la interfaccia di Visual Studio.</p>
<h2 id="progetti-satellite">Progetti satellite</h2>
<p><code>FatturaElettronica</code> deriva a sua volta da <a href="https://github.com/FatturaElettronicaPA/BusinessObjects">BusinessObjects</a>, una classe che implementa la (de)serializzazione e la convalida base.</p>
<p><a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.Forms">FatturaElettronica.Forms</a> è invece una libreria WinForms che provvede una UI per l’editing e la segnalazione degli errori di convalida. Al momento supporta l’intestazione (header) e viene già usato in produzione nel nostro software gestionale:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>In futuro sarebbe utile aggiungere supporto per la visualizzazione e convalida del corpo fattura (Body).</p>
<p><a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.WebServices">FatturaElettronica.WebServices</a> consente di interrogare i diversi Web Service della Pubblica Amministrazione dedicati alla fatturazione elettronica. Tutti i progetti relativi alla fatturazione elettronica sono disponibili su <a href="https://github.com/FatturaElettronicaPA">GitHub</a>.</p>
<h2 id="perché-la-fattura-elettronica-open-source">Perché la Fattura Elettronica Open Source?</h2>
<p>Dallo scorso 6 Giugno 2014 i Ministeri, le Agenzie fiscali, le scuole e gli enti nazionali di previdenza non accettano più fatture emesse o trasmesse in forma cartacea. A partire dal 31 marzo 2015 la stessa disposizione è estesa agli altri Enti a carattere Nazionale ed a tutte le amministrazioni locali.</p>
<p>L’adozione delle fatture elettroniche è in pieno svolgimento e non crediamo di sbagliarci immaginando un futuro non troppo remoto in cui questo formato verrà adottato (per imposizione, come ci pare probabile, o per comodità) anche dal settore privato, diventando di fatto lo standard di riferimento.</p>
<p>Noi ci siamo trovati a dover implementare il supporto per la fatturazione elettronica per gli utenti di <a href="http://gestionaleamica.com">Amica 10</a>, il nostro software gestionale. Abbiamo pensato che questa fosse una buona occasione per rendere libero il nostro lavoro così che chiunque possa utilizzarlo per mettersi rapidamente al passo e magari decidere di dare una mano in uno dei tanti modi possibili: <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/issues">segnalando problemi</a>, <a href="https://github.com/FatturaElettronicaPA">contribuendo direttamente</a> al progetto, o semplicemente parlandone in giro.</p>
<p>Il software è migliore quando è condiviso.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>On Sustainable Open Source Management</title>
      <link>https://nicolaiarocci.com/sustainable-open-source-management/</link>
      <pubDate>Fri, 06 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sustainable-open-source-management/</guid>
      <description>&lt;p&gt;Tom Christie has some very good things to say on how to successfully maintain an open source project without losing sanity.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Truth one: There are, and will always be, a non-finite number of possible valid issues to address. Your code can always be better polished, your APIs better defined, and your project more fully featured. Your documentation can always be better. The ecosystem within which your project lives is constantly evolving. You will never run out of things you could work on. Ever.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Tom Christie has some very good things to say on how to successfully maintain an open source project without losing sanity.</p>
<blockquote>
<p>Truth one: There are, and will always be, a non-finite number of possible valid issues to address. Your code can always be better polished, your APIs better defined, and your project more fully featured. Your documentation can always be better. The ecosystem within which your project lives is constantly evolving. You will never run out of things you could work on. Ever.</p>
<p>Truth two: You have finite resources. Damn.</p></blockquote>
<p>If you are an open source maintainer, contributor or even a user do yourself a favour and <a href="http://www.dabapps.com/blog/sustainable-open-source-management/">read what Tom has to say</a> on the subject. Tom is the creator and maintainer of the Django REST Framework, a hugely successful open source project so he really knows what he’s talking about. And for what is worth, his conclusions mirror mines.</p>
<p>On a completely unrelated note, I met Tom at EuroPython 2014. He was so nice to come and meet me minutes after I was done delivering my <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">REST API for Humans</a> talk. Good vibes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How about a Sentinel for your Flask Application?</title>
      <link>https://nicolaiarocci.com/a-sentinel-for-your-flask-applications/</link>
      <pubDate>Wed, 04 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/a-sentinel-for-your-flask-applications/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nicolaiarocci/flask-sentinel&#34;&gt;Flask-Sentinel&lt;/a&gt; is a OAuth2 Server implementation of the Resource Owner Password Credentials Grant pattern described in &lt;a href=&#34;http://tools.ietf.org/html/rfc6749#section-1.3.3&#34;&gt;Section 1.3.3 of RFC 6749&lt;/a&gt;. It is powered by Flask-Oauthlib, Redis and MongoDB and is bundled as a Flask extension so it can be used to add OAuth2 capabilities to an existing application.&lt;/p&gt;
&lt;p&gt;So what is the Resource Owner Password Credentials Grant pattern? According to the official RFC:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The resource owner password credentials (i.e., username and password) can be used directly as an authorization grant to obtain an access token. The credentials should only be used when there is a high degree of trust between the resource owner and the client (e.g., the client is part of the device operating system or a highly privileged application).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/nicolaiarocci/flask-sentinel">Flask-Sentinel</a> is a OAuth2 Server implementation of the Resource Owner Password Credentials Grant pattern described in <a href="http://tools.ietf.org/html/rfc6749#section-1.3.3">Section 1.3.3 of RFC 6749</a>. It is powered by Flask-Oauthlib, Redis and MongoDB and is bundled as a Flask extension so it can be used to add OAuth2 capabilities to an existing application.</p>
<p>So what is the Resource Owner Password Credentials Grant pattern? According to the official RFC:</p>
<blockquote>
<p>The resource owner password credentials (i.e., username and password) can be used directly as an authorization grant to obtain an access token. The credentials should only be used when there is a high degree of trust between the resource owner and the client (e.g., the client is part of the device operating system or a highly privileged application).</p></blockquote>
<p>A typical use case would be when the remote API maintainer controls the client application. Say that you have a REST API being consumed by your own iOS, Android, WinPhone, desktop or web applications. Users register to your service by creating their accounts. Then, they consume the service using your applications.</p>
<blockquote>
<p>Even though this grant type requires direct client access to the resource owner credentials, the resource owner credentials are used for a single request and are exchanged for an access token. This grant type can eliminate the need for the client to store the resource owner credentials for future use, by exchanging the credentials with a long-lived access token or refresh token.</p></blockquote>
<p>So let’s get back at the proprietary client scenario. The user has just installed the application on his/her device. On first run he/she is asked to provide his/her username and password. These are sent to the OAuth2 server through a SSL/TLS encrypted channel. If the user is registered for the service and the client id, which has also been sent along with the user credentials, is recognised, then the server sends back a valid access token. Otherwise responds with a <code>401 Unhautorized</code>.</p>
<p>From now on the application will only be using the access token for all requests until, eventually, the token expires. If that happens, the cycle repeats. Please note that in this scenario the client does not need to (and probably should not) store the username and/or password on the local cache. The User Credentials pattern usually relies on long lived tokens so asking again for username and password is not a big deal (you could also opt for permanent, revokable tokens.)</p>
<p>Flask-Sentinel provides two endpoints: one for token creation which defaults to <code>/oauth/token</code> and is consumed by clients, and another for users and clients management, accessible at <code>/oauth/management</code>:</p>
<!-- raw HTML omitted -->
<p>Note that the password is hashed and salted on the server, so no plain password is stored on either sides of the channel.</p>
<p>Only existing users and recognised clients will be provided an access token. A typical token request would be as follows:</p>
<pre><code>$ curl -k -X POST -d \
  &quot;client_id=9qFbZD4udTzFVYo0u5UzkZX9iuzbdcJDRAquTfRk&amp;
   grant_type=password&amp;
   username=jonas&amp;
   password=pass&quot; \
   &lt;api_url&gt;/oauth/token
</code></pre>
<p>And the response would be like so:</p>
<pre><code>{
    &quot;access_token&quot;: &quot;NYODXSR8KalTPnWUib47t5E8Pi8mo4&quot;, 
    &quot;token_type&quot;: &quot;Bearer&quot;, 
    &quot;refresh_token&quot;: &quot;s6L6OPL2bnKSRSbgQM3g0wbFkJB4ML&quot;, 
    &quot;scope&quot;: &quot;&quot;
}
</code></pre>
<p>The client can now use the access token to access protected API endpoints:</p>
<pre><code>$ curl -k -H \
  &quot;Authorization:Bearer NYODXSR8KalTPnWUib47t5E8Pi8mo4&quot; \
  &lt;api_url&gt;/endpoint

200 OK
</code></pre>
<p>There are a number of configuration options of course, for example you can change the url of token and management endpoints, set token expiration, setup database connection, stuff like that. Redis is used to store active access tokens, allows for optimal performance.</p>
<p>While you can use Flask-Sentinel to extend an existing API, you might want to instance it as a stand-alone Flask application to optimize for scalability. You would end up with a distributed network of three different (micro)services: the OAuth2 server, the resouces API with protected endpoints as needed, and the Redis instance bridging the two. Check out the <a href="https://github.com/nicolaiarocci/flask-sentinel">project page</a> on GitHub for details.</p>
<p>Of course Flask-Sentinel integrates seamlessly with any <a href="http://python-eve.org">Eve</a> powered REST API. Check out the <a href="https://github.com/nicolaiarocci/eve-oauth2">Eve-OAuth2</a> sample, a fork of the original Eve-Demo project with a couple protected endpoints and a static HTML page, also protected.</p>
<p>The project is very new and lacks a few little things, but I suspect it is already usable even at this stage. Enjoy!</p>
<p>If you want to get in touch, I am <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why Microservices Matter</title>
      <link>https://nicolaiarocci.com/microservices-matter/</link>
      <pubDate>Wed, 21 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/microservices-matter/</guid>
      <description>&lt;p&gt;In spite of being a marketing spin and link bait, Heroku &lt;a href=&#34;https://blog.heroku.com/archives/2015/1/20/why_microservices_matter&#34;&gt;article on microservices&lt;/a&gt; does a pretty good job at explaining why microservices matter and, at a very high level, what challenges they pose.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, microservices aren’t a silver bullet, and they won’t make a sluggish IT organization fast. While individual services become more robust and less complex, the overall system takes on the many challenges of distributed systems at the network level. Despite their challenges, they’re here to stay because they map better than anything else to the software landscape of the future: parallel development, platform-as-a-service deployment, and ubiquitous use.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In spite of being a marketing spin and link bait, Heroku <a href="https://blog.heroku.com/archives/2015/1/20/why_microservices_matter">article on microservices</a> does a pretty good job at explaining why microservices matter and, at a very high level, what challenges they pose.</p>
<blockquote>
<p>However, microservices aren’t a silver bullet, and they won’t make a sluggish IT organization fast. While individual services become more robust and less complex, the overall system takes on the many challenges of distributed systems at the network level. Despite their challenges, they’re here to stay because they map better than anything else to the software landscape of the future: parallel development, platform-as-a-service deployment, and ubiquitous use.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Better Pull Requests</title>
      <link>https://nicolaiarocci.com/better-pull-requests/</link>
      <pubDate>Fri, 16 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/better-pull-requests/</guid>
      <description>&lt;p&gt;I am not a big fan of top tens but &lt;a href=&#34;http://blog.ploeh.dk/2015/01/15/10-tips-for-better-pull-requests/&#34;&gt;10 Tips for Better Pull Requests&lt;/a&gt; is well worth reading.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A good Pull Request involves more than just some code. In most cases, there’s one or more reviewer(s) involved, who will have to review your Pull Request in order to evaluate whether it’s a good fit for inclusion in the code base. Not only must you produce good code, but you must also cater to the person(s) doing the review.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am not a big fan of top tens but <a href="http://blog.ploeh.dk/2015/01/15/10-tips-for-better-pull-requests/">10 Tips for Better Pull Requests</a> is well worth reading.</p>
<blockquote>
<p>A good Pull Request involves more than just some code. In most cases, there’s one or more reviewer(s) involved, who will have to review your Pull Request in order to evaluate whether it’s a good fit for inclusion in the code base. Not only must you produce good code, but you must also cater to the person(s) doing the review.</p>
<p>Here’s a list of tips to make your Pull Request better. It isn’t exhaustive, but I think it addresses some of the more important aspects of creating a good Pull Request.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.5.1 Released</title>
      <link>https://nicolaiarocci.com/eve-0-5-1-released/</link>
      <pubDate>Fri, 16 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-5-1-released/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pypi.python.org/pypi/Eve&#34;&gt;Eve 0.5.1&lt;/a&gt; was just released with a &lt;a href=&#34;http://python-eve.org/changelog#version-0-5-1&#34;&gt;couple fixes&lt;/a&gt; to 0.5 (which was released earlier this week.) Don’t be surprised. Going forward I’m striving for a much faster release cycle, especially so when it comes to fixes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://pypi.python.org/pypi/Eve">Eve 0.5.1</a> was just released with a <a href="http://python-eve.org/changelog#version-0-5-1">couple fixes</a> to 0.5 (which was released earlier this week.) Don’t be surprised. Going forward I’m striving for a much faster release cycle, especially so when it comes to fixes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Internet’s Own Boy</title>
      <link>https://nicolaiarocci.com/internet-own-boy-aaron-swartz/</link>
      <pubDate>Wed, 14 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/internet-own-boy-aaron-swartz/</guid>
      <description>&lt;p&gt;I wasn’t aware that &lt;a href=&#34;https://www.youtube.com/watch?v=vXr-2hwTk58&#34;&gt;The Internet’s Own Boy: The Story of Aaron Swartz&lt;/a&gt; is now available with a Creative Common license, free for everyone to enjoy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I wasn’t aware that <a href="https://www.youtube.com/watch?v=vXr-2hwTk58">The Internet’s Own Boy: The Story of Aaron Swartz</a> is now available with a Creative Common license, free for everyone to enjoy.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Announcing Eve-SQLAlchemy the official SQL extension for the Eve REST Framework</title>
      <link>https://nicolaiarocci.com/announcing-eve-sqlalchemy-the-official-sql-extension-for-the-eve-rest-framework/</link>
      <pubDate>Tue, 13 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/announcing-eve-sqlalchemy-the-official-sql-extension-for-the-eve-rest-framework/</guid>
      <description>&lt;p&gt;Powered by SQLAlchemy and good intentions, &lt;a href=&#34;https://github.com/RedTurtle/eve-sqlalchemy&#34;&gt;Eve-SQLAlchemy&lt;/a&gt; is an official &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; extension which allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services with SQL backends.&lt;/p&gt;
&lt;p&gt;As with all Eve extensions, once installed with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pip install eve-sqlalchemy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;using Eve-SQLAlchemy is very simple:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from eve import Eve
from eve_sqlalchemy import SQL

app = Eve(data=SQL)
app.run()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a fresh virtualenv (of course you are using virtualenvs, right?) the install will also setup Eve and all its dependencies for you. For a complete tutorial you can visit the Eve-SQLAlchemy &lt;a href=&#34;http://eve-sqlalchemy.readthedocs.org/&#34;&gt;Support Website&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Powered by SQLAlchemy and good intentions, <a href="https://github.com/RedTurtle/eve-sqlalchemy">Eve-SQLAlchemy</a> is an official <a href="http://python-eve.org">Eve</a> extension which allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services with SQL backends.</p>
<p>As with all Eve extensions, once installed with</p>
<pre><code>$ pip install eve-sqlalchemy
</code></pre>
<p>using Eve-SQLAlchemy is very simple:</p>
<pre><code>from eve import Eve
from eve_sqlalchemy import SQL

app = Eve(data=SQL)
app.run()
</code></pre>
<p>On a fresh virtualenv (of course you are using virtualenvs, right?) the install will also setup Eve and all its dependencies for you. For a complete tutorial you can visit the Eve-SQLAlchemy <a href="http://eve-sqlalchemy.readthedocs.org/">Support Website</a>.</p>
<p>If you have been following the Eve development you probably know that the original plan was to release SQL support within the Eve core, alongside with the native MongoDB layer. In fact, in a <a href="http://nicolaiarocci.com/open-source-and-code-responsibility/">long rant</a> on open source and code responsibility I took the chance to outline the path forward.</p>
<p>However, if you check the discussion which spread in the comments below that post you can see how both my friend and fellow MongoDB Master <a href="http://www.flaper87.com/">Flavio</a> and the main contributor to the sqlalchemy branch <a href="https://github.com/amleczko">Andrew</a> were suggesting that a plugin system for data layers might be more appropriate. Not coincidentally that was easy to accomplish since the Eve data layer system was designed precisely with that goal in mind, right from the start.</p>
<p>So, to make a long story short, in agreement with Andrew who volountereed for the task, we changed plans. He refactored the sqlalchemy branch into a separate repository… and then the official Eve SQL extension was born. This approach also allows the extension and Eve to develop asynchronously which is ideal for a faster release cycle.</p>
<p>I like this setup so much that, if in time it shows to be as good as I think it will be, I will probably want to experiment with taking the MongoDB layer out of Eve core too. So with Eve 0.6 MongoDB support would still be preinstalled along with core (so nothing changes as first time user experience) but, being a separate package, users could easily switch to a different driver as they need, still keeping their Eve setup as light as possible.</p>
<p>So if you are willing to help with the development of a mature SQL driver please feel free to join Andrew and other contributors. Your help is more than welcome. Allow me thank them all individually, for the work they’ve been doing on the SQL code is absolutely amazing: Andrew Mleczko, Tomasz Jezierski (Tefnet), Bruce Frederiksen, Jacopo Sabbatini and Peter Zinng.</p>
<p>Get <a href="https://pypi.python.org/pypi/Eve-SQLAlchemy/0.1">Eve-SQLAlchemy v0.1</a> while it’s hot!</p>
<p>If you want to get in touch, I am <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.5 released today</title>
      <link>https://nicolaiarocci.com/eve-0-5-released-today/</link>
      <pubDate>Mon, 12 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-5-released-today/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; v0.5 was released today. &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus&#34;&gt;Cerberus&lt;/a&gt; v0.8 only a few days ago. A whole lot of new features, changes and fixes are coming with these releases so make sure to check the &lt;a href=&#34;http://blog.python-eve.org/eve-05-released&#34;&gt;official release post&lt;/a&gt; to gather all the news.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://python-eve.org">Eve</a> v0.5 was released today. <a href="https://github.com/nicolaiarocci/cerberus">Cerberus</a> v0.8 only a few days ago. A whole lot of new features, changes and fixes are coming with these releases so make sure to check the <a href="http://blog.python-eve.org/eve-05-released">official release post</a> to gather all the news.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to: Add custom JeSuisCharlie header to API responses</title>
      <link>https://nicolaiarocci.com/how-to-add-a-je-suis-charlie-header-to-api-responses/</link>
      <pubDate>Mon, 12 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/how-to-add-a-je-suis-charlie-header-to-api-responses/</guid>
      <description>&lt;p&gt;A lot of servers have been including a &lt;code&gt;JeSuisCharlie&lt;/code&gt; header with their responses. If you haven’t already, try with Charlie Hebdo site itself:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -I charliehebdo.fr
Date: Mon, 12 Jan 2015 15:56:13 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 221
Connection: keep-alive
Location: http://www.charliehebdo.fr/index.html
Vary: Accept-Encoding
X-Charlie-fr: Je suis toujours Charlie.
X-Charlie-en: I am still Charlie.
X-Charlie-es: Todavia soy Charlie.
X-Charlie-de: Ich bin immer Charlie.
X-Charlie-ro: Inca sunt Charlie.
X-Charlie-cz: Jsem stale Charlie.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I find this to be a great way for us techies to somehow contribute and show support for the ongoing anti-terrorism campaign. So if you feel like doing it here is a quick rundown on how to serve custom headers with your Eve-powered REST API. It is actually a very easy task to accomplish.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A lot of servers have been including a <code>JeSuisCharlie</code> header with their responses. If you haven’t already, try with Charlie Hebdo site itself:</p>
<pre><code>$ curl -I charliehebdo.fr
Date: Mon, 12 Jan 2015 15:56:13 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 221
Connection: keep-alive
Location: http://www.charliehebdo.fr/index.html
Vary: Accept-Encoding
X-Charlie-fr: Je suis toujours Charlie.
X-Charlie-en: I am still Charlie.
X-Charlie-es: Todavia soy Charlie.
X-Charlie-de: Ich bin immer Charlie.
X-Charlie-ro: Inca sunt Charlie.
X-Charlie-cz: Jsem stale Charlie.
</code></pre>
<p>I find this to be a great way for us techies to somehow contribute and show support for the ongoing anti-terrorism campaign. So if you feel like doing it here is a quick rundown on how to serve custom headers with your Eve-powered REST API. It is actually a very easy task to accomplish.</p>
<p>Eve provides <a href="http://python-eve.org/features.html#event-hooks">its own set</a> of callback hooks but since we don’t need fine-grained control (we are good with including the new header with all responses), this time we will leverage Flask’s <a href="http://flask.pocoo.org/snippets/53/">native</a> callback system instead.</p>
<pre><code>@app.after_request
def after_request(response):
    response.headers.add('X-Charlie', 'Je Suis Charlie.')
    response.headers.add('X-Ahmed', 'Je Suis Ahmed.')
    return response
</code></pre>
<p>A simple run script would then look something like:</p>
<pre><code>from eve import Eve
app = Eve()

@app.after_request
def after_request(response):
    response.headers.add('X-Charlie', 'Je Suis Charlie.')
    response.headers.add('X-Ahmed', 'Je Suis Ahmed.')
    return response

if __name__ == '__main__':
    app.run()
</code></pre>
<p>All API responses now include the custom headers:</p>
<pre><code>$ curl http://localhost:5000
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 141
Server: Eve/0.5 Werkzeug/0.9.6 Python/2.7.8
Date: Mon, 12 Jan 2015 15:39:36 GMT
X-Charlie: Je Suis Charlie.
X-Ahmed: Je Suis Ahmed.
</code></pre>
<p>If you want to see it in action try sending a GET request with <code>curl</code>, <code>Postman</code> or similar tool to the Eve <a href="http://eve-demo.herokuapp.com/">demo instance</a> (<a href="https://github.com/nicolaiarocci/eve-demo/blob/master/run.py">source</a>). Remember Eve is a Flask subclass so whatever works with Flask generally works with Eve too.</p>
<p>If you want to get in touch, I am <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Interfaces out of Laziness</title>
      <link>https://nicolaiarocci.com/interfaces-laziness/</link>
      <pubDate>Sat, 10 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/interfaces-laziness/</guid>
      <description>&lt;p&gt;Robert C. Martin is at it &lt;a href=&#34;http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html&#34;&gt;again&lt;/a&gt; this time targeting the (infamous?) &lt;code&gt;Interface&lt;/code&gt; construct in a funny way. As both a C# and Python coder I couldn’t agree more. Also, let me quote my fellow polyglot developer &lt;a href=&#34;http://wthwdik.wordpress.com/&#34;&gt;Nicola Musatti&lt;/a&gt; who went all out on the topic:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some of us have known that for the best part of the last 20 years 😉&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>Robert C. Martin is at it <a href="http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html">again</a> this time targeting the (infamous?) <code>Interface</code> construct in a funny way. As both a C# and Python coder I couldn’t agree more. Also, let me quote my fellow polyglot developer <a href="http://wthwdik.wordpress.com/">Nicola Musatti</a> who went all out on the topic:</p>
<blockquote>
<p>Some of us have known that for the best part of the last 20 years 😉</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>On Reusable Software</title>
      <link>https://nicolaiarocci.com/on-reusable-software/</link>
      <pubDate>Thu, 08 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/on-reusable-software/</guid>
      <description>&lt;p&gt;Jos de Jong has a &lt;a href=&#34;http://josdejong.com/blog/2015/01/06/code-reuse/&#34;&gt;great concise write-up&lt;/a&gt; on pitfalls and excesses in building reusable software.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jos de Jong has a <a href="http://josdejong.com/blog/2015/01/06/code-reuse/">great concise write-up</a> on pitfalls and excesses in building reusable software.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Validating user objects with Cerberus</title>
      <link>https://nicolaiarocci.com/validating-user-objects-cerberus/</link>
      <pubDate>Mon, 05 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/validating-user-objects-cerberus/</guid>
      <description>&lt;p&gt;People keep telling me that they want to validate class and instance attributes (object properties) with &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus&#34;&gt;Cerberus&lt;/a&gt;. While it certainly wasn’t conceived with that goal in mind, it is actually very possible to leverage both the Python &lt;a href=&#34;https://docs.python.org/2/reference/datamodel.html&#34;&gt;data model&lt;/a&gt; and Cerberus &lt;a href=&#34;http://cerberus.readthedocs.org/en/latest/#custom-validators&#34;&gt;extensibility&lt;/a&gt; to achieve object validation.&lt;/p&gt;
&lt;h2 id=&#34;nuts--bolts&#34;&gt;Nuts &amp;amp; Bolts&lt;/h2&gt;
&lt;p&gt;Let’s say that we have a simple class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; class Person(object):
...     pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We create a &lt;code&gt;Person&lt;/code&gt; instance and add a few properties and values:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>People keep telling me that they want to validate class and instance attributes (object properties) with <a href="https://github.com/nicolaiarocci/cerberus">Cerberus</a>. While it certainly wasn’t conceived with that goal in mind, it is actually very possible to leverage both the Python <a href="https://docs.python.org/2/reference/datamodel.html">data model</a> and Cerberus <a href="http://cerberus.readthedocs.org/en/latest/#custom-validators">extensibility</a> to achieve object validation.</p>
<h2 id="nuts--bolts">Nuts &amp; Bolts</h2>
<p>Let’s say that we have a simple class:</p>
<pre><code>&gt;&gt;&gt; class Person(object):
...     pass
</code></pre>
<p>We create a <code>Person</code> instance and add a few properties and values:</p>
<pre><code>&gt;&gt;&gt; p = Person()
&gt;&gt;&gt; p.name = &quot;bill&quot;
&gt;&gt;&gt; p.age = 44
</code></pre>
<p>Now let’s instance a Cerberus Validator and set up some validation rules for it:</p>
<pre><code>&gt;&gt;&gt; from Cerberus import Validator
&gt;&gt;&gt; schema = {
...     'name': {'type': 'string'},
...     'age': {'type': 'integer', 'min': 0}
... }
&gt;&gt;&gt; v = Validator(schema)
</code></pre>
<p>As you probably know already, all Python user objects have a <code>__dict__</code> magic method which exposes class and instance attributes as a dictionary. This means that we can also query our class like this:</p>
<pre><code>&gt;&gt;&gt; p.__dict__
{'name': 'bill', 'age': 44}

&gt;&gt;&gt; p.__dict__['age']
44
</code></pre>
<p>You see where we are going with this: we can exploit the <code>__dict__</code> method in order to let Cerberus perform validation on our object:</p>
<pre><code>&gt;&gt;&gt; v.validate(p.__dict__)
True
</code></pre>
<p>Validation succeeds because current attribute values do not break any rule. However, if we break the rules we do get what we deserve:</p>
<pre><code>&gt;&gt;&gt; p.age = -1
&gt;&gt;&gt; v.validate(p.__dict__)
False

&gt;&gt;&gt; v.errors
{'age': 'min value is 0'}
</code></pre>
<p>This works, but is somewhat clumsy. We can do better.</p>
<h2 id="a-custom-object-validator">A Custom Object Validator</h2>
<p>How about letting the Validator do the work for us? We could subclass the standard Validator and extend it to natively support object validation.</p>
<pre><code>&gt;&gt;&gt; class ObjectValidator(Validator):
...     def validate_object(self, obj):
...         return self.validate(obj.__dict__)
...

&gt;&gt;&gt; v = ObjectValidator(schema)
&gt;&gt;&gt; v.validate_object(p)
False

&gt;&gt;&gt; v.errors
{'age': 'min value is 0'}

&gt;&gt;&gt; p.age = 44
&gt;&gt;&gt; v.validate_object(p)
True
</code></pre>
<p>Much better. But what happens if we add a new property and then validate the object?</p>
<pre><code>&gt;&gt;&gt; p.lastname = 'white'
&gt;&gt;&gt; v.validate_object(p)
False

&gt;&gt;&gt; v.errors
{'lastname': 'unknown field'}
</code></pre>
<p>Validation fails because by default unknown fields are not allowed. This might not be the desired behaviour. If this is the case, we simply need to update the helper method in our custom validator class:</p>
<pre><code>&gt;&gt;&gt; class ObjectValidator(Validator):
...     def validate_object(self, obj):
...         self.allow_unknown = True
...         return self.validate(obj.__dict__)

&gt;&gt;&gt; v.validate_object(p)
True
</code></pre>
<p>By setting <code>allow_unknown</code> to <code>True</code> we <a href="http://cerberus.readthedocs.org/en/latest/#allowing-the-unknown">let unknown fields be ignored</a> by validation. If we are not concerned by state changes between calls we might conveniently choose to move the setting of <code>allow_unknown</code> to the <code>__init__</code> method so it gets executed only once.</p>
<p>Looks good so far. We can validate simple objects. But what about complex ones like those exposing other objects as attributes? This is going to require some more tinkering.</p>
<h2 id="validating-complex-objects">Validating Complex Objects</h2>
<p>It would be super handy if we could add support for an <code>object</code> data type and then provide a validation schema for it, like we already do with the <code>dict</code> and <code>list</code> types. A revised validation schema would then look like this:</p>
<pre><code>&gt;&gt;&gt; schema = {
...     'name': {'type': 'string'},
...     'age': {'type': 'integer', 'min': 0},
...     'address': {
...         'type': 'object',
            'schema': {
...             'street': {'type': 'string'},
...             'zip': {'type': 'integer'}
...         }
...     }
... }
</code></pre>
<p>We could then validate it like so:</p>
<pre><code>&gt;&gt;&gt; class Address
...     pass

&gt;&gt;&gt; addr = Address()
&gt;&gt;&gt; addr.street = 'Lexington'
&gt;&gt;&gt; addr.zip = 50238
&gt;&gt;&gt; p.address = addr

&gt;&gt;&gt; v.validate_object(p)
True

&gt;&gt;&gt; p.address.zip = 'not a number'
&gt;&gt;&gt; v.validate_object(p)
False

&gt;&gt;&gt; v.errors
{'address': {'zip': 'must be of integer type'}}
</code></pre>
<p>It turns out this is also very achievable. We can leverage Cerberus <a href="http://cerberus.readthedocs.org/en/latest/#adding-new-data-types">data type extensibility model</a> to add support for the <code>object</code> type. Then it is just a matter of handling the new type when validating the <code>schema</code> rule. I’m not going into details here but you can check <a href="https://gist.github.com/nicolaiarocci/829c98eb5f8b4e9c96c1">Validating complex objects with Cerberus</a>, a trivial implementation I posted as a GitHub gist.</p>
<h2 id="closing-note">Closing note</h2>
<p>You might be wondering why don’t I add object validation to Cerberus core. Actually, I don’t rule out this possibility but see I like to keep tools as simple, targeted and focused as possible. Besides, there are other object validation tools out there, so adding a new flavour does not seem very useful to me (but let me know if you feel otherwise.) Though as we have seen, if you want to validate user objects with Cerberus, you can do that easily enough.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Some Thoughts on the new .NET (Redux)</title>
      <link>https://nicolaiarocci.com/some-thoughts-on-the-new-net-redux/</link>
      <pubDate>Thu, 04 Dec 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/some-thoughts-on-the-new-net-redux/</guid>
      <description>&lt;p&gt;Like all those involved with the .NET ecosystem I’ve been slowly digesting the recent news on the whole thing going open source and cross platform. I’ve been jogging down a few notes in light of a future blog post, but then Jeremy Miller came out with his own &lt;a href=&#34;http://jeremydmiller.com/2014/12/02/some-thoughts-on-the-new-net/&#34;&gt;Some Thoughts on the New .NET&lt;/a&gt; which is almost exactly the post I wanted to write. So when he writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’ve started to associate .Net “classic” with seemingly constant aggravations like strong naming conflicts, csproj file merge hell, slow compilation, slow nuget restores, and how absurdly heavyweight and bloated that Visual Studio.Net has become over the years.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Like all those involved with the .NET ecosystem I’ve been slowly digesting the recent news on the whole thing going open source and cross platform. I’ve been jogging down a few notes in light of a future blog post, but then Jeremy Miller came out with his own <a href="http://jeremydmiller.com/2014/12/02/some-thoughts-on-the-new-net/">Some Thoughts on the New .NET</a> which is almost exactly the post I wanted to write. So when he writes:</p>
<blockquote>
<p>I’ve started to associate .Net “classic” with seemingly constant aggravations like strong naming conflicts, csproj file merge hell, slow compilation, slow nuget restores, and how absurdly heavyweight and bloated that Visual Studio.Net has become over the years.</p></blockquote>
<p>It is me. No it’s actually Jeremy but really it’s me. I also share his concerns on the future OSS .NET community him:</p>
<blockquote>
<p>So much of .Net is open source now and they even take contributions. Awesome, great, but my very first reaction was that it doesn’t matter much because <strong>the .Net community as a whole isn’t as participatory as other communities</strong> and that would have to change before ASP.Net vNext being OSS matters. It’ll be interesting to me to see if that changes over time.</p></blockquote>
<p>I’m very involved with the Python language and its community. I released <a href="http://nicolaiarocci.com/opensource/">open source projects</a> for both platforms and frankly I’ve been shocked by the difference in culture between the two communities. I am really hoping that, in due time, .NET going open source will also cause its community to evolve as a whole.</p>
<p>And what about coding on a Mac (or Linux for the matter)? He goes on with:</p>
<blockquote>
<p>After a couple years now of using a Mac, I’d really prefer to stay on that side of things and hopefully give my Windows VM much more time off. Mac OS being a first class citizen for the new .Net and the progress on the OmniSharp tools for Sublime or MacVim is going to make the new ASP.Net vNext runtime a much easier sell in my shop.</p></blockquote>
<p>I’ve been working on a Mac for years, confining Windows on a VM, doing Python with Vim as much as possible. My God I love Vim. My Visual Studio runs VsVim (which is open source by the way). Even my Xamarin Studio on OSX runs in vi mode (which sucks unfortunately). I would never go back to a Windows machine but that does not mean that I don’ want to use C# or F#. Even these days most of my coding is C# in XS/OSX or Vim with OmniSharp, a project I’ve been experimenting with since when the plugin for Vim was released. So native .NET on OSX and Unix? Yes please.</p>
<p>I am in the process of writing a C# iOS application. The data layer is SQLite encapsulated in a Portable Class so we can use it on both Windows and iOS. The HTTP/REST client is also portable, <a href="http://nicolaiarocci.com/introducing-eve-net-httprest-client-humans/">open source</a> and consumed on both platforms. And now even the mobile UI is C# and portable between Android, iOS and Windows Phone thanks to Xamarin.Forms. If you ask me, the future looks bright.</p>
<p>You should read Jeremy post on <a href="http://jeremydmiller.com/2014/12/02/some-thoughts-on-the-new-net/">his site</a>.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Introducing Eve.NET the HTTP/REST Client for Humans™</title>
      <link>https://nicolaiarocci.com/introducing-eve-net-httprest-client-humans/</link>
      <pubDate>Thu, 27 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introducing-eve-net-httprest-client-humans/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nicolaiarocci/Eve.NET&#34;&gt;Eve.NET&lt;/a&gt; is a simple HTTP and REST client for Web Services powered by the &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve Framework&lt;/a&gt;. It leverages both &lt;code&gt;System.Net.HttpClient&lt;/code&gt; and &lt;code&gt;Json.NET&lt;/code&gt; to provide the best possible Eve experience on the .NET platform.&lt;/p&gt;
&lt;p&gt;Written and maintained by the same author of the Eve Framework itself, Eve.NET is delivered as a portable library (PCL) and runs seamlessly on .NET4, Mono, Xamarin.iOS, Xamarin.Android, Windows Phone 8 and Windows 8. We use Eve.NET internally to power our iOS, Web and Windows applications.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/nicolaiarocci/Eve.NET">Eve.NET</a> is a simple HTTP and REST client for Web Services powered by the <a href="http://python-eve.org">Eve Framework</a>. It leverages both <code>System.Net.HttpClient</code> and <code>Json.NET</code> to provide the best possible Eve experience on the .NET platform.</p>
<p>Written and maintained by the same author of the Eve Framework itself, Eve.NET is delivered as a portable library (PCL) and runs seamlessly on .NET4, Mono, Xamarin.iOS, Xamarin.Android, Windows Phone 8 and Windows 8. We use Eve.NET internally to power our iOS, Web and Windows applications.</p>
<p><em>And now please forgive me while I take you on a quick motivational, strongly opinionated, probably boring and overzealous detour</em></p>
<hr>
<h2 id="python-and-c-motherfucker-do-you-speak-it-">Python and C# Motherfucker, Do You Speak It? *</h2>
<p>If you don’t then well, you should consider doing just that. Especially so these days, with C# and the whole .NET platform going open source and cross platform. Actually, thanks to technologies like Mono and Xamarin (also based on Mono) we have been able to run C# code on all major platforms for a while: iOS, Android, OSX, Linux, Windows, Windows Phone, you-name-it. And what’s even better, on mobile platforms C# is compiled to native so performance is a non-issue.</p>
<p>What makes C# a perfect match for a REST API is precisely that: it’s ubiquity. You can have a portable client library like Eve.NET which runs seamlessly (and untouched) on all these mobile desktop and server platforms.</p>
<p>If you already have a Web Service running on Eve and are now looking at the client side of things then well, you should consider C# and Eve.NET because you know, you can’t have a native iOS app written in Python anyway. On the other hand if you are a C#/.NET shop consider this: you can have a powerful Web Service up and running in minutes (even if you don’t grok Python yet – trust me on that) <em>and</em> a complete out-of-the-box, cross platform client library ready to go with it.</p>
<p>A few years ago I gave a talk about leaving my Comfort Zone (**) and getting out of my .NET nest. That opened the path to Python, MongoDB, Node and so many other technologies and best practices and, what’s even more relevant, most of what I learned down that path I ended up using in my .NET projects in the long run. But the point I’m trying to make is don’t be afraid of change, it can only improve your skills making you a better all-around professional programmer.</p>
<p>Never mind the naysayers. Polyglot is the way.</p>
<hr>
<p>(*) I’m paraphrasing Zed A. Shaw’s <a href="http://programming-motherfucker.com/">Programming, Motherfucker</a>. You should get a T-Shirt by the way. They are so cool.</p>
<p>(**) Since then there have been plenty of talks on the same subject. Mine was an 5 minutes ignite talk and was in Italian, so you probably don’t care (it’s on my <a href="http//nicolaiarocci.com/talks">Talks</a> page anyway).</p>
<hr>
<p><em>Back to business now</em>.</p>
<h2 id="usage">Usage</h2>
<p>Initialization is as simple as instantiating a new client and providing it with the web service entry point.</p>
<pre><code>// Initialize and set API address.
var client = new EveClient();
client.BaseAddress = new Uri(&quot;http://api.com&quot;);

// Set target resource for subsequent requests.
client.ResourceName = &quot;companies&quot;;
</code></pre>
<p>Getting a list of objects is pretty straightforward:</p>
<pre><code>// List&lt;T&gt;
companies = await client.GetAsync&lt;Company&gt;();

// Objects changed since DateTime.
var ifModifiedSince = DateTime.Now.AddDays(-1);
companies = await 
  client.GetAsync&lt;Company&gt;(ifModifiedSince);

// Refresh an object
company = await client.GetAsync&lt;Company&gt;(company);

// Raw, conditional GET request
var companyId = &quot;507c7f79bcf86cd7994f6c0e&quot;;
var eTag = &quot;7776cdb01f44354af8bfa4db0c56eebcb1378975&quot;;

company = await 
  client.GetAsync&lt;Company&gt;(&quot;companies&quot;, companyId, eTag);
</code></pre>
<p>Other CRUD operations are easy too:</p>
<pre><code>// Create (POST)
company = await 
  client.PostAsync&lt;Company&gt;(
    new Company { Name = &quot;MyCompany&quot; }
  );

// Update (PUT)
company.Name = &quot;YourCompany&quot;;
var result = await client.PutAsync&lt;Company&gt;(company);

// Delete (DELETE)
var result = await client.DeleteAsync(company);
</code></pre>
<p>As you can see all methods are Async and return full object instances parsing JSON in and out on for you. If you need more control you can query the <code>HttpResponse</code> property to inspect the original JSON, response headers, status code, etc.</p>
<p>Behind the scenes <a href="http://python-eve.org/features#data-integrity-and-concurrency-control">data integrity and concurrency control</a> are transparently handled so for example <code>PutAsync</code> performs a <code>If-Match</code> check and same happens with <code>DeleteAsync</code>. On <code>PostAsync</code> new objects are returned with fresh meta-fields such as <code>ETag</code>, <code>DateCreated</code>, <code>DateUpdated</code> and <code>UniqueId</code>. Mapping object properties to JSON fields and Eve metafields is just a matter of setting the <code>JSonPropertyAttribute</code> and <code>RemoteAttribute</code>:</p>
<pre><code>public abstract class BaseClass
{
  [JsonProperty(&quot;_id&quot;)]
  [Remote(Meta.DocumentId)]
  public string UniqueId { get; set; }

  [JsonProperty(&quot;_etag&quot;)]
  [Remote(Meta.ETag)]
  public string ETag { get; set; }

  [JsonProperty(&quot;_updated&quot;)]
  [Remote(Meta.LastUpdated)]
  public DateTime Updated { get; set; }

  [JsonProperty(&quot;_created&quot;)]
  [Remote(Meta.DateCreated)]
  public DateTime Created { get; set; }   
}

public class Company : BaseClass
{
  [JsonProperty(&quot;n&quot;)]
  public string Name { get; set; }

  [JsonProperty(&quot;p&quot;)]
  public string Password { get; set; }
}
</code></pre>
<p>For a complete list of usage examples see the <a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/README.md">README</a></p>
<h2 id="current-status-and-license">Current Status and License</h2>
<p>Eve.NET is a <a href="http://nicolaiarocci.com">Nicola Iarocci</a> and <a href="http://gestionaleamica.com">Gestionali Amica</a> open source project distributed under the <a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/LICENSE.txt">BSD license</a>. It is a work in progress but it’s pretty stable already. It is <a href="https://www.nuget.org/packages/Eve.NET/">available on NuGet</a> as a pre-release package. The test suite can be run against a local Eve instance or, if you don’t grok Python yet, you can use a free test instance which is available online, see the <a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/README.md">README</a> for details.</p>
<p>Did you read this far? Well thank you! And please, consider showing your appreciation by starring the project on <a href="https://github.com/nicolaiarocci/Eve.NET">GitHub</a>. It feels so lonely out there.</p>
<p>If you want to get in touch, I’m <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Obligation of The Programmer</title>
      <link>https://nicolaiarocci.com/obligation-programmer/</link>
      <pubDate>Tue, 18 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/obligation-programmer/</guid>
      <description>&lt;p&gt;Robert C.Martin, of &lt;!-- raw HTML omitted --&gt;Clean Code&lt;!-- raw HTML omitted --&gt; fame, has something to say on the role of we programmers in today’s society.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We rule the world.&lt;/p&gt;
&lt;p&gt;We don’t quite understand this yet. More importantly, the world doesn’t quite understand it yet. Our civilization doesn’t quite realize how dependent it has become on software — on us.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;He goes as far as suggesting a programmer’s code of conduct of sorts. Food for thought I guess, although I suspect we’re too much of a wild and scattered bunch for something like that to really stick.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Robert C.Martin, of <!-- raw HTML omitted -->Clean Code<!-- raw HTML omitted --> fame, has something to say on the role of we programmers in today’s society.</p>
<blockquote>
<p>We rule the world.</p>
<p>We don’t quite understand this yet. More importantly, the world doesn’t quite understand it yet. Our civilization doesn’t quite realize how dependent it has become on software — on us.</p></blockquote>
<p>He goes as far as suggesting a programmer’s code of conduct of sorts. Food for thought I guess, although I suspect we’re too much of a wild and scattered bunch for something like that to really stick.</p>
<p>Nonetheless, he raises a very good point about the predominance of software in our society and the risk that soon or later someone will wake up and attempt to impose some sort of regulation on the profession.</p>
<p>Read it all at the <a href="http://blog.cleancoder.com/uncle-bob/2014/11/15/WeRuleTheWorld.html">Clean Coder Blog</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why Don’t More People Work As Programmers?</title>
      <link>https://nicolaiarocci.com/dont-people-work-programmers/</link>
      <pubDate>Thu, 06 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dont-people-work-programmers/</guid>
      <description>&lt;p&gt;This originally appeared on Quora and is well worth reading.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Becoming a good programmer is incredibly difficult and it doesn’t happen quickly. We can’t expect to plant some trees and have 2000-year-old redwoods grow overnight, regardless of the demand for them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://www.forbes.com/sites/quora/2014/10/31/why-dont-more-people-work-as-programmers/&#34;&gt;Why Don&amp;rsquo;t More People Work As Programmers? – Forbes&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This originally appeared on Quora and is well worth reading.</p>
<blockquote>
<p>Becoming a good programmer is incredibly difficult and it doesn’t happen quickly. We can’t expect to plant some trees and have 2000-year-old redwoods grow overnight, regardless of the demand for them.</p></blockquote>
<p>via <a href="http://www.forbes.com/sites/quora/2014/10/31/why-dont-more-people-work-as-programmers/">Why Don&rsquo;t More People Work As Programmers? – Forbes</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Open Source and Code Responsibility</title>
      <link>https://nicolaiarocci.com/open-source-and-code-responsibility/</link>
      <pubDate>Tue, 21 Oct 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/open-source-and-code-responsibility/</guid>
      <description>&lt;p&gt;Last week I was speaking at an Open Source panel at &lt;a href=&#34;http://www.bettersoftware.it&#34;&gt;Better Software 2014&lt;/a&gt;, and one of the topics that we touched was code responsibility. This is an important topic for anyone who is maintaining an open source project, especially when it comes to the process of reviewing and accepting code contributions.&lt;/p&gt;
&lt;p&gt;At some point during the debate, I argued that when a maintainer merges a pull request, he (or she) implicitly agrees on being responsible for that code. That seemed to strike some surprise into most attendees.&lt;/p&gt;
&lt;p&gt;Yes, in theory any contributor is just a ping away so in case trouble arises one can always reach him, or her. Unfortunately this is not always the case. While some contributors will fully embrace your project and keep helping after their initial contribution, truth is that a good number of them will just move on, never to be seen again.&lt;/p&gt;
&lt;p&gt;There’s nothing wrong with that. Not everyone has spare time to devote to your project, which is perfectly fine. It is natural for most people to contribute what they need to a project and then go on their way. Actually, one could argue that most projects grow and prosper precisely thanks to this kind of contributions.&lt;/p&gt;
&lt;p&gt;However this attitude can become an incumbent when big chunks of code get merged, usually as new (big) features. Good practices advice against merging huge pull requests. In fact they are rare and when they do come, it is a good idea to ask for them to be split into smaller ones. But no matter the format, a huge contribution is likely to hit a project one day or another. It might even come from more than one person: a disconnected and distributed team of contributors who have been patiently tinkering on a side branch or a fork for example. When this happens, and provided that the contribution is worth merging, the maintainer should then ask him/herself the obvious question: &lt;em&gt;am I willing to deal with the consequences of this merge?&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last week I was speaking at an Open Source panel at <a href="http://www.bettersoftware.it">Better Software 2014</a>, and one of the topics that we touched was code responsibility. This is an important topic for anyone who is maintaining an open source project, especially when it comes to the process of reviewing and accepting code contributions.</p>
<p>At some point during the debate, I argued that when a maintainer merges a pull request, he (or she) implicitly agrees on being responsible for that code. That seemed to strike some surprise into most attendees.</p>
<p>Yes, in theory any contributor is just a ping away so in case trouble arises one can always reach him, or her. Unfortunately this is not always the case. While some contributors will fully embrace your project and keep helping after their initial contribution, truth is that a good number of them will just move on, never to be seen again.</p>
<p>There’s nothing wrong with that. Not everyone has spare time to devote to your project, which is perfectly fine. It is natural for most people to contribute what they need to a project and then go on their way. Actually, one could argue that most projects grow and prosper precisely thanks to this kind of contributions.</p>
<p>However this attitude can become an incumbent when big chunks of code get merged, usually as new (big) features. Good practices advice against merging huge pull requests. In fact they are rare and when they do come, it is a good idea to ask for them to be split into smaller ones. But no matter the format, a huge contribution is likely to hit a project one day or another. It might even come from more than one person: a disconnected and distributed team of contributors who have been patiently tinkering on a side branch or a fork for example. When this happens, and provided that the contribution is worth merging, the maintainer should then ask him/herself the obvious question: <em>am I willing to deal with the consequences of this merge?</em></p>
<p>In fact this is the exact scenario I’m dealing with right now. The <a href="http://python-eve.org">Eve</a> project has always been a MongoDB shop. Since its inception however people have been asking if (when) SQL support was going to be added. I think we were in Alpha when someone started contributing SQL code. Over time I ended up devoting a specific branch to this feature. Several people have been hacking at it since then, and what a splendid job they did! To say that it was a huge commitment is an understatement but, in time, they managed to deliver. So now we have this awesome <a href="https://github.com/nicolaiarocci/eve/tree/sqlalchemy">sqlalchemy branch</a> which is feature complete and ready to be merged ahead of the new Eve release. We’re talking 4K+ lines of code and 44 files changed. Code quality is not under discussion. I know that several companies and individuals have been using that branch in production with good success, even when it still was at its early stages.</p>
<p>This is very exciting as adding SQL support has a good chance to greatly improve the audience of the project. At the same time however, I’m a little bit nervous if not scared, and I have been for a while. Am I ready to deal with the consequences of this supermerge? Inevitably SQLAlchemy tickets will be opened and Stack Overflow questions will be asked. SQL-related pull requests will come in and mailing list posts will flock. To be honest I don’t think I can handle that, let alone allocate more of my free time to the project. Also, I’m not very confident with SQLAlchemy itself so I would not be the best person deal with that code anyway. In the recent past while discussing SQLAlchemy support on the mailing list, I have been <a href="https://groups.google.com/forum/?hl=en#!topic/python-eve/11t1usVH2EY">very clear about my concerns</a>, so much that I probably scared a few people away. What worries me the most, I suspect, is the risk of new code becoming stale one day or another. In time that would probably impact the reputation of the whole project.</p>
<p>To think about it, we already had something similar happen in the past, although for a smaller feature. The <a href="http://python-eve.org/extensions">Document Versioning</a> pull request, contributed by the amazing <a href="https://github.com/joshvillbrandt">Josh Villbrandt</a>, had been daunting me with similar thoughts. New code was going to be be quite intrusive, adding a good deal of complexity to an otherwise relatively simple codebase. Everything went amazingly well though. Josh is still an active contributor. He helps with improving his own feature and, even more importantly, other contributors are now helping with Document Versioning <a href="https://github.com/nicolaiarocci/eve/pull/486">as we speak</a>. Overall, the Eve project as a whole as been enjoying a growing number of skilled contributors and adopters. It’s been a joy to see people commenting on open tickets, offer support on the mailing list and even on Stack Overflow. So that should be encouraging.</p>
<p>So here I sit, with 4K LOCs ready to be merged. What do I do with them? I considered a few options. One is leaving the SQL feature in a separate branch. Another is to ask the team to refactor the whole thing into an external extension (we have <a href="http://python-eve.org/features.html#document-versioning">a few</a> already). By doing any of these Eve-core would remain MongoDB only and I could keep managing it on my own. But then again, none of these options would add native SQL support to Eve. Also, an extension or a branch would run even a greater danger of becoming stale.</p>
<p>At some point I guess even mildly successful projects like Eve have to decide wether they want to outgrow their author. I strongly believe that growing and trusting communities is all that open source is about. You release your work out there and, even at that early stage, you are already entrusting people. You trust that they will take notice and then that they will validate your project (or not). Eventually, someone will review your code, adopt it and, in time, contribute. The project then grows up to a point where its community becomes so predominant that you, as the author and maintainer, just have to let some control go.</p>
<p>So yes, SQL support is coming to Eve, and as a native feature. I trust that the contributors to the SQLAlchemy backend will stay around and, if they won’t, that someone else will stand up and take the torch. I am also confident that the community as a whole will adopt the feature, make it grow and well… we’ll see what happens next.</p>
<p>If you want to get in touch, I’m <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Feature Overview: The Eve OpLog</title>
      <link>https://nicolaiarocci.com/feature-overview-the-eve-oplog/</link>
      <pubDate>Mon, 06 Oct 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/feature-overview-the-eve-oplog/</guid>
      <description>&lt;p&gt;The operations log or OpLog is a new &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; feature that I’m currently developing on the &lt;a href=&#34;https://github.com/nicolaiarocci/eve/tree/oplog&#34;&gt;&lt;code&gt;oplog&lt;/code&gt;&lt;/a&gt; experimental branch. It’s supposed to help in addressing a subtle issue that we’ve been dealing with, but I believe it can also emerge as a very useful all-around tool. I am posting about it in the hope of gathering some feedback from Eve contributors and users, so that I can better pinpoint design and implementation before I merge it to the main development branch.&lt;/p&gt;
&lt;h2 id=&#34;what-is-the-oplog&#34;&gt;What is the OpLog?&lt;/h2&gt;
&lt;p&gt;The OpLog is a special resource that keeps a record of operations that modify the data stored by the API. Every &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PATCH&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; operation can eventually be recorded by the oplog.&lt;/p&gt;
&lt;p&gt;At its core the oplog is simply a server log, something that’s always been on the Eve roadmap. What makes it a little bit different is its ability to be exposed as a read-only API endpoint. This would in turn allow clients to query it as they would with any other standard endpoint.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The operations log or OpLog is a new <a href="http://python-eve.org">Eve</a> feature that I’m currently developing on the <a href="https://github.com/nicolaiarocci/eve/tree/oplog"><code>oplog</code></a> experimental branch. It’s supposed to help in addressing a subtle issue that we’ve been dealing with, but I believe it can also emerge as a very useful all-around tool. I am posting about it in the hope of gathering some feedback from Eve contributors and users, so that I can better pinpoint design and implementation before I merge it to the main development branch.</p>
<h2 id="what-is-the-oplog">What is the OpLog?</h2>
<p>The OpLog is a special resource that keeps a record of operations that modify the data stored by the API. Every <code>POST</code>, <code>PATCH</code>, <code>PUT</code> and <code>DELETE</code> operation can eventually be recorded by the oplog.</p>
<p>At its core the oplog is simply a server log, something that’s always been on the Eve roadmap. What makes it a little bit different is its ability to be exposed as a read-only API endpoint. This would in turn allow clients to query it as they would with any other standard endpoint.</p>
<p>Every oplog entry contains few important informations about the document</p>
<p>involved with the edit operation:</p>
<ul>
<li>URL of the endpoint hit by the operation.</li>
<li>Kind of operation performed.</li>
<li>Unique ID of the document.</li>
<li>Date when the document was updated.</li>
<li>Date when the document as created.</li>
<li>User token, if <a href="http://python-eve.org/authentication.html#user-restricted-resource-access">User Restricted Resource Access</a> is enabled for the endpoint</li>
</ul>
<p>Like any other API-maintained documents, oplog entries also contain:</p>
<ul>
<li>Unique ID</li>
<li>ETag</li>
<li><a href="http://python-eve.org/features.html#hateoas">HATEOAS</a> meta fields, if enabled.</li>
</ul>
<p>A typical oplog entry would look something like this:</p>
<pre><code>{
    &quot;o&quot;: &quot;DELETE&quot;, 
    &quot;r&quot;: &quot;people&quot;, 
    &quot;i&quot;: &quot;542d118938345b614ea75b3c&quot;,
    &quot;_updated&quot;: &quot;Fri, 03 Oct 2014 08:16:52 GMT&quot;, 
    &quot;_created&quot;: &quot;Fri, 03 Oct 2014 08:16:52 GMT&quot;,
    &quot;_id&quot;: &quot;542e5b7438345b6dadf95ba5&quot;, 
    &quot;_etag&quot;: &quot;e17218fbca41cb0ee6a5a5933fb9ee4f4ca7e5d6&quot;
    &quot;_links&quot;: {...},
}
</code></pre>
<p>To save a little storing space field names have been shortened when possible (what can I say, I’m a MongoDB guy): <code>o</code> stands for operation, <code>r</code> stands for resource, <code>i</code> stands for unique ID and <code>c</code> stands for changes. Other keys are defined by the configuration settings, and their default names are shown here.</p>
<h2 id="how-is-the-oplog-operated">How is the oplog operated?</h2>
<p>Three new settings keywords are available:</p>
<ul>
<li>
<p><code>OPLOG</code></p>
<p>Sets the oplog name and defaults to <code>oplog</code>. This is the name of the collection on the database and also the default url for the oplog endpoint.<!-- raw HTML omitted --></p>
</li>
<li>
<p><code>OPLOG_METHODS</code></p>
<p>A list of HTTP methods for which oplog entries are to be recorded. Defaults to <code>['DELETE']</code>.<!-- raw HTML omitted --></p>
</li>
<li>
<p><code>OPLOG_ENDPOINT</code></p>
<p>Set it to <code>True</code> if an oplog endpoint should be made available by the API. Defaults to <code>False</code>.</p>
</li>
<li>
<p><code>OPLOG_AUDIT</code></p>
<p>If enabled, IP addresses and changes introduced with <code>PATCH</code> and <code>PUT</code> methods are also logged. Defaults to <code>True</code>.</p>
</li>
</ul>
<p>So by default the oplog is stored on a conveniently named <code>oplog</code> collection, it only stores informations about deleted documents.</p>
<p>Since the eventual oplog endpoint is a standard API endpoint, if it is enabled the API maintainer can also fiddle with the endpoint settings as he/she would do with any other Eve endpoint. This allows for setting custom authentication (you probably want this resource to be only accessible for administrative purposes), changing the url, etc. Just add an <code>oplog</code> entry to the <a href="http://python-eve.org/config#domain-configuration">API domain</a>, like so:</p>
<pre><code>'oplog': {
    'url': 'log',
    'auth': my_custom_auth_class,
    'datasource': {'source': 'myapilog'}
}
</code></pre>
<p>Note that while you can change most settings, the endpoint will always be read-only, so setting either <code>resource_methods</code> or <code>item_methods</code> to something else than <code>['GET']</code> will serve no purpose. Also, unless you need to do so, adding an oplog entry to the API domain is not required as it will be added automatically for you.</p>
<h2 id="why-the-oplog">Why the OpLog?</h2>
<p>Clients have always been able to retrieve changes by simply querying an endpoint with a <code>If-Modified-Since</code> request. So why do we need an operations log? Of course because server-side logging is cool, and so is auditing, but it’s not only about that.</p>
<h3 id="single-entry-point-for-all-api-updates">Single entry point for all API updates</h3>
<p>From the client perspective and for most use cases logging inserted, edited and replaced documents is probably a waste of both space and time, and this is the main reason why only <code>DELETE</code> operations are logged by default. However, I believe there are scenarios where remote access to a full activity log can be useful.</p>
<p>Imagine an API which is accessed by multiple apps (say phone, tablet, web and desktop applications) and all of them need to stay in sync with each other and the server. Instead of hitting every single endpoint with a <code>IMS</code> request they could just access the oplog. That’s a single request vs several, and since the oplog itself is a standard API endpoint, they could also perform <code>IMS</code> requests against it for optimal gains:</p>
<blockquote>
<p>Server, please send me all the changes occurred to the API since my last access. Sincerely, Your Client.</p></blockquote>
<p>Again this is not always the best approach a client could take. Sometimes it is probably better to only query for changes when they are really needed, but it seems cool to have both approaches available (and remember, the oplog endpoint is disabled by default).</p>
<h3 id="fixing-304s">Fixing 304s</h3>
<p>And then there are deleted documents which are a completely different beast. With no oplog we would have no way to tell if and when any document has been deleted, let alone inform clients about that. Actually, there is an <a href="https://github.com/nicolaiarocci/eve/issues/334">open ticket</a> precisely about this, and it’s been sitting there for a while.</p>
<p>When a <code>If-Modified-Since</code> request is received, the API is expected to respond with a <code>304 Not Modified</code> status if no changes occurred, so that clients can conveniently fallback to cached data. Up to version 0.4 (the official release at the time of this writing) Eve has been doing exactly that, with one caveat: missing documents were being ignored as, in the contest of the <code>IMS</code> request, there was no way to know about them.</p>
<p>The operations log will allow Eve powered APIs to take deleted documents into account, returning perfectly proper <code>304</code> codes as needed. The impact on performance should be minimal as we will only query the oplog when and if no changes have been detected on the target collection.</p>
<p>This solves only one half of the problem however. What happens when a <code>IMS</code> request comes in and deleted documents are found in the backlog? How do we report them back to the client? Three options come to mind which would address this scenario:</p>
<ol>
<li>
<p>Respond with a <code>200 OK</code> and a the usual “changes since <code>IMS</code> date” payload, which might happen to be empty if only deletions occurred in the time window. The client can then go and query the oplog endpoint with the same <code>IMS</code> date, finally getting the list of deleted documents IDs.</p>
</li>
<li>
<p>Include deleted documents IDs in the standard payload (within the <code>_items</code> list), maybe with a <code>deleted</code> status tag. This status tag is something new though, and for consistency we should probably add it to other objects in the payload.</p>
</li>
<li>
<p>Add support for a new <code>_deleted</code> meta field in resource payloads. When deleted documents are spotted in the backlog the response payload will include them in their own list. Something like this:</p>
</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>First option is so bad I should probably not be listing it at all. It would take two roundtrips to get the whole update down. Also, it would kind of force API maintainers to open the oplog endpoint to their clients.</p>
<p>I’m not convinced #2 would be a good idea either, as objects in the items list would not be homogeneous anymore and we would have to add support for a new meta field anyway (the status tag).</p>
<p>Option #3 on the other hand looks quite good to me. It does not require multiple requests to handle the case of deleted documents on <code>IMS</code> requests, and it is still easy and clean for clients to process. I am going to go with #3 unless feedback is negative and for good reasons, so let your opinion be heard.</p>
<h2 id="closing-concerns">Closing concerns</h2>
<p>I am slightly concerned about the performance impact, not so much on <code>IMS</code> requests but rather on write operations, especially when a complete, all-operations log is being recorded.</p>
<p>In MongoDB world OpLog is probably an ideal candidate for a <a href="http://docs.mongodb.org/manual/core/capped-collections/">capped collection</a>. I’m not entirely convinced about that though, as by its nature a capped collection is bound to lose data over time, which again might lead to inaccurate <code>304</code> handling.</p>
<p>I am not implementing the OpLog at the data layer level however. It is a business layer feature to let other engines take advantage of it. Nothing prevents the MongoDB admin from setting the <code>oplog</code> as a capped collection anyway. Also, keep in mind that like all other resources maintained by the API, indexes are not handled by Eve itself so you will have to do your homework in that field too.</p>
<p>So here you have it. I’m currently done on both configuration and logging parts and will be working on <code>304</code> handling and response payloads in the coming days so that all of this can be included with next version 0.5. Be warned that at the moment the <code>develop</code> branch has no support for <code>IMS</code> requests on resource endpoints. It’s been disabled to avoid providing clients with inaccurate responses (see the ticket above).</p>
<p>If you have any comment or feedback to provide, please let me know in the comments below. I’d really appreciate that.</p>
<p>PS. In case you are wondering yes, the Eve OpLog is heavily inspired by the awesome <a href="http://docs.mongodb.org/manual/core/replica-set-oplog/">MongoDB OpLog</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ordered Dictionaries with Python 2.4-2.6</title>
      <link>https://nicolaiarocci.com/ordered-dictionaries-with-python-2-4-2-6/</link>
      <pubDate>Tue, 16 Sep 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ordered-dictionaries-with-python-2-4-2-6/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.python.org/2/library/collections.html#collections.OrderedDict&#34;&gt;OrderedDict&lt;/a&gt; is a super handy data structure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An OrderedDict is a dict that remembers the order that keys were first inserted. If a new entry overwrites an existing entry, the original insertion position is left unchanged. Deleting an entry and reinserting it will move it to the end.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Problem is, this stuff is only available in the standard library since Python 2.7 while &lt;a href=&#34;http://python-eve.org&#34;&gt;my project&lt;/a&gt; also needs to support Python 2.6. Fortunately there’s a back-port available and it is only a pip install away:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# make OrderedDict available on Python 2.6-2.4
$ pip install ordereddict
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;https://pypi.python.org/pypi/ordereddict&#34;&gt;ordereddict&lt;/a&gt; is based on the awesome recipe by &lt;a href=&#34;http://code.activestate.com/recipes/576693&#34;&gt;Raymond Hettinger&lt;/a&gt;, works with Python 2.4-2.6 and, most importantly, is a drop-in replacement for OrderedDict.&lt;/p&gt;
&lt;p&gt;However if you want your code to run seamlessly on all Pythons there’s still some work to be done. First of all you want to make sure that the appropriate OrderedDict is imported, either the standard library version (for Python 2.7 and above) or the back-port release.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://docs.python.org/2/library/collections.html#collections.OrderedDict">OrderedDict</a> is a super handy data structure.</p>
<blockquote>
<p>An OrderedDict is a dict that remembers the order that keys were first inserted. If a new entry overwrites an existing entry, the original insertion position is left unchanged. Deleting an entry and reinserting it will move it to the end.</p></blockquote>
<p>Problem is, this stuff is only available in the standard library since Python 2.7 while <a href="http://python-eve.org">my project</a> also needs to support Python 2.6. Fortunately there’s a back-port available and it is only a pip install away:</p>
<pre><code># make OrderedDict available on Python 2.6-2.4
$ pip install ordereddict
</code></pre>
<p><a href="https://pypi.python.org/pypi/ordereddict">ordereddict</a> is based on the awesome recipe by <a href="http://code.activestate.com/recipes/576693">Raymond Hettinger</a>, works with Python 2.4-2.6 and, most importantly, is a drop-in replacement for OrderedDict.</p>
<p>However if you want your code to run seamlessly on all Pythons there’s still some work to be done. First of all you want to make sure that the appropriate OrderedDict is imported, either the standard library version (for Python 2.7 and above) or the back-port release.</p>
<p>This is easily accomplished, and in a very pythonic way:</p>
<pre><code>try:
    # try with the standard library
    from collections import OrderedDict
except ImportError:
    # fallback to Python 2.6-2.4 back-port
    from ordereddict import OrderedDict
</code></pre>
<h2 id="fixing-setuppy">Fixing setup.py</h2>
<p>If you are shipping your code as a package then you also want to make sure that setup.py properly handles the different Python versions. Since setup.py itself is nothing but standard Python module, we can make it more dynamic by applying the same technique above.</p>
<pre><code>#!/usr/bin/env python
from setuptools import setup, find_packages

# your standard required modules
install_requires = [
    'simplejson',
    'cerberus',
    'events',
    ...
]

try:
    from collections import OrderedDict
except ImportError:
    # add backport to list of required modules
    install_requires.append('ordereddict')

setup(
    name='appname',
    version='0.1',
    packages=find_packages(),
    ...
    # no matter which Python, we're now good to go
    install_requires = install_requires,
    ...
)
</code></pre>
<h2 id="handling-requirementstxt">Handling requirements.txt</h2>
<p>When it comes to pip’s requirements.txt, what I think works best is to simply add a <em>diff file</em> which targets old Python versions like so:</p>
<pre><code># py26-requirements.txt
# install from 'canonical' requirements.txt first (DRY)
-r requirements.txt
# add specific Python 2.6 dependencies
ordereddict
</code></pre>
<p>A developer using Python 2.6 would then go with</p>
<pre><code>$ pip install -r py26-requirements.txt
</code></pre>
<p>Whereas someone on a recent Python would simply run</p>
<pre><code>$ pip install -r requirements.txt
</code></pre>
<p>Since py26-requirements.txt explicitly lists Python 2.6 dependencies only and then relies on requirements.txt, most likely you will only need to update the main requirements when/if new dependencies are needed.</p>
<p>You can check out the <a href="https://github.com/nicolaiarocci/eve/commit/ae292f42a6ea92a447b194aaf17d8447b859b0ab">commit</a> where Python 2.6 support for OrderDict has been introduced.</p>
<p>If you want to get in touch, I’m <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Taming Portable Class Libraries and .NET Framework 4</title>
      <link>https://nicolaiarocci.com/taming-portable-class-libraries-and-net-framework-4/</link>
      <pubDate>Thu, 28 Aug 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/taming-portable-class-libraries-and-net-framework-4/</guid>
      <description>&lt;p&gt;If your project is a Portable Class Library and you want it to run with the .NET Framework 4 well, you are in for a few surprises. Especially so if you are using InstallShield for building your deployment package. We’ve been going through this a few days ago and it’s been kind of a wild ride. I thought I could pin the whole thing down so that others might enjoy a painless journey through all this mess.&lt;/p&gt;
&lt;h2 id=&#34;portable-class-libraries-and-net-framework-4&#34;&gt;Portable Class Libraries and .NET Framework 4&lt;/h2&gt;
&lt;p&gt;The first thing you should know is that while the .NET Framework 4 does support PCLs, in fact it won’t run them without a patch. For whatever reason, Microsoft decided that PCL compatibility wasn’t a worth a 4.0.4 update. That leaves us with the need to not only make sure that target machines are running the up-to-date .NET4 release (v4.0.3) but also that they’ve been updated with &lt;!-- raw HTML omitted --&gt;KB2468871&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;You might be wondering why this is an issue in the first place. We could simply install the .NET Framework 4.5 which is backward compatible with the .NET4 and includes the afore mentioned KB2468871. Even better, we could just target the .NET 4.5 on our PCL. Problem is that besides iOS, Android, WinPhone and Silverlight we also want our libraries to run seamlessly on as many Windows editions as possible, Windows XP included. Here is the catch: &lt;!-- raw HTML omitted --&gt;.NET4 is the last framework version to run on Windows XP&lt;!-- raw HTML omitted --&gt;. And yes, we got the memo, Microsoft officially abandoned Windows XP a while ago so why bother? Well it turns out that millions of users are still running XP, especially so in the enterprise and SMB. These PCL are targeting exactly that, precisely the accounting software segment, and believe me there’s a huge number of users happily invoicing and accounting on their &lt;em&gt;old-fart-but-still-splendidly-doing-its-job-for-cheap&lt;/em&gt; boxes. Oh and the .NET Framework 3.5 is not an option as it doesn’t support Portable Classes at all.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If your project is a Portable Class Library and you want it to run with the .NET Framework 4 well, you are in for a few surprises. Especially so if you are using InstallShield for building your deployment package. We’ve been going through this a few days ago and it’s been kind of a wild ride. I thought I could pin the whole thing down so that others might enjoy a painless journey through all this mess.</p>
<h2 id="portable-class-libraries-and-net-framework-4">Portable Class Libraries and .NET Framework 4</h2>
<p>The first thing you should know is that while the .NET Framework 4 does support PCLs, in fact it won’t run them without a patch. For whatever reason, Microsoft decided that PCL compatibility wasn’t a worth a 4.0.4 update. That leaves us with the need to not only make sure that target machines are running the up-to-date .NET4 release (v4.0.3) but also that they’ve been updated with <!-- raw HTML omitted -->KB2468871<!-- raw HTML omitted -->.</p>
<p>You might be wondering why this is an issue in the first place. We could simply install the .NET Framework 4.5 which is backward compatible with the .NET4 and includes the afore mentioned KB2468871. Even better, we could just target the .NET 4.5 on our PCL. Problem is that besides iOS, Android, WinPhone and Silverlight we also want our libraries to run seamlessly on as many Windows editions as possible, Windows XP included. Here is the catch: <!-- raw HTML omitted -->.NET4 is the last framework version to run on Windows XP<!-- raw HTML omitted -->. And yes, we got the memo, Microsoft officially abandoned Windows XP a while ago so why bother? Well it turns out that millions of users are still running XP, especially so in the enterprise and SMB. These PCL are targeting exactly that, precisely the accounting software segment, and believe me there’s a huge number of users happily invoicing and accounting on their <em>old-fart-but-still-splendidly-doing-its-job-for-cheap</em> boxes. Oh and the .NET Framework 3.5 is not an option as it doesn’t support Portable Classes at all.</p>
<p>All things considered, it’s still good news. We can build PCL which run everywhere, Windows XP included. We only need to make sure that both the .NET Framework 4 and the KB2468871 are installed on target machines. Easy enough, right?</p>
<h2 id="the-strange-story-about-kb2468871-installshield-prerequisite">The strange story about KB2468871 InstallShield Prerequisite</h2>
<p>We rely on InstallShield for building our distributions, so I was delighted to find that it comes with a KB2468871 Setup Prerequisite out of the box. All we had to do was add the prerequisite to our setup and we would be done. In fact, our first test was encouraging. We ran the setup on a pristine Windows XP. It installed the .NET Framework 4, then the KB patch and then, finally, our own application which included the PCL libraries. Everything was running smoothly. We then moved on to test the same identical build on a fresh Windows 7 machine. Again, it installed the .NET4 just fine… and then it crashed. Actually, the setup itself did not crash. It was the KB2468871 which was crashing while the main setup itself was left idle, waiting for the KB install to complete. So, what was going on there?</p>
<h3 id="cpu-architecture-does-matter">CPU Architecture Does Matter</h3>
<p>To make a long story short, after a lot of investigation and an embarrassingly high number of tests we found that our setup was only crashing on 64bit editions of Windows. It turned out that the issue was with the InstallShield Prerequisite itself. It was broken. In a bad way.</p>
<p>The KB2468871 comes in three flavors:</p>
<ul>
<li>NDP40-KB2468871-v2-x86.exe</li>
<li>NDP40-KB2468871-v2-IA64.exe</li>
<li>NDP40-KB2468871-v2-x64.exe</li>
</ul>
<p>Three executables, each one targeting a different architecture. Upon inspection of the stock prerequisite however, we discovered that it was launching the x86 executable no matter what the target edition of Windows was. That explained the crashes on x64 systems.</p>
<p>The solution was to create a new custom prerequisite which would download and launch the x64 KB edition on 64bit systems. We then had to update the stock prerequisite too, so that it would only run on x86 systems. So we now had two specialized KB2468871 prerequisites. One for 32 and another for 64 bit systems. They would be launched alternatively depending on the target system. We proceeded to add them both to our InstallShield project and rebuild it. Then we went and tested it against freshly installed Windows. It installed the .NET Framework 4, then totally skipped the KB (like the prerequisite didn’t even exist) and finally proceeded to install both PCL and main application – which of course would crash on execution as there was no KB on the system.</p>
<p>Beaten, but not ready to admit defeat yet, we went back to the drawing board.</p>
<h3 id="execution-order-does-matter-or-not">Execution Order Does Matter. Or Not.</h3>
<p>Our custom launch conditions for both our KB prerequisites were there, and they looked good. Then there was this other conditional triplet. It was validating two registry keys and then making sure that mscorlib.dll existed in .NET4 folder. So, the idea was that the KB installation should only be executed if the .NET4 was on the target system. That sounded perfectly reasonable. As we could configure the order in which prerequisites were executed, we just had to make sure that the .NET4 prerequisite was assigned a higher priority, so it would run before the KB prerequisites themselves. The prerequisites order was fixed, a new setup was built and… nothing changed. KB were still not being installed.</p>
<p>Prerequistes order did not seem to matter. In fact, if we removed that check-if-net4-is-there conditional triplet the KB would install. However that was not an acceptable solution because then the KB would <em>always</em> be installed, causing a reinstall (and a waste of time and resources) on most systems.</p>
<p>Then I had my epiphany. Maybe launch conditions were being evaluated all together at boot time, for all prerequisites, before they were installed and regardless of their execution order? Non-sense you might think (I did). Why allow me to set an execution order in the first place, if launch conditions for each item are not going to be evaluated in <em>that</em> order? Luckily, validating this theory was going to be quick and easy. We just had to reboot the system after the faulty installation was completed, then run the setup again. And guess what? On second run, after the reboot, the KB installation would be executed without a glitch. Bingo. Since the .NET4 had been installed on the previous run, now registry keys were there and the mscorlib.dll was in the right place, so the KB launch conditions were finally met.</p>
<p>We ended up replacing that bogus conditional triplet completely and changing the validation logic. Instead of checking if the .NET4 was installed (on pristine XP and Windows 7 systems, which don’t have the .NET Framework 4 preinstalled, <em>it just could not be there</em> <em>yet</em>), we were now simply checking if KB itself was installed. After all it just needs to be there, no matter the Windows or framework version (on .NET 4.5+ the KB will be installed by default).</p>
<p>So now, armed with our brand new custom KB2468871-x64 prerequisite and a totally re-imaginated set of launch conditions we were finally able to build a setup that would deliver a fully functional Portable Class Library which would run on all possible Windows: XP, Windows 7, Windows 8… independently of the CPU architecture. Victory!</p>
<p>If you read this far you probably noticed that I didn’t include instructions on how to apply these changes to the stock prerequisite, let alone create a new one. You can find those instructions on the InstallShield website, or you can simply use <a href="https://gist.github.com/nicolaiarocci/34f9c167a4ec1adf591a">our modified prerequisites</a>. Of course we are providing them without any guarantee that they will work for you. They did for us, and that’s it.</p>
<h2 id="too-long-didn8217t-read">Too long; didn’t read</h2>
<ol>
<li>Portable Class Libraries won’t run on plain vanilla .NET Framework 4.0 unless KB2468871 is installed;</li>
<li>If using InstallShield KB2468871 Setup Prerequiste you’re in for a wild ride;</li>
<li>However, and until an official fix is released, you can opt to use our modified prerequisites instead.</li>
<li>Get the <a href="https://gist.github.com/nicolaiarocci/34f9c167a4ec1adf591a#file-microsoft-net-framework-4-0-kb2468871-x64-prq">custom KB2468871 (64x) InstallShield prerequisite</a>.</li>
<li>Get the <a href="https://gist.github.com/nicolaiarocci/34f9c167a4ec1adf591a#file-microsoft-net-framework-4-0-kb2468871-prq">custom KB2468871 (x86) prerequisite</a>.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>The stock KB2468871 InstallShield prerequiste has been out for a good while so I’m baffled that to this day I still cannot find any reference about these issues on the internet. Portable Class Libraries are probably still a niche and the fact that most of Macrovision KB resources are hidden behind a wall does not help. Soon or later an official prerequisite update will be released. Until then, feel free to use our mods.</p>
<p>I’ll just add that if we were dealing with an Open Source project, we’d just open a pull request and be done with it.</p>
<p>If you want to get in touch, I’m <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.4 and Cerberus 0.7 Released</title>
      <link>https://nicolaiarocci.com/eve-0-4-cerberus-0-7-released/</link>
      <pubDate>Thu, 10 Jul 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-4-cerberus-0-7-released/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Eve 0.4 adds cool features like Document Versioning and Coherence Mode. Cerberus 0.7 allows regex validation amongst other niceties. Make sure to check the &lt;a href=&#34;http://blog.python-eve.org/eve-04-released&#34;&gt;official v0.4 announcement&lt;/a&gt; for all the details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Eve 0.4 adds cool features like Document Versioning and Coherence Mode. Cerberus 0.7 allows regex validation amongst other niceties. Make sure to check the <a href="http://blog.python-eve.org/eve-04-released">official v0.4 announcement</a> for all the details.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Microsoft’s New Running Shoes</title>
      <link>https://nicolaiarocci.com/microsofts-new-running-shoes/</link>
      <pubDate>Tue, 17 Jun 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/microsofts-new-running-shoes/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;When Ballmer famously said, “Linux is a cancer that attaches itself in an intellectual property sense to everything it touches,” it was fair to characterize Microsoft’s approach to open source as hostile. But over time, forces within Microsoft pushed to change this attitude. Many groups inside of Microsoft continue to see the customer and business value in fostering, rather than fighting, OSS.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://haacked.com/archive/2014/05/17/microsofts-new-running-shoes/&#34;&gt;Microsoft’s New Running Shoes&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>When Ballmer famously said, “Linux is a cancer that attaches itself in an intellectual property sense to everything it touches,” it was fair to characterize Microsoft’s approach to open source as hostile. But over time, forces within Microsoft pushed to change this attitude. Many groups inside of Microsoft continue to see the customer and business value in fostering, rather than fighting, OSS.</p></blockquote>
<p>via <a href="http://haacked.com/archive/2014/05/17/microsofts-new-running-shoes/">Microsoft’s New Running Shoes</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to handle big repositories with git</title>
      <link>https://nicolaiarocci.com/how-to-handle-big-repositories-with-git/</link>
      <pubDate>Wed, 11 Jun 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/how-to-handle-big-repositories-with-git/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;git is a fantastic choice for tracking the evolution of your code base and to collaborate efficiently with your peers. But what happens when the repository you want to track is really huge?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;https://blogs.atlassian.com/2014/05/handle-big-repositories-git/&#34;&gt;How to handle big repositories with git – Atlassian Blogs&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>git is a fantastic choice for tracking the evolution of your code base and to collaborate efficiently with your peers. But what happens when the repository you want to track is really huge?</p></blockquote>
<p>via <a href="https://blogs.atlassian.com/2014/05/handle-big-repositories-git/">How to handle big repositories with git – Atlassian Blogs</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>10 Most Common Python Mistakes</title>
      <link>https://nicolaiarocci.com/10-most-common-python-mistakes/</link>
      <pubDate>Wed, 04 Jun 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/10-most-common-python-mistakes/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Python’s simple, easy-to-learn syntax can mislead Python developers – especially those who are newer to the language – into missing some of its subtleties and underestimating the power of the language.&lt;/p&gt;
&lt;p&gt;With that in mind, this article presents a “top 10” list of somewhat subtle, harder-to-catch mistakes that can bite even the most advanced Python developer in the rear.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://www.toptal.com/python/top-10-mistakes-that-python-programmers-make&#34;&gt;10 Most Common Python Mistakes&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Python’s simple, easy-to-learn syntax can mislead Python developers – especially those who are newer to the language – into missing some of its subtleties and underestimating the power of the language.</p>
<p>With that in mind, this article presents a “top 10” list of somewhat subtle, harder-to-catch mistakes that can bite even the most advanced Python developer in the rear.</p></blockquote>
<p>via <a href="http://www.toptal.com/python/top-10-mistakes-that-python-programmers-make">10 Most Common Python Mistakes</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why doesn’t GitHub talk about their product roadmap?</title>
      <link>https://nicolaiarocci.com/doesnt-github-talk-product-roadmap/</link>
      <pubDate>Mon, 26 May 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/doesnt-github-talk-product-roadmap/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Software development is mostly horseshit. We’re busy trying to build things, trying to estimate when things are done, trying to work with other humans to make sure you don’t break anything when you launch. All of these things can go horribly, horribly wrong without much malice or without much intention. It’s still very difficult.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;https://github.com/holman/feedback/issues/534&#34;&gt;Why doesn’t GitHub talk about their product roadmap?&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Software development is mostly horseshit. We’re busy trying to build things, trying to estimate when things are done, trying to work with other humans to make sure you don’t break anything when you launch. All of these things can go horribly, horribly wrong without much malice or without much intention. It’s still very difficult.</p></blockquote>
<p>via <a href="https://github.com/holman/feedback/issues/534">Why doesn’t GitHub talk about their product roadmap?</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>How to be a sane programmer</title>
      <link>https://nicolaiarocci.com/how-to-be-a-sane-programmer/</link>
      <pubDate>Mon, 24 Mar 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/how-to-be-a-sane-programmer/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;But here’s the rub. Programming, like writing, painting, and music, is chiefly a creative endeavor not a technical one. Practice with any technology or language is useful as a means of learning tools and techniques, but it will not make you a substantially better programmer.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://www.nicholascloud.com/2014/03/how-to-be-a-sane-programmer/&#34;&gt;How to be a sane programmer&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>But here’s the rub. Programming, like writing, painting, and music, is chiefly a creative endeavor not a technical one. Practice with any technology or language is useful as a means of learning tools and techniques, but it will not make you a substantially better programmer.</p></blockquote>
<p>via <a href="http://www.nicholascloud.com/2014/03/how-to-be-a-sane-programmer/">How to be a sane programmer</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Never judge a programmer by their commit history</title>
      <link>https://nicolaiarocci.com/never-judge-a-programmer-by-their-commit-history/</link>
      <pubDate>Tue, 25 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/never-judge-a-programmer-by-their-commit-history/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;It’s been a very long time since I judged any programmer based on their commit history and I believe if you think you can judge a programmer’s ability by reading his/her code YOU ARE WRONG.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://www.mehdi-khalili.com/never-judge-a-programmer-by-their-commit-history&#34;&gt;Never judge a programmer by their commit history&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>It’s been a very long time since I judged any programmer based on their commit history and I believe if you think you can judge a programmer’s ability by reading his/her code YOU ARE WRONG.</p></blockquote>
<p>via <a href="http://www.mehdi-khalili.com/never-judge-a-programmer-by-their-commit-history">Never judge a programmer by their commit history</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.3 Released</title>
      <link>https://nicolaiarocci.com/eve-0-3-released/</link>
      <pubDate>Fri, 14 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-3-released/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://python-eve.org&#34;&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;Today we released &lt;a href=&#34;https://pypi.python.org/pypi/Eve&#34;&gt;Eve v0.3&lt;/a&gt;. It includes customizable Files Storage support (on GridFS by default), a lot of fixes, several breaking changes and a lot of love. Head over to relevant &lt;a href=&#34;http://blog.python-eve.org/eve-03-released&#34;&gt;blog post&lt;/a&gt; and/or to &lt;a href=&#34;http://python-eve.org/changelog.html&#34;&gt;changelog&lt;/a&gt; to know more about it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://python-eve.org"><!-- raw HTML omitted --></a>Today we released <a href="https://pypi.python.org/pypi/Eve">Eve v0.3</a>. It includes customizable Files Storage support (on GridFS by default), a lot of fixes, several breaking changes and a lot of love. Head over to relevant <a href="http://blog.python-eve.org/eve-03-released">blog post</a> and/or to <a href="http://python-eve.org/changelog.html">changelog</a> to know more about it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Learn C, Then Learn Computer Science</title>
      <link>https://nicolaiarocci.com/learn-c-then-learn-computer-science/</link>
      <pubDate>Wed, 12 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/learn-c-then-learn-computer-science/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is the problem with emphasizing computer science over learning to code. Without an understanding of what’s happening at a low level, my peers ran into issues […] and had no idea what to do to debug them. This is a problem that stems from teaching people computer science but not teaching them how to code. Learning to code isn’t just teaching people how to spell – it’s teaching people the meaning behind the words.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>This is the problem with emphasizing computer science over learning to code. Without an understanding of what’s happening at a low level, my peers ran into issues […] and had no idea what to do to debug them. This is a problem that stems from teaching people computer science but not teaching them how to code. Learning to code isn’t just teaching people how to spell – it’s teaching people the meaning behind the words.</p></blockquote>
<p>via <a href="http://qrohlf.com/posts/learn-to-code-then-learn-cs/">Learn C, Then Learn Computer Science</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>What the Heck is Happening to Windows?</title>
      <link>https://nicolaiarocci.com/what-the-heck-is-happening-to-windows/</link>
      <pubDate>Wed, 12 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/what-the-heck-is-happening-to-windows/</guid>
      <description>&lt;p&gt;This oh so this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you look back over the decades at the many high-level complaints that have been leveled at Windows, one in particular sticks out: Unlike Mac OS, in particular, Windows has always attempted to satisfy every possible customer need, and as such it often provides multiple ways to accomplish the same thing. The result is a messy product, if you will, one that lacks the singular vision that is typically associated with the Mac and Apple’s other products.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This oh so this.</p>
<blockquote>
<p>If you look back over the decades at the many high-level complaints that have been leveled at Windows, one in particular sticks out: Unlike Mac OS, in particular, Windows has always attempted to satisfy every possible customer need, and as such it often provides multiple ways to accomplish the same thing. The result is a messy product, if you will, one that lacks the singular vision that is typically associated with the Mac and Apple’s other products.</p></blockquote>
<p>via <a href="http://winsupersite.com/windows-8/what-heck-happening-windows">What the Heck is Happening to Windows?</a>ì</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to Save 90% on Your S3 Bill</title>
      <link>https://nicolaiarocci.com/how-to-save-90-on-your-s3-bill/</link>
      <pubDate>Fri, 07 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/how-to-save-90-on-your-s3-bill/</guid>
      <description>&lt;p&gt;If you are using Python and the awesome Boto library to access Amazon S3, make sure you don’t miss &lt;a href=&#34;http://www.appneta.com/blog/s3-list-get-bucket-default/&#34;&gt;How to Save 90% on Your S3 Bill&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you are using Python and the awesome Boto library to access Amazon S3, make sure you don’t miss <a href="http://www.appneta.com/blog/s3-list-get-bucket-default/">How to Save 90% on Your S3 Bill</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why AngularJS Will Be Huge</title>
      <link>https://nicolaiarocci.com/why-angularjs-will-be-huge/</link>
      <pubDate>Fri, 07 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/why-angularjs-will-be-huge/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The reality is that AngularJS is winning the frontend framework war. It’s not to say there aren’t great, high quality alternatives out there, but few have gained so much developer mindshare that slow and conservative companies see it as a wonderful investment. And it’s all the better that normal developers actually love developing with it!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://ionicframework.com/blog/angularjs-will-be-huge/&#34;&gt;Why AngularJS Will Be Huge&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>The reality is that AngularJS is winning the frontend framework war. It’s not to say there aren’t great, high quality alternatives out there, but few have gained so much developer mindshare that slow and conservative companies see it as a wonderful investment. And it’s all the better that normal developers actually love developing with it!</p></blockquote>
<p>via <a href="http://ionicframework.com/blog/angularjs-will-be-huge/">Why AngularJS Will Be Huge</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>REST APIs for Humans at FOSDEM</title>
      <link>https://nicolaiarocci.com/rest-apis-humans-fosdem/</link>
      <pubDate>Mon, 03 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/rest-apis-humans-fosdem/</guid>
      <description>&lt;p&gt;Yesterday I gave a talk at FOSDEM 2014 in Brussels. The conference itself was amazing, with over 5000 attendees literally swarming and taking over the ULB Campus. I was stoked at how smoothly everything was going on despite the incredible number of simultaneous sessions and the number of attendees continuously flowing between buildings and conference rooms. Everybody involved, volunteers and attendees,  has been very welcoming, charming and helpful. In short, I had a blast.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday I gave a talk at FOSDEM 2014 in Brussels. The conference itself was amazing, with over 5000 attendees literally swarming and taking over the ULB Campus. I was stoked at how smoothly everything was going on despite the incredible number of simultaneous sessions and the number of attendees continuously flowing between buildings and conference rooms. Everybody involved, volunteers and attendees,  has been very welcoming, charming and helpful. In short, I had a blast.</p>
<p>My <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">REST APIs for Humans™</a> talk was given in a fully packed Python DevRoom, which granted a lot of smart questions both in the final QA session and later during the day. Thanks everybody for the great feedback!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why I Left the .NET Framework</title>
      <link>https://nicolaiarocci.com/left-net-framework/</link>
      <pubDate>Mon, 03 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/left-net-framework/</guid>
      <description>&lt;p&gt;I can’t say I left the .NET Framework altogether as our main app was developed with .NET and we still maintain it on daily basis. Whenever applicable however, all the recent stuff is being done outside the walled garden.&lt;/p&gt;
&lt;p&gt;The following Jonathan Oliver totally resonates with my experience.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The .NET Framework was good. Really good. Until it wasn’t. Why did I leave .NET? In short, it constrained our ability to choose (which is a huge deal for me) and turned our focus inward toward the perceived safety of the nest instead of the helping us experiencing all of the possibilities out there in the big, wide world.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I can’t say I left the .NET Framework altogether as our main app was developed with .NET and we still maintain it on daily basis. Whenever applicable however, all the recent stuff is being done outside the walled garden.</p>
<p>The following Jonathan Oliver totally resonates with my experience.</p>
<blockquote>
<p>The .NET Framework was good. Really good. Until it wasn’t. Why did I leave .NET? In short, it constrained our ability to choose (which is a huge deal for me) and turned our focus inward toward the perceived safety of the nest instead of the helping us experiencing all of the possibilities out there in the big, wide world.</p></blockquote>
<p>via <a href="http://blog.jonathanoliver.com/why-i-left-dot-net/">Why I Left the .NET Framework</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Descent to C</title>
      <link>https://nicolaiarocci.com/the-descent-to-c/</link>
      <pubDate>Sat, 01 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/the-descent-to-c/</guid>
      <description>&lt;p&gt;This is really worth you time if you’re looking to learn C language (you should).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This article attempts to give a sort of ‘orientation tour’ for people whose previous programming background is in high (ish) level languages such as Java or Python, and who now find that they need or want to learn C.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://www.chiark.greenend.org.uk/~sgtatham/cdescent/&#34;&gt;The Descent to C&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is really worth you time if you’re looking to learn C language (you should).</p>
<blockquote>
<p>This article attempts to give a sort of ‘orientation tour’ for people whose previous programming background is in high (ish) level languages such as Java or Python, and who now find that they need or want to learn C.</p></blockquote>
<p>via <a href="http://www.chiark.greenend.org.uk/~sgtatham/cdescent/">The Descent to C</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A programmer’s legacy</title>
      <link>https://nicolaiarocci.com/a-programmers-legacy/</link>
      <pubDate>Mon, 27 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/a-programmers-legacy/</guid>
      <description>&lt;p&gt;This is a subject I’ve been pondering on for a while.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think we all have an urge to mark our stamp on this world, to graffiti ‘I was here–don’t forget me’. Yet, as a programmer, where is my legacy?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://blog.alexmaccaw.com/a-programmers-legacy&#34;&gt;A programmer’s legacy&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is a subject I’ve been pondering on for a while.</p>
<blockquote>
<p>I think we all have an urge to mark our stamp on this world, to graffiti ‘I was here–don’t forget me’. Yet, as a programmer, where is my legacy?</p></blockquote>
<p>via <a href="http://blog.alexmaccaw.com/a-programmers-legacy">A programmer’s legacy</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Pro Git Workflow</title>
      <link>https://nicolaiarocci.com/pro-git-workflow/</link>
      <pubDate>Mon, 27 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/pro-git-workflow/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Pro Git Workflow&lt;!-- raw HTML omitted --&gt; is an interesting collection of Git shortcuts, aliases and workflows. Nothing really new but give it a shot if you want to improve your git-fu beyond basics.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Pro Git Workflow<!-- raw HTML omitted --> is an interesting collection of Git shortcuts, aliases and workflows. Nothing really new but give it a shot if you want to improve your git-fu beyond basics.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Got any tips or tricks for Terminal in Mac OS X?</title>
      <link>https://nicolaiarocci.com/got-tips-tricks-terminal-mac-os-x/</link>
      <pubDate>Wed, 22 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/got-tips-tricks-terminal-mac-os-x/</guid>
      <description>&lt;p&gt;Best collection of Terminal tricks ever:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://apple.stackexchange.com/questions/5435/got-any-tips-or-tricks-for-terminal-in-mac-os-x&#34;&gt;Got any tips or tricks for Terminal in Mac OS X? – Ask Different&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Best collection of Terminal tricks ever:</p>
<p><a href="http://apple.stackexchange.com/questions/5435/got-any-tips-or-tricks-for-terminal-in-mac-os-x">Got any tips or tricks for Terminal in Mac OS X? – Ask Different</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>JavaScript: The Right Way</title>
      <link>https://nicolaiarocci.com/javascript-the-right-way/</link>
      <pubDate>Wed, 22 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/javascript-the-right-way/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Hey, you!&lt;/p&gt;
&lt;p&gt;This is a JavaScript guide intended to introduce new developers and help experienced ones to the JavaScript’s best practices.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://jstherightway.org/?utm_content=buffer7f09d&amp;amp;utm_medium=social&amp;amp;utm_source=twitter.com&amp;amp;utm_campaign=buffer&#34;&gt;JS: The Right Way&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Hey, you!</p>
<p>This is a JavaScript guide intended to introduce new developers and help experienced ones to the JavaScript’s best practices.</p></blockquote>
<p>via <a href="http://jstherightway.org/?utm_content=buffer7f09d&amp;utm_medium=social&amp;utm_source=twitter.com&amp;utm_campaign=buffer">JS: The Right Way</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python and Flask Are Ridiculously Powerful</title>
      <link>https://nicolaiarocci.com/python-and-flask-are-ridiculously-powerful/</link>
      <pubDate>Wed, 22 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-and-flask-are-ridiculously-powerful/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;As a developer, I sometimes forget the power I yield. It’s easy to forget that, when something doesn’t work the way I’d like, I have the power to change it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://jeffknupp.com/blog/2014/01/18/python-and-flask-are-ridiculously-powerful/&#34;&gt;Python and Flask Are Ridiculously Powerful&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>As a developer, I sometimes forget the power I yield. It’s easy to forget that, when something doesn’t work the way I’d like, I have the power to change it.</p></blockquote>
<p>via <a href="http://jeffknupp.com/blog/2014/01/18/python-and-flask-are-ridiculously-powerful/">Python and Flask Are Ridiculously Powerful</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Today my startup failed</title>
      <link>https://nicolaiarocci.com/today-my-startup-failed/</link>
      <pubDate>Wed, 22 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/today-my-startup-failed/</guid>
      <description>&lt;p&gt;Shit happens. Way more often than what most people think.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It may seem surprising that a seemingly successful product could fail, but it happens all the time. Although we arguably found product/market fit, we couldn’t quite crack the business side of things.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://chrishateswriting.com/post/74083032842/today-my-startup-failed&#34;&gt;Chris Hates Writing • Today my startup failed&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Shit happens. Way more often than what most people think.</p>
<blockquote>
<p>It may seem surprising that a seemingly successful product could fail, but it happens all the time. Although we arguably found product/market fit, we couldn’t quite crack the business side of things.</p></blockquote>
<p>via <a href="http://chrishateswriting.com/post/74083032842/today-my-startup-failed">Chris Hates Writing • Today my startup failed</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>CoderDojo Launch</title>
      <link>https://nicolaiarocci.com/coderdojo-launch/</link>
      <pubDate>Fri, 17 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/coderdojo-launch/</guid>
      <description>&lt;p&gt;Yesterday I attended the &lt;a href=&#34;http://agendadigitaleravenna.it&#34;&gt;Digital Divide Workshop&lt;/a&gt; ran by Agenda Digitale Ravenna. With my friend &lt;a href=&#34;http://www.linkedin.com/in/gcsolaroli&#34;&gt;Giulio Cesare&lt;/a&gt; we gave a quick &lt;a href=&#34;https://speakerdeck.com/nicola/coderdojo-romagna&#34;&gt;introductory talk&lt;/a&gt; on the CoderDojo we are launching in our area. Want to help as a mentor? &lt;a href=&#34;http://coderdojoravenna.it/collabora/&#34;&gt;Get in touch&lt;/a&gt;!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday I attended the <a href="http://agendadigitaleravenna.it">Digital Divide Workshop</a> ran by Agenda Digitale Ravenna. With my friend <a href="http://www.linkedin.com/in/gcsolaroli">Giulio Cesare</a> we gave a quick <a href="https://speakerdeck.com/nicola/coderdojo-romagna">introductory talk</a> on the CoderDojo we are launching in our area. Want to help as a mentor? <a href="http://coderdojoravenna.it/collabora/">Get in touch</a>!</p>
]]></content:encoded>
    </item>
    <item>
      <title>On undoing, fixing, or removing commits in git</title>
      <link>https://nicolaiarocci.com/on-undoing-fixing-or-removing-commits-in-git/</link>
      <pubDate>Thu, 16 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/on-undoing-fixing-or-removing-commits-in-git/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This document is an attempt to be a fairly comprehensive guide to recovering from what you did not mean to do when using git.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://sethrobertson.github.io/GitFixUm/fixup.html&#34;&gt;On undoing, fixing, or removing commits in git&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>This document is an attempt to be a fairly comprehensive guide to recovering from what you did not mean to do when using git.</p></blockquote>
<p>via <a href="http://sethrobertson.github.io/GitFixUm/fixup.html">On undoing, fixing, or removing commits in git</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Conquering the Command Line</title>
      <link>https://nicolaiarocci.com/conquering-the-command-line/</link>
      <pubDate>Sun, 12 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/conquering-the-command-line/</guid>
      <description>&lt;p&gt;This is a very good ebook, and is free for reading online.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This book is for new developers, experienced developers, and everyone in between who wants to master Unix and Linux commands. This book was designed to showcase some of the most useful commands that a developer can know to help them in their daily tasks.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://conqueringthecommandline.com/book/frontmatter#preface&#34;&gt;Softcover | Conquering the Command Line&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is a very good ebook, and is free for reading online.</p>
<blockquote>
<p>This book is for new developers, experienced developers, and everyone in between who wants to master Unix and Linux commands. This book was designed to showcase some of the most useful commands that a developer can know to help them in their daily tasks.</p></blockquote>
<p>via <a href="http://conqueringthecommandline.com/book/frontmatter#preface">Softcover | Conquering the Command Line</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How To Be A Great Developer</title>
      <link>https://nicolaiarocci.com/how-to-be-a-great-developer/</link>
      <pubDate>Sun, 12 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/how-to-be-a-great-developer/</guid>
      <description>&lt;p&gt;… and a Great Person in general.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Empathy is your most important skill. Practice it with everyone you interact with, and everyone who interacts with your work.&lt;/p&gt;
&lt;p&gt;Humility goes hand in hand with empathy. Be open to the possibility (likelihood, even) that you are wrong. Know that you will always be learning and improving. accept and own up to mistakes immediately.&lt;/p&gt;
&lt;p&gt;The less you fear being wrong, the more confident you can be. You are wrong about many things. You know very little about most things. Everyone else is exactly the same way. Embrace it. Always learn, always question, always adapt and grow.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>… and a Great Person in general.</p>
<blockquote>
<p>Empathy is your most important skill. Practice it with everyone you interact with, and everyone who interacts with your work.</p>
<p>Humility goes hand in hand with empathy. Be open to the possibility (likelihood, even) that you are wrong. Know that you will always be learning and improving. accept and own up to mistakes immediately.</p>
<p>The less you fear being wrong, the more confident you can be. You are wrong about many things. You know very little about most things. Everyone else is exactly the same way. Embrace it. Always learn, always question, always adapt and grow.</p>
<p>Understand what you do well, and what you don’t.</p>
<p>(…)</p></blockquote>
<p>via <a href="https://the-pastry-box-project.net/ed-finkler/2014-january-6">The Pastry Box Project</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Where the best designers go to find photos and graphics</title>
      <link>https://nicolaiarocci.com/where-the-best-designers-go-to-find-photos-and-graphics-blog/</link>
      <pubDate>Sun, 12 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/where-the-best-designers-go-to-find-photos-and-graphics-blog/</guid>
      <description>&lt;p&gt;This is  seriously good collection of resources for web designers and the likes, don’t miss it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’ll let you in on a little secret: beautiful websites aren’t made, they’re found. Smart designers know where to find that perfect photo, subtle pattern or that unique icon.&lt;/p&gt;
&lt;p&gt;Here’s where the best designers go to find photos, graphics, icons, and more.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;a href=&#34;http://www.sitebuilderreport.com/blog/where-the-best-designers-go-to-find-photos-and-graphics&#34;&gt;Where the best designers go to find photos and graphics | Blog&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is  seriously good collection of resources for web designers and the likes, don’t miss it.</p>
<blockquote>
<p>I’ll let you in on a little secret: beautiful websites aren’t made, they’re found. Smart designers know where to find that perfect photo, subtle pattern or that unique icon.</p>
<p>Here’s where the best designers go to find photos, graphics, icons, and more.</p></blockquote>
<p>via <a href="http://www.sitebuilderreport.com/blog/where-the-best-designers-go-to-find-photos-and-graphics">Where the best designers go to find photos and graphics | Blog</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Giving back to my community</title>
      <link>https://nicolaiarocci.com/giving-back-to-my-community-with-coderdojo-ravenna/</link>
      <pubDate>Sat, 11 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/giving-back-to-my-community-with-coderdojo-ravenna/</guid>
      <description>&lt;p&gt;A few days ago I tweeted:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Now the project is &lt;a href=&#34;http://coderdojoravenna.it/&#34;&gt;out in the wild&lt;/a&gt; and I’m very excited about it. It’s all italian yes, but do know that CoderDojo is a &lt;a href=&#34;http://coderdojo.com&#34;&gt;global movement&lt;/a&gt;, and starting a kids coding club in your own town would probably be great idea.&lt;/p&gt;
&lt;p&gt;Come meet me &lt;a href=&#34;http://coderdojoravenna.it/coderdojo-al-workshop-di-agenda-digitale-sul-digital-divide/&#34;&gt;next week&lt;/a&gt;. I will be giving a short talk about CoderDojo Ravenna and, most importantly, we’ll have a good pizza afterwards. Oh, and we’re &lt;a href=&#34;http://coderdojoravenna.it/collabora/&#34;&gt;looking for mentors&lt;/a&gt; to join us.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few days ago I tweeted:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Now the project is <a href="http://coderdojoravenna.it/">out in the wild</a> and I’m very excited about it. It’s all italian yes, but do know that CoderDojo is a <a href="http://coderdojo.com">global movement</a>, and starting a kids coding club in your own town would probably be great idea.</p>
<p>Come meet me <a href="http://coderdojoravenna.it/coderdojo-al-workshop-di-agenda-digitale-sul-digital-divide/">next week</a>. I will be giving a short talk about CoderDojo Ravenna and, most importantly, we’ll have a good pizza afterwards. Oh, and we’re <a href="http://coderdojoravenna.it/collabora/">looking for mentors</a> to join us.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Stateless Mindset</title>
      <link>https://nicolaiarocci.com/stateless-mindset/</link>
      <pubDate>Wed, 08 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/stateless-mindset/</guid>
      <description>&lt;p&gt;Would it be possible (and advisable) for a person to deal with everyday matters as if he/she was a stateless machine?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Imagine if you as a person dealt with millions of requests a day from a thousand or so clients: if you had to keep track all those clients and the multiple requests they were making, it would drive you crazy. The burden of remembering would crush you.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Would it be possible (and advisable) for a person to deal with everyday matters as if he/she was a stateless machine?</p>
<blockquote>
<p><!-- raw HTML omitted -->Imagine if you as a person dealt with millions of requests a day from a thousand or so clients: if you had to keep track all those clients and the multiple requests they were making, it would drive you crazy. The burden of remembering would crush you.<!-- raw HTML omitted --></p>
<p>This is what our lives are like. We are constantly holding information, frustration, ideas, tension, requests, needs, of a thousand different requests each day. Every email, every call, every text message, every open browser tab, every interaction with another person, every task we do … it all builds up in us until we are overloaded.</p></blockquote>
<p>via <a href="http://zenhabits.net/stateless/">Stateless Mindset : zenhabits</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Development of the C Language</title>
      <link>https://nicolaiarocci.com/the-development-of-the-c-language/</link>
      <pubDate>Wed, 08 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/the-development-of-the-c-language/</guid>
      <description>&lt;p&gt;Dennis M. Ritchie ‘The Development of the C Language’ is one of those things any programmer should read soon or later, if nothing else for historic reasons.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C came into being in the years 1969-1973, in parallel with the early development of the Unix operating system; the most creative period occurred during 1972. Another spate of changes peaked between 1977 and 1979, when portability of the Unix system was being demonstrated. In the middle of this second period, the first widely available description of the language appeared: The C Programming Language, often called the `white book’ or `K&amp;amp;R’ [Kernighan 78].&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dennis M. Ritchie ‘The Development of the C Language’ is one of those things any programmer should read soon or later, if nothing else for historic reasons.</p>
<blockquote>
<p>C came into being in the years 1969-1973, in parallel with the early development of the Unix operating system; the most creative period occurred during 1972. Another spate of changes peaked between 1977 and 1979, when portability of the Unix system was being demonstrated. In the middle of this second period, the first widely available description of the language appeared: The C Programming Language, often called the `white book’ or `K&amp;R’ [Kernighan 78].</p></blockquote>
<p>via <a href="http://cm.bell-labs.com/who/dmr/chist.html">Chistory</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Web Standards Killed the HTML Star</title>
      <link>https://nicolaiarocci.com/web-standards-killed-the-html-star/</link>
      <pubDate>Sat, 04 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/web-standards-killed-the-html-star/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;What we may not have realized is that once the browsers don’t suck, being an HTML and CSS “guru” isn’t really a very marketable skillset. 80% of what made us useful was the way we knew all the quirks and intracries of the browsers. Guess what? Those are all gone. And if they’re not, they will be in the very near future. Then what?&lt;/p&gt;
&lt;p&gt;A lot of folks who came up from that time and headspace have diversified their skillsets since. Many are now programmers, or project managers, or creative directors, or business owners. But a lot of others are still making a go of it as an HTML and CSS guru, often in a comfortable job they’ve had for years. What happens when that gig comes to an end?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>What we may not have realized is that once the browsers don’t suck, being an HTML and CSS “guru” isn’t really a very marketable skillset. 80% of what made us useful was the way we knew all the quirks and intracries of the browsers. Guess what? Those are all gone. And if they’re not, they will be in the very near future. Then what?</p>
<p>A lot of folks who came up from that time and headspace have diversified their skillsets since. Many are now programmers, or project managers, or creative directors, or business owners. But a lot of others are still making a go of it as an HTML and CSS guru, often in a comfortable job they’ve had for years. What happens when that gig comes to an end?</p></blockquote>
<p>via <a href="http://jeffcroft.com/blog/2014/jan/03/web-standards-killed-the-html-star/?utm_source=buffer&amp;utm_campaign=Buffer&amp;utm_content=buffer92680&amp;utm_medium=twitter">Web Standards Killed the HTML Star – JeffCroft.com</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python is the Language of the Year</title>
      <link>https://nicolaiarocci.com/python-is-the-language-of-the-year/</link>
      <pubDate>Thu, 02 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-is-the-language-of-the-year/</guid>
      <description>&lt;p&gt;We shouldn’t really trust this kind of statistics, I know, but when my favorite language comes out as a clear winner, I can’t resist and take them for good.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Python is the “language of the year” according to the PYPL index : it had the biggest increase in popularity share in 2013. PHP had the biggest decline. Meanwhile, Java continues to have the highest popularity share among the programming languages.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We shouldn’t really trust this kind of statistics, I know, but when my favorite language comes out as a clear winner, I can’t resist and take them for good.</p>
<blockquote>
<p>Python is the “language of the year” according to the PYPL index : it had the biggest increase in popularity share in 2013. PHP had the biggest decline. Meanwhile, Java continues to have the highest popularity share among the programming languages.</p></blockquote>
<p>via <a href="https://sites.google.com/site/pydatalog/pypl/python-blog/pythonisthelanguageoftheyear?utm_source=buffer&amp;utm_campaign=Buffer&amp;utm_content=bufferd1bdd&amp;utm_medium=twitter">Python is the Language of the Year – pyDatalog</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why Are All These Idiots More Successful Than You?</title>
      <link>https://nicolaiarocci.com/why-are-all-these-idiots-more-successful-than-you/</link>
      <pubDate>Thu, 02 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/why-are-all-these-idiots-more-successful-than-you/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;You’re so damn smart — I’ve told you how awesome I think you and the solutions you’ve built…they’re amazing. You have so many awesome things on your hard drive you built that it would blow the world away if only they knew. You created Facebook before there was Facebook and PayPal before there was PayPal. But recently I’ve heard you ask, “how can this junk software out there be so popular?”…why are all these idiots more successful than me?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>You’re so damn smart — I’ve told you how awesome I think you and the solutions you’ve built…they’re amazing. You have so many awesome things on your hard drive you built that it would blow the world away if only they knew. You created Facebook before there was Facebook and PayPal before there was PayPal. But recently I’ve heard you ask, “how can this junk software out there be so popular?”…why are all these idiots more successful than me?</p></blockquote>
<p>via <a href="http://marcgrabanski.com/success/?utm_source=buffer&amp;utm_campaign=Buffer&amp;utm_content=buffer7356d&amp;utm_medium=twitter">Why Are All These Idiots More Successful Than You?</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>We Need Coding in Schools, but Where are the Teachers?</title>
      <link>https://nicolaiarocci.com/we-need-coding-in-schools-but-where-are-the-teachers/</link>
      <pubDate>Tue, 31 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/we-need-coding-in-schools-but-where-are-the-teachers/</guid>
      <description>&lt;p&gt;Maybe instead of Coder Dojos for kids, we should run them for their teachers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We must build a team of dedicated teachers to support school coding programs. We do not rely on our students to absorb math from textbooks, online videos or math clubs; similarly, we cannot depend on every student to learn to code on their own, by using online tutorials and afterschool clubs. If coding becomes as fundamental as reading and writing, we need to create a system where everyone has an opportunity to learn, not just the few who probably would have learned it on their own anyway.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Maybe instead of Coder Dojos for kids, we should run them for their teachers.</p>
<blockquote>
<p>We must build a team of dedicated teachers to support school coding programs. We do not rely on our students to absorb math from textbooks, online videos or math clubs; similarly, we cannot depend on every student to learn to code on their own, by using online tutorials and afterschool clubs. If coding becomes as fundamental as reading and writing, we need to create a system where everyone has an opportunity to learn, not just the few who probably would have learned it on their own anyway.</p></blockquote>
<p>via <a href="https://www.edsurge.com/n/2013-12-09-opinion-we-need-coding-in-schools-but-where-are-the-teachers?utm_source=buffer&amp;utm_campaign=Buffer&amp;utm_content=buffer062d3&amp;utm_medium=twitter">OPINION: We Need Coding in Schools, but Where are the Teachers? | EdSurge News</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Alex Gaynor — About Python 3</title>
      <link>https://nicolaiarocci.com/alex-gaynor-about-python-3/</link>
      <pubDate>Mon, 30 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/alex-gaynor-about-python-3/</guid>
      <description>&lt;p&gt;A very interesting read if you’re into Python. Eve has been Python 3 compatible for a while and honestl, I would be surprised to find that somebody is running it in production under Python 3.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why aren’t people using Python 3?&lt;/p&gt;
&lt;p&gt;First, I think it’s because of a lack of urgency. Many years ago, before I knew how to program, the decision to have Python 3 releases live in parallel to Python 2 releases was made. In retrospect this was a mistake, it resulted in a complete lack of urgency for the community to move, and the lack of urgency has given way to lethargy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A very interesting read if you’re into Python. Eve has been Python 3 compatible for a while and honestl, I would be surprised to find that somebody is running it in production under Python 3.</p>
<blockquote>
<p>Why aren’t people using Python 3?</p>
<p>First, I think it’s because of a lack of urgency. Many years ago, before I knew how to program, the decision to have Python 3 releases live in parallel to Python 2 releases was made. In retrospect this was a mistake, it resulted in a complete lack of urgency for the community to move, and the lack of urgency has given way to lethargy.</p>
<p>Second, I think there’s been little uptake because Python 3 is fundamentally unexciting. It doesn’t have the super big ticket items people want, such as removal of the GIL or better performance (for which many are using PyPy). Instead it has many new libraries (whose need is largely filled by pip install), and small cleanups which many experienced Python developers just avoid by habit at this point. Certainly nothing that would make one stop their development for any length of time to upgrade, not when Python 2 seems like it’s going to be here for a while.</p></blockquote>
<p>via <a href="http://alexgaynor.net/2013/dec/30/about-python-3/">Alex Gaynor — About Python 3</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Microsoft’s New Systems Language</title>
      <link>https://nicolaiarocci.com/microsofts-new-systems-language/</link>
      <pubDate>Mon, 30 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/microsofts-new-systems-language/</guid>
      <description>&lt;p&gt;Number #3 on Praeclarum’s list hits home for me, but all his points are both valid and strong.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a programming language nerd I had mixed feelings when Jon Galloway tweeted about Microsoft’s new programming language.&lt;/p&gt;
&lt;p&gt;“Why are your feelings mixed?” I kept asking myself. I love new programming languages. I took an internship at Microsoft just so I could be closer to the people who made C#. I read language specs for fun. I write compilers for fun. I sell a programming language, interpreter, and IDE.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Number #3 on Praeclarum’s list hits home for me, but all his points are both valid and strong.</p>
<blockquote>
<p>As a programming language nerd I had mixed feelings when Jon Galloway tweeted about Microsoft’s new programming language.</p>
<p>“Why are your feelings mixed?” I kept asking myself. I love new programming languages. I took an internship at Microsoft just so I could be closer to the people who made C#. I read language specs for fun. I write compilers for fun. I sell a programming language, interpreter, and IDE.</p>
<p>So why am I not thrilled? Finally, after as much soul searching as 4 hours of sleep allowed me, I identified a few reasons for this pit in my stomach:</p></blockquote>
<p>via <!-- raw HTML omitted -->præclarum – Microsoft’s New Systems Language<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What Happens When One of Your Coworkers Dies</title>
      <link>https://nicolaiarocci.com/happens-one-coworkers-dies/</link>
      <pubDate>Mon, 30 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/happens-one-coworkers-dies/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I barely knew Colin. He sat two offices down from me, but we never worked on anything together, never laid eyes on each other after 5 p.m. Our relationship consisted, in its entirety, of work-related small talk in the break room, his lunch rotating behind us in the microwave. Ding, stir, have a good rest of your day.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;!-- raw HTML omitted --&gt;What Happens When One of Your Coworkers Dies | The Billfold&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I barely knew Colin. He sat two offices down from me, but we never worked on anything together, never laid eyes on each other after 5 p.m. Our relationship consisted, in its entirety, of work-related small talk in the break room, his lunch rotating behind us in the microwave. Ding, stir, have a good rest of your day.</p></blockquote>
<p>via <!-- raw HTML omitted -->What Happens When One of Your Coworkers Dies | The Billfold<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A basic guide to when and how to deploy HTTPS</title>
      <link>https://nicolaiarocci.com/a-basic-guide-to-when-and-how-to-deploy-https/</link>
      <pubDate>Sun, 29 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/a-basic-guide-to-when-and-how-to-deploy-https/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Many web developers know about SSL, but it is very common to see it only partially deployed, or not deployed where it should be. This basic guide on when and how to deploy SSL will help you avoid the most common mistakes.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;!-- raw HTML omitted --&gt;A basic guide to when and how to deploy HTTPS — Erik Romijn&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Many web developers know about SSL, but it is very common to see it only partially deployed, or not deployed where it should be. This basic guide on when and how to deploy SSL will help you avoid the most common mistakes.</p></blockquote>
<p>via <!-- raw HTML omitted -->A basic guide to when and how to deploy HTTPS — Erik Romijn<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>WarGames Magazine Identified</title>
      <link>https://nicolaiarocci.com/wargames-magazine-identified/</link>
      <pubDate>Sun, 29 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/wargames-magazine-identified/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;On seeing WarGames for the first time in the 1980s, I wondered which magazine it was. Later, after seeing it on TV and on VHS/DVD, the same question kept nagging at me. I believed that I would one day get to the bottom of this matter. I correctly assumed that the magazine was a real world magazine with a fake advertisement added to it. Through some effort and persistence I finally achieved my goal on 2013-02-24 at 5:30pm.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>On seeing WarGames for the first time in the 1980s, I wondered which magazine it was. Later, after seeing it on TV and on VHS/DVD, the same question kept nagging at me. I believed that I would one day get to the bottom of this matter. I correctly assumed that the magazine was a real world magazine with a fake advertisement added to it. Through some effort and persistence I finally achieved my goal on 2013-02-24 at 5:30pm.</p></blockquote>
<p>via <!-- raw HTML omitted -->WarGames Magazine Identified By Michael Walden<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why Good Programming Projects Go Bad</title>
      <link>https://nicolaiarocci.com/why-good-programming-projects-go-bad/</link>
      <pubDate>Sun, 29 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/why-good-programming-projects-go-bad/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Fred Brooks wrote the software development classic The Mythical Man-Month almost 40 years ago. In this interview, Brooks explains why managers still make the same mistakes.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;!-- raw HTML omitted --&gt;Why Good Programming Projects Go Bad&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Fred Brooks wrote the software development classic The Mythical Man-Month almost 40 years ago. In this interview, Brooks explains why managers still make the same mistakes.</p></blockquote>
<p>via <!-- raw HTML omitted -->Why Good Programming Projects Go Bad<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>You Should Change Your Python Shell</title>
      <link>https://nicolaiarocci.com/you-should-change-your-python-shell/</link>
      <pubDate>Sun, 29 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/you-should-change-your-python-shell/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;If you write Python code, switching to IPython is the number one thing you can do to immediately improve your productivity. Bold words, I know. Let’s look at how IPython can make you a more productive programmer.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;via &lt;!-- raw HTML omitted --&gt;You Should Change Your Python Shell | GrokCode&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>If you write Python code, switching to IPython is the number one thing you can do to immediately improve your productivity. Bold words, I know. Let’s look at how IPython can make you a more productive programmer.</p></blockquote>
<p>via <!-- raw HTML omitted -->You Should Change Your Python Shell | GrokCode<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 0.5 is out (and it breaks stuff)</title>
      <link>https://nicolaiarocci.com/cerberus-0-5-is-out-and-it-breaks-stuff/</link>
      <pubDate>Tue, 10 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-0-5-is-out-and-it-breaks-stuff/</guid>
      <description>&lt;p&gt;The new release changes the way validation errors are reported. Please note that these changes will also affect future releases of &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt;, the Python REST API Framework.&lt;/p&gt;
&lt;p&gt;What we had before was basically a list of human-readable errors. Each item in the list, while perfectly fine for human reading, wasn&amp;rsquo;t really ideal for algorithmic parsing. Why would you want to parse the errors with an algorithm? A common case would be when your client is using business objects to represent API resources (think a client-side ORM), and would have a hard time binding validation errors to the objects themselves.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The new release changes the way validation errors are reported. Please note that these changes will also affect future releases of <a href="http://python-eve.org">Eve</a>, the Python REST API Framework.</p>
<p>What we had before was basically a list of human-readable errors. Each item in the list, while perfectly fine for human reading, wasn&rsquo;t really ideal for algorithmic parsing. Why would you want to parse the errors with an algorithm? A common case would be when your client is using business objects to represent API resources (think a client-side ORM), and would have a hard time binding validation errors to the objects themselves.</p>
<p>So for example, previously we had:</p>
<pre><code>[
    &quot;min value for field age is 10&quot;,
    &quot;value of field name must be of string type&quot;
]
</code></pre>
<p>With Cerberus 0.5+ we now have:</p>
<p>{
age: min value is 10,
name: must be of string type
}</p>
<p>Let&rsquo;s look at more complex structures, like lists. Imagine we have a schema defined like this:</p>
<pre><code>schema = {
    'list_of_values': {
        'type': 'list',
        'items': [{'type': 'string'}, {'type': 'integer'}]
    }
}
</code></pre>
<p>And this is the document we want to validate against it:</p>
<pre><code>document = {
    'a_list_of_values': ['a string', 'not an integer']
}
</code></pre>
<p>Validation will of course fail and, given the new dictionary format, inspecting the errors property will return the following:</p>
<pre><code>&gt;&gt;&gt; v = Validator(document, schema)
False

&gt;&gt;&gt; v.errors
{1: 'must be of integer type'}
</code></pre>
<p>Let&rsquo;s look at a document that contains a list of dictionaries instead:</p>
<pre><code>document = {
    rows: [
        {'sku': 1, 'price': 100},
        {'sku': 'hello', 'price': '1'}
    ]
}
</code></pre>
<p>Validation errors will be reported like this:</p>
<pre><code>{
    rows: {
        0: {
            'sku': 'must be of string type',
            'price': 'must be of integer type'
        },
        1: {
            'price': 'must be of integer type'
        }
    }

}
</code></pre>
<p>By contrasts, on top of my memory, any previous Cerberus release would report:</p>
<pre><code>[
    &quot;rows[0]&quot;: 'field &quot;sku&quot; in must be of string type',
    &quot;rows[0]&quot;: 'field &quot;price&quot; in must be of integer type',
    &quot;rows[1]&quot;: 'field &quot;price&quot; in must be of integer type'
]
</code></pre>
<p>As you can easily see, the old implementation was forcing the client to properly parse the list in order to retrieve line number, offending field and the actual error. Overall Im fairly confident that this is an important step forward. Checkout the <a href="http://cerberus.readthedocs.org/en/latest/">documentation</a>, which has been updated to reflect the changes.</p>
<p>Get <a href="https://crate.io/packages/Cerberus/">Cerberus 0.5</a> while its hot.</p>]]></content:encoded>
    </item>
    <item>
      <title>On Why I Still Prefer Traditional Books to eBooks</title>
      <link>https://nicolaiarocci.com/on-why-i-still-prefer-traditional-books-to-ebooks/</link>
      <pubDate>Mon, 02 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/on-why-i-still-prefer-traditional-books-to-ebooks/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using a Kindle for a long time now, and I love it. But I keep buying paper books. Lots of them. Actually I buy a &lt;em&gt;lot&lt;/em&gt; more books than ebooks and it doesn&amp;rsquo;t even stop there. Admittedly, I am guilty of repeatedly buying paper editions of ebooks I&amp;rsquo;ve read on the Kindle.&lt;/p&gt;
&lt;p&gt;For a very long time I&amp;rsquo;ve not been able to tell the precise reason why I keep going back to traditional books. It&amp;rsquo;s not about the reading experience or the sexiness of turning physical pages. Well of course that matters too, as I&amp;rsquo;ve always been kind of a book fetishist, but since the very beginning of my love-hate relationship with the Kindle I&amp;rsquo;ve always known there had to be something else, and I couldn&amp;rsquo;t pin it down.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been using a Kindle for a long time now, and I love it. But I keep buying paper books. Lots of them. Actually I buy a <em>lot</em> more books than ebooks and it doesn&rsquo;t even stop there. Admittedly, I am guilty of repeatedly buying paper editions of ebooks I&rsquo;ve read on the Kindle.</p>
<p>For a very long time I&rsquo;ve not been able to tell the precise reason why I keep going back to traditional books. It&rsquo;s not about the reading experience or the sexiness of turning physical pages. Well of course that matters too, as I&rsquo;ve always been kind of a book fetishist, but since the very beginning of my love-hate relationship with the Kindle I&rsquo;ve always known there had to be something else, and I couldn&rsquo;t pin it down.</p>
<p>Then yesterday it finally struck me. I was visiting the awesome <a href="http://www.turismo.ra.it/eng/Events/Events-and-initiatives/Exhibitions/Silent-books.-Destination_-Lampedusa">Silent Books</a> exhibition with the kids, and there was this <a href="http://www.suzyleebooks.com/">Suzy Lee</a> quote pinned on the wall, and I couldn&rsquo;t stop reading it over and over.</p>
<blockquote>
<p>In turning the pages of a book,</p></blockquote>
<blockquote>
<p>a little world opens and closes,</p></blockquote>
<blockquote>
<p>enclosed in a frame.</p></blockquote>
<blockquote>
<p>Story ends, the book closes.</p></blockquote>
<blockquote>
<p>The world closes too.</p></blockquote>
<blockquote>
<p>Then it&rsquo;s quickly placed on a shelf.</p></blockquote>
<blockquote>
<p>Art can be placed on a shelf.</p></blockquote>
<blockquote>
<p>Shelf-sized art.</p></blockquote>
<blockquote>
<p>Isn&rsquo;t that beautiful? (*)</p></blockquote>
<p>So yes, it&rsquo;s about the shelves. It&rsquo;s about surrounding myself with those little worlds I&rsquo;ve been exploring. I suddenly realized that several times every day, while I&rsquo;m furiously coding or when I&rsquo;m just walking around the house or heck, even while I&rsquo;m reading a book, each day my eyes like to indulge on those shelves, the vivid memories of my reading experiences. That&rsquo;s something the files stored on my precious little Kindle can&rsquo;t offer me.</p>
<p>That also explains why I only tend to buy what I call &rsquo;throw away&rsquo; books on the Kindle. These aren&rsquo;t necessarily bad books (or I wouldn&rsquo;t buy them in the first place). They are mostly leisure readings, you know, thrillers and the like: something that&rsquo;s entertaining to read but it isn&rsquo;t likely to leave me with a long lasting memory, or emotion.</p>
<p>(*) turns out the Border Trilogy, Suzy Lee&rsquo;s book from which the quote__ is taken, has not been published in english, which is a shame. This is a (probably poor) translation of mine_.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MongoDB and REST API go for a picnic (video and slides)</title>
      <link>https://nicolaiarocci.com/mongodb-rest-api-go-picnic-video-slides/</link>
      <pubDate>Tue, 19 Nov 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/mongodb-rest-api-go-picnic-video-slides/</guid>
      <description>&lt;p&gt;I had the opportunity to give my &lt;a href=&#34;https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic&#34;&gt;RESTful WeB APIs and MongoDB Go For A Picnic&lt;/a&gt; talk at both &lt;a href=&#34;http://www.mongotorino.org/&#34;&gt;MongoTorino&lt;/a&gt; and &lt;a href=&#34;http://2013.nosqlday.it/&#34;&gt;NoSQL Day&lt;/a&gt;. The folks at PUG Friuli where so nice to record all the NoSQL Day sessions, so here you have it: the full length &lt;a href=&#34;http://vimeo.com/79662146&#34;&gt;video of yours truly speaking&lt;/a&gt; to a fully packed room crowded with 120 very attentive attendees.&lt;/p&gt;
&lt;p&gt;Unfortunately audio is horrible and while all MongoTorino talks were in english, NoSQL Day was an italian-only event. The slide deck is in english however, and is available on both &lt;a href=&#34;https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic&#34;&gt;SpeakerDeck&lt;/a&gt; and &lt;a href=&#34;http://www.slideshare.net/nicolaiarocci/rest-web-api-with-mongodb&#34;&gt;SlideShare&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I had the opportunity to give my <a href="https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic">RESTful WeB APIs and MongoDB Go For A Picnic</a> talk at both <a href="http://www.mongotorino.org/">MongoTorino</a> and <a href="http://2013.nosqlday.it/">NoSQL Day</a>. The folks at PUG Friuli where so nice to record all the NoSQL Day sessions, so here you have it: the full length <a href="http://vimeo.com/79662146">video of yours truly speaking</a> to a fully packed room crowded with 120 very attentive attendees.</p>
<p>Unfortunately audio is horrible and while all MongoTorino talks were in english, NoSQL Day was an italian-only event. The slide deck is in english however, and is available on both <a href="https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic">SpeakerDeck</a> and <a href="http://www.slideshare.net/nicolaiarocci/rest-web-api-with-mongodb">SlideShare</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>We Are All Remote Workers</title>
      <link>https://nicolaiarocci.com/we-are-all-remote-workers/</link>
      <pubDate>Sat, 07 Sep 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/we-are-all-remote-workers/</guid>
      <description>&lt;p&gt;A little more than a year ago we closed our offices to become a fully distributed company. This story, which is still unfolding, has been the subject of my &lt;a href=&#34;https://speakerdeck.com/nicola/we-are-all-remote-workers&#34;&gt;We Are All Remote Workers&lt;/a&gt; talk at RomagnaCamp 2013.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A little more than a year ago we closed our offices to become a fully distributed company. This story, which is still unfolding, has been the subject of my <a href="https://speakerdeck.com/nicola/we-are-all-remote-workers">We Are All Remote Workers</a> talk at RomagnaCamp 2013.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My interview on being a MongoDB Master</title>
      <link>https://nicolaiarocci.com/my-interview-on-being-a-mongodb-master/</link>
      <pubDate>Wed, 04 Sep 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/my-interview-on-being-a-mongodb-master/</guid>
      <description>&lt;p&gt;So I’ve been interviewed by Laura Czajkowski on my experience and role as a MongoDB Master. The interview actually covers more angles than that and I guess that, if you &lt;em&gt;really&lt;/em&gt; don’t have anything better to do, you might even want to check it out.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How did you get involved in open source?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’ve been an avid developer delivering desktop applications in the .NET/MSSQL closed source ecosystem for so many years that open source wasn’t even on my radar.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So I’ve been interviewed by Laura Czajkowski on my experience and role as a MongoDB Master. The interview actually covers more angles than that and I guess that, if you <em>really</em> don’t have anything better to do, you might even want to check it out.</p>
<blockquote>
<p><strong>How did you get involved in open source?</strong></p>
<p>I’ve been an avid developer delivering desktop applications in the .NET/MSSQL closed source ecosystem for so many years that open source wasn’t even on my radar.</p>
<p>Then a few years ago, like everybody else, we found that we needed to get involved with the mobile world. That’s when I thought that it was time to finally to get out of my comfort zone and start looking out of my walled garden. In fact, while historically there always have been little alternative to the Microsoft/.NET/SQL ecosystem for building business Windows applications, now we were about to address a completely different beast.</p>
<p>First step in any mobile strategy is building a proper web infrastructure, like one or more web APIs, remote servers, etc. While .NET was well suited for the task, I knew that there were other valid, robust and mature alternatives out there and that I had to learn more about them before picking any choice.</p>
<p>My involvement with open source, the whole Python language, MongoDB and the NoSQL movement is the direct consequence of that learning process.</p></blockquote>
<p><!-- raw HTML omitted -->Meeting the EMEA MongoDB Masters – Nicola Iarocci<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve with Python 3.3 Support</title>
      <link>https://nicolaiarocci.com/eve-with-python-3-3-support/</link>
      <pubDate>Thu, 29 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-with-python-3-3-support/</guid>
      <description>&lt;p&gt;Another Eve release is out and I’m particularly proud about it since it brings full Python 3.3 support (among other things). Check out the relevant blog post: &lt;a href=&#34;http://blog.python-eve.org/v009-with-python-33-support&#34;&gt;Eve 0.0.9 is out!&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Another Eve release is out and I’m particularly proud about it since it brings full Python 3.3 support (among other things). Check out the relevant blog post: <a href="http://blog.python-eve.org/v009-with-python-33-support">Eve 0.0.9 is out!</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The Future of Programming</title>
      <link>https://nicolaiarocci.com/the-future-of-programming/</link>
      <pubDate>Wed, 31 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/the-future-of-programming/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://vimeo.com/worrydream&#34;&gt;Bret Victor&lt;/a&gt; on &lt;a href=&#34;https://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://vimeo.com/worrydream">Bret Victor</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Excuses for Lazy Coders</title>
      <link>https://nicolaiarocci.com/excuses-for-lazy-coders/</link>
      <pubDate>Tue, 30 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/excuses-for-lazy-coders/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Did you check for a virus on your system?&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You must have the wrong version.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s a third party application issue.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;That code was written by the last guy.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Programming Excuses&lt;!-- raw HTML omitted --&gt;. We’ve all been there.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Did you check for a virus on your system?</p></blockquote>
<blockquote>
<p>You must have the wrong version.</p></blockquote>
<blockquote>
<p>It’s a third party application issue.</p></blockquote>
<blockquote>
<p>That code was written by the last guy.</p></blockquote>
<p><!-- raw HTML omitted -->Programming Excuses<!-- raw HTML omitted -->. We’ve all been there.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Free Robust Email Validation API</title>
      <link>https://nicolaiarocci.com/free-email-validation-api/</link>
      <pubDate>Mon, 29 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/free-email-validation-api/</guid>
      <description>&lt;p&gt;The guys at Mailgun are taking a &lt;!-- raw HTML omitted --&gt;very interesting approach&lt;!-- raw HTML omitted --&gt; at the ever-lasting problem of proper Email validation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given an arbitrary address this service validates address based off syntax checks (RFC defined grammar), DNS validation, spell checks, and if available, Email ServiceProvider (ESP) specific local-part grammar.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;They’re relying on &lt;!-- raw HTML omitted --&gt;formal grammar&lt;!-- raw HTML omitted --&gt; and not on regex like the rest of us, which is perhaps the more intriguing aspect of the project. Being Email Service Providers themselves they have good knowledge of most ESPs local-part grammars (the left side of the @ symbol) so when there is a match, they’re validating local-parts too.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The guys at Mailgun are taking a <!-- raw HTML omitted -->very interesting approach<!-- raw HTML omitted --> at the ever-lasting problem of proper Email validation:</p>
<blockquote>
<p>Given an arbitrary address this service validates address based off syntax checks (RFC defined grammar), DNS validation, spell checks, and if available, Email ServiceProvider (ESP) specific local-part grammar.</p></blockquote>
<p>They’re relying on <!-- raw HTML omitted -->formal grammar<!-- raw HTML omitted --> and not on regex like the rest of us, which is perhaps the more intriguing aspect of the project. Being Email Service Providers themselves they have good knowledge of most ESPs local-part grammars (the left side of the @ symbol) so when there is a match, they’re validating local-parts too.</p>
<p>At the cost of a slight delay DNS, MX and A record validation adds robustness to the process (didn’t really perceive any slowness during my tests). What really shines however, at least in my eyes, is the included “correct address suggestion service”.</p>
<p>At the moment they are providing a <!-- raw HTML omitted -->free API<!-- raw HTML omitted -->  and a <!-- raw HTML omitted -->mail address validation page<!-- raw HTML omitted -->. Here’s the catch: consuming the API requires a free Mailgun account. According to their own statement however they are also going to <a href="http://blog.mailgun.com/post/free-email-validation-api-for-web-forms/#comment-977817227">open source the tool</a> and yes, it’s going to be in Python.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve v0.0.8 has been released</title>
      <link>https://nicolaiarocci.com/eve-v0-0-8-has-been-released/</link>
      <pubDate>Thu, 25 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-v0-0-8-has-been-released/</guid>
      <description>&lt;p&gt;Most significant features are probably the native support for MongoDB write concern settings, new event hooks allowing for transformation of documents before they are sent to clients, increased handling of both pagination and CORS, and the native validation of float data types.&lt;/p&gt;
&lt;p&gt;Get it on &lt;!-- raw HTML omitted --&gt;PyPI&lt;!-- raw HTML omitted --&gt;, go straight to the &lt;!-- raw HTML omitted --&gt;source code&lt;!-- raw HTML omitted --&gt; or more likely, visit the &lt;!-- raw HTML omitted --&gt;project homepage&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Most significant features are probably the native support for MongoDB write concern settings, new event hooks allowing for transformation of documents before they are sent to clients, increased handling of both pagination and CORS, and the native validation of float data types.</p>
<p>Get it on <!-- raw HTML omitted -->PyPI<!-- raw HTML omitted -->, go straight to the <!-- raw HTML omitted -->source code<!-- raw HTML omitted --> or more likely, visit the <!-- raw HTML omitted -->project homepage<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>ORM is an anti-pattern</title>
      <link>https://nicolaiarocci.com/orm-is-an-anti-pattern/</link>
      <pubDate>Wed, 24 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/orm-is-an-anti-pattern/</guid>
      <description>&lt;p&gt;In &lt;!-- raw HTML omitted --&gt;ORM is an anti-pattern&lt;!-- raw HTML omitted --&gt; Laurie Voss concentrates everything I’ve been saying on the ORM plague in all these years.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your project really does not need any relational data features, then ORM will work perfectly for you, but then you have a different problem: you’re using the wrong datastore. The overhead of a relational datastore is enormous; this is a large part of why NoSQL data stores are so much faster. If your data is relational, however, that overhead is worth it: your database does not merely &lt;em&gt;store&lt;/em&gt; your data, it &lt;strong&gt;represents&lt;/strong&gt; your data and can answer questions about it on the basis of the relations captured, far more efficiently than you could in procedural code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In <!-- raw HTML omitted -->ORM is an anti-pattern<!-- raw HTML omitted --> Laurie Voss concentrates everything I’ve been saying on the ORM plague in all these years.</p>
<blockquote>
<p>If your project really does not need any relational data features, then ORM will work perfectly for you, but then you have a different problem: you’re using the wrong datastore. The overhead of a relational datastore is enormous; this is a large part of why NoSQL data stores are so much faster. If your data is relational, however, that overhead is worth it: your database does not merely <em>store</em> your data, it <strong>represents</strong> your data and can answer questions about it on the basis of the relations captured, far more efficiently than you could in procedural code.</p></blockquote>
<p>I don’t really know how this article managed to elude my usually long-reaching radar for such a long time.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MongoDB Masters Summit 2013</title>
      <link>https://nicolaiarocci.com/mongodb-masters-summit-2013/</link>
      <pubDate>Tue, 25 Jun 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/mongodb-masters-summit-2013/</guid>
      <description>&lt;p&gt;I’m just back from the &lt;!-- raw HTML omitted --&gt;MongoDB Masters&lt;!-- raw HTML omitted --&gt; Summit hosted by 10Gen in New York City. In just a couple days I was given the opportunity to meet and share knowledge (and fun!) with amazingly talented minds coming from all over the world. I’m back with literally dozen new ideas opportunities and concepts, on which I’ll need to elaborate a little bit. While I cannot comment on the many things the smart minds at 10Gen are working on, rest assured that the future of MongoDB is looking great and brighter than ever.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’m just back from the <!-- raw HTML omitted -->MongoDB Masters<!-- raw HTML omitted --> Summit hosted by 10Gen in New York City. In just a couple days I was given the opportunity to meet and share knowledge (and fun!) with amazingly talented minds coming from all over the world. I’m back with literally dozen new ideas opportunities and concepts, on which I’ll need to elaborate a little bit. While I cannot comment on the many things the smart minds at 10Gen are working on, rest assured that the future of MongoDB is looking great and brighter than ever.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MongoDB User Group a Cesena</title>
      <link>https://nicolaiarocci.com/mongodb-user-group/</link>
      <pubDate>Mon, 03 Jun 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/mongodb-user-group/</guid>
      <description>&lt;p&gt;Domani sarò al primo meeting romagnolo del #MUG MongoDB User Group organizzato da 10Gen (azienda dietro a MongoDB), Byte-Code e Ideato.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Parlerò di MongoDB usato come backend per una REST WEB API. &lt;!-- raw HTML omitted --&gt;L’evento si svolgerà in serata a Cesena, è gratuito, e ci sono ancora &lt;a href=&#34;http://www.eventbrite.com/event/6297117849&#34;&gt;posti disponibili&lt;/a&gt;. Se ci siete passate a salutarmi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Domani sarò al primo meeting romagnolo del #MUG MongoDB User Group organizzato da 10Gen (azienda dietro a MongoDB), Byte-Code e Ideato.</p>
<p><!-- raw HTML omitted -->Parlerò di MongoDB usato come backend per una REST WEB API. <!-- raw HTML omitted -->L’evento si svolgerà in serata a Cesena, è gratuito, e ci sono ancora <a href="http://www.eventbrite.com/event/6297117849">posti disponibili</a>. Se ci siete passate a salutarmi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Champion Pythonista</title>
      <link>https://nicolaiarocci.com/champion-pythonista/</link>
      <pubDate>Tue, 21 May 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/champion-pythonista/</guid>
      <description>&lt;p&gt;La &lt;!-- raw HTML omitted --&gt;Open Source Report Card&lt;!-- raw HTML omitted --&gt; è un’iniziativa divertente. E’ difficile resistere al richiamo dell’ego… soprattutto quand’è smisurato.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nicola is a champion Pythonista (one of the top 11% most active Python users) who loves pushing code. Nicola is a nine-to-fiver who seems to work best in the mid-afternoon.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>La <!-- raw HTML omitted -->Open Source Report Card<!-- raw HTML omitted --> è un’iniziativa divertente. E’ difficile resistere al richiamo dell’ego… soprattutto quand’è smisurato.</p>
<blockquote>
<p>Nicola is a champion Pythonista (one of the top 11% most active Python users) who loves pushing code. Nicola is a nine-to-fiver who seems to work best in the mid-afternoon.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Sito ufficiale e blog per il progetto Eve</title>
      <link>https://nicolaiarocci.com/sito-ufficiale-e-blog-per-il-progetto-eve/</link>
      <pubDate>Tue, 14 May 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sito-ufficiale-e-blog-per-il-progetto-eve/</guid>
      <description>&lt;p&gt;E’ passato qualche mese da quando ho &lt;a href=&#34;http://nicolaiarocci.com/vi-presento-eve-il-framework-per-lanciare-la-vostra-rest-api-web/&#34; title=&#34;Annuncio di Eve&#34;&gt;annunciato&lt;/a&gt; Eve, il REST API framework open source. Nel frattempo il progetto è cresciuto bene: siamo appena giunti alla &lt;a href=&#34;http://blog.python-eve.org/eve-006-released&#34; title=&#34;Eve 0.0.6&#34;&gt;versione 0.0.6&lt;/a&gt;, abbiamo un &lt;a href=&#34;http://python-eve.org&#34; title=&#34;Eve REST API homepage&#34;&gt;sito ufficiale&lt;/a&gt;, un &lt;a href=&#34;http://blog.python-eve.org&#34; title=&#34;Eve News&#34;&gt;blog&lt;/a&gt;, e stiamo lavorando a nuove feature &lt;a href=&#34;http://blog.python-eve.org/sqlalchemy-and-eve&#34; title=&#34;SqlAlchemy and Eve&#34;&gt;davvero interessanti&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>E’ passato qualche mese da quando ho <a href="http://nicolaiarocci.com/vi-presento-eve-il-framework-per-lanciare-la-vostra-rest-api-web/" title="Annuncio di Eve">annunciato</a> Eve, il REST API framework open source. Nel frattempo il progetto è cresciuto bene: siamo appena giunti alla <a href="http://blog.python-eve.org/eve-006-released" title="Eve 0.0.6">versione 0.0.6</a>, abbiamo un <a href="http://python-eve.org" title="Eve REST API homepage">sito ufficiale</a>, un <a href="http://blog.python-eve.org" title="Eve News">blog</a>, e stiamo lavorando a nuove feature <a href="http://blog.python-eve.org/sqlalchemy-and-eve" title="SqlAlchemy and Eve">davvero interessanti</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hacking Italia</title>
      <link>https://nicolaiarocci.com/hacking-italia/</link>
      <pubDate>Tue, 07 May 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/hacking-italia/</guid>
      <description>&lt;p&gt;Aderisco con entusiasmo all’iniziativa di Salvatore.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://hackingitalia.com&#34; title=&#34;Hacking Italia&#34;&gt;Hacking Italia&lt;/a&gt; e’ un sito di “social news”, molto simile ad Hacker News, il celebre collettore di news per hacker di YCombinator. A che serve un sito italiano, e in italiano se c’e’ gia’ molto di piu’ e di meglio nel panorama internazionale? A mettere assieme una massa critica di persone “giuste” in Italia.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Vi consiglio di aggiungere HI ai vostri bookmark. Per quanto mi riguarda conto di essere molto attivo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Aderisco con entusiasmo all’iniziativa di Salvatore.</p>
<blockquote>
<p><a href="http://hackingitalia.com" title="Hacking Italia">Hacking Italia</a> e’ un sito di “social news”, molto simile ad Hacker News, il celebre collettore di news per hacker di YCombinator. A che serve un sito italiano, e in italiano se c’e’ gia’ molto di piu’ e di meglio nel panorama internazionale? A mettere assieme una massa critica di persone “giuste” in Italia.</p></blockquote>
<p>Vi consiglio di aggiungere HI ai vostri bookmark. Per quanto mi riguarda conto di essere molto attivo.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Guida introduttiva agli HTTP Cache Header</title>
      <link>https://nicolaiarocci.com/guida-introduttiva-agli-http-cache-header/</link>
      <pubDate>Fri, 03 May 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/guida-introduttiva-agli-http-cache-header/</guid>
      <description>&lt;p&gt;Cosa sono i gli HTTP Cache Header e come funzionano? Che uso ne fanno i browser e le CDN? Come è preferibile impostarli per ottimizzare le prestazioni di un sito o di un servizio web? Se volete saperne di più &lt;!-- raw HTML omitted --&gt;A Beginner’s Guide to HTTP Cache Headers&lt;!-- raw HTML omitted --&gt; fa senz’altro per voi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Cosa sono i gli HTTP Cache Header e come funzionano? Che uso ne fanno i browser e le CDN? Come è preferibile impostarli per ottimizzare le prestazioni di un sito o di un servizio web? Se volete saperne di più <!-- raw HTML omitted -->A Beginner’s Guide to HTTP Cache Headers<!-- raw HTML omitted --> fa senz’altro per voi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quali sono i font migliori per scrivere codice?</title>
      <link>https://nicolaiarocci.com/quali-sono-i-font-migliori-per-scrivere-codice/</link>
      <pubDate>Tue, 30 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/quali-sono-i-font-migliori-per-scrivere-codice/</guid>
      <description>&lt;p&gt;Malgrado la giovane età Source Code Pro di Adobe domina incontrastato, col più classico Consolas come sua regina. Inconsolata-g e Monaco seguono a distanza mentre il mio preferito, Menlo, è tristemente indietro: &lt;!-- raw HTML omitted --&gt;What Are the Best Programming Fonts?&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Malgrado la giovane età Source Code Pro di Adobe domina incontrastato, col più classico Consolas come sua regina. Inconsolata-g e Monaco seguono a distanza mentre il mio preferito, Menlo, è tristemente indietro: <!-- raw HTML omitted -->What Are the Best Programming Fonts?<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Multi-threading in Python</title>
      <link>https://nicolaiarocci.com/multi-threading-in-python/</link>
      <pubDate>Tue, 23 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/multi-threading-in-python/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Multithreaded Python Tutorial with the “Threadworms” Demo&lt;!-- raw HTML omitted --&gt; è un’ottima guida introduttiva ai &lt;!-- raw HTML omitted --&gt;thread&lt;!-- raw HTML omitted --&gt; ed alla programmazione multithread in Python. Dalla teoria alla pratica, in pochi minuti si arriva a creare una variante multithread di &lt;!-- raw HTML omitted --&gt;Snake.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Multithreaded Python Tutorial with the “Threadworms” Demo<!-- raw HTML omitted --> è un’ottima guida introduttiva ai <!-- raw HTML omitted -->thread<!-- raw HTML omitted --> ed alla programmazione multithread in Python. Dalla teoria alla pratica, in pochi minuti si arriva a creare una variante multithread di <!-- raw HTML omitted -->Snake.<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Gestione degli Eventi in Python</title>
      <link>https://nicolaiarocci.com/gestione-degli-eventi-in-python/</link>
      <pubDate>Thu, 14 Mar 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/gestione-degli-eventi-in-python/</guid>
      <description>&lt;p&gt;Gli eventi sono molto usati nelle GUI e nelle implementazioni del modello MVC (Model, View, Controller). Un’altra applicazione tipica è nei protocolli di comunicazione, laddove layer di basso livello devono informare quelli più alti quando ci sono dati in ingresso o in uscita.&lt;/p&gt;
&lt;p&gt;Il linguaggio C# dispone da sempre di una soluzione elegante al problema della gestione degli eventi: il delegato EventHandler. &lt;a href=&#34;https://github.com/nicolaiarocci/events&#34; title=&#34;Events: Bringing the elegance of C# EventHandler to Python&#34;&gt;Events&lt;/a&gt; è una mia implementazione Python del EventHandler C#. In pratica si tratta di una classe molto leggera che incapsula il cuore del meccanismo di sottoscrizione e gestione degli eventi, e tenta di farlo in maniera “naturale”, sembrando parte integrante del linguaggio Python.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Gli eventi sono molto usati nelle GUI e nelle implementazioni del modello MVC (Model, View, Controller). Un’altra applicazione tipica è nei protocolli di comunicazione, laddove layer di basso livello devono informare quelli più alti quando ci sono dati in ingresso o in uscita.</p>
<p>Il linguaggio C# dispone da sempre di una soluzione elegante al problema della gestione degli eventi: il delegato EventHandler. <a href="https://github.com/nicolaiarocci/events" title="Events: Bringing the elegance of C# EventHandler to Python">Events</a> è una mia implementazione Python del EventHandler C#. In pratica si tratta di una classe molto leggera che incapsula il cuore del meccanismo di sottoscrizione e gestione degli eventi, e tenta di farlo in maniera “naturale”, sembrando parte integrante del linguaggio Python.</p>
<h2 id="come-usare-events">Come usare Events</h2>
<p>Tecnicamente un evento è qualcosa a cui è possibile “attaccare” una o più funzioni di callback. Prima di tutto creiamo una funzione di callback che verrà invocata allo scatenarsi dell’evento a cui siamo interessati:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Poi ‘iscriviamo’ la nostra funzione all’evento:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Notate come l’evento sia al tempo stesso dichiarato e sottoscritto, in un’unico passaggio. Più funzioni possono sottoscrivere lo stesso evento. Quando si scatena un evento tutte le funzioni ad esso collegate vengono invocate in sequenza. Per scatenare l’evento ci basta eseguire una chiamata all’evento stesso:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="un-esempio-di-modello-model-view-controller">Un esempio di modello Model-View-Controller</h2>
<p>In genere nell’implementazione di uno schema MVC l’istanza della classe Events farà parte di un Modello, come in questo esempio:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Oggetti View e Controller ne sono i tipici  sottoscrittori:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>E’ inoltre possibile vincolare il nome degli eventi e fare l’introspezione delle sole due classi che costituiscono Events. La <a href="http://events.readthedocs.org/" title="Events">documentazione</a> include gli esempi e le istruzioni per l’installazione; il <a href="https://github.com/nicolaiarocci/events" title="Events on GitHub">codice sorgente</a> è a disposizione su GitHub. Buon divertimento!</p>]]></content:encoded>
    </item>
    <item>
      <title>Le profonde intuizioni di Alan Kay</title>
      <link>https://nicolaiarocci.com/le-profonde-intuizioni-di-alan-kay/</link>
      <pubDate>Thu, 28 Feb 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/le-profonde-intuizioni-di-alan-kay/</guid>
      <description>&lt;p&gt;Durante una conferenza di qualche tempo fa lo speaker, rivolto a una sala gremita di programmatori e informatici, chiese quanti conoscevano Alan Kay. Con suo (e mio) grande stupore pochissimi alzarono le mani.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;The Deep Insights of Alan Kay&lt;!-- raw HTML omitted --&gt;  è un tributo da non perdere a questo vero gigante dell’informatica, tra l’altro impreziosito da una selezione di link ad alcuni dei suoi interventi più importanti, spesso tenuti in occasione del ritiro dei numerosi premi ricevuti in carriera (tra gli altri, l’Alan Turing per il fondamentale contributo alla programmazione orientata agli oggetti).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Durante una conferenza di qualche tempo fa lo speaker, rivolto a una sala gremita di programmatori e informatici, chiese quanti conoscevano Alan Kay. Con suo (e mio) grande stupore pochissimi alzarono le mani.</p>
<p><!-- raw HTML omitted -->The Deep Insights of Alan Kay<!-- raw HTML omitted -->  è un tributo da non perdere a questo vero gigante dell’informatica, tra l’altro impreziosito da una selezione di link ad alcuni dei suoi interventi più importanti, spesso tenuti in occasione del ritiro dei numerosi premi ricevuti in carriera (tra gli altri, l’Alan Turing per il fondamentale contributo alla programmazione orientata agli oggetti).</p>
<blockquote>
<p>Il modo migliore di predire il futuro è inventarlo</p></blockquote>
<blockquote>
<p>– Alan Kay</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Backbone.JS vs Angular.JS: dissacrare il mito</title>
      <link>https://nicolaiarocci.com/backbone-js-vs-angular-js-dissacrare-il-mito/</link>
      <pubDate>Mon, 25 Feb 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/backbone-js-vs-angular-js-dissacrare-il-mito/</guid>
      <description>&lt;p&gt;Lettura interessante se state cercando quello giusto fra le decine di front-end framework disponibili.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I love the way how each and every discussion turns into the war of the frameworks. I have worked with BackboneJS and AngularJS quite extensively and have come across most of their short comings in production. So, you dont really have to take this analysis with a grain of salt. I would be happy to take back anything that I have said if it turns out to be wrong. Lets get to the meat of it, then, shall we?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lettura interessante se state cercando quello giusto fra le decine di front-end framework disponibili.</p>
<blockquote>
<p>I love the way how each and every discussion turns into the war of the frameworks. I have worked with BackboneJS and AngularJS quite extensively and have come across most of their short comings in production. So, you dont really have to take this analysis with a grain of salt. I would be happy to take back anything that I have said if it turns out to be wrong. Lets get to the meat of it, then, shall we?</p></blockquote>
<p><!-- raw HTML omitted -->Backbone vs Angular: Demystifying the myths<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Libri gratuiti sul linguaggio C</title>
      <link>https://nicolaiarocci.com/libri-gratuiti-sul-linguaggio-c/</link>
      <pubDate>Sat, 09 Feb 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/libri-gratuiti-sul-linguaggio-c/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;9 of the Best Free C Books&lt;!-- raw HTML omitted --&gt; è un’ottima selezione di libri gratuiti sul linguaggio C. C’è n’è per tutti, dai testi per principianti a quelli per programmatori esperti provenienti da altri linguaggi. Lo sapete già, C dovrebbe far parte del bagaglio di ogni programmatore.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->9 of the Best Free C Books<!-- raw HTML omitted --> è un’ottima selezione di libri gratuiti sul linguaggio C. C’è n’è per tutti, dai testi per principianti a quelli per programmatori esperti provenienti da altri linguaggi. Lo sapete già, C dovrebbe far parte del bagaglio di ogni programmatore.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Vi presento Eve il framework per le REST API Web</title>
      <link>https://nicolaiarocci.com/vi-presento-eve-il-framework-per-lanciare-la-vostra-rest-api-web/</link>
      <pubDate>Tue, 08 Jan 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/vi-presento-eve-il-framework-per-lanciare-la-vostra-rest-api-web/</guid>
      <description>&lt;p&gt;Lo scorso anno abbiamo lavorato duro per costruirci una RESTful Web API su misura, flessibile e completa. In corso d’opera abbiamo imparato molto sulle migliori pratiche REST, mettendo anche alla frusta le rinomate capacità Web del linguaggio Python.&lt;/p&gt;
&lt;p&gt;Ad EuroPython 2012 ho poi &lt;a href=&#34;http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/&#34;&gt;raccontato la nostra esperienza&lt;/a&gt; e condiviso ciò che avevamo imparato. In quell’occasione mi sono reso conto di quanto l’argomento fosse d’attualità, tanto che da quel 4 luglio le slide che avevo preparato (le trovate su &lt;!-- raw HTML omitted --&gt;Speaker Deck&lt;!-- raw HTML omitted --&gt; o &lt;!-- raw HTML omitted --&gt;Slideshare&lt;!-- raw HTML omitted --&gt;) ed i video su YouTube (&lt;!-- raw HTML omitted --&gt;italiano&lt;!-- raw HTML omitted --&gt;; &lt;!-- raw HTML omitted --&gt;inglese&lt;!-- raw HTML omitted --&gt;) hanno totalizzato 30mila visite. Da allora ricevo continue richieste di chiarimenti, suggerimenti, approfondimenti, consigli. Soprattutto, mi si chiedono esempi di codice. In fin dei conti prima o poi qualunque sviluppatore web si trova, volente o nolente, a fare i conti con una REST API.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lo scorso anno abbiamo lavorato duro per costruirci una RESTful Web API su misura, flessibile e completa. In corso d’opera abbiamo imparato molto sulle migliori pratiche REST, mettendo anche alla frusta le rinomate capacità Web del linguaggio Python.</p>
<p>Ad EuroPython 2012 ho poi <a href="http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/">raccontato la nostra esperienza</a> e condiviso ciò che avevamo imparato. In quell’occasione mi sono reso conto di quanto l’argomento fosse d’attualità, tanto che da quel 4 luglio le slide che avevo preparato (le trovate su <!-- raw HTML omitted -->Speaker Deck<!-- raw HTML omitted --> o <!-- raw HTML omitted -->Slideshare<!-- raw HTML omitted -->) ed i video su YouTube (<!-- raw HTML omitted -->italiano<!-- raw HTML omitted -->; <!-- raw HTML omitted -->inglese<!-- raw HTML omitted -->) hanno totalizzato 30mila visite. Da allora ricevo continue richieste di chiarimenti, suggerimenti, approfondimenti, consigli. Soprattutto, mi si chiedono esempi di codice. In fin dei conti prima o poi qualunque sviluppatore web si trova, volente o nolente, a fare i conti con una REST API.</p>
<p>Così ho pensato che avrei potuto prendere il nostro codice proprietario (nome interno Adam), sistemarlo un po’ in modo che si adattasse ai casi d’uso più comuni, e rilasciarlo come progetto open source. Be’ c’è voluto un bel po’ di lavoro, ben più di quello inizialmente preventivato, ma ora ci siamo. Il progetto è finalmente disponibile, e naturalmente si chiama <!-- raw HTML omitted -->Eve<!-- raw HTML omitted -->.</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>Costruire e lanciare una API con Eve è semplice. Servono tre cose; un database, un file di configurazione, uno script di lancio. MongoDB è già supportato; sviluppare estensioni per altri database SQL/NoSQL non dovrebbe essere troppo complicato. Le personalizzazioni della vostra API sono salvate in un modulo standard Python. Lo script di esecuzione è in genere davvero semplice:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Le API basate su Eve supportano l’intero range di operazioni CRUD (Create, Read, Update, Delete). Ogni end-point è personalizzabile e supporta filtri, paginazione e ordinamenti. Per massima accessibilità i client possono chiedere che le risposte pervengano in JSON oppure XML. Sono supportati gli inserimenti multipli, le direttive di caching per i client, il versioning e… tante altre cosette.</p>
<p>Non mi dilungo oltre poiché su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted --> trovate tutto quel che serve: documentazione (al momento piuttosto scarna), codice e progetti satellite. In particolare date un’occhiata a <!-- raw HTML omitted -->Eve-Demo<!-- raw HTML omitted -->, una API funzionante messa su in pochi minuti grazie a Eve. Potete consultarla direttamente, via cURL per esempio, o anche <!-- raw HTML omitted -->via browser<!-- raw HTML omitted --> (in questo caso vi beccherete del XML in risposta, mentre via cURL o altro potrete scegliere JSON). Il README di eve-demo include una serie completa di esempi relativi alle varie operazioni di lettura, inserimento, cancellazione, aggiornamento.</p>
<p>C’è ancora tanto da fare affinché Eve diventi il framework completo, stabile e maturo che ho in mente ma credo che il progetto ora sia pronto per una anteprima pubblica. In ogni caso sono lieto di dare finalmente risposta alle richieste di questi mesi: ora avete il codice; usatelo come volete. Spero anche e soprattutto di raccogliere critiche, consigli e suggerimenti; magari a qualcuno verrà anche voglia di collaborare!</p>
<p>PS: Buon 2013!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python ti mette le ali</title>
      <link>https://nicolaiarocci.com/python-ti-mette-le-ali/</link>
      <pubDate>Sat, 15 Dec 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-ti-mette-le-ali/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Aggiornato il Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/aggiornato-il-piccolo-libro-di-mongodb/</link>
      <pubDate>Sat, 24 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/aggiornato-il-piccolo-libro-di-mongodb/</guid>
      <description>&lt;p&gt;Finalmente ho trovato il tempo per aggiornare &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB&#34;&gt;Il Piccolo Libro di MongoDB&lt;/a&gt;. Grazie ai contributi di Andrea Rabbaglietti e Michele Zonca sono stati corretti molti errori sparsi qui e là nel testo. Ho approfittato dell’occasione per ritoccare il formato grafico allineandolo alla versione più recente dell’edizione inglese. Se avete già scaricato il libro vi consiglio di rifarlo: la nuova edizione è decisamente più leggibile.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Finalmente ho trovato il tempo per aggiornare <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB">Il Piccolo Libro di MongoDB</a>. Grazie ai contributi di Andrea Rabbaglietti e Michele Zonca sono stati corretti molti errori sparsi qui e là nel testo. Ho approfittato dell’occasione per ritoccare il formato grafico allineandolo alla versione più recente dell’edizione inglese. Se avete già scaricato il libro vi consiglio di rifarlo: la nuova edizione è decisamente più leggibile.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 0.0.2: tipi di dato personalizzati</title>
      <link>https://nicolaiarocci.com/cerberus-0-0-2-tipi-di-dato-personalizzati/</link>
      <pubDate>Thu, 22 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-0-0-2-tipi-di-dato-personalizzati/</guid>
      <description>&lt;p&gt;Primo aggiornamento per &lt;!-- raw HTML omitted --&gt;Cerberus&lt;!-- raw HTML omitted --&gt;,
lo strumento per la convalida dei dizionari Python che ho rilasciato qualche
tempo fa. Ora è possibile estendere la lista dei tipi di dato da convalidare,
aggiungendone di propri. Per esempio nella nostra REST API (che usa Cerberus
per la validazione) uso questa tecnica per implementare e convalidare il tipo
&lt;code&gt;ObjectId&lt;/code&gt;, tipico di MongoDB. I dettagli
li trovate nella &lt;!-- raw HTML omitted --&gt;documentazione&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Primo aggiornamento per <!-- raw HTML omitted -->Cerberus<!-- raw HTML omitted -->,
lo strumento per la convalida dei dizionari Python che ho rilasciato qualche
tempo fa. Ora è possibile estendere la lista dei tipi di dato da convalidare,
aggiungendone di propri. Per esempio nella nostra REST API (che usa Cerberus
per la validazione) uso questa tecnica per implementare e convalidare il tipo
<code>ObjectId</code>, tipico di MongoDB. I dettagli
li trovate nella <!-- raw HTML omitted -->documentazione<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Come evitare i trabocchetti di MongoDB</title>
      <link>https://nicolaiarocci.com/come-evitare-i-trabocchetti-di-mongodb/</link>
      <pubDate>Sat, 17 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-evitare-i-trabocchetti-di-mongodb/</guid>
      <description>&lt;p&gt;E niente, è un articolo così importante che mi sono procurato dall’autore il permesso di curarne la traduzione. Solo che non trovo il tempo per farla la traduzione, quindi vi passo direttamente l’originale. In &lt;!-- raw HTML omitted --&gt;MongoDB Gotchas &amp;amp; How To Avoid Them&lt;!-- raw HTML omitted --&gt; Russel Smith raccoglie una decina di preziosi consigli che non potete assolutamente perdervi se state pensando di usare MongoDB in produzione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>E niente, è un articolo così importante che mi sono procurato dall’autore il permesso di curarne la traduzione. Solo che non trovo il tempo per farla la traduzione, quindi vi passo direttamente l’originale. In <!-- raw HTML omitted -->MongoDB Gotchas &amp; How To Avoid Them<!-- raw HTML omitted --> Russel Smith raccoglie una decina di preziosi consigli che non potete assolutamente perdervi se state pensando di usare MongoDB in produzione.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio 1.5</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-1-5/</link>
      <pubDate>Thu, 01 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-1-5/</guid>
      <description>&lt;p&gt;Seguo il progetto Python Tools per Visual Studio da &lt;a href=&#34;http://nicolaiarocci.com/?s=python+tools+visual+studio&amp;amp;submit=Search&#34; title=&#34;Python Tools per Visual Studio&#34;&gt;molto tempo&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Python Tools per Visual Studio è un plugin gratuito e open source che trasforma Visual Studio in una IDE per Python. Supporta CPython, IronPython, Intellisense, Debugging, Profiling, Editing, Browsing, REPL Multipli, IPython, Django e Cloud Computing con librerie client per Windows, Linux e OS X (Azure).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;La &lt;!-- raw HTML omitted --&gt;versione 1.5&lt;!-- raw HTML omitted --&gt;, rilasciata oggi, aggiunge supporto per Django, Azure, REPL debugging, Visual Studio 2012 e altro.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Seguo il progetto Python Tools per Visual Studio da <a href="http://nicolaiarocci.com/?s=python+tools+visual+studio&amp;submit=Search" title="Python Tools per Visual Studio">molto tempo</a>.</p>
<blockquote>
<p>Python Tools per Visual Studio è un plugin gratuito e open source che trasforma Visual Studio in una IDE per Python. Supporta CPython, IronPython, Intellisense, Debugging, Profiling, Editing, Browsing, REPL Multipli, IPython, Django e Cloud Computing con librerie client per Windows, Linux e OS X (Azure).</p></blockquote>
<p>La <!-- raw HTML omitted -->versione 1.5<!-- raw HTML omitted -->, rilasciata oggi, aggiunge supporto per Django, Azure, REPL debugging, Visual Studio 2012 e altro.</p>
]]></content:encoded>
    </item>
    <item>
      <title>La documentazione di Django in formato ePub</title>
      <link>https://nicolaiarocci.com/la-documentazione-di-django-in-formato-epub/</link>
      <pubDate>Wed, 31 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/la-documentazione-di-django-in-formato-epub/</guid>
      <description>&lt;p&gt;Grazie al lavoro di Pedro Kroger la documentazione di Django è disponibile in formato ePub:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Grazie al lavoro di Pedro Kroger la documentazione di Django è disponibile in formato ePub:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>REST API con MongoDB</title>
      <link>https://nicolaiarocci.com/rest-api-con-mongodb/</link>
      <pubDate>Fri, 26 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/rest-api-con-mongodb/</guid>
      <description>&lt;p&gt;Le slide che ho presentato a ‘&lt;!-- raw HTML omitted --&gt;A Morning with MongoDB&lt;!-- raw HTML omitted --&gt;‘ (24 ottobre, Milano) sono disponibili online. Gran parte degli interventi erano di tipo divulgativo ed inizialmente ero preoccupato che i miei contenuti fossero troppo tecnici. In realtà in sala c’erano davvero tanti programmatori, quindi tutto è andato bene.&lt;/p&gt;
&lt;p&gt;A margine dell’evento molte le domande su &lt;!-- raw HTML omitted --&gt;Eve&lt;!-- raw HTML omitted --&gt;, la REST API open source a cui sto lavorando e che conto di rilasciare entro fine anno: bene! Grazie a tutti i partecipanti ed a 10Gen per avermi invitato.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Le slide che ho presentato a ‘<!-- raw HTML omitted -->A Morning with MongoDB<!-- raw HTML omitted -->‘ (24 ottobre, Milano) sono disponibili online. Gran parte degli interventi erano di tipo divulgativo ed inizialmente ero preoccupato che i miei contenuti fossero troppo tecnici. In realtà in sala c’erano davvero tanti programmatori, quindi tutto è andato bene.</p>
<p>A margine dell’evento molte le domande su <!-- raw HTML omitted -->Eve<!-- raw HTML omitted -->, la REST API open source a cui sto lavorando e che conto di rilasciare entro fine anno: bene! Grazie a tutti i partecipanti ed a 10Gen per avermi invitato.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Convalidare un dizionario Python con Cerberus</title>
      <link>https://nicolaiarocci.com/convalidare-un-dizionario-python-con-cerberus/</link>
      <pubDate>Tue, 16 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/convalidare-un-dizionario-python-con-cerberus/</guid>
      <description>&lt;p&gt;Da qualche giorno ho rilasciato &lt;!-- raw HTML omitted --&gt;Cerberus&lt;!-- raw HTML omitted --&gt;, uno strumento per la convalida dei dizionari Python. Gli passate un dizionario, lui lo confronta con uno schema di convalida e, se c’è qualcosa che non va (per esempio una chiave sconosciuta, oppure un valore di tipo sbagliato), ve lo segnala.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Sono due le caratteristiche che rendono Cerberus interessante: è facilmente estensibile (la &lt;!-- raw HTML omitted --&gt;documentazione&lt;!-- raw HTML omitted --&gt; include un esempio di estensione del sistema di convalida), e non si blocca sollevando un’eccezione al primo problema riscontrato: gli errori, quando presenti, sono tutti riportati in una lista a fine convalida.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da qualche giorno ho rilasciato <!-- raw HTML omitted -->Cerberus<!-- raw HTML omitted -->, uno strumento per la convalida dei dizionari Python. Gli passate un dizionario, lui lo confronta con uno schema di convalida e, se c’è qualcosa che non va (per esempio una chiave sconosciuta, oppure un valore di tipo sbagliato), ve lo segnala.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Sono due le caratteristiche che rendono Cerberus interessante: è facilmente estensibile (la <!-- raw HTML omitted -->documentazione<!-- raw HTML omitted --> include un esempio di estensione del sistema di convalida), e non si blocca sollevando un’eccezione al primo problema riscontrato: gli errori, quando presenti, sono tutti riportati in una lista a fine convalida.</p>
<p>Cerberus è un progetto open source tutt’ora in pieno sviluppo, al quale è possibile partecipare. E’ alla base del sistema di convalida impiegato dalla nostra REST API, ma può e dovrebbe vivere di vita propria – per esempio nei vostri progetti. A proposito, la stessa RESTful Web API, <a href="http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/" title="Sviluppare una RESTful Web API con Python">quella di cui ho parlato a EuroPython</a>, sarà rilasciata come progetto open source. Stay tuned.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Una mattinata con MongoDB</title>
      <link>https://nicolaiarocci.com/una-mattinata-con-mongodb/</link>
      <pubDate>Wed, 10 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/una-mattinata-con-mongodb/</guid>
      <description>&lt;p&gt;Il prossimo 24 ottobre sarò a Milano per &lt;!-- raw HTML omitted --&gt;A Morning with MongoDB&lt;!-- raw HTML omitted --&gt;, evento ufficiale 10gen nel corso del quale racconterò la mia esperienza nell’integrazione di MongoDB in una Web REST API. Partecipazione e &lt;!-- raw HTML omitted --&gt;registrazione&lt;!-- raw HTML omitted --&gt; sono gratuite: cosa aspettate?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il prossimo 24 ottobre sarò a Milano per <!-- raw HTML omitted -->A Morning with MongoDB<!-- raw HTML omitted -->, evento ufficiale 10gen nel corso del quale racconterò la mia esperienza nell’integrazione di MongoDB in una Web REST API. Partecipazione e <!-- raw HTML omitted -->registrazione<!-- raw HTML omitted --> sono gratuite: cosa aspettate?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ancora su TypeScript</title>
      <link>https://nicolaiarocci.com/ancora-su-typescript/</link>
      <pubDate>Fri, 05 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ancora-su-typescript/</guid>
      <description>&lt;p&gt;A proposito di TypeScript vi segnalo &lt;!-- raw HTML omitted --&gt;Thoughts on TypeScript&lt;!-- raw HTML omitted --&gt;, il miglior articolo che ho letto finora sul nuovo nato in casa Microsoft.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m happy that regular JavaScript can be written in TypeScript and still benefit from some of the type checking provided by the TypeScript compiler. That means writing TypeScript can actually help people learn JavaScript, which makes me happy.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>A proposito di TypeScript vi segnalo <!-- raw HTML omitted -->Thoughts on TypeScript<!-- raw HTML omitted -->, il miglior articolo che ho letto finora sul nuovo nato in casa Microsoft.</p>
<blockquote>
<p>I’m happy that regular JavaScript can be written in TypeScript and still benefit from some of the type checking provided by the TypeScript compiler. That means writing TypeScript can actually help people learn JavaScript, which makes me happy.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>TypeScript: prime impressioni</title>
      <link>https://nicolaiarocci.com/typescript-prime-impressioni/</link>
      <pubDate>Tue, 02 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/typescript-prime-impressioni/</guid>
      <description>&lt;p&gt;Ieri Microsoft ha annunciato &lt;!-- raw HTML omitted --&gt;TypeScript&lt;!-- raw HTML omitted --&gt;,  nuovo linguaggio fortemente tipizzato il cui codice compilato è puro JavaScript. TypeScript aggiunge classi, controllo degli errori in compilazione, completamento del codice in fase di sviluppo, e tante altre cose interessanti.&lt;/p&gt;
&lt;p&gt;Miguel de Icaza, il cervello dietro Xamarin e la piattaforma Mono, ha sintentizzato le sue &lt;!-- raw HTML omitted --&gt;prime impressioni sul progetto&lt;!-- raw HTML omitted --&gt;. Interessanti anche i &lt;!-- raw HTML omitted --&gt;commenti di uno degli sviluppatori di Dart&lt;!-- raw HTML omitted --&gt;, progetto Google dal quale TypeScript ha senz’altro tratto ispirazione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ieri Microsoft ha annunciato <!-- raw HTML omitted -->TypeScript<!-- raw HTML omitted -->,  nuovo linguaggio fortemente tipizzato il cui codice compilato è puro JavaScript. TypeScript aggiunge classi, controllo degli errori in compilazione, completamento del codice in fase di sviluppo, e tante altre cose interessanti.</p>
<p>Miguel de Icaza, il cervello dietro Xamarin e la piattaforma Mono, ha sintentizzato le sue <!-- raw HTML omitted -->prime impressioni sul progetto<!-- raw HTML omitted -->. Interessanti anche i <!-- raw HTML omitted -->commenti di uno degli sviluppatori di Dart<!-- raw HTML omitted -->, progetto Google dal quale TypeScript ha senz’altro tratto ispirazione.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Scrivete il dannato manuale</title>
      <link>https://nicolaiarocci.com/scrivete-il-dannato-manuale/</link>
      <pubDate>Sat, 29 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/scrivete-il-dannato-manuale/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Sviluppatori: passate ore, giorni, mesi, forse anni interi a perfezionare il vostro capolavoro. In fin dei conti si tratta dell’espressione di un’intera vita professionale, anima e cuore. Perché dunque vi fate del male dotandolo di documentazione scarna, o addirittura inesistente?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Write The Freaking Manual&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Sviluppatori: passate ore, giorni, mesi, forse anni interi a perfezionare il vostro capolavoro. In fin dei conti si tratta dell’espressione di un’intera vita professionale, anima e cuore. Perché dunque vi fate del male dotandolo di documentazione scarna, o addirittura inesistente?</p></blockquote>
<p><!-- raw HTML omitted -->Write The Freaking Manual<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Ottimizzare le prestazioni di MongoDB</title>
      <link>https://nicolaiarocci.com/ottimizzare-le-prestazioni-di-mongodb/</link>
      <pubDate>Thu, 27 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ottimizzare-le-prestazioni-di-mongodb/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;MongoDB Schema Design at Scale&lt;!-- raw HTML omitted --&gt; è un’eccellente articolo cu come ottimizzare database MongoDB sottoposti a pesanti carichi di lavoro, soprattutto in scrittura. Il messaggio, forte e chiaro, è sempre lo stesso: prima di agire studia per bene il tuo database engine; comprendine i vantaggi e soprattutto i punti deboli.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->MongoDB Schema Design at Scale<!-- raw HTML omitted --> è un’eccellente articolo cu come ottimizzare database MongoDB sottoposti a pesanti carichi di lavoro, soprattutto in scrittura. Il messaggio, forte e chiaro, è sempre lo stesso: prima di agire studia per bene il tuo database engine; comprendine i vantaggi e soprattutto i punti deboli.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Decodificare le date in un flusso JSON (Python)</title>
      <link>https://nicolaiarocci.com/decodificare-le-date-in-un-flusso-json-python/</link>
      <pubDate>Mon, 10 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/decodificare-le-date-in-un-flusso-json-python/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;JSON-Datetime&lt;!-- raw HTML omitted --&gt; permette di decodificare i valori [cci lang=”python” theme=”default”]datetime[/cci] normalmente espressi come stringhe in un flusso JSON. E’ davvero molto semplice, e fa parte della suite strumenti open source che sto sviluppando nel contesto del più ampio progetto &lt;a href=&#34;http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/&#34; title=&#34;Sviluppare una RESTful Web API&#34;&gt;RESTful Web API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Del problema della decodifica delle stringhe JSON in valori datetime ho &lt;a href=&#34;http://nicolaiarocci.com/convertire-una-data-json-in-un-oggetto-datetime-python/&#34; title=&#34;Convertire una data JSON in un oggetto Python datetime&#34;&gt;già scritto in passato&lt;/a&gt;. Allora proponevo una soluzione algoritmica; ora vi presento un prodotto finito che potete usare nei vostri progetti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->JSON-Datetime<!-- raw HTML omitted --> permette di decodificare i valori [cci lang=”python” theme=”default”]datetime[/cci] normalmente espressi come stringhe in un flusso JSON. E’ davvero molto semplice, e fa parte della suite strumenti open source che sto sviluppando nel contesto del più ampio progetto <a href="http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/" title="Sviluppare una RESTful Web API">RESTful Web API</a>.</p>
<p>Del problema della decodifica delle stringhe JSON in valori datetime ho <a href="http://nicolaiarocci.com/convertire-una-data-json-in-un-oggetto-datetime-python/" title="Convertire una data JSON in un oggetto Python datetime">già scritto in passato</a>. Allora proponevo una soluzione algoritmica; ora vi presento un prodotto finito che potete usare nei vostri progetti.</p>
<h2 id="il-problema">Il problema</h2>
<p>Lo standard JSON (<!-- raw HTML omitted -->RFC 4627<!-- raw HTML omitted -->) non supporta valori di tipo data/ora. In un flusso JSON le date vengono rappresentate come semplici stringhe che i decoder Python interpretano come tali:</p>
<pre><code>import simplejson as json

&gt;&gt;&gt;test = '{&quot;name&quot;: &quot;John Doe&quot;, &quot;born&quot;: &quot;Thu, 1 Mar 2012 10:00:49 UTC&quot;}'
&gt;&gt;&gt;json.loads(test)
{'name': 'John Doe', 'born': 'Thu, 1 Mar 2012 10:00:49 
</code></pre>
<p>Nell’esempio precedente il campo <code>born</code> è una stringa nel JSON, e tale rimane dopo la decodifica in un dizionario Python.</p>
<h2 id="la-soluzione">La soluzione</h2>
<p>JSON-Datetime è un semplice wrapper attorno al metodo <code>loads</code> di <!-- raw HTML omitted -->simplejson<!-- raw HTML omitted -->. Ecco che succede quando usiamo JSON-Datetime al posto di simplejson:</p>
<pre><code>&gt;&gt;&gt; import jsondatetime as json
&gt;&gt;&gt; test = '{&quot;name&quot;: &quot;John Doe&quot;, &quot;born&quot;: &quot;Thu, 1 Mar 2012 10:00:49 UTC&quot;}'

&gt;&gt;&gt; json.loads(test)
{'name': 'John Doe', 'born': datetime.datetime(2012, 3, 1, 10, 0 ,49)}
</code></pre>
<p>Ora <code>born</code> assume il valore corretto. Affinché vengano riconosciute, le date contenute nel JSON devono corrispondere a un formato <code>strptime()</code> valido indicato con l’argomento <code>datetime_format</code>. Nell’esempio precedente, poiché l’argomento è assente, viene usato il valore di default <code>'%a, %d %b %Y %H:%M:%S UTC'</code>, corrispondente allo standard RFC 1123 (ex 822). Nell’esempio che segue usiamo un formato personalizzato:</p>
<pre><code>&gt;&gt;&gt; import jsondatetime as json
&gt;&gt;&gt; test = '{&quot;name&quot;: &quot;John Doe&quot;, &quot;born&quot;: &quot;Thu, 1 Mar 2012&quot;}'

&gt;&gt;&gt; json.loads(test, datetime_format=&quot;%a, %d %b %Y&quot;;)
{'name': 'John Doe', 'born': datetime.datetime(2012, 3, 1)}
</code></pre>
<p>JSON-Datetime è un semplice wrapper che ci lascia liberi di usare tutti gli argomenti standard previsti per <code>loads</code>, <code>object_hook</code> incluso. Ciò significa che questa soluzione (al contrario di quella proposta in precedenza) ci lascia liberi di applicare qualsivoglia parser al nostro flusso JSON.</p>
<h2 id="installazione-e-sorgenti">Installazione e sorgenti</h2>
<p>Per l’installazione basta il classico <code>pip install json-datetime</code>. Il codice è disponibile su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Pybooks – Le migliori risorse gratuite su Python</title>
      <link>https://nicolaiarocci.com/pybooks-le-migliori-risorse-gratuite-su-python/</link>
      <pubDate>Tue, 04 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/pybooks-le-migliori-risorse-gratuite-su-python/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;PyBooks&lt;!-- raw HTML omitted --&gt; è un’ottima selezione di risorse gratuite su Python e dintorni. I migliori libri gratuiti su Python sono inclusi, così come alcuni validi tutorial sulle librerie e i framework più diffusi. Il progetto è curato dalle stesse persone che stanno dietro JSBooks, la raccolta di libri JavaScript di cui ho scritto &lt;a href=&#34;http://nicolaiarocci.com/jsbooks-libri-open-source-su-javascript/&#34; title=&#34;JSBooks&#34;&gt;qualche giorno fa&lt;/a&gt;. Anche in questo caso è possibile contribuire attivamente segnalando nuove interessanti risorse.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->PyBooks<!-- raw HTML omitted --> è un’ottima selezione di risorse gratuite su Python e dintorni. I migliori libri gratuiti su Python sono inclusi, così come alcuni validi tutorial sulle librerie e i framework più diffusi. Il progetto è curato dalle stesse persone che stanno dietro JSBooks, la raccolta di libri JavaScript di cui ho scritto <a href="http://nicolaiarocci.com/jsbooks-libri-open-source-su-javascript/" title="JSBooks">qualche giorno fa</a>. Anche in questo caso è possibile contribuire attivamente segnalando nuove interessanti risorse.</p>
]]></content:encoded>
    </item>
    <item>
      <title>JSBooks – Libri Open Source su JavaScript</title>
      <link>https://nicolaiarocci.com/jsbooks-libri-open-source-su-javascript/</link>
      <pubDate>Thu, 30 Aug 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/jsbooks-libri-open-source-su-javascript/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;JSBooks Free JavaScript Books&lt;!-- raw HTML omitted --&gt; è una valida selezione di risorse gratuite su JavaScript. Si tratta di libri e guide gratuite per programmatori di ogni livello, dal principiante al veterano. Il catalogo include titoli su jQuery, Backbone, design patterns, Node, CoffeeScript, qualcosa su HTML5 e addirittura un libro su MongoDB (si tratta una mia &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro su MongoDB&#34;&gt;vecchia conoscenza&lt;/a&gt;). Alcuni suggerimenti sono davvero di ottima qualità. Il progetto è open source e chiunque può contribuire segnalando nuove interessanti risorse via GitHub.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->JSBooks Free JavaScript Books<!-- raw HTML omitted --> è una valida selezione di risorse gratuite su JavaScript. Si tratta di libri e guide gratuite per programmatori di ogni livello, dal principiante al veterano. Il catalogo include titoli su jQuery, Backbone, design patterns, Node, CoffeeScript, qualcosa su HTML5 e addirittura un libro su MongoDB (si tratta una mia <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro su MongoDB">vecchia conoscenza</a>). Alcuni suggerimenti sono davvero di ottima qualità. Il progetto è open source e chiunque può contribuire segnalando nuove interessanti risorse via GitHub.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sull’essere un Programmatore</title>
      <link>https://nicolaiarocci.com/sullessere-un-programmatore/</link>
      <pubDate>Sat, 18 Aug 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sullessere-un-programmatore/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Non fare lo stronzo&lt;/li&gt;
&lt;li&gt;Codice semplice è difficile da scrivere&lt;/li&gt;
&lt;li&gt;Codice  squisitamente semplice è davvero difficile da scrivere&lt;/li&gt;
&lt;li&gt;Se è semplice leggerlo non vuol dire che sia stato semplice scriverlo&lt;/li&gt;
&lt;li&gt;In effetti più è semplice più, probabilmente, è stato difficile scriverlo&lt;/li&gt;
&lt;li&gt;Ci sono molti modi di ottenere lo stesso risultato&lt;/li&gt;
&lt;li&gt;E’ &lt;em&gt;davvero&lt;/em&gt; improbabile che il primo che ti viene in mente sia anche il migliore&lt;/li&gt;
&lt;li&gt;Probabilmente &lt;em&gt;il&lt;/em&gt; &lt;em&gt;migliore&lt;/em&gt; non esiste – ne esistono molti, ognuno migliore a modo suo&lt;/li&gt;
&lt;li&gt;Hai sempre modo di migliorare – nel codice, nelle capacità, in te stesso&lt;/li&gt;
&lt;li&gt;Se pensi che non sei mai stato così bravo prima d’ora, probabilmente hai ragione&lt;/li&gt;
&lt;li&gt;Non esistono correzioni di una sola riga&lt;/li&gt;
&lt;li&gt;Impara a desiderare il successo più di quanto temi il fallimento&lt;/li&gt;
&lt;li&gt;Diventi vecchio solo quando non sei più capace di imparare nuovi trucchetti&lt;/li&gt;
&lt;li&gt;Fai sempre un backup prima di “dare una sistemata” al codice&lt;/li&gt;
&lt;li&gt;Leggi il fottuto manuale&lt;/li&gt;
&lt;li&gt;A volte un po’ stronzo è ok. Che non diventi un’abitudine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Liberamente tradotto da &lt;!-- raw HTML omitted --&gt;Thoughts on being a programmer&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<ul>
<li>Non fare lo stronzo</li>
<li>Codice semplice è difficile da scrivere</li>
<li>Codice  squisitamente semplice è davvero difficile da scrivere</li>
<li>Se è semplice leggerlo non vuol dire che sia stato semplice scriverlo</li>
<li>In effetti più è semplice più, probabilmente, è stato difficile scriverlo</li>
<li>Ci sono molti modi di ottenere lo stesso risultato</li>
<li>E’ <em>davvero</em> improbabile che il primo che ti viene in mente sia anche il migliore</li>
<li>Probabilmente <em>il</em> <em>migliore</em> non esiste – ne esistono molti, ognuno migliore a modo suo</li>
<li>Hai sempre modo di migliorare – nel codice, nelle capacità, in te stesso</li>
<li>Se pensi che non sei mai stato così bravo prima d’ora, probabilmente hai ragione</li>
<li>Non esistono correzioni di una sola riga</li>
<li>Impara a desiderare il successo più di quanto temi il fallimento</li>
<li>Diventi vecchio solo quando non sei più capace di imparare nuovi trucchetti</li>
<li>Fai sempre un backup prima di “dare una sistemata” al codice</li>
<li>Leggi il fottuto manuale</li>
<li>A volte un po’ stronzo è ok. Che non diventi un’abitudine.</li>
</ul>
<p>Liberamente tradotto da <!-- raw HTML omitted -->Thoughts on being a programmer<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Imparare Python con Codecademy</title>
      <link>https://nicolaiarocci.com/imparare-python-con-codecademy/</link>
      <pubDate>Tue, 31 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-python-con-codecademy/</guid>
      <description>&lt;p&gt;Di Codecademy avevo già scritto &lt;a href=&#34;http://nicolaiarocci.com/imparare-html-e-css-online-con-codecademy/&#34; title=&#34;Imparare HTM e CSS online con Codecademy&#34;&gt;tempo fa&lt;/a&gt; in occasione dei loro primi corsi giocoso-interattivi su HTML, CSS  e JavaScript. E’ di ieri l’annuncio del &lt;!-- raw HTML omitted --&gt;nuovo corso Python per principianti&lt;!-- raw HTML omitted --&gt;. Se volete rompere il ghiaccio con questo bellissimo linguaggio l’approccio di Codecademy (imparare divertendosi, anche grazie a collaudati meccanismi incentivanti come i punteggi e i trofei) potrebbe fare per voi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Di Codecademy avevo già scritto <a href="http://nicolaiarocci.com/imparare-html-e-css-online-con-codecademy/" title="Imparare HTM e CSS online con Codecademy">tempo fa</a> in occasione dei loro primi corsi giocoso-interattivi su HTML, CSS  e JavaScript. E’ di ieri l’annuncio del <!-- raw HTML omitted -->nuovo corso Python per principianti<!-- raw HTML omitted -->. Se volete rompere il ghiaccio con questo bellissimo linguaggio l’approccio di Codecademy (imparare divertendosi, anche grazie a collaudati meccanismi incentivanti come i punteggi e i trofei) potrebbe fare per voi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Analisi delle performance in Python</title>
      <link>https://nicolaiarocci.com/analisi-delle-performance-python/</link>
      <pubDate>Wed, 25 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/analisi-delle-performance-python/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;E’ vero che non tutti i programmi Python richiedono un’analisi rigorosa delle prestazioni, ma è rassicurante sapere che l’ecosistema Python ci mette a disposizione una serie di strumenti a cui possiamo rivolgerci in caso di necessità.&lt;/p&gt;
&lt;p&gt;Analizzare la performance di un programma significa prima di tutto rispondere a queste quattro semplici domande:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quanto gira veloce?&lt;/li&gt;
&lt;li&gt;Dove sono i “collli di bottiglia”?&lt;/li&gt;
&lt;li&gt;Quanta memoria sta utilizzando?&lt;/li&gt;
&lt;li&gt;Dove occorrono gli spechi di memoria?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Scopriamo come rispondere a queste domande attraverso alcuni strumenti molto interessanti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>E’ vero che non tutti i programmi Python richiedono un’analisi rigorosa delle prestazioni, ma è rassicurante sapere che l’ecosistema Python ci mette a disposizione una serie di strumenti a cui possiamo rivolgerci in caso di necessità.</p>
<p>Analizzare la performance di un programma significa prima di tutto rispondere a queste quattro semplici domande:</p>
<ul>
<li>Quanto gira veloce?</li>
<li>Dove sono i “collli di bottiglia”?</li>
<li>Quanta memoria sta utilizzando?</li>
<li>Dove occorrono gli spechi di memoria?</li>
</ul>
<p>Scopriamo come rispondere a queste domande attraverso alcuni strumenti molto interessanti.</p></blockquote>
<p><!-- raw HTML omitted -->A guide to analyzing Python performance<!-- raw HTML omitted --> è un’articolo non difficile che vale la pena leggere.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Flask-MimeRender v0.1.2</title>
      <link>https://nicolaiarocci.com/flask-mimerender-v0-1-2/</link>
      <pubDate>Thu, 19 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/flask-mimerender-v0-1-2/</guid>
      <description>&lt;p&gt;Grazie al contributo di &lt;a href=&#34;http://twitter.com/brunoripa&#34;&gt;Bruno Ripa&lt;/a&gt;, la versione 0.1.2 di &lt;a href=&#34;http://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/&#34; title=&#34;Flask-MimeRender&#34;&gt;Flask-MimeRender&lt;/a&gt; pubblicata oggi introduce il supporto per codici di stato HTTP arbitrari. Ho colto l’occasione per uniformare il codice sorgente alle direttive PEP8 e per sistemare alcuni dettagli del &lt;a href=&#34;http://nicolaiarocci.com/flask-mimerender-e-nel-python-package-index-pypi/&#34; title=&#34;Flask-MimeRender su PyPI&#34;&gt;package PyPI&lt;/a&gt;. Vi ricordo che potete contribuire voi stessi al progetto, direttamente su &lt;!-- raw HTML omitted --&gt;GitHub&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Grazie al contributo di <a href="http://twitter.com/brunoripa">Bruno Ripa</a>, la versione 0.1.2 di <a href="http://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/" title="Flask-MimeRender">Flask-MimeRender</a> pubblicata oggi introduce il supporto per codici di stato HTTP arbitrari. Ho colto l’occasione per uniformare il codice sorgente alle direttive PEP8 e per sistemare alcuni dettagli del <a href="http://nicolaiarocci.com/flask-mimerender-e-nel-python-package-index-pypi/" title="Flask-MimeRender su PyPI">package PyPI</a>. Vi ricordo che potete contribuire voi stessi al progetto, direttamente su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sviluppare una RESTful Web API con Python, Flask e MongoDB</title>
      <link>https://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/</link>
      <pubDate>Mon, 09 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;La scorsa settimana a &lt;!-- raw HTML omitted --&gt;EuroPython 2012&lt;!-- raw HTML omitted --&gt; ho tenuto un talk intitolato &lt;!-- raw HTML omitted --&gt;Sviluppare una RESTful Web API con Python, Flask e MongoDB&lt;!-- raw HTML omitted --&gt;. Mi ha fatto piacere riscontrare forte interesse sia per gli aspetti teorici dell’architettura REST che per la loro implementazione pratica con strumenti quali Flask e MongoDB. In entrambe le sessioni inglese e italiana mi sono state rivolte molte domande, sia in occasione delle Q&amp;amp;A plenarie che nei successivi colloqui informali. Parecchi anche i commenti ed i suggerimenti, davvero utili ed apprezzati (a quanto pare non sono l’unico che, forte di un background .NET, ha compiuto o sta per compiere il salto verso Python e il mondo open source).&lt;/p&gt;
&lt;p&gt;Soprattutto ho rilevato una forte curiosità su MongoDB, un database non-relazionale verso il quale sembra prevalere un atteggiamento  di generale timidezza: “vorrei ma non oso”, insomma. Per quanto riguarda Flask direi che ormai, nel vasto firmamento dei micro web framework, è una stella che brilla di luce propria.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->La scorsa settimana a <!-- raw HTML omitted -->EuroPython 2012<!-- raw HTML omitted --> ho tenuto un talk intitolato <!-- raw HTML omitted -->Sviluppare una RESTful Web API con Python, Flask e MongoDB<!-- raw HTML omitted -->. Mi ha fatto piacere riscontrare forte interesse sia per gli aspetti teorici dell’architettura REST che per la loro implementazione pratica con strumenti quali Flask e MongoDB. In entrambe le sessioni inglese e italiana mi sono state rivolte molte domande, sia in occasione delle Q&amp;A plenarie che nei successivi colloqui informali. Parecchi anche i commenti ed i suggerimenti, davvero utili ed apprezzati (a quanto pare non sono l’unico che, forte di un background .NET, ha compiuto o sta per compiere il salto verso Python e il mondo open source).</p>
<p>Soprattutto ho rilevato una forte curiosità su MongoDB, un database non-relazionale verso il quale sembra prevalere un atteggiamento  di generale timidezza: “vorrei ma non oso”, insomma. Per quanto riguarda Flask direi che ormai, nel vasto firmamento dei micro web framework, è una stella che brilla di luce propria.</p>
<p>Per quanto riguarda le registrazioni video potete andare su YouTube o sulla pagina ufficiale di EuroPython (<!-- raw HTML omitted -->english track<!-- raw HTML omitted --> e <!-- raw HTML omitted -->italian track<!-- raw HTML omitted -->). Ammetto di essere più soddisfatto della versione inglese nella quale – complice anche l’esperienza italiana del giorno prima – credo di essere stato più sintetico ed efficace. Qui mi limito a proporvi le slide:</p>
<h2 id="ringraziamenti">Ringraziamenti</h2>
<p>Un immenso grazie ai ragazzi dello staff di EuroPython che veramente hanno fatto di tutto per rendere questa manifestazione un evento straordinario – e ci sono riusciti  (una settimana di talk su cinque tracce parallele, sprint, hands-on, corsi, cibo di ottima qualità e credo oltre 800 partecipanti).</p>
<p>Vi racconto un episodio giusto per darvi l’idea di quanto questi ragazzi, tutti volontari, si diano da fare e ci mettano passione vera. Nella sessione italiana ho ‘sforato’ (capita anche ai migliori, mi dicono!) e così mi son trovato a sorvolare su un certo numero di slide. Ebbene il mio talk manager e il suo assistente mi hanno proposto di loro iniziativa di tenere una sessione pomeridiana straordinaria per consentirmi di portare a termine la mia relazione. Non capita tutti i giorni, credetemi. Per mia fortuna gran parte delle persone che avevano assistito alla sessione mattutina sono poi tornate per quella del pomeriggio, altrimenti sai che figura!</p>
<p>Se siete pythonisti o vorreste diventarlo non perdetevi la prossima edizione di questo evento internazionale che, con tutta probabilità, si terrà di nuovo a Firenze l’anno prossimo.</p>]]></content:encoded>
    </item>
    <item>
      <title>E finalmente esce Sublime Text 2</title>
      <link>https://nicolaiarocci.com/e-finalmente-esce-sublime-text-2/</link>
      <pubDate>Wed, 27 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/e-finalmente-esce-sublime-text-2/</guid>
      <description>&lt;p&gt;Da ieri Sublime Text 2 è ufficialmente fuori dalla lunghissima beta. Molte novità anche nell’ultima build, incluso il supporto per il Retina Display di OSX (tanto per dire quanto questi ragazzi stiano sul pezzo). Vi propongo un po’ di link di riferimento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;Annuncio della versione 2.0&lt;!-- raw HTML omitted --&gt; sul blog Sublime&lt;/li&gt;
&lt;li&gt;Come Kenneth Reitz ha configurato &lt;!-- raw HTML omitted --&gt;ST2 per Python&lt;!-- raw HTML omitted --&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://nicolaiarocci.com/sublime-text-2-un-anno-dopo/&#34; title=&#34;Sublime Text 2 un anno dopo&#34;&gt;Sublime Text 2 un anno dopo&lt;/a&gt;, il mio articolo più recente su ST2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PS: io nel frattempo sono tornato a vim, e per ora ci sto molto comodo. Sublime Text rimane l’editor che consiglio a chiunque non abbia già un background vi/vim e non voglia o non possa investire tempo nell’impararlo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da ieri Sublime Text 2 è ufficialmente fuori dalla lunghissima beta. Molte novità anche nell’ultima build, incluso il supporto per il Retina Display di OSX (tanto per dire quanto questi ragazzi stiano sul pezzo). Vi propongo un po’ di link di riferimento:</p>
<ul>
<li><!-- raw HTML omitted -->Annuncio della versione 2.0<!-- raw HTML omitted --> sul blog Sublime</li>
<li>Come Kenneth Reitz ha configurato <!-- raw HTML omitted -->ST2 per Python<!-- raw HTML omitted --></li>
<li><a href="http://nicolaiarocci.com/sublime-text-2-un-anno-dopo/" title="Sublime Text 2 un anno dopo">Sublime Text 2 un anno dopo</a>, il mio articolo più recente su ST2</li>
</ul>
<p>PS: io nel frattempo sono tornato a vim, e per ora ci sto molto comodo. Sublime Text rimane l’editor che consiglio a chiunque non abbia già un background vi/vim e non voglia o non possa investire tempo nell’impararlo.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Come usare al meglio WebKit Inspector</title>
      <link>https://nicolaiarocci.com/come-usare-al-meglio-webkit-inspector/</link>
      <pubDate>Fri, 15 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-usare-al-meglio-webkit-inspector/</guid>
      <description>&lt;p&gt;Se vi occupate di frontend non perdetevi lo spettacolare articolo in cui Majd Taby ci spiega &lt;!-- raw HTML omitted --&gt;come usare al meglio il WebKit Inspector&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il panorama mobile è monopolizzato da WebKit e di conseguenza gran parte degli strumenti e dell’infrastruttura per lo sviluppo di applicazioni frontend mobile (e non solo, ndr) risiedono nel WebKit Inspector. Per questo ne analizzerò con cura gli strumenti e spiegherò come e quando usarli.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se vi occupate di frontend non perdetevi lo spettacolare articolo in cui Majd Taby ci spiega <!-- raw HTML omitted -->come usare al meglio il WebKit Inspector<!-- raw HTML omitted -->.</p>
<blockquote>
<p>Il panorama mobile è monopolizzato da WebKit e di conseguenza gran parte degli strumenti e dell’infrastruttura per lo sviluppo di applicazioni frontend mobile (e non solo, ndr) risiedono nel WebKit Inspector. Per questo ne analizzerò con cura gli strumenti e spiegherò come e quando usarli.</p></blockquote>
<p>Ci sono anche le <!-- raw HTML omitted -->slide<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Windows Azure ora supporta ufficialmente Python</title>
      <link>https://nicolaiarocci.com/windows-azure-ora-supporta-ufficialmente-python/</link>
      <pubDate>Fri, 08 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/windows-azure-ora-supporta-ufficialmente-python/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Windows Azure ora supporta ufficialmente Python. La &lt;!-- raw HTML omitted --&gt;pagina ufficiale&lt;!-- raw HTML omitted --&gt; consente di scaricare l’SDK e contiene alcuni tutorial per la creazione di applicazioni Django, Python e IPython direttamente da Visual Studio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Windows Azure ora supporta ufficialmente Python. La <!-- raw HTML omitted -->pagina ufficiale<!-- raw HTML omitted --> consente di scaricare l’SDK e contiene alcuni tutorial per la creazione di applicazioni Django, Python e IPython direttamente da Visual Studio.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Convertire una data JSON in un oggetto datetime Python</title>
      <link>https://nicolaiarocci.com/convertire-una-data-json-in-un-oggetto-datetime-python/</link>
      <pubDate>Thu, 07 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/convertire-una-data-json-in-un-oggetto-datetime-python/</guid>
      <description>&lt;p&gt;Abbiamo una stringa JSON che contiene una data:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fonte = &#39;{&amp;quot;ragione_sociale&amp;quot;: &amp;quot;CIR 2000&amp;quot;, &amp;quot;aggiornato_il&amp;quot;: &amp;quot;Wed, 06 Jun 2012 14:19:53 UTC&amp;quot;}&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vediamo che succede se la convertiamo in un dizionario Python:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import simplejson as json

json.loads(fonte)
{&#39;aggiornato_il&#39;: &#39;Wed, 06 Jun 2012 14:19:53 UTC &#39;, &#39;ragione_sociale&#39;: &#39;CIR 2000&#39;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Facile, vero? C’è però un piccolo problema: &lt;code&gt;aggiornato_il&lt;/code&gt; è ancora una stringa mentre a noi, per poterlo elaborare comodamente, serve un campo &lt;code&gt;datetime.datetime&lt;/code&gt;. Come mai il pur potente modulo &lt;code&gt;simplejson&lt;/code&gt; non converte correttamente la nostra data?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Abbiamo una stringa JSON che contiene una data:</p>
<pre><code>fonte = '{&quot;ragione_sociale&quot;: &quot;CIR 2000&quot;, &quot;aggiornato_il&quot;: &quot;Wed, 06 Jun 2012 14:19:53 UTC&quot;}'
</code></pre>
<p>Vediamo che succede se la convertiamo in un dizionario Python:</p>
<pre><code>import simplejson as json

json.loads(fonte)
{'aggiornato_il': 'Wed, 06 Jun 2012 14:19:53 UTC ', 'ragione_sociale': 'CIR 2000'}
</code></pre>
<p>Facile, vero? C’è però un piccolo problema: <code>aggiornato_il</code> è ancora una stringa mentre a noi, per poterlo elaborare comodamente, serve un campo <code>datetime.datetime</code>. Come mai il pur potente modulo <code>simplejson</code> non converte correttamente la nostra data?</p>
<h2 id="il-problema">Il problema</h2>
<p>Il fatto è che il JSON originale non fa nulla per informarci del fatto che il campo <code>aggiornato_il</code> esprime in realtà una data. La radice del problema sta nello standard JSON il quale non contempla la dichiarazione esplicita dei tipi di dati. In effetti la stessa questione si pone nella conversione di un numero non intero: va considerato un float, oppure un decimal? In quest’ultimo caso <code>simplejson</code> ci viene in aiuto con il parametro parse_float:</p>
<pre><code>import simplejson as json

json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')
</code></pre>
<p>Purtroppo, per il motivo visto prima, non esiste un equivalente per le date.</p>
<h2 id="la-soluzione-classica">La soluzione classica</h2>
<p>In questi casi la prassi comune è rendere esplicito, già all’interno della stringa JSON, il formato del campo. Qualcosa del genere:</p>
<pre><code>{&quot;aggiornato_il&quot;: &quot;$date: Wed, 06 Jun 2012 14:19:53 UTC&quot;}
</code></pre>
<p>Così facendo possiamo in seguito manipolare il dizionario restituito dal metodo <code>loads</code>: intercettare la direttiva <code>$date</code> e sostituire finalmente la stringa con una data. Una soluzione più raffinata è quella di sfruttare l’opzione <code>object_hook</code> che consente di invocare una nostra funzione ad ogni chiamata del metodo <code>loads</code>.</p>
<h2 id="la-mia-soluzione">La mia soluzione</h2>
<p>Nel mio caso il provider JSON è esterno, e non desidero obbligarlo a pre-processare le stringhe JSON inserendo clausole $date arbitrarie solo per soddisfare le esigenze della mia applicazione. Sfruttando l’opzione object_hook già accennata ho ottenuto una soluzione del tutto trasparente:</p>
<pre><code>fonte = '{&quot;aggiornato_il&quot;: &quot;Thu, 1 Mar 2012 10:00:49 UTC&quot;}'
dct = json.loads(fonte, object_hook=datetime_parser)
dct
{u'aggiornato_il': datetime.datetime(2012, 3, 1, 10, 0, 49)}


def datetime_parser(dct):
    for k, v in dct.items():
        if isinstance(v, basestring) and re.search(&quot; UTC&quot;, v):
            try:
                dct[k] = datetime.datetime.strptime(v, DATE_FORMAT)
            except:
                pass
    return dct
</code></pre>
<p>La funzione <code>datetime_parser</code> esamina gli elementi della stringa JSON. In caso di corrispondenza alla espressione regolare indicata in <code>re.search</code> tentiamo una conversione diretta al formato <code>datetime</code>. Data la specificità della espressione regolare la conversione dovrebbe avere successo. Il blocco <code>try... except</code> ci permette di ignorare un eventuale errore: in questo caso infatti presumiamo che si tratti di una stringa vera e propria e non, malgrado la somiglianza, di una data. L’unico vincolo imposto al provider JSON è l’adozione di un formato standard per rappresentare le date. Nel mio caso è il seguente:</p>
<pre><code>DATE_FORMAT = '%a, %d %b %Y %H:%M:%S UTC'
</code></pre>
<p>Per approfondimenti vi consiglio:</p>
<ul>
<li><!-- raw HTML omitted -->JSON econdoer and decoder<!-- raw HTML omitted --></li>
<li><a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/" title="Introduzione alle Regular Expression">Introduzione alle Regular Expression</a></li>
</ul>
<p>Per completezza c’è da aggiungere che l’adozione di un <!-- raw HTML omitted -->json schema<!-- raw HTML omitted --> consentirebbe la specifica dei tipi di dati JSON. Quest’ultima soluzione però, data la sua complessità, non è applicabile nel mio e in molti altri casi.</p>
<p>PS: ne ho scritto anche su <!-- raw HTML omitted -->Stack Overflow<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Il filmato del mio intervento al Ravenna CNA BarCamp</title>
      <link>https://nicolaiarocci.com/il-mio-intervento-al-cna-barcamp-video/</link>
      <pubDate>Thu, 31 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-mio-intervento-al-cna-barcamp-video/</guid>
      <description>&lt;p&gt;Il filmato del mio recente intervento al Ravenna CNA BarCamp è online. L’&lt;a href=&#34;http://nicolaiarocci.com/offline-online-superare-la-crisi-anche-grazie-alla-rete/&#34; title=&#34;Offline / Online: superare la crisi anche grazie alla rete&#34;&gt;articolo originale&lt;/a&gt; è stato aggiornato e ora include sia le slide che il video. In alternativa c’è sempre &lt;!-- raw HTML omitted --&gt;YouTube&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il filmato del mio recente intervento al Ravenna CNA BarCamp è online. L’<a href="http://nicolaiarocci.com/offline-online-superare-la-crisi-anche-grazie-alla-rete/" title="Offline / Online: superare la crisi anche grazie alla rete">articolo originale</a> è stato aggiornato e ora include sia le slide che il video. In alternativa c’è sempre <!-- raw HTML omitted -->YouTube<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Xamarin abbandona il progetto Silverlight per Linux</title>
      <link>https://nicolaiarocci.com/xamarin-abbandona-il-progetto-silverlight-per-linux/</link>
      <pubDate>Wed, 30 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/xamarin-abbandona-il-progetto-silverlight-per-linux/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Moonlight, l’implementazione open-source di Silverlight per sistemi Linux, è stata &lt;!-- raw HTML omitted --&gt;abbandonata da Xamarin&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Abbiamo abbandonato Moonlight (…) Il web non ha addotato Silverlight; non ha avuto il successo che mi aspettavo. &lt;strong&gt;Miguel de Icaza&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Un’altro chiodo sulla bara di Silverlight. Dei dubbi sul futuro della tecnologia Microsoft avevo già scritto in occasione della sua &lt;a href=&#34;http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/&#34; title=&#34;Windows 8 e i dubbi sul destino di Silverlight&#34;&gt;mancata adozione in Windows 8&lt;/a&gt; e al momento dell’annuncio di &lt;a href=&#34;http://nicolaiarocci.com/microsoft-silverlight-e-adobe-flash-verso-la-resa-comincia-lera-di-re-html5/&#34; title=&#34;Silverlight 5 vs HTML5&#34;&gt;Silverlight 5&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Moonlight, l’implementazione open-source di Silverlight per sistemi Linux, è stata <!-- raw HTML omitted -->abbandonata da Xamarin<!-- raw HTML omitted -->.</p>
<blockquote>
<p>Abbiamo abbandonato Moonlight (…) Il web non ha addotato Silverlight; non ha avuto il successo che mi aspettavo. <strong>Miguel de Icaza</strong></p></blockquote>
<p>Un’altro chiodo sulla bara di Silverlight. Dei dubbi sul futuro della tecnologia Microsoft avevo già scritto in occasione della sua <a href="http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/" title="Windows 8 e i dubbi sul destino di Silverlight">mancata adozione in Windows 8</a> e al momento dell’annuncio di <a href="http://nicolaiarocci.com/microsoft-silverlight-e-adobe-flash-verso-la-resa-comincia-lera-di-re-html5/" title="Silverlight 5 vs HTML5">Silverlight 5</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Primi passi con SSH</title>
      <link>https://nicolaiarocci.com/primi-passi-con-ssh/</link>
      <pubDate>Wed, 23 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/primi-passi-con-ssh/</guid>
      <description>&lt;p&gt;Se siete ai primi passi nello sviluppo di applicazioni web vi consiglio la lettura di &lt;!-- raw HTML omitted --&gt;SSH: What and How&lt;!-- raw HTML omitted --&gt;. Senza troppi fronzoli l’articolo spiega le basi di SSH mettendo bene in luce le possibilità offerte da questo importante strumento di lavoro.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ogni giorno molti sviluppatori web usano SSH (“Secure Shell”) per gestire i loro server, fare backup, lavorare in remoto e una miriade di altre cosette. Oggi vi spiego cos’è e da dove viene SSH e, soprattutto, vi insegno come configurarlo sul vostro server remoto o sulla vostra rete locale. Cominciamo!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se siete ai primi passi nello sviluppo di applicazioni web vi consiglio la lettura di <!-- raw HTML omitted -->SSH: What and How<!-- raw HTML omitted -->. Senza troppi fronzoli l’articolo spiega le basi di SSH mettendo bene in luce le possibilità offerte da questo importante strumento di lavoro.</p>
<blockquote>
<p>Ogni giorno molti sviluppatori web usano SSH (“Secure Shell”) per gestire i loro server, fare backup, lavorare in remoto e una miriade di altre cosette. Oggi vi spiego cos’è e da dove viene SSH e, soprattutto, vi insegno come configurarlo sul vostro server remoto o sulla vostra rete locale. Cominciamo!</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Come annullare una Commit in Git</title>
      <link>https://nicolaiarocci.com/come-annullare-una-commit-in-git/</link>
      <pubDate>Thu, 17 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-annullare-una-commit-in-git/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Usando &lt;!-- raw HTML omitted --&gt;Git&lt;!-- raw HTML omitted --&gt; capita ogni tanto, vuoi per stanchezza o per distrazione, di lanciare commit sbagliate. Stamattina m’è capitato di sistemare del codice, testarlo e fare la commit… solo per scoprire di aver lavorato sulla branch sbagliata! Non è la prima volta che mi succede e non sarà nemmeno l’ultima. Poiché ho scarsa memoria ogni volta mi tocca usare google e ripescare quei due o tre comandi utili in questi casi. Ho pensato di appuntarli qui, un po’ per metterli a disposizione di tutti, un po’ per poterli ritrovare facilmente.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Usando <!-- raw HTML omitted -->Git<!-- raw HTML omitted --> capita ogni tanto, vuoi per stanchezza o per distrazione, di lanciare commit sbagliate. Stamattina m’è capitato di sistemare del codice, testarlo e fare la commit… solo per scoprire di aver lavorato sulla branch sbagliata! Non è la prima volta che mi succede e non sarà nemmeno l’ultima. Poiché ho scarsa memoria ogni volta mi tocca usare google e ripescare quei due o tre comandi utili in questi casi. Ho pensato di appuntarli qui, un po’ per metterli a disposizione di tutti, un po’ per poterli ritrovare facilmente.</p>
<h2 id="annullare-una-commit">Annullare una commit</h2>
<p>Se ancora non è stato stato eseguito il push verso un repo remoto:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>In Git <code>HEAD</code> è la commit più recente mentre <code>HEAD^</code> è la penultima (<code>HEAD^^</code> è la terzultima). In alternativa è possibile indicare l’SHA-1 dell’hash della commit alla quale si vuole tornare, qualunque essa sia:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il numero di hash di ogni commit è rintracciabile con un semplice <code>git log --oneline</code></p>
<h2 id="differenza-tra---soft-e---hard">Differenza tra <code>--soft</code> e <code>--hard</code></h2>
<p>L’opzione <code>--soft</code> cancella la commit ma lascia i file invariati. Se volete riportare anche i file allo stato in cui si trovavano alla penultima commit:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Questo porterà “indietro nel tempo” il vostro repo, alla penultima commit. Sarà come se le ultime modifiche (e con esse l’ultima commit) non fossero mai esistite.</p>
<h2 id="e-se-la-commit-è-già-finita-nel-repository">E se la commit è già finita nel repository?</h2>
<p>Se la commit è già stata inviata a un repo remoto (push) è necessario seguire un’altra procedura:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Questo comando crea una <em>nuova commit</em> che annulla tutto ciò che è stato introdotto dalla commit indesiderata.</p>]]></content:encoded>
    </item>
    <item>
      <title>WhyMCA Mobile Developer Conference 2012</title>
      <link>https://nicolaiarocci.com/whymca-mobile-developer-conference-2012/</link>
      <pubDate>Wed, 09 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/whymca-mobile-developer-conference-2012/</guid>
      <description>&lt;p&gt;Parteciperò alla &lt;!-- raw HTML omitted --&gt;WhyMCA Mobile Developer Conference&lt;!-- raw HTML omitted --&gt; a Bologna il 24 e 25 maggio. Il programma mi sembra piuttosto interessante. Se pensate di venire &lt;a href=&#34;http://nicolaiarocci.com/contatti/&#34; title=&#34;Contatti&#34;&gt;fatemelo sapere&lt;/a&gt; che vediamo di incotrarci.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Parteciperò alla <!-- raw HTML omitted -->WhyMCA Mobile Developer Conference<!-- raw HTML omitted --> a Bologna il 24 e 25 maggio. Il programma mi sembra piuttosto interessante. Se pensate di venire <a href="http://nicolaiarocci.com/contatti/" title="Contatti">fatemelo sapere</a> che vediamo di incotrarci.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Git si è rifatto il look (e non solo)</title>
      <link>https://nicolaiarocci.com/git-si-e-rifatto-il-look-e-non-solo/</link>
      <pubDate>Tue, 08 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/git-si-e-rifatto-il-look-e-non-solo/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Il sito del &lt;!-- raw HTML omitted --&gt;progetto Git&lt;!-- raw HTML omitted --&gt; è stato finalmente aggiornato. Nuova grafica, nuovo logo, ottimizzazione dei contenuti e soprattutto integrazione di importanti risorse prima ospitate altrove: la &lt;!-- raw HTML omitted --&gt;Git Reference&lt;!-- raw HTML omitted --&gt;, il libro &lt;!-- raw HTML omitted --&gt;ProGit&lt;!-- raw HTML omitted --&gt;, &lt;!-- raw HTML omitted --&gt;Why Git is Better Than X&lt;!-- raw HTML omitted --&gt; e il nuovo progetto &lt;!-- raw HTML omitted --&gt;Git Video Series&lt;!-- raw HTML omitted --&gt;, che include quattro bei filmati già pronti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Il sito del <!-- raw HTML omitted -->progetto Git<!-- raw HTML omitted --> è stato finalmente aggiornato. Nuova grafica, nuovo logo, ottimizzazione dei contenuti e soprattutto integrazione di importanti risorse prima ospitate altrove: la <!-- raw HTML omitted -->Git Reference<!-- raw HTML omitted -->, il libro <!-- raw HTML omitted -->ProGit<!-- raw HTML omitted -->, <!-- raw HTML omitted -->Why Git is Better Than X<!-- raw HTML omitted --> e il nuovo progetto <!-- raw HTML omitted -->Git Video Series<!-- raw HTML omitted -->, che include quattro bei filmati già pronti.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Conosco solo PHP. Come scrivo una applicazione web in Python?</title>
      <link>https://nicolaiarocci.com/conosco-solo-php-come-scrivo-una-applicazione-web-in-python/</link>
      <pubDate>Mon, 07 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/conosco-solo-php-come-scrivo-una-applicazione-web-in-python/</guid>
      <description>&lt;p&gt;Venite da PHP e siete incuriositi da Python? Vi consiglio la lettura di &lt;!-- raw HTML omitted --&gt;Python FAQ Webdev&lt;!-- raw HTML omitted --&gt;: i web framework Python dal punto di vista di un ex sviluppatore PHP.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Venite da PHP e siete incuriositi da Python? Vi consiglio la lettura di <!-- raw HTML omitted -->Python FAQ Webdev<!-- raw HTML omitted -->: i web framework Python dal punto di vista di un ex sviluppatore PHP.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Opportunità per esperti Joomla e PHP</title>
      <link>https://nicolaiarocci.com/opportunita-per-esperti-joomla-e-php/</link>
      <pubDate>Sun, 06 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/opportunita-per-esperti-joomla-e-php/</guid>
      <description>&lt;p&gt;&lt;em&gt;Ogni tanto ricevo proposte di lavoro che non sono in grado di soddisfare né direttamente (per mancanza di tempo o know-how) né indirettamente (passando nomi di colleghi e conoscenti). E’ questo il caso della richiesta di Michele, che vi propongo nel caso qualcuno di voi sia interessato. Sia chiaro che io non c’entro e non ci guadagno nulla; mi interessa solo favorire domanda e offerta e mi limito, col permesso dell’autore, a ripubblicare il suo annuncio. Se siete interessati contattate Michele direttamente:&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Ogni tanto ricevo proposte di lavoro che non sono in grado di soddisfare né direttamente (per mancanza di tempo o know-how) né indirettamente (passando nomi di colleghi e conoscenti). E’ questo il caso della richiesta di Michele, che vi propongo nel caso qualcuno di voi sia interessato. Sia chiaro che io non c’entro e non ci guadagno nulla; mi interessa solo favorire domanda e offerta e mi limito, col permesso dell’autore, a ripubblicare il suo annuncio. Se siete interessati contattate Michele direttamente:</em></p>
<p>Sono un IM professionista da oltre 4 anni. Questo è il mio lavoro e lo faccio piuttosto bene. Ultimamente ho deciso di lanciare un sito di annunci italiano ed ho acquistato uno script pronto ed abbastanza complesso basato su joomla. Mi servono svariate modifiche sia nel frontend che nella admin panel (perlopiù semplificazioni) più la traduzione di tutte le voci presenti dall’inglese all’italiano.</p>
<p>Non sono un perditempo e non lavoro con gente mediocre o ragazzini ma solo con professionisti seri. Valuto la possibilità di far subentrare un socio/webmaster in questo progetto. Io mi occuperò della pubblicità/visibilità più inpage e offpage optimization e in generale del posizionamento mentre il socio avrà a che fare con degli aspetti prettamente tecnici e con tutte le migliorie da apportare di volta in volta al sito. Il candidato ideale deve avere buone conoscenze di joomla, php, html, javascript e possibilmente anche un po’ di ajax. Maggiori dettagli saranno forniti ai candidati che daranno prova di soddisfare le richieste sopra specificate.</p>
<ul>
<li>Tipo di committente: privato</li>
<li>Nominativo committente: Michele</li>
<li>E-mail: mikivv[at]aol.com</li>
<li>Luogo di lavoro: telelavoro</li>
<li>Tipo di contratto: freelancer/progetto (eventualmente webmaster/socio a tempo indeterminato)</li>
<li>Budget massimo (riferito solo alle modifiche/traduzione frontend dello script): €1.000</li>
<li>Valuto possibilità di assumere webmaster a tempo indeterminato o far subentrare socio nel progetto.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Offline / Online: superare la crisi anche grazie alla rete</title>
      <link>https://nicolaiarocci.com/offline-online-superare-la-crisi-anche-grazie-alla-rete/</link>
      <pubDate>Mon, 23 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/offline-online-superare-la-crisi-anche-grazie-alla-rete/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;La scorsa settimana ho partecipato come relatore alla prima edizione del &lt;!-- raw HTML omitted --&gt;Ravenna CNA Barcamp&lt;!-- raw HTML omitted --&gt; sulla cultura d’impresa 2.0. &lt;!-- raw HTML omitted --&gt;Offline / Online&lt;!-- raw HTML omitted --&gt; è il racconto di una esperienza vissuta sul campo; un case study su come il mercato del software si è evoluto nel corso degli anni passando dalla classica filiera lunga sul territorio, tipica degli anni ’90 e della prima metà dei 2000, alla vendita online dei giorni nostri. La crisi economica degli ultimi anni si è innestata in un processo evolutivo già in atto e inarrestabile, perlomeno per quanto riguarda il nostro settore:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->La scorsa settimana ho partecipato come relatore alla prima edizione del <!-- raw HTML omitted -->Ravenna CNA Barcamp<!-- raw HTML omitted --> sulla cultura d’impresa 2.0. <!-- raw HTML omitted -->Offline / Online<!-- raw HTML omitted --> è il racconto di una esperienza vissuta sul campo; un case study su come il mercato del software si è evoluto nel corso degli anni passando dalla classica filiera lunga sul territorio, tipica degli anni ’90 e della prima metà dei 2000, alla vendita online dei giorni nostri. La crisi economica degli ultimi anni si è innestata in un processo evolutivo già in atto e inarrestabile, perlomeno per quanto riguarda il nostro settore:</p>
<p>Non sono molto soddisfatto della mia relazione: troppo da dire nel poco tempo a disposizione. Mi auguro di aver comunicato bene almeno un paio di cose:</p>
<ul>
<li>Ciò che oggi funziona alla grande domani potrebbe non funzionare affatto. Siate pronti a rimettere in discussione voi stessi e il vostro modello di business in qualunque momento.</li>
<li>Non fatevi ingannare dai fatturati milionari sbandierati ovunque ai quattro venti. Ciò che conta davvero è quel che vi rimane in tasca.</li>
</ul>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>Per una città come Ravenna questo BarCamp è una novità benvenuta e necessaria, come dimostrano gli stessi numeri ottenuti: 170 presenze in sala, 400 spettatori collegati alla diretta streaming, 26 relatori. Complimenti alla CNA per averci creduto accettando una sfida dai risultati non scontati. Grazie di cuore e complimenti vivissimi a <!-- raw HTML omitted -->Lidia Marongiu<!-- raw HTML omitted -->, che ha organizzato e diretto l’evento con tenacia e grande professionalità.</p>]]></content:encoded>
    </item>
    <item>
      <title>Guido van Rossum a EuroPython 2012</title>
      <link>https://nicolaiarocci.com/guido-van-rossum-a-europython-2012/</link>
      <pubDate>Fri, 20 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/guido-van-rossum-a-europython-2012/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Partenza col botto per &lt;!-- raw HTML omitted --&gt;EuroPython 2012&lt;!-- raw HTML omitted --&gt;. I keynote introduttivi saranno tenuti nientemeno che dal creatore stesso del linguaggio, Guido Van Rossum, e da Alex Martelli. Ieri è stato annunciato il &lt;!-- raw HTML omitted --&gt;programma ufficiale&lt;!-- raw HTML omitted --&gt; e a quanto pare mi spetta l’inaugurazione della italian track martedì 3 luglio. Il giorno successivo sarò impegnato, ancora di prima mattina, con la versione in lingua inglese del mio talk:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Partenza col botto per <!-- raw HTML omitted -->EuroPython 2012<!-- raw HTML omitted -->. I keynote introduttivi saranno tenuti nientemeno che dal creatore stesso del linguaggio, Guido Van Rossum, e da Alex Martelli. Ieri è stato annunciato il <!-- raw HTML omitted -->programma ufficiale<!-- raw HTML omitted --> e a quanto pare mi spetta l’inaugurazione della italian track martedì 3 luglio. Il giorno successivo sarò impegnato, ancora di prima mattina, con la versione in lingua inglese del mio talk:</p>
<blockquote>
<p><!-- raw HTML omitted -->Sviluppare una RESTful Web API con Python, Flask e MongoDB<!-- raw HTML omitted --></p>
<p>Nel corso dell’ultimo anno abbiamo lavorato all’implementazione Python di una RESTful Web API completa. Abbiamo imparato un bel po’ di cose sui best pattern REST e, naturalmente, abbiamo messo alla prova le ben note capacità web di Python, rilasciando nel frattempo un paio di progetti Open Source. Nel corso del mio intervento condividerò quel che abbiamo imparato. Prenderemo in considerazione il problematico design di una REST API ‘pura’. Vedremo che cosa offre Python in questo campo e scenderemo infine nel dettaglio, dando una occhiata al codice che abbiamo scritto. Alcune tecnologie/stack che tratteremo sono (in nessun ordine particolare): Flask, PyMongo, MongoDB, REST, JSON, XML, Heroku. Lo sapevi? Che ti piaccia o no, c’è una REST API nel tuo futuro.</p></blockquote>
<p>Scorrendo la lista degli speaker scopro che anche Amin Roacher, autore di Flask, e Ross Lawley di 10Gen (MongoDB) saranno della partita. Insomma ammetto che un po’ d’ansia da prestazione comincia ad affiorare. Sarà una bella sfida, e non vedo l’ora di affrontarla. Conto molto sul vostro supporto e incoraggiamento: ne avrò bisogno 😉</p>
]]></content:encoded>
    </item>
    <item>
      <title>Imparare Git un passo alla volta con Git Immersion</title>
      <link>https://nicolaiarocci.com/imparare-git-un-passo-alla-volta-con-git-immersion/</link>
      <pubDate>Fri, 13 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-git-un-passo-alla-volta-con-git-immersion/</guid>
      <description>&lt;p&gt;Già sapete che Git è uno degli strumenti senza i quali non potrei più vivere, ne ho scritto anche recentemente in &lt;a href=&#34;http://nicolaiarocci.com/branching-di-successo-per-git/&#34; title=&#34;Branching di successo per Git&#34;&gt;Branching di successo per Git&lt;/a&gt; e &lt;a href=&#34;http://nicolaiarocci.com/usare-git-con-dropbox/&#34; title=&#34;Usare Git con Dropbox&#34;&gt;Usare Git con Dropbox&lt;/a&gt;. Oggi vi propongo &lt;!-- raw HTML omitted --&gt;Git Immersion&lt;!-- raw HTML omitted --&gt;, fantastico sito-laboratorio per “immergersi” in Git imparandolo passo dopo passo.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;blockquote&gt;
&lt;p&gt;Git Immersion è un tour guidato che ti accompagna in una passeggiata tra i fondamenti di Git, ispirato dalla premessa che conoscere una cosa significa usarla. Git è un sistema potente e sofisticato per il controllo di versione distribuito. Per lo sviluppatore conoscere e comprenderne le caratteristiche significa aprirsi a un nuovo e liberatorio approccio alla gestione del codice sorgente. Il modo migliore per padroneggiare Git è immergesi nelle sue utility ed operazioni, sperimentarlo in prima persona.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Già sapete che Git è uno degli strumenti senza i quali non potrei più vivere, ne ho scritto anche recentemente in <a href="http://nicolaiarocci.com/branching-di-successo-per-git/" title="Branching di successo per Git">Branching di successo per Git</a> e <a href="http://nicolaiarocci.com/usare-git-con-dropbox/" title="Usare Git con Dropbox">Usare Git con Dropbox</a>. Oggi vi propongo <!-- raw HTML omitted -->Git Immersion<!-- raw HTML omitted -->, fantastico sito-laboratorio per “immergersi” in Git imparandolo passo dopo passo.</p>
<!-- raw HTML omitted -->
<blockquote>
<p>Git Immersion è un tour guidato che ti accompagna in una passeggiata tra i fondamenti di Git, ispirato dalla premessa che conoscere una cosa significa usarla. Git è un sistema potente e sofisticato per il controllo di versione distribuito. Per lo sviluppatore conoscere e comprenderne le caratteristiche significa aprirsi a un nuovo e liberatorio approccio alla gestione del codice sorgente. Il modo migliore per padroneggiare Git è immergesi nelle sue utility ed operazioni, sperimentarlo in prima persona.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Speaker a EuroPython 2012</title>
      <link>https://nicolaiarocci.com/speaker-a-europython-2012/</link>
      <pubDate>Fri, 13 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/speaker-a-europython-2012/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;EuroPython è la conferenza europea di riferimento per il linguaggio Python. Si terrà anche quest’anno a Firenze, dal 2 al 8 luglio. Sono in programma molti interventi davvero interessanti, cosa che rende ancor più soprendente il fatto che i miei talk siano stati votati così tanto.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Date un’occhiata al &lt;!-- raw HTML omitted --&gt;sito ufficiale&lt;!-- raw HTML omitted --&gt; per saperne di più sulla conferenza (in questo momento è ancora possibile approfittare dell’offerta &lt;em&gt;early bird&lt;/em&gt; per l’acquisto dei biglietti); maggiori informazioni sui miei interventi tra qualche tempo, quando sarà ufficializzato il calendario dei talk.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>EuroPython è la conferenza europea di riferimento per il linguaggio Python. Si terrà anche quest’anno a Firenze, dal 2 al 8 luglio. Sono in programma molti interventi davvero interessanti, cosa che rende ancor più soprendente il fatto che i miei talk siano stati votati così tanto.</p>
<!-- raw HTML omitted -->
<p>Date un’occhiata al <!-- raw HTML omitted -->sito ufficiale<!-- raw HTML omitted --> per saperne di più sulla conferenza (in questo momento è ancora possibile approfittare dell’offerta <em>early bird</em> per l’acquisto dei biglietti); maggiori informazioni sui miei interventi tra qualche tempo, quando sarà ufficializzato il calendario dei talk.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Comprendere il MVVM – Guida per Sviluppatori JavaScript</title>
      <link>https://nicolaiarocci.com/comprendere-il-mvvm-guida-per-sviluppatori-javascript/</link>
      <pubDate>Wed, 11 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/comprendere-il-mvvm-guida-per-sviluppatori-javascript/</guid>
      <description>&lt;p&gt;Addy Osmani ne ha combinata un’altra delle sue:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MVVM (Model View ViewModel) è un pattern architetturale basato su MVC e MVP, che tenta di separare chiaramente lo sviluppo della interfaccia utente (UI) da quelle che sono business logic e comportamento dell’applicazione. A questo fine, molte implementazioni del pattern ricorrono a un uso dichiarativo dei data bindings, per consentire la separazione del lavoro sulle Viste (View) dagli altri strati (layer).&lt;/p&gt;
&lt;p&gt;MVVM consente creazione di UI  e sviluppo del codice in parallelo, all’interno della stessa base di codice. Gli esperti UI scrivono bindings per il ViewModel all’interno del loro markup (HTML), mentre il Model e il ViewModel sono gestiti dagli sviluppatori che lavorano alla logica dell’applicazione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Addy Osmani ne ha combinata un’altra delle sue:</p>
<blockquote>
<p>MVVM (Model View ViewModel) è un pattern architetturale basato su MVC e MVP, che tenta di separare chiaramente lo sviluppo della interfaccia utente (UI) da quelle che sono business logic e comportamento dell’applicazione. A questo fine, molte implementazioni del pattern ricorrono a un uso dichiarativo dei data bindings, per consentire la separazione del lavoro sulle Viste (View) dagli altri strati (layer).</p>
<p>MVVM consente creazione di UI  e sviluppo del codice in parallelo, all’interno della stessa base di codice. Gli esperti UI scrivono bindings per il ViewModel all’interno del loro markup (HTML), mentre il Model e il ViewModel sono gestiti dagli sviluppatori che lavorano alla logica dell’applicazione.</p></blockquote>
<p><!-- raw HTML omitted -->Comprendere il MVVM – Guida per Sviluppatori JavaScript<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Imparare HTML e CSS Online con Codecademy</title>
      <link>https://nicolaiarocci.com/imparare-html-e-css-online-con-codecademy/</link>
      <pubDate>Tue, 03 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-html-e-css-online-con-codecademy/</guid>
      <description>&lt;p&gt;Codecademy propone da ieri un corso gratuito e interattivo su &lt;!-- raw HTML omitted --&gt;HTML e CSS&lt;!-- raw HTML omitted --&gt;. Il corso, per principianti, si affianca a quello ormai collaudato (e recentemente ampliato) su JavaScript.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Il meccanismo è quello della &lt;em&gt;gamification&lt;/em&gt;, con tanto di punteggi e badge da conquistare man mano che si raggiungono obiettivi prefissati . Presto dovrebbe uscire anche un corso su Python.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Codecademy propone da ieri un corso gratuito e interattivo su <!-- raw HTML omitted -->HTML e CSS<!-- raw HTML omitted -->. Il corso, per principianti, si affianca a quello ormai collaudato (e recentemente ampliato) su JavaScript.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il meccanismo è quello della <em>gamification</em>, con tanto di punteggi e badge da conquistare man mano che si raggiungono obiettivi prefissati . Presto dovrebbe uscire anche un corso su Python.</p>
<blockquote>
<p>Compi i tuoi primi passi con HTML e CSS. Non è necessaria alcuna esperienza precedente — cominceremo dalle basi e in poco tempo ti ritroverai a lavorare alla tua homepage personale!</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Evidenziare il codice sorgente via JavaScript e CSS con Rainbow</title>
      <link>https://nicolaiarocci.com/evidenziare-il-codice-sorgente-via-javascript-e-css-con-rainbow/</link>
      <pubDate>Mon, 02 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/evidenziare-il-codice-sorgente-via-javascript-e-css-con-rainbow/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Rainbow&lt;!-- raw HTML omitted --&gt; è una libreria per l’evidenziazione del codice scritta in Javascript. E’ leggera (1.4kb), facile da usare, estensibile e completamente configurabile via CSS.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p><!-- raw HTML omitted -->Rainbow<!-- raw HTML omitted --> è una libreria per l’evidenziazione del codice scritta in Javascript. E’ leggera (1.4kb), facile da usare, estensibile e completamente configurabile via CSS.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Ritrovato il codice sorgente di Prince of Persia perduto 23 anni fa</title>
      <link>https://nicolaiarocci.com/ritrovato-il-codice-sorgente-di-prince-of-persia-perduto-23-anni-fa/</link>
      <pubDate>Fri, 30 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ritrovato-il-codice-sorgente-di-prince-of-persia-perduto-23-anni-fa/</guid>
      <description>&lt;p&gt;Jordan Mechner creò &lt;!-- raw HTML omitted --&gt;Prince of Persia&lt;!-- raw HTML omitted --&gt; 23 anni fa. Era il 1989 quando il gioco uscì per Apple II. Negli anni seguenti si sono succedute diverse edizioni moderne di grande successo, ma nessuna affascinante come l’originale (almeno non per noi, vecchi tromboni nostalgici).&lt;/p&gt;
&lt;p&gt;Pochi sanno che il codice sorgente originale era andato perduto. Mechner l’aveva cercato ovunque senza successo, perdendo ogni speranza di rintraccialo. Finché, proprio ieri, suo padre non è sceso in cantina. Da un scatolone che conteneva confezioni sigillate del mitico &lt;!-- raw HTML omitted --&gt;Karateka &lt;!-- raw HTML omitted --&gt;(1984 &lt;em&gt;– quante partite sul mio C64!&lt;/em&gt;) sono spuntate tre confezioni di floppy disk Apple ProDOS da 3.5″: contenevano il codice perduto.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jordan Mechner creò <!-- raw HTML omitted -->Prince of Persia<!-- raw HTML omitted --> 23 anni fa. Era il 1989 quando il gioco uscì per Apple II. Negli anni seguenti si sono succedute diverse edizioni moderne di grande successo, ma nessuna affascinante come l’originale (almeno non per noi, vecchi tromboni nostalgici).</p>
<p>Pochi sanno che il codice sorgente originale era andato perduto. Mechner l’aveva cercato ovunque senza successo, perdendo ogni speranza di rintraccialo. Finché, proprio ieri, suo padre non è sceso in cantina. Da un scatolone che conteneva confezioni sigillate del mitico <!-- raw HTML omitted -->Karateka <!-- raw HTML omitted -->(1984 <em>– quante partite sul mio C64!</em>) sono spuntate tre confezioni di floppy disk Apple ProDOS da 3.5″: contenevano il codice perduto.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La <!-- raw HTML omitted -->lieta novella<!-- raw HTML omitted --> si deve allo stesso Mechner, ora impegnato nel non banale tentativo di riuscire a leggere il contenuto dei vecchi floppy per poi trasferirlo sul suo MacBook Air. Su Flickr è stato pubblicato il <!-- raw HTML omitted -->set fotografico<!-- raw HTML omitted --> dei floppy disk originali.</p>
<p>Per i nostalgici della mia età (e per i giovani curiosi) ecco il filmato di una sessione di gioco del Prince of Persia originale: la fuga dalle prigioni del Califfo.</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p><em>Aggiornamento: il codice sorgente di Prince of Persia è stato recuperato ed è ora disponibile su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted -->.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET MVC, Web API, ASP.NET Web Pages (Razor) sono Open Source</title>
      <link>https://nicolaiarocci.com/asp-net-mvc-web-api-asp-net-web-pages-razor-sono-open-source/</link>
      <pubDate>Wed, 28 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/asp-net-mvc-web-api-asp-net-web-pages-razor-sono-open-source/</guid>
      <description>&lt;p&gt;Oggi Microsoft annuncia una svolta che ha del clamoroso:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sono felice di annunciare che oggi rilasciamo il codice sorgente di ASP.NET Web API e ASP.NET Web Pages (Razor) sotto una licenza open source (Apache 2.0), e che continueremo a migliorare la trasparenza di tutti i tre progetti ospitando il loro codice sorgente su CodePlex (usando il nuovo supporto per Git annunciato la settimana scorsa).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Ma quel che più conta, e che per un’azienda corporate ‘vecchia maniera’ come Microsoft denota davvero un’evoluzione (rivoluzione) culturale:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Oggi Microsoft annuncia una svolta che ha del clamoroso:</p>
<blockquote>
<p>Sono felice di annunciare che oggi rilasciamo il codice sorgente di ASP.NET Web API e ASP.NET Web Pages (Razor) sotto una licenza open source (Apache 2.0), e che continueremo a migliorare la trasparenza di tutti i tre progetti ospitando il loro codice sorgente su CodePlex (usando il nuovo supporto per Git annunciato la settimana scorsa).</p></blockquote>
<p>Ma quel che più conta, e che per un’azienda corporate ‘vecchia maniera’ come Microsoft denota davvero un’evoluzione (rivoluzione) culturale:</p>
<blockquote>
<p>Per la prima volta consentiremo agli sviluppatori esterni a Microsoft di proporre patches e contributi di codice, che il nostro team di sviluppo valuterà per la potenziale inclusione diretta nei prodotti.</p></blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Infografica: PHP vs Ruby vs Python</title>
      <link>https://nicolaiarocci.com/infografica-php-vs-ruby-vs-python/</link>
      <pubDate>Wed, 21 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/infografica-php-vs-ruby-vs-python/</guid>
      <description>&lt;p&gt;I linguaggi di programmazione ‘moderni’ a confronto: PHP vs Ruby vs Python. Lo scorso gennaio &lt;!-- raw HTML omitted --&gt;Udemy&lt;!-- raw HTML omitted --&gt; ha rilasciato una bella infografica che confronta i tre linguaggi sotto molti aspetti. Ne esce una fotografia secondo me interessante dell’attuale panorama dei linguaggi interpretati:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I linguaggi di programmazione ‘moderni’ a confronto: PHP vs Ruby vs Python. Lo scorso gennaio <!-- raw HTML omitted -->Udemy<!-- raw HTML omitted --> ha rilasciato una bella infografica che confronta i tre linguaggi sotto molti aspetti. Ne esce una fotografia secondo me interessante dell’attuale panorama dei linguaggi interpretati:</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --></p>]]></content:encoded>
    </item>
    <item>
      <title>Amazon EC2: Quanto si risparmia con le Reserved Instances rispetto alle classiche On-Demand?</title>
      <link>https://nicolaiarocci.com/amazon-ec2-quanto-si-risparmia-con-le-reserved-instances-rispetto-alle-classiche-on-demand/</link>
      <pubDate>Mon, 19 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/amazon-ec2-quanto-si-risparmia-con-le-reserved-instances-rispetto-alle-classiche-on-demand/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Amazon offre sconti significativi per chi sceglie le istanze riservate al posto di quelle on-demand. Dal punto di vista finanziario, e se avete intenzione di usare EC2 per almeno un anno, passare dalle istanze on-demand a quelle riservate potrebbe aver senso. Sborserete una cifra più alta inizialmente, ma il costo mensile si ridurrà sensibilmente.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Per quanto io ne sappia il tool sviluppato da Mike Khristo è il primo che consente di confrontare direttamente, senza tanti giri di parole, il costo delle due soluzioni:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Amazon offre sconti significativi per chi sceglie le istanze riservate al posto di quelle on-demand. Dal punto di vista finanziario, e se avete intenzione di usare EC2 per almeno un anno, passare dalle istanze on-demand a quelle riservate potrebbe aver senso. Sborserete una cifra più alta inizialmente, ma il costo mensile si ridurrà sensibilmente.</p></blockquote>
<p>Per quanto io ne sappia il tool sviluppato da Mike Khristo è il primo che consente di confrontare direttamente, senza tanti giri di parole, il costo delle due soluzioni:</p>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Usare Git con Dropbox</title>
      <link>https://nicolaiarocci.com/usare-git-con-dropbox/</link>
      <pubDate>Sat, 17 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/usare-git-con-dropbox/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;usare-dropbox-come-repository-git-remoto&#34;&gt;Usare Dropbox come repository Git remoto&lt;/h2&gt;
&lt;p&gt;Recentemente, più che altro per curiosità, ho giocato con una terza opzione: &lt;!-- raw HTML omitted --&gt;Dropbox&lt;!-- raw HTML omitted --&gt;. Per me Dropbox è uno strumento indispensabile sia per il lavoro che per le mie cose personali. Su qualunque computer io sia, ovunque mi trovi, grazie a Dropbox ho accesso al mio materiale. Dunque, mi son detto, perché non usarlo anche per il codice,  pur senza rinunciare al controllo versione offerto da Git?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://db.tt/V8L8FFo&#34;&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ebbene ho scoperto che non solo è possibile, è anche molto semplice. In realtà non c’è nulla di nuovo in quel che vi mostro, la ‘magia’ la fa tutta Dropbox.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<h2 id="usare-dropbox-come-repository-git-remoto">Usare Dropbox come repository Git remoto</h2>
<p>Recentemente, più che altro per curiosità, ho giocato con una terza opzione: <!-- raw HTML omitted -->Dropbox<!-- raw HTML omitted -->. Per me Dropbox è uno strumento indispensabile sia per il lavoro che per le mie cose personali. Su qualunque computer io sia, ovunque mi trovi, grazie a Dropbox ho accesso al mio materiale. Dunque, mi son detto, perché non usarlo anche per il codice,  pur senza rinunciare al controllo versione offerto da Git?</p>
<p><a href="http://db.tt/V8L8FFo"><!-- raw HTML omitted --></a></p>
<p>Ebbene ho scoperto che non solo è possibile, è anche molto semplice. In realtà non c’è nulla di nuovo in quel che vi mostro, la ‘magia’ la fa tutta Dropbox.</p>
<h2 id="creare-un-git-repository-8216remoto8217-su-drobox">Creare un Git repository ‘remoto’ su Drobox</h2>
<p>Se siete su Linux o Mac aprite una finestra terminale; su Windows aprite semplicemente Git Bash. Se avete una installazione predefinita la cartella Dropbox si trova nella HOME di Linux e Mac, oppure nella Documenti di Windows.</p>
<p>Spostatevi nella cartella Dropbox:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Una volta entrati in ~/Dropbox create un ‘bare’ repository:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il nostro repository privato, l’equivalente di un repo remoto alla GitHub per capirci, è pronto. Lo useremo per tenere sincronizzati i nostri computer. Naturalmente appoggiarci a Dropbox ci garantisce anche la possibilità di ricorrere a un restore di emergenza nel caso il codice venga perduto localmente.</p>
<h2 id="creare-il-git-repository-locale">Creare il Git repository locale</h2>
<p>Su ognuno dei computer creiamo il repository locale:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Lavoriamo un po’, quindi facciamo la nostra commit locale:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Ora colleghiamo il repo “remoto” (quello in Dropbox) al nostro repository locale:</p>
<!-- raw HTML omitted -->
<p>Ora possiamo fare il push verso il remoto dei files locali. Dal branch [cci lang=”bash” theme=”default”]master[/cci] verso [cci lang=”bash” theme=”default”]origin[/cci]:</p>
<!-- raw HTML omitted -->
<p>Fatto! Possiamo simulare facilmente il lavoro su un’altro computer. Basta clonare [cci lang=”bash” theme=”default”]progetto[/cci] dal ‘remoto’, cambiare qualche file e salvarlo:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Torniamo ora al folder locale originale. Possiamo sincronizzarlo e aggiornarlo con le modifiche fatte sul “secondo computer”:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="il-versioning-di-dropbox">Il versioning di Dropbox</h2>
<p>Dropbox è dotato di un proprio sistema di versioning, pertanto aggiungere Git potrebbe sembrare superfluo. Qualunque sviluppatore avvezzo a Git vi dirà che non è così. Il versioning di Dropbox è adatto a file di testo, fogli di calcolo, immagini e quant’altro ma non ha niente a che vedere con le capacità di manutenzione e gestione dei progetti offerte da Git.</p>
<h2 id="git-e-dropbox-per-gruppi-di-lavoro">Git e Dropbox per gruppi di lavoro?</h2>
<p>E’ sufficiente condividere il folder Dropbox con altre persone per creare un ambiente di sviluppo privato ma condiviso col proprio gruppo di lavoro. In quest’ultimo caso la probabilità di conflitti aumenta notevolmente. Si tratta di una soluzione forse interessante per mini-team di 2 o 3 persone nei quali è relativamente facile evitare la generazione di conflitti (evitare le push contemporanee).</p>
<h2 id="concludendo">Concludendo</h2>
<p>BitBucket o GitHub (a pagamento) rimangono la soluzione ideale, e offrono molte funzionalità comunque assenti in Git+Dropbox (interfaccia web, wiki, issues, eccetera). Per piccoli progetti personali Dropbox offre una alternativa a buon mercato, rapida e comoda.</p>
<p><em>PS: se create un account Dropbox dal link dell’articolo, oppure da <!-- raw HTML omitted -->questo<!-- raw HTML omitted -->, ricevete 500BMB extra (e altrettanti ne otterrà il sottoscritto)!</em></p>]]></content:encoded>
    </item>
    <item>
      <title>7 Risorse Per Sviluppatori JavaScript</title>
      <link>https://nicolaiarocci.com/7-risorse-per-sviluppatori-javascript/</link>
      <pubDate>Thu, 15 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/7-risorse-per-sviluppatori-javascript/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Anni fa JavaScript era considerato più che altro una seccatura: produceva queste animazioni e trailer per il browser e poco altro. Ora tutto è cambiato. JavaScript è eletto a linguaggio funzionale di prima classe e in rete sono disponibili risorse innumerevoli . Condivido con voi alcune delle mie fonti migliori, che uso per tenermi aggiornato su librerie, progetti e JavaScript in generale. – Rob Bazinet&lt;/p&gt;&lt;/blockquote&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Anni fa JavaScript era considerato più che altro una seccatura: produceva queste animazioni e trailer per il browser e poco altro. Ora tutto è cambiato. JavaScript è eletto a linguaggio funzionale di prima classe e in rete sono disponibili risorse innumerevoli . Condivido con voi alcune delle mie fonti migliori, che uso per tenermi aggiornato su librerie, progetti e JavaScript in generale. – Rob Bazinet</p></blockquote>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Python per Facebook</title>
      <link>https://nicolaiarocci.com/python-per-facebook/</link>
      <pubDate>Wed, 14 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-per-facebook/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Una casa per gli sviluppatori Python che lavorano con Facebook. Gestiamo due repository su GitHub. &lt;strong&gt;facebook-sdk&lt;/strong&gt;, un set di tools essenziali per lavorare con Facebook in Python. &lt;strong&gt;django-facebook&lt;/strong&gt;, un plugin estendibile per costruire siti Django integrati con Facebook.&lt;/p&gt;&lt;/blockquote&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;via &lt;!-- raw HTML omitted --&gt;@bacchilu&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Una casa per gli sviluppatori Python che lavorano con Facebook. Gestiamo due repository su GitHub. <strong>facebook-sdk</strong>, un set di tools essenziali per lavorare con Facebook in Python. <strong>django-facebook</strong>, un plugin estendibile per costruire siti Django integrati con Facebook.</p></blockquote>
<!-- raw HTML omitted -->
<p>via <!-- raw HTML omitted -->@bacchilu<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Codemotion Roma 2012</title>
      <link>https://nicolaiarocci.com/codemotion-roma-2012/</link>
      <pubDate>Tue, 13 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/codemotion-roma-2012/</guid>
      <description>&lt;p&gt;I prossimi 23 e 24 marzo sarò al Codemotion Roma, conferenza di due giorni dal &lt;!-- raw HTML omitted --&gt;programma&lt;!-- raw HTML omitted --&gt; ricco e piuttosto interessante. Se ci sarete &lt;!-- raw HTML omitted --&gt;mettetevi in contatto&lt;!-- raw HTML omitted --&gt;, è l’occasione giusta per incontrarci di persona!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://codemotion.it&#34;&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I prossimi 23 e 24 marzo sarò al Codemotion Roma, conferenza di due giorni dal <!-- raw HTML omitted -->programma<!-- raw HTML omitted --> ricco e piuttosto interessante. Se ci sarete <!-- raw HTML omitted -->mettetevi in contatto<!-- raw HTML omitted -->, è l’occasione giusta per incontrarci di persona!</p>
<p><a href="http://codemotion.it"><!-- raw HTML omitted --></a></p>
<p> </p>
]]></content:encoded>
    </item>
    <item>
      <title>Sublime Text 2 un anno dopo</title>
      <link>https://nicolaiarocci.com/sublime-text-2-un-anno-dopo/</link>
      <pubDate>Sat, 10 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sublime-text-2-un-anno-dopo/</guid>
      <description>&lt;p&gt;Proprio un anno fa &lt;!-- raw HTML omitted --&gt;presentavo Sublime Text 2&lt;!-- raw HTML omitted --&gt;. Dopo dodici mesi ho pensato di fare il punto della situazione. Si sono susseguiti una serie di aggiornamenti importanti, il prodotto è più maturo e devo dire che in questo periodo non mi ha affatto deluso: è ancora il mio editor di codice preferito. Nel frattempo &lt;!-- raw HTML omitted --&gt;Sublime Text 2&lt;!-- raw HTML omitted --&gt; è diventato &lt;em&gt;mainstream.&lt;/em&gt; Me ne sono reso conto in questi giorni, quando articoli, recensioni, trucchi e suggerimenti su Sublime Text 2 affioravano ripetutamente nel mio feed.&lt;/p&gt;
&lt;p&gt;Vi propongo alcune delle caratteristiche che ne fanno, almeno per quanto riguarda il mio modo di lavorare, l’editor ideale.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Proprio un anno fa <!-- raw HTML omitted -->presentavo Sublime Text 2<!-- raw HTML omitted -->. Dopo dodici mesi ho pensato di fare il punto della situazione. Si sono susseguiti una serie di aggiornamenti importanti, il prodotto è più maturo e devo dire che in questo periodo non mi ha affatto deluso: è ancora il mio editor di codice preferito. Nel frattempo <!-- raw HTML omitted -->Sublime Text 2<!-- raw HTML omitted --> è diventato <em>mainstream.</em> Me ne sono reso conto in questi giorni, quando articoli, recensioni, trucchi e suggerimenti su Sublime Text 2 affioravano ripetutamente nel mio feed.</p>
<p>Vi propongo alcune delle caratteristiche che ne fanno, almeno per quanto riguarda il mio modo di lavorare, l’editor ideale.</p>
<h2 id="multi-piattaforma">Multi piattaforma</h2>
<p>Sublime Text gira egualmente bene su OSX, Windows e Linux. Lavorando su Mac a casa e con Windows in ufficio per me è sempre stato difficile trovare un editor di codice di alta qualità da poter usare in entrambi gli ambienti. TextMate? Solo per Mac. Notepad++? Solo per Windows. Si lo so che Eclipse e altre IDE sofisticate sono multi piattaforma ma il fatto è che io le IDE non le sopporto più. Le ho usate per vent’anni, e tuttora sono vincolato a Visual Studio (un prodotto comunque eccellente) per gran parte del mio tempo. Da quando sono potuto tornare alle origini, ovvero ai semplici text editor, mi ci rifugio appena possibile.</p>
<p>Bisognerebbe poi intendersi sul quel ‘semplici’ perché come vedremo Sublime Text e gli altri editor, moderni e non, sono semplici solo in apparenza.</p>
<p>Una critica a Sublime Text 2 multi piattaforma mi sento di farla, e riguarda la non completa uniformità dei menu tra le diverse piattaforme. Per esempio le Preferenze sono  nel menu principale in OSX, mentre se ricordo bene in Windows stanno in ‘Tools’.</p>
<h2 id="command-palette">Command Palette</h2>
<p>Come dicevo Sublime Text 2 è ricco di funzionalità, la gran parte attivate da menu con gran lavoro di mouse. Esistono le scorciatoie di tastiera per i comandi più frequenti, ma Sublime ci mette a disposizione qualcosa di più, la Command Palette.</p>
<p>Premete <code>Shift-Command-P</code> per ottenere l’apertura della Command Palette:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La lista contiene i comandi disponibili in Sublime. Basta scrivere <em>anche solo una parte</em> del nome del comando per ottenerne la rapida selezione. Per attivarlo basta premere <code>Invio</code>. Si tratta di una soluzione davvero comoda, alla TextMate, che risparmia il mouse ed è ben implementata. Nell’immagine vedete come per installare un nuovo package mi basti premere una lettera (la ‘i’), anche se non è quella iniziale.</p>
<h2 id="passaggio-rapido-da-un-file-all8217altro">Passaggio rapido da un file all’altro</h2>
<p>Ogni file aperto è contenuto in una scheda. Possiamo passare da un file all’altro cliccando sulle schede oppure usando la tastiera per scorrerle in sequenza. Ma possiamo anche ricorrere al comando <code>Command-P</code> per aprire una palette di selezione file, la quale implementa la stessa modalità di ricerca già vista nella Command Palette:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Ciò che rende questa palette davvero utile è il fatto che man mano che scriviamo Sublime attiva (mette in primo piano) il file che soddisfa la nostra query. Dopo un paio di volte non potrete più tornare al mouse.</p>
<h2 id="cursore-multiplo">Cursore multiplo</h2>
<p>Immaginate di selezionare più aree del codice e trattarle come se fossero tutte sotto un unico cursore. Ebbene è possibile, ed impagabile. Potete vedere questa modalità all’opera nel breve <!-- raw HTML omitted -->screencast<!-- raw HTML omitted --> messo a disposizione dai ragazzi di NetTuts, io mi limito a spiegarvi le alternative per attivarla:</p>
<ul>
<li>Premere <code>Command</code> e cliccare nei punti in cui volete attivare il cursore multiplo</li>
<li>Selezionare blocchi di testo e premere <code>Shift-Command-L</code></li>
<li>Mettere il cursore sotto una parola e premere <code>Command-D</code> per selezionarne le occorrenze successive attivando il cursore per ognuna</li>
<li>Selezionare una parola e premere <code>Control-Command-G</code> per selezionarne tutte le occorrenze attivando per ognuna il cursore</li>
</ul>
<h2 id="passaggio-rapido-a-funzioni-e-metodi">Passaggio rapido a funzioni e metodi</h2>
<p>Oltre alle funzioni di ricerca classiche possiamo passare rapidamente da un metodo all’altro ricorrendo alla magica command palette vista prima. Basta <code>Command-R</code> per attivarla:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>In Visual Studio ho sempre odiato il passaggio tra funzioni/metodi/classi implementato col solo match delle lettere iniziali, e addirittura suddiviso in due combo diverse (una per gli oggetti, l’altra per i metodi). Qui siamo a tutto un’altro livello.</p>
<h2 id="c8217è-vim-dentro">C’è Vim dentro</h2>
<p>Chi è abituato a Vim non disperi: è possibile attivare la modalità ‘Vintage’ che attiva il key binding del famoso editor Unix. Magicamente abbiamo a disposizione Command e Insert mode e molti dei comandi di editing più comuni in Vim. Per informazioni consultate la pagina sul <!-- raw HTML omitted -->Vintage Mode<!-- raw HTML omitted --> della documentazione.</p>
<h2 id="e-c8217è-pure-un-po8217-textmate">E c’è pure un po’ TextMate</h2>
<p>Temi e bundle di TextMate funzionano in Sublime Text, basta metterli nel folder Packages. Se siete legati a TextMate valutate la possibilità di passare a Sublime, potrebbe valerne la pena.</p>
<h2 id="package-control">Package Control</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Sublime è ricco di estensioni (package) e consente di installare quelle TextMate. Il <!-- raw HTML omitted -->Package Control<!-- raw HTML omitted --> (da installare a parte) rende facile la loro gestione direttamente dalla Command Palette.</p>
<h2 id="concludendo">Concludendo</h2>
<p>Naturalmente non è tutto qui. Ampia scelta di temi custom e standard (io uso <!-- raw HTML omitted -->Monokai Soda<!-- raw HTML omitted -->), Plugin come se piovesse (tra i quali uso abitualmente quelli per Git e StackOverflow), modalità ‘distraction free’ e full screen, personalizzazione dei key binding, syntax highlighting di tutti i linguaggi più diffusi… ci sarebbe ancora tanto da dire.</p>
<p>Ammetto che molte di queste caratteristiche non sono una esclusiva di Sublime Text 2, tuttavia quel che apprezzo in questo prodotto è la velocità e l’immediatezza con le quali queste sono utilizzabili. Cerco di usare il mouse il meno possibile e con Sublime riesco a fare tutto senza metterci mano, il che aumenta la mia produttività. Come ogni buon editor Sublime non interferisce con la scrittura del codice ma, quando serve, è pronto a dare una mano con una ricchezza di strumenti invidiabile.</p>
<p>Spero di avervi convinto a dare una occhiata. Sublime Text 2 è a pagamento, anche se la modalità demo non è a tempo e si limita a proporre l’acquisto ogni tanto.</p>
<p>Vi lascio con l’invito a dare un’occhiata al video di Andrey Tarantsov sul suo <!-- raw HTML omitted -->Workflow con Sublime Text<!-- raw HTML omitted -->. Ha riscosso molto successo quando l’ho segnalato su Twitter, e per un buon motivo.</p>]]></content:encoded>
    </item>
    <item>
      <title>Primo importante aggiornamento del Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/primo-importante-aggiornamento-del-piccolo-libro-di-mongodb/</link>
      <pubDate>Thu, 08 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/primo-importante-aggiornamento-del-piccolo-libro-di-mongodb/</guid>
      <description>&lt;p&gt;Se avete già scaricato il &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB&#34;&gt;Piccolo Libro di MongoDB&lt;/a&gt; vi consiglio di aggiornarlo con la versione odierna. E’ stato aggiunto un capitolo (MapReduce) misteriosamente assente nella prima edizione. Grazie a Walter Tommasi per la preziosa segnalazione, e a &lt;a href=&#34;http://nicolaiarocci.com/branching-di-successo-per-git/&#34; title=&#34;Branching di successo per Git&#34;&gt;Git&lt;/a&gt; per averne consentito il recupero in extremis.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se avete già scaricato il <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB">Piccolo Libro di MongoDB</a> vi consiglio di aggiornarlo con la versione odierna. E’ stato aggiunto un capitolo (MapReduce) misteriosamente assente nella prima edizione. Grazie a Walter Tommasi per la preziosa segnalazione, e a <a href="http://nicolaiarocci.com/branching-di-successo-per-git/" title="Branching di successo per Git">Git</a> per averne consentito il recupero in extremis.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Link Consigliati dal 29.2 al 5.3.2012</title>
      <link>https://nicolaiarocci.com/link-consigliati-dal-29-2-al-5-3-2012/</link>
      <pubDate>Sun, 04 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/link-consigliati-dal-29-2-al-5-3-2012/</guid>
      <description>&lt;p&gt;&lt;em&gt;Ogni giorno su &lt;!-- raw HTML omitted --&gt;Twitter&lt;!-- raw HTML omitted --&gt; segnalo i link interessanti in cui incappo mentre mi documento per il mio lavoro. Riscuotono un certo successo, quindi ho pensato di condividerne alcuni anche qui sul sito. Parte così Link Consigliati, rubrica settimanale e sperimentale.&lt;/em&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;“Why are so many developers so very emotional when it comes to their favourite programming language? Considering that no language can (yet) magically translate the perfect idea in your head into machine code, all of them exist on a scale of badness – they all limit you more than your own thoughts or the hardware does.”&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;“Clean, simple web designs have become a popular trend. This article will cover the subject through a two-part discussion. First, we’ll talk about a few traits that clean designs tend to have in common. Secondly, I’ll share some tricks and techniques that can be helpful when trying to achieve a clean design.”&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Database of HTTP status codes with their IETF and Wikipedia descriptions&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;“What happens when you click on a weblink? Here’s one answer: a request goes from your computer to a server identified by the URL of the desired link. The server then locates the webpage in its files and sends it back to your browser, which then displays it on your screen. Simple.”&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Ogni giorno su <!-- raw HTML omitted -->Twitter<!-- raw HTML omitted --> segnalo i link interessanti in cui incappo mentre mi documento per il mio lavoro. Riscuotono un certo successo, quindi ho pensato di condividerne alcuni anche qui sul sito. Parte così Link Consigliati, rubrica settimanale e sperimentale.</em></p>
<!-- raw HTML omitted -->
<p>“Why are so many developers so very emotional when it comes to their favourite programming language? Considering that no language can (yet) magically translate the perfect idea in your head into machine code, all of them exist on a scale of badness – they all limit you more than your own thoughts or the hardware does.”</p>
<!-- raw HTML omitted -->
<p>“Clean, simple web designs have become a popular trend. This article will cover the subject through a two-part discussion. First, we’ll talk about a few traits that clean designs tend to have in common. Secondly, I’ll share some tricks and techniques that can be helpful when trying to achieve a clean design.”</p>
<!-- raw HTML omitted -->
<p>Database of HTTP status codes with their IETF and Wikipedia descriptions</p>
<!-- raw HTML omitted -->
<p>“What happens when you click on a weblink? Here’s one answer: a request goes from your computer to a server identified by the URL of the desired link. The server then locates the webpage in its files and sends it back to your browser, which then displays it on your screen. Simple.”</p>
<!-- raw HTML omitted -->
<p>“We occasionally try commercial software. Mostly, we don’t end up buying it. A big reason why is the incredibly time-consuming, aggravating sales process that most commercial enterprise (that is, non-consumer) software vendors insist on.”</p>
<!-- raw HTML omitted -->
<p>“My experience of learning how to write iOS software, after having spent many years exclusively in the world of .NET development. It provides warnings, suggestions, and tips for others who are interested in learning iOS development.”</p>
<!-- raw HTML omitted -->
<p>“If you write any code in JavaScript then you’ve probably used closures, but do you actually understand what they are and how they work? Taking the time to understand closures and how they’re implemented can add a deeper dimension to your understanding of the JavaScript language.”</p>
<!-- raw HTML omitted -->
<p>“In desktop applications, the user interface dominated the screen. The buttons to click, the bars to drag, the windows. That isn’t the case with mobile devices. What’s powerful about mobile devices is that they exist to complement what we are already doing, rather than be our primary focus.”</p>
<!-- raw HTML omitted -->
<p>“At Stack Overflow (…) we feel that it’s part of our mission to help lead fellow .NET developers — and the most effective way to do that is by contributing some of the code that we use to build Stack Overflow and Stack Exchange back to the greater .NET developer community as reusable open source packages.”</p>
<!-- raw HTML omitted -->
<p>“We’ve made a selection of indispensable resources like layout frameworks, tutorials, books, templates and useful tools that can help you understand and implement grid based design in your projects.”</p>]]></content:encoded>
    </item>
    <item>
      <title>Flask MimeRender nel Python Package Index (PyPI)</title>
      <link>https://nicolaiarocci.com/flask-mimerender-e-nel-python-package-index-pypi/</link>
      <pubDate>Thu, 01 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/flask-mimerender-e-nel-python-package-index-pypi/</guid>
      <description>&lt;p&gt;Un appunto veloce per segnalare che &lt;!-- raw HTML omitted --&gt;Flask MimeRender&lt;!-- raw HTML omitted --&gt;, il mio strumento RESTful per il rendering basato sul MIME Media-Type delle richieste HTTP (JSON, XML, HTML, ecc.), è ora presente su &lt;!-- raw HTML omitted --&gt;PyPI&lt;!-- raw HTML omitted --&gt;, il Python Package Index ufficiale.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Tutto ciò significa che l’installazione di Flask MimeRender su Windows, OSX e Linux è diventato più semplice:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Un appunto veloce per segnalare che <!-- raw HTML omitted -->Flask MimeRender<!-- raw HTML omitted -->, il mio strumento RESTful per il rendering basato sul MIME Media-Type delle richieste HTTP (JSON, XML, HTML, ecc.), è ora presente su <!-- raw HTML omitted -->PyPI<!-- raw HTML omitted -->, il Python Package Index ufficiale.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Tutto ciò significa che l’installazione di Flask MimeRender su Windows, OSX e Linux è diventato più semplice:</p>
<!-- raw HTML omitted -->
<p>Codice sorgente e istruzioni sono a vostra disposizione su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted -->, mentre per spiegazione approfondita ed esempio d’uso vi rimando al mio articolo precedente: <a href="http://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/" title="Una REST API che adatta le sue risposte al MIME Media-Type delle richieste HTTP">Una REST API che adatta le sue risposte al MIME Media-Type delle richieste HTTP</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>E’ uscito il Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/e-uscito-il-piccolo-libro-di-mongodb/</link>
      <pubDate>Tue, 21 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/e-uscito-il-piccolo-libro-di-mongodb/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB, Edizione Italiana&#34;&gt;Il Piccolo Libro di MongoDB&lt;/a&gt;, edizione italiana di The Little MongoDB Book, è finalmente &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB&#34;&gt;disponibile online&lt;/a&gt;. C’è voluto un bel po’ di lavoro, e sono certo i primi lettori scoveranno una serie di errori raccapriccianti, ma vi invito comunque a leggerlo e farmi sapere cosa ne pensate.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB, Edizione Italiana">Il Piccolo Libro di MongoDB</a>, edizione italiana di The Little MongoDB Book, è finalmente <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB">disponibile online</a>. C’è voluto un bel po’ di lavoro, e sono certo i primi lettori scoveranno una serie di errori raccapriccianti, ma vi invito comunque a leggerlo e farmi sapere cosa ne pensate.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Una REST API che adatta le sue risposte al MIME Media-Type delle richieste HTTP</title>
      <link>https://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/</link>
      <pubDate>Fri, 03 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/</guid>
      <description>&lt;p&gt;Da qualche tempo sto lavorando alla implementazione di una REST API. In linea generale e semplificando, una &lt;!-- raw HTML omitted --&gt;API&lt;!-- raw HTML omitted --&gt; è un servizio che espone alcune funzionalità, è accessibile via internet più o meno liberamente ed è, infine, utilizzabile non solo da persone fisiche ma anche e soprattutto da altre applicazioni. Un esempio di API è quella di Facebook, che consente a chiunque di creare applicazioni che interagiscono con gli utenti e le pagine Facebook. Già, se non ci fosse la API non esisterebbero i terribili giochini Facebook…&lt;/p&gt;
&lt;p&gt;Una delle specifiche &lt;!-- raw HTML omitted --&gt;REST&lt;!-- raw HTML omitted --&gt; più importanti vuole che un servizio RESTful sia in grado di fornire dati in più formati, in modo tale da soddisfare il maggior numero possibile di utenti/applicazioni. Immaginiamo un servizio che fornisce i risultati delle partite del campionato di calcio. Supponiamo che arrivino tre richieste successive per lo stesso risultato: la prima potrebbe chiedere una risposta in formato XML, la seconda in JSON e la terza in HTML. Il  nostro servizio deve rispondere a tutte e tre le richieste, adattando il flusso di dati della risposta al formato di ognuna.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Nel mio caso la API che sto implementando supporta XML, JSON, HTML e testo puro. E’ scritta in Python (ma va!) e si appoggia all’eccellente &lt;!-- raw HTML omitted --&gt;Flask&lt;!-- raw HTML omitted --&gt; micro web framework. Per risolvere in maniera elegante il problema delle risposte multi-formato ho deciso di usare i &lt;!-- raw HTML omitted --&gt;decorator&lt;!-- raw HTML omitted --&gt;, una delle caratteristiche più interessanti di Python. Dopo un po’ di lavoro in proprio ho scoperto che qualcuno aveva già risolto il problema, per giunta con la stessa tecnica. &lt;!-- raw HTML omitted --&gt;MimeRender&lt;!-- raw HTML omitted --&gt; di Martin Blech è un’ottima soluzione, solo che è specifica per web.py (un altro web framework). La mia soluzione non disponeva di alcune opzioni interessanti che MimeRender include; ho deciso allora di scrivere un port di MimeRender per Flask, e di metterlo a disposizione del pubblico.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da qualche tempo sto lavorando alla implementazione di una REST API. In linea generale e semplificando, una <!-- raw HTML omitted -->API<!-- raw HTML omitted --> è un servizio che espone alcune funzionalità, è accessibile via internet più o meno liberamente ed è, infine, utilizzabile non solo da persone fisiche ma anche e soprattutto da altre applicazioni. Un esempio di API è quella di Facebook, che consente a chiunque di creare applicazioni che interagiscono con gli utenti e le pagine Facebook. Già, se non ci fosse la API non esisterebbero i terribili giochini Facebook…</p>
<p>Una delle specifiche <!-- raw HTML omitted -->REST<!-- raw HTML omitted --> più importanti vuole che un servizio RESTful sia in grado di fornire dati in più formati, in modo tale da soddisfare il maggior numero possibile di utenti/applicazioni. Immaginiamo un servizio che fornisce i risultati delle partite del campionato di calcio. Supponiamo che arrivino tre richieste successive per lo stesso risultato: la prima potrebbe chiedere una risposta in formato XML, la seconda in JSON e la terza in HTML. Il  nostro servizio deve rispondere a tutte e tre le richieste, adattando il flusso di dati della risposta al formato di ognuna.</p>
<p><!-- raw HTML omitted -->Nel mio caso la API che sto implementando supporta XML, JSON, HTML e testo puro. E’ scritta in Python (ma va!) e si appoggia all’eccellente <!-- raw HTML omitted -->Flask<!-- raw HTML omitted --> micro web framework. Per risolvere in maniera elegante il problema delle risposte multi-formato ho deciso di usare i <!-- raw HTML omitted -->decorator<!-- raw HTML omitted -->, una delle caratteristiche più interessanti di Python. Dopo un po’ di lavoro in proprio ho scoperto che qualcuno aveva già risolto il problema, per giunta con la stessa tecnica. <!-- raw HTML omitted -->MimeRender<!-- raw HTML omitted --> di Martin Blech è un’ottima soluzione, solo che è specifica per web.py (un altro web framework). La mia soluzione non disponeva di alcune opzioni interessanti che MimeRender include; ho deciso allora di scrivere un port di MimeRender per Flask, e di metterlo a disposizione del pubblico.</p>
<h2 id="istruzioni-per-l8217uso">Istruzioni per l’uso</h2>
<p>Prima di tutto è necessario fornire le funzioni da usare per il rendering, una per ogni formato che intendiamo supportare:</p>
<!-- raw HTML omitted -->
<p>Quindi decoriamo la nostra funzione, definendo per lei la mappa delle funzioni di rendering:</p>
<!-- raw HTML omitted -->
<p>Tutto qui! In caso di richiesta GET la funzione <code>index</code> restituisce un dizionario, il quale verrà reso da MimeRender come XML, JSON o quant’altro, a seconda del Content-Type specificato nella richiesta HTTP:</p>
<!-- raw HTML omitted -->
<p>Su <!-- raw HTML omitted -->github <!-- raw HTML omitted -->trovate l’esempio completo nonché il codice sorgente del renderer, che potete scaricare liberamente.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/il-piccolo-libro-di-mongodb/</link>
      <pubDate>Thu, 26 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-piccolo-libro-di-mongodb/</guid>
      <description>&lt;p&gt;&lt;em&gt;Update: il &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB, Edizione Italiana&#34;&gt;Piccolo Libro di MongoDB, Edizione Italiana&lt;/a&gt; è ora disponibile online.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ho cominciato a lavorare alla traduzione autorizzata dell’ottimo &lt;!-- raw HTML omitted --&gt;The Little MongoDB Book&lt;!-- raw HTML omitted --&gt; di Karl Seguin. Ho scovato il libro di Karl mentre raccoglievo la documentazione per un nuovo progetto super-segreto (!) a cui sto lavorando. Lo ritengo un’ottima introduzione al mondo &lt;!-- raw HTML omitted --&gt;NoSQL&lt;!-- raw HTML omitted --&gt; in generale e naturalmente al fantastico &lt;!-- raw HTML omitted --&gt;MongoDB&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;Il titolo italiano sarà Il Piccolo Libro di MongoDB. La traduzione prosegue costante ma a piccoli passi perché purtroppo o per fortuna di tempo libero ne ho poco. Al momento sono tradotti più o meno grossolanamente l’introduzione e il primo capitolo. Mi farebbe comodo un po’ di aiuto, in particolare per quanto riguarda la revisione del testo. Se qualcuno vuol dare una mano è il benvenuto: potete fare delle &lt;em&gt;pull request&lt;/em&gt; direttamente su &lt;!-- raw HTML omitted --&gt;GitHub&lt;!-- raw HTML omitted --&gt; (metodo preferibile), oppure mandarmi le correzioni via mail. In cambio vi prometto una menzione d’onore e l’eterna gratitudine dei futuri cultori italiani di MongoDB!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Update: il <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB, Edizione Italiana">Piccolo Libro di MongoDB, Edizione Italiana</a> è ora disponibile online.</em></p>
<p>Ho cominciato a lavorare alla traduzione autorizzata dell’ottimo <!-- raw HTML omitted -->The Little MongoDB Book<!-- raw HTML omitted --> di Karl Seguin. Ho scovato il libro di Karl mentre raccoglievo la documentazione per un nuovo progetto super-segreto (!) a cui sto lavorando. Lo ritengo un’ottima introduzione al mondo <!-- raw HTML omitted -->NoSQL<!-- raw HTML omitted --> in generale e naturalmente al fantastico <!-- raw HTML omitted -->MongoDB<!-- raw HTML omitted -->.</p>
<p>Il titolo italiano sarà Il Piccolo Libro di MongoDB. La traduzione prosegue costante ma a piccoli passi perché purtroppo o per fortuna di tempo libero ne ho poco. Al momento sono tradotti più o meno grossolanamente l’introduzione e il primo capitolo. Mi farebbe comodo un po’ di aiuto, in particolare per quanto riguarda la revisione del testo. Se qualcuno vuol dare una mano è il benvenuto: potete fare delle <em>pull request</em> direttamente su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted --> (metodo preferibile), oppure mandarmi le correzioni via mail. In cambio vi prometto una menzione d’onore e l’eterna gratitudine dei futuri cultori italiani di MongoDB!</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>A lavori ultimati rilascerò il Piccolo Libro di MongoDB nei formati PDF, ePub, .mobi e probabilmente HTML. Se avete commenti o suggerimenti in proposito fatemelo sapere!</p>]]></content:encoded>
    </item>
    <item>
      <title>Imparare a Programmare… Pensando da Informatico</title>
      <link>https://nicolaiarocci.com/imparare-a-programmare-e-pensare-da-informatico/</link>
      <pubDate>Fri, 20 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-a-programmare-e-pensare-da-informatico/</guid>
      <description>&lt;p&gt;Chi mi segue da tempo sa  che l’educazione è un argomento che mi sta particolarmente a cuore ed è forse per questo motivo che spesso le persone mi chiedono consigli su come imparare a programmare. Gli articoli più letti di questo sito sono senz’altro le guide alla programmazione; &lt;a href=&#34;http://nicolaiarocci.com/impara-python-in-10-minuti/&#34; title=&#34;Python in 10 minuti&#34;&gt;Impara Python in 10 minuti&lt;/a&gt; e la &lt;a href=&#34;http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/&#34; title=&#34;Introduzione alle Regular Expression&#34;&gt;serie sulle Regular Expression&lt;/a&gt; sono vere e proprie Hit, ma certo non sono adatte ai principianti. L’ultima mail è di pochi giorni fa: Mirko chiedeva qual’è il modo migliore per avvicinarsi all’affascinante mondo della programmazione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Chi mi segue da tempo sa  che l’educazione è un argomento che mi sta particolarmente a cuore ed è forse per questo motivo che spesso le persone mi chiedono consigli su come imparare a programmare. Gli articoli più letti di questo sito sono senz’altro le guide alla programmazione; <a href="http://nicolaiarocci.com/impara-python-in-10-minuti/" title="Python in 10 minuti">Impara Python in 10 minuti</a> e la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/" title="Introduzione alle Regular Expression">serie sulle Regular Expression</a> sono vere e proprie Hit, ma certo non sono adatte ai principianti. L’ultima mail è di pochi giorni fa: Mirko chiedeva qual’è il modo migliore per avvicinarsi all’affascinante mondo della programmazione.</p>
<p>Una domanda facile da formulare, che presuppone un’altrettanto facile risposta. Ahimè non é così semplice, perlomeno non nel mio caso. Certo, ci sono dozzine di fonti di ottima qualità, ma penso che per poter fornire un consiglio valido dovrei conoscere meglio chi pone la domanda. Il tuo background è scientifico o umanistico? Sai l’inglese? La gran parte delle fonti che consiglierei sono inglesi. Qual’è la tua età? Sono tanti i fattori da considerare, soprattutto se ci si impunta a voler rispondere con cura.</p>
<p>In tempi non troppo lontani programmare significava conoscere il funzionamento dei computer; comprendere a fondo la loro teoria e la loro struttura. Ora è tutto cambiato. Ormai <!-- raw HTML omitted -->Assembly<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Linguaggio Macchina<!-- raw HTML omitted --> sono domini riservati a pochissimi super-specialisti; la gran parte dei programmatori più giovani li ha solo sentiti nominare. I <!-- raw HTML omitted -->linguaggi ad alto livello<!-- raw HTML omitted --> ci permettono di concentrarci sulla soluzione dei problemi (gli <!-- raw HTML omitted -->algoritmi<!-- raw HTML omitted -->) delegando al compilatore la creazione delle istruzioni di basso livello.</p>
<p>E’ una buona notizia. Per diventare programmatori non è indispensabile essere particolarmente dotati, né seguire chissà quali corsi accademici. Buona volontà, curiosità, passione e un pizzico di intraprendenza sono tutto quel che serve per buttarsi. Se son rose fioriranno, come si suol dire.</p>
<h2 id="img-classalignright-size-thumbnail-wp-image-4329-styleborder-style-initial-border-color-initial-border-image-initial-border-width-0px-titlepensare-da-informatico-versione-python-srcimagesgasp_lessons-150x150pngfit1502c150-altpensare-da-informatico-versione-python-srcsethttpi1wpcomnicolaiaroccicomwp-contentuploadsgasp_lessonspngresize1502c150-150w-httpi1wpcomnicolaiaroccicomwp-contentuploadsgasp_lessonspngw192-192w-sizesmax-width-150px-100vw-150px-data-recalc-dims1-pensare-da-informatico"><!-- raw HTML omitted -->Pensare da Informatico</h2>
<p>Se mi avete seguito fin qui grazie per la pazienza. Vi ricompenso con lo stesso consiglio che ho dato a Mirko l’altro giorno: Pensare da Informatico. Ma come direte, dopo tutte queste chiacchiere ci spiattelli un’altra astrattezza da quattro soldi? Al contrario! Sto parlando di un libro vero e proprio. <!-- raw HTML omitted -->Pensare da Informatico (Versione Python)<!-- raw HTML omitted --> è l’unico testo che mi sento di consigliare davvero ai principianti. E’ gratuito ed è ottimamente tradotto da Alessandro Pocaterra. L’edizione originale è giunta da poco alla <!-- raw HTML omitted -->terza edizione<!-- raw HTML omitted --> (novembre 2011), mentre credo che l’italiana sia ferma alla seconda, che va benissimo comunque.</p>
<p>Nella Prefazione <!-- raw HTML omitted -->Jeff Elkner<!-- raw HTML omitted --> racconta che era alla ricerca di un testo adatto all’insegnamento della programmazione nelle scuole americane. Il grande <!-- raw HTML omitted -->Richard Stallman<!-- raw HTML omitted --> gli consigliò di dare una occhiata a <em>How to Think Like a Computer Scientist:</em></p>
<blockquote>
<p>Quando lessi quel libro seppi immediatamente che volevo usarlo nelle mie lezioni. Era il testo di informatica più chiaro ed utile che avessi visto: il libro enfatizzava il processo di pensiero coinvolto nella programmazione piuttosto che le caratteristiche di un particolare linguaggio. Il solo fatto di leggerlo mi rese un insegnante migliore.</p></blockquote>
<p>Mica male come premessa no? Python è il inguaggio scelto dagli autori (e in proposito vi consiglio di leggere <!-- raw HTML omitted -->introduzione <!-- raw HTML omitted -->e <!-- raw HTML omitted -->prefazione<!-- raw HTML omitted -->) ma davvero non è il linguaggio quel che conta. Leggete questo testo con attenzione e soprattutto senza fretta. Non passate al capitolo successivo se non siete sicuri di aver afferrato per bene ciò che avete appena letto. Si procede passo per passo affrontando tutti i principali temi della programmazione moderna. Vi assicuro che alla fine di questa esperienza saprete programmare a dovere, a prescindere dai linguaggi che in futuro vorrete studiare (e magari nel frattempo vi innamorerete pure di Python).</p>
<p>Fatemi sapere come è andata. Ci tengo molto.</p>
<p><em>Aggiornamento del 9.3.2012. Ho scovato per caso una <!-- raw HTML omitted -->versione PDF<!-- raw HTML omitted -->, ben fatta, di Pensare da Informatico.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>JavaScript come Primo Linguaggio</title>
      <link>https://nicolaiarocci.com/javascript-come-primo-linguaggio/</link>
      <pubDate>Tue, 10 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/javascript-come-primo-linguaggio/</guid>
      <description>&lt;p&gt;JavaScript non è mai la prima scelta di un aspirante programmatore. Spesso si finisce per usarlo all’occorrenza, per giochetti AJAX o per manipolare il DOM. Google, copia &amp;amp; incolla, e JavaScript è servito. Prima o poi l’abbiamo fatto tutti. E’ un vero peccato perché JavaScript merita di ben altra attenzione.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;A spiegarlo al mondo è stato naturalmente Douglas Crockford in &lt;a href=&#34;http://www.amazon.it/gp/product/0596517742/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=nicoiaro-21&amp;amp;linkCode=as2&amp;amp;camp=3370&amp;amp;creative=24114&amp;amp;creativeASIN=0596517742&#34;&gt;JavaScript: The Good Parts&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;, un libretto di 172 intensissime pagine in cui si ha costantemente la sensazione che l’autore intenda demolire il linguaggio mentre, in realtà, non fa altro che esaltarne le doti. JavaScript è il linguaggio più usato al mondo, e non a caso: è l’unico supportato da qualunque browser del pianeta. La recente affermazione di &lt;!-- raw HTML omitted --&gt;Node &lt;!-- raw HTML omitted --&gt;lato server ne dimostra l’indiscussa attualità.&lt;/p&gt;
&lt;p&gt;Ciò nonostante JavaScript rimane un linguaggio inadatto al programmatore neofita. O forse no.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>JavaScript non è mai la prima scelta di un aspirante programmatore. Spesso si finisce per usarlo all’occorrenza, per giochetti AJAX o per manipolare il DOM. Google, copia &amp; incolla, e JavaScript è servito. Prima o poi l’abbiamo fatto tutti. E’ un vero peccato perché JavaScript merita di ben altra attenzione.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>A spiegarlo al mondo è stato naturalmente Douglas Crockford in <a href="http://www.amazon.it/gp/product/0596517742/ref=as_li_ss_tl?ie=UTF8&amp;tag=nicoiaro-21&amp;linkCode=as2&amp;camp=3370&amp;creative=24114&amp;creativeASIN=0596517742">JavaScript: The Good Parts</a><!-- raw HTML omitted -->, un libretto di 172 intensissime pagine in cui si ha costantemente la sensazione che l’autore intenda demolire il linguaggio mentre, in realtà, non fa altro che esaltarne le doti. JavaScript è il linguaggio più usato al mondo, e non a caso: è l’unico supportato da qualunque browser del pianeta. La recente affermazione di <!-- raw HTML omitted -->Node <!-- raw HTML omitted -->lato server ne dimostra l’indiscussa attualità.</p>
<p>Ciò nonostante JavaScript rimane un linguaggio inadatto al programmatore neofita. O forse no.</p>
<h2 id="john-resig-e-la-khan-academy">John Resig e la Khan Academy</h2>
<p>John Resig è il creatore di jQuery. Vera star internazionale, autore di libri di successo, ora lavora per <!-- raw HTML omitted -->Khan Academy<!-- raw HTML omitted -->, la famosa accademia online. Ecco ciò che Resig ha <!-- raw HTML omitted -->annunciato<!-- raw HTML omitted --> poco prima di Natale:</p>
<blockquote>
<p>Alla Khan Academy stiamo considerando nuovi, originali, metodi di insegnamento della Computer Science. L’aspetto più interessante è che proporremo agli studenti JavaScript come loro primo linguaggio.</p></blockquote>
<p>La sua è una situazione particolarmente vantaggiosa: oltre a essere completamente digiuni di programmazione i suoi studenti hanno appena completato un corso di matematica e scienze.</p>
<p>In effetti insegnare l’ereditarietà prototipale (<!-- raw HTML omitted -->prototypal inheritance<!-- raw HTML omitted -->) caratteristica di JavaScript a programmatori già abituati alla tradizionale ereditarietà degli oggetti richiede un certo impegno. E’ senz’altro più semplice spiegarla a chi non sa nemmeno cosa sia l’<!-- raw HTML omitted -->ereditarietà<!-- raw HTML omitted --> in informatica. JavaScript è anche un buon linguaggio per la <!-- raw HTML omitted -->programmazione funzionale<!-- raw HTML omitted -->, anche questa più facile da capire in assenza di condizionamenti precedenti. In questo filmato Resig parla del suo progetto sottolineando quello che probabilmente è il più grande vantaggio di JavaScript, la sua ubiquità:</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>Resig non si nasconde certo le difficoltà, tanto che nel suo articolo si dilunga nella spiegazione di una serie di accorgimenti didattici e tecnici che dovrebbero semplificare il processo di apprendimento.</p>
<h2 id="parliamone">Parliamone</h2>
<p>Il progetto è senz’altro interessante e non c’è dubbio che JavaScript sia un ottimo investimento. Non sono sicuro però che partire da JavaScript sia l’approccio migliore per imparare a programmare. L’obiettivo iniziale dovrebbe essere, io credo, imparare le basi della programmazione <em>a prescindere dal linguaggio</em>. Non sarebbe meglio sceglierne uno senza troppe <em>bad parts</em>, dotato di sintassi più semplice, applicabile a contesti diversi e non solo al web?</p>
<p>Chi mi legge sa della mia predilezione, per altro <!-- raw HTML omitted -->criticata aspramente<!-- raw HTML omitted --> da più parti, per Python come linguaggio didattico. Per altri motivi andrebbe bene anche un super-classico come il linguaggio C oppure, perché no, un linguaggio funzionale puro come Haskell. JavaScript? Assolutamente si, ma come secondo linguaggio.</p>
<p>Mi domando infine, e qui ci metto un pizzico di malizia, se la scelta di Khan Academy non sia stata influenzata dalla passione per JavaScript del suo super-consulente, a prescindere da ogni valutazione didattica. Voi che ne pensate?</p>]]></content:encoded>
    </item>
    <item>
      <title>Identità Digitale e Personal Branding per studenti del liceo</title>
      <link>https://nicolaiarocci.com/internet-non-solo-per-gioco/</link>
      <pubDate>Tue, 27 Dec 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/internet-non-solo-per-gioco/</guid>
      <description>&lt;p&gt;In questo periodo sono impegnato come docente nel progetto “Internet non (solo) per gioco”. Si tratta di una serie di lezioni tenute al liceo. L’obiettivo è sensibilizzare i ragazzi circa il ruolo che la rete può svolgere nello sviluppo delle loro abilità personali e professionali. La settimana scorsa si è conclusa la prima parte, quella più teorica, e approfitto della pausa festiva per proporvi le slide e raccontarvi come è andata.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In questo periodo sono impegnato come docente nel progetto “Internet non (solo) per gioco”. Si tratta di una serie di lezioni tenute al liceo. L’obiettivo è sensibilizzare i ragazzi circa il ruolo che la rete può svolgere nello sviluppo delle loro abilità personali e professionali. La settimana scorsa si è conclusa la prima parte, quella più teorica, e approfitto della pausa festiva per proporvi le slide e raccontarvi come è andata.</p>
<h2 id="identità-reale-virtuale-o-digitale">Identità Reale, Virtuale o Digitale?</h2>
<p>Nella prima lezione ho affrontato il tema del rapporto tra le attività svolte in rete (identità digitale) e quelle offline (identità reale). E’ un legame ben più stretto di quanto generalmente si pensi:</p>
<p>Nella corso dell’esercitazione pratica ho mostrato ai ragazzi come spesso sia facile aggirare i meccanismi che più o meno coscientemente erigono a protezione dei loro profili Facebook. Ho fatto anche notare come alcuni di loro siano già stati ‘profilati’ dalla rete, a prescindere dalla loro attività su Facebook.</p>
<h2 id="a-proposito-di-facebook">A proposito di Facebook</h2>
<p>Non mi ha sorpreso constatare come per praticamente ognuno di loro non ci sia rete al di fuori di Facebook. Semplicemente, per i giovani e giovanissimi di oggi Facebook <em>è</em> la rete.</p>
<h2 id="personal-branding-per-studenti-e-non-solo">Personal Branding per Studenti e non solo</h2>
<p>Preso atto che ciò che facciamo in rete può avere (avrà) conseguenze nella vita di tutti i giorni, ecco che allora possiamo prendere in mano l’iniziativa e sfruttare tutto questo a nostro vantaggio:</p>
<h2 id="un-primo-bilancio">Un primo bilancio</h2>
<p>Questa esperienza si sta rivelando anche più coinvolgente del previsto. Una cosa è parlare a un pubblico di adulti e colleghi, come mi capita di fare ogni tanto. Un’altra è relazionarsi con giovani studenti. Mi piace parlare a questi ragazzi, suscitare in loro curiosità oppure stupirli con qualche trucchetto.</p>
<p>E’ sorprendente rilevare come siano veramente “innocenti” nei confronti della rete. Per la maggior parte non sembrano conoscerne le potenzialità, né tantomeno i rischi. La usano quotidianamente, ma non la conoscono. Tuttavia ne subiscono il fascino e mi pare di percepire in loro un forte interesse per gli argomenti che stiamo trattando.</p>
<h2 id="cosa-ci-aspetta">Cosa ci aspetta</h2>
<p>Le prossime lezioni saranno più pratiche. Ci saranno meno slide. Cominceremo a sporcarci le mani costruendo siti e interagendo con gli strumenti web più disparati. Alla fine del percorso i ragazzi conosceranno meglio la rete e molti di quegli strumenti che oggi ignorano. Mi auguro che in seguito vorranno e sapranno usarli con consapevolezza, divertimento, profitto personale e, perché no, professionale.</p>]]></content:encoded>
    </item>
    <item>
      <title>Branching di successo per Git</title>
      <link>https://nicolaiarocci.com/branching-di-successo-per-git/</link>
      <pubDate>Fri, 09 Dec 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/branching-di-successo-per-git/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Git&lt;!-- raw HTML omitted --&gt; è di gran lunga la tecnologia più significativa che il mio team ha introdotto negli ultimi tempi. Grazie a Git la nostra produttività è migliorata a tal punto che davvero non passa giorno senza che mi chieda come abbiamo potuto farne a meno così a lungo.&lt;/p&gt;
&lt;p&gt;Git è un &lt;!-- raw HTML omitted --&gt;sistema di controllo versione&lt;!-- raw HTML omitted --&gt; ideato da Linus Torvald (quello di Linux). E’ gratuito, multi-piattaforma, distribuito e soprattutto talmente veloce che sembra aggiungere un pizzico di magia al processo produttivo. Git è una macchina del tempo con cui spostarsi avanti e indietro tra le versioni del codice. E’ l’ideale sia per progetti individuali che per gruppi di lavoro numerosi e distribuiti. L’integrità del codice e la preservazione delle versioni sono garantite da un efficiente – e veloce! – sistema di &lt;em&gt;branching&lt;/em&gt; e &lt;em&gt;merging&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Se non avete mai usato prima un sistema di controllo versione (e magari ricorrete ancora a copie manuali del codice tra una release e l’altra) gioite, perché Git vi cambierà la vita. Se venite da altri sistemi (Subversion, Team Foundation Server) sappiate che Git adotta un approccio fondamentalmente diverso: niente copie differenziali. In Git ogni repository è un mirror integrale della codebase; è quest’accorgimento ciò che rende Git così veloce.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Git<!-- raw HTML omitted --> è di gran lunga la tecnologia più significativa che il mio team ha introdotto negli ultimi tempi. Grazie a Git la nostra produttività è migliorata a tal punto che davvero non passa giorno senza che mi chieda come abbiamo potuto farne a meno così a lungo.</p>
<p>Git è un <!-- raw HTML omitted -->sistema di controllo versione<!-- raw HTML omitted --> ideato da Linus Torvald (quello di Linux). E’ gratuito, multi-piattaforma, distribuito e soprattutto talmente veloce che sembra aggiungere un pizzico di magia al processo produttivo. Git è una macchina del tempo con cui spostarsi avanti e indietro tra le versioni del codice. E’ l’ideale sia per progetti individuali che per gruppi di lavoro numerosi e distribuiti. L’integrità del codice e la preservazione delle versioni sono garantite da un efficiente – e veloce! – sistema di <em>branching</em> e <em>merging</em>.</p>
<p>Se non avete mai usato prima un sistema di controllo versione (e magari ricorrete ancora a copie manuali del codice tra una release e l’altra) gioite, perché Git vi cambierà la vita. Se venite da altri sistemi (Subversion, Team Foundation Server) sappiate che Git adotta un approccio fondamentalmente diverso: niente copie differenziali. In Git ogni repository è un mirror integrale della codebase; è quest’accorgimento ciò che rende Git così veloce.</p>
<h2 id="come-e-dove-imparare-git">Come e dove imparare Git</h2>
<p>Git non è difficile, ma richiede un pò d’impegno iniziale. In rete sono disponibili numerose e ottime fonti. Vi consiglio <!-- raw HTML omitted -->Git Pro<!-- raw HTML omitted -->, libro gratuito nella versione online. Stampatelo e tenetelo sempre a portata di mano. Ottimi anche <!-- raw HTML omitted -->Git Reference<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Everyday GIT<!-- raw HTML omitted --> (consigliati dal sito ufficiale), <!-- raw HTML omitted -->Git Magic<!-- raw HTML omitted --> per quando avrete già un pò di dimestichezza con Git, e infine la valida raccolta che trovate su <!-- raw HTML omitted -->Stack Overflow<!-- raw HTML omitted -->.</p>
<h2 id="la-potenza-è-nulla-senza-controllo">La potenza è nulla senza controllo</h2>
<p>Uno dei risultati più interessanti che abbiamo ottenuto grazie all’adozione di Git è la pubblicazione contemporanea di più versioni del nostro <!-- raw HTML omitted -->software gestionale<!-- raw HTML omitted -->. C’è quella ufficiale (stabile) e c’é quella <em>sperimentale</em> con una anteprima delle novità a cui stiamo ancora lavorando. E’ un pò la nostra _<!-- raw HTML omitted -->night build<!-- raw HTML omitted --> e _contiene le cose non ancora mature per affrontare il grande pubblico ma già interessanti per gli utenti più smaliziati. Nel frattempo lavoriamo anche a nuove funzionalità importanti. Queste ultime vedranno la luce solo in occasione dei rilasci più significativi (tipicamente non sono più di due o tre all’anno) e non sono incluse nelle night build. In tutto questo <em>bailamme</em> di versioni, hotfix e rilasci pubblici e interni non perdiamo una linea di codice e manteniamo i nostri repository allineati, muovendoci avanti e indietro quando necessario.</p>
<p>Per ottenere un risultato così non basta il sistema di controllo versione; è necessaria anche una ottima strategia o, per meglio dire, un modello di branching ben progettato. Dopo diversi tentativi andati più o meno a vuoto la soluzione è arrivata grazie alla scoperta dello spettacolare articolo di <!-- raw HTML omitted -->Vincent Driessen<!-- raw HTML omitted -->:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il modello si basa su due branch principali (master e develop) e su tre di supporto (hotfix, feature e release). Lo considero talmente valido che mi sono proposto a Vincent come curatore della traduzione italiana, solo per scoprire che qualcuno prima di me <!-- raw HTML omitted -->ci aveva già pensato<!-- raw HTML omitted -->: meglio così. Da quando l’ho scoperto lo applichiamo con zelo e vi consiglio di fare altrettanto, soprattutto se lavorate su progetti complessi.</p>
<h2 id="non-solo-codice">Non solo codice</h2>
<p>Git è utile anche per i piccoli progetti personali. Anzi, se state cominciando vi consiglio di partire proprio da uno di questi. Non è necessario che sia un programma, potrebbe benissimo trattarsi di un file di testo qualunque. Git funziona con qualunque tipo di file e in effetti viene usato con successo per progetti di scrittura, documentazione, web design e quant’altro.</p>
<p>Una volta presa dimestichezza con Git non potrete più rinunciarvi, qualunque sia la portata del progetto a cui state lavorando.</p>]]></content:encoded>
    </item>
    <item>
      <title>Python nella scuola italiana. Si può.</title>
      <link>https://nicolaiarocci.com/python-nella-scuola-italiana-si-puo/</link>
      <pubDate>Fri, 25 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-nella-scuola-italiana-si-puo/</guid>
      <description>&lt;p&gt;Mia moglie è docente nel liceo artistico della nostra città. L’anno scorso era coinvolta in un progetto che vedeva studenti e professori impegnati nella progettazione di un monumento da installare nella sede dell’Autorità Portuale.&lt;/p&gt;
&lt;p&gt;Il soggetto scelto dal team erano le onde del mare e ben presto si pose il problema di rappresentarle realisticamente. Un insegnate di Matematica suggerì di ricorrere alla teoria dei &lt;!-- raw HTML omitted --&gt;frattali&lt;!-- raw HTML omitted --&gt;. Idea brillante che offriva l’opportunità di un approfondimento didattico piuttosto insolito per un liceo artistico.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Mia moglie è docente nel liceo artistico della nostra città. L’anno scorso era coinvolta in un progetto che vedeva studenti e professori impegnati nella progettazione di un monumento da installare nella sede dell’Autorità Portuale.</p>
<p>Il soggetto scelto dal team erano le onde del mare e ben presto si pose il problema di rappresentarle realisticamente. Un insegnate di Matematica suggerì di ricorrere alla teoria dei <!-- raw HTML omitted -->frattali<!-- raw HTML omitted -->. Idea brillante che offriva l’opportunità di un approfondimento didattico piuttosto insolito per un liceo artistico.</p>
<p>Le competenze informatiche del nostro intraprendente professore risalivano credo ai tempi dell’università, e i ragazzi erano a digiuno di qualunque nozione tecnica. Nel corso della discussione mia moglie, più che altro per associazione d’idee, buttò lì una frase:</p>
<blockquote>
<p>mio marito è un gran sostenitore del linguaggio Python, dice sempre che è l’ideale per imparare e che dovrebbero insegnarlo nelle scuole</p></blockquote>
<p>La cosa sembrava finita lì senonché dopo qualche giorno il professore irruppe in sala insegnanti, puntò dritto su mia moglie e l’apostrofò così:</p>
<blockquote>
<p>ho scritto questo programmino in Python, non è che tuo marito può darci una occhiata perché sai funziona, ma non disegna proprio il frattale che serve a noi – ci va vicino</p></blockquote>
<p>Immaginate la mia sorpresa quando la sera, a casa, mia moglie mi raccontò tutta la faccenda. La mia prima reazione è stata quella di correre al computer per dare un’occhiata al codice:</p>
<!-- raw HTML omitted -->
<p>Mi sono subito reso conto che si trattava di una implementazione parziale della <!-- raw HTML omitted -->Curva (o fiocco) di Koch<!-- raw HTML omitted -->, una delle prime curve frattali documentate e anche una delle più famose. Una volta corretto il problema l’output restituito dal programma è stato questo:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Non male davvero. Per ammissione dello stesso autore sappiamo che il codice era in parte scopiazzato (in rete si trovano implementazioni della curva di Koch in tutti i linguaggi), ma non è questo il punto.</p>
<p>Il fatto è che un professore di uno sperduto liceo artistico (artistico!) italiano ha:</p>
<ol>
<li>adottato Python per una lezione in classe</li>
<li>dimostrato che nella scuola ci sono anche (molti) docenti intraprendenti, appassionati e competenti</li>
</ol>
<p>Qualche mese più tardi un’altra docente, che mi chiedeva consiglio su come approcciare la programmazione in classe, ha rifiutato categoricamente la mia proposta di Python perché “non l’aveva mai sentito nominare”. Scelse invece il linguaggio C perché “molto più affermato”.</p>
<p>Senz’altro, anche se nutro seri dubbi sul fatto che la sua scelta sia la migliore da un punto di vista didattico. Dubito, per esempio, che dopo un giorno o due lei e i suoi studenti sarebbero stati in grado di scrivere un’implementazione C della curva di Koch.</p>]]></content:encoded>
    </item>
    <item>
      <title>Come guadagnare $19.000 sul App Store imparando a programmare</title>
      <link>https://nicolaiarocci.com/come-guadagnare-19000-sul-app-store-imparando-a-programmare/</link>
      <pubDate>Wed, 23 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-guadagnare-19000-sul-app-store-imparando-a-programmare/</guid>
      <description>&lt;p&gt;Nathan Barry si è messo in testa di scrivere Apps per iPad e venderle sul App Store. Non sapendo nulla né di Objective-C né di sviluppo mobile mette in conto un bel po’ di gavetta e tante notti insonni. Un anno e mezzo dopo si ritrova con una solida esperienza, $19.000 in banca e un lavoro in proprio. Fa bene ogni tanto leggere queste storielle a lieto fine:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Nathan Barry si è messo in testa di scrivere Apps per iPad e venderle sul App Store. Non sapendo nulla né di Objective-C né di sviluppo mobile mette in conto un bel po’ di gavetta e tante notti insonni. Un anno e mezzo dopo si ritrova con una solida esperienza, $19.000 in banca e un lavoro in proprio. Fa bene ogni tanto leggere queste storielle a lieto fine:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Microsoft Silverlight e Adobe Flash verso la resa. Comincia l’era di Re HTML5</title>
      <link>https://nicolaiarocci.com/microsoft-silverlight-e-adobe-flash-verso-la-resa-comincia-lera-di-re-html5/</link>
      <pubDate>Fri, 11 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/microsoft-silverlight-e-adobe-flash-verso-la-resa-comincia-lera-di-re-html5/</guid>
      <description>&lt;p&gt;Silverlight 5 è in dirittura d’arrivo. L’ultimo aggiornamento del plug-in Microsoft sarà &lt;em&gt;ultimo&lt;/em&gt; in tutti i sensi dato che &lt;!-- raw HTML omitted --&gt;a quanto pare&lt;!-- raw HTML omitted --&gt; non ne seguiranno altri. A sostenerlo è ZD-Net per bocca di Mary-Jo Foley, di solito sempre ben informata su quel che succede nei corridoi del gigante di Seattle.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Diversi partner e clienti mi hanno detto di aver saputo da fonti Microsoft che Silverlight 5 è l’ultima versione di Silverlight che Microsoft rilascerà. Riferiscono di non sapere se verranno rilasciati Service Pack, né per quanto tempo Microsoft supporterà Silverlight 5&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Si tratta solo di voci ma la fonte è autorevole. Proprio l’altro giorno Adobe ha &lt;!-- raw HTML omitted --&gt;annunciato&lt;!-- raw HTML omitted --&gt; lo stop allo sviluppo di Flash Player Mobile per concentrarsi su HTML5. Il vice presidente Adobe Danny Winokur ha dichiarato&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Questa novità ci permetterà di aumentare l’impegno su HTML5 continuando a innovare Flash nei settori in cui  può avere più impatto: advanced gaming e premium video.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Non so voi ma io in queste righe io leggo qualcosa di più del semplice abbandono della versione mobile di Flash. Ci vedo la ricollocazione di Flash in settori di nicchia e la contestuale adozione di HTML5 come soluzione universale per il Web. Una onorevole resa delle armi, insomma.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Silverlight 5 è in dirittura d’arrivo. L’ultimo aggiornamento del plug-in Microsoft sarà <em>ultimo</em> in tutti i sensi dato che <!-- raw HTML omitted -->a quanto pare<!-- raw HTML omitted --> non ne seguiranno altri. A sostenerlo è ZD-Net per bocca di Mary-Jo Foley, di solito sempre ben informata su quel che succede nei corridoi del gigante di Seattle.</p>
<blockquote>
<p>Diversi partner e clienti mi hanno detto di aver saputo da fonti Microsoft che Silverlight 5 è l’ultima versione di Silverlight che Microsoft rilascerà. Riferiscono di non sapere se verranno rilasciati Service Pack, né per quanto tempo Microsoft supporterà Silverlight 5</p></blockquote>
<p>Si tratta solo di voci ma la fonte è autorevole. Proprio l’altro giorno Adobe ha <!-- raw HTML omitted -->annunciato<!-- raw HTML omitted --> lo stop allo sviluppo di Flash Player Mobile per concentrarsi su HTML5. Il vice presidente Adobe Danny Winokur ha dichiarato</p>
<blockquote>
<p>Questa novità ci permetterà di aumentare l’impegno su HTML5 continuando a innovare Flash nei settori in cui  può avere più impatto: advanced gaming e premium video.</p></blockquote>
<p>Non so voi ma io in queste righe io leggo qualcosa di più del semplice abbandono della versione mobile di Flash. Ci vedo la ricollocazione di Flash in settori di nicchia e la contestuale adozione di HTML5 come soluzione universale per il Web. Una onorevole resa delle armi, insomma.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Solo la scorsa estate <a href="http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/" title="Windows 8 e i dubbi sul destino di Silverlight">facevo presente</a> che sul futuro di Silverlight si stavano addensando nubi minacciose e tra le fonti citavo proprio la Foley. Sulla diatriba tra Flash e HTML5 ho già espresso la mia <a href="http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/" title="Adobe Flash è una pessima idea">opinione</a> sollevando anche qualche <!-- raw HTML omitted -->piccola polemica<!-- raw HTML omitted -->.</p>
<p>Non mi sorprende la inevitabile convergenza verso HTML5. Mi colpisce piuttosto la forte accelerazione subita dal processo, una accelerazione dovuta in gran parte proprio all’iniziativa di quegli stessi brand (e gliene va reso merito) che fino all’altro giorno resistevano all’avvento di HTML5. Ufficialmente Microsoft non ha ancora cambiato posizione, ma è solo questione di tempo.</p>
<p>Se il biennio 2010-11 è stato quello della battaglia per il web, il 2012 sarà senz’altro il primo del lungo e pacifico dominio di Re HTML5.</p>
<h2 id="approfondimenti">Approfondimenti</h2>
<ul>
<li><a href="http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/" title="Adobe Flash è una pessima idea">Adobe Flash è una pessima idea</a></li>
<li><a href="http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/" title="Windws 8 e i dubbi sul destino di Silverlight">Windows 8 è i dubbi sul destino di Silverlight</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio per accedere a Kinect SDK ed Excel via Python</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-per-accedere-a-kinect-sdk-ed-excel-via-python/</link>
      <pubDate>Fri, 04 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-per-accedere-a-kinect-sdk-ed-excel-via-python/</guid>
      <description>&lt;p&gt;E’ uscita ieri la &lt;!-- raw HTML omitted --&gt;versione 1.1 Alpha&lt;!-- raw HTML omitted --&gt; dei Python Tools per Visual Studio, il plug-in open source per programmare in Python con Visual Studio 2010. Migliorie e molte nuove features per la IDE ma la novità più interessante sono senz’altro &lt;!-- raw HTML omitted --&gt;PyKinect&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;Pyvot&lt;!-- raw HTML omitted --&gt;, due librerie che consentono rispettivamente di lavorare col Kinect SDK e di interagire con Excel via Python.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>E’ uscita ieri la <!-- raw HTML omitted -->versione 1.1 Alpha<!-- raw HTML omitted --> dei Python Tools per Visual Studio, il plug-in open source per programmare in Python con Visual Studio 2010. Migliorie e molte nuove features per la IDE ma la novità più interessante sono senz’altro <!-- raw HTML omitted -->PyKinect<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Pyvot<!-- raw HTML omitted -->, due librerie che consentono rispettivamente di lavorare col Kinect SDK e di interagire con Excel via Python.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Per informazioni su Python Tools per Visual Studio date una occhiata a <a href="http://nicolaiarocci.com/python-tools-per-visual-studio-2010/" title="Programmare in Python con Visual Studio 2010">Programmare in Python con Visual Studio 2010</a> e <a href="http://nicolaiarocci.com/python-tools-per-visual-studio-1-0/" title="Python Tools per Visual Studio 1.0">Python Studio per Visual Studio 1.0</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ci sono più offerte di lavoro che Programmatori .NET</title>
      <link>https://nicolaiarocci.com/ci-sono-piu-offerte-di-lavoro-che-programmatori-net/</link>
      <pubDate>Wed, 02 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ci-sono-piu-offerte-di-lavoro-che-programmatori-net/</guid>
      <description>&lt;p&gt;Ai primi di ottobre &lt;!-- raw HTML omitted --&gt;TechCrunch&lt;!-- raw HTML omitted --&gt; riportava una notizia interessante: negli Stati Uniti ci sarebbe carenza di sviluppatori .NET. La piattaforma di recruitment Dice dichiara che le offerte di lavoro .NET aumentano del 25% ogni anno, e che la gran parte delle ricerche sui loro database riguarda skill .NET. Ai primi di ottobre 2011 sarebbero state oltre 10.000 le richieste inevase di figure professionali .NET.&lt;/p&gt;
&lt;p&gt;Notizie di questo tipo vanno prese con beneficio di inventario anche se in questo caso una conferma indiretta viene da WANTED Analytics, che a Settembre ha pubblicato un &lt;!-- raw HTML omitted --&gt;report&lt;!-- raw HTML omitted --&gt; indipendente che sembra giungere alle stesse conclusioni. Anche i &lt;!-- raw HTML omitted --&gt;commenti&lt;!-- raw HTML omitted --&gt; all’articolo di TechCrunch sono confortanti: ci sono aziende che ammettono di essere a caccia di sviluppatori .NET e ci sono programmatori che confermano di ricevere continuamente offerte di lavoro (non mancano quelli che sono passati ad altri linguaggi e non se ne pentono).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ai primi di ottobre <!-- raw HTML omitted -->TechCrunch<!-- raw HTML omitted --> riportava una notizia interessante: negli Stati Uniti ci sarebbe carenza di sviluppatori .NET. La piattaforma di recruitment Dice dichiara che le offerte di lavoro .NET aumentano del 25% ogni anno, e che la gran parte delle ricerche sui loro database riguarda skill .NET. Ai primi di ottobre 2011 sarebbero state oltre 10.000 le richieste inevase di figure professionali .NET.</p>
<p>Notizie di questo tipo vanno prese con beneficio di inventario anche se in questo caso una conferma indiretta viene da WANTED Analytics, che a Settembre ha pubblicato un <!-- raw HTML omitted -->report<!-- raw HTML omitted --> indipendente che sembra giungere alle stesse conclusioni. Anche i <!-- raw HTML omitted -->commenti<!-- raw HTML omitted --> all’articolo di TechCrunch sono confortanti: ci sono aziende che ammettono di essere a caccia di sviluppatori .NET e ci sono programmatori che confermano di ricevere continuamente offerte di lavoro (non mancano quelli che sono passati ad altri linguaggi e non se ne pentono).</p>
<!-- raw HTML omitted -->
<h2 id="perché-la-carenza-di-programmatori-net">Perché la carenza di Programmatori .NET?</h2>
<p>Secondo TechCrunch gli sviluppatori .NET tendono a spostarsi su altre piattaforme perché temono di rimanere tagliati fuori dal mercato, visto che la tendenza del momento vuole i linguaggi open source far la parte del leone. Ci sarebbe inoltre una motivazione economica. Secondo Dice negli Stati Uniti i programmatori .NET guadagnano in media $83.000, mentre quelli Java arrivano a $91.000.</p>
<h2 id="e-in-italia">E in Italia?</h2>
<p>Per quanto ne so non esistono dati sulla situazione italiana (se ne sapete qualcosa fatemelo sapere: li segnalerò volentieri). Un mio <!-- raw HTML omitted -->rapido test<!-- raw HTML omitted --> ha prodotto risultati incoraggianti: oltre 30 pagine di offerte di lavoro in ambito .NET. Non mi intendo di recruitment ma senz’altro è facile rilevare che, come negli Stati Uniti, anche da noi girano migliaia di applicazioni legacy .NET che assicureranno continuità di impiego anche nel lungo periodo. Probabilmente, ma si tratta di una mia sensazione, nel nostro paese la piattaforma Microsoft è meno diffusa in ambito Enterprise. Senz’altro la media dei salari IT europei (e italiani soprattutto) è più bassa di quella americana.</p>
<p>Anche da noi la tendenza è comunque verso l’open source e d’altra parte la stessa Microsoft <!-- raw HTML omitted -->si muove<!-- raw HTML omitted --> da anni anche in questa direzione pur senza intaccare il suo modello di business principale. Tempo fa mi sono dilungato sul <a href="http://nicolaiarocci.com/perche-le-web-startup-non-amano-net-framework/" title="Perché le Web Startup non amano il .NET Framework?">perché le web startup non amano il .NET Framework</a> e tutto sommato credo che quelle conclusioni siano valide tutt’ora. Certo mi fa piacere apprendere che la piattaforma sulla quale ho investito oltre quindici anni di carriera sta vivendo, almeno dal punto di vista del recruitment, una seconda giovinezza.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il mio intervento al KnowCamp 2011: Fuga dalla Comfort Zone</title>
      <link>https://nicolaiarocci.com/il-mio-intervento-al-knowcamp-2011-fuga-dalla-comfort-zone/</link>
      <pubDate>Tue, 25 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-mio-intervento-al-knowcamp-2011-fuga-dalla-comfort-zone/</guid>
      <description>&lt;p&gt;Da qualche giorno sono disponibili le slide e la registrazione video del mio intervento al &lt;!-- raw HTML omitted --&gt;KnowCamp 2011&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;La diretta è stata seguita da oltre 1200 spettatori mentre in sala erano presenti circa 150 persone: un bel successo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da qualche giorno sono disponibili le slide e la registrazione video del mio intervento al <!-- raw HTML omitted -->KnowCamp 2011<!-- raw HTML omitted -->.</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>La diretta è stata seguita da oltre 1200 spettatori mentre in sala erano presenti circa 150 persone: un bel successo.</p>
<p>Per quanto riguarda le slide, visto che si trattava di un intervento di tipo <!-- raw HTML omitted -->Ignite<!-- raw HTML omitted --> ho preferito impostarle come semplice supporto al parlato (un paio sono addirittura ‘mute’):</p>
<h2 id="ringraziamenti">Ringraziamenti</h2>
<p>Grazie a <!-- raw HTML omitted -->Nicola Ballotta<!-- raw HTML omitted --> e tutti i ragazzi dello staff del KnowCamp, a <!-- raw HTML omitted -->Nicola Mattina<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Gianluca Diegoli<!-- raw HTML omitted --> moderatori di Ignite Session e User Panel e un saluto affettuoso ai compagni di scorribande alimentari e non (voi sapete). Grazie al pubblico che mi ha dedicato cinque minuti del suo tempo.</p>
<p>Infine un grazie grande come una casa ai tanti che personalmente o via twitter/facebook oppure citandomi nei loro articoli online mi hanno comunicato il loro apprezzamento. Ripropongo uno dei riscontri che più mi hanno colpito perché testimonia che i contenuti proposti stanno attecchendo. Cosa può desiderare di più un <!-- raw HTML omitted -->umile<!-- raw HTML omitted --> relatore?</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Perché non acquisterò la biografia ufficiale di Steve Jobs</title>
      <link>https://nicolaiarocci.com/perche-non-acquistero-la-biografia-ufficiale-di-steve-jobs/</link>
      <pubDate>Fri, 21 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/perche-non-acquistero-la-biografia-ufficiale-di-steve-jobs/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Non acquisterò la biografia ufficiale di Steve Jobs. Non mi interessa il suo privato e quel che ha (o non ha) fatto nel corso della sua carriera è di pubblico dominio. I contenuti del libro li troverò comunque citati, acclamati e commentati &lt;em&gt;ad nauseam&lt;/em&gt; sul web. Gratis.&lt;/p&gt;
&lt;p&gt;E poi, non fosse morto l’altro ieri, l’avrei comprata? Vedi sopra.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Non acquisterò la biografia ufficiale di Steve Jobs. Non mi interessa il suo privato e quel che ha (o non ha) fatto nel corso della sua carriera è di pubblico dominio. I contenuti del libro li troverò comunque citati, acclamati e commentati <em>ad nauseam</em> sul web. Gratis.</p>
<p>E poi, non fosse morto l’altro ieri, l’avrei comprata? Vedi sopra.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python per il Web</title>
      <link>https://nicolaiarocci.com/python-per-il-web/</link>
      <pubDate>Thu, 20 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-per-il-web/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Python for the Web&lt;!-- raw HTML omitted --&gt; è una agile guida introduttiva per chi vuole accedere al Web via Python. Vengono presentate tre eccellenti librerie: &lt;!-- raw HTML omitted --&gt;Requests&lt;!-- raw HTML omitted --&gt;, &lt;!-- raw HTML omitted --&gt;simplejson&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;lxml&lt;!-- raw HTML omitted --&gt;. La prima consente di interagire facilmente coi siti Web da Python, la seconda serve a processare i flussi JSON e l’ultima è una fantastica risorsa per lo scraping (l’ho usata in un mio progetto, ve la consiglio senz’altro). L’ultimo argomento della guida è la creazione di siti web in Python attraverso il framework &lt;!-- raw HTML omitted --&gt;Django&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Python for the Web<!-- raw HTML omitted --> è una agile guida introduttiva per chi vuole accedere al Web via Python. Vengono presentate tre eccellenti librerie: <!-- raw HTML omitted -->Requests<!-- raw HTML omitted -->, <!-- raw HTML omitted -->simplejson<!-- raw HTML omitted --> e <!-- raw HTML omitted -->lxml<!-- raw HTML omitted -->. La prima consente di interagire facilmente coi siti Web da Python, la seconda serve a processare i flussi JSON e l’ultima è una fantastica risorsa per lo scraping (l’ho usata in un mio progetto, ve la consiglio senz’altro). L’ultimo argomento della guida è la creazione di siti web in Python attraverso il framework <!-- raw HTML omitted -->Django<!-- raw HTML omitted -->.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Più che una guida, Python for the Web è un <em>appetizer</em> che vi invoglierà ad approfondire gli argomenti trattati. Se state cominciando con Python, date una occhiata.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Il Linguaggio più importante per il Programmatore</title>
      <link>https://nicolaiarocci.com/il-linguaggio-piu-importante-per-il-programmatore/</link>
      <pubDate>Wed, 19 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-linguaggio-piu-importante-per-il-programmatore/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Molti programmatori hanno difficoltà nel gestire la comunicazione. Non intendo quella di rete, ma quella interpersonale. E’ forse per questo che gran parte di loro preferisce lavorare in proprio. Ciò gli consente di non dover comunicare o perlomeno di farlo il meno possibile.&lt;/p&gt;
&lt;p&gt;Luogo comune vuole che i programmatori siano persone chiuse, a volte timide, oppure scontrose e irascibili; più interessate al codice che non alle relazioni interpersonali.  E’ pur vero che il nostro lavoro richiede concentrazione. Molti &lt;!-- raw HTML omitted --&gt;sostengono&lt;!-- raw HTML omitted --&gt; che programmare è una forma d’arte e la gran parte degli artisti (pittori, scultori, disegnatori) non lavora forse in silenzio?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Molti programmatori hanno difficoltà nel gestire la comunicazione. Non intendo quella di rete, ma quella interpersonale. E’ forse per questo che gran parte di loro preferisce lavorare in proprio. Ciò gli consente di non dover comunicare o perlomeno di farlo il meno possibile.</p>
<p>Luogo comune vuole che i programmatori siano persone chiuse, a volte timide, oppure scontrose e irascibili; più interessate al codice che non alle relazioni interpersonali.  E’ pur vero che il nostro lavoro richiede concentrazione. Molti <!-- raw HTML omitted -->sostengono<!-- raw HTML omitted --> che programmare è una forma d’arte e la gran parte degli artisti (pittori, scultori, disegnatori) non lavora forse in silenzio?</p>
<p>Tuttavia anche i più abili nell’eludere ogni forma di contatto prima o poi si vedranno costretti a comunicare con una persona importante: il cliente. Di tutte le forme di comunicazione professionale, quella col cliente è senz’altro la più delicata. Ne va del nostro lavoro e purtroppo in questo caso ci troviamo spesso ad affrontare un problema importante, quello che <!-- raw HTML omitted -->Chris Eidhof<!-- raw HTML omitted --> definisce la “perdita di segnale”.</p>
<blockquote>
<p>Ogni volta che comunichiamo c’è un rumore di fondo. Se le parti hanno competenze diverse, frammenti del messaggio andranno perduti. In linea generale, più le esperienze sono vicine (due programmatori che parlano tra di loro), minore è la perdita di segnale.</p></blockquote>
<p>Quando le aree di competenza sono divergenti (come capita tra programmatore e cliente) è necessario adottare, a volte forgiare, un linguaggio comprensibile per entrambi. Quasi sempre questo è più vicino al cliente che non al programmatore, per il quale l’impegno è notevole. Il rischio da evitare sono le incomprensioni e i conseguenti, inevitabili, ritardi nel lavoro.</p>
<p>A differenza dei linguaggi di programmazione, che una volta acquisiti entrano definitivamente nel bagaglio del programmatore, i linguaggi da adottare coi clienti tendono a cambiare di volta in volta a causa delle variabili in gioco, prime tra tutte il grado di alfabetizzazione informatica e l’area di competenza (ambito professionale) della controparte.</p>
<p>Qualche esempio può essere utile. Godetevi le mie tre <em>gaffes</em> più recenti, non tutte avvenute sul lavoro. D’altronde questa faccenda della scelta del linguaggio giusto non è certo confinata al solo ambito professionale. La prima riguarda la mia non proprio brillante comunicazione su Facebook:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il secondo incidente è avvenuto proprio su questo sito:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>In quest’ultimo caso si potrebbe obiettare che l’errore è del visitatore che è capitato nel posto sbagliato. Non è così perché l’avevo indotto io alla visita, pubblicando il link su Facebook. E veniamo al caso più interessante perché ha coinvolto un mio cliente la settimana scorsa:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Qui il nostro servizio di assistenza si era espresso chiaramente. Il fatto è che la parola ‘immagine’ ha un significato ben diverso a seconda che venga intesa da un tecnico informatico o da un commerciante di liquori. Pur avendo compreso perfettamente la richiesta, evidentemente non avrebbe avuto idea di come soddisfarla. Direi che in questo caso ha saputo arrangiarsi brillantemente. In effetti il supporto tecnico è uno dei campi nei quali il conflitto tra competenze e linguaggi diversi tende a generare i risultati più disastrosi.</p>
<p>Descrivere il problema col giusto linguaggio è il primo passo, forse il più importante, per trovarne la soluzione. Apprendere il dizionario del cliente è determinante per attivare una comunicazione efficace. Temo che nella gran parte dei progetti software non ci si provi nemmeno, e forse per questa ragione tanti programmi risultano difficili da utilizzare.</p>]]></content:encoded>
    </item>
    <item>
      <title>Dennis Ritchie se n’è andato</title>
      <link>https://nicolaiarocci.com/dennis-ritchie-se-ne-andato/</link>
      <pubDate>Thu, 13 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dennis-ritchie-se-ne-andato/</guid>
      <description>&lt;p&gt;Decisamente questo non è un buon momento per le scienze dell’informazione. Dopo la recente scomparsa di Steve Jobs, ecco la notizia che lo scorso fine settimana anche &lt;!-- raw HTML omitted --&gt;Dennis Ritchie&lt;!-- raw HTML omitted --&gt; ci ha lasciato. Inventore e autore del Linguaggio C, Ritchie era anche uno dei padri fondatori del sistema operativo Unix. Poco conosciuto dal grande pubblico, non certo manager e tanto meno figura pubblica, Ritchie era uno scienziato di calibro assoluto la cui influenza nell’informatica tutta è semplicemente inestimabile.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Decisamente questo non è un buon momento per le scienze dell’informazione. Dopo la recente scomparsa di Steve Jobs, ecco la notizia che lo scorso fine settimana anche <!-- raw HTML omitted -->Dennis Ritchie<!-- raw HTML omitted --> ci ha lasciato. Inventore e autore del Linguaggio C, Ritchie era anche uno dei padri fondatori del sistema operativo Unix. Poco conosciuto dal grande pubblico, non certo manager e tanto meno figura pubblica, Ritchie era uno scienziato di calibro assoluto la cui influenza nell’informatica tutta è semplicemente inestimabile.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Premio Turing nel 1983 e National Medal of Technology nel 1999, Dennis Ritchie è conosciuto ai più come co-autore di uno dei libri più importanti (e venerati) nella storia della programmazione: <!-- raw HTML omitted -->The C Programming Language<!-- raw HTML omitted -->, o <strong>K&amp;R</strong> come tutti l’abbiamo chiamato per trent’anni. La rilevanza del K&amp;R è tale da renderlo <!-- raw HTML omitted -->ancora oggi<!-- raw HTML omitted --> uno dei libri di riferimento, consigliato a chiunque voglia diventare un programmatore o desideri scrivere di programmazione.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Per me Dennis Ritchie è sempre stato, con pochissimi altri, un vero e proprio mito. Lo saluto con affetto e gratitudine prendendo a prestito le parole di <!-- raw HTML omitted -->James Grimmelmann<!-- raw HTML omitted -->:</p>
<blockquote>
<p>His pointer has been cast to void *; his process has terminated with exit code zero</p></blockquote>
<p> </p>
]]></content:encoded>
    </item>
    <item>
      <title>Sull’arte di arrangiarsi dei clienti</title>
      <link>https://nicolaiarocci.com/sullarte-di-arrangiarsi-dei-clienti/</link>
      <pubDate>Tue, 11 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sullarte-di-arrangiarsi-dei-clienti/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>A Farewell to Steve Jobs</title>
      <link>https://nicolaiarocci.com/a-farewell-to-steve-jobs/</link>
      <pubDate>Thu, 06 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/a-farewell-to-steve-jobs/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;blockquote&gt;
&lt;!-- raw HTML omitted --&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<blockquote>
<!-- raw HTML omitted --></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>La mia fuga dalla Comfort Zone al KnowCamp 2011</title>
      <link>https://nicolaiarocci.com/la-mia-fuga-dalla-comfort-zone-al-knowcamp-2011/</link>
      <pubDate>Tue, 04 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/la-mia-fuga-dalla-comfort-zone-al-knowcamp-2011/</guid>
      <description>&lt;p&gt;Sabato 8 ottobre sarò a Modena per il &lt;!-- raw HTML omitted --&gt;KnowCamp 2011&lt;!-- raw HTML omitted --&gt;. Per la prima volta mi cimenterò in un &lt;!-- raw HTML omitted --&gt;Ignite&lt;!-- raw HTML omitted --&gt;, ovvero una forma di intervento-lampo-acrobatico della durata di cinque minuti durante i quali verranno passate venti slide a intervalli regolari (una ogni quindici secondi).&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Il titolo provvisiorio del mio intervento è &lt;em&gt;Fuga dalla Comfort Zone&lt;/em&gt;. Ammetto di essere piuttosto nervoso. Il rischio di impappinarmi nel corso di quest’esibizione-rap è notevole, e tuttavia sono curioso di vedere come andrà a finire.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Sabato 8 ottobre sarò a Modena per il <!-- raw HTML omitted -->KnowCamp 2011<!-- raw HTML omitted -->. Per la prima volta mi cimenterò in un <!-- raw HTML omitted -->Ignite<!-- raw HTML omitted -->, ovvero una forma di intervento-lampo-acrobatico della durata di cinque minuti durante i quali verranno passate venti slide a intervalli regolari (una ogni quindici secondi).</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il titolo provvisiorio del mio intervento è <em>Fuga dalla Comfort Zone</em>. Ammetto di essere piuttosto nervoso. Il rischio di impappinarmi nel corso di quest’esibizione-rap è notevole, e tuttavia sono curioso di vedere come andrà a finire.</p>
<p>Al momento in cui scrivo il programma degli interventi è in definizione, ma sono già online i programmi del <!-- raw HTML omitted -->Business Panel<!-- raw HTML omitted --> e della <!-- raw HTML omitted -->Tavola Rotonda sulle Startup<!-- raw HTML omitted --> di domenica. L’evento sarà trasmesso in diretta streaming sui portali <!-- raw HTML omitted -->Wired Italia<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Ninja Marketing<!-- raw HTML omitted -->. In ogni caso se ci sarete fatemelo sapere (nei commenti qui sotto oppure via <!-- raw HTML omitted -->twitter<!-- raw HTML omitted --> o <!-- raw HTML omitted -->facebook<!-- raw HTML omitted -->), così organizziamo per incontrarci. A sabato!</p>
<p><em>Aggiornamento del 24.10.2011: sono disponibili <a href="http://nicolaiarocci.com/il-mio-intervento-al-knowcamp-2011-fuga-dalla-comfort-zone/" title="Il mio intervento al KnowCamp 2011">video e slides</a> del mio intervento al KnowCamp 2011</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Web Designer e Programmatori Front End si incontrano a From The Front 2011</title>
      <link>https://nicolaiarocci.com/web-designer-e-programmatori-front-end-si-incontrano-a-from-the-front-2011/</link>
      <pubDate>Fri, 23 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/web-designer-e-programmatori-front-end-si-incontrano-a-from-the-front-2011/</guid>
      <description>&lt;p&gt;Giovedì 29 Settembre sarò a Cesena per partecipare a &lt;!-- raw HTML omitted --&gt;From The Front 2011&lt;!-- raw HTML omitted --&gt;, conferenza-evento di una giornata dedicata a programmatori front end e web designer. Il programma dei talk pomeridiani è interessante, vi consiglio di dare una occhiata anche perché il costo di iscrizione è &lt;!-- raw HTML omitted --&gt;pari a zero&lt;!-- raw HTML omitted --&gt; irrisorio. Se venite battete un colpo: è una buona occasione per incontrarsi di persona (magari al party che seguirà l’evento).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Giovedì 29 Settembre sarò a Cesena per partecipare a <!-- raw HTML omitted -->From The Front 2011<!-- raw HTML omitted -->, conferenza-evento di una giornata dedicata a programmatori front end e web designer. Il programma dei talk pomeridiani è interessante, vi consiglio di dare una occhiata anche perché il costo di iscrizione è <!-- raw HTML omitted -->pari a zero<!-- raw HTML omitted --> irrisorio. Se venite battete un colpo: è una buona occasione per incontrarsi di persona (magari al party che seguirà l’evento).</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Sui Vantaggi del Programmatore Poliglotta</title>
      <link>https://nicolaiarocci.com/sui-vantaggi-del-programmatore-poliglotta/</link>
      <pubDate>Wed, 21 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sui-vantaggi-del-programmatore-poliglotta/</guid>
      <description>&lt;p&gt;Per gran parte della mia carriera sono stato un programmatore client/server specializzato nel .NET Framework e in tutto quel gira intorno all’ecosistema Microsoft. Un paio di anni fa ho deciso di uscire dalla mia &lt;em&gt;&lt;!-- raw HTML omitted --&gt;comfort zone&lt;!-- raw HTML omitted --&gt;&lt;/em&gt; professionale, guardarmi attorno e, per citare &lt;a href=&#34;http://www.youtube.com/watch?v=Ex2fpsz-hQI&#34; title=&#34;Quanto è profonda la tana del Bianconiglio?&#34;&gt;qualcun’altro&lt;/a&gt;, andare a vedere &lt;em&gt;quanto è profonda la tana del Bianconiglio&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Tempo libero a disposizione non ce n’era. A quarant’anni tra lavoro, famiglia e attività agonistica mi rimaneva solo la via del furto: rubare ore al sonno per dedicarmi allo studio di nuovi linguaggi e piattaforme. Prima è stato il turno di JavaScript, poi di Python, Django, Ruby e infine Node e MongoDB. Ora mi considero un programmatore poliglotta, capace di scrivere codice in una moltitudine di linguaggi.&lt;/p&gt;
&lt;p&gt;Eppure in passato sono sempre stato convinto che fosse più produttivo concentrarsi su una sola piattaforma per conoscerla fino in fondo e sfruttarne al meglio le possibilità. Sulle ragioni che mi hanno indotto a prendere quella decisione potrei scrivere una decina di articoli, e magari lo farò prima o poi, ma quel che desidero condividere oggi sono le lezioni che questa esperienza mi ha insegnato.&lt;/p&gt;
&lt;p&gt;A dire il vero ci ho già provato una volta, buttando giù appunti e abbozzando un articolo poi miseramente abbandonato. Per fortuna qualche giorno fa sono incappato in &lt;!-- raw HTML omitted --&gt;Advantages of Being a Polyglot Programmer&lt;!-- raw HTML omitted --&gt;, stupefacente articolo di Davy Brion. Il suo è &lt;em&gt;precisamente&lt;/em&gt; il pezzo che io non riuscivo a scrivere, parola per parola. Davy elenca quelli che secondo lui sono i cinque principali vantaggi del programmatore poliglotta. Io ne aggiungo uno e ve li propongo – fate conto che sia io a parlare attraverso lui, o viceversa.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Per gran parte della mia carriera sono stato un programmatore client/server specializzato nel .NET Framework e in tutto quel gira intorno all’ecosistema Microsoft. Un paio di anni fa ho deciso di uscire dalla mia <em><!-- raw HTML omitted -->comfort zone<!-- raw HTML omitted --></em> professionale, guardarmi attorno e, per citare <a href="http://www.youtube.com/watch?v=Ex2fpsz-hQI" title="Quanto è profonda la tana del Bianconiglio?">qualcun’altro</a>, andare a vedere <em>quanto è profonda la tana del Bianconiglio</em>.</p>
<p>Tempo libero a disposizione non ce n’era. A quarant’anni tra lavoro, famiglia e attività agonistica mi rimaneva solo la via del furto: rubare ore al sonno per dedicarmi allo studio di nuovi linguaggi e piattaforme. Prima è stato il turno di JavaScript, poi di Python, Django, Ruby e infine Node e MongoDB. Ora mi considero un programmatore poliglotta, capace di scrivere codice in una moltitudine di linguaggi.</p>
<p>Eppure in passato sono sempre stato convinto che fosse più produttivo concentrarsi su una sola piattaforma per conoscerla fino in fondo e sfruttarne al meglio le possibilità. Sulle ragioni che mi hanno indotto a prendere quella decisione potrei scrivere una decina di articoli, e magari lo farò prima o poi, ma quel che desidero condividere oggi sono le lezioni che questa esperienza mi ha insegnato.</p>
<p>A dire il vero ci ho già provato una volta, buttando giù appunti e abbozzando un articolo poi miseramente abbandonato. Per fortuna qualche giorno fa sono incappato in <!-- raw HTML omitted -->Advantages of Being a Polyglot Programmer<!-- raw HTML omitted -->, stupefacente articolo di Davy Brion. Il suo è <em>precisamente</em> il pezzo che io non riuscivo a scrivere, parola per parola. Davy elenca quelli che secondo lui sono i cinque principali vantaggi del programmatore poliglotta. Io ne aggiungo uno e ve li propongo – fate conto che sia io a parlare attraverso lui, o viceversa.</p>
<!-- raw HTML omitted -->
<h2 id="quali-sono-i-vantaggi-del-programmatore-poliglotta">Quali sono i vantaggi del programmatore poliglotta?</h2>
<h3 id="espandere-i-propri-orizzonti">Espandere i propri orizzonti</h3>
<p>Nell’imparare un nuovo linguaggio c’è molto più che apprenderne la sintassi. Si scoprono nuove tecniche, nuove librerie e nuovi modi di affrontare e risolvere i problemi. Assorbiamo una conoscenza già diffusa nella comunità che si è raccolta attorno al linguaggio, e tuttavia nuova per noi. A seconda del nostro background può capitare di imparare tanto, oppure solo qualcosa qui e là. Se già conosciamo un linguaggio dinamico a oggetti, per esempio, impararne uno nuovo non aggiungerà granché al nostro bagaglio. Se al contrario conosciamo solo linguaggi statici, scoprirne uno dinamico sarà un’esperienza davvero arricchente. E’ proprio questa miscela di paradigmi e conoscenze nuove, grandi e piccole, che influenzerà in modo determinante il nostro modo di risolvere i problemi in futuro.</p>
<h3 id="imparare-più-facilmente">imparare più facilmente</h3>
<p>La pratica rende perfetti. Dedicarsi con costanza all’apprendimento rende più semplice l’atto stesso di apprendere. Tanti hanno difficoltà ad accettare novità che sembrano in conflitto con quel che conoscono. Studiare un linguaggio che si basa su nuovi paradigmi (pensate alla <!-- raw HTML omitted -->programmazione funzionale<!-- raw HTML omitted -->) è difficoltoso perché ci costringe a ragionare al di fuori di strutture e regole che ci sono familiari. La seconda volta sarà già più facile, perché l’esperienza precedente ci avrà insegnato a non lasciarci condizionare da ciò che sappiamo. La terza volta sarà ancora più semplice, e così via. Tutti noi impariamo a imparare imparando.</p>
<h3 id="rinnovare-la-passione-per-la-programmazione">rinnovare la passione per la programmazione</h3>
<p>Quando ero programmatore C# / VB.NET mi capitava ogni tanto di non divertirmi più. In quei momenti scrivere codice era solo lavoro, non più gioia e tanto meno passione. Quei periodi potevano durare un paio di settimane, a volte un mese o due. Da quando mi sono dedicato a nuovi linguaggi non mi è più capitato di annoiarmi. Imparare di continuo cose nuove rende tutto più interessante, divertente e senz’altro impegnativo.</p>
<h3 id="ridurre-la-dipendenza-dagli-strumenti-quotidiani-e-introdurne-di-nuovi">RIDurre la dipendenza dagli strumenti quotidiani e introdurne di nuovi</h3>
<p>Fino a due anni fa non prendevo nemmeno in considerazione l’idea di scrivere codice senza usare qualche tipo di IDE. Ero dipendente da Visual Studio: IntelliSense, completamento automatico, navigazione, debugger integrato… tutte <em>feature</em> alle quali non credevo di poter rinunciare. Oggi preferisco scrivere codice in un semplice text editor per programmatori (nel mio caso <a href="http://nicolaiarocci.com/sublimetext-2-un-sofisticato-text-editor-per-codice-html-e-prosa/" title="Sublime Text 2">Sublime Text 2</a>), con una finestra terminale in cui lanciare i miei test. Fare a meno del debugger non solo è possibile, ma addirittura proficuo. Si procede a piccoli passi, facendo spesso test focalizzati che permettono di isolare e risolvere rapidamente i bug. Per motivi di lavoro ancora oggi uso e apprezzo Visual Studio ogni giorno, ma preferisco senz’altro lavorare in maniera spartana: text editor e terminale sono tutto quello che mi serve.</p>
<p>Lavorare così comporta una conseguenza importante. Si rende necessario (ri)diventare provetti nell’uso della finestra terminale, della linea di comando e, in alcune occasioni, addirittura di sistemi operativi diversi. Per imparare Ruby o Node spesso è meglio installare una distribuzione Linux (o lavorare su OS X se avete un Mac) piuttosto che tentare di far girare il tutto sotto Windows. In ogni caso conoscere la shell e i tool *NIX, specialmente di questi tempi, aggiungerà una freccia potente al nostro arco.</p>
<h3 id="ridurre-il-legame-col-linguaggio-prediletto">ridurre il legame col linguaggio prediletto</h3>
<p>Coloro che lavorano esclusivamente con una piattaforma tendono a sviluppare con essa un vero e proprio legame emotivo. Lo so per certo perché è capitato anche a me (e diverse volte) nel corso degli anni. Se siamo legati emotivamente a un linguaggio ci diventa difficile rimanere equilibrati nel corso di una discussione, o restare calmi se percepiamo che il nostro prediletto è sotto minaccia (pensiamo a quel che sta succedendo a Silverlight proprio <a href="http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/" title="Windows 8 e il destino di Silverlight">in queste ore</a>). Praticando più linguaggi e piattaforme scopriamo che le nostre conoscenze e capacità sono trasferibili; che siamo programmatori a prescindere dagli strumenti che utilizziamo. Qualunque sia il destino della nostra piattaforma prediletta, noi non abbiamo nulla da temere.</p>
<h3 id="migliorare-e-ampliare-il-network-professionale">migliorare e ampliare il network professionale</h3>
<p>Studiare nuovi linguaggi e nuove piattaforme mi ha portato a conoscere molta più gente in due anni di quanta non ne abbia conosciuta nei venti precedenti. Quando si lavora a lungo nello stesso ambiente con gli stessi strumenti arriva il momento in cui non si ha (o non si sente) più bisogno di confrontarsi, informarsi e… imparare. Si acquisisce l’esperienza sufficiente a portare a casa il risultato, qualunque esso sia. Le stesse comunità di sviluppatori, per quanto ampie, tendono a chiudersi e diventare presto auto referenziali: stesse persone, stessi contributi, stesse domande e risposte. Aprirsi a comunità diverse illuminando la propria mente con idee che provengono dalle fonti più disparate è una esperienza esaltante. Soprattutto dopo anni di programmazione a testa bassa.</p>
<p><em>Una riduzione di questo articolo è stata oggetto di un mio Ignite (relazione lampo in cinque minuti) presentato il 8.10.2011 al KnowCamp 2011. Le slides e il video sono <a href="http://nicolaiarocci.com/il-mio-intervento-al-knowcamp-2011-fuga-dalla-comfort-zone/" title="Il mio intervento al KnowCamp 2011">disponibili online</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>SQL Server e il Cloud di Amazon EC2: vantaggi e svantaggi</title>
      <link>https://nicolaiarocci.com/sql-server-e-il-cloud-di-amazon-ec2-vantaggi-e-svantaggi/</link>
      <pubDate>Wed, 14 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sql-server-e-il-cloud-di-amazon-ec2-vantaggi-e-svantaggi/</guid>
      <description>&lt;p&gt;Se state considerando l’opzione Cloud per il vostro SQL Server non lasciatevi sfuggire l’ultimo articolo di Jeremiah Peschka, &lt;!-- raw HTML omitted --&gt;Configuring SQL Server in Amazon EC2&lt;!-- raw HTML omitted --&gt;. A dispetto del titolo non si tratta di un tutorial, ma di una analisi accurata di vantaggi e svantaggi legati al &lt;em&gt;deploy&lt;/em&gt; di un database SQL nel Cloud, a prescindere dalla piattaforma adottata.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il cloud è robusto e affidabile. Il cloud risolve ogni problema di scalabilità. Nel cloud, anche la cacca profuma di rose. In teoria queste affermazioni sono corrette, ma occorre darci dentro per trasformarle in realtà. Specialmente quando c’è un database nel mezzo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se state considerando l’opzione Cloud per il vostro SQL Server non lasciatevi sfuggire l’ultimo articolo di Jeremiah Peschka, <!-- raw HTML omitted -->Configuring SQL Server in Amazon EC2<!-- raw HTML omitted -->. A dispetto del titolo non si tratta di un tutorial, ma di una analisi accurata di vantaggi e svantaggi legati al <em>deploy</em> di un database SQL nel Cloud, a prescindere dalla piattaforma adottata.</p>
<blockquote>
<p>Il cloud è robusto e affidabile. Il cloud risolve ogni problema di scalabilità. Nel cloud, anche la cacca profuma di rose. In teoria queste affermazioni sono corrette, ma occorre darci dentro per trasformarle in realtà. Specialmente quando c’è un database nel mezzo.</p></blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Frammenti di Cloud Computing al Romagna Camp 2011</title>
      <link>https://nicolaiarocci.com/frammenti-di-cloud-computing-al-romagna-camp-2011/</link>
      <pubDate>Mon, 12 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/frammenti-di-cloud-computing-al-romagna-camp-2011/</guid>
      <description>&lt;p&gt;Gran bella esperienza quella del &lt;!-- raw HTML omitted --&gt;Romagna Camp&lt;!-- raw HTML omitted --&gt;. Un mix perfetto di networking, lavoro e (tanto) divertimento. Chi c’era sa, chi non c’era faccia un giro sul tag &lt;!-- raw HTML omitted --&gt;#romagnacamp&lt;!-- raw HTML omitted --&gt; di Twitter e saprà.&lt;/p&gt;
&lt;p&gt;Scopro con disappunto che SlideShare fa un pessimo servizio a Keynote, non rendendo né transizioni né animazioni e sostituendo i font come gli pare. Ecco dunque la mia presentazione, o piuttosto quel che ne rimane dopo l’upload*:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Gran bella esperienza quella del <!-- raw HTML omitted -->Romagna Camp<!-- raw HTML omitted -->. Un mix perfetto di networking, lavoro e (tanto) divertimento. Chi c’era sa, chi non c’era faccia un giro sul tag <!-- raw HTML omitted -->#romagnacamp<!-- raw HTML omitted --> di Twitter e saprà.</p>
<p>Scopro con disappunto che SlideShare fa un pessimo servizio a Keynote, non rendendo né transizioni né animazioni e sostituendo i font come gli pare. Ecco dunque la mia presentazione, o piuttosto quel che ne rimane dopo l’upload*:</p>
<p>Essendo l’ultimo speaker ho dovuto correre un po’ per recuperare tempo e non far deragliare il programma. Probabilmente si tratta di una cosa positiva perché almeno così non ho avuto il tempo di annoiare il pubblico. E’ andata peggio al povero</p>
<p><!-- raw HTML omitted -->Fullo<!-- raw HTML omitted -->, a cui è toccato in sorte di raccontare HTML5 in dieci minuti!</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Nell’occasione ho approfittato della disponibilità di <!-- raw HTML omitted -->Luca Sartoni<!-- raw HTML omitted --> (che è anche un bravo fotografo) per <a href="http://nicolaiarocci.com/about/" title="Chi sono | Nicola Iarocci">rifarmi il look</a>. Grazie infine ad <!-- raw HTML omitted -->Alessandra<!-- raw HTML omitted -->, ottima organizzatrice di eventi e sorprendente <em><!-- raw HTML omitted -->social tanguera extraordinaire<!-- raw HTML omitted --></em>.</p>
<p><em>(*) se per un attimo vi è sembrato che il tizio in copertina indossasse le Converse al contrario bé, allora sappiate che è proprio così.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Chess@home è una Intelligenza Artificiale Distribuita per gli Scacchi</title>
      <link>https://nicolaiarocci.com/chesshome-intelligenza-artificiale-distribuita-applicata-agli-scacchi-via-browser/</link>
      <pubDate>Fri, 09 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/chesshome-intelligenza-artificiale-distribuita-applicata-agli-scacchi-via-browser/</guid>
      <description>&lt;p&gt;Il progetto &lt;!-- raw HTML omitted --&gt;Chess@home&lt;!-- raw HTML omitted --&gt; è il vincitore del recente &lt;!-- raw HTML omitted --&gt;Node Knockout&lt;!-- raw HTML omitted --&gt;, ed una volta tanto si tratta di qualcosa di davvero innovativo e intrigante. Obiettivo: la creazione della più potente Intelligenza Artificiale per il gioco degli Scacchi al mondo, generata nientemeno che dai browser attivi sulla rete.&lt;/p&gt;
&lt;p&gt;L’elaborazione collaborativa distribuita è diventata famosa grazie a progetti come &lt;!-- raw HTML omitted --&gt;SETI@home&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;Folding@home&lt;!-- raw HTML omitted --&gt;. Semplificando molto potremmo dire che questo tipo di applicazione prevede che un piccolo programma venga installato e fatto girare su decine di migliaia di computer volontari. La capacita elaborativa del progetto è data dalla somma delle elaborazioni individuali.&lt;/p&gt;
&lt;p&gt;La novità di Chess@Home consiste nell’idea di ricorrere a codice JavaScript che gira nel browser, dunque senza alcuna necessità di client dedicati. Appositi widget presenti nelle pagine dei siti aderenti innestano l’elaborazione sul computer del visitatore, potenzialmente decuplicando il numero di nodi che partecipano all’elaborazione (più visitatori accedono alla stessa pagina contemporaneamente).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il progetto <!-- raw HTML omitted -->Chess@home<!-- raw HTML omitted --> è il vincitore del recente <!-- raw HTML omitted -->Node Knockout<!-- raw HTML omitted -->, ed una volta tanto si tratta di qualcosa di davvero innovativo e intrigante. Obiettivo: la creazione della più potente Intelligenza Artificiale per il gioco degli Scacchi al mondo, generata nientemeno che dai browser attivi sulla rete.</p>
<p>L’elaborazione collaborativa distribuita è diventata famosa grazie a progetti come <!-- raw HTML omitted -->SETI@home<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Folding@home<!-- raw HTML omitted -->. Semplificando molto potremmo dire che questo tipo di applicazione prevede che un piccolo programma venga installato e fatto girare su decine di migliaia di computer volontari. La capacita elaborativa del progetto è data dalla somma delle elaborazioni individuali.</p>
<p>La novità di Chess@Home consiste nell’idea di ricorrere a codice JavaScript che gira nel browser, dunque senza alcuna necessità di client dedicati. Appositi widget presenti nelle pagine dei siti aderenti innestano l’elaborazione sul computer del visitatore, potenzialmente decuplicando il numero di nodi che partecipano all’elaborazione (più visitatori accedono alla stessa pagina contemporaneamente).</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>E’ facile intravedere complicazioni etiche ma occorre tenere conto del fatto che il progetto, messo in piedi in sole 48 ore, è nato soprattutto come esperimento per testare il limite delle tecnologie impiegate (Node.JS, MongoDB, JavaScript). Vi consiglio caldamente l’articolo di uno degli ideatori, <!-- raw HTML omitted -->Sylvain Zimmer<!-- raw HTML omitted -->, che descrive genesi e dettagli tecnici del progetto.</p>
<p>Già oggi potete giocare la vostra prima partita a scacchi contro la rete. Il mio cuore di nerd (che in anni ahimè troppo lontani ha fatto girare impunemente il client SETI per mesi e mesi) tifa per voi.</p>
<p><em>PS: domani al Romagna Camp 2011 terrò una relazione dal titolo “Quattro passi fra le nuvole (e non scordate il paracadute)”. Per saperne di più date una occhiata <a href="http://nicolaiarocci.com/quattro-passi-tra-le-nuvole-al-romagna-camp-2011/" title="Quattro passi fra le nuvole">qui</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Print.css è il foglio di stile per il web designer attento all’ambiente</title>
      <link>https://nicolaiarocci.com/print-css-e-il-foglio-di-stile-per-il-web-designer-attento-allambiente/</link>
      <pubDate>Mon, 05 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/print-css-e-il-foglio-di-stile-per-il-web-designer-attento-allambiente/</guid>
      <description>&lt;p&gt;Carta e inchiostro costano eppure ci sono (ancora) molte ragioni per mandare in stampa una pagina web. David Bushell ha creato &lt;a href=&#34;http://printstylesheet.com/&#34; title=&#34;Print.css&#34;&gt;Print.css&lt;/a&gt;, un mini sito che incoraggia i web designer alla creazione di fogli di stile eco-compatibili che inviino alla stampante solo il necessario. In effetti la direttiva CSS &lt;code&gt;@media&lt;/code&gt; permette di farlo con facilità.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Carta e inchiostro costano eppure ci sono (ancora) molte ragioni per mandare in stampa una pagina web. David Bushell ha creato <a href="http://printstylesheet.com/" title="Print.css">Print.css</a>, un mini sito che incoraggia i web designer alla creazione di fogli di stile eco-compatibili che inviino alla stampante solo il necessario. In effetti la direttiva CSS <code>@media</code> permette di farlo con facilità.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio 1.0</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-1-0/</link>
      <pubDate>Tue, 30 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-1-0/</guid>
      <description>&lt;p&gt;Dopo una breve e brillante Beta, con l’uscita della versione 1.0 il progetto open source &lt;!-- raw HTML omitted --&gt;Python Tools for Visual Studio&lt;!-- raw HTML omitted --&gt; entra nel novero delle estensioni ufficiali per Visual Studio 2010. Ne da notizia W. Somasegar sul suo weblog, con &lt;!-- raw HTML omitted --&gt;un articolo introduttivo&lt;!-- raw HTML omitted --&gt; in cui ci ricorda le caratteristiche salienti di PTVS: syntax highlighting, refactoring, debugging in tempo reale, interprete Python interattivo integrato e supporto per CPython, IronPython, JPython e PyPy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dopo una breve e brillante Beta, con l’uscita della versione 1.0 il progetto open source <!-- raw HTML omitted -->Python Tools for Visual Studio<!-- raw HTML omitted --> entra nel novero delle estensioni ufficiali per Visual Studio 2010. Ne da notizia W. Somasegar sul suo weblog, con <!-- raw HTML omitted -->un articolo introduttivo<!-- raw HTML omitted --> in cui ci ricorda le caratteristiche salienti di PTVS: syntax highlighting, refactoring, debugging in tempo reale, interprete Python interattivo integrato e supporto per CPython, IronPython, JPython e PyPy.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Imparare a programmare online con Codecademy</title>
      <link>https://nicolaiarocci.com/imparare-a-programmare-online-con-codecademy/</link>
      <pubDate>Fri, 26 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-a-programmare-online-con-codecademy/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Codecademy&lt;!-- raw HTML omitted --&gt; è una fantastica iniziativa che insegna a programmare online. Lanciata poco più di una settimana fa, ha già raccolto duecentomila utenti registrati. Brillante l’idea di integrare gli strumenti tipici del social network (badge, punteggi, seguire i progressi degli amici) con un interprete interattivo e un preciso feedback in tempo reale.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Codecademy è il modo più semplice per imparare a programmare. E’ interattivo, divertente, e lo puoi fare con gli amici&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Codecademy<!-- raw HTML omitted --> è una fantastica iniziativa che insegna a programmare online. Lanciata poco più di una settimana fa, ha già raccolto duecentomila utenti registrati. Brillante l’idea di integrare gli strumenti tipici del social network (badge, punteggi, seguire i progressi degli amici) con un interprete interattivo e un preciso feedback in tempo reale.</p>
<blockquote>
<p>Codecademy è il modo più semplice per imparare a programmare. E’ interattivo, divertente, e lo puoi fare con gli amici</p></blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Sopravvivere a Google Panda in Italia</title>
      <link>https://nicolaiarocci.com/sopravvivere-a-google-panda-in-italia/</link>
      <pubDate>Wed, 24 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sopravvivere-a-google-panda-in-italia/</guid>
      <description>&lt;p&gt;Finalmente anche in Italia qualcuno pubblica un articolo originale e convincente sulla recente comparsa del “famigerato” algoritmo Google Panda. Molti SEO in questi mesi si sono stracciati le vesti, lamentando un attacco diretto da parte di Google alla loro maestà.&lt;/p&gt;
&lt;p&gt;L’autore di &lt;!-- raw HTML omitted --&gt;Surviving (Google) Panda in Italia&lt;!-- raw HTML omitted --&gt; dipana per bene l’ingarbugliata sequenza di annunci e implementazioni culminate poi nel Panda Update. Non mancano alcuni consigli sensati (e tanto per cambiare originali) e una interessante conclusione che vi lascio leggere da soli. E bravo &lt;!-- raw HTML omitted --&gt;Stuart&lt;!-- raw HTML omitted --&gt;!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Finalmente anche in Italia qualcuno pubblica un articolo originale e convincente sulla recente comparsa del “famigerato” algoritmo Google Panda. Molti SEO in questi mesi si sono stracciati le vesti, lamentando un attacco diretto da parte di Google alla loro maestà.</p>
<p>L’autore di <!-- raw HTML omitted -->Surviving (Google) Panda in Italia<!-- raw HTML omitted --> dipana per bene l’ingarbugliata sequenza di annunci e implementazioni culminate poi nel Panda Update. Non mancano alcuni consigli sensati (e tanto per cambiare originali) e una interessante conclusione che vi lascio leggere da soli. E bravo <!-- raw HTML omitted -->Stuart<!-- raw HTML omitted -->!</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p> </p>
]]></content:encoded>
    </item>
    <item>
      <title>HTML e CSS di base per i Web Designer del futuro</title>
      <link>https://nicolaiarocci.com/html-e-css-di-base-per-i-web-designer-del-futuro/</link>
      <pubDate>Tue, 23 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/html-e-css-di-base-per-i-web-designer-del-futuro/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Don’t Fear the Internet&lt;!-- raw HTML omitted --&gt; è una ottima risorsa per Web Designer principianti. Attenzione ai dettagli, grande cura e ottimi contenuti sono il marchio distintivo di questo progetto di &lt;!-- raw HTML omitted --&gt;Jessica Hische&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;Russ Maschmeyer&lt;!-- raw HTML omitted --&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sei un disegnatore, un fotografo, un artista o, più in generale, un creativo? Hai un sito che mai messo insieme con Dreamweaver grazie a quell’UNICA lezione scolastica di web design? Il sito non ce l’hai nemmeno, perché sono due anni che aspetti che tuo cugino lo faccia per te? Bè, noi siamo qui per aiutarti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Don’t Fear the Internet<!-- raw HTML omitted --> è una ottima risorsa per Web Designer principianti. Attenzione ai dettagli, grande cura e ottimi contenuti sono il marchio distintivo di questo progetto di <!-- raw HTML omitted -->Jessica Hische<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Russ Maschmeyer<!-- raw HTML omitted -->:</p>
<blockquote>
<p>Sei un disegnatore, un fotografo, un artista o, più in generale, un creativo? Hai un sito che mai messo insieme con Dreamweaver grazie a quell’UNICA lezione scolastica di web design? Il sito non ce l’hai nemmeno, perché sono due anni che aspetti che tuo cugino lo faccia per te? Bè, noi siamo qui per aiutarti.</p></blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Quattro passi tra le nuvole al Romagna Camp 2011</title>
      <link>https://nicolaiarocci.com/quattro-passi-tra-le-nuvole-al-romagna-camp-2011/</link>
      <pubDate>Mon, 22 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/quattro-passi-tra-le-nuvole-al-romagna-camp-2011/</guid>
      <description>&lt;p&gt;“Quattro passi tra le nuvole (e non scordate il paracadute)” è il titolo del mio intervento al &lt;!-- raw HTML omitted --&gt;Romagna Camp 2011&lt;!-- raw HTML omitted --&gt;. Racconterò la mia esperienza nella fornitura di servizi cloud alle small business italiane. In questi giorni di ferie ho cominciato buttare giù qualche appunto e abbozzare le prime slide. La sfida è condensare tutto quel che c’è da dire in quindici minuti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>“Quattro passi tra le nuvole (e non scordate il paracadute)” è il titolo del mio intervento al <!-- raw HTML omitted -->Romagna Camp 2011<!-- raw HTML omitted -->. Racconterò la mia esperienza nella fornitura di servizi cloud alle small business italiane. In questi giorni di ferie ho cominciato buttare giù qualche appunto e abbozzare le prime slide. La sfida è condensare tutto quel che c’è da dire in quindici minuti.</p>
<!-- raw HTML omitted -->
<p>Il programma quest’anno è davvero ricco. Per la giornata clou (sabato 10 settembre) sono in calendario <!-- raw HTML omitted -->una cena<!-- raw HTML omitted -->, <!-- raw HTML omitted -->16 speech<!-- raw HTML omitted --> e <!-- raw HTML omitted -->7 ignite<!-- raw HTML omitted -->. Gli iscritti sono già più di 200 tra imprenditori, web marketer, agenzie web, freelance e sviluppatori.</p>
<p>Le <!-- raw HTML omitted -->iscrizioni <!-- raw HTML omitted -->sono ancora aperte, fateci un pensierino perché credo ne valga la pena. Se ci siete passate a salutarmi, mi raccomando. Sono quello con gli occhiali, la barba e il sorriso ebete.</p>
<p><em>Aggiornamento del 12.9.2011: <a href="http://nicolaiarocci.com/frammenti-di-cloud-computing-al-romagna-camp-2011/" title="Frammenti di Cloud Computing al Romagna Camp 2011">qui</a> trovate le slide del mio intervento.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Bootstrap è il CSS Framework di Twitter</title>
      <link>https://nicolaiarocci.com/bootstrap-from-twitter-twitter-developers/</link>
      <pubDate>Sun, 21 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/bootstrap-from-twitter-twitter-developers/</guid>
      <description>&lt;p&gt;Twitter rilascia Bootstrap, il CSS Framework creato inizialmente per uso interno e ora disponibile al pubblico.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is a collection of CSS and HTML conventions. It uses some of the latest browser techniques to provide you with stylish typography, forms, buttons, tables, grids, navigation and everything else you need in a super tiny (only 6k with gzip) resource.&lt;/p&gt;&lt;/blockquote&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;A prima vista sembra molto ben fatto. Per tutte le informazioni e il download visitate la bella &lt;!-- raw HTML omitted --&gt;home page&lt;!-- raw HTML omitted --&gt; del progetto.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Twitter rilascia Bootstrap, il CSS Framework creato inizialmente per uso interno e ora disponibile al pubblico.</p>
<blockquote>
<p>It is a collection of CSS and HTML conventions. It uses some of the latest browser techniques to provide you with stylish typography, forms, buttons, tables, grids, navigation and everything else you need in a super tiny (only 6k with gzip) resource.</p></blockquote>
<!-- raw HTML omitted -->
<p>A prima vista sembra molto ben fatto. Per tutte le informazioni e il download visitate la bella <!-- raw HTML omitted -->home page<!-- raw HTML omitted --> del progetto.</p>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Mono 2.10.3 gira su OS X Lion (ed è vivo e vegeto)</title>
      <link>https://nicolaiarocci.com/mono-2-10-3-gira-su-os-x-lion-ed-e-vivo-e-vegeto/</link>
      <pubDate>Fri, 05 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/mono-2-10-3-gira-su-os-x-lion-ed-e-vivo-e-vegeto/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Xamarin, la compagnia che &lt;a href=&#34;http://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/&#34; title=&#34;Progetto Mono salvato dal suo fondatore&#34;&gt;ha preso in mano il Progetto Mono&lt;/a&gt; dopo l’addio di Novell, ha appena rilasciato Mono 2.10.3. Ne da annuncio lo stesso Manuel de Icaza, storico deux-ex-machina del progetto e fondatore di Xamarin.&lt;/p&gt;
&lt;p&gt;Si tratta per lo più di una versione di manutenzione che &lt;!-- raw HTML omitted --&gt;risolve numerosi problemi&lt;!-- raw HTML omitted --&gt;, primo fra tutti l’instabilità di Mono sull’ultima versione di MacOS X Lion.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Xamarin, la compagnia che <a href="http://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/" title="Progetto Mono salvato dal suo fondatore">ha preso in mano il Progetto Mono</a> dopo l’addio di Novell, ha appena rilasciato Mono 2.10.3. Ne da annuncio lo stesso Manuel de Icaza, storico deux-ex-machina del progetto e fondatore di Xamarin.</p>
<p>Si tratta per lo più di una versione di manutenzione che <!-- raw HTML omitted -->risolve numerosi problemi<!-- raw HTML omitted -->, primo fra tutti l’instabilità di Mono sull’ultima versione di MacOS X Lion.</p>
<p>L’importanza di questo aggiornamento va ben oltre le sue caratteristiche tecniche. Il titolo stesso dell’<!-- raw HTML omitted -->annuncio<!-- raw HTML omitted --> (And We Are Back) parla chiaro: si tratta di un segnale di continuità importante che Xamarin lancia alla comunità mondiale di sviluppatori Mono. Per informazioni sul progetto e sulle sue vicissitudini recenti vi invito a leggere l’<a href="http://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/" title="Il Progetto Mono salvato in extremis dal suo fondatore">articolo sul salvataggio di Mono</a> che ho scritto qualche tempo fa.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sono altrimenti impegnato</title>
      <link>https://nicolaiarocci.com/sono-altrimenti-impegnato/</link>
      <pubDate>Wed, 03 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sono-altrimenti-impegnato/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Per qualche giorno non si pensa al codice e si sta alla larga, per quanto possibile, dal computer. Buone vacanze a chi ci va, e buon lavoro a chi non va.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Per i più curiosi. La foto è stata scattata la settimana scorsa durante la salita della classica via Maria al &lt;!-- raw HTML omitted --&gt;Sass Pordoi&lt;!-- raw HTML omitted --&gt; (2950mt, Gruppo del Sella, Dolomiti orientali). Se proprio volete annoiarvi date una occhiata &lt;!-- raw HTML omitted --&gt;alle altre&lt;!-- raw HTML omitted --&gt;.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<p>Per qualche giorno non si pensa al codice e si sta alla larga, per quanto possibile, dal computer. Buone vacanze a chi ci va, e buon lavoro a chi non va.</p>
<p><em>Per i più curiosi. La foto è stata scattata la settimana scorsa durante la salita della classica via Maria al <!-- raw HTML omitted -->Sass Pordoi<!-- raw HTML omitted --> (2950mt, Gruppo del Sella, Dolomiti orientali). Se proprio volete annoiarvi date una occhiata <!-- raw HTML omitted -->alle altre<!-- raw HTML omitted -->.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>JavaScript trucchi e suggerimenti avanzati</title>
      <link>https://nicolaiarocci.com/javascript-trucchi-e-suggerimenti-avanzati/</link>
      <pubDate>Mon, 18 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/javascript-trucchi-e-suggerimenti-avanzati/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Ho scovato quasi per caso &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Javascript Tips&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, incredibile collezione di trucchi e suggerimenti per JavaScript. Si tratta di decine di snippets rivolti soprattutto a chi JavaScript lo usa come un linguaggio vero e proprio e non, come spesso capita, quale semplice strumento per la manipolazione del DOM.&lt;/p&gt;
&lt;p&gt;Tra le tante chicche (alcune davvero gustose) vi segnalo a caso: &lt;!-- raw HTML omitted --&gt;concatenare due array&lt;!-- raw HTML omitted --&gt; senza crearne uno nuovo; mandare un testo in &lt;!-- raw HTML omitted --&gt;output su più righe&lt;!-- raw HTML omitted --&gt;; una funzione per &lt;!-- raw HTML omitted --&gt;eliminare un elemento da un array&lt;!-- raw HTML omitted --&gt;; una riga di codice che &lt;!-- raw HTML omitted --&gt;stampa lo stack&lt;!-- raw HTML omitted --&gt; delle chiamate correnti; un esempio di come &lt;!-- raw HTML omitted --&gt;trasformare gli argomenti di una funzione in array&lt;!-- raw HTML omitted --&gt;. Ce n’é per tutti i palati, dal principiante al più esperto, &lt;!-- raw HTML omitted --&gt;date una occhiata&lt;!-- raw HTML omitted --&gt; voi stessi.&lt;/p&gt;
&lt;p&gt;Buona parte dei trucchi funziona con&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Ho scovato quasi per caso <strong><!-- raw HTML omitted -->Javascript Tips<!-- raw HTML omitted --></strong>, incredibile collezione di trucchi e suggerimenti per JavaScript. Si tratta di decine di snippets rivolti soprattutto a chi JavaScript lo usa come un linguaggio vero e proprio e non, come spesso capita, quale semplice strumento per la manipolazione del DOM.</p>
<p>Tra le tante chicche (alcune davvero gustose) vi segnalo a caso: <!-- raw HTML omitted -->concatenare due array<!-- raw HTML omitted --> senza crearne uno nuovo; mandare un testo in <!-- raw HTML omitted -->output su più righe<!-- raw HTML omitted -->; una funzione per <!-- raw HTML omitted -->eliminare un elemento da un array<!-- raw HTML omitted -->; una riga di codice che <!-- raw HTML omitted -->stampa lo stack<!-- raw HTML omitted --> delle chiamate correnti; un esempio di come <!-- raw HTML omitted -->trasformare gli argomenti di una funzione in array<!-- raw HTML omitted -->. Ce n’é per tutti i palati, dal principiante al più esperto, <!-- raw HTML omitted -->date una occhiata<!-- raw HTML omitted --> voi stessi.</p>
<p>Buona parte dei trucchi funziona con</p>
<p>la versione più recente del motore JavaScript (1.8) e non girano nella implementazione Microsoft del linguaggio (1.5), comunque per ogni snippet viene indicata la versione supportata. Non scordate di dare una occhiata ai commenti a fondo pagina per ulteriori suggerimenti e approfondimenti.</p>
<p>Buona esplorazione!</p>]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio 2010 arriva la RC1</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-2010-arriva-la-rc1/</link>
      <pubDate>Tue, 12 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-2010-arriva-la-rc1/</guid>
      <description>&lt;p&gt;Prosegue senza intoppi il cammino di &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Python Tools per Visual Studio&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, il progetto open source targato Microsoft che consente di programmare in Python con Visual Studio 2010. Dopo il &lt;a href=&#34;http://nicolaiarocci.com/python-tools-per-visual-studio-2010/&#34; title=&#34;Programmare in Python con Visual Studio 2010&#34;&gt;lancio ufficiale&lt;/a&gt; dello scorso marzo e la successiva &lt;a href=&#34;http://nicolaiarocci.com/python-tools-per-visual-studio-ecco-la-beta-2/&#34; title=&#34;Python Tools per Visual Studio 2010 Beta 2&#34;&gt;Beta 2&lt;/a&gt; di maggio, ieri è stata presentata la &lt;strong&gt;Release Candidate 1&lt;/strong&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Prosegue senza intoppi il cammino di <strong><!-- raw HTML omitted -->Python Tools per Visual Studio<!-- raw HTML omitted --></strong>, il progetto open source targato Microsoft che consente di programmare in Python con Visual Studio 2010. Dopo il <a href="http://nicolaiarocci.com/python-tools-per-visual-studio-2010/" title="Programmare in Python con Visual Studio 2010">lancio ufficiale</a> dello scorso marzo e la successiva <a href="http://nicolaiarocci.com/python-tools-per-visual-studio-ecco-la-beta-2/" title="Python Tools per Visual Studio 2010 Beta 2">Beta 2</a> di maggio, ieri è stata presentata la <strong>Release Candidate 1</strong>.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Oltre 200 i bug risolti e notevoli sono le novità introdotte, come per esempio il supporto per il refactoring. Consultate le <!-- raw HTML omitted -->release notes<!-- raw HTML omitted --> conoscere tutte le novità. Se volete saperne di più su questo interessante progetto vi invito a leggere <strong><a href="http://nicolaiarocci.com/python-tools-per-visual-studio-2010/" title="Programmare in Python con Visual Studio 2010">Programmare in Python con Visual Studio 2010</a></strong>,  la recensione che ho scritto in occasione del lancio.</p>
<p><em>Aggiornamento del 2.8.2011: siamo arrivati alla RC2</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Google Web Fonts 2 i font gratuiti e ottimizzati per il Web</title>
      <link>https://nicolaiarocci.com/google-web-fonts-v2-i-font-gratuiti-e-ottimizzati-per-il-web/</link>
      <pubDate>Tue, 05 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-web-fonts-v2-i-font-gratuiti-e-ottimizzati-per-il-web/</guid>
      <description>&lt;p&gt;Il progetto &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Google Web Fonts v2&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; offre a webmaster, designer e sviluppatori un accesso facile e gratuito a una ricca selezione di fonti tipografiche di qualità, ottimizzate per il web. Google sostiene che non ci dovrebbero essere barriere finanziare per la costruzione di siti web, e che il progetto Google Web Font contribuisce alla creazione di un web più bello, leggibile, accessibile e aperto. Secondo Google nei prossimi anni la gran parte di siti web adotteranno i web fonts.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il progetto <strong><!-- raw HTML omitted -->Google Web Fonts v2<!-- raw HTML omitted --></strong> offre a webmaster, designer e sviluppatori un accesso facile e gratuito a una ricca selezione di fonti tipografiche di qualità, ottimizzate per il web. Google sostiene che non ci dovrebbero essere barriere finanziare per la costruzione di siti web, e che il progetto Google Web Font contribuisce alla creazione di un web più bello, leggibile, accessibile e aperto. Secondo Google nei prossimi anni la gran parte di siti web adotteranno i web fonts.</p>
<!-- raw HTML omitted -->
<p>La versione 2 di Google Web Fonts è appena stata rilasciata ed è ricca di novità. La nuova interfaccia consente di consultare rapidamente la directory di quasi 200 fonti tipografiche, inserendo quelle prescelte in una collezione personale. Gli esempi possono essere visualizzati come parole, frasi oppure interi paragrafi di testo. E’ anche possibile vedere tutti assieme i font della propria collezione, in una apposita pagina di prova.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>I web font non sono una tecnologia nuova, sono stati <!-- raw HTML omitted -->introdotti dalle specifiche CSS3<!-- raw HTML omitted --> (2002) e sono già molto diffusi. Quelli di Google sono forniti dinamicamente dalla <strong><!-- raw HTML omitted -->Google Web Fonts API<!-- raw HTML omitted --></strong>, una applicazione ad alte prestazioni ospitata sui server di Mountain View. Il lavoro che dobbiamo fare noi è semplicemente quello di incollare una riga di codice nella nostra pagina HTML, dopodiché potremo usare il web font come un qualunque font standard. Questa soluzione garantisce indipendenza dalla piattaforma software del client e libertà di scelta, al costo di un minimo rischio di incompatibilità verso browser molto datati (<!-- raw HTML omitted -->qui<!-- raw HTML omitted --> trovate una lista aggiornata).</p>
<p><!-- raw HTML omitted -->Google tiene molto alla velocità della rete, e dei siti web in particolare, tanto da farne uno dei fattori di ranking per il suo motore di ricerca. Non stupisce quindi che venga fornito anche un indicatore di prestazioni che, in base al tipo e alle caratteristiche dei font selezionati, stima il tempo di caricamento del font nella nostra pagina web. In generale l’accesso alla API (e al sottostante CDN) è rapidissimo e non dovrebbe porre alcun tipo di problema.</p>
<p>Il mio interesse in Google Web Font v2 è nato in seguito alla visione della anteprima presentata alla <!-- raw HTML omitted -->Google I/O 2011<!-- raw HTML omitted -->. Se volete potete seguirla per intero anche voi:</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p> </p>]]></content:encoded>
    </item>
    <item>
      <title>Dei vizi del programmatore #3: Orgoglio</title>
      <link>https://nicolaiarocci.com/dei-vizi-del-programmatore-3-lorgoglio/</link>
      <pubDate>Wed, 29 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dei-vizi-del-programmatore-3-lorgoglio/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;Tutto comincia con una normale riunione tra programmatori, magari dedicata all’analisi di un nuovo intrigante progetto software. I toni inizialmente tranquilli all’improvviso si alzano e quello che doveva essere un incontro di routine si trasforma rapidamente in qualcos’altro. La discussione, ora vivace e concitata, diventa un vero e proprio alterco. Sedie penne e matite vengono spostate freneticamente, le voci si sovrappongono l’un l’altra e man mano che il tempo passa il meeting assomiglia sempre più a un furioso scontro tra galli combattenti. Se avete una certa carriera alle spalle ci siete già passati; se non l’avete state tranquilli, prima o poi ci passerete anche voi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>Tutto comincia con una normale riunione tra programmatori, magari dedicata all’analisi di un nuovo intrigante progetto software. I toni inizialmente tranquilli all’improvviso si alzano e quello che doveva essere un incontro di routine si trasforma rapidamente in qualcos’altro. La discussione, ora vivace e concitata, diventa un vero e proprio alterco. Sedie penne e matite vengono spostate freneticamente, le voci si sovrappongono l’un l’altra e man mano che il tempo passa il meeting assomiglia sempre più a un furioso scontro tra galli combattenti. Se avete una certa carriera alle spalle ci siete già passati; se non l’avete state tranquilli, prima o poi ci passerete anche voi.</p>
<h2 id="l8217ego-del-programmatore">L’Ego del Programmatore</h2>
<p>Quasi tutti i programmatori con cui ho avuto a che fare, incluso il sottoscritto, condividono almeno un tratto caratteriale: un ego ingombrante. <!-- raw HTML omitted -->Mike Bernat<!-- raw HTML omitted --> ci ricorda che diventare bravi programmatori è un processo lungo e impegnativo, che ci induce ad affinare le nostre capacità analitiche sviluppando mentalità e attitudine al perfezionismo. Alla fine del percorso ci troviamo in dote una forte fiducia nelle nostre capacità professionali, una fiducia che in alcune occasioni rischia di scatenare quello che io chiamo l’<em>ego del programmatore</em>, ovvero il nostro possente orgoglio.</p>
<p>Nel suo libro <!-- raw HTML omitted -->The Psychology of Computer Programming<!-- raw HTML omitted -->, <!-- raw HTML omitted -->Gerald M. Weinberg<!-- raw HTML omitted --> propone un’idea tanto semplice quanto difficile da mettere in pratica:</p>
<blockquote>
<p>L’idea è che i programmatori devono combattere la loro naturale tendenza a considerare i loro programmi come parte di se stessi, un atteggiamento che comporta il rifiuto preconcetto di ogni tipo di critica. Piuttosto, dovrebbero fare del loro meglio per considerare le loro creazioni come oggetti indipendenti da se stessi, distaccati dal proprio io, e ascoltare le critiche in modo spassionato, giudicandole nel merito. E’ una vera e propria disciplina spirituale della quale nessuno di noi [programmatori] è dotato, ma vale la pena provarci.</p></blockquote>
<p>Personalmente ricordo diverse occasioni in cui mio malgrado mi sono lasciato trascinare in “combattimenti tra galli”. A volte ne sono uscito vincente, altre volte ho dovuto ripiegare (non senza aver perduto qualche piuma). Col tempo credo e spero di essere migliorato, i consigli di Weinberg ho cercato e cerco tutt’ora di seguirli, ma certo la strada è lunga e tortuosa. E’ pur vero che in alcune occasioni l’aver ceduto, ritirando le mie proposte in favore di quelle altrui, si è rivelato un grave errore. Le conseguenze di certe scelte fatte in base a chi fosse il gallo più forte del pollaio, le pago ancora oggi. Ho imparato a mie spese che non sempre l’orgoglio del programmatore è un tratto negativo, anzi!</p>
<p>Se la vostra idea è quella giusta sostenetela a spada tratta fino in fondo, ma accertatevi che non sia esclusivamente il vostro orgoglio a condurre le trattative! In queste occasioni è molto importante concedere diritto di parola e giusta attenzione ai nostri interlocutori, soffermandoci a meditare sulle idee e le critiche ricevute prima di respingerle a priori. Se le riteniamo fondate facciamone tesoro apportando le dovute correzioni alla nostra stessa idea. Ciò che più conta, in realtà, è la qualità finale del progetto. Se alla fine si rivelerà un successo, il nostro orgoglio ne sarà ampiamente ripagato.</p>
<p><em>PS: a proposito di Weinberg, il suo libro è del 1971 ma è ancora attualissimo e ve lo consiglio caldamente. E’ disponibile in formato <!-- raw HTML omitted -->eBook su Amazon<!-- raw HTML omitted --> e altrove a <!-- raw HTML omitted -->prezzi modici<!-- raw HTML omitted -->. Non lasciatevi ingannare dal fatto che nel testo si parli di linguaggi ormai superati. In quarant’anni la gente non è cambiata affatto.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Noi programmatori miglioriamo con l’età (forse)</title>
      <link>https://nicolaiarocci.com/noi-programmatori-miglioriamo-con-leta-forse/</link>
      <pubDate>Tue, 14 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/noi-programmatori-miglioriamo-con-leta-forse/</guid>
      <description>&lt;p&gt;Man mano che partecipo ai vari eventi in giro per l’Italia mi capita sempre più spesso di ritrovarmi a essere, tra i partecipanti, uno dei più anziani. L’altro giorno al &lt;!-- raw HTML omitted --&gt;Cowo on the Beach&lt;!-- raw HTML omitted --&gt; distanziavo tutti di almeno una decade. Mi sono detto che i veterani non amano frequentare gli eventi pubblici, non tanto quanto li apprezzavano da giovani, e mi sono messo l’anima in pace.&lt;/p&gt;
&lt;p&gt;Fino a stamattina, quando un bell’articolo di &lt;!-- raw HTML omitted --&gt;Peter Knego&lt;!-- raw HTML omitted --&gt; mi ha svelato la scomoda verità (che inconsciamente rifiutavo di considerare). &lt;strong&gt;I programmatori oltre i trent’anni, per non dire dei quaranta, sono merce rara&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Partendo dai dati pubblici messi a disposizione da &lt;!-- raw HTML omitted --&gt;StackOverflow&lt;!-- raw HTML omitted --&gt; e relativi a un campione di ben 37.400 programmatori, Peter ha indagato sul rapporto tra età, reputazione e quantità di programmatori ancora attivi. Ne è uscita una serie di grafici davvero interessante.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Man mano che partecipo ai vari eventi in giro per l’Italia mi capita sempre più spesso di ritrovarmi a essere, tra i partecipanti, uno dei più anziani. L’altro giorno al <!-- raw HTML omitted -->Cowo on the Beach<!-- raw HTML omitted --> distanziavo tutti di almeno una decade. Mi sono detto che i veterani non amano frequentare gli eventi pubblici, non tanto quanto li apprezzavano da giovani, e mi sono messo l’anima in pace.</p>
<p>Fino a stamattina, quando un bell’articolo di <!-- raw HTML omitted -->Peter Knego<!-- raw HTML omitted --> mi ha svelato la scomoda verità (che inconsciamente rifiutavo di considerare). <strong>I programmatori oltre i trent’anni, per non dire dei quaranta, sono merce rara</strong>.</p>
<p>Partendo dai dati pubblici messi a disposizione da <!-- raw HTML omitted -->StackOverflow<!-- raw HTML omitted --> e relativi a un campione di ben 37.400 programmatori, Peter ha indagato sul rapporto tra età, reputazione e quantità di programmatori ancora attivi. Ne è uscita una serie di grafici davvero interessante.</p>
<h2 id="quantità-di-programmatori-per-fasce-di-età">Quantità di Programmatori per fasce di Età</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La distribuzione per età (in blu nel grafico) è stata una bella sorpresa. E’ risaputo che col passare degli anni gran parte dei programmatori tende a cambiare carriera, di solito progredendo verso ruoli manageriali. E’ l’entità della riduzione che, almeno dal mio punto di vista, è stupefacente. Il picco si raggiunge a soli 27 anni, dopo di ché il numero dei programmatori si dimezza ogni 6 o 7 anni.</p>
<h2 id="età-e-reputazione-dei-programmatori">Età e Reputazione dei Programmatori</h2>
<p>Osservate come nel grafico precedente la reputazione dei programmatori su Stack Overflow (in rosso) tenda ad aumentare con l’età. Si tratta quasi di una progressione lineare. L’andamento è meglio comprensibile se diamo una occhiata a quest’altro grafico:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>I programmatori veterani pongono meno domande su Stack Overflow, ma rispondono molto più frequentemente dei loro colleghi più giovani. Un quarantenne risponde mediamente il doppio delle volte di un collega ventenne.</p>
<h2 id="i-veterani-sono-davvero-più-abili-dei-giovani">I veterani sono davvero più abili dei giovani?</h2>
<p>A questo punto Peter si è posto una domanda intrigante: la qualità delle risposte migliora con l’età? I veterani forniscono le risposte migliori? Il meccanismo di premiazione delle domande e delle risposte utilizzato da StackOverflow ha permesso a Peter di elaborare l’andamento dei voti positivi ottenuti, suddivisi  per età :</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il grafico dimostra che la qualità media delle risposte non migliora significativamente in rapporto all’età dei programmatori. A quanto pare i veterani migliorano la loro reputazione soprattutto fornendo più risposte, piuttosto che migliorandone la qualità.</p>
<p>Riassumendo:</p>
<ul>
<li>Il numero di programmatori cala significativamente con l’età. L’apice è attorno ai 27 anni, poi si verifica un crollo costante.</li>
<li>I programmatori quarantenni rispondono al doppio e pongono metà delle domande dei colleghi ventenni. I veterani insegnano e i giovani imparano, come dovrebbe essere.</li>
<li>La qualità delle risposte non migliora significativamente col passare degli anni.</li>
<li>I veterani migliorano la loro reputazione soprattutto perché sono molto più attivi dei loro giovani colleghi.</li>
</ul>
<p>Ci sarebbe molto da dire a proposito di questi dati. Per esempio si potrebbe ipotizzare che i veterani abbiano semplicemente più tempo a loro disposizione per rispondere ai quesiti posti dai colleghi, ma quel che balza all’occhio qui è senz’altro il calo del numero di programmatori man mano che l’età avanza.</p>
<p>Per quanto mi riguarda, a 41 anni suonati, mi trovo già al di là del guado. La cosa è ancor più imbarazzante visto e considerato che non credo né mi aspetto di cambiare mestiere nei prossimi anni. E voi, miei cari lettori, a che punto del percorso vi trovate ora? Io ora spengo tutto e me ne vado in piscina a fare il ragazzino. Tiè.</p>]]></content:encoded>
    </item>
    <item>
      <title>Qualche riflessione sull’esperienza del Co-Working</title>
      <link>https://nicolaiarocci.com/qualche-riflessione-sullesperienza-del-co-working/</link>
      <pubDate>Mon, 13 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/qualche-riflessione-sullesperienza-del-co-working/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Faccio subito mie le riflessioni di &lt;!-- raw HTML omitted --&gt;Gianluca Diegoli&lt;!-- raw HTML omitted --&gt; sul primo esperimento di co-working in spiaggia, a cui ho partecipato pure io:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mentre tornavo in auto, riflettevo di quanta tristezza in questi anni ho visto transitare in molti uffici in cui aleggia quel senso di prigione, in cui le persone si sentono agli arresti domiciliari, mangiano solo con colleghi che odiano, con cui parlano di un lavoro o di un capo che altrettanto odiano, in cui la produttività e la creatività, apparentemente garantite dallo svolgersi in ambiente controllato e da orari stringenti, in realtà siano minime. Anzi, proprio quel sistema che in passato era stato creato per controllare il lavoratore, come se fosse un animale d’allevamento, ora è la causa dell’inefficienza e del disinteresse.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Nella intervista semi-seria che trovate qui sotto (mescolata a quelle degli amici) dichiaro che consiglierei senz’altro l’esperienza ai miei dipendenti. Confermo. I miei splendidi ragazzi lavorerebbero felicemente anche (forse soprattutto) sul cucuzzolo di una montagna, ma sulla efficacia del co-working ad ampio spettro qualche perplessità l’avrei.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Faccio subito mie le riflessioni di <!-- raw HTML omitted -->Gianluca Diegoli<!-- raw HTML omitted --> sul primo esperimento di co-working in spiaggia, a cui ho partecipato pure io:</p>
<blockquote>
<p>Mentre tornavo in auto, riflettevo di quanta tristezza in questi anni ho visto transitare in molti uffici in cui aleggia quel senso di prigione, in cui le persone si sentono agli arresti domiciliari, mangiano solo con colleghi che odiano, con cui parlano di un lavoro o di un capo che altrettanto odiano, in cui la produttività e la creatività, apparentemente garantite dallo svolgersi in ambiente controllato e da orari stringenti, in realtà siano minime. Anzi, proprio quel sistema che in passato era stato creato per controllare il lavoratore, come se fosse un animale d’allevamento, ora è la causa dell’inefficienza e del disinteresse.</p></blockquote>
<p>Nella intervista semi-seria che trovate qui sotto (mescolata a quelle degli amici) dichiaro che consiglierei senz’altro l’esperienza ai miei dipendenti. Confermo. I miei splendidi ragazzi lavorerebbero felicemente anche (forse soprattutto) sul cucuzzolo di una montagna, ma sulla efficacia del co-working ad ampio spettro qualche perplessità l’avrei.</p>
<h2 id="co-working-per-tutti">Co-Working per tutti?</h2>
<p>Le persone che odiano il lavoro e/o i loro colleghi, quelle a cui allude Gianluca nel corso del suo ragionamento, come reagirebbero immerse in un ambiente più ludico e ricreativo di quello abituale? Le tensioni si smorzerebbero e la produttività ne guadagnerebbe oppure, al contrario, approfitterebbero della situazione per rilassarsi fin troppo, cedendo alle inevitabili distrazioni? In fin dei conti l’esperimento <strong><!-- raw HTML omitted -->Cowo on the Beach<!-- raw HTML omitted --></strong> ha avuto successo anche e soprattutto, credo, perché i partecipanti sono tutte persone fortemente motivate, innamorate del proprio lavoro (e credetemi, a parte le battute ognuno di noi ha <em>effettivamente</em> lavorato nel corso della giornata!).</p>
<p>Ogni ambiente di lavoro è unico e distino, quindi non penso che esista una risposta assoluta, ma questa è una domanda che ogni datore di lavoro si porrebbe senz’altro. L’argomento mi sta particolarmente a cuore perché proprio in queste settimane stiamo valutando la possibilità di sperimentare in azienda metodi di lavoro alternativi a quelli tradizionali, come per esempio il telelavoro.</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h2 id="sulla-efficacia-dei-piccoli-eventi">Sulla efficacia dei piccoli eventi</h2>
<p>Nel <!-- raw HTML omitted -->suo articolo<!-- raw HTML omitted --> Gianluca accenna al fatto che il tempo incerto ha scoraggiato alcuni di quelli che si erano iscritti all’evento. E’ un peccato in effetti, anche perché la giornata tutto sommato è stata bella (abbiamo fatto anche il bagno!). A tavola mi dicevo però che non tutto il male vien per nuocere. Il gruppo ristretto ha consentito a tutti partecipare attivamente alla stessa discussione. Una tavolata di molte persone avrebbe portato alla creazione dei mini-conciliaboli tipici degli eventi di più ampio respiro, con conseguente frammentazione della discussione. E’ più facile che si creino intimità e senso di unità quando il gruppo è ridotto.</p>
<p>Con questo non voglio dire che sono contento delle assenze: si partecipa a un evento proprio per conoscere nuove persone interessanti. Senz’altro però la formula “cowobeach” è interessante anche perché  è diversa nei numeri. Non si tratta di uno dei soliti eventi che puntano alla partecipazione di massa.</p>
<p><!-- raw HTML omitted -->Nota a margine per i geek che mi leggono<!-- raw HTML omitted --></p>
<p>L’81% dei notebook impiegati al #cowobeach erano dei <strong>Mac Book</strong>. Io probabilmente rappresentavo il caso più singolare: in realtà scrivevo ed eseguivo codice sulla mia postazione Windows in ufficio, collegato dalla spiaggia via TeamViewer. Fa impressione constatare come in pochi anni l’adozione dei Mac da parte dei professionisti del settore sia aumentata.</p>]]></content:encoded>
    </item>
    <item>
      <title>Domani si lavora in spiaggia! Vieni al #cowobeach</title>
      <link>https://nicolaiarocci.com/domani-si-lavora-in-spiaggia-vieni-al-cowobeach/</link>
      <pubDate>Thu, 09 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/domani-si-lavora-in-spiaggia-vieni-al-cowobeach/</guid>
      <description>&lt;p&gt;Se siete in Romagna e dintorni forse potete ancora farci un pensierino: domani venite a lavorare in spiaggia! &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Cowo on the beach&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; è una bella iniziativa organizzata da &lt;!-- raw HTML omitted --&gt;Alessandra Farabegoli&lt;!-- raw HTML omitted --&gt; su suggerimento di &lt;!-- raw HTML omitted --&gt;Gianluca Diegoli&lt;!-- raw HTML omitted --&gt;. Di cosa si tratta? Semplice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Giornata di temporary coworking on the beach: ci troviamo la mattina al Boca Barranca, il wifi c’è ed è gratuito, la mattina si lavora, poi bagno in mare, pranzo, di nuovo lavoro e.. aperitivo! Un anticipo del RomagnaCamp che si terrà, sempre al Boca Barranca, dal 9 all’11 settembre&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se siete in Romagna e dintorni forse potete ancora farci un pensierino: domani venite a lavorare in spiaggia! <strong><!-- raw HTML omitted -->Cowo on the beach<!-- raw HTML omitted --></strong> è una bella iniziativa organizzata da <!-- raw HTML omitted -->Alessandra Farabegoli<!-- raw HTML omitted --> su suggerimento di <!-- raw HTML omitted -->Gianluca Diegoli<!-- raw HTML omitted -->. Di cosa si tratta? Semplice:</p>
<blockquote>
<p>Giornata di temporary coworking on the beach: ci troviamo la mattina al Boca Barranca, il wifi c’è ed è gratuito, la mattina si lavora, poi bagno in mare, pranzo, di nuovo lavoro e.. aperitivo! Un anticipo del RomagnaCamp che si terrà, sempre al Boca Barranca, dal 9 all’11 settembre</p></blockquote>
<p>Alessandra ha appena pubblicato un <!-- raw HTML omitted -->aggiornamento<!-- raw HTML omitted --> con tanto di previsioni del tempo (non male dai) e suo programma di lavoro. Il mio è semplice: scrivere (poco) codice all’aria aperta e fare conoscenza con <!-- raw HTML omitted -->tanta bella gente<!-- raw HTML omitted -->.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Se decidete di venire, anche all’ultimo momento, <!-- raw HTML omitted -->iscrivetevi<!-- raw HTML omitted --> comunque! A domani!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Windows 8 e i dubbi sul destino di Silverlight</title>
      <link>https://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/</link>
      <pubDate>Wed, 08 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/</guid>
      <description>&lt;p&gt;Con un &lt;!-- raw HTML omitted --&gt;filmato di 10 minuti&lt;!-- raw HTML omitted --&gt; Microsoft ha presentato in anteprima il nuovo Windows 8. A molti non è sfuggita l’enfasi su HTML5 e JavaScript, annunciate come le tecnologie con le quali costruire le nuove accattivanti applicazioni per Windows 8. Il fatto che non si faccia cenno a Silverlight, WPF o .NET sta causando un bel po’ di preoccupazione.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Con un <!-- raw HTML omitted -->filmato di 10 minuti<!-- raw HTML omitted --> Microsoft ha presentato in anteprima il nuovo Windows 8. A molti non è sfuggita l’enfasi su HTML5 e JavaScript, annunciate come le tecnologie con le quali costruire le nuove accattivanti applicazioni per Windows 8. Il fatto che non si faccia cenno a Silverlight, WPF o .NET sta causando un bel po’ di preoccupazione.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<blockquote>
<p>You all saw a very small technology demo of Windows 8, and a brief press release. We’re all being quiet right now because we can’t comment on this. It’s not because we don’t care, aren’t listening, have given up, or are agreeing or disagreeing with you on something. All I can say for now is to please wait until September. If we say more before then, that will be great, but there are no promises (and I’m not aware of any plans) to say more right now. I’m very sorry that there’s nothing else to share at the moment. I know that answer is terrible, but it’s all that we can say right now. Seriously.</p></blockquote>
<p>Quindi bocche cucite, almeno fino a Settembre. In seguito Brown interviene ancora, tirato per la giacchetta dai molti che hanno interpretato le sue parole nelle maniere più disparate:</p>
<blockquote>
<p>This whole thing has blown way out of proportion. Base your information on our primary sources (like our press release), not on third party speculation. That’s not to minimize how everyone feels, but keep in mind that Windows 8 itself is still a ways off from retail, and even much further away from internal IT adoption. The 8 weeks until //build/ is a pretty small amount of time to wait in comparison.</p>
<p>Take some vacation time this summer, and look forward to the //build/ conference. Stop speculating based on just a small demo of some very cool new technology. Tell your management to do the same: if they’re basing your project work for the next X years on the results of a quick demo for an unreleased operating system, then they are doing you and your company a real disservice.</p></blockquote>
<p>Windows 8 è ben lontano dall’essere pronto, e quel che si è visto nel filmato è solo la prima di una serie di anteprime. Inutile fare speculazioni basate su una demo di pochi minuti. Questa estate godetevi le vacanza, ne riparleremo al vostro ritorno. Dite ai vostri manager di fare lo stesso. <strong>Se stanno pianificando il lavoro dei prossimi anni basandosi solo su una breve anteprima di un sistema operativo non ancora pronto, allora stanno facendo un grave errore</strong>.</p>
<h2 id="non-è-mica-la-prima-volta">Non è mica la prima volta</h2>
<p>Niente da obiettare da parte mia. Mi limito a rilevare che non è la prima volta che il futuro delle piattaforme Microsoft viene messo in discussione anche dallo stesso personale Microsoft. Leggendaria la gaffe di <!-- raw HTML omitted -->Bob Muglia<!-- raw HTML omitted -->, Vice President for Server and Tools Businesses (mica cotica) riportata fedelmente da <!-- raw HTML omitted -->Mary Jo Foley<!-- raw HTML omitted -->:</p>
<blockquote>
<p>“Silverlight is our development platform for Windows Phone,” he said. Silverlight also has some “sweet spots” in media and line-of-business applications, he said.</p>
<p>But when it comes to touting Silverlight as Microsoft’s vehicle for delivering a cross-platform runtime, “<strong>our strategy has shifted</strong>,” Muglia told me.</p>
<p>Silverlight will continue to be a cross-platform solution, working on a variety of operating system/browser platforms, going forward, he said. “But <strong>HTML is the only true cross platform solution for everything</strong>, including (Apple’s) iOS platform,” Muglia said.</p></blockquote>
<p>All’epoca fu necessario un comunicato congiunto di Steve Ballmer (CEO Microsoft) e del penitente Bob Muglia per acquietare la tempesta scatenata da queste parole. Sarà un caso che recentemente Muglia abbia annunciato il trasloco ad altri lidi?</p>
<p>Il fatto è che le tante aziende che hanno investito molto e – ahimé – esclusivamente sulle piattaforme Microsoft ora guardano con terrore a uno scenario, per quanto improbabile, che non veda Silverlight, WPF e .NET in cima all’agenda della casa madre.</p>
<h2 id="img-classalignright-titlehtml5-logo-srchttpi2wpcomnicolaiaroccicomwp-contentuploadshtml5-logopngresize1282c150-althtml5-logo-data-recalc-dims1-il-futuro-del-web-è-silverlight"><!-- raw HTML omitted -->Il futuro del Web è Silverlight?</h2>
<p>Personalmente non ho dubbi sul fatto che il futuro delle piattaforme tecnologiche Microsoft sarà garantito. La domanda cruciale che ogni programmatore dovrebbe porsi è un’altra. Il futuro del web è Silverlight? In soldoni, su cosa vale la pena investire tempo, risorse e denaro? Temo la risposta non sia quella che i programmatori Silverlight vorrebbero sentire.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il Cloud Computing è davvero affidabile?</title>
      <link>https://nicolaiarocci.com/il-cloud-computing-e-davvero-affidabile/</link>
      <pubDate>Fri, 03 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-cloud-computing-e-davvero-affidabile/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;E’ di pochi giorni fa la &lt;!-- raw HTML omitted --&gt;notizia&lt;!-- raw HTML omitted --&gt; che alcuni servizi API gratuiti forniti da Google verranno chiusi. Tra questi spicca &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Translate API&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, la più apprezzata libreria gratuita per la traduzione automatica sul web. Basta una occhiata ai &lt;!-- raw HTML omitted --&gt;commenti &lt;!-- raw HTML omitted --&gt;per rendersi conto dello sconcerto generato dall’annuncio, per altro del tutto inatteso. Molti si dicono disposti a pagare pur di non rinunciare alla API, ma non è  questa l’idea di Google che in alternativa propone &lt;!-- raw HTML omitted --&gt;Google Translate Element&lt;!-- raw HTML omitted --&gt;, widget gratuito che certo non è una soluzione accettabile per applicazioni che attualmente integrano la API in maniera trasparente. Immagino che proprio qui stia il nocciolo della questione: una API non è visibile né apprezzabile dall’esterno, mentre un widget promuove il brand Google.&lt;/p&gt;
&lt;p&gt;Migliaia di aziende, enti pubblici e organizzazioni non governative internazionali che oggi usano la API dovranno trovare soluzioni alternative, probabilmente a pagamento. Almeno gli è stato concesso un po’ di tempo: Google garantisce un periodo di tre anni prima della sospensione del servizio.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Questa notizia induce ancora una volta alcune riflessioni circa l’affidabilità del &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Cloud Computing&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, modello di sviluppo verso il quale, volenti o nolenti, tutti noi siamo diretti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->E’ di pochi giorni fa la <!-- raw HTML omitted -->notizia<!-- raw HTML omitted --> che alcuni servizi API gratuiti forniti da Google verranno chiusi. Tra questi spicca <strong><!-- raw HTML omitted -->Translate API<!-- raw HTML omitted --></strong>, la più apprezzata libreria gratuita per la traduzione automatica sul web. Basta una occhiata ai <!-- raw HTML omitted -->commenti <!-- raw HTML omitted -->per rendersi conto dello sconcerto generato dall’annuncio, per altro del tutto inatteso. Molti si dicono disposti a pagare pur di non rinunciare alla API, ma non è  questa l’idea di Google che in alternativa propone <!-- raw HTML omitted -->Google Translate Element<!-- raw HTML omitted -->, widget gratuito che certo non è una soluzione accettabile per applicazioni che attualmente integrano la API in maniera trasparente. Immagino che proprio qui stia il nocciolo della questione: una API non è visibile né apprezzabile dall’esterno, mentre un widget promuove il brand Google.</p>
<p>Migliaia di aziende, enti pubblici e organizzazioni non governative internazionali che oggi usano la API dovranno trovare soluzioni alternative, probabilmente a pagamento. Almeno gli è stato concesso un po’ di tempo: Google garantisce un periodo di tre anni prima della sospensione del servizio.</p>
<!-- raw HTML omitted -->
<p>Questa notizia induce ancora una volta alcune riflessioni circa l’affidabilità del <strong><!-- raw HTML omitted -->Cloud Computing<!-- raw HTML omitted --></strong>, modello di sviluppo verso il quale, volenti o nolenti, tutti noi siamo diretti.</p>
<p><!-- raw HTML omitted -->Stand-Alone Vs Cloud Computing<!-- raw HTML omitted --></p>
<p>Le vecchie applicazioni stand alone funzionano sempre e comunque. Prima o poi il programmatore originale sparisce dalla circolazione; del codice sorgente (se disponibile) nessuno capisce più nulla, ma l’applicazione continua a girare. E se una delle librerie usate dall’applicazione (le vecchie .dll, per capirci) viene improvvisamente abbandonata dal produttore? Non ci sono problemi, l’installazione gira come prima.</p>
<p>Nel dorato mondo <!-- raw HTML omitted -->PaaS<!-- raw HTML omitted --> le applicazioni smettono di funzionare non appena una singola API remota diventa inaccessibile. Non mi sembra una differenza da poco.</p>
<h2 id="disservizi-e-sorprese">Disservizi e sorprese</h2>
<p>Si potrebbe obiettare che appoggiarsi a una API gratuita per sviluppare un prodotto strategico non è una mossa intelligente e che comunque casi di disservizi come questo sono assai rari. In Aprile alcuni server Amazon AWS (la piattaforma cloud più usata al mondo) <!-- raw HTML omitted -->sono andati in corto circuito<!-- raw HTML omitted --> lasciando improvvisamente a piedi centinaia di fornitori di servizi e diversi milioni di loro utenti. Il disservizio, durato oltre ventiquattro ore, è avvenuto nonostante AWS sia un servizio a pagamento di altissimo livello che garantisce un livello di Service Level Agreement (SLA) superiore al 99%.</p>
<p>Un caso diverso ma dalle stesse conseguenze  si è verificato proprio in casa Google poche settimane fa, quando <!-- raw HTML omitted -->Google App Engine<!-- raw HTML omitted --> è diventato a pagamento (almeno per alcuni livelli di utilizzo prima gratuiti), mettendo di fatto fuori mercato molti piccoli servizi gratuiti che avevano scelto la piattaforma cloud del gigante di Mountain View.</p>
<h2 id="le-contromisure-necessarie">Le contromisure necessarie</h2>
<p>Non per questo penso che il cloud computing vada evitato, ne sono anzi un sostenitore convinto, ma è importante per noi tutti <strong>comprendere a fondo i limiti e i rischi che questo nuovo paradigma porta con sé</strong>.</p>
<p>Un paio di anni fa ho scritto <!-- raw HTML omitted -->un programma di backup remoto<!-- raw HTML omitted --> che si appoggia a <!-- raw HTML omitted -->Simple Storage Service<!-- raw HTML omitted --> (S3), uno dei servizi della piattaforma Amazon AWS. Il programma ha continuato a lavorare impunemente mentre il disastro si abbatteva sui server Amazon della East Coast perché, fin dall’inizio, era progettato per far fronte a evenienze come questa. Usa server multipli ridondanti dislocati su più aree geografiche, in modo che il crash di una singola server farm non lo mandi in tilt. E’ bene aspettarsi il peggio dai servizi cloud per essere pronti a gestire la crisi se (quando) verrà.</p>
<p>Per quanto riguarda il modello di business, è necessario adottarne uno che garantisca margini sufficienti a compensare improvvisi aumenti delle tariffe, anche solo per il periodo necessario alla eventuale dislocazione. La tendenza generale del mercato è comunque rassicurante: in questi anni costi dei servizi cloud sono calati costantemente.</p>
<h2 id="le-responsabilità-stanno-da-entrambe-le-parti">Le responsabilità stanno da entrambe le parti</h2>
<p>E se domani mi si annunciasse che S3 è improvvisamente deprecato? Fortunatamente per me e per le migliaia di altri il servizio non è gratuito e assicura ad Amazon utili stellari, ma non è questo il punto. Il punto è che in ogni momento <em>potrebbe succedere</em>.</p>
<p>I fornitori di servizi cloud hanno una grande responsabilità: garantire la continuità del loro servizio anche e soprattutto nel lungo periodo. Speriamo che ne siano coscienti. Noi programmatori e analisti dobbiamo tenere conto dei rischi che corriamo quando scegliamo di lavorare su piattaforme cloud, progettando i nostri prodotti di conseguenza.</p>
<p><em>Aggiornamento. Venerdì 3 giugno Google ha ritoccato l’annuncio ufficiale. La chiusura è annullata e la Translate API verrà messa a pagamento.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Dei vizi del programmatore #2: La Fretta</title>
      <link>https://nicolaiarocci.com/dei-vizi-dei-programmatori-2-la-fretta/</link>
      <pubDate>Mon, 30 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dei-vizi-dei-programmatori-2-la-fretta/</guid>
      <description>&lt;h2 id=&#34;8220per-risolvere-il-problema-mi-bastano-un-paio-di-minuti8221&#34;&gt;“Per risolvere il problema mi bastano un paio di minuti”&lt;/h2&gt;
&lt;p&gt;La tentazione della scorciatoia. E’ difficile resisterle, prima o poi ci caschiamo tutti. In alcuni casi isolati vale la pena scegliere la strada più veloce, ma non è certo questa la via maestra. E’ pericolosa e in genere causa più problemi di quelli che risolve. Una scorciatoia può farti risparmiare qualche ora ma i danni causati possono costarti mesi di lavoro.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="8220per-risolvere-il-problema-mi-bastano-un-paio-di-minuti8221">“Per risolvere il problema mi bastano un paio di minuti”</h2>
<p>La tentazione della scorciatoia. E’ difficile resisterle, prima o poi ci caschiamo tutti. In alcuni casi isolati vale la pena scegliere la strada più veloce, ma non è certo questa la via maestra. E’ pericolosa e in genere causa più problemi di quelli che risolve. Una scorciatoia può farti risparmiare qualche ora ma i danni causati possono costarti mesi di lavoro.</p>
<!-- raw HTML omitted -->
<p>La fretta, cattiva consigliera, è addirittura diabolica quando applicata alla pratica che tutti noi programmatori odiamo di più: <strong>la soluzione di bug</strong>. Nella mia carriera ricordo distintamente le circostanze in cui, risolvendo frettolosamente bug, ho generato mostri.</p>
<p>Non fidatevi di voi stessi quando svolgete attività delicate o “risolvete” bug nel vostro codice o in quello degli altri. Assicuratevi che qualcuno verifichi quel che state facendo o, se non è possibile, fate in modo di testare e ritestare (possibilmente con l’aiuto di altri) quel che state combinando. Gli <!-- raw HTML omitted -->unit test<!-- raw HTML omitted --> sono i vostri migliori alleati. Se proprio dovete prendere una scorciatoia fate in modo che il vostro capo la avvalli (copritevi le spalle).</p>
<h3 id="nota-a-margine">Nota a margine</h3>
<p>Se avvertite un leggero formicolio alle punte delle dita mentre digitate codice fermatevi e meditate su quel che state facendo. Il vostro <strong>sesto senso di programmatore</strong> vi sta dicendo che c’è qualcosa che non va. E’ una capacità che si acquisisce col tempo e soprattutto con l’esperienza. Se non vi è ancora capitato fidatevi, prima o poi la svilupperete anche voi: è un potente alleato di ogni programmatore. Non scherzo! 😉</p>]]></content:encoded>
    </item>
    <item>
      <title>Dei vizi del programmatore #1: La Superbia</title>
      <link>https://nicolaiarocci.com/dei-vizi-del-programmatore-1-la-superbia/</link>
      <pubDate>Fri, 27 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dei-vizi-del-programmatore-1-la-superbia/</guid>
      <description>&lt;h2 id=&#34;il-mio-codice-è-perfetto-quello-degli-altri-è-spazzatura&#34;&gt;Il mio codice è perfetto. Quello degli altri è spazzatura&lt;/h2&gt;
&lt;p&gt;La superbia è un atteggiamento molto frequente tra noi programmatori. Io stesso sono – ahimé – un superbo seriale. Non importa quanto ci impegniamo. Ci saranno sempre colleghi che giudicheranno male il nostro codice, che penseranno di poter far meglio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="il-mio-codice-è-perfetto-quello-degli-altri-è-spazzatura">Il mio codice è perfetto. Quello degli altri è spazzatura</h2>
<p>La superbia è un atteggiamento molto frequente tra noi programmatori. Io stesso sono – ahimé – un superbo seriale. Non importa quanto ci impegniamo. Ci saranno sempre colleghi che giudicheranno male il nostro codice, che penseranno di poter far meglio.</p>
<p>Non criminalizzare il codice degli altri. Prima o poi sarà il tuo a  finire sotto esame. La critica oggettiva va bene, i consigli e le osservazioni professionali pure, ma non esprimere giudizi. Sii umile. C’è sempre da imparare dal lavoro dei colleghi.</p>
<blockquote>
<p>L’uom superbo si pone sopra gli altri, e crede che gli si debba ogni cosa; gli altri, per lo contrario, lo mettono nell’ultimo grado, né gli concedono nulla.</p>
<p><em>Confucio</em></p></blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Perché le Web Startup non amano .NET Framework?</title>
      <link>https://nicolaiarocci.com/perche-le-web-startup-non-amano-net-framework/</link>
      <pubDate>Thu, 19 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/perche-le-web-startup-non-amano-net-framework/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Sul blog aziendale di Expensify il CEO &lt;strong&gt;David Barrett&lt;/strong&gt; ha &lt;!-- raw HTML omitted --&gt;raccontato&lt;!-- raw HTML omitted --&gt; perché la sua azienda non assume programmatori Microsoft .NET Framework. In poche ore il suo articolo ha fatto il giro del mondo scatenando un gran putiferio. Gli sviluppatori .NET si sono lanciati in una difesa accorata della piattaforma Microsoft mentre molti commentatori e blogger hanno sposato le tesi di Barrett. Gli oltre 500 commenti danno un’idea ben precisa del fervore suscitato dall’articolo. Non intendo dilungarmi sui contenuti, mi interessa piuttosto approfondire una questione sollevata indirettamente dal pezzo di Barrett.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Sul blog aziendale di Expensify il CEO <strong>David Barrett</strong> ha <!-- raw HTML omitted -->raccontato<!-- raw HTML omitted --> perché la sua azienda non assume programmatori Microsoft .NET Framework. In poche ore il suo articolo ha fatto il giro del mondo scatenando un gran putiferio. Gli sviluppatori .NET si sono lanciati in una difesa accorata della piattaforma Microsoft mentre molti commentatori e blogger hanno sposato le tesi di Barrett. Gli oltre 500 commenti danno un’idea ben precisa del fervore suscitato dall’articolo. Non intendo dilungarmi sui contenuti, mi interessa piuttosto approfondire una questione sollevata indirettamente dal pezzo di Barrett.</p>
<h2 id="perché-così-poche-startup-scelgono-net-framework">Perché così poche Startup scelgono .NET Framework?</h2>
<p>Guardando all’intero ecosistema delle Startup internet<!-- raw HTML omitted -->,<!-- raw HTML omitted --> è facile riscontrare che ben poche adottano il .NET Framework. Ci sono eccezioni importanti e significative, come per esempio Stack Overflow, ma le tecnologie dominanti sono altre: Ruby on Rails, PHP e Python su tutte. <strong>Ian Muir</strong>, Senior Developer di Piehead, in un suo <!-- raw HTML omitted -->interessante articolo<!-- raw HTML omitted --> tenta di individuare le ragioni che fanno di .NET Framework una scelta poco apprezzata dal vivace e  dinamico mondo delle Startup.</p>
<h3 id="il-costo-della-piattaforma-microsoft">Il costo della piattaforma Microsoft</h3>
<p>Se per le grandi aziende le voci di spesa davvero rilevanti sono stipendi, hardware, infrastrutture, banda e dati, per le nostre Startup il problema è innanzi tutto partire. Ruby on Rails, PHP, Python e i loro fratelli sono soluzioni <!-- raw HTML omitted -->FOSS<!-- raw HTML omitted --> (gratuite e open source) che permettono di lavorare a costo zero mentre l’ambiente .NET è al contrario un closed-source a pagamento.</p>
<!-- raw HTML omitted -->
<p>Muir ricorda che già da qualche anno Microsoft ha lanciato il programma <strong><!-- raw HTML omitted -->BizSpark<!-- raw HTML omitted --></strong> che tra le altre cose elimina gran parte dei costi di adozione del .NET Framework. La differenza di spesa insomma non sarebbe così significativa. Peccato che BizSpark sia pressochè sconosciuto.</p>
<p>Ci sono soluzioni alternative. <!-- raw HTML omitted -->Showcase Lane<!-- raw HTML omitted --> per esempio è sviluppato interamente in ASP.NET MVC, ma gira sotto <!-- raw HTML omitted -->Mono<!-- raw HTML omitted -->. Se vi interessa questo approccio <!-- raw HTML omitted -->qui<!-- raw HTML omitted --> potete leggere tutti i dettagli in proposito.</p>
<h3 id="difficoltà-nella-applicazione-della-metodologia-agile">Difficoltà nella applicazione della Metodologia Agile</h3>
<p>Inutile negarlo, questi sono gli anni della <strong><!-- raw HTML omitted -->metodologia agile<!-- raw HTML omitted --></strong>. I giovani imprenditori rilasciano i loro prodotti il più velocemente possibile, spesso in versioni beta appena funzionanti, che implementano a malapena le funzionalità di base. Ruby, Python, PHP e soci dispongono di strumenti mirati per lo sviluppo e il deploy rapido delle applicazioni, qualcosa che in parte manca al mondo .NET. Nel suo articolo Muir sostiene che in realtà non c’è una gran differenza nei tempi di sviluppo.</p>
<!-- raw HTML omitted -->
<p>Concordo con Muir anche se dimentica un dettaglio importante. Molti startupper sono programmatori alle prime armi, spesso ricchi di idee da lanciare rapidamente, ma poveri di capacità tecniche. E’ in questo scenario che linguaggi e tecnologie come Python e Ruby brillano di luce propria rispetto a un ambiente monolitico e piuttosto sofisticato come il .NET Framework. La <!-- raw HTML omitted -->curva di apprendimento<!-- raw HTML omitted --> vincente è quella dei linguaggi open source.</p>
<h3 id="net-è-roba-da-enterprise-e-comunque-microsoft-va-boicottata">.NET è roba da Enterprise (e comunque Microsoft va boicottata)</h3>
<p>Muir sostiene che le startup non usano .NET per motivi culturali più che tecnologici. Voce di popolo vorrebbe che Microsoft sia apprezzata dalle enterprise mentre PHP e Ruby sarebbero l’ideale per le piccole (e sfigate) startup. Questa percezione diffusa influenzerebbe i giovani imprenditori inducendoli ad adottare una piattaforma senza chiedersi quale sia lo strumento migliore per soddisfare le loro necessità.</p>
<p>Le cose stanno anche peggio di così. Specialmente nel mondo giovanile Microsoft è considerata il colosso pachidermico e monopolistico da boicottare in ogni modo. L’immagine non è il punto di forza di Microsoft.</p>
<h4 id="startup-e-enterprise-mondi-diversi">Startup e Enterprise, mondi diversi</h4>
<p>Gran parte delle startup incoraggiano i loro programmatori a imparare un ampio spettro di tecnologie piuttosto che specializzarsi su argomenti (linguaggi) singoli. Per le startup è la scelta giusta poiché dispongono di pochi programmatori e devono rimanere agili e pronte al cambiamento. Le grandi aziende al contrario hanno una cultura ingegneristica e sono organizzate in grandi team, nei quali ogni soggetto tende a essere molto specializzato. Sono differenze importanti che rendono difficile per un programmatore il passaggio da una realtà all’altra.</p>
<h2 id="ampliare-la-propria-prospettiva">Ampliare la propria prospettiva</h2>
<p>Secondo Muir quelli elencati sopra sono i fattori che più di altri condizionano la scelta della piattaforma da adottare. All’inizio della loro carriera i programmatori scelgono un percorso che in seguito diventa difficile cambiare. Il datore di lavoro dovrebbe impegnarsi in prima persona affinché i programmatori mantengano un attegiamento agnostico rispetto alle piattaforme tecnologiche, e siano sempre pronti ad abbracciare nuovi paradigmi e tecnologie.</p>
<!-- raw HTML omitted -->
<p>Su questo punto Muir ha ragione da vendere. In tanti anni di lavoro ho provato sulla mia pelle quanto reale sia il rischio confinarsi nel proprio piccolo mondo. Impegnati nella soluzione dei problemi quotidiani scordiamo che è utile fermarsi ogni tanto e guardarsi intorno. Aggiornarsi su cosa avviene al di fuori del proprio ramo di <em>expertise,</em> consente di sviluppare una migliore visione d’insieme osservando le cose da una prospettiva più ampia.</p>
<h2 id="le-persone-contano-più-della-piattaforma">Le persone contano più della piattaforma</h2>
<p>Perché dunque le Startup non amano .NET Framework? Come abbiamo visto la risposta è tanto tecnica quanto culturale. Qualunque sia la tecnologia adottata, ciò che conta sono le persone che prendete a bordo. Se volete i migliori programmatori su piazza non selezionate specialisti PHP o .NET Framework. Cercate piuttosto persone con esperienze e conoscenze diverse, curiose, che abbiano voglia di imparare e siano pronte a rimettersi in gioco quando serve. Le persone giuste sono quelle capaci di prendere decisioni importanti senza lasciarsi condizionare (solo) dalle competenze già acquisite.</p>
<p><em>Post Scriptum. E se persone con queste caratteristiche non riuscite a trovarle o peggio, non potete permettervele? Non scendete a compromessi. Piuttosto, fate da soli.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Il Progetto Mono salvato in extremis dal suo fondatore</title>
      <link>https://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/</link>
      <pubDate>Tue, 17 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Sono settimane di passione per il &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;progetto Mono&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, celeberrima versione open source e multi piattaforma del Microsoft .NET Framework. All’inizio del mese Attachmate (proprietaria di Novell, sponsor storico del progetto) ha &lt;!-- raw HTML omitted --&gt;improvvisamente licenziato&lt;!-- raw HTML omitted --&gt; l’intero team di ingegneri al lavoro su Mono.&lt;/p&gt;
&lt;p&gt;L’annuncio ha gettato nel panico la comunità internazionale di sviluppatori Mono. Dal 2004, anno di nascita del progetto, migliaia di grandi e piccole software house hanno adottato la piattaforma per lo sviluppo rapido di soluzioni cross-platform. Purtroppo salvo rare eccezioni è frequente che progetti open source nati o assorbiti in grandi organizzazioni commerciali finiscano per essere abbandonati.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Sono settimane di passione per il <strong><!-- raw HTML omitted -->progetto Mono<!-- raw HTML omitted --></strong>, celeberrima versione open source e multi piattaforma del Microsoft .NET Framework. All’inizio del mese Attachmate (proprietaria di Novell, sponsor storico del progetto) ha <!-- raw HTML omitted -->improvvisamente licenziato<!-- raw HTML omitted --> l’intero team di ingegneri al lavoro su Mono.</p>
<p>L’annuncio ha gettato nel panico la comunità internazionale di sviluppatori Mono. Dal 2004, anno di nascita del progetto, migliaia di grandi e piccole software house hanno adottato la piattaforma per lo sviluppo rapido di soluzioni cross-platform. Purtroppo salvo rare eccezioni è frequente che progetti open source nati o assorbiti in grandi organizzazioni commerciali finiscano per essere abbandonati.</p>
<h2 id="xamarin-al-salvataggio-di-mono">Xamarin al salvataggio di Mono</h2>
<p><!-- raw HTML omitted -->Fortunatamente non sembra essere questo il destino di Mono. Miguel de Icaza, il creatore di Mono, ha <!-- raw HTML omitted -->annunciato<!-- raw HTML omitted --> ieri la fondazione di <strong><!-- raw HTML omitted -->Xamarin<!-- raw HTML omitted --></strong>, startup indipendente interamente dedicata a Mono. Sembra di capire che gran parte del team originale stia confluendo nella nuova realtà, che per ovvie ragioni di copyright dovrà per prima cosa lanciare prodotti nuovi destinati a sostituire quelli a marchio Novell. Xamarin è al lavoro sull’allestimento di nuovi componenti .NET per iOS e Android e continuerà a garantire, supportare e sviluppare le piattaforme open source Mono e Moonlight.</p>
<p>La comunità di sviluppatori, incluso chi scrive, aveva accolto con un certo disappunto il lancio delle edizioni per iOS (<!-- raw HTML omitted -->MonoTouch<!-- raw HTML omitted -->) e Android (<!-- raw HTML omitted -->Mono for Android<!-- raw HTML omitted -->) della piattaforma. Si trattava infatti di versioni commerciali, anche piuttosto costose. Resta da vedere se e come Xamarin deciderà di riposizionare l’offerta di questi due importanti componenti. Ora che non c’è più una multinazionale dietro a Mono non mi sorprenderebbe affatto un ritocco verso il basso dei prezzi di listino.</p>]]></content:encoded>
    </item>
    <item>
      <title>Una API ufficiale per Google Page Speed</title>
      <link>https://nicolaiarocci.com/una-api-ufficiale-per-google-page-speed/</link>
      <pubDate>Thu, 12 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/una-api-ufficiale-per-google-page-speed/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Google Page Speed&lt;/strong&gt;, lo strumento che misura la velocità delle pagine web e offre consigli su come migliorarne le prestazioni, dispone da ieri di una sua &lt;!-- raw HTML omitted --&gt;API ufficiale&lt;!-- raw HTML omitted --&gt;. Annunciata nell’ambito di &lt;!-- raw HTML omitted --&gt;Google I/O&lt;!-- raw HTML omitted --&gt;, la API di Page Speed consente di integrare l’analisi delle prestazioni nelle applicazioni proprie. C’è già un plugin per WordPress che la sfrutta, &lt;!-- raw HTML omitted --&gt;W3 Total Cache&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;L’uso effettivo di questa API sarà probabilmente circoscritto a una nicchia piuttosto ristretta, penso soprattutto alle agenzie di consulenza e SEO. Il messaggio utile da portare a casa (se ancora ce ne fosse bisogno) è che &lt;strong&gt;per Google le prestazioni dei siti e della rete in generale sono sempre più un fattore determinante&lt;/strong&gt;, il rapidissimo sviluppo di Page Speed (prima le &lt;!-- raw HTML omitted --&gt;estensioni per browser&lt;!-- raw HTML omitted --&gt;, poi il &lt;!-- raw HTML omitted --&gt;servizio online&lt;!-- raw HTML omitted --&gt; e infine la API) ne è la prova più evidente.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><!-- raw HTML omitted -->Google Page Speed</strong>, lo strumento che misura la velocità delle pagine web e offre consigli su come migliorarne le prestazioni, dispone da ieri di una sua <!-- raw HTML omitted -->API ufficiale<!-- raw HTML omitted -->. Annunciata nell’ambito di <!-- raw HTML omitted -->Google I/O<!-- raw HTML omitted -->, la API di Page Speed consente di integrare l’analisi delle prestazioni nelle applicazioni proprie. C’è già un plugin per WordPress che la sfrutta, <!-- raw HTML omitted -->W3 Total Cache<!-- raw HTML omitted -->.</p>
<p>L’uso effettivo di questa API sarà probabilmente circoscritto a una nicchia piuttosto ristretta, penso soprattutto alle agenzie di consulenza e SEO. Il messaggio utile da portare a casa (se ancora ce ne fosse bisogno) è che <strong>per Google le prestazioni dei siti e della rete in generale sono sempre più un fattore determinante</strong>, il rapidissimo sviluppo di Page Speed (prima le <!-- raw HTML omitted -->estensioni per browser<!-- raw HTML omitted -->, poi il <!-- raw HTML omitted -->servizio online<!-- raw HTML omitted --> e infine la API) ne è la prova più evidente.</p>
<p>In passato ho espresso <!-- raw HTML omitted -->alcune perplessità<!-- raw HTML omitted --> sulla reale applicabilità dei consigli forniti da questi strumenti, tuttavia rimango convinto della loro utilità generale. Proprio in questi giorni sto lavorando alla ottimizzazione del sito del nostro software gestionale e uso Page Speed per valutare i miglioramenti (o peggioramenti!) che riesco a ottenere. Finora ho raggiunto una valutazione di 80/100, partivo da 70 . Stimo di aver guadagnato 4-5 punti grazie ai consigli di Page Speed.</p>
<p>Per maggiori informazioni date una occhiata alla <!-- raw HTML omitted -->Guida per Sviluppatori<!-- raw HTML omitted --> e all’annuncio ufficiale sul <!-- raw HTML omitted -->Google Webmaster Blog<!-- raw HTML omitted -->.</p>]]></content:encoded>
    </item>
    <item>
      <title>Sulla Usabilità delle Password</title>
      <link>https://nicolaiarocci.com/sulla-usabilita-delle-password/</link>
      <pubDate>Wed, 11 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sulla-usabilita-delle-password/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;I consulenti della sicurezza e chi lavora nel mondo IT raccomandano continuamente di usare password complicate e difficili da ricordare. E’ un cattivo consiglio, dato che è perfettamente possibile creare password semplici, facili da ricordare e davvero sicure. In realtà le password semplici sono spesso molto più sicure di quelle complesse.&lt;/p&gt;
&lt;p&gt;Addentriamoci dunque nel mondo delle password e scopriamo come crearne di pratiche e sicure.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->I consulenti della sicurezza e chi lavora nel mondo IT raccomandano continuamente di usare password complicate e difficili da ricordare. E’ un cattivo consiglio, dato che è perfettamente possibile creare password semplici, facili da ricordare e davvero sicure. In realtà le password semplici sono spesso molto più sicure di quelle complesse.</p>
<p>Addentriamoci dunque nel mondo delle password e scopriamo come crearne di pratiche e sicure.</p>
<h2 id="come-scoprire-una-password">Come scoprire una password</h2>
<p>Scoprire una password è davvero semplice. Esistono cinque metodi affidabili per raggiungere l’obiettivo:</p>
<ol>
<li><strong>Domandarla.</strong> E’ incredibile, ma il modo più usato per ottenere la password di qualcuno è domandargliela (spesso in cambio di qualcosa). Le persone dicono spesso la loro password a colleghi, amici e famigliari. In questo caso l’aver adottato password complicate non aiuta di certo.</li>
<li><strong>Indovinarla.</strong> E’ il secondo metodo più usato per accedere a un account. E’ cosa nota che la maggior parte delle persone scelgono password facili da ricordare, e le più semplici sono proprio quelle che in qualche modo hanno a che fare con la persona obiettivo dell’attacco. Password come il vostro cognome, il nome di vostra moglie, il nome del gatto, la data di nascita sono molto frequenti. In questo caso l’unica, ovvia, soluzione è quella di scegliere password che non hanno relazione diretta con la persona.</li>
<li><strong>Attacco a Forza Bruta</strong>. Molto semplice da realizzare. Un hacker tenta l’accesso usando password diverse volta per volta. Se la nostra password è “sun”, lui tenterà di entrare con “aaa, aab, aad … sul, sum, <strong>sun (TROVATA)</strong>“. L’unica cosa che blocca un attacco a forza bruta sono password di maggiore complessità e lunghezza (è proprio a causa di questo tipo di attacco che gli esperti IT le consigliano).</li>
<li><strong>Attacco a Parole Comuni</strong>. Forma semplificata dell’attacco a forza bruta, nel quale l’hacker tenta di accedere ricorrendo a un elenco di parole molto usate. Invece di tentare combinazioni di lettere, l’hacker tenta di accedere con parole intere diverse di volta in volta, come per esempio “sum, summer, summit, sump, <strong>sun (TROVATA)</strong>“.</li>
<li><strong>Attacco a Dizionario</strong>. Stesso principio dell’attacco a parole comuni, solo che questa volta l’hacker usa l’intero dizionario (ci sono circa 500.000 parole nella lingua inglese).</li>
</ol>
<h2 id="quando-la-password-è-sicura">Quando la password è sicura?</h2>
<p>Non puoi proteggerti contro attacchi del tipo “Domandarla” e “Indovinarla”, ma puoi proteggerti bene dalle altre forme di attacco. Un hacker di solito crea uno script automatico o un programma che svolge il lavoro al posto suo. Non ha alcuna intenzione di star seduto al computer tentando manualmente 500.000 parole per scoprire se una di quelle è la tua password.</p>
<p>Ne consegue che l’unità di misura della sicurezza diventa “<strong>quante password può tentare un programma per ogni unità di tempo (per esempio un secondo)?</strong>“. Il numero esatto non è determinabile, ma la maggior parte delle applicazioni non è in grado di gestire più di 100 accessi al secondo.</p>
<p>Ciò significa che per scoprire la password “sun” sono necessari:</p>
<ul>
<li>Forza bruta: <strong>3 minuti</strong></li>
<li>Attacco a Parole Comuni: <strong>3 minuti</strong></li>
<li>Attacco a Dizionario: <strong>1 ora 20 minuti</strong></li>
</ul>
<p><em>Nota: ci sono 17.576 combinazioni di carattere possibili per “sun”. 3 lettere dell’alfabeto minuscolo = 26^3</em></p>
<p>__Quindi “sun” è una password davvero poco sicura, ma quanto tempo deve resistere una password affinché la si possa ritenere davvero sicura?</p>
<ul>
<li>una password che può essere scoperta in <strong>1 minuto</strong> è fin troppo fragile</li>
<li><strong>10 minuti</strong> – ancora troppo fragile</li>
<li><strong>1 ora</strong> – non ancora abbastanza</li>
<li><strong>1 giorno</strong> – cominciamo a ragionare. La probabilità che qualcuno lasci girare un programma per un giorno intero solo per accedere a un singolo account è modesta. Tuttavia non è impossibile.</li>
<li><strong>1 mese</strong> – solo un hacker molto motivato ci proverebbe</li>
<li><strong>1 anno</strong> – passiamo dal rischio reale al rischio teorico. La NASA o la CIA non potrebbero accettare un livello di sicurezza così basso. Il resto di noi, beh – non abbiamo il loro tipo di nemici e la nostra azienda non è certo così allettante.</li>
<li><strong>10 anni</strong> – siamo ormai entrati nel campo della teoria pura</li>
<li><strong>Una vita: 100 anni</strong> – probabilmente questo è un limite accettabile per la maggior parte di noi. Chi si preoccuperebbe per una password che potrebbe resistere fin dopo la sua morte? E’ confortante pensare a una password che è “sicura per tutta la vita”</li>
</ul>
<p>Analizziamo con attenzione il livello “100 anni”. Suona bene e ci fa sentire sicuri. C’è però la possibilità che un hacker sia particolarmente fortunato e trovi la password giusta dopo soli 15 anni di tentativi, invece di 100. Improbabile, ma può succedere.</p>
<p>Alziamo dunque la posta ancora una volta, puntando al massimo. Vogliamo una password che richieda <strong>1.000 anni per essere scoperta</strong>– chiamiamolo livello “<strong>sicuro per sempre</strong>“. Dovrebbe essere abbastanza, no?</p>
<h2 id="creare-password-sicure-e-davvero-utilizzabili">Creare password sicure e davvero utilizzabili</h2>
<p>Ora che abbiamo coperto le basi diamo una occhiata a qualche esempio sul campo, cercando di capire quanto utilizzabile possiamo rendere una password pur mantenendola “sicura per sempre”.</p>
<p><em>Nota: gli esempi sottostanti sono tutti basati su una ipotesi di 100 tentativi di accesso al secondo. Viene riportato l’attacco più efficace per scardinare ogni password – forza bruta, parole comuni o attacco a dizionario.</em></p>
<p>Cominciamo dalla classica password di 6 caratteri</p>
<p>[table id=1 /]</p>
<p>In questo caso la complessità vince chiaramente. Usare una password con caratteri maiuscoli e minuscoli, numeri e simboli è molto sicuro. Usare una semplice parola come password è inutile.</p>
<p>Ciò significa forse che i colleghi dell’IT e i consulenti sulla sicurezza hanno ragione? No. Una password di 6 caratteri non funzionerà comunque. Nessuno è in grado di ricordare una password come “J4fS&lt;2”, il che vuol dire che prima o poi verrà inevitabilmente trascritta su un post-it o altrove.</p>
<p>Se vogliamo password veramente utilizzabili dobbiamo approcciare il problema in modo diverso. Prima di tutto abbiamo bisogno di usare parole che possiamo ricordare, qualcosa di semplice che possiamo scrivere con facilità.</p>
<p>Come queste:</p>
<p>[table id=2 /]</p>
<p>Usare più di una parola per password aumenta significativamente il livello di sicurezza (da 3 minuti a 2 mesi). Tuttavia, usando 3 parole invece di 2 ci ritroviamo con una password estremamente sicura.</p>
<p>Sono necessari:</p>
<ul>
<li>1.163.859 anni per scardinarla con un attacco a forza bruta</li>
<li>2.537 anni con un attacco a parole comuni</li>
<li>39.637.240 anni con un attacco a dizionario</li>
</ul>
<p><strong>E’ 10 volte più sicuro usare “this is fun” come password piuttosto che “J4fS&lt;2”.</strong></p>
<p>Se poi volete stare assurdamente al sicuro, scegliete <strong>parole poco usate</strong> per comporre la vostra password – qualcosa come:</p>
<p>[table id=4 /]</p>
<p>Una password sicura e al tempo stesso davvero utilizzabile non è una password complicata. E’ piuttosto una frase semplice composta da tre o più parole.</p>
<h2 id="non-è-solo-questione-di-password">Non è solo questione di password</h2>
<p>Una cosa è scegliere password sicure e utilizzabili. Un’altra è prevenire gli attacchi degli hacker. Si tratta di un obiettivo semplice da raggiungere. Per impedire che gli script automatici lavorino efficacemente è necessario:</p>
<ol>
<li><strong>Aggiungere una pausa tra i tentativi di accesso.</strong> 5 secondi tra un tentativo e l’altro sono sufficienti. E’ un lasso di tempo abbastanza breve perché non si noti (ci vogliono più di 5 secondi per rendersi conto di aver sbagliato la password e digitarne una nuova). Obbliga l’hacker a un solo tentativo ogni 5 secondi (invece che 100 tentativi al secondo).</li>
<li><strong>Aggiungere una pausa di penalizzazione</strong> se qualcuno inserisce una password sbagliata più di – diciamo – 10 volte. Una penalità di 1 ora è sufficiente. Di nuovo, una azione di questo tipo disturba seriamente qualunque script o programma hacker.</li>
</ol>
<p>Un hacker può scoprire la password “alpine fun” in solo due mesi se è in grado di attaccare il nostro server 100 volte al secondo. Tuttavia con la pausa di 5 secondi tra un tentativo e l’altro la stessa password può resistere all’attacco per 1.889 anni.</p>
<p>[table id=3 /]</p>
<p>Tieni a mente questi concetti la prossima volta che sei al lavoro su applicazioni web o stai discutendo di sicurezza delle password con i tuoi colleghi dell’IT. <strong>Le password possono essere allo stesso tempo sicure e facili da ricordare.</strong></p>
<h3 id="attribuzione">Attribuzione</h3>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio ecco la Beta 2</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-ecco-la-beta-2/</link>
      <pubDate>Tue, 10 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-ecco-la-beta-2/</guid>
      <description>&lt;p&gt;Microsoft ha rilasciato la seconda beta di &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Python Tools per Visual Studio&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, il suo progetto open source che offre agli sviluppatori la possibilità di scrivere codice Python, CPython e IronPython nell’ambiente IDE di Visual Studio 2010.&lt;/p&gt;
&lt;p&gt;Il progetto è stato presentato al &lt;!-- raw HTML omitted --&gt;PyCon 2011&lt;!-- raw HTML omitted --&gt; dal &lt;!-- raw HTML omitted --&gt;Microsoft Technical Computing Group&lt;!-- raw HTML omitted --&gt; ed è davvero ben fatto. Per tutti gli approfondimenti vi rimando al mio articolo &lt;!-- raw HTML omitted --&gt;Programmare in Python con Visual Studio 2010&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Microsoft ha rilasciato la seconda beta di <strong><!-- raw HTML omitted -->Python Tools per Visual Studio<!-- raw HTML omitted --></strong>, il suo progetto open source che offre agli sviluppatori la possibilità di scrivere codice Python, CPython e IronPython nell’ambiente IDE di Visual Studio 2010.</p>
<p>Il progetto è stato presentato al <!-- raw HTML omitted -->PyCon 2011<!-- raw HTML omitted --> dal <!-- raw HTML omitted -->Microsoft Technical Computing Group<!-- raw HTML omitted --> ed è davvero ben fatto. Per tutti gli approfondimenti vi rimando al mio articolo <!-- raw HTML omitted -->Programmare in Python con Visual Studio 2010<!-- raw HTML omitted -->.</p>
<!-- raw HTML omitted -->
<p>Questa nuova release porta in dote una serie di bug fix che rendono più stabile il progetto e nessuna nuova feature. A questo punto la Release Candidate 1, programmata inizialmente per il mese di maggio, subirà probabilmente un leggero slittamento. Immagino che dovremo aspettare almeno il prossimo mese.</p>]]></content:encoded>
    </item>
    <item>
      <title>Siti fluidi coi CSS Framework: Inuit.css</title>
      <link>https://nicolaiarocci.com/siti-fluidi-coi-css-framework-inuit-css/</link>
      <pubDate>Fri, 06 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/siti-fluidi-coi-css-framework-inuit-css/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Dopo l’articolo introduttivo sui &lt;a href=&#34;http://nicolaiarocci.com/costruire-siti-fluidi-coi-css-framework-tiny-fluid-grid/&#34;&gt;siti fluidi e i CSS Framework&lt;/a&gt; è giunta l’ora di dare una occhiata a un framework vero e proprio. Come dicevo prediligo strumenti agili, leggeri, specializzati e possibilmente fatti in casa. Se scelgo un framework quest’ultimo deve essere essenziale, leggero, flessibile. &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Inuit.css&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, ultimo nato nella numerosa e agguerrita famiglia dei Framework CSS, sembra nato apposta per fare di me un uomo felice.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Dopo l’articolo introduttivo sui <a href="http://nicolaiarocci.com/costruire-siti-fluidi-coi-css-framework-tiny-fluid-grid/">siti fluidi e i CSS Framework</a> è giunta l’ora di dare una occhiata a un framework vero e proprio. Come dicevo prediligo strumenti agili, leggeri, specializzati e possibilmente fatti in casa. Se scelgo un framework quest’ultimo deve essere essenziale, leggero, flessibile. <strong><!-- raw HTML omitted -->Inuit.css<!-- raw HTML omitted --></strong>, ultimo nato nella numerosa e agguerrita famiglia dei Framework CSS, sembra nato apposta per fare di me un uomo felice.</p>
<h2 id="flessibilità-e-qualità-prima-di-tutto">Flessibilità e qualità prima di tutto</h2>
<p>Inuit.css è pronto all’uso, se siete di corsa e non avete esigenze particolari potete usarlo così com’è. Quando serve è facile adattarlo al nostro progetto, soprattutto grazie all’alta qualità del <!-- raw HTML omitted -->codice sorgente<!-- raw HTML omitted -->, commentato molto bene. E’ proprio la cura che l’autore ha dedicato alla documentazione l’elemento chiave che ci consente di intervenire rapidamente, eliminando le parti superflue o ritoccando il codice ove necessario.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Qui sopra vedete uno <!-- raw HTML omitted -->snippet<!-- raw HTML omitted --> tratto dal foglio di stile originale. Notate come l’autore si sia preoccupato di fornire indicazioni su come organizzare la gerarchia dei font. Ben fatto!</p>
<h2 id="la-potenza-è-nulla-senza-controllo">La potenza è nulla senza controllo</h2>
<p>Difficilmente Inuit.css prende l’iniziativa, preferisce lasciarla al designer. Prendiamo gli elementi base di HTML5 e CSS3. Inuit.css li supporta ma li isola in classi dedicate che useremo all’occorrenza.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La scelta del basso profilo è apprezzabile. Lascia il controllo nelle nostre mani, ma corre il rischio che – soprattutto al primo impatto – il framework sembri meno ricco rispetto ad altre soluzioni. In effetti non è sulla ricchezza che punta Inuit ma su flessibilità, estensibilità e… mobilità.</p>
<h2 id="tablet-smartphone-e-non-solo">Tablet, smartphone e non solo</h2>
<p><!-- raw HTML omitted -->Il supporto per l’attributo <!-- raw HTML omitted -->@media<!-- raw HTML omitted --> consente a Inuit di ridefinire dinamicamente gran parte delle impostazioni in base al dispositivo (tablet, smartphone, stampante) che consuma la pagina. Il Grid System adottato deriva dal capostipite 960 Grid System (vedi in proposito l’<!-- raw HTML omitted -->articolo precedente<!-- raw HTML omitted -->), supporta matrici (grid) a 12 e 16 colonne e implementa un ingegnoso marchingegno che evita l’inserimento della classica <code>class=end</code> nell’ultima colonna.</p>
<p>A differenza della Tiny Fluid Grid vista la volta scrosa, Inuit è un Framework vero e proprio e supporta ben più della sola Grid. Sono presenti impostazioni predefinite e ben fatte per tutti gli elementi più comuni di una pagina HTML: header, paragrafi, liste numerate e non, tabelle, form, citazioni, link, immagini. Non manca una implementazione del <a href="http://nicolaiarocci.com/eric-meyer-aggiorna-il-suo-famoso-css-reset/" title="Eric Meyer Reset">Eric Meyer CSS Reset</a> e il supporto per la modalità debug che rende visibile la grid sullo sfondo. Una occhiata alla <!-- raw HTML omitted -->pagina demo<!-- raw HTML omitted --> e soprattutto al suo sorgente è sufficiente per rendersi conto di quanti sono gli stili che Inuit.css ci mette a disposizione.</p>
<h2 id="div-idattachment_2410-stylewidth-490px-classwp-caption-aligncenter"><!-- raw HTML omitted --></h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="giovani-di-belle-speranze">Giovani di belle speranze</h2>
<p>Inuit è il nuovo arrivato, ha solo una ventina di giorni ed è in revisione continua. E’ giovane come il suo autore, il ventenne Harry Roberts (l’età non tragga in inganno, Harry è la mente che si cela dietro <!-- raw HTML omitted -->CSS Wizardry<!-- raw HTML omitted -->). Come tutti i giovani di belle speranze Inuit guarda al futuro e se ne frega allegramente del passato: supporta Internet Explorer a partire dalla versione 7 <em>(update del 24.5: la release 1.5 introduce un supporto base per le grid in IE6)</em>.</p>
<p>Dovrà sgomitare un bel pò per conquistarsi uno spazio in una nicchia già affollata da una concorrenza agguerrita. Ha tutte le carte in regola per sfondare, prova ne è il fatto che a pochi giorni dal lancio qualche sito <!-- raw HTML omitted -->qui<!-- raw HTML omitted --> e <!-- raw HTML omitted -->là<!-- raw HTML omitted --> ha già cominciato ad adottarlo.</p>
<p>Se scegliete di usare Inuit nei vostri progetti fatemelo sapere. Chissà, potrebbero finire dritti dritti nella Web Gallery del sito ufficiale.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Shopping Italia è finalmente online</title>
      <link>https://nicolaiarocci.com/google-shopping-italia-e-finalmente-online/</link>
      <pubDate>Tue, 03 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-shopping-italia-e-finalmente-online/</guid>
      <description>&lt;p&gt;A quanto pare da stamattina &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Google Shopping Italia&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, edizione nazionale del più vasto progetto &lt;strong&gt;Google Merchant Center&lt;/strong&gt;,  è operativo. Per provarlo andate su Google.it, eseguite una normale ricerca e cliccate sulla nuova opzione Shopping (oppure fate una ricerca diretta dalla home page di &lt;!-- raw HTML omitted --&gt;Google Shopping&lt;!-- raw HTML omitted --&gt;)&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Dato per imminente &lt;!-- raw HTML omitted --&gt;a febbraio&lt;!-- raw HTML omitted --&gt;, del nuovo canale e-commerce di Google non si erano più avute notizie, tanto che qualcuno cominciava a domandarsi &lt;!-- raw HTML omitted --&gt;che fine avesse fatto&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A quanto pare da stamattina <strong><!-- raw HTML omitted -->Google Shopping Italia<!-- raw HTML omitted --></strong>, edizione nazionale del più vasto progetto <strong>Google Merchant Center</strong>,  è operativo. Per provarlo andate su Google.it, eseguite una normale ricerca e cliccate sulla nuova opzione Shopping (oppure fate una ricerca diretta dalla home page di <!-- raw HTML omitted -->Google Shopping<!-- raw HTML omitted -->)</p>
<!-- raw HTML omitted -->
<p>Dato per imminente <!-- raw HTML omitted -->a febbraio<!-- raw HTML omitted -->, del nuovo canale e-commerce di Google non si erano più avute notizie, tanto che qualcuno cominciava a domandarsi <!-- raw HTML omitted -->che fine avesse fatto<!-- raw HTML omitted -->.</p>
<p>Per informazioni approfondite vi rimando <!-- raw HTML omitted -->all’articolo che scrissi a suo tempo<!-- raw HTML omitted -->, qui mi limito a segnalarvi il link per <!-- raw HTML omitted -->creare un account<!-- raw HTML omitted -->, registrare i prodotti e impostare il proprio negozio su Google Shopping.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Costruire siti fluidi coi CSS Framework: Tiny Fluid Grid</title>
      <link>https://nicolaiarocci.com/costruire-siti-fluidi-coi-css-framework-tiny-fluid-grid/</link>
      <pubDate>Fri, 29 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/costruire-siti-fluidi-coi-css-framework-tiny-fluid-grid/</guid>
      <description>&lt;p&gt;Fino a non molti anni fa la gamma di risoluzioni video disponibili alla gran parte degli utenti era piuttosto limitata, tanto che nel disegnare siti web non ci si preoccupava granché di questo aspetto. La diffusione di massa di monitor wide, netbooks, tablet e smartphone ha cambiato rapidamente le carte in tavola. Per raggiungere con efficienza il loro pubblico i siti odierni devono essere capaci di adattare il loro aspetto alla risoluzione del dispositivo usato dal visitatore. Devono, in una parola, essere &lt;em&gt;fluidi&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;il-grid-design-e-l8217era-dei-css-framework&#34;&gt;Il Grid Design e l’era dei CSS Framework&lt;/h2&gt;
&lt;p&gt;L’avvento dei CSS Framework si deve (principalmente) alla necessità di soddisfare l’esigenza di fluidità. Il capostipite, se non in ordine cronologico senz’altro per l’influenza che ha avuto, è il &lt;!-- raw HTML omitted --&gt;960 Grid System&lt;!-- raw HTML omitted --&gt;. Altri prodotti famosi, per citarne solo un paio, sono &lt;!-- raw HTML omitted --&gt;Blueprint&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;Emastic&lt;!-- raw HTML omitted --&gt;. Questi framework hanno in comune l’obiettivo di velocizzare creazione, gestione e manutenzione dei fogli di stile ma se andiamo al nocciolo della questione ci accorgiamo che tutti si basano sul concetto chiave di &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Grid Design&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Fino a non molti anni fa la gamma di risoluzioni video disponibili alla gran parte degli utenti era piuttosto limitata, tanto che nel disegnare siti web non ci si preoccupava granché di questo aspetto. La diffusione di massa di monitor wide, netbooks, tablet e smartphone ha cambiato rapidamente le carte in tavola. Per raggiungere con efficienza il loro pubblico i siti odierni devono essere capaci di adattare il loro aspetto alla risoluzione del dispositivo usato dal visitatore. Devono, in una parola, essere <em>fluidi</em>.</p>
<h2 id="il-grid-design-e-l8217era-dei-css-framework">Il Grid Design e l’era dei CSS Framework</h2>
<p>L’avvento dei CSS Framework si deve (principalmente) alla necessità di soddisfare l’esigenza di fluidità. Il capostipite, se non in ordine cronologico senz’altro per l’influenza che ha avuto, è il <!-- raw HTML omitted -->960 Grid System<!-- raw HTML omitted -->. Altri prodotti famosi, per citarne solo un paio, sono <!-- raw HTML omitted -->Blueprint<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Emastic<!-- raw HTML omitted -->. Questi framework hanno in comune l’obiettivo di velocizzare creazione, gestione e manutenzione dei fogli di stile ma se andiamo al nocciolo della questione ci accorgiamo che tutti si basano sul concetto chiave di <strong><!-- raw HTML omitted -->Grid Design<!-- raw HTML omitted --></strong>:</p>
<blockquote>
<p>Una griglia tipografica è una struttura bidimensionale composta da una serie di guide verticali e orizzontali intersecanti (matrice) usata per organizzare il contenuto della pagina. La griglia offre una traccia sulla quale il designer può organizzare testo e immagini in maniera ordinata e razionale (<!-- raw HTML omitted -->Wikipedia<!-- raw HTML omitted -->)</p></blockquote>
<p>Niente di nuovo, i tipografi hanno usato questa tecnica per secoli. Il Grid Design in declinazione web è fluido: le colonne (e gli spazi tra le colonne) che compongono la matrice sono capaci di adattarsi alla risoluzione dell schermo.</p>
<p>Gran parte dei CSS Framework non si limitano a implementare versioni più o meno sofisticate del Grid System ma offrono una serie di servizi aggiuntivi nel tentativo di risparmiare al designer i compiti più ripetitivi e tediosi. Non sempre ci riescono. Ogni sito ha esigenze specifiche e ogni designer abitudini consolidate. E’ difficile che una soluzione standard sia l’ideale per ogni esigenza. Spesso preferisco la via di mezzo: strumenti agili che consentono di portare a casa rapidamente il risultato senza aggiungere (molto) più del necessario.</p>
<p>In questa mini-serie di tre articoli prenderò in esame tre diverse soluzioni che implementano il Grid Design e che ci permettono di implementare, con diversi gradi di complessità (e numero di funzionalità), pagine web fluide.</p>
<h2 id="tiny-fluid-grid">Tiny Fluid Grid</h2>
<!-- raw HTML omitted -->
<p>Se non altro amerete questa soluzione a causa del suo design: il sito è oggettivamente splendido. E facile da usare. In effetti <strong><!-- raw HTML omitted -->Tiny Fluid Grid<!-- raw HTML omitted --></strong> non è un CSS Framework vero e proprio ma una semplice soluzione interattiva che vi consente, agendo su tre semplici regolazioni (numero di colonne, spazio tra le colonne e larghezza dell’area client), di configurare online la vostra CSS grid. Il pulsante Preview offre una anteprima (anch’essa interattiva) della grid. L’unica altra opzione disponibile è il Download. Otterrete un archivio compresso che contiene due files: il foglio di stile <em>grid.css</em> e un <em>index.html</em> che contiene un esempio d’uso della grid appena creata:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Una occhiata al foglio di stile ci consente di capire la struttura della grid</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Una classe per ogni larghezza di colonna. Poiché larghezza e margini delle colonne sono espressi in percentuale la nostra grid si adatta alla risoluzione dello schermo, con i limiti imposti dagli attributi <code>min-width</code> e <code>max-width</code>. L’implementazione lato HTML è banale (tralascio le parti non rilevanti):</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La nostra grid è contenuta in un div di classe “container”. Le colonne sono a loro volta dei div. Per ottenere più colonne nella stessa riga dobbiamo assicurarci che la somma dei numeri contenuti nel nome di ogni classe (<em>grid_x</em>) sia uguale al numero di colonne di cui è composta la grid. Nel nostro caso la seconda riga è composta da tre div <em>grid_4</em> (4×3=12); la terza riga da due colonne: grid_3 e grid_9 (3+9=12). Semplice no? Naturalmente possiamo ritoccare il foglio di stile come vogliamo, adattandolo alle nostre esigenze.</p>
<p>Nel prossimo articolo della serie affronteremo un CSS Framework vero e proprio, anche questo snello e semplice da usare. Se ancora non l’avete fatto abbonatevi al <!-- raw HTML omitted -->feed RSS<!-- raw HTML omitted --> per non perdere la prossima puntata, oppure iscrivetevi alla mailing list (riquadro in alto a destra). Mi raccomando!</p>]]></content:encoded>
    </item>
    <item>
      <title>Avviare un Download con richiesta di nome file da una pagina ASP.NET</title>
      <link>https://nicolaiarocci.com/avviare-un-download-con-richiesta-di-nome-file-da-una-pagina-asp-net/</link>
      <pubDate>Wed, 27 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/avviare-un-download-con-richiesta-di-nome-file-da-una-pagina-asp-net/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Normalmente quando un visitatore clicca su un link che punta a un file, quest’ultimo viene mostrato nel browser e non viene avviato alcun download. Questo succede perché il browser determina il tipo di contenuto in base alla estensione del file. Quando clicchiamo su un file con estensione jpg il browser sa che si tratta di una immagine e la mostra direttamente. Lo stesso avviene per i file pdf e così via.&lt;/p&gt;
&lt;p&gt;Può capitare che questo comportamento non sia quello desiderato. Oggi &lt;!-- raw HTML omitted --&gt;al lavoro&lt;!-- raw HTML omitted --&gt; ho implementato una funzionalità interessante: il download della versione PDF di una pagina web. Il pdf viene costruito dinamicamente nel momento stesso in cui il visitatore clicca un link. Questo accorgimento libera il webmaster dalla tediosa (e facilmente dimenticabile) necessità di rigenerare il pdf ad ogni minimo ritocco della pagina.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Volevo che cliccando sul link si avviasse automaticamente il download, così da ‘costringere’ l’utente a interagire col PDF in un secondo tempo rispetto all’esperienza di navigazione. Se scarichi un PDF è per stamparlo o consultarlo con calma o magari passarlo a un collega, no?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Normalmente quando un visitatore clicca su un link che punta a un file, quest’ultimo viene mostrato nel browser e non viene avviato alcun download. Questo succede perché il browser determina il tipo di contenuto in base alla estensione del file. Quando clicchiamo su un file con estensione jpg il browser sa che si tratta di una immagine e la mostra direttamente. Lo stesso avviene per i file pdf e così via.</p>
<p>Può capitare che questo comportamento non sia quello desiderato. Oggi <!-- raw HTML omitted -->al lavoro<!-- raw HTML omitted --> ho implementato una funzionalità interessante: il download della versione PDF di una pagina web. Il pdf viene costruito dinamicamente nel momento stesso in cui il visitatore clicca un link. Questo accorgimento libera il webmaster dalla tediosa (e facilmente dimenticabile) necessità di rigenerare il pdf ad ogni minimo ritocco della pagina.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Volevo che cliccando sul link si avviasse automaticamente il download, così da ‘costringere’ l’utente a interagire col PDF in un secondo tempo rispetto all’esperienza di navigazione. Se scarichi un PDF è per stamparlo o consultarlo con calma o magari passarlo a un collega, no?</p>
<p>Costringere l’utente a usare il menu contestuale del browser (<em>Salva link con nome..</em>) non è certo la scelta ideale dal punto di vista dell’esperienza utente, tanto più che in questo caso il link non è statico e invoca codice JavaScript. Per ottenere il risultato desiderato dobbiamo inviare direttamente il file all’utente. [cci_asp theme=”standard”]Response.TransmitFile()[/cci_asp] è il metodo che invia il file dall’applicazione ASP.NET al client, ma prima dobbiamo preoccuparci di aggiungere un paio di header al nostro messaggio di output:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>E’ importante fornire il ContentType corretto altrimenti il browser non sarà sempre in grado di gestire i contenuti del file. Internet Explorer per esempio offre l’opzione di aprire direttamente il file (verrà scaricato nella cache). Nel nostro caso se l’utente sceglie l’apertura diretta IE lancerà Acrobat Reader perché ContentType è <em>application/pdf</em>.</p>
<p>Altro accorgimento è la chiamata al metodo Path.GetFileName() in riga 7. Non sarebbe necessario se non fosse che <em>taluni broswer arcaici e superati</em> (ogni riferimento a IE è naturalmente voluto) non sono in grado di gestire intelligentemente il filename e, quando propongono il nome del file da salvare, riproducono l’intero path del file sul server. Questo comportamento tra l’altro è pericoloso perché espone l’intera struttura  del sito, dalla radice al folder che contiene la pagina, al visitatore.</p>
<p>Se la routine deve essere usata in un modulo e non direttamente in una pagina aspx ricordate di sostituire Response con HttpContect.Current.Response. Buon lavoro!</p>]]></content:encoded>
    </item>
    <item>
      <title>Servire 500 milioni di utenti con Python e Django</title>
      <link>https://nicolaiarocci.com/servire-500-milioni-di-utenti-al-mese-con-python-e-django/</link>
      <pubDate>Wed, 20 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/servire-500-milioni-di-utenti-al-mese-con-python-e-django/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;A &lt;!-- raw HTML omitted --&gt;PyCon 2011&lt;!-- raw HTML omitted --&gt;, la conferenza mondiale sul linguaggio Python che si è conclusa da poco ad Atlanta, gli ingegneri di &lt;!-- raw HTML omitted --&gt;DISQUS&lt;!-- raw HTML omitted --&gt; hanno presentato una interessante relazione sulla loro infrastruttura hardware e software. DISQUS è un servizio di gestione dei commenti adottato da centinaia di migliaia di siti nel mondo. Tra i clienti figurano nomi importanti come CNN, MTV, IGN, Engadget, Mashable e tanti altri. Nel mese di marzo 2011 il network DISQUS ha gestito &lt;strong&gt;500 milioni di visitatori unici&lt;/strong&gt;. Questi volumi sono gestiti da una azienda che vanta &lt;strong&gt;16 addetti, dei quali solo 8 (otto!) ingegneri software&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Come è possibile tutto ciò? Gran parte del merito va attribuito al metodo produttivo adottato da DISQUS: &lt;!-- raw HTML omitted --&gt;metodologia agile&lt;!-- raw HTML omitted --&gt;, hardware in affitto e facilmente scalabile, grande fiducia nella capacità dei propri talenti: ognuno degli otto ingegneri è anche product manager. Secondo DISQUS tutto questo è stato possibile anche e soprattutto grazie a una scelta che si è rivelata determinante: l’adozione del linguaggio &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;Python&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt; e del web framework &lt;!-- raw HTML omitted --&gt;Django&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->A <!-- raw HTML omitted -->PyCon 2011<!-- raw HTML omitted -->, la conferenza mondiale sul linguaggio Python che si è conclusa da poco ad Atlanta, gli ingegneri di <!-- raw HTML omitted -->DISQUS<!-- raw HTML omitted --> hanno presentato una interessante relazione sulla loro infrastruttura hardware e software. DISQUS è un servizio di gestione dei commenti adottato da centinaia di migliaia di siti nel mondo. Tra i clienti figurano nomi importanti come CNN, MTV, IGN, Engadget, Mashable e tanti altri. Nel mese di marzo 2011 il network DISQUS ha gestito <strong>500 milioni di visitatori unici</strong>. Questi volumi sono gestiti da una azienda che vanta <strong>16 addetti, dei quali solo 8 (otto!) ingegneri software</strong>.</p>
<p>Come è possibile tutto ciò? Gran parte del merito va attribuito al metodo produttivo adottato da DISQUS: <!-- raw HTML omitted -->metodologia agile<!-- raw HTML omitted -->, hardware in affitto e facilmente scalabile, grande fiducia nella capacità dei propri talenti: ognuno degli otto ingegneri è anche product manager. Secondo DISQUS tutto questo è stato possibile anche e soprattutto grazie a una scelta che si è rivelata determinante: l’adozione del linguaggio <!-- raw HTML omitted --><!-- raw HTML omitted -->Python<!-- raw HTML omitted --><!-- raw HTML omitted --> e del web framework <!-- raw HTML omitted -->Django<!-- raw HTML omitted -->.</p>
<h2 id="il-video-della-conferenza">Il video della conferenza</h2>
<p>Fortunatamente gran parte dei contenuti di PyCon 2011 sono disponibili al pubblico sotto forma di registrazioni audio-video e di slideshow. In questo filmato possiamo seguire Jason Yan e David Cramer (due dei super-otto, quanto sono giovani!) nel corso della loro conferenza.</p>
<!-- raw HTML omitted -->
<h2 id="le-slides">Le slides</h2>
<p>Se non avete tempo (o voglia) per seguire l’intera lezione potete sempre dare una occhiata a queste slides che spiegano in maniera concisa il processo di sviluppo e deployment e, soprattutto, pregi e difetti del lavoro con Python. Curioso come molti di loro abbiano cominciato da Django prima ancora di imparare Python! E’ un po’ la dimostrazione che prima viene il talento, poi il know-how.</p>
<!-- raw HTML omitted -->
<h2 id="una-questione-di-metodo">Una questione di metodo</h2>
<p>Da molti Python è considerato un linguaggio inadatto a gestire siti con grande traffico o applicazioni molto impegnative sotto il profilo delle prestazioni. L’esperienza DISQUS dimostra platealmente il contrario. In un prossimo articolo mi riprometto di approfondire la questione Python/Prestazioni. Se qualcuno vuol dire la sua in proposito è il benvenuto (sia sotto forma di commento che di <em>guest post</em> eventualmente).</p>]]></content:encoded>
    </item>
    <item>
      <title>Vuoi lavorare in una Startup italiana?</title>
      <link>https://nicolaiarocci.com/vuoi-lavorare-in-una-startup-italiana/</link>
      <pubDate>Sat, 16 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/vuoi-lavorare-in-una-startup-italiana/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Italian Startup Scene&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; è un &lt;em&gt;“gruppo di ritrovo degli startupper italiani. Imprenditori, investitori, bloggers, sviluppatori e chiunque abbia un interesse per startups e venture capital”&lt;/em&gt;. Si tratta di una risorsa da non perdere se vi interessate alla scena startup italiana, che esiste ed è viva e vegeta malgrado molti (senza aver mai guardato al di là del proprio steccato) sostengano il contrario o non facciano altro che guardare alla remota Silicon Valley.&lt;/p&gt;
&lt;p&gt;Fondata da alcuni degli startupper più affermati e frequentata da quasi 2.000 utenti, molti dei quali attivamente coinvolti in progetti di startup, ISS è il posto ideale per chiedere &lt;strong&gt;consigli&lt;/strong&gt;, proporre e &lt;strong&gt;discutere idee&lt;/strong&gt;, &lt;strong&gt;cercare collaborazioni&lt;/strong&gt; e chissà, &lt;strong&gt;trovare finanziamenti&lt;/strong&gt; per i vostri progetti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><!-- raw HTML omitted -->Italian Startup Scene<!-- raw HTML omitted --></strong> è un <em>“gruppo di ritrovo degli startupper italiani. Imprenditori, investitori, bloggers, sviluppatori e chiunque abbia un interesse per startups e venture capital”</em>. Si tratta di una risorsa da non perdere se vi interessate alla scena startup italiana, che esiste ed è viva e vegeta malgrado molti (senza aver mai guardato al di là del proprio steccato) sostengano il contrario o non facciano altro che guardare alla remota Silicon Valley.</p>
<p>Fondata da alcuni degli startupper più affermati e frequentata da quasi 2.000 utenti, molti dei quali attivamente coinvolti in progetti di startup, ISS è il posto ideale per chiedere <strong>consigli</strong>, proporre e <strong>discutere idee</strong>, <strong>cercare collaborazioni</strong> e chissà, <strong>trovare finanziamenti</strong> per i vostri progetti.</p>
<p>Italian Startup Scene è organizzata come <!-- raw HTML omitted -->Gruppo Facebook<!-- raw HTML omitted --> – in effetti si tratta dell’unica risorsa Facebook che frequento assiduamente. La lettura del gruppo è libera ma dovete iscrivervi per partecipare alle discussioni che sono molte, interessanti e pertinenti – astenersi perditempo! In queste settimane stanno nascendo i sotto gruppi regionali che servono ad agevolare conoscenze e scambi di informazioni tra gli utenti che vivono vicini.</p>
<!-- raw HTML omitted -->
<h2 id="lavorare-per-una-startup-italiana">Lavorare per una Startup italiana</h2>
<p>Ma il progetto ISS di cui voglio parlarvi, anche perché è nato un po’ in sordina e credo meriti maggiore attenzione, è <!-- raw HTML omitted -->Jobs for Geeks<!-- raw HTML omitted -->. Si tratta di una bella bacheca interattiva dove le startup italiane propongono impieghi di ogni genere: programmatori, designer, esperti commerciali, managers e testers. A sottolineare lo spirito originale di ISS è presente anche il panel per la ricerca di soci fondatori. Nel momento in cui scrivo il panel <!-- raw HTML omitted -->Programmatori<!-- raw HTML omitted --> conta 9 posizioni disponibili.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Trattandosi quasi sempre di startup che operano nel campo delle tecnologie e della rete è facile trovare disponibilità per ogni tipo di collaborazione: part-time, freelance, remote. Non si tratta di offerte di lavoro canoniche neanche dal punto di vista della retribuzione. In tipico stile startup c’è chi cerca, per esempio, un .NET Developer che partecipi a un progetto senz’altro interessante ma attenzione, <em>“Niente retribuzione, per ora, tanto affetto e tanta simpatia :)”</em></p>
<p>Niente male davvero.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il reddit dei programmatori italiani</title>
      <link>https://nicolaiarocci.com/il-reddit-dei-programmatori-italiani/</link>
      <pubDate>Wed, 13 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-reddit-dei-programmatori-italiani/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Reddit&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; è un servizio di condivisione, votazione e discussione delle risorse in rete. In tempi recenti è diventato uno dei punti di riferimento della comunità internazionale degli &lt;!-- raw HTML omitted --&gt;alpha-geek&lt;!-- raw HTML omitted --&gt;, sbaragliando una concorrenza agguerrita e ben radicata.&lt;/p&gt;
&lt;p&gt;Reddit ha conquistato un pubblico particolarmente ostico ed esigente grazie alla sua caratteristica più peculiare: essere un &lt;strong&gt;sistema aperto&lt;/strong&gt;. Potremmo definire Reddit una semplice infrastruttura lasciata in gestione agli utenti, i quali ricambiano dedicandosi con dedizione alla cura dei contenuti. Su Reddit chiunque in pochi secondi può creare un’area nuova dedicata a un argomento non ancora trattato. Se il tema è valido i contributi arrivano: segnalazioni di nuove risorse (articoli, tutorial, opinioni), votazioni e discussioni spesso vivaci. Reddit è un po’ Wikipedia, un po’ Facebook e un po’ Twitter.&lt;/p&gt;
&lt;p&gt;La scommessa è quella di una selezione naturale dei contenuti, compiuta dai loro diretti destinatari e non (solo) dagli autori, come succede nel caso degli aggregatori di notizie.&lt;/p&gt;
&lt;h2 id=&#34;reddit-in-italia&#34;&gt;Reddit in Italia&lt;/h2&gt;
&lt;p&gt;In Italia Reddit è ancora poco conosciuto, ma qualcosa sta cambiando.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><strong><!-- raw HTML omitted -->Reddit<!-- raw HTML omitted --></strong> è un servizio di condivisione, votazione e discussione delle risorse in rete. In tempi recenti è diventato uno dei punti di riferimento della comunità internazionale degli <!-- raw HTML omitted -->alpha-geek<!-- raw HTML omitted -->, sbaragliando una concorrenza agguerrita e ben radicata.</p>
<p>Reddit ha conquistato un pubblico particolarmente ostico ed esigente grazie alla sua caratteristica più peculiare: essere un <strong>sistema aperto</strong>. Potremmo definire Reddit una semplice infrastruttura lasciata in gestione agli utenti, i quali ricambiano dedicandosi con dedizione alla cura dei contenuti. Su Reddit chiunque in pochi secondi può creare un’area nuova dedicata a un argomento non ancora trattato. Se il tema è valido i contributi arrivano: segnalazioni di nuove risorse (articoli, tutorial, opinioni), votazioni e discussioni spesso vivaci. Reddit è un po’ Wikipedia, un po’ Facebook e un po’ Twitter.</p>
<p>La scommessa è quella di una selezione naturale dei contenuti, compiuta dai loro diretti destinatari e non (solo) dagli autori, come succede nel caso degli aggregatori di notizie.</p>
<h2 id="reddit-in-italia">Reddit in Italia</h2>
<p>In Italia Reddit è ancora poco conosciuto, ma qualcosa sta cambiando.</p>
<p>Il reddit</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->/r/italy<!-- raw HTML omitted --><!-- raw HTML omitted --> propone solo contenuti italiani e al momento in cui scrivo sta per toccare i 1.000 lettori. Stanno nascendo altri reddit italiani, alcuni <!-- raw HTML omitted -->davvero curiosi<!-- raw HTML omitted --> e uno molto interessante.</p>
<h2 id="il-reddit-dei-programmatori-italiani">Il reddit dei programmatori italiani</h2>
<p>Il mio personale contributo alla diffusione di Reddit nel nostro paese è <strong><!-- raw HTML omitted -->/r/programmazione<!-- raw HTML omitted --></strong>. Platealmente ispirato alla <!-- raw HTML omitted -->controparte inglese<!-- raw HTML omitted -->, <code>Programmazione</code> è nato inizialmente come tentativo di rispondere a una mia esigenza personale: raccogliere in modo organizzato le migliori risorse italiane su programmazione, web design, posizionamento siti web (SEO) e dintorni. Articoli, tutorial, riflessioni, approfondimenti e notizie, purché pertinenti, sono tutti benvenuti. Partecipare è facile e poco impegnativo. Votate i contenuti più (o meno) interessanti e, se volete, segnalate i vostri link preferiti.</p>
<p>Se riusciremo ad attirare un pubblico abbastanza numeroso potremmo contribuire, nel tempo, alla creazione di una risorsa interessante per la comunità italiana.</p>]]></content:encoded>
    </item>
    <item>
      <title>Come scoprire i font di una pagina web?</title>
      <link>https://nicolaiarocci.com/come-scoprire-i-font-di-una-pagina-web/</link>
      <pubDate>Fri, 08 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-scoprire-i-font-di-una-pagina-web/</guid>
      <description>&lt;p&gt;Volete scoprire rapidamente quali sono i font usati su una pagina web? Ho scovato quasi per caso &lt;strong&gt;&lt;a href=&#34;http://chengyinliu.com/whatfont.html&#34;&gt;WhatFont&lt;/a&gt;&lt;/strong&gt;, un &lt;!-- raw HTML omitted --&gt;bookmarklet &lt;!-- raw HTML omitted --&gt;davvero facile da usare. Basta trascinarlo sulla barra degli indirizzi del browser e l’installazione è fatta. Navigate sulle pagine che vi interessano e attivate WhatFont con un click. Da quel momento spostando il puntatore sui vari elementi della pagina ne vedrete il font in sovraimpressione. Comodo e veloce.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Volete scoprire rapidamente quali sono i font usati su una pagina web? Ho scovato quasi per caso <strong><a href="http://chengyinliu.com/whatfont.html">WhatFont</a></strong>, un <!-- raw HTML omitted -->bookmarklet <!-- raw HTML omitted -->davvero facile da usare. Basta trascinarlo sulla barra degli indirizzi del browser e l’installazione è fatta. Navigate sulle pagine che vi interessano e attivate WhatFont con un click. Da quel momento spostando il puntatore sui vari elementi della pagina ne vedrete il font in sovraimpressione. Comodo e veloce.</p>
<!-- raw HTML omitted -->
<p>Se per trovare ispirazione amate curiosare nel lavoro degli altri questo è proprio l’oggettino che fa per voi. Se siete programmatori continuerete a usare Firebug ****o Webkit Inspector ma questo strumento è talmente comodo che potreste decidere di aggiungerlo comunque ai vostri strumenti preferiti.</p>]]></content:encoded>
    </item>
    <item>
      <title>Inserire un marchio nelle immagini via JavaScript</title>
      <link>https://nicolaiarocci.com/il-marchio-nelle-immagini-via-javascript/</link>
      <pubDate>Tue, 05 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-marchio-nelle-immagini-via-javascript/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://www.patrick-wied.at/static/watermarkjs/&#34;&gt;Watermark.js&lt;/a&gt;&lt;/strong&gt; è una libreria JavaScript che aggiunge un &lt;!-- raw HTML omitted --&gt;watermark&lt;!-- raw HTML omitted --&gt; (letteralmente &lt;em&gt;filigrana&lt;/em&gt;, ovvero un logo o un marchio) alle immagini presenti sulle pagine web. Contrassegnare le immagini in modo permanente è utile a proteggerle dalla copia oppure, al contrario, ad approfittare della loro riproduzione per diffondere un marchio (&lt;a href=&#34;http://en.wikipedia.org/wiki/Brand_awareness&#34;&gt;brand awareness&lt;/a&gt;). Usare watermark.js è semplice, vediamo quanto.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;come-usare-watermarkjs&#34;&gt;Come usare watermark.js&lt;/h2&gt;
&lt;p&gt;La libreria innesta il marchio nelle immagini marcate con la classe CSS “watermark”. Se il nome della classe non piace è possibile cambiarlo. Se il nostro watermark è in formato JPG la libreria aggiunge per noi un livello di trasparenza, altrimenti possiamo fornirle i più idonei formati PNG e GIF.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><a href="http://www.patrick-wied.at/static/watermarkjs/">Watermark.js</a></strong> è una libreria JavaScript che aggiunge un <!-- raw HTML omitted -->watermark<!-- raw HTML omitted --> (letteralmente <em>filigrana</em>, ovvero un logo o un marchio) alle immagini presenti sulle pagine web. Contrassegnare le immagini in modo permanente è utile a proteggerle dalla copia oppure, al contrario, ad approfittare della loro riproduzione per diffondere un marchio (<a href="http://en.wikipedia.org/wiki/Brand_awareness">brand awareness</a>). Usare watermark.js è semplice, vediamo quanto.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="come-usare-watermarkjs">Come usare watermark.js</h2>
<p>La libreria innesta il marchio nelle immagini marcate con la classe CSS “watermark”. Se il nome della classe non piace è possibile cambiarlo. Se il nostro watermark è in formato JPG la libreria aggiunge per noi un livello di trasparenza, altrimenti possiamo fornirle i più idonei formati PNG e GIF.</p>
<p>Prima di tutto inseriamo il riferimento allo script. E’ consigliabile inserirlo in fondo alla pagina, subito prima della chiusura del tag</p>
<p><code>body</code></p>
<!-- raw HTML omitted -->
<p>Al caricamento della pagina chiamamo il metodo <code>wmark.init</code></p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La variabile <code>load</code> agisce come un flag e serve a evitare che il codice venga eseguito ad ogni postback. Infine aggiorniamo i tag HTML delle immagini a cui vogliamo aggiungere il nostro watermark</p>
<!-- raw HTML omitted -->
<p>E questo è tutto.</p>
<p>Sul <!-- raw HTML omitted -->sito ufficiale<!-- raw HTML omitted --> sono disponibili un paio di demo funzionanti. La <!-- raw HTML omitted -->seconda<!-- raw HTML omitted --> mostra un uso senz’altro originale della libreria: l’inserimento di <!-- raw HTML omitted -->Codici QR<!-- raw HTML omitted --> nelle immagini. Trattandosi di un progetto open source è possibile scaricare anche il <!-- raw HTML omitted -->codice sorgente<!-- raw HTML omitted --> di watermark.js.</p>
<h2 id="non-tutto-è-oro-quel-che-luccica">Non tutto è oro quel che luccica</h2>
<p>Essendo implementata lato client, la protezione delle immagini non è certo garantita al cento per cento. Dobbiamo decidere cosa è più importante, l’inviolabilità delle nostre immagini o la comodità di non doverle ritoccare prima di inviarle al server. Altro fattore da non trascurare è il calo di prestazioni. Il codice JavaScript deve caricare il watermark e inserirlo nell’immagine originale. Il tempo di caricamento potrebbe risentirne, soprattutto nel caso di pagine ricche di immagini.</p>
<p>Watermark.js è un progetto interessante e ingegnoso che va usato tenendo ben presente i suoi pregi e tutte le possibili controindicazioni.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Speed ora è anche Online</title>
      <link>https://nicolaiarocci.com/google-speed-ora-e-anche-online/</link>
      <pubDate>Sat, 02 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-speed-ora-e-anche-online/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;A una settimana esatta dall’uscita della &lt;a href=&#34;http://nicolaiarocci.com/google-page-speed-ora-gira-anche-su-chrome/&#34;&gt;estensione per Chrome di Page Speed&lt;/a&gt; Google stupisce tutti aprendo al pubblico &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Speed Online&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, versione web del suo servizio di analisi delle performance dei siti. La versione &lt;em&gt;live&lt;/em&gt; di Google Speed non si limita a misurare la velocità delle pagine ma offre consigli per migliorarne le prestazioni, come già fatto dalle estensioni Firefox e Chrome.&lt;/p&gt;
&lt;p&gt;In questi giorni ho avuto modo di testare Page Speed per Chrome su un certo numero di siti, sia sviluppati da me che da altri. Mi sono reso conto che non sempre i consigli, pur validi, sono facilmente applicabili. Molte inefficienze non sono sotto il nostro controllo perché i contenuti sono forniti da terze parti – annunci pubblicitari, pulsanti, widgets e così via. La stessa Google ha &lt;a href=&#34;http://adsense.blogspot.com/2011/03/making-web-faster-for-all-adsense-for.html&#34;&gt;ottimizzato le prestazioni di AdSense&lt;/a&gt; solo recentemente, prima non era certo un fulmine di guerra.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->A una settimana esatta dall’uscita della <a href="http://nicolaiarocci.com/google-page-speed-ora-gira-anche-su-chrome/">estensione per Chrome di Page Speed</a> Google stupisce tutti aprendo al pubblico <strong><!-- raw HTML omitted -->Speed Online<!-- raw HTML omitted --></strong>, versione web del suo servizio di analisi delle performance dei siti. La versione <em>live</em> di Google Speed non si limita a misurare la velocità delle pagine ma offre consigli per migliorarne le prestazioni, come già fatto dalle estensioni Firefox e Chrome.</p>
<p>In questi giorni ho avuto modo di testare Page Speed per Chrome su un certo numero di siti, sia sviluppati da me che da altri. Mi sono reso conto che non sempre i consigli, pur validi, sono facilmente applicabili. Molte inefficienze non sono sotto il nostro controllo perché i contenuti sono forniti da terze parti – annunci pubblicitari, pulsanti, widgets e così via. La stessa Google ha <a href="http://adsense.blogspot.com/2011/03/making-web-faster-for-all-adsense-for.html">ottimizzato le prestazioni di AdSense</a> solo recentemente, prima non era certo un fulmine di guerra.</p>
<p>Altri suggerimenti sono alla nostra portata ma quando ci mettiamo al lavoro ci rendiamo conto che rischiamo di impiegare un mucchio di tempo per ottenere miglioramenti appena percettibili. Un esempio? Il consiglio di combinare le diverse immagini di una pagina in un singolo sprite CSS. E’ abbastanza veloce raccogliere in un file tutte le immagini ma quando ci mettiamo a cambiare il codice HTML, CSS e JavaScript per caricare le porzioni dello sprite nei posti giusti ecco che il tempo necessario a portare a termine (e testare) il lavoro si dilata inesorabilmente.</p>
<p>Finché si lavora su pagine semplici i consigli di servizi come Page Speed (una menzione d’onore la merita <!-- raw HTML omitted --><!-- raw HTML omitted -->YSlow<!-- raw HTML omitted --><!-- raw HTML omitted -->) sono rapidi da implementare. Quando si tratta di ottimizzare siti complessi le cose si fanno più complicate. Il problema è che non c’è modo di predire con precisione <em>quanto</em> miglioreranno le prestazioni. Riprendendo l’esempio delle immagini, Page Speed fornisce una stima dei Kb che risparmierei creando un unico sprite CSS ma non può dirmi <em>quanto tempo risparmierà l’utente</em> che visitera il sito. Otterrò un miglioramento effettivamente percepibile?</p>
<h2 id="cum-grano-salis">Cum grano salis</h2>
<p>L’esperienza ci aiuterà a scegliere quali ottimizzazioni implementare e quali tralasciare. Se fin dall’inizio avremo fatto bene il nostro lavoro non rimarrà molto da migliorare. Se  al contrario ci ritroveremo con decine di consigli di ottimizzazione beh, vorrà dire che la prossima volta dovremo lavorare meglio. In ogni caso usiamo questi strumenti con saggezza non lasciandoci prendere ciecamente dal “demone ottimizzatore”.</p>]]></content:encoded>
    </item>
    <item>
      <title>Flux: il monitor diventa crepuscolare</title>
      <link>https://nicolaiarocci.com/flux-il-monitor-diventa-crepuscolare/</link>
      <pubDate>Thu, 31 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/flux-il-monitor-diventa-crepuscolare/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;http://stereopsis.com/flux/&#34;&gt;Flux&lt;/a&gt;&lt;/strong&gt; è una applicazione gratuita per &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;OSX&lt;/strong&gt; e &lt;strong&gt;Linux&lt;/strong&gt; che regola il colore dello schermo in base all’ora del giorno. Detta così può sembrare una sciocchezza, ma vi assicuro che se lavorate spesso nel cuore della notte questa è un’applicazione alla quale non dovreste rinunciare.&lt;/p&gt;
&lt;p&gt;Avete mai notato che di notte, in una stanza poco illuminata, le persone che lavorano al computer sembrano circondate da un inquietante alone blu? Gli schermi per computer garantiscono una buona visione diurna vincendo la luce solare con colori brillanti e freddi (a dominante blu). Di notte, col buio o poca luce, tutto ciò affatica la vista. Mai capitato di alzarvi presto per scrivere codice o finire un articolo e dopo pochi minuti di lavoro ritrovarvi con gli occhi arrossati e irritati?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><!-- raw HTML omitted --><a href="http://stereopsis.com/flux/">Flux</a></strong> è una applicazione gratuita per <strong>Windows</strong>, <strong>OSX</strong> e <strong>Linux</strong> che regola il colore dello schermo in base all’ora del giorno. Detta così può sembrare una sciocchezza, ma vi assicuro che se lavorate spesso nel cuore della notte questa è un’applicazione alla quale non dovreste rinunciare.</p>
<p>Avete mai notato che di notte, in una stanza poco illuminata, le persone che lavorano al computer sembrano circondate da un inquietante alone blu? Gli schermi per computer garantiscono una buona visione diurna vincendo la luce solare con colori brillanti e freddi (a dominante blu). Di notte, col buio o poca luce, tutto ciò affatica la vista. Mai capitato di alzarvi presto per scrivere codice o finire un articolo e dopo pochi minuti di lavoro ritrovarvi con gli occhi arrossati e irritati?</p>
<p>Flux usa la vostra posizione geografica e l’orologio del computer per determinare le condizioni di luce in cui vi trovate, adattando di conseguenza i colori dello schermo. La prima esperienza con Flux può essere disarmante. Cala la notte e rimanete (molto) perplessi dall’aggiustamento che avviene. Concedete a cervello e occhi il tempo necessario ad abituarsi, dopo qualche minuto non ci farete più caso. Dopo un’ora provate a disattivare Flux usando l’opzione <em>Disable for an hour</em> e… godetevi la cottura rapida della vostra retina. Un esperimento doloroso che non vorrete più ripetere.</p>
<!-- raw HTML omitted -->
<h2 id="qualche-consiglio">Qualche consiglio</h2>
<p>Flux determina la posizione geografica automaticamente, oppure potete impostarla a mano se (come capita al sottoscritto) il vostro provider vi colloca a 200km di distanza dalla posizione reale. Vi consiglio di impostare  una transizione oraria (<em>slow</em>), che renderà più graduale il passaggio dalle condizioni diurne a quelle notturne. In base ai vostri gusti e alle condizioni di luce in cui operate potete scegliere tra quattro colorazioni notturne: <em>Tungsten</em>, <em>Halogen</em>, <em>Fluorescent</em>, <em>Daylight</em>. Io mi trovo bene con <em>Fluorescent</em> ma vi consiglio di provarle tutte. Abilitate l’opzione per lanciare Flux all’avvio del sistema operativo, così diventerà parte integrante delle vostre abitudini. I vostri occhi vi ringrazieranno.</p>
<h2 id="per-molti-ma-non-per-tutti">Per molti ma non per tutti</h2>
<p>Se vi dedicate alla grafica Flux probabilmente non fa per voi, la resa dei colori non è il suo punto di forza. Flux è perfetta per chi scrive e naviga di notte. Sul <a href="http://stereopsis.com/flux/">sito ufficiale</a> sostengono che l’ottimizzazione notturna dei colori concilia il ritmo sonno-veglia. Non so se sia vero ma so per certo che da quando ho installato Flux, una settimana fa, non riesco più a lavorare di notte se questa utility non è attivata. Se la provate fatemi sapere cosa ne pensate!</p>
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Il Formato Valuta in ASP.NET quando il sito è all’estero</title>
      <link>https://nicolaiarocci.com/il-formato-valuta-in-asp-net-quando-il-sito-e-allestero/</link>
      <pubDate>Mon, 28 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-formato-valuta-in-asp-net-quando-il-sito-e-allestero/</guid>
      <description>&lt;p&gt;Una settimana fa abbiamo lanciato il nuovo sito del &lt;a href=&#34;http://gestionaleamica.com&#34; title=&#34;Gestionale Amica&#34;&gt;Gestionale Amica&lt;/a&gt;, il nostro prodotto di punta. E’ scritto in &lt;strong&gt;ASP.NET&lt;/strong&gt; ed è dotato di un sistema di e-commerce sviluppato su misura. Carrello della spesa, checkout, pagamenti con carta di credito, tracciamento ordini, profilo utenti… un lavoro del quale sono piuttosto orgoglioso. Man mano che il giorno del debutto si avvicinava cresceva l’eccitazione; ero impaziente di vederlo funzionare questo gioiellino. Finalmente il 21 marzo è arrivato e con la primavera è sbocciato il nuovo sito. Come è andata? Bene! A parte un piccolo dettaglio. Il mio gioiellino vendeva in Dollari ($) anziché in Euro (€)&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Una settimana fa abbiamo lanciato il nuovo sito del <a href="http://gestionaleamica.com" title="Gestionale Amica">Gestionale Amica</a>, il nostro prodotto di punta. E’ scritto in <strong>ASP.NET</strong> ed è dotato di un sistema di e-commerce sviluppato su misura. Carrello della spesa, checkout, pagamenti con carta di credito, tracciamento ordini, profilo utenti… un lavoro del quale sono piuttosto orgoglioso. Man mano che il giorno del debutto si avvicinava cresceva l’eccitazione; ero impaziente di vederlo funzionare questo gioiellino. Finalmente il 21 marzo è arrivato e con la primavera è sbocciato il nuovo sito. Come è andata? Bene! A parte un piccolo dettaglio. Il mio gioiellino vendeva in Dollari ($) anziché in Euro (€)</p>
<!-- raw HTML omitted -->
<h2 id="come-è-potuto-succedere">Come è potuto succedere?</h2>
<p>In fatto di localizzazione una pagina ASP.NET non è diversa da una normale applicazione WinForms. In assenza di indicazioni diverse il .NET Framework <strong>rappresenta le valute in base alle impostazioni internazionali del computer che lo ospita</strong>. Durante sviluppo e collaudo non abbiamo avuto problemi perché lavoravamo su server aziendali locali. Tuttavia il server di produzione è americano, ed è così che pubblicando il sito ci siamo regalati un bel cambiamento di valuta, il tutto senza toccare una linea di codice.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Restituisce <strong>€1.567,50</strong> in Italia e <strong>$1,567.50</strong> negli Stati Uniti. Probabilmente a questo punto vi starete dicendo due cose:</p>
<ol>
<li>Ma perché hai pubblicato un sito in italiano, per un pubblico italiano, negli Stati Uniti?</li>
<li>Te lo dovevi aspettare, cosa volevi che succedesse? Qualunque sviluppatore con un minimo di esperienza sa queste cose.</li>
</ol>
<p>A proposito del primo punto ci sarebbe da scrivere un articolo intero (e magari lo farò). Basti sapere per ora che, malgrado le apparenze, ci sono (anche) buone ragioni per pubblicare siti italiani all’estero. Sul secondo punto naturalmente avreste ragione. Il fatto è che, nel grande schema delle cose, sono proprio i piccoli dettagli quelli che possono sfuggire. Per fortuna porre rimedio è stato semplice e indolore. Vediamo.</p>
<h2 id="e8217-tutta-questione-di-culture">E’ tutta questione di Culture</h2>
<p>In ogni pagina ASP.NET è possibile impostare il valore delle proprietà <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.culture(v=VS.85).aspx"><strong>Culture</strong></a> e <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.uiculture(v=VS.85).aspx"><strong>UICulture</strong></a>. <!-- raw HTML omitted -->Culture<!-- raw HTML omitted --> determina l’output delle funzioni influenzate dalla cultura: date, numeri, valute, orari. <!-- raw HTML omitted -->UICulture<!-- raw HTML omitted --> istruisce la pagina su quali risorse culturali caricare.</p>
<h3 id="impostare-culture-e-uiculture-per-tutto-il-sito">Impostare Culture e UICulture per tutto il sito</h3>
<p>Intervenendo direttamente nel file Web.Config possiamo dire a ASP.NET quale è la cultura da usare in tutto il sito. In questo modo non dovremo preoccuparci di intervenire su ogni in pagina.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Attenzione alle maiuscole. <!-- raw HTML omitted -->uiCulture<!-- raw HTML omitted --> va bene; <!-- raw HTML omitted -->uiculture<!-- raw HTML omitted --> non va bene. Non sprecate mezz’ora per una sciocchezza del genere, l’ho già fatto io per voi.</p>
<h3 id="impostare-culture-e-uiculture-per-una-pagina">Impostare Culture e UICulture per una pagina</h3>
<p>Per modificare Culture e UICulture di una singola pagina è necessario impostare i corrispondenti attributi della direttiva <a href="http://msdn.microsoft.com/it-it/library/ydy4x04a(v=VS.85).aspx">@ Page</a></p>
<!-- raw HTML omitted -->
<p>Questa tecnica può naturalmente venire usata in abbinamento alla precedente anche se devo dire che non mi viene in mente un motivo, uno scenario valido in cui ciò potrebbe essere utile.</p>
<h3 id="adattare-l8217output-alla-lingua-del-browser">Adattare l’output alla lingua del browser</h3>
<p>Per adattare la cultura al linguaggio del browser che visita la pagina basta impostare <strong>UICulture</strong> e <strong>Culture</strong> su <strong>auto</strong> (non l’ho testato personalmente). E’ anche possibile cambiare la cultura dinamicamente via codice. Se volete sapere come fare consultate la <a href="http://msdn.microsoft.com/en-us/library/syy068tk.aspx">documentazione ufficiale</a>.</p>
<h2 id="dimenticavo8230">Dimenticavo…</h2>
<p>C’è un’altra cosuccia che non ha funzionato perfettamente al momento del debutto. Immaginate la sorpresa del cliente che, ordinando un prodotto da €499 + IVA, si è visto proporre l’addebito su carta di credito per <strong>€1 (uno)</strong> IVA inclusa. Ma questa è un’altra storia…</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Page Speed ora gira anche su Chrome</title>
      <link>https://nicolaiarocci.com/google-page-speed-ora-gira-anche-su-chrome/</link>
      <pubDate>Wed, 23 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-page-speed-ora-gira-anche-su-chrome/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;http://code.google.com/speed/page-speed/&#34;&gt;Page Speed&lt;/a&gt; è un servizio Google per la ottimizzazione delle prestazioni delle pagine web. E’ molto apprezzato dagli sviluppatori di tutto il mondo che finora l’hanno usato su web server Apache oppure sotto forma di estensione per Firefox. Finalmente Google ha &lt;a href=&#34;http://googlewebmastercentral.blogspot.com/2011/03/page-speed-for-chrome-and-in-40.html&#34;&gt;annunciato&lt;/a&gt; l’estensione sperimentale &lt;!-- raw HTML omitted --&gt;Page Speed per Chrome&lt;!-- raw HTML omitted --&gt;, disponibile anche in italiano.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><a href="http://code.google.com/speed/page-speed/">Page Speed</a> è un servizio Google per la ottimizzazione delle prestazioni delle pagine web. E’ molto apprezzato dagli sviluppatori di tutto il mondo che finora l’hanno usato su web server Apache oppure sotto forma di estensione per Firefox. Finalmente Google ha <a href="http://googlewebmastercentral.blogspot.com/2011/03/page-speed-for-chrome-and-in-40.html">annunciato</a> l’estensione sperimentale <!-- raw HTML omitted -->Page Speed per Chrome<!-- raw HTML omitted -->, disponibile anche in italiano.</p>
<h2 id="installazione">Installazione</h2>
<p>Trattandosi di una estensione sperimentale l’installazione è più laboriosa del solito. Nella barra degli indirizzi digitate <code>about:flags</code> e premete invio. Abilitate l’opzione <code>API sperimentali di estensione</code> quindi scorrete fino in fondo alla pagina e cliccate sul pulsante <code>Riavvia adesso</code>. Dopo il riavvio sarà finalmente possibile <a href="https://clients2.google.com/service/update2/crx?response=redirect&amp;x=id%3Dgplegfbjlmmehdoakndmohflojccocli%26uc">scaricare l’estensione</a> e completare l’installazione. Per attivare Page Speed andate sulla pagina web che volete collaudare e aprite gli Strumenti per sviluppatori. Per maggiori informazioni consultate la <a href="http://code.google.com/intl/it-IT/speed/page-speed/docs/using_chrome.html">pagina ufficiale dell’estensione</a>.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="perché-la-velocità-del-tuo-sito-è-importante">Perché la velocità del tuo sito è importante</h2>
<p>I siti veloci migliorano l’esperienza dell’utente e questo piace molto ai motori di ricerca, che già oggi misurano le prestazioni di ogni sito indicizzato. I risultati di queste misurazioni sono uno degli indicatori usati per determinare l’importanza dei siti web e quindi la loro <strong>posizione nei risultati delle SERP</strong>. Il fatto che Google stessa sia impegnata a fornire strumenti avanzati di ottimizzazione e misurazione la dice lunga su quanto questo indicatore sarà sempre più determinante nel prossimo futuro.</p>
<p>Se non siete convinti considerate questo: solo qualche giorno fa anche Yahoo a rilasciato la <a href="https://chrome.google.com/extensions/detail/ninejjcohidippngpapiilnmkgllmakh">versione per Chrome</a> di <a href="http://developer.yahoo.com/yslow/">YSlow</a>, la sua sua estensione per la ottimizzazione delle pagine web. Se due indizi non fanno una prova, poco ci manca.</p>]]></content:encoded>
    </item>
    <item>
      <title>Eclipse Foundation lancia la beta pubblica di OrionHub</title>
      <link>https://nicolaiarocci.com/eclipse-foundation-lancia-la-beta-pubblica-di-orionhub/</link>
      <pubDate>Tue, 22 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eclipse-foundation-lancia-la-beta-pubblica-di-orionhub/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.eclipse.org/&#34;&gt;Eclipse Foundation&lt;/a&gt; ha avviato il beta testing di &lt;a href=&#34;http://www.eclipse.org/orion/&#34;&gt;&lt;strong&gt;OrionHub&lt;/strong&gt;&lt;/a&gt;, una implementazione hosted del suo Progetto Orion. Orion è una piattaforma di sviluppo aperta dedicata allo sviluppo per il web, dentro il web. La IDE Orion gira nel browser e fornisce un completo ambiente di produzione per progetti JavaScript, HTML e CSS. Il risultato è ottenuto grazie a un plugin lato client sviluppato in HTML5.&lt;/p&gt;
&lt;p&gt;Per un approfondimento dai una occhiata a &lt;!-- raw HTML omitted --&gt;Il futuro del codice sorgente è online?&lt;!-- raw HTML omitted --&gt;, la panoramica sul Progetto Orion e sulle IDE Online che ho pubblicato qualche tempo fa.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.eclipse.org/">Eclipse Foundation</a> ha avviato il beta testing di <a href="http://www.eclipse.org/orion/"><strong>OrionHub</strong></a>, una implementazione hosted del suo Progetto Orion. Orion è una piattaforma di sviluppo aperta dedicata allo sviluppo per il web, dentro il web. La IDE Orion gira nel browser e fornisce un completo ambiente di produzione per progetti JavaScript, HTML e CSS. Il risultato è ottenuto grazie a un plugin lato client sviluppato in HTML5.</p>
<p>Per un approfondimento dai una occhiata a <!-- raw HTML omitted -->Il futuro del codice sorgente è online?<!-- raw HTML omitted -->, la panoramica sul Progetto Orion e sulle IDE Online che ho pubblicato qualche tempo fa.</p>
]]></content:encoded>
    </item>
    <item>
      <title>SublimeText 2 – Un sofisticato text editor per codice, HTML e prosa</title>
      <link>https://nicolaiarocci.com/sublimetext-2-un-sofisticato-text-editor-per-codice-html-e-prosa/</link>
      <pubDate>Sat, 19 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sublimetext-2-un-sofisticato-text-editor-per-codice-html-e-prosa/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;SublimeText 2&lt;!-- raw HTML omitted --&gt; è il mio nuovo text editor preferito. Veloce, ricco di &lt;a href=&#34;http://www.sublimetext.com/features&#34;&gt;funzioni avanzate&lt;/a&gt; eppure semplice grazie a una interfaccia gradevole e minimalista. Mi ci sono imbattuto per caso quando ormai avevo rinunciato a trovare un valido sostituto a TextMate. Cercavo da tempo una soluzione &lt;strong&gt;multi piattaforma&lt;/strong&gt; che mi consentisse di lavorare nello stesso ambiente sia a casa (OSX) che in ufficio (Windows). SublimeText 2 gira su &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;OSX&lt;/strong&gt; e &lt;strong&gt;Linux&lt;/strong&gt; e sta raccogliendo attorno a sé una &lt;a href=&#34;http://www.sublimetext.com/forum/&#34;&gt;comunità molto attiva&lt;/a&gt; di supporters e sviluppatori entusiasti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->SublimeText 2<!-- raw HTML omitted --> è il mio nuovo text editor preferito. Veloce, ricco di <a href="http://www.sublimetext.com/features">funzioni avanzate</a> eppure semplice grazie a una interfaccia gradevole e minimalista. Mi ci sono imbattuto per caso quando ormai avevo rinunciato a trovare un valido sostituto a TextMate. Cercavo da tempo una soluzione <strong>multi piattaforma</strong> che mi consentisse di lavorare nello stesso ambiente sia a casa (OSX) che in ufficio (Windows). SublimeText 2 gira su <strong>Windows</strong>, <strong>OSX</strong> e <strong>Linux</strong> e sta raccogliendo attorno a sé una <a href="http://www.sublimetext.com/forum/">comunità molto attiva</a> di supporters e sviluppatori entusiasti.</p>
<p>Mi ha colpito l’interfaccia, davvero al servizio dei contenuti. La <strong>Minimap</strong> è una trovata originale che offre una vista “da diecimila metri di quota” sul codice. Immaginate di levarvi in volo e osservare il vostro codice dall’alto: apparirà come una ‘lenzuolata’ sulla quale potete cliccare per spostarvi rapidamente da una zona all’altra del vostro documento. Notevole anche il <strong>doppio (o triplo) pannello</strong> che consente di lavorare in linea su più files.</p>
<!-- raw HTML omitted -->
<pre><code>      &lt;p class=&quot;wp-caption-text&quot;&gt;
        Doppio pannello per lavorare su più files contemporaneamente
      &lt;/p&gt;
    &lt;/div&gt;&lt;/td&gt; 
    
    &lt;td&gt;
      &lt;p&gt;
        &lt;div id=&quot;attachment_1639&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignnone&quot;&gt;
          &lt;a href=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png&quot; rel=&quot;lightbox[1637]&quot;&gt;&lt;img class=&quot;size-full wp-image-1639 &quot; title=&quot;SublimeText 2- Syntax Highlighting&quot; src=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?w=210&quot; alt=&quot;SublimeText 2- Syntax Highlighting&quot; srcset=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?w=900 900w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?resize=150%2C93 150w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?resize=300%2C187 300w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?resize=480%2C300 480w&quot; sizes=&quot;(max-width: 525px) 100vw, 525px&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
          
          &lt;p class=&quot;wp-caption-text&quot;&gt;
            Syntax Highlighting di PHP, HTML e JavaScript nella stessa finestra
          &lt;/p&gt;
        &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; 
        
        &lt;tr&gt;
          &lt;td&gt;
            &lt;p&gt;
              &lt;div id=&quot;attachment_1642&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignnone&quot;&gt;
                &lt;a href=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png&quot; rel=&quot;lightbox[1637]&quot;&gt;&lt;img class=&quot;size-full wp-image-1642 &quot; title=&quot;SublimeText 2 - RegEx&quot; src=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?w=210&quot; alt=&quot;SublimeText 2 - RegEx&quot; srcset=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?w=900 900w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?resize=150%2C93 150w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?resize=300%2C187 300w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?resize=480%2C300 480w&quot; sizes=&quot;(max-width: 525px) 100vw, 525px&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                
                &lt;p class=&quot;wp-caption-text&quot;&gt;
                  Ricerca e sostituzione con le Regular Expression
                &lt;/p&gt;
              &lt;/div&gt;&lt;/td&gt; 
              
              &lt;td&gt;
                &lt;p&gt;
                  &lt;div id=&quot;attachment_1643&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignnone&quot;&gt;
                    &lt;a href=&quot;images/SublimeText2-MultipleSelections.png&quot; rel=&quot;lightbox[1637]&quot;&gt;&lt;img class=&quot;size-full wp-image-1643   &quot; title=&quot;SublimeText 2 - Selezione Multipla&quot; src=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?fit=210%2C131&quot; alt=&quot;SublimeText 2 - Selezione Multipla&quot; srcset=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?w=900 900w, http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?resize=150%2C93 150w, http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?resize=300%2C187 300w, http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?resize=480%2C300 480w&quot; sizes=&quot;(max-width: 210px) 100vw, 210px&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                    
                    &lt;p class=&quot;wp-caption-text&quot;&gt;
                      Selezione multipla e Minimap facilitano notevolmente il lavoro
                    &lt;/p&gt;
                  &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; 
                  
                  &lt;p&gt;
                    Tra le altre caratteristiche degne di nota segnalo la ricerca e sostituzione via &lt;strong&gt;regular expression&lt;/strong&gt;, la selezione multipla, il &lt;strong&gt;completamento automatico&lt;/strong&gt;, gli &lt;strong&gt;snippet già pronti&lt;/strong&gt;, l&amp;#8217;&lt;strong&gt;automazione&lt;/strong&gt; dei processi frequenti, l&amp;#8217;evidenziazione degli elementi del linguaggio (&lt;strong&gt;syntax highlighting&lt;/strong&gt;) per ASP, Python, JavaScript, HTML, Java, C#, C++, JSON e molti altri linguaggi. Ci sono decine di &lt;strong&gt;plugin&lt;/strong&gt; e il prodotto è seguito con &lt;strong&gt;aggiornamenti frequenti&lt;/strong&gt; (che al mio adorato TextMate mancano ormai da troppo da tempo).
                  &lt;/p&gt;
                  
                  &lt;p&gt;
                    Unica controindicazione che ho riscontrato finora è la non completa aderenza alle combinazioni di tastiera standard a cui OSX mi ha abituato. Per esempio la combinazione di tasti Command-, (virgola) non richiama le Preferenze come invece succede con qualunque programma Mac-nativo.
                  &lt;/p&gt;
                  
                  &lt;p&gt;
                    Se siete alla ricerca di un text editor evoluto non fatevi scappare questa piccola gemma.
                  &lt;/p&gt;
                  
                  &lt;p&gt;
                    &lt;em&gt;PS: ho scritto un seguito a questo articolo: &lt;a title=&quot;Sublime Text 2 un anno dopo&quot; href=&quot;http://nicolaiarocci.com/sublime-text-2-un-anno-dopo/&quot;&gt;Sublime Text 2 un anno dopo&lt;/a&gt;.&lt;/em&gt;
                  &lt;/p&gt;
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Programmare in Python con Visual Studio 2010</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-2010/</link>
      <pubDate>Mon, 14 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-2010/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://pytools.codeplex.com/&#34;&gt;Python Tools per Visual Studio&lt;/a&gt;&lt;/strong&gt; è un plugin gratuito e open source che consente di programmare in Python usando la IDE Microsoft. Nel corso della lunga gestazione di Visual Studio 2010 si era rumoreggiato di un possibile supporto nativo per il linguaggio Python. Qualcosa di vero doveva esserci visto che il progetto è appena stato presentato al &lt;a href=&#34;http://us.pycon.org/2011/home/&#34;&gt;&lt;strong&gt;PyCon 2011&lt;/strong&gt;&lt;/a&gt;, la più importante conferenza Python al mondo, nientemeno che dal &lt;a href=&#34;http://www.microsoft.com/hpc&#34;&gt;Microsoft Technical Computing Group&lt;/a&gt;.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p><strong><a href="http://pytools.codeplex.com/">Python Tools per Visual Studio</a></strong> è un plugin gratuito e open source che consente di programmare in Python usando la IDE Microsoft. Nel corso della lunga gestazione di Visual Studio 2010 si era rumoreggiato di un possibile supporto nativo per il linguaggio Python. Qualcosa di vero doveva esserci visto che il progetto è appena stato presentato al <a href="http://us.pycon.org/2011/home/"><strong>PyCon 2011</strong></a>, la più importante conferenza Python al mondo, nientemeno che dal <a href="http://www.microsoft.com/hpc">Microsoft Technical Computing Group</a>.</p>
<!-- raw HTML omitted -->
<h2 id="progetti-e-soluzioni">Progetti e Soluzioni</h2>
<p>Python Tools è perfettamente integrato nel sistema a progetti tipico di Visual Studio. I file di progetto Python hanno estensione <code>.pyproj</code> e supportano parecchi tipi di applicazione (Console, WPF, MPI, WinForms, ecc.)</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="editor">Editor</h2>
<p>Python Tools supporta gran parte delle caratteristiche che hanno reso famoso l’editor di Visual Studio: evidenziazione degli elementi del linguaggio (syntax color highlighting), riconoscimento di classi e funzioni, navigazione dei metodi nella barra di navigazione, suggerimenti al passaggio del mouse, ricerca di definizioni e occorrenze, IntelliSense.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="debugger">Debugger</h2>
<p>Il potente debugger di Visual Studio è utilizzabile con Python. Valutazione di espressioni (anche nella finestra interattiva), ispezione delle variabili, impostazione dell’istruzione successiva, uscita ed entrata da cicli di codice e/o funzioni (step in, step out).</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="object-browser">Object Browser</h2>
<p>Python Tools supporta l’uso del Object Browser di Visual Studio 2010. Per ogni modulo è disponibile l’elenco delle classi e, per ogni classe, delle funzioni definite. Il pannello sinistro mostra i moduli e le classi mentre quello destro elenca gli attributi della classe selezionata.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Visto chi l’ha realizzato non stupisce che Python Tools per Visual Studio offra anche funzionalità avanzate quali il Profiling (solo su Visual Studio 2010 Ultimate), <a href="http://pytools.codeplex.com/wikipage?title=Detailed%20Walk-thu%20Guide%20-%20HPC%20and%20Cloud%20Features&amp;referringTitle=Home">cluster computing e cloud computing</a>. Clustering e scaling sono già implementati mentre per il supporto di Windows Azure bisognerà aspettare il prossimo aggiornamento. Già disponibili i <a href="http://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net">port per .NET delle librerie NumPy e SciPy</a>.</p>
<p>Python Tools per Visual Studio non è una distruzione completa di Python. E comunque necessario installare <a href="http://www.python.it/">CPython</a> o <a href="http://ironpython.codeplex.com/">IronPython</a>. Questa è una buona notizia perché potrai lavorare sia nel modo tradizionale (magari con colleghi abituati ad altre IDE) sia con Visual Studio.</p>
<h2 id="una-grande-opportunità">Una grande opportunità</h2>
<p>Se vieni dal mondo .NET e sei incuriosito dal linguaggio Python (dovresti esserlo!) questa è la tua occasione. Puoi lavorare con Python senza rinunciare al tuo ambiente preferito e puoi concentrarti sulle caratteristiche del linguaggio risparmiandoti l’apprendimento di una nuova IDE. A dire il vero anche IronPython dispone di un suo plugin per VisualStudio ma ora hai l’opportunità di lavorare con CPython, il Python originale.</p>
<p>Per muovere i primi passi comincia con <!-- raw HTML omitted -->Impara Python in 10 minuti<!-- raw HTML omitted -->, guida rapida per il programmatore proveniente da altri linguaggi.</p>
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Programmazione, SEO, Startup – Il Meglio della Settimana #4</title>
      <link>https://nicolaiarocci.com/programmazione-seo-startup-il-meglio-della-settimana-4/</link>
      <pubDate>Sun, 13 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-seo-startup-il-meglio-della-settimana-4/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;http://stevecheney.posterous.com/how-facebook-is-killing-your-authenticity&#34;&gt;Facebook sta uccidendo la tua Autenticità&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Steve Cheney propone una riflessione su come Facebook condizioni ormai _l&amp;amp;#8217;autenticità_ dei suoi utenti. Il timore che conoscenti e amici (alcuni non li incontriamo da anni, altri sono parenti stretti) vedano quel che facciamo online ci induce a comportarci in maniera diversa da quel che sarebbe il nostro istintivo sentire.
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;a href=&#34;http://www.distilled.co.uk/excel-for-seo/&#34;&gt;&lt;strong&gt;Tutorial: Microsoft Excel per il SEO&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Eccellente tutorial su come usare Excel per analizzare al meglio la quantità di dati che raccogliamo durante le nostre indagini SEO.
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;a href=&#34;http://sixrevisions.com/web-development/decrease-webpage-load-times/&#34;&gt;&lt;strong&gt;10 consigli per velocizzare il caricamento delle pagine Web&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;La pazienza è la virtù dei forti, ma per molti è una pratica difficile da applicare. Ciò è vero soprattutto per chi visita siti web. Six Revision ci propone una decina di consigli per velocizzare le nostre pagine web.
&lt;/code&gt;&lt;/pre&gt;</description>
      <content:encoded><![CDATA[<ol>
<li><strong><!-- raw HTML omitted --><a href="http://stevecheney.posterous.com/how-facebook-is-killing-your-authenticity">Facebook sta uccidendo la tua Autenticità</a></strong></li>
</ol>
<pre><code>Steve Cheney propone una riflessione su come Facebook condizioni ormai _l&amp;#8217;autenticità_ dei suoi utenti. Il timore che conoscenti e amici (alcuni non li incontriamo da anni, altri sono parenti stretti) vedano quel che facciamo online ci induce a comportarci in maniera diversa da quel che sarebbe il nostro istintivo sentire.
</code></pre>
<ol start="2">
<li><a href="http://www.distilled.co.uk/excel-for-seo/"><strong>Tutorial: Microsoft Excel per il SEO</strong></a></li>
</ol>
<pre><code>Eccellente tutorial su come usare Excel per analizzare al meglio la quantità di dati che raccogliamo durante le nostre indagini SEO.
</code></pre>
<ol start="3">
<li><a href="http://sixrevisions.com/web-development/decrease-webpage-load-times/"><strong>10 consigli per velocizzare il caricamento delle pagine Web</strong></a></li>
</ol>
<pre><code>La pazienza è la virtù dei forti, ma per molti è una pratica difficile da applicare. Ciò è vero soprattutto per chi visita siti web. Six Revision ci propone una decina di consigli per velocizzare le nostre pagine web.
</code></pre>
<ol start="4">
<li>
<p><a href="http://www.ibtimes.com/articles/120033/20110308/adobe-flash-html-5-wallaby-ios-iphone-ipad-ipad-2-ios-4-3-chrome-safari-windows-nitro-javascript-dre.htm"><strong>Adobe rilascia un convertitore da Flash a HTML5</strong></a></p>
<p>E con questa Adobe ammette, sia pur implicitamente, la morte di Flash. Se mi segui da un pò la mia opinione <a href="http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/">la conosci già</a>. L’altro giorno al BE-Wizard 2011 il grande <strong>Avinash Kaushik</strong> ha dichiarato (ero in platea): “ogni volta che usi Flash su una pagina Web, un dolce cucciolo muore”.</p>
</li>
<li>
<p><a href="http://www.html5rocks.com/tutorials/speed/html5/"><strong>Tutorial: Aumentare le prestazioni delle applicazioni HTML5</strong></a></p>
</li>
</ol>
<pre><code>HTML5 ci offre splendidi strumenti per migliorare l&amp;#8217;aspetto delle applicazioni web. Animazioni ed effetti richiedono attenzione alle prestazioni. Ecco un ottimo e approfondito tutorial su come evitare il rischio di passare dalla padella alla brace.
</code></pre>
<ol start="6">
<li><strong><a href="https://developer.apple.com/xcode/">Apple rilascia Xcode 4</a></strong></li>
</ol>
<pre><code>Xcode 4 è la nuova versione del framework Apple per la creazione di applicazioni Mac, iPhone, and iPad. Include la Xcode IDE, Instruments, il simulatore di iOS e le ultime versioni degli SDK per Mac OS X e iOS**.** 
</code></pre>
<ol start="7">
<li><a href="http://mashable.com/2011/03/10/node-js/"><strong>Ecco perché tutti parlano di Node</strong></a></li>
</ol>
<pre><code>Al ventesimo piano di un grattacielo di San Francisco un gruppo di sviluppatori sta lavorando a una nuova tecnologia che sta cambiando (forse) il modo in cui le applicazioni web in real-time saranno costruite e distribuite. Tutti ne parlano. Ecco perché.
</code></pre>
<ol start="8">
<li><a href="http://www.queness.com/post/7018/11-useful-online-tools-for-web-development"><strong>11 Tools Online per Programmatori</strong></a></li>
</ol>
<pre><code>I tools online sono ideali per sbrigare rapidamente piccoli lavoretti. Questo articolo ne presenta una selezione originale.
</code></pre>
<ol start="9">
<li><a href="http://searchenginewatch.com/3641984"><strong>SEO: Massimizzare il CTR nelle ricerche organiche</strong></a></li>
</ol>
<pre><code>Non perdetevi questo articolo se lavorate in ambito SEO/SERP. _Enough said_.
</code></pre>
<ol start="10">
<li><a href="http://mashable.com/2011/03/12/hello-bar-japan/"><strong>Hai un Blog o un sito web? Aiuta il Giappone con un semplice Banner</strong></a></li>
</ol>
<pre><code>Puoi dare una mano inserendo uno snippet di codice che mostra un banner che invita a partecipare alla raccolta fondi per il Giappone avviata dalla Croce Rossa.
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Impara Python in 10 minuti</title>
      <link>https://nicolaiarocci.com/impara-python-in-10-minuti/</link>
      <pubDate>Thu, 10 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/impara-python-in-10-minuti/</guid>
      <description>&lt;p&gt;E così vorresti imparare il linguaggio di programmazione Python. Probabilmente
sei alla ricerca di un tutorial completo e allo stesso tempo conciso. Questa
guida è un tentativo di insegnarti Python in 10 minuti. In effetti più che con
una guida vera e propria hai a che fare con degli appunti che userai per
partire col piede giusto. Naturalmente se davvero vuoi imparare bene dovrai
anche esercitarti molto. Do per scontato che tu sappia già programmare, questo
mi permetterà di concentrarmi sulle caratteristiche intrinseche del linguaggio.
Troverai le parole chiave &lt;em&gt;evidenziate&lt;/em&gt; così potrai individuarle facilmente.
&lt;em&gt;Fai attenzione&lt;/em&gt; perché per brevità alcune cose verranno introdotte
e commentate direttamente nel codice di esempio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>E così vorresti imparare il linguaggio di programmazione Python. Probabilmente
sei alla ricerca di un tutorial completo e allo stesso tempo conciso. Questa
guida è un tentativo di insegnarti Python in 10 minuti. In effetti più che con
una guida vera e propria hai a che fare con degli appunti che userai per
partire col piede giusto. Naturalmente se davvero vuoi imparare bene dovrai
anche esercitarti molto. Do per scontato che tu sappia già programmare, questo
mi permetterà di concentrarmi sulle caratteristiche intrinseche del linguaggio.
Troverai le parole chiave <em>evidenziate</em> così potrai individuarle facilmente.
<em>Fai attenzione</em> perché per brevità alcune cose verranno introdotte
e commentate direttamente nel codice di esempio.</p>
<h3 id="attribuzione">Attribuzione</h3>
<p>Questo articolo è una traduzione autorizzata di <a href="http://www.korokithakis.net/tutorials/python">Learn Python in 10
minutes</a>. Ringrazio l&rsquo;amico Stavros Korokithakis per il permesso
di accordatomi.</p>
<h2 id="caratteristiche">Caratteristiche</h2>
<p>Python è un linguaggio fortemente e <em>dinamicamente tipizzato</em> (i tipi dati
esistono e sono necessari ma non è necessario dichiararli esplicitamente),
<em>case sensitive</em> (var e VAR sono due variabili diverse) e <em>object oriented</em>
(tutto in Python è un oggetto).</p>
<h2 id="come-ottenere-aiuto">Come ottenere aiuto</h2>
<p>L&rsquo;interprete di Python fornisce già un valido sistema di aiuto. Per
sapere come usare un oggetto basta digitare <code>help()</code>. Sono utili anche <code>dir</code>,
che elenca gli attributi (metodi) disponibili per l&rsquo;oggetto,  e
<code>.__doc__</code> che mostra la documentazione completa quando disponibile:</p>
<pre><code>&gt;&gt;&gt; help(5)
Help on int object:
(etc etc)

&gt;&gt;&gt; dir(5)
['__abs__', '__add__', ...]

&gt;&gt;&gt; abs.__doc__
'abs(number) -&gt; number\n\nReturn the absolute value of the
argument.'
</code></pre>
<h2 id="sintassi">Sintassi</h2>
<p>In Python *non ci sono terminatori di riga obbligatori e i <em>blocchi sono
specificati con l&rsquo; indentazione</em>. Indenta per cominciare un blocco e rimuovi
l&rsquo;indentazione per concluderlo, tutto qui. Le istruzioni che richiedono un
blocco indentato terminano con i due punti (<code>:</code>). I <em>commenti</em> cominciano col
cancelletto (<code>#</code>) e sono a linea singola. Stringhe su più righe sono usate per
i <em>commenti multi linea</em>. Le <em>assegnazioni</em> si compiono col simbolo di
uguale (<code>=</code>). Per i <em>test di uguaglianza</em> si usa il doppo uguale (<code>==</code>).
Puoi aumentare e diminuire un valore usando gli operatori <code>+=</code> e <code>-=</code> seguiti
dall&rsquo;addendo. Ciò funziona con molti tipi di dati, stringhe incluse. Puoi
assegnare e usare più variabili sulla stessa riga. Alcuni esempi:</p>
<pre><code>&gt;&gt;&gt; myvar = 3
&gt;&gt;&gt; myvar += 2
&gt;&gt;&gt; myvar
5

&gt;&gt;&gt; myvar -= 1
&gt;&gt;&gt; myvar
4

&quot;&quot;&quot;Questo è un commento su più righe.
Le righe seguenti vengono concatenate.&quot;&quot;&quot;
&gt;&gt;&gt; mystring = &quot;Hello&quot;
&gt;&gt;&gt; mystring += &quot; world.&quot;
&gt;&gt;&gt; print mystring
Hello world.

# Il codice seguente scambia due variabili in una sola riga.
# Non ci sono errori di conversione di tipo perché
# i nuovi valori non vengono assegnati. Vengono creati
# nuovi oggetti ai quali le variabili fanno ora riferimento.
&gt;&gt;&gt; myvar, mystring = mystring, myvar
</code></pre>
<h2 id="tipi-di-dati">Tipi di dati</h2>
<p>Le strutture più significative in Python sono <em>liste, tuple e dizionari</em>. I Set
sono integrati in Python a partire dalla versione 2.5 (per le versioni
precedenti sono disponibili nella libreria <code>sets</code>). Le Liste sono simili ad
array mono dimensionali ma è possibile creare liste che contengono altre liste.
I dizionari sono array che contengono coppie di chiavi e valori (hash table)
e le tuple sono oggetti immutabili mono dimensionali. In Python gli array
possono essere di qualunque tipo, quindi puoi mischiare interi, stringhe, ecc
nelle tue liste/dizionari e tuple. L&rsquo;indice del primo oggetto in qualunque tipo
di array è sempre zero. Gli indici negativi sono ammessi e contano a partire
dalla fine dell&rsquo;array, -1 indica l&rsquo;ultimo elemento dell&rsquo;array. Le variabili
possono fare riferimento a funzioni.</p>
<pre><code>&gt;&gt;&gt; esempio = [1, [&quot;un'altra&quot;, &quot;lista&quot;], (&quot;una&quot;, &quot;tupla&quot;)]
&gt;&gt;&gt; mialista = [&quot;Elemento 1&quot;, 2, 3.14]
&gt;&gt;&gt; mialista[0] = &quot;Ancora elemento 1&quot;
&gt;&gt;&gt; mialista[-1] = 3.15
&gt;&gt;&gt; miodizionario = {&quot;Key 1&quot;: &quot;Valore 1&quot;, 2: 3, &quot;pi&quot;: 3.14}
&gt;&gt;&gt; miodizionario[&quot;pi&quot;] = 3.15
&gt;&gt;&gt; miatupla = (1, 2, 3)
&gt;&gt;&gt; miafunzione = len
&gt;&gt;&gt; print miafunzione(mialista)
3
</code></pre>
<p>Puoi ottenere un <em>range di array</em> usando i due punti (<code>:</code>). Non indicare
l&rsquo;indice iniziale del range sottintende il primo elemento; non indicare
l&rsquo;indice finale sottintende l&rsquo;ultimo elemento. Indici negativi contano
a partire dall&rsquo;ultimo elemento (-1 è l&rsquo;ultimo elemento dell&rsquo;array). Quindi:</p>
<pre><code>&gt;&gt;&gt; mialista = [&quot;Elemento 1&quot;, 2, 3.14]
&gt;&gt;&gt; print mialista[:]
['Elemento 1', 2, 3.1400000000000001]

&gt;&gt;&gt; print mialista[0:2]
['Elemento 1', 2]

&gt;&gt;&gt; print mialista[-3:-1]
['Elemento 1', 2]

&gt;&gt;&gt; print mialista[1:]
[2, 3.14]
</code></pre>
<h2 id="stringhe">Stringhe</h2>
<p>Le stringhe in Python sono indicate *indifferentemente con la virgoletta
singola (<code>'</code>) o doppia (<code>&quot;</code>) ed è consentito usare una notazione all&rsquo;interno
di una stringa delimitata dall&rsquo;altra (<code>&quot;Egli disse 'ciao'.&quot;</code> è valida).
Stringhe su più righe sono racchiuse in triple (o singole) virgolette (<code>&quot;&quot;&quot;</code>).
Python *supporta Unicode, basta ricorrere alla sintassi <code>u&quot;Questa è una stringa unicode&quot;</code>. Per <em>inserire valori in una stringa</em> usa l&rsquo;operatore <code>%</code> (modulo)
e una tupla. Ogni % viene sostituito da un elemento della tupla, da sinistra
a destra, ed è consentito usare un dizionario per le sostituzioni.</p>
<pre><code>&gt;&gt;&gt; &quot;Nome: %s\nNumero: %s\nStringa: %s&quot; % (miaclasse.nome, 3, 3 * &quot;-&quot;)
Nome: Poromenos
Numero: 3
Stringa: ---

strString = &quot;&quot;&quot;Questa è
una stringa
multi riga.&quot;&quot;&quot;

# ATTENZIONE: Nota la s finale in &quot;%(key)s&quot;.
&gt;&gt;&gt; print &quot;Questo %(verbo)s un %(nome)s.&quot; % {&quot;nome&quot;: &quot;test&quot;, &quot;verbo&quot;: &quot;è&quot;}
Questo è un test.
</code></pre>
<h2 id="controllo-di-flusso">Controllo di flusso</h2>
<p>Le istruzioni per il controllo di flusso sono <code>if</code>, <code>for</code>, e <code>while</code>. Non esiste il <code>select</code>; al suo posto si usa <code>if</code>. Il <code>for</code> si usa anche per enumerare i membri di una lista. Per ottenere un elenco di numeri si usa <code>range(numero)</code>.</p>
<pre><code>rangelist = range(10)
&gt;&gt;&gt; print rangelist
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for number in rangelist:
    # Verifica se numer è uno dei
    # numeri nella tupla.
    if number in (3, 4, 7, 9):
        # &quot;Break&quot; termina un for senza
        # eseguire la clausola &quot;else&quot;.
        break
    else:
        # &quot;Continue&quot; prosegue con l'iterazione successiva
        # del loop. Piuttosto inutile in questo caso,
        # visto che siamo all'ultima istruzione del loop.
        continue
else:
    # Questo &quot;else&quot; è opzionale ed è
    # eseguito solo se il loop non è stato interrotto
    # con &quot;break&quot;.
    pass # Non fa nulla

if rangelist[1] == 2:
    print &quot;Il secondo elemento (le liste sono 0-based) è 2&quot;
elif rangelist[1] == 3:
    print &quot;Il secondo elemento (le liste sono 0-based) è 3&quot;
else:
    print &quot;Non saprei&quot;

while rangelist[1] == 1:
    pass
</code></pre>
<h2 id="funzioni">Funzioni</h2>
<p>Le funzioni sono dichiarate con la la parola chiave <code>def</code>. Eventuali *argomenti
opzionali vanno dichiarati dopo quelli obbligatori e devono avere un valore
assegnato. Quando si chiamano funzioni passando *argomenti per nome
è necessario passare anche il valore. Le funzioni possono restituire una tuple
(lo spacchettamento delle tuple rende possibile la restituzione di *valori
multipli). Le *lambda sono funzioni in linea. I parametri sono passati <em>per
riferimento</em>, ma i tipi immutabili (tuple, interi, stringhe, ecc.) non possono
essere modificati nella funzione. Questo succede perché <em>viene passata solo la
posizione in memoria</em> dell&rsquo;elemento, e assegnare un altro oggetto alla
variabile <em>comporta la perdita del riferimento</em> all&rsquo;oggetto precedente. Per
esempio:</p>
<pre><code># Equivalente a def f(x): return x + 1
funzionevar = lambda x: x + 1
&gt;&gt;&gt; print funzionevar(1)
2

# un_int e una_stringa sono opzionali, hanno valori di default
# da usare se non vengono passati (2 e &quot;Una stringa&quot;, rispettivamente).
def passing_example(una_lista, un_int=2, una_stringa=&quot;Una stringa&quot;):
    una_lista.append(&quot;Nuovo elemento&quot;)
    un_int = 4
    return una_lista, un_int, una_string

&gt;&gt;&gt; mia_lista = [1, 2, 3]
&gt;&gt;&gt; mio_int = 10
&gt;&gt;&gt; print passing_example(mia_lista, mio_int)
([1, 2, 3, 'Nuovo elemento'], 4, &quot;Una stringa&quot;)

&gt;&gt;&gt; mia_lista
[1, 2, 3, 'Nuovo elemento']

&gt;&gt;&gt; mio_int
10
</code></pre>
<h2 id="classi">Classi</h2>
<p>Python supporta la <em>ereditarietà multipla</em> delle classi. Le variabili
e i metodi privati vengono dichiarati per convezione (non è una regola del
linguaggio) precedendoli con due underscore (_). Possiamo assegnare <em>attributi
(proprietà) arbitrari</em> alle istanze di una classe. Un esempio:</p>
<pre><code>class MiaClasse:
    comune = 10
    def __init__(self):
        self.miavariabile = 3
    def miafunzione(self, arg1, arg2):
        return self.miavariabile

# Creiamo una istanza della classe
&gt;&gt;&gt; istanza = MiaClasse()
&gt;&gt;&gt; istanza.miafunzione(1, 2)
3

# Questa variabile è condivisa da tutte le istanze
&gt;&gt;&gt; istanza2 = MiaClasse()
&gt;&gt;&gt; istanza.comune
10

&gt;&gt;&gt; istanza2.comune
10

# Nota come qui usiamo il nome della classe
# invece dell'istanza.
&gt;&gt;&gt; MiaClasse.common = 30
&gt;&gt;&gt; instanza.common
30

&gt;&gt;&gt; instanza2.common
30

# Questo non aggiornerà la variabile nella classe,
# invece assegnerà un nuovo oggetto alla variabile
# della prima istanza.
&gt;&gt;&gt; istanza.common = 10
&gt;&gt;&gt; istanza.common
10

&gt;&gt;&gt; istanza2.common
30

&gt;&gt;&gt; MiaClasse.common = 50

# Il valore non è cambiato perché &quot;common&quot;
# ora è una variabile dell'istanza.
&gt;&gt;&gt; istanza.common
10

&gt;&gt;&gt; istanza2.common
50

# Questa classe eredita da MiaClasse. L'ereditarietà
# multipla viene dichiarata così:
# class AltraClasse(MiaClasse1, MiaClasse2, MiaClasseN)
class AltraClasse(MiaClasse):
    # L'argomento &quot;self&quot; è passato automaticamente
    # e fa riferimento all'istanza della classe, quindi puoi impostare
    # variabili di istanza come sopra, ma dall'interno della classe.
    def __init__(self, arg1):
        self.miavariabile = 3
        print arg1

&gt;&gt;&gt; istanza = AltraClasse(&quot;hello&quot;)
hello

&gt;&gt;&gt; istanza.miafunzione(1, 2)
3

# Questa classe non ha un membro (proprietà) .test member, ma
# possiamo aggiungerne uno all'istanza quando vogliamo. Nota
# che .test sarà un membro della sola istanza.
&gt;&gt;&gt; istanza.test = 10
&gt;&gt;&gt; istanza.test
10
</code></pre>
<h2 id="eccezioni">Eccezioni</h2>
<p>Le eccezioni in Python sono gestite con dei blocchi <code>try-except [nome_eccezione]</code>:</p>
<pre><code>def una_funzione():
    try:
        # Divisione per zero causa una eccezione
        10 / 0
    except ZeroDivisionError:
        print &quot;Oops, errore.&quot;
    else:
        # Non c'è stata eccezione, possiamo proseguire.
        pass
    finally:
        # Questo codice viene eseguito quando il blocco
        # try..except è già eseguito e tutte le eccezioni
        # sono state gestite, anche se si verifica una nuova
        # eccezione direttamente nel blocco.
        print &quot;Abbiamo finito.&quot;

&gt;&gt;&gt; una_funzione()
Oops, errore.
Abbiamo finito.
</code></pre>
<h2 id="importare-librerie">Importare librerie</h2>
<p>Le librerie esterne si importano con <code>import [nomelibreria]</code>. Puoi anche usare la forma <code>[nomelibreria] import [nomefunzione]</code> per importare singole funzioni. Ecco un esempio:</p>
<pre><code>import random
from time import clock

randomint = random.randint(1, 100)

&gt;&gt;&gt; print randomint
64
</code></pre>
<h2 id="input-e-output">Input e Output</h2>
<p>Python vanta una vasta gamma di librerie per gestire input/output di files. In
questo esempio vediamo come <em>serializzare</em> (convertire strutture dati in
stringhe) usando la libreria <code>pickle</code>:</p>
<pre><code>import pickle
mialista = [&quot;Questo&quot;, &quot;è&quot;, 4, 13327]

# Apre il file C:\binary.dat in scrittura. La lettera r
# prima del nome file serve a evitare l'escaping
# del backslash.
miofile = file(r&quot;C:\binary.dat&quot;, &quot;w&quot;)

pickle.dump(mialista, miofile)
miofile.close()

miofile = file(r&quot;C:\text.txt&quot;, &quot;w&quot;)
miofile.write(&quot;Questa è una stringa di prova&quot;)
miofile.close()

miofile = file(r&quot;C:\text.txt&quot;)

&gt;&gt;&gt; print miofile.read()
'Questa è una stringa di prova'

miofile.close()

# Apre il file in lettura.
miofile = file(r&quot;C:\binary.dat&quot;)
listadafile = pickle.load(miofile)
miofile.close()

&gt;&gt;&gt; print listadafile
['Questo', 'è', 4, 13327]
</code></pre>
<h2 id="varie-ed-eventuali">Varie ed eventuali</h2>
<p>I *test possono essere concatenati. <code>1 &gt; a &lt; 3</code> verifica che a sia minore di  3
e maggiore di 1. Puoi usare <code>del</code> per <em>cancellare variabili o elementi di
array</em>. Le <em>comprensioni di lista</em> sono uno strumento potente per creare
e manipolare le liste. Consistono in una espressione seguita da una clausola
<code>for</code> seguita da zero o più clausole <code>if</code>. Quindi:</p>
<pre><code>&gt;&gt;&gt; lst1 = [1, 2, 3]
&gt;&gt;&gt; lst2 = [3, 4, 5]
&gt;&gt;&gt; print [x * y for x in lst1 for y in lst2]
[3, 4, 5, 6, 8, 10, 9, 12, 15]
&gt;&gt;&gt; print [x for x in lst1 if 4 &gt; x &gt; 1]
[2, 3]

# Verifica se almeno un elemento ha una determinata
# caratteristica.
# &quot;any&quot; restituisce true se qualunque elemento nella
# lista è vero.
&gt;&gt;&gt; any([i % 3 for i in [3, 3, 4, 4, 3]])
True
# Funziona perché 4 % 3 = 1, e 1 in Python è true,
# quindi any() restituisce True.

# Verifica quanto elemento hanno una determinata
# caratteristica.
&gt;&gt;&gt; sum(1 for i in [3, 3, 4, 4, 3] if i == 4)
2

&gt;&gt;&gt; del lst1[0]
&gt;&gt;&gt; print lst1
[2, 3]

&gt;&gt;&gt; del lst1
</code></pre>
<p>Le <em>variabili globali</em> vengono dichiarate all&rsquo;esterno delle funzioni
senza dichiarazioni particolari, ma se desideri modificarle in una funzione
devi dichiararle con la parola <code>global</code> all&rsquo;inizio della funzione,
altrimenti Python assegnerà quell&rsquo;oggetto a una nuova variabile locale
(presta attenzione, si tratta di un piccolo dettaglio che può metterti
facilmente nei guai). Per esempio: numero = 5</p>
<pre><code>def miafunz():
    # Questo stamperà 5.
    print numero

def altrafunz():
    # Questo solleva una eccezione perché la variabile
    # non è stata ancora assegnata. Python crea un
    # nuovo oggetto locale invece di accedere al globale
    print numero
    numero = 3

def ancorafunz():
    global numero
    # Questo cambierà il valore alla variabile globale
    numero = 3
</code></pre>
<h2 id="epilogo">Epilogo</h2>
<p>Questa non intende essere una guida completa (e nemmeno parziale) a Python.
Python ha una vasta gamma di librerie e molte, moltissime funzionalità che
dovrai scoprire con altri mezzi, come <a href="http://it.diveintopython.net/">Dive Into Python</a> (tradotto in
italiano) o l&rsquo;eccellente <a href="http://www.amazon.it/gp/product/0596158068/ref=as_li_ss_tl?ie=UTF8&amp;camp=3370&amp;creative=24114&amp;creativeASIN=0596158068&amp;linkCode=as2&amp;tag=nicoiaro-21">Learning Python di Mark Lutz</a>, libro che consiglio
a chiunque voglia davvero imparare e capire Python.</p>
<p>Mi auguro di averti aiutato nella transizione verso Python. Lasciami un
commento se pensi che ci sia qualcosa da migliorare o se c&rsquo;é qualcos&rsquo;altro
che vorresti approfondire.</p>
<p>Sono <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> su Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cancellare tutte le Tabelle da un Database SQL Server</title>
      <link>https://nicolaiarocci.com/cancellare-tutte-le-tabelle-da-un-database-sql-server/</link>
      <pubDate>Wed, 09 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cancellare-tutte-le-tabelle-da-un-database-sql-server/</guid>
      <description>&lt;p&gt;In rari casi può capitare la necessità di cancellare tutto, ma proprio tutto, da un database SQL Server. &lt;strong&gt;Tabelle&lt;/strong&gt;, &lt;strong&gt;Stored Procedure&lt;/strong&gt;, &lt;strong&gt;Funzioni&lt;/strong&gt;, &lt;strong&gt;Viste&lt;/strong&gt;, &lt;strong&gt;Relazioni&lt;/strong&gt; e &lt;strong&gt;Chiavi Primarie&lt;/strong&gt;. A questo punto tanto varrebbe cancellare il database e ricrearlo, direte voi. Vero, ma non sempre si dispone delle autorizzazioni per farlo. Nel mio caso si tratta di un database ospitato su un server remoto e condiviso. Posso creare e cancellare quel che voglio all’interno del database, ma non posso rinominare o cancellare il db stesso.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In rari casi può capitare la necessità di cancellare tutto, ma proprio tutto, da un database SQL Server. <strong>Tabelle</strong>, <strong>Stored Procedure</strong>, <strong>Funzioni</strong>, <strong>Viste</strong>, <strong>Relazioni</strong> e <strong>Chiavi Primarie</strong>. A questo punto tanto varrebbe cancellare il database e ricrearlo, direte voi. Vero, ma non sempre si dispone delle autorizzazioni per farlo. Nel mio caso si tratta di un database ospitato su un server remoto e condiviso. Posso creare e cancellare quel che voglio all’interno del database, ma non posso rinominare o cancellare il db stesso.</p>
<p>Ecco una <a href="http://stackoverflow.com/questions/536350/sql-server-2005-drop-all-the-tables-stored-procedures-triggers-constriants-an">comoda routine</a> che fa al caso nostro. Dopo averla eseguita vi troverete il database completamente vuoto, come se fosse stato appena creato.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Anche questa routine (come <a href="http://nicolaiarocci.com/come-rimuovere-tutte-le-stored-procedure-da-un-database-sql/">quella vista ieri che cancella le sole Stored Procedure</a>) accede alla tabella di sistema <code>sys.objects</code> per reperire lo schema del database. Cambia però la tecnica di accesso alle informazioni. Invece di usare un cursore qui selezioniamo il primo record utile per poi inoltrarci in un ciclo di cancellazioni ripetute. Il ciclo termina quando non ci sono più record che soddisfano i parametri di ricerca. Per evitare problemi coi vincoli relazionali è importante cancellare prima le relazioni e solo dopo le tabelle.</p>
<h2 id="nota-bene">Nota Bene</h2>
<p>Probabilmente c’è una ottima ragione per cui non disponete dei diritti di cancellazione del database. Prima di lanciare questo codice chiedetevi almeno dieci volte se 1) state sul database giusto, 2) siete coscienti delle conseguenze di quel che state per fare e 3) disponete di un backup dei dati. In ogni caso se perdete dati preziosi <strong>non venite a lamentarvi dal sottoscritto! 😉</strong></p>]]></content:encoded>
    </item>
    <item>
      <title>Come rimuovere tutte le Stored Procedure da un database SQL Server?</title>
      <link>https://nicolaiarocci.com/come-rimuovere-tutte-le-stored-procedure-da-un-database-sql/</link>
      <pubDate>Tue, 08 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-rimuovere-tutte-le-stored-procedure-da-un-database-sql/</guid>
      <description>&lt;p&gt;In questi giorni sto lavorando sui database &lt;strong&gt;SQL Server&lt;/strong&gt; che fanno da back-end ai nostri web services e ne approfitto per fare un po’ manutenzione straordinaria. __Stamattina mi è capitato di dover cancellare tutte le &lt;strong&gt;Stored Procedure&lt;/strong&gt; di un database e ho &lt;a href=&#34;http://www.devasp.net/net/articles/display/309.html&#34;&gt;scovato&lt;/a&gt; questa routine che mi ha fatto risparmiare un mucchio di tempo&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In questi giorni sto lavorando sui database <strong>SQL Server</strong> che fanno da back-end ai nostri web services e ne approfitto per fare un po’ manutenzione straordinaria. __Stamattina mi è capitato di dover cancellare tutte le <strong>Stored Procedure</strong> di un database e ho <a href="http://www.devasp.net/net/articles/display/309.html">scovato</a> questa routine che mi ha fatto risparmiare un mucchio di tempo</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La tecnica è quella di sfruttare la tabella di sistema <em>sys.objects</em> che elenca tutti gli oggetti contenuti nel database. Le Stored Procedure hanno tutte type = ‘P’ per cui è facile individuarle. A questo punto ci sono due possibilità: memorizzarne i nomi in una tabella temporanea per poi lanciare un loop che le cancelli una per una, oppure usare un cursore ed eseguire le cancellazioni con la funzione EXEC. La nostra routine usa il secondo approccio, senz’altro più performante.</p>]]></content:encoded>
    </item>
    <item>
      <title>Programmazione, SEO, Startup – Il Meglio della Settimana #3</title>
      <link>https://nicolaiarocci.com/programmazione-seo-startup-il-meglio-della-settimana-3/</link>
      <pubDate>Sun, 06 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-seo-startup-il-meglio-della-settimana-3/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Settimana ricca di avvenimenti anche questa. SEO, Startup e applicazioni per Smartphone in primo piano ma non mancano altre chicche per buongustai. Al decimo posto una curiosità non ha nulla da spartire con gli argomenti trattati di solito, ma quelle foto dovevo segnalarvele. Ringrazio chi mi ha contattato via mail, Facebook e Twitter. A quanto pare la rubrica piace e farò il possibile per portarla avanti migliorando la qualità delle selezioni, come sempre assolutamente arbitrarie.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Settimana ricca di avvenimenti anche questa. SEO, Startup e applicazioni per Smartphone in primo piano ma non mancano altre chicche per buongustai. Al decimo posto una curiosità non ha nulla da spartire con gli argomenti trattati di solito, ma quelle foto dovevo segnalarvele. Ringrazio chi mi ha contattato via mail, Facebook e Twitter. A quanto pare la rubrica piace e farò il possibile per portarla avanti migliorando la qualità delle selezioni, come sempre assolutamente arbitrarie.</p>
<ol>
<li>
<p><strong><a href="http://cdixon.org/2011/03/05/seo-is-no-longer-a-viable-marketing-strategy-for-startups/">SEO non è più una strategia valida per le Startup</a></strong></p>
<p>Opinione fuori dal coro quella di Chris Dixon, CEO di Hunch e investitore seriale (Skype, Foursquare, Stack Overflow e altri). Chris sostiene che le Startup dovrebbero smetterla di puntare su SEO. Alla base del successo di molte Startup dell’ultimo decennio, l’industria SEO è cresciuta talmente che il mercato ne é saturo. Al punto che Google ormai fatica a distinguere i contenuti di qualità da quelli <em>SEO-optimized</em>. Nei commenti una discussione vivace alle quale partecipano investitori famosi e SEO guru internazionali.</p>
</li>
<li>
<p><strong><a href="http://www.marioconcina.it/blog/mobile-development/analisi-sullo-sviluppo-di-applicazioni-per-smartphone.html">Analisi sullo sviluppo di applicazioni per Smartphone</a></strong></p>
</li>
</ol>
<pre><code>Secondo molti lo sviluppo di applicazioni mobile è il futuro. Ma quale è la piattaforma sulla quale puntare investendo tempo e denaro? Mario Concina ci offre una bella panoramica su linguaggi, costi e pro e contro di ognuna delle piattaforme tecnologiche più importanti (iPhone, Android, Windows Mobile, Symbian, BlackBerry)
</code></pre>
<ol start="3">
<li>**[<!-- raw HTML omitted -->Settimana ricca di avvenimenti anche questa. SEO, Startup e applicazioni per Smartphone in primo piano ma non mancano altre chicche per buongustai. Al decimo posto una curiosità non ha nulla da spartire con gli argomenti trattati di solito, ma quelle foto dovevo segnalarvele. Ringrazio chi mi ha contattato via mail, Facebook e Twitter. A quanto pare la rubrica piace e farò il possibile per portarla avanti migliorando la qualità delle selezioni, come sempre assolutamente arbitrarie.</li>
</ol>
<ol>
<li><strong><a href="http://cdixon.org/2011/03/05/seo-is-no-longer-a-viable-marketing-strategy-for-startups/">SEO non è più una strategia valida per le Startup</a></strong></li>
</ol>
<pre><code>Opinione fuori dal coro quella di Chris Dixon, CEO di Hunch e investitore seriale (Skype, Foursquare, Stack Overflow e altri). Chris sostiene che le Startup dovrebbero smetterla di puntare su SEO. Alla base del successo di molte Startup dell&amp;#8217;ultimo decennio, l&amp;#8217;industria SEO è cresciuta talmente che il mercato ne é saturo. Al punto che Google ormai fatica a distinguere i contenuti di qualità da quelli _SEO-optimized_. Nei commenti una discussione vivace alle quale partecipano investitori famosi e SEO guru internazionali.
</code></pre>
<ol start="2">
<li><strong><a href="http://www.marioconcina.it/blog/mobile-development/analisi-sullo-sviluppo-di-applicazioni-per-smartphone.html">Analisi sullo sviluppo di applicazioni per Smartphone</a></strong></li>
</ol>
<pre><code>Secondo molti lo sviluppo di applicazioni mobile è il futuro. Ma quale è la piattaforma sulla quale puntare investendo tempo e denaro? Mario Concina ci offre una bella panoramica su linguaggi, costi e pro e contro di ognuna delle piattaforme tecnologiche più importanti (iPhone, Android, Windows Mobile, Symbian, BlackBerry)
</code></pre>
<ol start="3">
<li><strong>]<a href="http://www.pcworld.com/article/221159/5_new_ways_build_iphone_android_browser_apps.html">3</a></strong> Molte Startup lanciano in questi giorni prodotti e soluzioni che promettono di semplificare la creazione di applicazioni mobile. In questo articolo PC World ne presenta cinque. Alcune promettono la luna: creazione rapida di applicazioni mobile per tutti, programmatori e non.</li>
<li><a href="http://www.attackofdesign.com/coder-who-cant-design-and-designers-who-cant-code/"><strong>Programmatori che non sono Designer, Designer che non sono Programmatori</strong></a></li>
</ol>
<pre><code>Il programmatore incapace di accoppiare due colori. Il designer inetto col codice. O ci riconosciamo in una di queste figure (io nella prima), o ne abbiamo incontrate nella nostra carriera. Questo breve articolo ne traccia il profilo.
</code></pre>
<ol start="5">
<li><strong><a href="http://www.bigthink.it/facebook-e-i-nuovi-commenti-sincronizzati/">Facebook e i nuovi commenti sincronizzati</a></strong></li>
</ol>
<pre><code>Facebook è in gran spolvero di questi tempi. Solo quindici giorni fa aggiornava subdolamente il Like Button e questa settimana mette mano al plugin dei Commenti. La novità è destinata a influire pesantemente sulla penetrazione di Facebook nel &amp;#8216;resto della rete&amp;#8217;. Con la solita dovizia di particolari BigThink ci spiega gli aspetti pratici di questo aggiornamento.

&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://www.bigthink.it/facebook-e-i-nuovi-commenti-sincronizzati/&quot;&gt;&lt;/a&gt;
</code></pre>
<ol start="6">
<li><a href="http://startup.wikli.it/"><strong>Startup.Wikli.it</strong></a></li>
</ol>
<pre><code>Startup, web, acquisizioni e venture capital. Wikli seleziona e commenta le news tematiche più interessanti della settimana, le confeziona e te le fa trovare puntuali nella casella di posta ogni venerdì alle 8.00. Idea brillante e molto ben congegnata. Vi invito ad iscrivervi a questa innovativa mailing list. Non ve ne pentirete.
</code></pre>
<ol start="7">
<li><a href="http://www.fabiolalli.com/2011/03/02/yeplike-startup-in-72-ore/"><strong>YepLike! Startup in 72 ore</strong></a></li>
</ol>
<pre><code>In preda a delirio febbricitante Fabio Lalli si inventa una idea da lanciare in 72 ore. Leggete il suo racconto. PS: nel frattempo le 72 ore sono trascorse, l&amp;#8217;applicazione è su iPhone e a quanto pare riscuote buon successo.
</code></pre>
<ol start="8">
<li><a href="http://rgarg.posterous.com/20-software-development-best-practices"><strong>Venti consigli pratici per il programmatore</strong></a></li>
</ol>
<pre><code>Di post di questo tipo se ne trovano tanti in rete ma questo mi ha colpito perché contiene alcune chicche interessanti che denotano esperienza diretta da parte dell&amp;#8217;autore. Da non perdere se siete principianti. Se siete esperti vi riconoscerete senz&amp;#8217;altro in alcune di queste situazioni.
</code></pre>
<ol start="9">
<li><a href="http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read"><strong>Quale è il libro fondamentale che ogni programmatore dovrebbe leggere nella vita?</strong></a></li>
</ol>
<pre><code>Su Stack Overflow se ne è discusso a lungo. Il risultato è una selezione di alcuni tra i libri più importanti di sempre. Il fatto che il Kernighan &amp; Ritchie non sia il primo in classifica la dice lunga sulla mia vetustità. Sono un collezionista di prime edizioni, ammetto che vedere riuniti così tanti testi fondamentali mi ha fatto prudere le mani.
</code></pre>
<ol start="10">
<li><a href="http://www.howtobearetronaut.com/2011/02/shackletons-antarctica-in-colour-1915/"><strong>Shackleton, L’Antartide a Colori – 1915</strong></a></li>
</ol>
<pre><code>Nel 1915 Shackleton e i suoi uomini furono costretti ad abbandonare la &amp;#8216;Endurance&amp;#8217;, inesorabilmente intrappolata dai ghiacci. Frank Hurley, il fotografo dela spedizione, riuscì miracolosamente a salvare le lastre fotografiche di quella spedizione. In questa magnifica galleria vediamo le foto (a colori) di quella spedizione
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft, mi tocca boicottare pure IE6countdown.com</title>
      <link>https://nicolaiarocci.com/microsoft-mi-tocca-boicottare-pure-ie6countdown-com/</link>
      <pubDate>Sat, 05 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/microsoft-mi-tocca-boicottare-pure-ie6countdown-com/</guid>
      <description>&lt;p&gt;Col suo sito &lt;a href=&#34;http://www.ie6countdown.com/&#34;&gt;IE6countdown.com&lt;/a&gt; Microsoft riconosce finalmente che l’ormai decenne (2001) Internet Explorer 6 ha fatto il suo tempo. E’ ora di guardare avanti.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Il sito invita i web master di tutto il mondo a unirsi alla crociata per la distruzione della vetusta reliquia aggiungendo un banner alle loro home page. Il banner compare solo quando la pagina è aperta da IE6, spiegando al visitatore che il suo browser è obsoleto e di scarsa qualità (questo in effetti dimentica di dirlo) e suggerendo di aggiornarlo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Col suo sito <a href="http://www.ie6countdown.com/">IE6countdown.com</a> Microsoft riconosce finalmente che l’ormai decenne (2001) Internet Explorer 6 ha fatto il suo tempo. E’ ora di guardare avanti.</p>
<!-- raw HTML omitted -->
<p>Il sito invita i web master di tutto il mondo a unirsi alla crociata per la distruzione della vetusta reliquia aggiungendo un banner alle loro home page. Il banner compare solo quando la pagina è aperta da IE6, spiegando al visitatore che il suo browser è obsoleto e di scarsa qualità (questo in effetti dimentica di dirlo) e suggerendo di aggiornarlo.</p>
<!-- raw HTML omitted -->
<p>E’ probabile che decine di migliaia di siti adotteranno il banner. E’ interesse comune che IE6 abbandoni le scene al più presto. Tutti vorremmo che le nostre pagine venissero visitate da browser moderni che supportano HTML5 e CSS3. Giusto?</p>
<h2 id="piccolo-dettaglio-insignificante">Piccolo dettaglio insignificante</h2>
<p>C’è però un dettaglio, prontamente segnalato da <a href="http://statichtml.com/2011/ie6-countdown-a-wolf-in-sheeps-clothing.html">Steve Webster</a>, che non quadra. Cliccando sul banner veniamo indirizzati al <a href="http://www.microsoft.com/windows/internet-explorer/default.aspx">sito di Internet Explorer</a> dove siamo invitati a scaricare l’ultimo aggiornamento. Quando va bene chi oggi usa ancora IE6 sta su piattaforma Windows XP. E’ cosa nota che <a href="http://www.theregister.co.uk/2010/09/16/no_ie9_9_on_windows_xp/">Internet Explorer 9 non gira su sistemi precedenti a Vista SP2</a>. L’unica opzione di aggiornamento valida rimane…</p>
<p>…Internet Explorer 8. Un browser vecchio di due anni che si trova sull’orlo dell’obsolescenza e non supporta affatto HTML5. Certo sempre meglio di IE6 ma c’è in giro di molto meglio, non trovate? Fate la cosa giusta e mettete mano al codice che trovate su IE6countdown.com. Fate puntare il vostro banner a <a href="http://google.com/chrome">Chrome</a>, <a href="http://www.getfirefox.com/">Firefox</a>, <a href="http://www.opera.com/">Opera</a> o <a href="http://www.apple.com/it/safari/">Safari</a>. Già che ci siete aggiungete il tag <em>alt</em> (se lo sono scordato) e sostituite l’immagine con una che non ricordi gli anni 90 del secolo scorso.</p>]]></content:encoded>
    </item>
    <item>
      <title>Introduzione alle Regular Expression – Terza Parte</title>
      <link>https://nicolaiarocci.com/introduzione-alle-regular-expression-terza-parte/</link>
      <pubDate>Thu, 03 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introduzione-alle-regular-expression-terza-parte/</guid>
      <description>&lt;p&gt;Benvenuto alla terza e ultima parte della nostra &lt;em&gt;Introduzione alle Regular
Expression&lt;/em&gt;. Concluso il capitolo sarai  in grado di affrontare la maggior
parte dei problemi di ricerca nel testo. Se ancora non l&amp;rsquo;hai fatto ti
consiglio di leggere la &lt;a href=&#34;http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/&#34;&gt;Prima Parte&lt;/a&gt; e la &lt;a href=&#34;http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/&#34;&gt;Seconda Parte&lt;/a&gt;. Ricorda che
puoi usare la &lt;!-- raw HTML omitted --&gt;pagina di
prova&lt;!-- raw HTML omitted --&gt; per testare le query della guida.&lt;/p&gt;
&lt;h2 id=&#34;avidità&#34;&gt;Avidità&lt;/h2&gt;
&lt;p&gt;Il problema della avidità degli operatori regex diventa evidente quando si
comincia a lavorare su ricerche avanzate. Un caso tipico è il parsing di file
XML o HTML.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Benvenuto alla terza e ultima parte della nostra <em>Introduzione alle Regular
Expression</em>. Concluso il capitolo sarai  in grado di affrontare la maggior
parte dei problemi di ricerca nel testo. Se ancora non l&rsquo;hai fatto ti
consiglio di leggere la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/">Prima Parte</a> e la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/">Seconda Parte</a>. Ricorda che
puoi usare la <!-- raw HTML omitted -->pagina di
prova<!-- raw HTML omitted --> per testare le query della guida.</p>
<h2 id="avidità">Avidità</h2>
<p>Il problema della avidità degli operatori regex diventa evidente quando si
comincia a lavorare su ricerche avanzate. Un caso tipico è il parsing di file
XML o HTML.</p>
<pre><code>&lt;p&gt;questo è un &lt;b&gt;paragrafo&lt;/b&gt;&lt;/p&gt;
</code></pre>
<p>Supponiamo di voler trovare tutti i tag usati.</p>
<pre><code>&lt;.*&gt; # cerca tutti i tag
</code></pre>
<p>Il risultato della query non è quello che ci si potrebbe aspettare.
L&rsquo;operatore <code>*</code> è <em>avido</em>, ovvero cerca di catturare più caratteri
possibili. Una volta trovato il primo <code>&lt;</code> prosegue avidamente selezionando tutto
fino all&rsquo;ultimo <code>&gt;</code>. In questo caso vogliamo che si fermi al primo <code>&gt;</code>, non
all&rsquo;ultimo. E&rsquo; questa una distinzione importante, da comprendere
a fondo. Possiamo disattivare il comportamento avido aggiungendo il carattere?</p>
<pre><code>&lt;.*?&gt; # ora otteniamo quel che vogliamo (niente avidità)
</code></pre>
<p>Se desideriamo usare l&rsquo;operatore <code>+</code> (1 o più) al posto del <code>*</code> (zero o più),
la nostra query diventa <code>&lt;.+?&gt;</code>.</p>
<h2 id="confini">Confini</h2>
<p>Nella <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/">seconda parte</a> del nostro tutorial abbiamo convalidato un numero
telefonico nel formato 555-12345678</p>
<pre><code>555-\d{8}   # 555- seguito da 8 cifre
</code></pre>
<p>Anche se tecnicamente corretta questa query non è perfetta. Se la testiamo con
queste stringhe:</p>
<pre><code>testoDavanti 555-12345678
555-12345678 il mio telefono
</code></pre>
<p>scopriamo che vengono accettate perché la regola <code>555-\d{8}</code> è ancora valida.
In realtà noi desideriamo accettare il solo il numero telefonico, niente
altro. La soluzione richiede l&rsquo;uso degli operatori di confine:</p>
<pre><code>^555-\d{8}$
</code></pre>
<p>I confini sono caratteri speciali perché non occupano spazio. Sono dei
segnaposto che servono a delimitare il testo da cercare. Dopo l&rsquo;inizio
<code>(^)</code> deve esserci il nostro numero di telefono; prima della fine <code>($)</code> deve
esserci il nostro numero di telefono.</p>
<!-- raw HTML omitted -->
<pre><code>&lt;th&gt;
  significato
&lt;/th&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td style=&quot;vertical-align: top;&quot;&gt;
  Inizio del testo. Sfortunatamente gli inventori di regex hanno scelto lo stesso carattere usato per la negazione. E&amp;#8217; importante riconoscerne il significato in base al contesto. Quando non è compreso tra [ e ] il carattere ^ è un confine e indica l&amp;#8217;inizio del testo.
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  fine del testo
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<p>Quindi</p>
<pre><code>a   #  trova qualunque a
^a  #  trova solo il testo che comincia per a
a$  #  trova solo il testo che finisce per a
</code></pre>
<p>C&rsquo;è un altro confine, quello di parola <code>(\b)</code>. Vediamo un esempio. Vogliamo
cercare le parole &ldquo;for&rdquo; e &ldquo;she&rdquo; nella nostra <!-- raw HTML omitted -->pagina di test<!-- raw HTML omitted -->.</p>
<pre><code>(for|she)  # trova for e she
</code></pre>
<p>Non va male. Trova tutte le occorrenze di &ldquo;she&rdquo; e &ldquo;for&rdquo;, tuttavia viene
selezionata anche la parola &ldquo;before&rdquo;. Non è il comportamento desiderato.
Potremmo tentare cercando solo le occorrenze precedute e succedute da uno
spazio.</p>
<pre><code>[ ](for|she)[ ]  # cerca for o she
</code></pre>
<p>Va meglio. Non seleziona più before. Abbiamo però un nuovo problema. Nel testo
c&rsquo;è la frase &ldquo;for she had plenty of time&rdquo;. La nostra regex non ha individuato
la parola &ldquo;she&rdquo; contenuta nella frase. Per quale motivo?</p>
<pre><code>for she had plenty of time
</code></pre>
<p>Con il &ldquo;for&rdquo; iniziale abbiamo già rintracciato lo spazio che precede &ldquo;she&rdquo;, che
quindi viene escluso. Sono queste le situazioni un cui un confine di parola può
risolvere il problema.</p>
<pre><code>\b(for|she)\b  # trova she oppure for
</code></pre>
<p>Il confine <code>\b</code> definisce dove la parola comincia e finisce, proprio come
succede con i confini visti prima. Abbiamo detto prima che i &ldquo;confini non
occupano spazio&rdquo;. Nell&rsquo;esempio qui sopra cerchiamo esattamente
&ldquo;for&rdquo; o &ldquo;she&rdquo;. Non cerchiamo la stringa <code>\b</code> e questa non occupa alcuno spazio
durante la ricerca, a differenza di quel che è successo quando abbiamo tentato
di usare la <code>[cornice]</code>. E&rsquo; un dettaglio importate perché con tutti gli
altri operatori regex ciò che è nella query &ldquo;occupa spazio&rdquo; e non
può essere trovato <em>di nuovo</em>.</p>
<h2 id="il-finale-ricerca-e-sostituzione">Il Finale: Ricerca e Sostituzione</h2>
<p>Ce l&rsquo;hai fatta! Sei arrivato in fondo. Congratulazioni. Il meglio arriva ora.
Ricerca e sostituzione è senz&rsquo;altro il mio argomento preferito. Qui la pagina
di test non ci può aiutare, occorre qualche tipo di editor oppure una IDE
(Eclipse/Notepad++/Wordpad).</p>
<p>Supponiamo di avere un file composto da 100 righe come queste</p>
<pre><code>31-01-10_backup32
24-01-10_backup1
24-02-10_backup_mona
11-03-09_backup_lisa
</code></pre>
<p>Vogliamo correggere le date portandole dal formato europeo a quello americano
(da <code>gg-mm-aa</code> a <code>mm-gg-aaaa</code>).</p>
<pre><code>\d{2}-\d{2}-\d{2}_backup.*  // trova le nostre righe
</code></pre>
<p>Per ogni riga desideriamo sostituire aree specifiche quindi ricorriamo
all&rsquo;operatore di raggruppamento già visto nella <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/">seconda parte</a> di
questa guida.</p>
<pre><code>(\d{2})-(\d{2})-(\d{2})_backup(.*)  // ci siamo
</code></pre>
<p>A questo punto tutto quel che dobbiamo fare è sostituire le righe trovate con</p>
<p><!-- raw HTML omitted -->{Gruppo2}<!-- raw HTML omitted -->–<!-- raw HTML omitted -->{Gruppo1}<!-- raw HTML omitted -->-20<!-- raw HTML omitted -->{Gruppo3}<!-- raw HTML omitted -->_backup<!-- raw HTML omitted -->{Gruppo4}<!-- raw HTML omitted --></p>
<p>Il che si traduce nella seguente espressione di sostituzione</p>
<pre><code>\2-\1-20\3_backup\4
</code></pre>
<p>Facile no? Niente più lavori ripetitivi. La mia regola è: se un testo richiede
la modifica di più di cinque righe è giunta l&rsquo;ora di ricorrere alle
regex. Potrebbe sembrare una esagerazione. Eppure un programmatore dovrebbe
rifiutarsi per principio di ripetere manualmente un lavoro che può essere
automatizzato.</p>
<p>Buona fortuna.</p>
<p>Questo articolo è una traduzione autorizzata di <a href="http://www.agillo.net/regex-primer-part-3/">Regex Primer: Part 3</a>.
Ringrazio l&rsquo;autore per il permesso accordatomi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>TEMPO: mostrare dati JSON con solo codice HTML</title>
      <link>https://nicolaiarocci.com/tempo-mostrare-dati-json-con-solo-codice-html/</link>
      <pubDate>Thu, 03 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/tempo-mostrare-dati-json-con-solo-codice-html/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Lanciata da pochi giorni, &lt;a href=&#34;http://tempojs.com/&#34;&gt;&lt;!-- raw HTML omitted --&gt;Lanciata da pochi giorni,&lt;/a&gt; è una piccola (4Kb) e brillante libreria JavaScript che ci mette a disposizione un &lt;em&gt;rendering engine&lt;/em&gt; JSON controllabile con puro codice HTML. La separazione tra HTML e JavaScript rende più facile il lavoro con contenuti AJAX, aumenta la leggibilità del codice e ne facilita la manutenzione. Tempo è compatibile con tutti i browser (IE6 incluso), si integra alla perfezione con jQuery ed è davvero facile da usare.&lt;/p&gt;
&lt;h2 id=&#34;json&#34;&gt;JSON&lt;/h2&gt;
&lt;p&gt;JSON è un formato di scambio dati sempre più diffuso. Un flusso di dati JSON è relativamente compatto (soprattutto rispetto al suo rivale XML) ed è facile da interpretare sia per un umano che per un computer. Ormai tutte le Web API più usate (Facebook, Twitter, ecc.) supportano ampiamente JSON. Ecco un esempio di array JSON:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Lanciata da pochi giorni, <a href="http://tempojs.com/"><!-- raw HTML omitted -->Lanciata da pochi giorni,</a> è una piccola (4Kb) e brillante libreria JavaScript che ci mette a disposizione un <em>rendering engine</em> JSON controllabile con puro codice HTML. La separazione tra HTML e JavaScript rende più facile il lavoro con contenuti AJAX, aumenta la leggibilità del codice e ne facilita la manutenzione. Tempo è compatibile con tutti i browser (IE6 incluso), si integra alla perfezione con jQuery ed è davvero facile da usare.</p>
<h2 id="json">JSON</h2>
<p>JSON è un formato di scambio dati sempre più diffuso. Un flusso di dati JSON è relativamente compatto (soprattutto rispetto al suo rivale XML) ed è facile da interpretare sia per un umano che per un computer. Ormai tutte le Web API più usate (Facebook, Twitter, ecc.) supportano ampiamente JSON. Ecco un esempio di array JSON:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="javascript">JavaScript</h2>
<p>Dopo aver <a href="https://github.com/twigkit/tempo/zipball/master">scaricato</a> la libreria includiamola nella nostra pagina:</p>
<!-- raw HTML omitted -->
<h3 id="tempoprepareelement">Tempo.prepare(element)</h3>
<p>Tempo.Prepare() cerca uno o più data-template in un contenitore HTML, li mette in cache e li rimuove dalla pagina (verranno sostituiti dai dati in fase di rendering). Restituisce infine una istanza specializzata del <em>renderer</em> che, grazie alle indicazioni contenute nei data-template, sa già come mostrare i dati. Se stiamo usando jQuery possiamo passare direttamente l’oggetto jQuery.</p>
<h3 id="rendererrenderdata">renderer.render(data)</h3>
<p>Il metodo <em>render</em> si applica alla instanza del renderer restituita da Tempo.prepare(). Accetta come argomento i dati JSON e li mostra finalmente nella nostra pagina HTML.</p>
<!-- raw HTML omitted -->
<h2 id="html">HTML</h2>
<h3 id="span-stylefont-size-13px-font-weight-normaltempo-riconosce-come-template-qualunque-tag-con-attributo-emdata-template-emche-siacontenuto-nell8217elemento-html-da-noi-indicato-indichiamo-i-campi-dell8217array-json-col-nome-racchiuso-tra-doppie-parentesi-span"><!-- raw HTML omitted -->Tempo riconosce come template qualunque tag con attributo <!-- raw HTML omitted -->data-template <!-- raw HTML omitted -->che sia contenuto nell’elemento HTML da noi indicato. Indichiamo i campi dell’array JSON col nome racchiuso tra doppie parentesi {{}}<!-- raw HTML omitted --></h3>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>il codice viene reso con:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Per le funzionalità avanzate (condizioni se-allora, data-template nidificati, supporto jQuery e gestione callbacks ed eventi) vi rimando alla <a href="http://tempojs.com/">pagina ufficiale</a> della libreria, dalla quale peraltro ho tratto gran parte di questo esempio. Vi trovate anche un <a href="http://tempojs.com/examples/twitter">esempio funzionante</a> di rendering di un flusso proveniente da Twitter e recuperato via jQuery.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ecco Cloud9 IDE la Piattaforma per Programmare nel Cloud</title>
      <link>https://nicolaiarocci.com/arriva-cloud9-ide-la-piattaforma-per-il-software-online/</link>
      <pubDate>Tue, 01 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/arriva-cloud9-ide-la-piattaforma-per-il-software-online/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Se crei applicazioni per il web non avrebbe senso svilupparle online? Con questa domanda e con uno slogan ben congegnato (&lt;em&gt;Il tuo codice sempre disponibile, ovunque tu sia&lt;/em&gt;) &lt;strong&gt;&lt;a href=&#34;http://cloud9ide.com/&#34;&gt;Cloud9 IDE&lt;/a&gt;&lt;/strong&gt; si presenta finalmente al pubblico. L’idea iniziale era una piattaforma online condivisa e open source per sviluppare codice JavaScript direttamente nel browser. Talento e ambizione hanno consentito di puntare più in alto e Cloud9 è diventata una piattaforma completa per la produzione di software &lt;em&gt;in the cloud&lt;/em&gt; (&lt;a href=&#34;http://en.wikipedia.org/wiki/Platform_as_a_service&#34;&gt;PaaS&lt;/a&gt;). Ma vediamo meglio di cosa si tratta.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Se crei applicazioni per il web non avrebbe senso svilupparle online? Con questa domanda e con uno slogan ben congegnato (<em>Il tuo codice sempre disponibile, ovunque tu sia</em>) <strong><a href="http://cloud9ide.com/">Cloud9 IDE</a></strong> si presenta finalmente al pubblico. L’idea iniziale era una piattaforma online condivisa e open source per sviluppare codice JavaScript direttamente nel browser. Talento e ambizione hanno consentito di puntare più in alto e Cloud9 è diventata una piattaforma completa per la produzione di software <em>in the cloud</em> (<a href="http://en.wikipedia.org/wiki/Platform_as_a_service">PaaS</a>). Ma vediamo meglio di cosa si tratta.</p>
<p>Già un mese fa <a href="http://nicolaiarocci.com/il-futuro-del-codici-sorgente-e-online/">presentando il Progetto Orion</a> accennavo a Cloud9, allora in beta avanzata. Erano disponibili pochi dettagli e soprattutto mancavano i prezzi. Partiamo dalle caratteristiche salienti.</p>
<h2 id="punti-di-forza">Punti di forza</h2>
<p>Cloud9 si vanta di possedere il miglior editor online per linguaggi dinamici. In effetti l’editor è un progetto originale Mozilla (<a href="http://mozillalabs.com/skywriter/">Skywriter</a>), poi integrato in <a href="http://ace.ajax.org/">Ace</a>. Il codice viene convalidato in tempo reale ed è possibile fare debug e lanciare applicazioni direttamente dal browser. Molte le funzioni per la collaborazione: chat integrato, modifiche condivise in tempo reale, team management e, <em>dulcis in fundo</em>, integrazione completa con <a href="https://github.com/">GitHub</a> (una UI per GitHub è in lavorazione, al momento è disponibile la classica linea di comando). Vedere per credere:</p>
<!-- raw HTML omitted -->
<pre><code>      &lt;p class=&quot;wp-caption-text&quot;&gt;
        Editor per linguaggi dinamici integrato nel browser
      &lt;/p&gt;
    &lt;/div&gt;&lt;/td&gt; 
    
    &lt;td&gt;
      &lt;p&gt;
        &lt;div id=&quot;attachment_1274&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
          &lt;a href=&quot;images/cloud9_2.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1274  &quot; title=&quot;Convalida del codice JavaScript in tempo reale&quot; src=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_2-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
          
          &lt;p class=&quot;wp-caption-text&quot;&gt;
            Convalida del codice JavaScript in tempo reale
          &lt;/p&gt;
        &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; 
        
        &lt;tr&gt;
          &lt;td&gt;
            &lt;p&gt;
              &lt;div id=&quot;attachment_1275&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                &lt;a href=&quot;http://i2.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_21.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1275   &quot; title=&quot;Chat intengrato in Cloud9&quot; src=&quot;images/cloud9_21-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                
                &lt;p class=&quot;wp-caption-text&quot;&gt;
                  Chat intengrato in Cloud9
                &lt;/p&gt;
              &lt;/div&gt;&lt;/td&gt; 
              
              &lt;td&gt;
                &lt;p&gt;
                  &lt;div id=&quot;attachment_1276&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                    &lt;a href=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_4.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1276    &quot; title=&quot;Gruppi di lavoro&quot; src=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_4-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                    
                    &lt;p class=&quot;wp-caption-text&quot;&gt;
                      Gruppi di lavoro
                    &lt;/p&gt;
                  &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; 
                  
                  &lt;tr&gt;
                    &lt;td&gt;
                      &lt;p&gt;
                        &lt;div id=&quot;attachment_1277&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                          &lt;a href=&quot;images/cloud9_5.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1277  &quot; title=&quot;Run e Debug online&quot; src=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_5-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                          
                          &lt;p class=&quot;wp-caption-text&quot;&gt;
                            Run e Debug online
                          &lt;/p&gt;
                        &lt;/div&gt;&lt;/td&gt; 
                        
                        &lt;td&gt;
                          &lt;p&gt;
                            &lt;div id=&quot;attachment_1278&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                              &lt;a href=&quot;images/cloud9_6.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1278  &quot; title=&quot;Integrazione con GitHub&quot; src=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_6-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                              
                              &lt;p class=&quot;wp-caption-text&quot;&gt;
                                Integrazione con GitHub
                              &lt;/p&gt;
                            &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; 
                            
                            &lt;tr&gt;
                              &lt;td&gt;
                                &lt;p&gt;
                                  &lt;div id=&quot;attachment_1279&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                                    &lt;a href=&quot;http://i2.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_7.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1279  &quot; title=&quot;Team Management&quot; src=&quot;images/cloud9_7-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                                    
                                    &lt;p class=&quot;wp-caption-text&quot;&gt;
                                      Team Management
                                    &lt;/p&gt;
                                  &lt;/div&gt;&lt;/td&gt; 
                                  
                                  &lt;td&gt;
                                    &lt;p&gt;
                                      &lt;div id=&quot;attachment_1280&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                                        &lt;a href=&quot;images/cloud9_8.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1280  &quot; title=&quot;Accedi al codice ovunque tu sia&quot; src=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_8-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                                        
                                        &lt;p class=&quot;wp-caption-text&quot;&gt;
                                          Accedi al codice ovunque tu sia
                                        &lt;/p&gt;
                                      &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; 
                                      
                                      &lt;h2&gt;
                                        Linguaggi e Frameworks
                                      &lt;/h2&gt;
                                      
                                      &lt;p&gt;
                                        JavaScript naturalmente è supportato al 100%. Ruby anche, seppure parzialmente. Cloud9 mira a integrare tutti i linguaggi e i framework più diffusi. Per quanto riguarda i linguaggi della galassia Microsoft per ora nulla da fare (ma c&amp;#8217;è sempre &lt;strong&gt;&lt;a href=&quot;http://www.coderun.com/&quot;&gt;CodeRun&lt;/a&gt;&lt;/strong&gt;), anche se ho colto un (molto) blando accenno a un futuro supporto per Mono. Cloud9 supporterà il &lt;em&gt;one-click-deploy&lt;/em&gt; su altre piattaforme cloud e il mounting di drive locali per consentire l&amp;#8217;accesso ai files remoti da parte di applicazioni esterne. Insomma il menù è ricco e invitante, bisognerà vedere a che ritmo si succederanno le implementazioni.
                                      &lt;/p&gt;
                                      
                                      &lt;h2&gt;
                                        Piani tariffari
                                      &lt;/h2&gt;
                                      
                                      &lt;p&gt;
                                        Qui la faccenda si fa ancor più interessante e per certi versi sorprendente. I progetti open source possono accedere a Cloud9 gratuitamente. Quelli commerciali possono scegliere tra due piani tariffari, uno giornaliero (€0.33/giorno) e uno mensile (€39/mese). Il piano giornaliero mi incuriosisce parecchio. Se ho ben capito si pagano solo i giorni di uso effettivo, se così fosse si tratterebbe di una soluzione davvero valida oltre che originale. Ad ogni buon conto è previsto un periodo di prova di 30 giorni.
                                      &lt;/p&gt;
                                      
                                      &lt;h2&gt;
                                        Coraggio!
                                      &lt;/h2&gt;
                                      
                                      &lt;p&gt;
                                        Sono intrigato un bel pò, l&amp;#8217;avrete capito. Le titubanze sono legittime, per carità. Sicurezza e riservatezza sono aspetti importanti; queste piattaforme cloud potranno garantirle? Molti di noi hanno superato da tempo queste paure appoggiandosi (per progetti aperti e privati) a GitHub, Mercurial e altri servizi repository. E&amp;#8217; forse giunto il momento di cominciare a sporcarsi le mani. Prima o poi dovremo farci i conti comunque, non credete?
                                      &lt;/p&gt;
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Programmazione, SEO, Startups – Il Meglio della Settimana #2</title>
      <link>https://nicolaiarocci.com/programmazione-seo-startups-il-meglio-della-settimana-2/</link>
      <pubDate>Mon, 28 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-seo-startups-il-meglio-della-settimana-2/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Eccoci alla selezione delle notizie e i link che ho trovato più interessanti questa settimana. E’ stata una settimana ricca di avvenimenti e non è stato facile decidere cosa lasciare fuori. Andiamo a cominciare:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Eccoci alla selezione delle notizie e i link che ho trovato più interessanti questa settimana. E’ stata una settimana ricca di avvenimenti e non è stato facile decidere cosa lasciare fuori. Andiamo a cominciare:</p>
<h2 id="like-button-facebook-cambia-le-regole">Like Button: Facebook cambia le regole</h2>
<p>Questa settimana Facebook ha sorpreso tutti cambiando radicalmente il funzionamento del pulsante Mi Piace. Su <strong>BigThink</strong> Daniele Ghidoli è tra i primi ad accorgersene e a segnalare la novità. <a href="http://www.bigthink.it/like-button-facebook-cambia/">Leggi l’articolo su BigThink</a>.</p>
<h2 id="google-migliora-l8217algoritmo-di-indicizzazione-del-web">Google migliora l’algoritmo di indicizzazione del web</h2>
<p>Negli ultimi mesi le critiche sulla qualità ****delle ricerche Google si sono moltiplicate. Le famigerate <em>content farm</em> hanno conquistato le prime posizioni per molte ricerche sulle keyword più importanti. Il gigante di Mountain View annuncia a sorpresa la contromossa, ossia l’aggiornamento del suo algoritmo più importante. L’obiettivo è penalizzare i siti di scarsa qualità e migliorare il ranking di quelli con contenuti validi. <a href="http://googleblog.blogspot.com/2011/02/finding-more-high-quality-sites-in.html">Leggi l’annuncio sul blog ufficiale di Google</a>.</p>
<h2 id="e8217-in-arrivo-una-nuova-bolla-delle-dot-com">E’ in arrivo una nuova Bolla delle Dot-Com?</h2>
<p>Le incredibili valutazioni economiche di servizi come Twitter e Facebook inducono molti a sostenere che ci troviamo nel bel mezzo della seconda bolla delle Dot-Com, declinata questa volta ai social network. <strong>TagliaBlog</strong> pubblica la traduzione di un bell’articolo del Wall Street Journal che, prendendo spunto dalla situazione di Twitter, tenta di fare il punto della situazione. <a href="http://blog.tagliaerbe.com/2011/02/nuova-bolla-dot-com.html">Leggi l’articolo su TagliaBlog</a></p>
<h2 id="come-un-tweet-sbagliato-può-portare-al-successo-commerciale-e-a-una-raccolta-di-sangue">Come un Tweet sbagliato può portare al successo commerciale (e a una raccolta di sangue)</h2>
<p>Quando Gloria Huang si accorge di aver twittato per sbaglio la sua richiesta di birra fresca dall’account del datore di lavoro (la Croce Rossa) non immagina certo di scatenare una donazione di sangue di massa e il successo commerciale della sua birra preferita. <a href="http://money.cnn.com/2011/02/17/smallbusiness/dogfish_redcross/index.htm">Leggi questa storia sul sito della CNN</a></p>
<h2 id="lo-stato-attuale-del-web-design-trends-2010">Lo stato attuale del Web Design: Trends 2010</h2>
<p>Il Web Design sta vivendo un’epoca d’oro. Abbiamo a disposizione strumenti potenti (CSS3, HTML5, il font-embedding), migliaia di risorse gratuite e decine di vivaci comunità online. Ma quali sono le nuove tendenze? Quali le tecniche, i concetti e le idee che si stanno affermando? Questa settimana <strong>Smashing Magazine</strong> tenta di anticipare il Web Design del prossimo futuro. <a href="http://www.smashingmagazine.com/2010/05/04/web-design-trends-2010/">Leggi l’articolo di Smashing Magazine</a>.</p>
<h2 id="diffondiamo-la-cultura-digitale-in-italia">Diffondiamo la Cultura Digitale in Italia</h2>
<p>Interessante il progetto Cultura Digitale curato e ideato da Fabio Lalli e dagli Indigeni Digitali. “Si vuole creare un libro gratuito da distribuire on line e off line che parli della Cultura Digitale, di cosa significa per ognuno di noi”. Chiunque può contribuire pubblicando il proprio pensiero sul wall di Cultura Digitale. L’idea è ingegnosa e ben implementata. Funziona anche perché solletica l’ego di ognuno di noi e sfrutta abilmente i meccanismi virali propri del web 2.0. I contributi affluiscono copiosi.  <a href="http://culturadigitale.com/">Visita il sito di Cultura Digitale</a></p>
<h2 id="mono-210">Mono 2.10</h2>
<p>La versione 2.10 di Mono, la piattaforma open source e multi piattaforma alternativa al Microsoft NET Framework, è stata rilasciata questa settimana. Tra le novità aggiornamenti ai compilatori C# e VB, supporto a MVC3, F# e Native Client Google oltre alla soluzione di molti problemi conosciuti. <a href="http://www.mono-project.com/Release_Notes_Mono_2.10">Leggi le Release Notes ufficiali</a>.</p>
<h2 id="python-32">Python 3.2</h2>
<p>Questa è anche la settimana che ha visto l’uscita dell’ultima release del linguaggio Python, la 3.2. La documentazione ufficiale è stata aggiornata con un documento che illustra accuratamente le novità introdotte con questo aggiornamento. <a href="http://docs.python.org/dev/whatsnew/3.2.html">Leggi le novità su Python 3.2</a>.</p>
<h2 id="google-cloud-connect">Google Cloud Connect</h2>
<p>Google Cloud Connect è un plugin per Microsoft Office che consente di sincronizzare i documenti Office appoggiandosi alla piattaforma Google Docs. Rilasciato da Google, questo plugin rende semplice la collaborazione tra utenti che non vogliono o non possono rinunciare alla suite Microsoft. I documenti possono essere aggiornati sia offline che online. <a href="http://www.readwriteweb.com/enterprise/2011/02/google-releases-microsoft-offi.php">Leggi tutto su Google Cloud Connect</a>.</p>
<h2 id="i-5-migliori-tool-gratuiti-per-sql-server">I 5 migliori tool gratuiti per SQL Server</h2>
<p>Sei pigro e la tua azienda è al verde. Che fare? Brent Ozar, guru SQL Server e uno dei progettisti di Stack Overflow, propone cinque tools gratuiti per la gestione e manutenzione di SQL Server. <a href="http://www.brentozar.com/archive/2011/02/my-favorite-free-sql-server-downloads/">Leggi l’articolo sul sito di Brent Ozar</a>.</p>
<h2 id="introduzione-alle-regular-expression">Introduzione alle Regular Expression</h2>
<p>Concludo con una svergognata auto promozione. Introduzione alle Regular Expression è una serie in tre parti, attualmente in pubblicazione, che ha l’ambizione di consentire a chiunque di avvicinarsi alle Regular Expression. Le RegEx sono un strumento potente e spesso incompreso, utile non solo ai programmatori ma a chiunque abbia a che fare con le ricerche su testo. <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/">Leggi la prima parte della Introduzione alle Regular Expression.</a></p>
<p>Vi è piaciuta questa selezione? Fatemi sapere che ne pensate con un bel commento qui sotto, lo apprezzerei molto. Alla prossima settimana!</p>]]></content:encoded>
    </item>
    <item>
      <title>Introduzione alle Regular Expression – Seconda Parte</title>
      <link>https://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/</link>
      <pubDate>Sat, 26 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/</guid>
      <description>&lt;p&gt;Questa è la seconda parte della serie &lt;em&gt;Introduzione alle Regular Expression&lt;/em&gt;.
Se non hai ancora letto la &lt;a href=&#34;http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/&#34;&gt;prima parte&lt;/a&gt; ti consiglio di farlo. Puoi usare
la &lt;!-- raw HTML omitted --&gt;pagina demo&lt;!-- raw HTML omitted --&gt; per provare
le query della guida.&lt;/p&gt;
&lt;h2 id=&#34;negazione-&#34;&gt;Negazione [^]&lt;/h2&gt;
&lt;p&gt;Abbiamo già conosciuto la &lt;code&gt;[cornice]&lt;/code&gt;. Una caratteristica importante di cui non
abbiamo ancora parlato è la negazione. Supponiamo di voler cercare qualunque
carattere &lt;em&gt;eccetto la lettera a&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Questa è la seconda parte della serie <em>Introduzione alle Regular Expression</em>.
Se non hai ancora letto la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/">prima parte</a> ti consiglio di farlo. Puoi usare
la <!-- raw HTML omitted -->pagina demo<!-- raw HTML omitted --> per provare
le query della guida.</p>
<h2 id="negazione-">Negazione [^]</h2>
<p>Abbiamo già conosciuto la <code>[cornice]</code>. Una caratteristica importante di cui non
abbiamo ancora parlato è la negazione. Supponiamo di voler cercare qualunque
carattere <em>eccetto la lettera a</em>.</p>
<pre><code>[^a] # trova b,c,d,e,f,\n .... qualunque carattere eccetto 'a'
</code></pre>
<p>La negazione si applica a tutti i caratteri della cornice in cui compare
l&rsquo;operatore <code>ˆ</code>. Non è possibile limitarla a solo alcuni.</p>
<pre><code>[^0123456789] # trova qualunque carattere non numerico
</code></pre>
<h2 id="gli-alias">Gli Alias</h2>
<p>Ora siamo pronti per affrontare qualche esempio realistico di regular
expression. Uno degli usi più frequenti delle regex è la convalida di Stringhe.
Proviamo a verificare la correttezza di un ipotetico numero telefonico da
esprimere nel formato 555-12345678. Di norma divideremmo l&rsquo;input in due
parti e proveremmo a convertirle in numeri. Ora tuttavia conosciamo le regex
e possiamo sbrigarcela meglio.</p>
<pre><code>555-[0-9]{7}
</code></pre>
<p>Fatto. Stiamo convalidando 555 seguito da un trattino seguito da 7 caratteri
numerici. Possiamo essere addirittura più sintetici, vediamo come.</p>
<p>I range <code>[0-9]</code> e <code>[a-z]</code>  sono talmente frequenti da saltar fuori continuamente,
tanto che sono state create scorciatoie (alias) dedicate ai range più usati.
Nel nostro caso ci torna utile <code>\d</code>, che sta per digit (carattere numerico)
ed è semanticamente identico a <code>[0-9]</code>.</p>
<pre><code>555-\d{7} # identico a 555-[0-9]{7}
</code></pre>
<p>Gli alias non sono certo indispensabili, puoi ottenere gli stessi risultati
usando la cornice in modo esteso. Tuttavia sono molto comodi.</p>
<!-- raw HTML omitted -->
<pre><code>&lt;th&gt;
  significato
&lt;/th&gt;

&lt;th&gt;
  coorrisponde a
&lt;/th&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  digit (numero)
&lt;/td&gt;

&lt;td&gt;
  [0-9]
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  word (parola)
&lt;/td&gt;

&lt;td&gt;
  [a-zA-Z0-9_]  Include il carattere underscore
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  spazio, tab o newline
&lt;/td&gt;

&lt;td&gt;
  [ \t\r\n]
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  qualsiasi non numerico
&lt;/td&gt;

&lt;td&gt;
  ^\d
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  quasiasi non alfanumerico
&lt;/td&gt;

&lt;td&gt;
  ^\w
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  quasiasi ma non lo spazio
&lt;/td&gt;

&lt;td&gt;
  ^\s
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<p><strong>Suggerimento:</strong> nota come ad ogni alias ne corrisponde uno dal significato
opposto, tutto in maiuscolo. Impara i primi tre per conoscerli tutti e sei.</p>
<h2 id="il-punto">Il Punto</h2>
<p>Il punto è un alias un pò speciale. Ne parlo soprattutto perchè può capitare di
notarlo nel codice scritto da altri. Il punto cerca tutto eccetto il new line
(<code>\n</code>). Il problema è che il carattere new line non è lo stesso su tutte le
piattaforme.</p>
<pre><code>.   # trova tutti i caratteri
.*  # equivalente a [^\n], trova tutti i paragrafi
</code></pre>
<p>Il punto spesso crea confusione. Consiglio di ricorrere a combinazioni di alias
e cornici per ottenere gli stessi risultati senza rischiare errori.</p>
<h2 id="escaping">Escaping</h2>
<p>Capita a volte di dover cercare proprio il punto, oppure i caratteri [ o ].
Poiché fanno parte della sintassi regex in questi casi è necessario riccorrere
all&rsquo;escaping, ovvero precederli col carattere <code>\</code> che rappresenta
l&rsquo;escape. Per esempio</p>
<pre><code>\.    # cerca il punto invece che tutto quanto
\*    # trova tutti gli asterischi
\\    # trova tutti gli escape
</code></pre>
<h2 id="raggruppamenti-e-or">Raggruppamenti e OR</h2>
<p>Torniamo alla convalida. Questa volta vogliamo verificare la validità di un
indirizzo email. Prima di tutto stabiliamo le regole (semplificate) a cui una
stringa deve attenersi per venire convalidata come indirizzo email: 1) il nome
utente può contenere lettere, numeri, underscore e trattini ma deve cominciare
con una lettera; 2) il dominio può contenere solo lettere seguite da un punto
seguito da altre lettere. Quindi domain.fakecom è valido per noi</p>
<pre><code>[a-z][\w-]*@[a-z]+\.[a-z]+
</code></pre>
<p>Presta attenzione all&rsquo;escaping del punto! Un&rsquo;altro dettaglio
importante è il quantificatore <code>+</code> che abbiamo visto nel <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/">primo articolo</a> di
questa serie. Nel dominio infatti vogliamo <em>almeno</em> una lettera, non zero
o più.</p>
<p>Supponiamo ora di voler aggiornare le regole in modo da convalidare solo
i domini più importanti. Il nostro indirizzo email deve finire con com oppure
net. Non possiamo risolvere questo problema con quel che abbiamo imparato
finora. La nostra query regex dovrà ricorrere a due nuovi concetti,
l&rsquo;operatore OR e i gruppi.</p>
<pre><code>[a-z][\w-]*@[a-z]+\.(com|net)
</code></pre>
<p>Vediamo l&rsquo;OR all&rsquo;opera</p>
<pre><code>com|net  #  trova com oppure net
a|b|c    # lo stesso di [abc].
</code></pre>
<p>L&rsquo;aggiunta delle parentesi () si rende necessaria per chiarire che non
vogliamo trovare <em>tutte</em> le occorrenze della parte di regex alla loro sinistra.
Se volessimo &ldquo;Brad Pitt&rdquo; oppure &ldquo;Angelina Pitt&rdquo;</p>
<pre><code>Brad|Angelina Pitt  # trova sia 'Brad' che 'Angelina Pitt'
(Brad|Angelina) Pitt  # ora ci siamo!
</code></pre>
<p>Per un programmatore il concetto del raggruppamento (grouping) con le parentesi
dovrebbe essere facilmente comprensibile. Di fatto possiamo combinarlo con
altri operatori che già conosciamo</p>
<pre><code>(dog)+   #  trova dog,dogdog,dogdogdog ...
java(bean)?    #  trova java o javabean
</code></pre>
<h2 id="conclusione">Conclusione</h2>
<p>Questo conclude la seconda parte della guida. La prossima e ultima parte verrà
pubblicata tra qualche giorno. Nel frattempo raccomando di giocare con la <!-- raw HTML omitted -->pagina demo<!-- raw HTML omitted --> per fare un
pò di pratica.</p>
<p>E&rsquo; ora disponibile anche la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-terza-parte/">terza parte</a> di questo tutorial.</p>
<p>Questo articolo è una traduzione autorizzata di <a href="http://www.agillo.net/regex-primer-part-2/">Regex Primer: Part 2</a>. Ringrazio l&rsquo;autore per il permesso accordatomi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Introduzione alle Regular Expression – Prima Parte</title>
      <link>https://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/</link>
      <pubDate>Wed, 23 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/</guid>
      <description>&lt;p&gt;Quando si tratta fare ricerche in blocchi di testo le &lt;a href=&#34;http://it.wikipedia.org/wiki/Espressione_regolare&#34;&gt;&lt;strong&gt;regular
expression&lt;/strong&gt;&lt;/a&gt; (regex) sono la soluzione ideale. Come programmatore studiare
le regex è stata una delle cose migliori che ho fatto per migliorare la mia
produttività.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Valide in ogni linguaggio e indipendenti dalla piattaforma, le regex sono
un investimento sempre valido. Java, JavaScript, Ruby, .Net, Python…
le regex non cambiano.&lt;/li&gt;
&lt;li&gt;Rendono ricerca e sostituzione del testo &lt;em&gt;enormemente&lt;/em&gt; più potenti&lt;/li&gt;
&lt;li&gt;Soddisfano pienamente il principio &lt;a href=&#34;http://en.wikipedia.org/wiki/Pareto_principle#In_software&#34;&gt;80/20&lt;/a&gt;. Basta conoscerne il 20% per
risolvere l&#39;80% dei problemi.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ho preparato una &lt;!-- raw HTML omitted --&gt;pagina di
prova&lt;!-- raw HTML omitted --&gt; per testare le regex del tutorial. In alternativa è sempre possibile
usare una IDE, praticamente tutte supportano le regular expressions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quando si tratta fare ricerche in blocchi di testo le <a href="http://it.wikipedia.org/wiki/Espressione_regolare"><strong>regular
expression</strong></a> (regex) sono la soluzione ideale. Come programmatore studiare
le regex è stata una delle cose migliori che ho fatto per migliorare la mia
produttività.</p>
<ol>
<li>Valide in ogni linguaggio e indipendenti dalla piattaforma, le regex sono
un investimento sempre valido. Java, JavaScript, Ruby, .Net, Python…
le regex non cambiano.</li>
<li>Rendono ricerca e sostituzione del testo <em>enormemente</em> più potenti</li>
<li>Soddisfano pienamente il principio <a href="http://en.wikipedia.org/wiki/Pareto_principle#In_software">80/20</a>. Basta conoscerne il 20% per
risolvere l'80% dei problemi.</li>
</ol>
<p>Ho preparato una <!-- raw HTML omitted -->pagina di
prova<!-- raw HTML omitted --> per testare le regex del tutorial. In alternativa è sempre possibile
usare una IDE, praticamente tutte supportano le regular expressions.</p>
<h2 id="partiamo-dalla-cornice">Partiamo dalla [cornice]</h2>
<p>La regex più semplice? Eccola:</p>
<pre><code>bank
</code></pre>
<p>La quale cerca &ldquo;bank&rdquo;. Cambiamola leggermente, immaginiamo di voler cercare sia &ldquo;bank&rdquo; che &ldquo;tank&rdquo; nello stesso blocco di testo.</p>
<pre><code>[bt]ank  // cerca sia bank che tank
</code></pre>
<p>La [cornice] rappresenta comunque 1 carattere. Stiamo ancora cercando una
parola di 4 caratteri, ma il primo può essere &ldquo;b&rdquo; oppure &ldquo;t&rdquo;. I caratteri
inclusi nelle parentesi [] sono legati da una relazione di tipo OR. La loro
posizione è irrilevante, <code>[tb]ank</code> è semanticamente identico. Ecco altri esempi
d’uso della [cornice]:</p>
<pre><code>[abc]1              // trova a1, b1 o c1
[cba]1              // trova a1, b1 o c1
file[0123456789]    // trova file0,file1,file2 ... o file9
file[0-9]           // trova file0,file1,file2 ... o file9
[a-z]               // trova a, b, c oppure ... z
</code></pre>
<p>Avrai notato che abbiamo introdotto un nuovo operatore. Usando il carattere
<code>-</code> definiamo un <em>range</em>. Il range ci permette di evitare costrutti
assurdamente lunghi come questo: <code>[abcdefghijklmnopqrstuvwyz]</code>. E’ una
scorciatoia.</p>
<h2 id="proseguiamo-coi-quantificatori">Proseguiamo coi Quantificatori</h2>
<p>Riprendiamo dall’esempio iniziale. Immaginiamo di voler trovare <em>tank</em>,
<em>bank</em>, <em>tanks</em>, e <em>banks</em>. Potremmo provare in questo modo:</p>
<pre><code>[bt]anks?
</code></pre>
<p>Abbiamo aggiunto il <em>quantificatore</em> <code>?</code> che agisce sul carattere
che si trova direttamente alla sua sinistra. Significa <em>una occorrenza oppure
nessuna</em>, quindi nel nostro caso stiamo dicendo &ldquo;cerca [bt]ank con una
&rsquo;s&rsquo; finale o meno&rdquo;. Un quantificatore può essere affiancato a qualunque
carattere e addirittura a una <code>[cornice]</code>. Dai una occhiata a questi esempi:</p>
<pre><code>[bt]anks         // trova banks o tanks
[bt]anks?        // trova bank, tank, banks oppure tanks
[bt]?ank         // trova bank, tank oppure ank
ab?c?            // trova a, ab, abc oppure ac
</code></pre>
<p>Riassumendo, quando usiamo un carattere senza quantificatore indichiamo che ne
cerchiamo una singola occorrenza. Quando aggiungiamo un quantificatore cambia
il numero di occorrenze che vogliamo trovare. Nella tabella seguente trovi
l’elenco dei quantificatori disponibili:</p>
<!-- raw HTML omitted -->
<pre><code>&lt;th&gt;
  significato
&lt;/th&gt;

&lt;th&gt;
  regex
&lt;/th&gt;

&lt;th&gt;
  esempio
&lt;/th&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  zero o 1
&lt;/td&gt;

&lt;td&gt;
  abc?
&lt;/td&gt;

&lt;td&gt;
  ab, abc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  zero o più
&lt;/td&gt;

&lt;td&gt;
  abc*
&lt;/td&gt;

&lt;td&gt;
  ab,abc,abcc,abccc,abcccc,… etc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  uno o più
&lt;/td&gt;

&lt;td&gt;
  abc+
&lt;/td&gt;

&lt;td&gt;
  abc,abcc,abccc,abcccc,…etc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  esattamente n volte
&lt;/td&gt;

&lt;td&gt;
  abc{2}
&lt;/td&gt;

&lt;td&gt;
  abcc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  da n a m volte
&lt;/td&gt;

&lt;td&gt;
  abc{2,3}
&lt;/td&gt;

&lt;td&gt;
  abcc,abccc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<h2 id="concludendo">Concludendo</h2>
<p>Abbiamo appreso la sintassi base che ci consente di fare un pò di pratica.
E’ una buona idea fare quale esperimento in una IDE oppure sulla <!-- raw HTML omitted -->pagina demo<!-- raw HTML omitted -->.</p>
<p>La seconda parte di questa guida è ora <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/">pubblicata</a>.</p>
<p>Questo articolo è una traduzione autorizzata di <a href="http://www.agillo.net/regex-primer-part-1/">Regex Primer: Part 1</a>.
Ringrazio l’autore per il permesso accordatomi.</p>]]></content:encoded>
    </item>
    <item>
      <title>Programmazione, SEO, Startups – Il Meglio della Settimana #1</title>
      <link>https://nicolaiarocci.com/programmazione-seo-startups-il-meglio-della-settimana-1/</link>
      <pubDate>Mon, 21 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-seo-startups-il-meglio-della-settimana-1/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Vi propongo una scelta delle risorse più interessanti e curiose che ho scovato questa settimana in rete. Ce né per tutti i gusti: programmazione, SEO, Startups e curiosità. Andiamo a cominciare:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Vi propongo una scelta delle risorse più interessanti e curiose che ho scovato questa settimana in rete. Ce né per tutti i gusti: programmazione, SEO, Startups e curiosità. Andiamo a cominciare:</p>
<ol>
<li>
<p><strong><a href="http://docs.python.org/dev/howto/pyporting.html">Da Python 2 a Python 3</a></strong></p>
<p>Python 3 è il futuro, ma Python 2 è attualmente la versione più usata al mondo. Ora finalmente la documentazione ufficiale è arricchita da una bella guida alle migliori strategie per supportare entrambe le versioni di Python.</p>
<p><a href="http://docs.python.org/dev/howto/pyporting.html"></a></p>
</li>
<li>
<p><a href="http://blogs.nationalgeographic.com/blogs/news/breakingorbit/2011/01/400-volunteer-for-one-way-mars-trip.html"><strong>Per quale motivo 400 persone si sono offerte volontarie per una viaggio di sola andata verso Marte?</strong></a></p>
</li>
</ol>
<pre><code>Il numero Ottobre-Novembre 2010 del _Journal of Cosmology_ contiene uno speciale di 55 pagine intitolato &amp;#8220;Missione Umana su Marte: Colonizzare il Pianeta Rosso&amp;#8221;. Secondo gli scienziati una missione di sola andata destinata a colonizzare Marte sarebbe possibile entro 20 anni. Cosa ha spinto ben quattrocento lettori a offrirsi come volontari per la missione?
</code></pre>
<ol start="3">
<li><strong><a href="http://www.seomoz.org/blog/tweets-effect-rankings-unexpected-case-study">Il sorprendente effetto di un singolo Tweet sul Page Rank di Google</a></strong></li>
</ol>
<pre><code>Google ha ammesso recentemente che i link provenienti dai social network sono segnali usati nella valutazione dell&amp;#8217;importanza dei siti web. I ragazzi di SEOmoz (tra i migliori esperti SEO in circolazione) sono rimasti esterrefatti dagli effetti che un singolo tweet ha causato sul page rank della loro _Beginners Guide to SEO_.
</code></pre>
<ol start="4">
<li><a href="http://www.lucasartoni.com/lavoro/open-letter-to-an-event-organizer"><strong>Lettera aperta a un organizzatore di eventi</strong></a></li>
</ol>
<pre><code>Per mestiere Luca Sartoni partecipa (come speaker, spettatore o organizzatore) a molte conferenze , seminari e workshops. In questa lettera elenca quelli che secondo lui sono i cinque errori commessi più spesso dagli organizzatori di eventi. E suggerisce come evitarli.
</code></pre>
<ol start="5">
<li><a href="http://en.blog.wordpress.com/2011/02/17/how-is-wordpress-com-made/"><strong>Come si fa WordPress?</strong></a></li>
</ol>
<pre><code>A quanto pare WordPress, pur avendo una sede a San Francisco, è una realtà capillarmente distribuita. Gran parte dei dipendenti lavora da casa ed è disseminata per il mondo, coprendone quasi tutti i fusi orari. In questo articolo sul blog ufficiale dell&amp;#8217;azienda Scott Berkun racconta come si svolge una giornata di lavoro in una azienda di questo tipo.
</code></pre>
<ol start="6">
<li><a href="http://www.allthingsdistributed.com/2011/02/website_amazon_s3.html"><strong>Come ospitare un intero sito (statico) su Amazon S3</strong></a></li>
</ol>
<pre><code>Da qualche tempo Werner Vogels, CTO di Amazon, ospita il suo sito direttamente su S3, la potente piattaforma di _cloud storage_ di Amazon. Una soluzione di questo tipo offre diversi vantaggi, primo fra tutti la scalabilità. In questo articolo Vogels ci spiega come raggiungere lo stesso risultato.
</code></pre>
<ol start="7">
<li><a href="http://www.limedaring.com/im-a-designer-who-learned-django-and-launched-her-first-webapp-in-6-weeks/"><strong>Sono una Designer e ho lanciato la mia prima applicazione in 6 settimane</strong></a></li>
</ol>
<pre><code>Tracy è una designer che non sa quasi nulla di programmazione. Ha una idea su un sito innovativo e tenta senza successo di ottenere un finanziamento che le consenta di assumere un programmatore esperto. Cosa fare? Tracy si rimbocca le maniche e in sei settimane riesce a lanciare una variante (semplificata) della sua idea originale. In Python/Django, ovviamente.
</code></pre>
<ol start="8">
<li><a href="http://sixrevisions.com/web-applications/new-facebook-page/"><strong>La Guida Definitiva al Design delle Pagine Facebook</strong></a></li>
</ol>
<pre><code>Facebook ha aggiornato le Pagine Fan introducendo parecchie novità significative. In questo articolo Six Revisions ci spiega quali sono e come sfruttarle al meglio.
</code></pre>
<ol start="9">
<li><a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/video-lectures/"><strong>I filmati completi del Corso di Programmazione (Python) del MIT</strong></a></li>
</ol>
<pre><code>Ventiquattro filmati completi, di ottima qualità, per imparare a programmare direttamente dai professori del famoso MIT di Boston. Il materiale è di qualità eccellente.
</code></pre>
<ol start="10">
<li><a href="http://www.cenedella.com/job-search/leonardo-da-vincis-resume/"><strong>Il curriculum vitae di Leonardo Da Vinci</strong></a></li>
</ol>
<pre><code>Prima di Mona Lisa, dell&amp;#8217;Ultima Cena e dell&amp;#8217;invenzione dell&amp;#8217;elicottero anche a Leonardo Da Vinci è toccato scrivere il suo bel curriculum. Nel 1482, a trent&amp;#8217;anni, Leonardo lo inviò a Ludovico il Moro, Duca di Milano. In questo splendido articolo possiamo vedere l&amp;#8217;originale e leggerne la trascrizione. Perché? Per imparare un paio di trucchetti che potrebbero tornarci utili.
</code></pre>
<ol start="11">
<li><a href="http://mattoufoutu.rafale.org/ebooks/Doc_diverse/Cours%20Prog/Python/Books/Natural%20Language%20Processing%20with%20Python%20(2009).pdf"><strong>Processare il Linguaggio Naturale in Python</strong></a></li>
</ol>
<pre><code>L&amp;#8217;intero contenuto del libro _Natural Processing Language With Python_ in formato PDF, liberamente accessibile.
</code></pre>
<p>Queste sono solo alcune delle segnalazioni che giorno per giorno pubblico su Twitter. Se volete più notizie, spunti e link interessanti <a href="http://twitter.com/#!/nicolaiarocci">seguitemi anche su Twitter</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Il Processo Creativo nell’Era Moderna</title>
      <link>https://nicolaiarocci.com/il-processo-creativo-nellera-moderna/</link>
      <pubDate>Sat, 19 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-processo-creativo-nellera-moderna/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>TuoGuru – Il mercato italiano del Know How</title>
      <link>https://nicolaiarocci.com/tuoguru-il-mercato-italiano-del-know-how/</link>
      <pubDate>Fri, 18 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/tuoguru-il-mercato-italiano-del-know-how/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Una interessante startup italiana muove i primi passi proprio in questi giorni. &lt;strong&gt;&lt;a href=&#34;http://tuoguru.com/&#34;&gt;TuoGuru&lt;/a&gt;&lt;/strong&gt; si presenta come il &lt;strong&gt;primo Marketplace Italiano del Know How&lt;/strong&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Una interessante startup italiana muove i primi passi proprio in questi giorni. <strong><a href="http://tuoguru.com/">TuoGuru</a></strong> si presenta come il <strong>primo Marketplace Italiano del Know How</strong>.</p>
<h2 id="come-funziona">Come funziona</h2>
<p>La registrazione è gratuita e comprende la fornitura di 12 crediti spendibili subito per pubblicare domande sul sito. Chi fornirà la risposta migliore si aggiudicherà il <strong>premio in denaro</strong> (2€, 5€, 10€, ecc.) messo in palio dall’autore della domanda. Le categorie disponibili in questo momento sono Grafica, Programmazione,  SEO &amp; Marketing, CMS, Social Media, Fisco e Contabilità, Software, Hardware, Dominio + Hosting. Altre verranno aggiunte nel tempo.</p>
<!-- raw HTML omitted -->
<h2 id="il-modello-di-business">Il modello di business</h2>
<p>Avete letto bene. Su TuoGuru girano soldi! Esauriti i 12 crediti iniziali per porre domande dovrete acquistarne altri (oppure invitare amici sul sito). Al costo dei crediti dovrete poi aggiungere il premio da corrispondere nel caso qualcuno vi fornisca la risposta che cercate. Riassumendo:</p>
<ol>
<li>Il sito incassa vendendo crediti.</li>
<li>Chi risponde ha la possibilità di guadagnare fornendo la risposta migliore.</li>
<li>Chi fa domande compra la <em>possibilità</em> di ottenere risposte veloci, precise e attendibili.</li>
</ol>
<p>Di questi tempi potrebbe sembrare un controsenso pagare per ottenere risposte. Ci sono miriadi di forum e siti Q&amp;A gratuiti. La scommessa di un servizio come questo è infatti la nicchia, ovvero scommettere su coloro che pur di proseguire il lavoro e ottenere rapidamente una risposta qualificata non hanno problemi a investire una cifra tutto sommato modesta.</p>
<h2 id="la-chiave-del-successo">La chiave del successo</h2>
<p>In questi schemi il personaggio chiave è l’<strong>esperto</strong>, colui/colei che decide di investire il proprio tempo fornendo risposte di qualità sperando di guadagnarci qualcosa. Più risposte qualificate, rapide e attendibili arriveranno più è probabile che gli utenti decideranno di usare il servizio a pagamento. Rispondere alle domande è gratuito, consente di migliorare la propria fama (esiste un meccanismo di classifiche interne), può essere divertente e può dare una mano a far quadrare i conti a fine mese. Perché non provarci?</p>
<h2 id="i-primi-passi">I primi passi</h2>
<p>In due giorni dall’apertura al pubblico ci sono già più di <strong>500 utenti registrati</strong>. Le domande cominciano circolare e, soprattutto, le riposte fioccano. Bei segnali positivi. Questi ragazzi ci stanno provando seriamente e stanno lavorando bene. Si meritano un grosso <strong>in bocca al lupo</strong>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Disponibile il programma completo di BE-Wizard 2011</title>
      <link>https://nicolaiarocci.com/disponibile-il-programma-di-be-wizard-2011/</link>
      <pubDate>Thu, 17 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/disponibile-il-programma-di-be-wizard-2011/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Sul sito ufficiale di &lt;strong&gt;BE-Wizard 2011&lt;/strong&gt; è disponibile il &lt;a href=&#34;http://admin.abc.sm/upload/2156/programma_be-wizard.pdf&#34;&gt;programma completo&lt;/a&gt; della due giorni SEO/Web Marketing che si terrà a San Marino i prossimi 11 e 12 marzo. Come scrivevo già &lt;a href=&#34;http://nicolaiarocci.com/be-wizard-2011-porta-in-italia-i-guru-di-seo-e-web-marketing/&#34;&gt;qualche tempo fa&lt;/a&gt; quest’anno BE-Wizard porta in italia i &lt;strong&gt;guru internazionali di SEO e Web Marketing&lt;/strong&gt;: Rand Fishkin (SEOmoz), Avinash Kaushik (Google), Marcus Tandler &amp;amp; Nils Döerje (Tandler &amp;amp; Döerje Partners), Tom Critchlow (Distilled) e altri.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Sul sito ufficiale di <strong>BE-Wizard 2011</strong> è disponibile il <a href="http://admin.abc.sm/upload/2156/programma_be-wizard.pdf">programma completo</a> della due giorni SEO/Web Marketing che si terrà a San Marino i prossimi 11 e 12 marzo. Come scrivevo già <a href="http://nicolaiarocci.com/be-wizard-2011-porta-in-italia-i-guru-di-seo-e-web-marketing/">qualche tempo fa</a> quest’anno BE-Wizard porta in italia i <strong>guru internazionali di SEO e Web Marketing</strong>: Rand Fishkin (SEOmoz), Avinash Kaushik (Google), Marcus Tandler &amp; Nils Döerje (Tandler &amp; Döerje Partners), Tom Critchlow (Distilled) e altri.</p>
<h2 id="il-programma">Il Programma</h2>
<p>Il programma è ricco di argomenti interessanti. Per solleticare il tuo appetito (ci sono ancora posti disponibili) ti propongo una selezione degli interventi che personalmente attendo con grande curiosità:</p>
<ul>
<li><strong>Google Ranking</strong>: novità e scoperte inedite su come Google classifica i risultati organici, alla luce delle ultime ricerche svolte da SEOmoz.org (Rand Fishkin)</li>
<li><strong>Comunicare On-line con i Video</strong>. Video marketing: i fattori che determinano il successo di un video online e la diffusione virale. Video Analytics: misurare l’impatto dei propri video e calcolare il ritorno dell’investimento (Paolo Zanzottera)</li>
<li><strong>Ranking e comportamento dell’utente</strong>: come perfezionare il ranking attraverso l’analisi di Click-Through e Bounce Rate (Marcus Tandler)</li>
<li><strong>Come video, news e immagini hanno influito sulle tradizionali tecniche di posizionamento</strong>. Come applicare delle strategie ad hoc per la Universal Search (Neils Dörje)</li>
<li><strong>Link building</strong>: Dieci strategie avanzate per una link popularity efficace (Marcus Tandler)</li>
<li><strong>Ottimizzazione del Tasso di Conversione</strong>: come trasformare un sito locale in un “Conversion Funnel”, tracciare i dati e migliorare il tasso di conversione (Rand Fishkin)</li>
</ul>
<p>Per vedere l’elenco completo degli interventi consulta il <a href="http://admin.abc.sm/upload/2156/programma_be-wizard.pdf">programma ufficiale</a> sul sito ufficiale.</p>
<h2 id="incontriamoci">Incontriamoci!</h2>
<p>Ribadisco l’invito già fatto in passato. Se anche tu sarai presente fammelo sapere, magari organizziamo <strong>due chiacchiere</strong> davanti a un caffè o un aperitivo!</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Testa Il Feedback Utente Come Segnale di Ranking</title>
      <link>https://nicolaiarocci.com/google-testa-il-feedback-utente-come-segnale-di-ranking/</link>
      <pubDate>Tue, 15 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-testa-il-feedback-utente-come-segnale-di-ranking/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Google ha appena annunciato una estensione per &lt;strong&gt;&lt;a href=&#34;http://www.google.com/chrome?hl=it&#34;&gt;Chrome&lt;/a&gt;&lt;/strong&gt; che permette agli utenti del browser di escludere dai risultati delle ricerche i siti di scarsa qualità o poco interessanti.&lt;/p&gt;
&lt;p&gt;Estensioni di questo tipo esistono da tempo ma questa si distingue per un motivo importante. Nel suo &lt;a href=&#34;http://googleblog.blogspot.com/2011/02/new-chrome-extension-block-sites-from.html&#34;&gt;annuncio&lt;/a&gt; &lt;strong&gt;Matt Cutts&lt;/strong&gt;, responsabile Google per i motori di ricerca, afferma che i siti bloccati da &lt;a href=&#34;https://chrome.google.com/webstore/detail/nolijncfnkgaikbjbdaogikpmpbdcdef&#34;&gt;&lt;strong&gt;Personal Blocklist&lt;/strong&gt;&lt;/a&gt; (questo il nome dell’estensione) verranno registrati in un database. In futuro Google potrebbe escludere questi siti dai risultati organici delle ricerche:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Google ha appena annunciato una estensione per <strong><a href="http://www.google.com/chrome?hl=it">Chrome</a></strong> che permette agli utenti del browser di escludere dai risultati delle ricerche i siti di scarsa qualità o poco interessanti.</p>
<p>Estensioni di questo tipo esistono da tempo ma questa si distingue per un motivo importante. Nel suo <a href="http://googleblog.blogspot.com/2011/02/new-chrome-extension-block-sites-from.html">annuncio</a> <strong>Matt Cutts</strong>, responsabile Google per i motori di ricerca, afferma che i siti bloccati da <a href="https://chrome.google.com/webstore/detail/nolijncfnkgaikbjbdaogikpmpbdcdef"><strong>Personal Blocklist</strong></a> (questo il nome dell’estensione) verranno registrati in un database. In futuro Google potrebbe escludere questi siti dai risultati organici delle ricerche:</p>
<blockquote>
<p>One of the signals we’re exploring is explicit feedback from users. To that end, today we’re launching an early, experimental Chrome extension so people can block sites from their web search results. If installed, <strong>the extension also sends blocked site information to Google, and we will study the resulting feedback and explore using it as a potential ranking signal for our search results</strong>.</p></blockquote>
<p>Un sito bloccato da migliaia di utenti potrebbe indurre Google a classificarlo come <a href="http://en.wikipedia.org/wiki/Content_farm"><strong>content farm</strong></a> ed escluderlo dai risultati delle ricerche. E’ probabile (e auspicabile!) che, almeno in una prima fase, questi siti saranno sottoposti a uno scrutinio accurato prima di venire depennati.</p>
<h2 id="web-20-all8217ennesima-potenza">Web 2.0 all’ennesima potenza</h2>
<p>Finora Google ha sempre dichiarato di puntare fermamente a una soluzione algoritmica al problema della classificazione dei siti web. Con l’annuncio di oggi pare aprirsi una crepa in questa filosofia. Per la prima volta gli utenti potrebbero avere la possibilità di <strong>partecipare in maniera attiva</strong> alla selezione qualitativa dei risultati proposti da un motore da ricerca.</p>
<h2 id="un-sistema-abusabile">Un sistema abusabile?</h2>
<p>Probabilmente è presto per preoccuparsi di questo ma c’è da augurarsi, se mai ci si arriverà, che l’implementazione finale tenga ben conto del rischio di abusi. Una azienda con pochi scrupoli potrebbe pensare di investire quattrini sonanti in una campagna di discredito nei confronti di un concorrente. Certo non sarebbe semplice né economico, ma pur sempre fattibile.</p>
<h2 id="che-ne-pensate">Che ne pensate?</h2>
<p>Questa mi pare una innovazione interessante sia dal punto di vista pratico-funzionale che ‘sociale’, passatemi il termine.  Voi cosa ne pensate?</p>
<h3 id="approfondimenti">Approfondimenti</h3>
<ul>
<li><a href="http://googleblog.blogspot.com/2011/02/new-chrome-extension-block-sites-from.html">Annuncio della nuova Estensione per Google Chrome</a></li>
<li><a href="https://chrome.google.com/webstore/detail/nolijncfnkgaikbjbdaogikpmpbdcdef">Pagina ufficiale di Personal Blocklist</a></li>
<li><a href="http://www.seroundtable.com/google-personal-blocklist-12958.html">Dettagli sul funzionamento dell’estensione su Search Engine Roundtable</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>SourceKit – Scrivere codice in Google Chrome e salvarlo su DropBox</title>
      <link>https://nicolaiarocci.com/sourcekit-chrome-dropbox/</link>
      <pubDate>Thu, 10 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sourcekit-chrome-dropbox/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://chrome.google.com/webstore/detail/iieeldjdihkpoapgipfkeoddjckopgjg&#34;&gt;&lt;strong&gt;SourceKit&lt;/strong&gt;&lt;/a&gt; è una applicazione per Google Chrome che permette di scrivere codice direttamente nel browser usando &lt;a href=&#34;https://www.dropbox.com/&#34;&gt;DropBox&lt;/a&gt; come disco dati/repository. Un &lt;a href=&#34;http://macromates.com/&#34;&gt;TextMate&lt;/a&gt; &lt;em&gt;in the cloud&lt;/em&gt; insomma.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://chrome.google.com/webstore/detail/iieeldjdihkpoapgipfkeoddjckopgjg"><strong>SourceKit</strong></a> è una applicazione per Google Chrome che permette di scrivere codice direttamente nel browser usando <a href="https://www.dropbox.com/">DropBox</a> come disco dati/repository. Un <a href="http://macromates.com/">TextMate</a> <em>in the cloud</em> insomma.</p>
<!-- raw HTML omitted -->
<p>Se avete installato DropBox su ognuno dei vostri computer (un Mac a casa e un PC al lavoro per esempio) il risultato sarà quello di lavorare nel </p>
<p><em>cloud</em> mantenendo però copie locali, sincronizzate, dei vostri sorgenti. Potrete spostarvi da un computer all’altro e riprendere la scrittura del codice come se niente fosse. L’editor integrato è Mozilla Skywriter (ora <a href="http://ace.ajax.org/">Ace</a>) e supporta parecchi linguaggi: C/C++, C#, Ruby, Python, PHP, HTML, JavaScript, Java.</p>
<p>Proprio l’altro giorno raccontando del progetto <strong>Orion Eclipse</strong> mi (e <em>vi</em>) chiedevo <a href="http://nicolaiarocci.com/il-futuro-del-codici-sorgente-e-online/">se il futuro del codice sorgente non sia online</a>. SourceKit ci da la possibilità di provare subito “l’effetto che fa”, come diceva una vecchia pubblicità. Provare per credere!</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Shopping, è imminente il lancio italiano</title>
      <link>https://nicolaiarocci.com/google-shopping-e-imminente-il-lancio-italiano/</link>
      <pubDate>Mon, 07 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-shopping-e-imminente-il-lancio-italiano/</guid>
      <description>&lt;p&gt;Oggi Google ha &lt;a href=&#34;http://googlemerchantblog.blogspot.com/2011/02/google-merchant-center-launches-in.html&#34;&gt;Oggi Google ha&lt;/a&gt; che presto il servizio &lt;strong&gt;&lt;a href=&#34;http://www.google.com/products&#34;&gt;Google Shopping&lt;/a&gt;&lt;/strong&gt; sarà attivato in Italia. Si tratta di un motore specializzato nella ricerca delle migliori occasioni di acquisto. Basta farsi un giro sulla &lt;a href=&#34;http://www.google.com/products&#34;&gt;versione inglese del servizio&lt;/a&gt;, già operativa da qualche tempo, per rendersi conto che questo strumento ha serie possibilità di cambiare radicalmente il modo di vendere e fare acquisti online.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Oggi Google ha <a href="http://googlemerchantblog.blogspot.com/2011/02/google-merchant-center-launches-in.html">Oggi Google ha</a> che presto il servizio <strong><a href="http://www.google.com/products">Google Shopping</a></strong> sarà attivato in Italia. Si tratta di un motore specializzato nella ricerca delle migliori occasioni di acquisto. Basta farsi un giro sulla <a href="http://www.google.com/products">versione inglese del servizio</a>, già operativa da qualche tempo, per rendersi conto che questo strumento ha serie possibilità di cambiare radicalmente il modo di vendere e fare acquisti online.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Già dalla home page è evidente come in Google si siano ingegnati per offrire una</p>
<p><strong>esperienza di ricerca del tutto simile a quella classica</strong> alla quale gli utenti sono abituati (verrebbe da dire <em>condizionati</em>) da tempo. L’integrazione è tale che basta un click per spostarsi dalla ricerca in Google Shopping a quella in Google Classico.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il visitatore può ordinare o filtrare i risultati in base al prezzo, oppure può confrontare le offerte che i diversi commercianti propongono per lo stesso prodotto. E’ presente anche un carrello della spesa nel quale inserire i prodotti e le offerte più interessanti.</p>
<h2 id="cosa-ci-guadagna-il-commerciante">Cosa ci guadagna il commerciante?</h2>
<p>Una volta compiuta la scelta l’utente viene <strong>indirizzato</strong> <strong>sul sito del commerciante</strong>. E’ dunque il commerciante stesso a <strong>realizzare direttamente la vendita</strong>**.**</p>
<p>Il servizio è <strong>gratuito</strong> e non sembra che Google sia interessata a provvigioni o voglia applicare tariffe per l’iscrizione al catalogo (verificherò con calma nelle prossime ore). Un dettaglio da considerare con attenzione: il visitatore che arriva sul nostro sito via Google Shopping è <strong>fortemente motivato all’acquisto</strong>: conosce il prezzo e ha scelto di sua iniziativa di venire a trovarci. Tocca a noi giocarcela bene offrendogli una ottima esperienza di acquisto!</p>
<h2 id="come-ci-guadagna-google">Come ci guadagna Google?</h2>
<p>Innanzi tutto grazie alla integrazione (già annunciata) con <strong><a href="http://www.google.it/intl/it/adwords/jumpstart/phone.html">AdWords</a></strong>. Le confezioni dei prodotti appariranno anche nella ricerca classica, integrate negli annunci AdWords. C’è poi <strong>Checkout</strong>, il servizio Google per i pagamenti online. Non è un caso che il primo filtro che appare in Google Shopping sia proprio la selezione dei soli prodotti acquistabili via Checkout.</p>
<p>C’è infine il fattore strategico. Se il servizio decollerà Google diventerà uno strumento indispensabile per mettere in contatto venditori e acquirenti. In futuro sarà molto difficile rinunciarvi, qualunque saranno le condizioni o i servizi (a pagamento?) che Google vorrà veicolare via Google Shopping.</p>
<h2 id="cominciare-subito">Cominciare subito</h2>
<p>Benché il servizio non sia ancora aperto al pubblico è già possibile registrarsi a <!-- raw HTML omitted -->Google Merchant Center<!-- raw HTML omitted -->, il sito per commercianti sul quale registrare i propri prodotti. Il sistema è basato su <em>feeds</em> ed è piuttosto sofisticato (ma non troppo complicato), il che testimonia l’interesse di Google per l’intero progetto.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il meglio di Stack Overflow in una collana di eBook gratuiti</title>
      <link>https://nicolaiarocci.com/il-meglio-di-stack-overflow-una-collana-di-ebook-gratuiti/</link>
      <pubDate>Wed, 02 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-meglio-di-stack-overflow-una-collana-di-ebook-gratuiti/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;http://stackoverflow.com/&#34;&gt;&lt;strong&gt;Stack Overflow&lt;/strong&gt;&lt;/a&gt; è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera &lt;strong&gt;minera di informazioni&lt;/strong&gt; &lt;strong&gt;preziose&lt;/strong&gt; e  meriterebbe maggiore attenzione…&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><a href="http://stackoverflow.com/"><strong>Stack Overflow</strong></a> è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera <strong>minera di informazioni</strong> <strong>preziose</strong> e  meriterebbe maggiore attenzione…</p>
<h2 id="gli-ebooks-di-stack-overflow">Gli eBooks di Stack Overflow</h2>
<h2 id="img-classsize-full-wp-image-794-alignright-titlestack-overflow-ebook-srchttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgfit2002c267-altstack-overflow-ebook-srcsethttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgw200-200w-httpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgresize1122c150-112w-sizesmax-width-200px-100vw-200px-data-recalc-dims1-"><!-- raw HTML omitted --></h2>
<p>Recentemente <a href="http://meta.stackoverflow.com/users/893/greg-hewgill">Greg Hewkill</a> ha <a href="http://meta.stackoverflow.com/questions/74399/stack-overflow-top-20-tags-in-ebook-format">annunciato</a> la creazione di <a href="https://github.com/ghewgill/so-static">uno script open source</a> che genera un eBook per ognuno dei <strong>20 tag più popolari</strong> di Stack Overflow. Ogni libro contiene le domande (e risposte) più votate nella sua categoria. Il risultato è una vera e propria <a href="http://hewgill.com/~greg/stackoverflow/ebooks/"><em>collana Stack Overflow</em></a> che propone il <strong>concentrato dei migliori contenuti del sito</strong>. Basta scorrere i <em>titoli</em> (tag) per rendersi conto che ce n’è davvero per tutti i gusti. Ecco una lista parziale:</p>
<ul>
<li>JAVA (26M)</li>
<li>C# (24M), C++ (21M), C (11M)</li>
<li>NET (21M)</li>
<li>PYTHON (20M), DJANGO (1.6M)</li>
<li>JAVASCRIPT (15M)</li>
<li>PHP (9.6M)</li>
<li>IPHONE (7.3M)</li>
<li>HTML (6.0M), HTML 5 (3.0M)</li>
<li>CSS (5.7M)</li>
<li>JQUERY (5.5M)</li>
<li>ASP.NET (4.8M)</li>
<li>DATABASE (4.8M)</li>
<li>RUBY (3.1M), RUBY ON RAILS (1.9M)</li>
<li>ANDROID (2.7M)</li>
<li>MY SQL (2.5M), ORACLE (662K), SQL SERVER (2.8M), SQL (5.1M)</li>
<li>AJAX (2.1M)</li>
<li>COCOA (1.5M), OBJECTIVE-C (3.1M)</li>
<li>VB.NET (1.5M)</li>
<li>SILVERLIGHT (1.1M)</li>
<li>FLASH (509K)</li>
</ul>
<p>Alcuni sono di dimensioni notevoli il che ne fa ideali letture da divano! Il formato usato per confezionare gli eBook è <a href="http://www.mobipocket.com/dev/article.asp?BaseFolder=prcgen&amp;File=mobiformat.htm">Mobipocket</a>, compatibile con [<!-- raw HTML omitted --><a href="http://stackoverflow.com/"><strong>Stack Overflow</strong></a> è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera <strong>minera di informazioni</strong> <strong>preziose</strong> e  meriterebbe maggiore attenzione…</p>
<h2 id="gli-ebooks-di-stack-overflow-1">Gli eBooks di Stack Overflow</h2>
<h2 id="img-classsize-full-wp-image-794-alignright-titlestack-overflow-ebook-srchttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgfit2002c267-altstack-overflow-ebook-srcsethttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgw200-200w-httpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgresize1122c150-112w-sizesmax-width-200px-100vw-200px-data-recalc-dims1--1"><!-- raw HTML omitted --></h2>
<p>Recentemente <a href="http://meta.stackoverflow.com/users/893/greg-hewgill">Greg Hewkill</a> ha <a href="http://meta.stackoverflow.com/questions/74399/stack-overflow-top-20-tags-in-ebook-format">annunciato</a> la creazione di <a href="https://github.com/ghewgill/so-static">uno script open source</a> che genera un eBook per ognuno dei <strong>20 tag più popolari</strong> di Stack Overflow. Ogni libro contiene le domande (e risposte) più votate nella sua categoria. Il risultato è una vera e propria <a href="http://hewgill.com/~greg/stackoverflow/ebooks/"><em>collana Stack Overflow</em></a> che propone il <strong>concentrato dei migliori contenuti del sito</strong>. Basta scorrere i <em>titoli</em> (tag) per rendersi conto che ce n’è davvero per tutti i gusti. Ecco una lista parziale:</p>
<ul>
<li>JAVA (26M)</li>
<li>C# (24M), C++ (21M), C (11M)</li>
<li>NET (21M)</li>
<li>PYTHON (20M), DJANGO (1.6M)</li>
<li>JAVASCRIPT (15M)</li>
<li>PHP (9.6M)</li>
<li>IPHONE (7.3M)</li>
<li>HTML (6.0M), HTML 5 (3.0M)</li>
<li>CSS (5.7M)</li>
<li>JQUERY (5.5M)</li>
<li>ASP.NET (4.8M)</li>
<li>DATABASE (4.8M)</li>
<li>RUBY (3.1M), RUBY ON RAILS (1.9M)</li>
<li>ANDROID (2.7M)</li>
<li>MY SQL (2.5M), ORACLE (662K), SQL SERVER (2.8M), SQL (5.1M)</li>
<li>AJAX (2.1M)</li>
<li>COCOA (1.5M), OBJECTIVE-C (3.1M)</li>
<li>VB.NET (1.5M)</li>
<li>SILVERLIGHT (1.1M)</li>
<li>FLASH (509K)</li>
</ul>
<p>Alcuni sono di dimensioni notevoli il che ne fa ideali letture da divano! Il formato usato per confezionare gli eBook è <a href="http://www.mobipocket.com/dev/article.asp?BaseFolder=prcgen&amp;File=mobiformat.htm">Mobipocket</a>, compatibile con]<a href="http://www.amazon.com/dp/B002Y27P3M/?tag=gocous-20&amp;hvadid=5729120357&amp;ref=pd_sl_blgu0nkyl_b">7</a> e credo con altri lettori di eBook. Ricordo che è possibile leggere i libri per Kindle con l’applicazione <strong>gratuita</strong> disponibile per <a href="http://www.amazon.com/gp/feature.html/ref=kcp_pc_mkt_lnd?docId=1000426311">PC</a>, <a href="http://www.amazon.com/gp/feature.html/ref=kcp_mac_mkt_lnd?docId=1000464931">Mac</a>, [<!-- raw HTML omitted --><a href="http://stackoverflow.com/"><strong>Stack Overflow</strong></a> è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera <strong>minera di informazioni</strong> <strong>preziose</strong> e  meriterebbe maggiore attenzione…</p>
<h2 id="gli-ebooks-di-stack-overflow-2">Gli eBooks di Stack Overflow</h2>
<h2 id="img-classsize-full-wp-image-794-alignright-titlestack-overflow-ebook-srchttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgfit2002c267-altstack-overflow-ebook-srcsethttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgw200-200w-httpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgresize1122c150-112w-sizesmax-width-200px-100vw-200px-data-recalc-dims1--2"><!-- raw HTML omitted --></h2>
<p>Recentemente <a href="http://meta.stackoverflow.com/users/893/greg-hewgill">Greg Hewkill</a> ha <a href="http://meta.stackoverflow.com/questions/74399/stack-overflow-top-20-tags-in-ebook-format">annunciato</a> la creazione di <a href="https://github.com/ghewgill/so-static">uno script open source</a> che genera un eBook per ognuno dei <strong>20 tag più popolari</strong> di Stack Overflow. Ogni libro contiene le domande (e risposte) più votate nella sua categoria. Il risultato è una vera e propria <a href="http://hewgill.com/~greg/stackoverflow/ebooks/"><em>collana Stack Overflow</em></a> che propone il <strong>concentrato dei migliori contenuti del sito</strong>. Basta scorrere i <em>titoli</em> (tag) per rendersi conto che ce n’è davvero per tutti i gusti. Ecco una lista parziale:</p>
<ul>
<li>JAVA (26M)</li>
<li>C# (24M), C++ (21M), C (11M)</li>
<li>NET (21M)</li>
<li>PYTHON (20M), DJANGO (1.6M)</li>
<li>JAVASCRIPT (15M)</li>
<li>PHP (9.6M)</li>
<li>IPHONE (7.3M)</li>
<li>HTML (6.0M), HTML 5 (3.0M)</li>
<li>CSS (5.7M)</li>
<li>JQUERY (5.5M)</li>
<li>ASP.NET (4.8M)</li>
<li>DATABASE (4.8M)</li>
<li>RUBY (3.1M), RUBY ON RAILS (1.9M)</li>
<li>ANDROID (2.7M)</li>
<li>MY SQL (2.5M), ORACLE (662K), SQL SERVER (2.8M), SQL (5.1M)</li>
<li>AJAX (2.1M)</li>
<li>COCOA (1.5M), OBJECTIVE-C (3.1M)</li>
<li>VB.NET (1.5M)</li>
<li>SILVERLIGHT (1.1M)</li>
<li>FLASH (509K)</li>
</ul>
<p>Alcuni sono di dimensioni notevoli il che ne fa ideali letture da divano! Il formato usato per confezionare gli eBook è <a href="http://www.mobipocket.com/dev/article.asp?BaseFolder=prcgen&amp;File=mobiformat.htm">Mobipocket</a>, compatibile con [<!-- raw HTML omitted --><a href="http://stackoverflow.com/"><strong>Stack Overflow</strong></a> è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera <strong>minera di informazioni</strong> <strong>preziose</strong> e  meriterebbe maggiore attenzione…</p>
<h2 id="gli-ebooks-di-stack-overflow-3">Gli eBooks di Stack Overflow</h2>
<h2 id="img-classsize-full-wp-image-794-alignright-titlestack-overflow-ebook-srchttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgfit2002c267-altstack-overflow-ebook-srcsethttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgw200-200w-httpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgresize1122c150-112w-sizesmax-width-200px-100vw-200px-data-recalc-dims1--3"><!-- raw HTML omitted --></h2>
<p>Recentemente <a href="http://meta.stackoverflow.com/users/893/greg-hewgill">Greg Hewkill</a> ha <a href="http://meta.stackoverflow.com/questions/74399/stack-overflow-top-20-tags-in-ebook-format">annunciato</a> la creazione di <a href="https://github.com/ghewgill/so-static">uno script open source</a> che genera un eBook per ognuno dei <strong>20 tag più popolari</strong> di Stack Overflow. Ogni libro contiene le domande (e risposte) più votate nella sua categoria. Il risultato è una vera e propria <a href="http://hewgill.com/~greg/stackoverflow/ebooks/"><em>collana Stack Overflow</em></a> che propone il <strong>concentrato dei migliori contenuti del sito</strong>. Basta scorrere i <em>titoli</em> (tag) per rendersi conto che ce n’è davvero per tutti i gusti. Ecco una lista parziale:</p>
<ul>
<li>JAVA (26M)</li>
<li>C# (24M), C++ (21M), C (11M)</li>
<li>NET (21M)</li>
<li>PYTHON (20M), DJANGO (1.6M)</li>
<li>JAVASCRIPT (15M)</li>
<li>PHP (9.6M)</li>
<li>IPHONE (7.3M)</li>
<li>HTML (6.0M), HTML 5 (3.0M)</li>
<li>CSS (5.7M)</li>
<li>JQUERY (5.5M)</li>
<li>ASP.NET (4.8M)</li>
<li>DATABASE (4.8M)</li>
<li>RUBY (3.1M), RUBY ON RAILS (1.9M)</li>
<li>ANDROID (2.7M)</li>
<li>MY SQL (2.5M), ORACLE (662K), SQL SERVER (2.8M), SQL (5.1M)</li>
<li>AJAX (2.1M)</li>
<li>COCOA (1.5M), OBJECTIVE-C (3.1M)</li>
<li>VB.NET (1.5M)</li>
<li>SILVERLIGHT (1.1M)</li>
<li>FLASH (509K)</li>
</ul>
<p>Alcuni sono di dimensioni notevoli il che ne fa ideali letture da divano! Il formato usato per confezionare gli eBook è <a href="http://www.mobipocket.com/dev/article.asp?BaseFolder=prcgen&amp;File=mobiformat.htm">Mobipocket</a>, compatibile con]<a href="http://www.amazon.com/dp/B002Y27P3M/?tag=gocous-20&amp;hvadid=5729120357&amp;ref=pd_sl_blgu0nkyl_b">7</a> e credo con altri lettori di eBook. Ricordo che è possibile leggere i libri per Kindle con l’applicazione <strong>gratuita</strong> disponibile per <a href="http://www.amazon.com/gp/feature.html/ref=kcp_pc_mkt_lnd?docId=1000426311">PC</a>, <a href="http://www.amazon.com/gp/feature.html/ref=kcp_mac_mkt_lnd?docId=1000464931">Mac</a>,]<a href="http://www.amazon.com/gp/feature.html/ref=kcp_iphone_mkt_lnd?docId=1000301301">10</a> e <a href="http://www.amazon.com/gp/feature.html?ie=UTF8&amp;docId=165849822">Android</a>.</p>
<p><strong>Buona lettura!</strong></p>]]></content:encoded>
    </item>
    <item>
      <title>Il futuro del codice sorgente è online?</title>
      <link>https://nicolaiarocci.com/il-futuro-del-codici-sorgente-e-online/</link>
      <pubDate>Sat, 29 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-futuro-del-codici-sorgente-e-online/</guid>
      <description>&lt;p&gt;Gli ambienti di sviluppo (IDE) online sono una delle opportunità più originali che il &lt;a href=&#34;http://it.wikipedia.org/wiki/Cloud_computing&#34;&gt;cloud computing&lt;/a&gt; mette a disposizione dei programmatori web. In generale si tratta di editor di codice, debugger e strumenti per il controllo di versione da usare nel browser web senza bisogno di installare alcun software sul client. Per il momento le soluzioni disponibili offrono funzionalità limitate che tuttavia lasciano intravedere le possibilità che questi strumenti metteranno a nostra disposizione.&lt;/p&gt;
&lt;h2 id=&#34;il-progetto-orion&#34;&gt;Il Progetto Orion&lt;/h2&gt;
&lt;p&gt;Semplici editor di codice sorgente sono disponibili online già da tempo, ma progetti come &lt;strong&gt;Orion&lt;/strong&gt; portano il concetto di programmazione online a un livello superiore. &lt;a href=&#34;http://dev.eclipse.org/blogs/mike/2011/01/11/introducing-orion/&#34;&gt;Annunciato pochi giorni fa&lt;/a&gt; dal team di sviluppo di &lt;strong&gt;Eclipse&lt;/strong&gt;, una IDE Open Source molto diffusa e apprezzata, il progetto Orion è qualcosa di nuovo:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Gli ambienti di sviluppo (IDE) online sono una delle opportunità più originali che il <a href="http://it.wikipedia.org/wiki/Cloud_computing">cloud computing</a> mette a disposizione dei programmatori web. In generale si tratta di editor di codice, debugger e strumenti per il controllo di versione da usare nel browser web senza bisogno di installare alcun software sul client. Per il momento le soluzioni disponibili offrono funzionalità limitate che tuttavia lasciano intravedere le possibilità che questi strumenti metteranno a nostra disposizione.</p>
<h2 id="il-progetto-orion">Il Progetto Orion</h2>
<p>Semplici editor di codice sorgente sono disponibili online già da tempo, ma progetti come <strong>Orion</strong> portano il concetto di programmazione online a un livello superiore. <a href="http://dev.eclipse.org/blogs/mike/2011/01/11/introducing-orion/">Annunciato pochi giorni fa</a> dal team di sviluppo di <strong>Eclipse</strong>, una IDE Open Source molto diffusa e apprezzata, il progetto Orion è qualcosa di nuovo:</p>
<blockquote>
<p>E’ una piattaforma di sviluppo aperta focalizzata totalmente allo sviluppo per il web, dentro il web. I tools sono scritti in JavaScript e girano nel browser. A differenza di altri tentativi di realizzare strumenti di sviluppo integrati nel browser, Orion non è una IDE che gira in una singola scheda del browser. I links funzionano e possono essere condivisi. Puoi aprire files in schede diverse e grande cura è stata messa nel fornire una ottima web experience durante lo sviluppo del codice</p></blockquote>
<!-- raw HTML omitted -->
<pre><code>  &lt;p class=&quot;wp-caption-text&quot;&gt;
    Codice JavaScript sviluppato direttamente in Google Chrome - Progetto Orion/Eclipse
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
  Orion supporta JavaScript e presto funzionerà anche con PHP, HTML, CSS e Java.
&lt;/p&gt;

&lt;h2&gt;
  Cloud9 e gli altri
&lt;/h2&gt;

&lt;p&gt;
  &lt;img class=&quot;alignleft&quot; title=&quot;Cloud9 IDE&quot; src=&quot;images/2011/01/cloud9ide.png?resize=147%2C150&quot; alt=&quot;Cloud9 IDE&quot; data-recalc-dims=&quot;1&quot; /&gt;Anche &lt;strong&gt;Mozilla&lt;/strong&gt; lavora da tempo (2008) a qualcosa di simile. &lt;a href=&quot;http://mozillalabs.com/skywriter/&quot;&gt;Skywriter&lt;/a&gt;, semplice editor online ora integrato in &lt;a href=&quot;http://ace.ajax.org/&quot;&gt;Ace&lt;/a&gt;, è alla base della piattaforma &lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://cloud9ide.com/&quot;&gt;Cloud9 IDE&lt;/a&gt;. Attualmente in beta, Cloud9 è una IDE JavaScript integrata in Google Chrome che promette prestazioni uguali a quelle offerte da editor e IDE tradizionali, integrazione tra codice sorgente locale e remoto, debugging e deployment integrati.
&lt;/p&gt;

&lt;p&gt;
  Altro brillante esempio è &lt;strong&gt;&lt;a href=&quot;http://www.coderun.com/&quot;&gt;CodeRun&lt;/a&gt;&lt;/strong&gt;, IDE online già funzionante e gratuita dedicata soprattutto a sviluppatori ASP.NET, Silverlight e WPF. Il mondo IDE insomma è in gran fermento.
&lt;/p&gt;

&lt;h2&gt;
  Vantaggi e svantaggi di sviluppare nel cloud
&lt;/h2&gt;

&lt;p&gt;
  Immaginate un &lt;a href=&quot;http://docs.google.com/&quot;&gt;Google Documents&lt;/a&gt; per programmatori. Oggi possiamo creare online fogli di calcolo, testi e presentazioni; domani potremo sviluppare i nostri programmi nel browser. Ma quali sono i vantaggi e gli svantaggi di affidarsi a un ambiente di sviluppo online? Gli stessi offerti da un ambiente di produttività come Google Documents.
&lt;/p&gt;

&lt;h3&gt;
  Accessibilità
&lt;/h3&gt;

&lt;p&gt;
  Possiamo accedere al nostro ambiente di lavoro da qualunque località nel mondo. Bastano un accesso internet e un browser per metterci al lavoro. Siamo a Bangkok e abbiamo un paio di ore a disposizione? Entriamo in un internet cafe e pochi minuti dopo stiamo scrivendo codice o revisionando il lavoro dei colleghi. Il che ci porta al prossimo punto.
&lt;/p&gt;

&lt;h3&gt;
  Collaborazione e condivisione semplificate
&lt;/h3&gt;

&lt;p&gt;
  Nei progetti più importanti è spesso necessario installare strumenti di gestione e controllo dei team di sviluppo. Il codice sorgente memorizzato su un server remoto e accessibile a chiunque rende collaborazione e condivisione del codice più semplice. Tutte le cloud IDE promettono il supporto per team di sviluppo.
&lt;/p&gt;

&lt;h3&gt;
  Indipendenza dalla piattaforma hardware
&lt;/h3&gt;

&lt;p&gt;
  Con le cloud IDE scriviamo codice in un web browser. Compilazione, linking e debugging sono processi svolti su una macchina remota che (si suppone) offrirà prestazioni adeguate al compito. Trovarsi momentaneamente su un computer poco performante non sarà un problema. Sviluppare su computers diversi (Mac a casa e PC in ufficio, per esempio) non comporterà differenze sostanziali.
&lt;/p&gt;

&lt;h3&gt;
  Riservatezza
&lt;/h3&gt;

&lt;p&gt;
  Il nostro codice sarà memorizzato su un dispositivo sul quale non potremo esercitare un controllo assoluto. Difficilmente avremo garanzia di totale riservatezza. Applicazioni particolarmente delicate non potranno probabilmente essere sviluppate &lt;em&gt;sulle nuovole &lt;/em&gt;anche se servizi di successo come &lt;strong&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; &lt;/strong&gt;offrono supporto a progetti open source e privati garantendo a questi ultimi la riservatezza necessaria.
&lt;/p&gt;

&lt;h3&gt;
  Sicurezza
&lt;/h3&gt;

&lt;p&gt;
  Che succede se il mio codice sorgente viene perduto in seguito a un guasto hardware del sistema remoto che lo ospita? L&amp;#8217;affidabilità è senz&amp;#8217;altro un aspetto delicato e costituisce uno dei deterrenti all&amp;#8217;adozione dei sistemi di cloud computing in generale. Affidare i nostri codici a terzi non ci impedirebbe di conservarne copie locali. Come già successo per i sistemi di &lt;a href=&quot;http://it.wikipedia.org/wiki/Cloud-storage&quot;&gt;cloud storage&lt;/a&gt;, i servizi di cloud development dovranno offrire elevati standard di sicurezza e affidabilità.
&lt;/p&gt;

&lt;h2&gt;
  Conclusioni
&lt;/h2&gt;

&lt;p&gt;
  Lo sviluppo di applicazioni &lt;em&gt;sulle nuvole&lt;/em&gt; è senz&amp;#8217;altro una prospettiva affascinante che presto sarà di attualità. Non sono poche le perplessità degli sviluppatori, soprattutto negli ambienti &lt;em&gt;enterprise&lt;/em&gt; o nei settori nei quali la riservatezza è un elemento determinante. Le applicazioni web saranno le prime implementate con queste tecnologie, per le altre bisognerà probabilmente attendere a lungo.
&lt;/p&gt;

&lt;h4&gt;
  Approfondimenti
&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://dev.eclipse.org/blogs/mike/2011/01/11/introducing-orion/&quot;&gt;Introducing Orion&lt;/a&gt;, di Mike Milinkovich
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://borisoneclipse.blogspot.com/2011/01/orion.html&quot;&gt;Orion&lt;/a&gt;, di Boris Bukowski
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://jaxenter.com/eclipse-orion-the-new-ide-paradigm-33431.html&quot;&gt;Eclipse Orion: The New IDE Paradigm&lt;/a&gt;, intervista a B. Bukowski
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://www.i-programmer.info/news/90-tools/1872-mozilla-and-eclipse-take-programming-into-the-cloud.html&quot;&gt;Mozilla and Eclipse take programming into the cloud&lt;/a&gt;, di Mike James
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://dotnet.dzone.com/articles/online-ides-%E2%80%93-perspectives&quot;&gt;Online IDEs – perspectives?&lt;/a&gt; Di Den Delimarsky
  &lt;/li&gt;
&lt;/ul&gt;
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>La banda larga simmetrica porterà Internet fuori dal medioevo</title>
      <link>https://nicolaiarocci.com/la-banda-larga-simmetrica-portera-internet-fuori-dal-medioevo/</link>
      <pubDate>Wed, 26 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/la-banda-larga-simmetrica-portera-internet-fuori-dal-medioevo/</guid>
      <description>&lt;p&gt;In questa bella intervista &lt;strong&gt;&lt;a href=&#34;http://www.gaspartorriero.it/&#34;&gt;Gaspar Torriero&lt;/a&gt;&lt;/strong&gt; discute con &lt;a href=&#34;http://eraclito.telecomitaliahub.it/2011/01/tempo-stimato-25-anni/&#34;&gt;Massimo Mantellini&lt;/a&gt; dell’importanza della &lt;strong&gt;banda larga simmetrica&lt;/strong&gt;. Secondo Torriero ci troviamo ancora nel medioevo della Rete e la simmetria delle connessioni sarà la chiave che aprirà la porta a un futuro in gran parte ancora inimmaginabile. Dieci minuti ben spesi:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In questa bella intervista <strong><a href="http://www.gaspartorriero.it/">Gaspar Torriero</a></strong> discute con <a href="http://eraclito.telecomitaliahub.it/2011/01/tempo-stimato-25-anni/">Massimo Mantellini</a> dell’importanza della <strong>banda larga simmetrica</strong>. Secondo Torriero ci troviamo ancora nel medioevo della Rete e la simmetria delle connessioni sarà la chiave che aprirà la porta a un futuro in gran parte ancora inimmaginabile. Dieci minuti ben spesi:</p>]]></content:encoded>
    </item>
    <item>
      <title>Humans TXT – Il robots.txt per gli esseri umani</title>
      <link>https://nicolaiarocci.com/humans-txt-il-robots-txt-per-gli-esseri-umani/</link>
      <pubDate>Sun, 23 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/humans-txt-il-robots-txt-per-gli-esseri-umani/</guid>
      <description>&lt;p&gt;**&lt;!-- raw HTML omitted --&gt;**Introdotta dallo slogan &lt;em&gt;Siamo Uomini Non Macchine&lt;/em&gt;, &lt;!-- raw HTML omitted --&gt;Humans TXT&lt;!-- raw HTML omitted --&gt; è una iniziativa che consente di conoscere gli autori di un sito web. Per ragioni di immagine i committenti sono spesso &lt;!-- raw HTML omitted --&gt;riluttanti&lt;!-- raw HTML omitted --&gt; a consentire che sulle loro homepage appaiano i nomi degli autori. Non sempre è evidente chi ha sviluppato un sito, cosa certo non gradita all’autore che avrebbe tutto il diritto (e l’interesse) di &lt;strong&gt;firmare&lt;/strong&gt; le proprie opere.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>**<!-- raw HTML omitted -->**Introdotta dallo slogan <em>Siamo Uomini Non Macchine</em>, <!-- raw HTML omitted -->Humans TXT<!-- raw HTML omitted --> è una iniziativa che consente di conoscere gli autori di un sito web. Per ragioni di immagine i committenti sono spesso <!-- raw HTML omitted -->riluttanti<!-- raw HTML omitted --> a consentire che sulle loro homepage appaiano i nomi degli autori. Non sempre è evidente chi ha sviluppato un sito, cosa certo non gradita all’autore che avrebbe tutto il diritto (e l’interesse) di <strong>firmare</strong> le proprie opere.</p>
<h2 id="cosa-è-humanstxt">Cosa è Humans.txt?</h2>
<p>Un semplice file di testo che contiene informazioni sulle persone che hanno contribuito alla costruzione del sito. Il file non è intrusivo e non causa <!-- raw HTML omitted -->decadimento delle <!-- raw HTML omitted -->prestazioni perché collocato all’esterno della gerarchia del sito vero e proprio. Viene salvato nella web root, proprio là dove di solito risiede il <a href="http://it.wikipedia.org/wiki/Robots.txt"><em>robots.txt</em></a>. Se consentito dal committente si potrebbe aggiungere un riferimento nella homepage:</p>
<!-- raw HTML omitted -->
<p>Nel file si può indicare più di un nome: il programmatore, il designer, il copywriter, il web master, il SEO/SEM, eventuali dediche. Le possibilità sono tante quante sono le persone che normalmente intervengono nella creazione di un sito. Potremmo immaginare <em>humans.txt</em> come l’equivalente della sigla di una trasmissione televisiva, oppure di un film.</p>
<h2 id="alla-ricerca-di-uno-standard">Alla ricerca di uno standard</h2>
<p>Gli autori dell’iniziativa propongono delle <a href="http://humanstxt.org/humans.txt"><strong>linee guida</strong></a> per la compilazione del file <em>humans.txt</em> e si dicono pronti ad accettare suggerimenti da chiunque. L’idea di standardizzare il contenuto del file è senz’altro valida perché consentirebbe, tra le altre cose, la creazione di tools di ricerca e certificazione. Pensate per esempio a una estensione del browser che consenta di vedere i <em>credits</em> del sito che stiamo visitando. Ci sono parecchie possibilità di applicazione da esplorare.</p>
<h2 id="una-iniziativa-superflua">Una iniziativa superflua?</h2>
<p>Lo standard HTML <a href="http://www.w3.org/TR/html401/struct/global.html#h-7.4.4.2">contempla già</a> un tag Meta Name per l’autore. Si tratta di un elemento opzionale e non indicizzato dai motori di ricerca. Il problema con questo tag è che il committente potrebbe non gradirlo. Lo standard prevede di indicare un solo autore mentre, come abbiamo visto, <!-- raw HTML omitted -->in<!-- raw HTML omitted --> <em>humans.txt</em> possiamo indicare più persone. Le due soluzioni possono coesistere, dando spazio a soluzioni interessanti: <!-- raw HTML omitted -->un’agenzia potrebbe inserire <!-- raw HTML omitted -->il proprio nome nel meta tag ed elencare i membri del team in <em>humans.txt</em>. La discussione comunque <a href="http://news.ycombinator.com/item?id=2131692">è piuttosto accesa</a>. C’è chi ritiene superflua l’iniziativa. Ci sono i soliti complottisti che vedono dietro a tutto questo chissà quale oscura manovra a fin di lucro e c’è infine chi ci vuol credere davvero sostenendo i ragazzi spagnoli che hanno messo in piedi il progetto.</p>
<h2 id="comincia-subito">Comincia subito</h2>
<p>Niente impedisce di aderire all’iniziativa già da ora. Deposita il tuo <em>humans.txt</em> nella root del tuo sito e sei a bordo. E’ anche possibile <a href="http://humanstxt.org/Im-human.php">inviare il proprio file</a> <em>humans.txt</em> agli autori dell’iniziativa i quali sostengono di voler compilare una lista globale che, stranamente, al momento non è consultabile. Ho chiesto loro come mai. La riposta è stata <em>we’re looking to create something “different” to show humans</em>. Qualcosa bolle in pentola.</p>]]></content:encoded>
    </item>
    <item>
      <title>BE-Wizard 2011 porta in Italia i guru di SEO e Web Marketing</title>
      <link>https://nicolaiarocci.com/be-wizard-2011-porta-in-italia-i-guru-di-seo-e-web-marketing/</link>
      <pubDate>Wed, 19 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/be-wizard-2011-porta-in-italia-i-guru-di-seo-e-web-marketing/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.be-wizard.com&#34;&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;I giorni 11 e 12 marzo parteciperò a &lt;!-- raw HTML omitted --&gt;BE-Wizard 2011&lt;!-- raw HTML omitted --&gt;, evento SEO e Web Marketing dal programma molto ricco e interessante. Tra i relatori celebrità internazionali come &lt;a href=&#34;http://www.seomoz.org/team/randfish&#34;&gt;Rand Fishkin&lt;/a&gt; (SEOmoz), &lt;a href=&#34;http://www.kaushik.net/avinash/about&#34;&gt;Avinash Kaushik&lt;/a&gt; (Google), &lt;a href=&#34;http://www.tandlerdoerjepartner.com/&#34;&gt;Marcus Tandler &amp;amp; Nils Döerje&lt;/a&gt; (Tandler &amp;amp; Döerje Partners) e &lt;a href=&#34;http://www.distilled.co.uk/company/people/tom-critchlow.html&#34;&gt;Tom Critchlow&lt;/a&gt; (Distilled). Chi lavora nell’ambito SEO/SEM riconoscerà senz’altro questi nomi, Fishkin e Kaushik sono stelle di prima grandezza (di Kaushik raccomando senz’altro &lt;a href=&#34;http://www.webanalytics20.com/&#34;&gt;Web Analytics 2.0&lt;/a&gt;, uscito recentemente anche &lt;a href=&#34;http://www.amazon.it/Analytics-Misurare-successo-nellera-Internet/dp/882034498X/ref=sr_1_2?ie=UTF8&amp;amp;qid=1295446745&amp;amp;sr=8-2&#34;&gt;in italiano&lt;/a&gt;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.be-wizard.com"><!-- raw HTML omitted --></a>I giorni 11 e 12 marzo parteciperò a <!-- raw HTML omitted -->BE-Wizard 2011<!-- raw HTML omitted -->, evento SEO e Web Marketing dal programma molto ricco e interessante. Tra i relatori celebrità internazionali come <a href="http://www.seomoz.org/team/randfish">Rand Fishkin</a> (SEOmoz), <a href="http://www.kaushik.net/avinash/about">Avinash Kaushik</a> (Google), <a href="http://www.tandlerdoerjepartner.com/">Marcus Tandler &amp; Nils Döerje</a> (Tandler &amp; Döerje Partners) e <a href="http://www.distilled.co.uk/company/people/tom-critchlow.html">Tom Critchlow</a> (Distilled). Chi lavora nell’ambito SEO/SEM riconoscerà senz’altro questi nomi, Fishkin e Kaushik sono stelle di prima grandezza (di Kaushik raccomando senz’altro <a href="http://www.webanalytics20.com/">Web Analytics 2.0</a>, uscito recentemente anche <a href="http://www.amazon.it/Analytics-Misurare-successo-nellera-Internet/dp/882034498X/ref=sr_1_2?ie=UTF8&amp;qid=1295446745&amp;sr=8-2">in italiano</a>).</p>
<h2 id="il-programma">Il programma</h2>
<p>Il <a href="http://www.be-wizard.com/ita-programma.php">programma</a> prevede le conferenze dei Big Speakers nella prima giornata e gli approfondimenti tecnici (E-Commerce o Turismo) nella seconda. Per quest’ultima è già disponibile l’elenco degli argomenti trattati mentre per la prima bisognerà attendere ancora qualche giorno. Qui riporto il programma della sessione E-Commerce, quella a cui parteciperò io:</p>
<ul>
<li>Introduzione agli strumenti per la promozione online</li>
<li>E-commerce e diritto</li>
<li>E-commerce con eBay e altri marketplaces</li>
<li>Social Networks &amp; Web Analytics 2.0</li>
<li>Case History Keyword Advertising</li>
<li>Intervista/Testimonianza</li>
<li>Case History e-mail marketing</li>
<li>Case history SEO da “oltreoceano”</li>
<li>Strategie SEO e SEM</li>
</ul>
<h2 id="incontriamoci">Incontriamoci!</h2>
<p>Questi eventi in genere sono ottime occasioni per fare nuove conoscenze e scambiarsi opinioni ed esperienze. Se qualcuno dei lettori di questo sito prevede di partecipare me lo faccia sapere, magari organizziamo <strong>due chiacchiere</strong> davanti a un caffè o un aperitivo!</p>
<p><em>Potrebbe sembrare il contrario, ma vi assicuro che n<!-- raw HTML omitted -->on sono coinvolto in alcun modo nella organizzazione o promozione di questo evento.<!-- raw HTML omitted --></em></p>]]></content:encoded>
    </item>
    <item>
      <title>Come aumentare del 250% la conversion rate del tuo sito</title>
      <link>https://nicolaiarocci.com/come-aumentare-del-250-la-conversion-rate-del-tuo-sito/</link>
      <pubDate>Sun, 16 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-aumentare-del-250-la-conversion-rate-del-tuo-sito/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Nel web marketing il &lt;strong&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Conversion_rate&#34;&gt;conversion rate&lt;/a&gt;&lt;/strong&gt; è la percentuale di visitatori unici che hanno effettuato l’operazione desiderata visitando il sito. L’azione desiderata potrebbe essere condurre vendite, effettuare acquisti, osservare una pagina chiave del sito, o altre azioni misurabili (fonte: &lt;em&gt;wikipedia&lt;/em&gt;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;E’ possibile &lt;strong&gt;aumentare del 250% il conversione rate&lt;/strong&gt; grazie a una sola, banale modifica al sito? I signori di &lt;a href=&#34;http://www.kajabiapp.com/&#34;&gt;Kajabi&lt;/a&gt; sostengono di esserci riusciti nel corso di un esperimento durato una settimana. La loro home page è organizzata in modo da convogliare l’attenzione del visitatore su un unico, grande pulsante che invita il visitatore a consultare le tariffe del servizio offerto in abbonamento. Lasciando invariato il resto della pagina hanno ritoccato il contenuto del pulsante, registrando poi il numero di click ottenuti in un dato periodo di tempo. Il ciclo è stato ripetuto quattro volte, ogni volta con un testo diverso. Ecco come è andata:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Nel web marketing il <strong><a href="http://en.wikipedia.org/wiki/Conversion_rate">conversion rate</a></strong> è la percentuale di visitatori unici che hanno effettuato l’operazione desiderata visitando il sito. L’azione desiderata potrebbe essere condurre vendite, effettuare acquisti, osservare una pagina chiave del sito, o altre azioni misurabili (fonte: <em>wikipedia</em>)</p></blockquote>
<p>E’ possibile <strong>aumentare del 250% il conversione rate</strong> grazie a una sola, banale modifica al sito? I signori di <a href="http://www.kajabiapp.com/">Kajabi</a> sostengono di esserci riusciti nel corso di un esperimento durato una settimana. La loro home page è organizzata in modo da convogliare l’attenzione del visitatore su un unico, grande pulsante che invita il visitatore a consultare le tariffe del servizio offerto in abbonamento. Lasciando invariato il resto della pagina hanno ritoccato il contenuto del pulsante, registrando poi il numero di click ottenuti in un dato periodo di tempo. Il ciclo è stato ripetuto quattro volte, ogni volta con un testo diverso. Ecco come è andata:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="l8217importanza-del-giusto-messaggio">L’importanza del giusto messaggio</h2>
<!-- raw HTML omitted -->
<h2 id="un-pò-di-prudenza-non-guasta">Un pò di prudenza non guasta</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Eric Meyer aggiorna il suo famoso CSS Reset</title>
      <link>https://nicolaiarocci.com/eric-meyer-aggiorna-il-suo-famoso-css-reset/</link>
      <pubDate>Thu, 13 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eric-meyer-aggiorna-il-suo-famoso-css-reset/</guid>
      <description>&lt;p&gt;Quattro anni fa Eric Meyer pubblicò la prima versione del suo CSS
Reset. Concepito come un prototipo da condividere con altri
sviluppatori dediti alla creazione di uno standard, il modulo riscosse subito
grande successo diffondendosi rapidamente. In poche settimane venne adottato,
spesso inconsapevolmente, da decine di migliaia di programmatori e designer
web. Oggi gran parte dei siti web nel mondo includono nel loro codice almeno
una traccia di quello che è universalmente noto come Eric Meyer
Reset.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quattro anni fa Eric Meyer pubblicò la prima versione del suo CSS
Reset. Concepito come un prototipo da condividere con altri
sviluppatori dediti alla creazione di uno standard, il modulo riscosse subito
grande successo diffondendosi rapidamente. In poche settimane venne adottato,
spesso inconsapevolmente, da decine di migliaia di programmatori e designer
web. Oggi gran parte dei siti web nel mondo includono nel loro codice almeno
una traccia di quello che è universalmente noto come Eric Meyer
Reset.</p>
<h2 id="una-evoluzione-continua">Una evoluzione continua</h2>
<p>I piccoli problemi e le nuove incompatibilità che inevitabilmente accompagnano
ogni aggiornamento dei browser esistenti, nonché le uscite di quelli nuovi
(Google Chrome su tutti) costringono spesso a rivedere fogli di stile e codice
JavaScript. Così nel tempo altri programmatori  hanno dato il loro contribuito
proponendo variazioni e aggiornamenti al tema originale. Ci sono poi le nuove
tecnologie che si affacciano sulla scena; una delle revisoni più famose del
Eric Mayer Reset è infatti l’<a href="http://html5doctor.com/html-5-reset-stylesheet/"><strong>HTML5 Reset Stylesheet</strong></a>.</p>
<h2 id="eric-meyer-reset-versione-2011"><strong>Eric Meyer Reset versione 2011</strong></h2>
<p>Ed ecco che a sopresa lo stesso Meyer torna sulla scena proponendo
l’<a href="http://meyerweb.com/eric/thoughts/2011/01/03/reset-revisited/">ultima incarnazione</a> del suo CSS Reset. Questo aggiornamento prende
spunto dall’<a href="http://meyerweb.com/eric/tools/css/reset/">originale</a> ma tiene conto anche del lavoro svolto nel
frattempo dalla comunità, a partire proprio dal <a href="http://html5doctor.com/html-5-reset-stylesheet/">HTML5 Reset</a>. Ecco il nuovo
codice:</p>
<pre><code>/* http://meyerweb.com/eric/tools/css/reset/
v2.0b1 | 201101
NOTE: WORK IN PROGRESS
USE WITH CAUTION AND TEST WITH ABANDON */

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, figcaption, figure,
footer, header, hgroup, menu, nav, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    outline: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
    display: block;
}
body {
    line-height: 1;
}
ol, ul {
    list-style: none;
}
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: '';
    content: none;
}

/* remember to define visible focus styles!
:focus {
    outline: ?????;
} */

/* remember to highlight inserts somehow! */
ins {
    text-decoration: none;
}
del {
    text-decoration: line-through;
}

table {
    border-collapse: collapse;
    border-spacing: 0;
}
</code></pre>
<p>Come annotato a caratteri cubitali nelle note iniziali ci troviamo di fronte
a un lavoro non ancora definitivo. Sarà mia cura segnalare eventuali
aggiornamenti, tuttavia una prima occhiata al codice fa pensare che questa
prima stesura sia già valida.</p>
<h2 id="ne-vale-la-pena">Ne vale la pena?</h2>
<p>C’è un discussione in corso da tempo tra chi <a href="http://covertprestige.info/css/base-stylesheet/">sostiene</a> che tutto
sommato il CSS Reset non sia necessario e chi, al contrario, lo difende a spada
stratta. Non risolve certo tutti i problemi di compatibilità tra browsers ma
senz’altro CSS Reset contribuisce a ridurne sensibilmente il numero. Per
approfondire l’argomento puoi cominciare dando una occhiata a <a href="http://sixrevisions.com/css/should-you-reset-your-css/">Should You
Reset Your CSS?</a> (Six Revisions) e leggendo le opinioni degli utenti di
<a href="http://stackoverflow.com/questions/167531/is-it-ok-to-use-a-css-reset-stylesheet">Stack Overflow</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python vince il TIOBE Programming Language Award 2010</title>
      <link>https://nicolaiarocci.com/python-vince-il-tiobe-programming-language-award-2010/</link>
      <pubDate>Mon, 10 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-vince-il-tiobe-programming-language-award-2010/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Python&lt;/strong&gt; è il &lt;strong&gt;&lt;a href=&#34;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&#34;&gt;Linguaggio di Programmazione del 2010&lt;/a&gt;&lt;/strong&gt;. Il riconoscimento viene assegnato da &lt;a href=&#34;http://www.tiobe.com/&#34;&gt;TIOBE&lt;/a&gt; al linguaggio di programmazione che ha conquistato più quote di mercato nel corso dell’anno. La crescita di Python è stata +1.81% da gennaio 2010, di poco superiore al risultato  di Objective-C (+1.63%), secondo classificato. Objective-C è il linguaggio usato nello sviluppo di applicazioni iPhone e IPad; è andato molto bene nella prima parte dell’anno ma ha perso quote negli ultimi mesi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><!-- raw HTML omitted -->Python</strong> è il <strong><a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">Linguaggio di Programmazione del 2010</a></strong>. Il riconoscimento viene assegnato da <a href="http://www.tiobe.com/">TIOBE</a> al linguaggio di programmazione che ha conquistato più quote di mercato nel corso dell’anno. La crescita di Python è stata +1.81% da gennaio 2010, di poco superiore al risultato  di Objective-C (+1.63%), secondo classificato. Objective-C è il linguaggio usato nello sviluppo di applicazioni iPhone e IPad; è andato molto bene nella prima parte dell’anno ma ha perso quote negli ultimi mesi.</p>
<h2 id="non-solo-web-e-scripting">Non solo web e scripting</h2>
<p>TIOBE sottolinea come in questi anni Python sia diventato il linguaggio standard per lo scripting, sostituendo di fatto Perl. Da questo ambito tutto sommato ristretto negli ultimi anni Python si è diffuso in molti altri campi, primo fra tutti il web, dove ha riscosso grande successo anche grazie al framework <a href="http://www.djangoproject.com/"><strong>Django</strong></a>. Python è facile da imparare e molte università lo stanno adottando come linguaggio principale per l’insegnamento della programmazione. Tra i <a href="http://www.python.org/about/quotes/">grandi nomi che sviluppano in Python</a> ricordo Google, YouTube, il gioco multiplayer EVE Online, la NASA.</p>
<h2 id="il-tiobe-index-come-strumento-strategico">Il TIOBE Index come strumento strategico</h2>
<p>Il TIOBE Programming Community index è un indicatore annuale della popolarità dei linguaggi di programmazione. La classifica è calcolata tenendo conto anche dei giudizi espressi da ingegneri  e sviluppatori di chiara fama, oltre che tracciando i risultati di corsi di addestramento tenuti in tutto il mondo. I risultati forniti dai motori di ricerca più importanti (Google, MSN, Yahoo!, Wikipedia e YouTube) vengono a loro volta inclusi nell’elaborazione della classifica.</p>
<p>TIOBE non è un indice che tenta di individuare il <em>migliore</em> linguaggio di programmazione, serve piuttosto a indicare quali sono le tendenze in corso a livello planetario. Si tratta di una valida risorsa per verificare l’attualità delle proprie competenze e per pianificare strategicamente i prossimi linguaggi di programmazione su cui investire. Come spunto di riflessione consiglio caldamente la lettura del celebre <a href="http://invece.org/translations/pparadox.html"><strong>Paradosso di Python</strong></a>, formulato da <a href="http://www.paulgraham.com/">Paul Graham</a> nell’ormai lontano 2004. Forse i tempi stanno cambiando?</p>
<h2 id="l8217ultimo-decennio-chi-sale-e-chi-scende">L’ultimo decennio: chi sale e chi scende</h2>
<!-- raw HTML omitted -->
<pre><code>&lt;p class=&quot;wp-caption-text&quot;&gt;
  Andamento dell'indice TIOBE nell'ultimo decennio (2000-2010)
&lt;/p&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Oltre il 50% degli utenti web ora supporta il formato video HTML5</title>
      <link>https://nicolaiarocci.com/oltre-il-50-degli-utenti-web-ora-supporta-il-formato-video-html5/</link>
      <pubDate>Sat, 08 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/oltre-il-50-degli-utenti-web-ora-supporta-il-formato-video-html5/</guid>
      <description>&lt;p&gt;Proprio ieri in &lt;a href=&#34;http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/&#34;&gt;Adobe Flash è una Pessima Idea&lt;/a&gt; concludevo sostenendo che l’adozione dei nuovi standard HTML5 e CSS3 sarà molto più rapida di quanto non si immagini. Nemmeno ventiquattro ore dopo ecco la notizia che &lt;a href=&#34;http://videojs.com/2011/01/html5-video-statistics/&#34;&gt;&lt;strong&gt;oltre il 50% degli utenti web supporta già il formato video HTML5&lt;/strong&gt;&lt;/a&gt;. La fonte dei dati è &lt;a href=&#34;http://gs.statcounter.com/#browser_version-ww-daily-20101201-20101231&#34;&gt;StatCounter&lt;/a&gt;, ancora oggi una delle piattaforme più usate al mondo per tracciare la navigazione sui siti web.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Proprio ieri in <a href="http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/">Adobe Flash è una Pessima Idea</a> concludevo sostenendo che l’adozione dei nuovi standard HTML5 e CSS3 sarà molto più rapida di quanto non si immagini. Nemmeno ventiquattro ore dopo ecco la notizia che <a href="http://videojs.com/2011/01/html5-video-statistics/"><strong>oltre il 50% degli utenti web supporta già il formato video HTML5</strong></a>. La fonte dei dati è <a href="http://gs.statcounter.com/#browser_version-ww-daily-20101201-20101231">StatCounter</a>, ancora oggi una delle piattaforme più usate al mondo per tracciare la navigazione sui siti web.</p>
<h2 id="html5-in-rapida-diffusione">HTML5 in rapida diffusione</h2>
<h2 id="span-stylefont-weight-normalspan"><!-- raw HTML omitted --><!-- raw HTML omitted --></h2>
<h2 id="span-stylefont-weight-normal-font-size-13pxp"><!-- raw HTML omitted --><!-- raw HTML omitted --></h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Adobe Flash è una Pessima Idea</title>
      <link>https://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/</link>
      <pubDate>Thu, 06 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;E’ incredibile la quantità di siti che ancora oggi vengono sviluppati con Flash. Il fenomeno colpisce soprattutto i siti-vetrina: negozi, attività commerciali, ristoranti, artigiani. Basta farsi un giro sui siti di venditori di mobili, per esempio, per godersi il trionfo della ‘&lt;a href=&#34;http://en.wikipedia.org/wiki/Adobe_Flash&#34;&gt;multimedia platform&lt;/a&gt;‘ di Adobe. Bisogna prenderne atto: nel 2011 migliaia di aziende italiane di ogni dimensione affidano la loro identità web ad Adobe Flash. Consulenti e agenzie continuano a produrre siti con tecnologie assimilate anni fa. Reticenti all’aggiornamento delle proprie competenze, si accontentano del loro confortante orticello che, tutto sommato, assicura lo stipendio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->E’ incredibile la quantità di siti che ancora oggi vengono sviluppati con Flash. Il fenomeno colpisce soprattutto i siti-vetrina: negozi, attività commerciali, ristoranti, artigiani. Basta farsi un giro sui siti di venditori di mobili, per esempio, per godersi il trionfo della ‘<a href="http://en.wikipedia.org/wiki/Adobe_Flash">multimedia platform</a>‘ di Adobe. Bisogna prenderne atto: nel 2011 migliaia di aziende italiane di ogni dimensione affidano la loro identità web ad Adobe Flash. Consulenti e agenzie continuano a produrre siti con tecnologie assimilate anni fa. Reticenti all’aggiornamento delle proprie competenze, si accontentano del loro confortante orticello che, tutto sommato, assicura lo stipendio.</p>
<p>Eppure ci sono tante buone ragioni per <strong>non</strong> ricorrere a Flash:</p>
<ol>
<li>Non è sicuro. Probabilmente Flash è l’unico prodotto che fa concorrenza a Microsoft Windows in quanto a numero di <em>security fixes</em>. Non per niente è stato definito <a href="http://www.zdnet.com/blog/bott/how-secure-is-flash-heres-what-adobe-wont-tell-you/2152">il nuovo Windows Vista</a></li>
<li>E’ una tecnologia obsoleta, che si affida pesantemente ai plugin di terze parti (vedi alla voce sicurezza)</li>
<li>Rende lenta l’apertura delle pagine web, a meno che non si intervenga con ottimizzazioni ad-hoc</li>
<li>Consuma molta, troppa memoria</li>
<li>Richiede un forte impegno della CPU</li>
<li>Sui dispositivi portatili consuma velocemente la batteria</li>
<li>Non è supportato sui dispositivi iOS/Apple (iPhone, iPad)</li>
<li>Gira comunque male su buona parte degli altri dispositivi portatili, SmartPhones soprattutto</li>
<li>Ha seri problemi di compatibilità e prestazioni su piattaforme Mac/OSX</li>
<li>Molti utenti e (soprattutto) aziende bloccano Flash sui loro browsers proprio a causa dei problemi di sicurezza, stabilità e prestazioni</li>
<li>I contenuti Flash non sono facili da archiviare. Gli utenti medi hanno grosse difficoltà a salvare copie locali delle pagine. I servizi tipo <a href="http://www.archive.org/">Internet Archive</a> non riescono a memorizzare il sito</li>
<li>Flash è il nemico numero uno dei motori di ricerca. Google, Bing e gli altri hanno da sempre grosse difficoltà ad indicizzarne i contenuti</li>
<li>Flash rende problematica, quando non impossibile, l’ottimizzazione ai fini del posizionamento sui motori di ricerca (SEO)</li>
<li>E’ un sistema proprietario chiuso</li>
</ol>
<p>E’ vero che ricorrendo a ottimizzazioni e tools dedicati alcune (poche) di queste limitazioni possono essere aggirate. Le prossime release di Flash promettono sviluppi interessanti, tra i quali ottimizzazioni per i dispositivi mobili e riduzione del peso dell’intera infrastruttura.</p>
<h2 id="considera-le-alternative"><strong>Considera le alternative</strong></h2>
<p>Non sono necessarie soluzioni esoteriche. Troppo spesso si ricorre a Flash per produrre effetti, transizioni e animazioni realizzabili anche con strumenti consolidati, leggeri e SEO-friendly quali <strong>JavaScript</strong>, <strong>HTML</strong> e <strong>CSS.</strong> In una parola, <strong><a href="http://it.wikipedia.org/wiki/AJAX">AJAX</a></strong>. Cose ormai scontate. O forse no, a giudicare da quel che ancora oggi si pubblica in rete. A ben guardare la battaglia tra Apple e Adobe, quella culminata con la [<!-- raw HTML omitted -->E’ incredibile la quantità di siti che ancora oggi vengono sviluppati con Flash. Il fenomeno colpisce soprattutto i siti-vetrina: negozi, attività commerciali, ristoranti, artigiani. Basta farsi un giro sui siti di venditori di mobili, per esempio, per godersi il trionfo della ‘<a href="http://en.wikipedia.org/wiki/Adobe_Flash">multimedia platform</a>‘ di Adobe. Bisogna prenderne atto: nel 2011 migliaia di aziende italiane di ogni dimensione affidano la loro identità web ad Adobe Flash. Consulenti e agenzie continuano a produrre siti con tecnologie assimilate anni fa. Reticenti all’aggiornamento delle proprie competenze, si accontentano del loro confortante orticello che, tutto sommato, assicura lo stipendio.</p>
<p>Eppure ci sono tante buone ragioni per <strong>non</strong> ricorrere a Flash:</p>
<ol>
<li>Non è sicuro. Probabilmente Flash è l’unico prodotto che fa concorrenza a Microsoft Windows in quanto a numero di <em>security fixes</em>. Non per niente è stato definito <a href="http://www.zdnet.com/blog/bott/how-secure-is-flash-heres-what-adobe-wont-tell-you/2152">il nuovo Windows Vista</a></li>
<li>E’ una tecnologia obsoleta, che si affida pesantemente ai plugin di terze parti (vedi alla voce sicurezza)</li>
<li>Rende lenta l’apertura delle pagine web, a meno che non si intervenga con ottimizzazioni ad-hoc</li>
<li>Consuma molta, troppa memoria</li>
<li>Richiede un forte impegno della CPU</li>
<li>Sui dispositivi portatili consuma velocemente la batteria</li>
<li>Non è supportato sui dispositivi iOS/Apple (iPhone, iPad)</li>
<li>Gira comunque male su buona parte degli altri dispositivi portatili, SmartPhones soprattutto</li>
<li>Ha seri problemi di compatibilità e prestazioni su piattaforme Mac/OSX</li>
<li>Molti utenti e (soprattutto) aziende bloccano Flash sui loro browsers proprio a causa dei problemi di sicurezza, stabilità e prestazioni</li>
<li>I contenuti Flash non sono facili da archiviare. Gli utenti medi hanno grosse difficoltà a salvare copie locali delle pagine. I servizi tipo <a href="http://www.archive.org/">Internet Archive</a> non riescono a memorizzare il sito</li>
<li>Flash è il nemico numero uno dei motori di ricerca. Google, Bing e gli altri hanno da sempre grosse difficoltà ad indicizzarne i contenuti</li>
<li>Flash rende problematica, quando non impossibile, l’ottimizzazione ai fini del posizionamento sui motori di ricerca (SEO)</li>
<li>E’ un sistema proprietario chiuso</li>
</ol>
<p>E’ vero che ricorrendo a ottimizzazioni e tools dedicati alcune (poche) di queste limitazioni possono essere aggirate. Le prossime release di Flash promettono sviluppi interessanti, tra i quali ottimizzazioni per i dispositivi mobili e riduzione del peso dell’intera infrastruttura.</p>
<h2 id="considera-le-alternative-1"><strong>Considera le alternative</strong></h2>
<p>Non sono necessarie soluzioni esoteriche. Troppo spesso si ricorre a Flash per produrre effetti, transizioni e animazioni realizzabili anche con strumenti consolidati, leggeri e SEO-friendly quali <strong>JavaScript</strong>, <strong>HTML</strong> e <strong>CSS.</strong> In una parola, <strong><a href="http://it.wikipedia.org/wiki/AJAX">AJAX</a></strong>. Cose ormai scontate. O forse no, a giudicare da quel che ancora oggi si pubblica in rete. A ben guardare la battaglia tra Apple e Adobe, quella culminata con la]<a href="http://www.apple.com/hotnews/thoughts-on-flash/">5</a> con la quale Steve Jobs in persona spiegava i motivi della rinuncia di Apple alla tecnologia Flash, è cosa recente.</p>
<h2 id="investire-nel-futuro">Investire nel futuro</h2>
<p>Le versioni più aggiornate dei browsers moderni (Firefox, Chorme, Safari, Opera e l’ormai imminente <a href="http://windows.microsoft.com/ie9">Internet Explorer 9</a>) supportano ampiamente i nuovi standard <a href="http://it.wikipedia.org/wiki/HTML5">HTML5</a> e <a href="http://www.w3.org/TR/css3-roadmap/">CSS3</a>. C’è chi ritiene che la loro certificazione sia <a href="http://ishtml5readyyet.com/">troppo lontana</a> e chi al contrario li ha <a href="http://radar.oreilly.com/2009/05/google-bets-big-on-html-5.html">adottati con entusiasmo</a>. Una cosa è certa:  <strong>questi sono gli standard del futuro</strong>. La rete si sta preparando da tempo ed è ricca di risorse e demo interessanti:</p>
<ul>
<li><a href="http://www.thewildernessdowntown.com/">The Wilderness Downtown</a>, splendida demo delle capacità di HTML5</li>
<li><a href="http://hi-pk.com/2010/12/10-cool-and-useful-html-5-tutorials/">10 Cool and Useful HTML 5 Tutorials</a></li>
<li><a href="http://thinkvitamin.com/code/23-essential-html-5-resources/">23 Essential HTML 5 Resources</a></li>
<li><a href="http://html5demos.com/">HTML5 Demos and Examples</a></li>
<li><a href="http://html5gallery.com/">HTML5 Gallery</a></li>
</ul>
<h2 id="span-stylefont-weight-normal-font-size-13pxda-un-punto-di-vista-professionale-vale-senz8217altro-la-pena-stronginvestire-fin-da-ora-tempo-e-risorse-nello-studio-di-html5-e-css3strong-l8217avvento-di-internet-explorer-9-aumenterà-rapidamente-il-numero-di-navigatoriem-html5-enabledem-tanto-che-l8217implementazione-di-siti-di-massa-con-queste-tecnologie-sarà-possibile-ben-prima-di-quanto-non-si-immaginispan"><!-- raw HTML omitted -->Da un punto di vista professionale vale senz’altro la pena <!-- raw HTML omitted -->investire fin da ora tempo e risorse nello studio di HTML5 e CSS3<!-- raw HTML omitted -->. L’avvento di Internet Explorer 9 aumenterà rapidamente il numero di navigatori<!-- raw HTML omitted --> HTML5-enabled<!-- raw HTML omitted -->; tanto che l’implementazione di siti di massa con queste tecnologie sarà possibile ben prima di quanto non si immagini.<!-- raw HTML omitted --></h2>]]></content:encoded>
    </item>
    <item>
      <title>E’ Python il linguaggio del 2011</title>
      <link>https://nicolaiarocci.com/python-e-il-linguaggio-del-2011/</link>
      <pubDate>Mon, 03 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-e-il-linguaggio-del-2011/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;Qualche giorno &lt;a href=&#34;http://www.readwriteweb.com/hack/2010/12/hacker-poll-programming-languages-2011.php&#34;&gt;ReadWriteWeb&lt;/a&gt; ha chiesto ai suoi lettori quali sono i linguaggi di programmazione che pensano di studiare nel 2011. La selezione è piuttosto ampia e include buona parte i linguaggi attorno ai quali c’è fermento questi mesi (tra gli altri &lt;a href=&#34;http://clojure.org/&#34;&gt;Clojure&lt;/a&gt;, &lt;a href=&#34;http://golang.org/&#34;&gt;Go&lt;/a&gt;, &lt;a href=&#34;http://www.erlang.org/&#34;&gt;Erlang&lt;/a&gt;, &lt;a href=&#34;http://www.haskell.org/haskellwiki/Haskell&#34;&gt;Haskell&lt;/a&gt;). Ci si rivolge a programmatori esperti che hanno già maturato una certa esperienza, probabilmente per questo motivo sono esclusi alcuni grandi classici come il linguaggio C (è presente Java).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted -->Qualche giorno <a href="http://www.readwriteweb.com/hack/2010/12/hacker-poll-programming-languages-2011.php">ReadWriteWeb</a> ha chiesto ai suoi lettori quali sono i linguaggi di programmazione che pensano di studiare nel 2011. La selezione è piuttosto ampia e include buona parte i linguaggi attorno ai quali c’è fermento questi mesi (tra gli altri <a href="http://clojure.org/">Clojure</a>, <a href="http://golang.org/">Go</a>, <a href="http://www.erlang.org/">Erlang</a>, <a href="http://www.haskell.org/haskellwiki/Haskell">Haskell</a>). Ci si rivolge a programmatori esperti che hanno già maturato una certa esperienza, probabilmente per questo motivo sono esclusi alcuni grandi classici come il linguaggio C (è presente Java).</p>
<p>Quali sono finora i linguaggi più gettonati?</p>
<ol>
<li>Python (14.5%)</li>
<li>Ruby (13.8%)</li>
<li>Node.js (9.53%)</li>
<li>ECMAScript (JavaScript, ActionScript) (8.15%)</li>
<li>Scala (8.01%)</li>
</ol>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --><a href="http://python.org/">Python</a> al momento si gode il primo posto anche se <a href="http://www.ruby-lang.org/en/">Ruby</a> gli soffia sul collo e non sembra intenzionato a mollare l’osso. Al terzo posto, distanziato, l’interessantissimo progetto <a href="http://nodejs.org/">Node.js</a>. Curiosa la scelta di includerlo nella selezione dato che non è un linguaggio di programmazione in senso stretto. JavaScript si piazza appena fuori dal podio mentre al quinto posto troviamo il primo dei <em>new kids on the block,</em> <a href="http://www.scala-lang.org/">Scala</a>.</p>
<h2 id="linguaggi-script-alla-ribalta">Linguaggi script alla ribalta</h2>
<p>E’ presto per trarre conclusioni (il questionario è online da pochi giorni e il sondaggio è ancora in corso) ma balza all’occhio come nelle prime quattro posizioni ci siano linguaggi script non compilati, a conferma di quella che sembra essere la tendenza degli ultimi anni, almeno nel contesto delle startup web e dei giovani programmatori web-oriented che costituisce in buona parte il pubblico di riferimento di un sito come ReadWriteWeb.</p>
<h2 id="javascript-è-più-importante-di-quanto-si-pensi">JavaScript è più importante di quanto si pensi</h2>
<p>Uniti, Node.js e JavaScript balzano in vetta alla classifica. Il linguaggio JavaScript è sottovalutato da molti sviluppatori che si limitano a incollare brevi snippets per la manipolazione del <a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a> o la convalida di campi di input, ma le esigenze di interattività e reattività indurranno a spostare  l’implementazione dal server al client rendendo la conoscenza approfondita del linguaggio JavaScript sempre più determinante.</p>
<p>Presto dedicherò una serie di articoli a Python e proporrò alcuni approfondimenti su JavaScript. Rimani sintonizzato!</p>]]></content:encoded>
    </item>
    <item>
      <title>Come accorciare links e URL usando le API di Bit.ly via ASP.NET</title>
      <link>https://nicolaiarocci.com/accorciare-url-usando-bit-ly-via-asp-net/</link>
      <pubDate>Mon, 29 Nov 2010 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/accorciare-url-usando-bit-ly-via-asp-net/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Una delle applicazioni su cui sto lavorando in questo periodo manda decine di emails al giorno, ognuna contenente almeno un paio di links (URL). Questi link sono molto lunghi perché oltre all’indirizzo della pagina da aprire contengono una o più &lt;a href=&#34;http://en.wikipedia.org/wiki/Query_string&#34;&gt;query strings&lt;/a&gt;. In generale, per tante buone ragioni, le URL lunghe non sono mai una buona idea; ancor meno lo sono se  devono comparire in un messaggio email. Gli algoritmi di &lt;a href=&#34;http://en.wikipedia.org/wiki/Word_wrap&#34;&gt;word wrapping&lt;/a&gt; dei client di posta elettronica vanno in crisi quando sono costretti a inserire un ritorno di carrello nel bel mezzo della URL. Come biasimarli?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Una delle applicazioni su cui sto lavorando in questo periodo manda decine di emails al giorno, ognuna contenente almeno un paio di links (URL). Questi link sono molto lunghi perché oltre all’indirizzo della pagina da aprire contengono una o più <a href="http://en.wikipedia.org/wiki/Query_string">query strings</a>. In generale, per tante buone ragioni, le URL lunghe non sono mai una buona idea; ancor meno lo sono se  devono comparire in un messaggio email. Gli algoritmi di <a href="http://en.wikipedia.org/wiki/Word_wrap">word wrapping</a> dei client di posta elettronica vanno in crisi quando sono costretti a inserire un ritorno di carrello nel bel mezzo della URL. Come biasimarli?</p>
<p>Ci sono poi certi sistemi di web mail (quello di Libero, per non far nomi) che semplicemente non sono capaci di riprodurre correttamente un link o se lo fanno non attivano il link per ragioni di sicurezza, lasciando così al destinatario della mail il compito di copiare e incollare l’intera URL nel browser. Operazione non sempre banale per l’utente medio, soprattutto quando (guarda caso!) il testo da copiare e incollare è lunghissimo.</p>
<p>Si potrebbe risolvere banalmente ricorrendo agli <a href="http://www.w3schools.com/HTML/html_links.asp">anchor tag HTML</a> ma nel mio caso questa strada non è praticabile: i messaggi devono essere in puro testo. Non solo, questa soluzione non risolverebbe comunque il problema dei web mail client che non si fidano dei miei messaggi. Creare a priori URL brevi non è una opzione per ragioni di legacy (il sito non l’ho creato io!). Come fare allora?</p>
<h2 id="chiedere-aiuto-a-un-serviziourl-shortener">Chiedere aiuto a un servizio URL Shortener</h2>
<p>Gli <a href="http://it.wikipedia.org/wiki/URL_shortening">URL shortener</a> sono servizi molto usati in ambito social networking e non solo. Data una certa URL di qualunque lunghezza ne restituiscono una equivalente molto più breve. Pioniere in questo campo è stato TinyURL ma oggigiorno il servizio più diffuso e conosciuto è senz’altro <a href="http://bit.ly/">Bit.ly</a>, il quale ha l’indubbio vantaggio di offrire una <a href="http://it.wikipedia.org/wiki/Representational_State_Transfer">REST API</a> ricca, robusta e <a href="http://code.google.com/p/bitly-api/wiki/ApiDocumentation#bit.ly_API_Documentation">ben documentata</a>. Questa libreria gratuita consente ai programmatori indipendenti (noi) l’implementazione di servizi di URL shortening nelle proprie applicazioni.</p>
<p>Ecco dunque <strong>ShortenUrl</strong>, una semplice funzione ASP.NET che restituisce una URL breve a partire da una URL di qualunque lunghezza passata come parametro. Nel caso la chiamata alla API fallisca la funzione restituirà semplicemente una stringa vuota.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La gran parte del lavoro è fatto da una sola linea di codice (ok, avrei potuto suddividerla in due o tre linee per amor di chiarezza, te lo concedo). La richiesta REST al servizio è eseguita da una istanza della classe <a href="http://msdn.microsoft.com/it-it/library/system.net.httpwebrequest(v=VS.90).aspx">HttpWebRequest</a>. Il <a href="http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/v3/shorten">metodo Shorten</a> può restituire risultati in formato <a href="http://it.wikipedia.org/wiki/JSON">JSON</a>, <a href="http://it.wikipedia.org/wiki/XML">XML</a> o puro testo. Per semplicità ho scelto il formato testo. A seconda delle necessità potresti ricorrere al bellissimo formato JSON o al logorroico XML,  la documentazione ufficiale contiene esempi molto chiari anche per questi formati.</p>
<p>Se non disponi di un account Bit.ly dovrai <a href="http://bit.ly/a/sign_up">registrarti</a> (è gratis). Una volta creato l’account potrai recuperare facilmente la tua <a href="http://bit.ly/a/your_api_key">API Key personale</a>, indispensabile per poter effettuare chiamate ai metodi della libreria.</p>]]></content:encoded>
    </item>
    <item>
      <title>Programmazione Asincrona per C# e VB</title>
      <link>https://nicolaiarocci.com/programmazione-asincrona/</link>
      <pubDate>Fri, 29 Oct 2010 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-asincrona/</guid>
      <description>&lt;p&gt;Un articolo sul &lt;!-- raw HTML omitted --&gt;Somasegar’s Weblog&lt;!-- raw HTML omitted --&gt; annuncia oggi il rilascio imminente di un nuovo modello di programmazione asincrona per C# and VB:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today, we are unveiling significant language and framework enhancements in C# and Visual Basic that enable developers to harness asynchrony, letting them retain the control flow from their synchronous code while developing responsive user interfaces and scalable web applications with greater ease.   This CTP delivers a lightweight asynchronous development experience as close to the standard synchronous paradigms as possible, while providing an easy on-ramp to the world of concurrency&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Un articolo sul <!-- raw HTML omitted -->Somasegar’s Weblog<!-- raw HTML omitted --> annuncia oggi il rilascio imminente di un nuovo modello di programmazione asincrona per C# and VB:</p>
<blockquote>
<p>Today, we are unveiling significant language and framework enhancements in C# and Visual Basic that enable developers to harness asynchrony, letting them retain the control flow from their synchronous code while developing responsive user interfaces and scalable web applications with greater ease.   This CTP delivers a lightweight asynchronous development experience as close to the standard synchronous paradigms as possible, while providing an easy on-ramp to the world of concurrency</p></blockquote>
<p>Lo stesso Somasegar riconosce che finora sviluppare applicazioni asincrone complesse con la piattaforma .NET non è stato facile. Tempo fa l’ho sperimentato in prima persona. Lavoravo su <a href="http://gestionaleamica.com/Backup/">Amica Prodigy Backup</a>, una applicazione di backup remoto.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il programma invia files di grandi dimensioni al servizio di cloud storage <a href="http://aws.amazon.com/s3/">S3</a> aggiornando l’interfaccia utente con lo stato del trasferimento e consentendo nel frattempo di operare liberamente con l’interfaccia. Devo ammettere che si è trattata di una sfida molto accattivante. Lavoravo per la prima volta su sistemi cloud e c’era molto da imparare. La parte più difficile fu naturalmente la gestione dei processi asincroni sul client, che era una applicazione WinForm scritta su .NET Framework.</p>
<p>Una rapida occhiata al codice di esempio presente nell’articolo di Somasegar è meglio di mille parole. ‘The Old Way’ vs ‘The New Way’ ha un vincitore evidente, ed è la New Way. Mi piace molto il concetto della nuova keyword Await, è una soluzione così elegante! Come sempre in questi casi occorrerà scendere nei dettagli per verificare l’affidabilità di questa nuova soluzione.</p>
<p>La  CTP è già disponibile per il <!-- raw HTML omitted -->download<!-- raw HTML omitted -->, attualmente solo per le versioni inglesi di Visual Studio 2010.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Una ottima guida di riferimento per lo sviluppatore ASP.NET</title>
      <link>https://nicolaiarocci.com/guida-di-riferimento-per-asp-net/</link>
      <pubDate>Tue, 26 Oct 2010 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/guida-di-riferimento-per-asp-net/</guid>
      <description>&lt;p&gt;La  &lt;!-- raw HTML omitted --&gt;ASP.NET Developer Guidance Map&lt;!-- raw HTML omitted --&gt; è una eccellente risorsa sia per il programmatore alle prime armi che per il veterano. Fornisce una ottima selezione di  risorse web catalogate nelle seguenti categorie: Primi Passi, Architettura e Design, Codice di Esempio, Come Fare, Filmati, Addestramento.&lt;/p&gt;
&lt;p&gt;Peccato sia disponibile solo in formato PDF, qualcuno dovrebbe approntare una pagina wiki o qualcosa di simile che riproduca questi contenuti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>La  <!-- raw HTML omitted -->ASP.NET Developer Guidance Map<!-- raw HTML omitted --> è una eccellente risorsa sia per il programmatore alle prime armi che per il veterano. Fornisce una ottima selezione di  risorse web catalogate nelle seguenti categorie: Primi Passi, Architettura e Design, Codice di Esempio, Come Fare, Filmati, Addestramento.</p>
<p>Peccato sia disponibile solo in formato PDF, qualcuno dovrebbe approntare una pagina wiki o qualcosa di simile che riproduca questi contenuti.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
