<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ifad on Marcello Barnaba</title>
    <link>https://sindro.me/it/tags/ifad/</link>
    <description>Recent content in Ifad on Marcello Barnaba</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Sat, 11 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sindro.me/it/tags/ifad/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ansible-wsadmin: Bypassare AdminConfig per Automatizzare WebSphere via JMX</title>
      <link>https://sindro.me/it/posts/2026-04-11-ansible-wsadmin/</link>
      <pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2026-04-11-ansible-wsadmin/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; — IBM WebSphere ha un&amp;rsquo;API di configurazione pulita (ConfigService) sepolta sotto un wrapper a stringhe rotto (AdminConfig). Ho costruito un layer Jython ad oggetti che si aggancia a ConfigService direttamente via JMX — semplificando la configurazione e garantendo la correttezza dei tipi tramite introspezione dei metadati — più un daemon persistente che elimina l&amp;rsquo;overhead di boot della JVM, e 55 script idempotenti che si integrano col rilevamento di cambiamenti di Ansible. &lt;a href=&#34;https://github.com/vjt/ansible-wsadmin&#34; target=&#34;_blank&#34;&gt;github.com/vjt/ansible-wsadmin&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Nel 2021 ho passato sei mesi ad automatizzare l&amp;rsquo;infrastruttura WebSphere dell&amp;rsquo;&lt;a href=&#34;https://www.ifad.org/&#34; target=&#34;_blank&#34;&gt;IFAD&lt;/a&gt; con Ansible. Lo stack era IBM WebSphere Application Server (WAS), WebSphere Portal Server (WPS) e Business Automation Workflow (BAW) — un deployment clusterizzato con Deployment Manager, nodi multipli, LDAP federato, messaging SIB, tutto quanto.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;approccio standard per automatizzare WAS è scrivere script Jython usando &lt;code&gt;AdminConfig&lt;/code&gt;, &lt;code&gt;AdminTask&lt;/code&gt; e &lt;code&gt;AdminApp&lt;/code&gt; — i quattro oggetti globali di scripting che IBM fornisce dentro &lt;a href=&#34;https://en.wikipedia.org/wiki/Wsadmin&#34; target=&#34;_blank&#34;&gt;wsadmin&lt;/a&gt;. Ho provato. È durato un giorno prima di iniziare a guardare cosa c&amp;rsquo;è sotto.&lt;/p&gt;&#xA;&lt;p&gt;Quello che ho trovato ha cambiato il mio approccio all&amp;rsquo;intero progetto. Ha anche prodotto una libreria piena di idee che non ho mai avuto modo di descrivere come si deve — fino ad ora, con un piccolo aiuto da &lt;a href=&#34;https://claude.ai&#34; target=&#34;_blank&#34;&gt;Claude&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrare i prodotti OneSpan 2FA in Ruby</title>
      <link>https://sindro.me/it/posts/2020-09-11-integrating-onespan-2fa-with-ruby/</link>
      <pubDate>Fri, 11 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2020-09-11-integrating-onespan-2fa-with-ruby/</guid>
      <description>&lt;p&gt;Mi è stato affidato il compito di integrare l&amp;rsquo;autenticazione a due fattori con token hardware di &lt;a href=&#34;https://www.onespan.com/&#34; target=&#34;_blank&#34;&gt;OneSpan&lt;/a&gt; (ex VASCO) in uno stack Ruby — wrappando il loro SDK C proprietario VACMAN Controller per la validazione OTP in locale, e costruendo un client per l&amp;rsquo;API SOAP del &lt;a href=&#34;https://docs.onespan.com/sec/docs/onespan-authentication-server&#34; target=&#34;_blank&#34;&gt;OneSpan Authentication Server&lt;/a&gt; (originariamente chiamato Identikey Authentication Server, rinominato a metà progetto). Nessuno dei due aveva una libreria Ruby.&lt;/p&gt;&#xA;&lt;p&gt;Per &lt;a href=&#34;https://github.com/vjt/vacman_controller&#34; target=&#34;_blank&#34;&gt;vacman_controller&lt;/a&gt; c&amp;rsquo;era un punto di partenza: &lt;a href=&#34;https://github.com/mlankenau/vacman_controller&#34; target=&#34;_blank&#34;&gt;una C extension Ruby&lt;/a&gt; di Marcus Lankenau che wrappava l&amp;rsquo;SDK AAL2. Un solo commit, nessuna release, parecchio grezza, ma le fondamenta — linking, import dei token e wrapper di base — c&amp;rsquo;erano. L&amp;rsquo;ho &lt;a href=&#34;https://github.com/ifad/vacman_controller&#34; target=&#34;_blank&#34;&gt;forkata in IFAD&lt;/a&gt;, sistemata, estesa e le ho spinto sopra &lt;a href=&#34;https://github.com/vjt/vacman_controller/commits/master&#34; target=&#34;_blank&#34;&gt;97 commit aggiuntivi&lt;/a&gt;. 14 release, dalla v0.1.0 alla v0.9.3.&lt;/p&gt;&#xA;&lt;p&gt;Per &lt;a href=&#34;https://github.com/vjt/identikey&#34; target=&#34;_blank&#34;&gt;identikey&lt;/a&gt; non c&amp;rsquo;era nulla — OneSpan distribuisce un SDK Java, nessuna libreria Ruby esiste. L&amp;rsquo;ho &lt;a href=&#34;https://github.com/vjt/identikey&#34; target=&#34;_blank&#34;&gt;scritta da zero&lt;/a&gt;: 123 commit, 18 tag, dalla v0.2.0 alla v0.9.1.&lt;/p&gt;&#xA;&lt;p&gt;Entrambe sono &lt;a href=&#34;https://github.com/vjt/vacman_controller&#34; target=&#34;_blank&#34;&gt;su&lt;/a&gt; &lt;a href=&#34;https://github.com/vjt/identikey&#34; target=&#34;_blank&#34;&gt;GitHub&lt;/a&gt;. Ecco cosa c&amp;rsquo;è dentro.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ChronoModel 1.0: sette anni per rilasciare</title>
      <link>https://sindro.me/it/posts/2019-04-06-chronomodel-one-dot-zero/</link>
      <pubDate>Sat, 06 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2019-04-06-chronomodel-one-dot-zero/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    La mia ultima release e&amp;rsquo; stata la &lt;a href=&#34;https://rubygems.org/gems/chrono_model/versions/1.2.2&#34; target=&#34;_blank&#34;&gt;v1.2.2&lt;/a&gt; a maggio 2019. Dopo, &lt;a href=&#34;https://github.com/tagliala&#34; target=&#34;_blank&#34;&gt;Geremia Taglialatela&lt;/a&gt; ha preso in mano la manutenzione e l&amp;rsquo;ha portato alla &lt;a href=&#34;https://rubygems.org/gems/chrono_model/versions/5.0.0&#34; target=&#34;_blank&#34;&gt;v5.0.0&lt;/a&gt; con supporto per Rails 8.1 e Ruby 4.0. &lt;a href=&#34;https://rubygems.org/gems/chrono_model/versions&#34; target=&#34;_blank&#34;&gt;34 release&lt;/a&gt; in 14 anni, &lt;a href=&#34;https://github.com/ifad/chronomodel/stargazers&#34; target=&#34;_blank&#34;&gt;201 stelle&lt;/a&gt;, e ancora attivamente mantenuta. La &lt;a href=&#34;https://vjt.github.io/chronomodel/&#34; target=&#34;_blank&#34;&gt;documentazione API&lt;/a&gt; e il &lt;a href=&#34;https://github.com/ifad/chronomodel&#34; target=&#34;_blank&#34;&gt;repo&lt;/a&gt; sono entrambi vivi.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Sette anni fa ho &lt;a href=&#34;https://sindro.me/it/posts/2012-05-07-chronomodel-time-travel-postgresql/&#34;&gt;rilasciato ChronoModel v0.1.0&lt;/a&gt; — una gem Ruby che da&amp;rsquo; ai modelli ActiveRecord capacita&amp;rsquo; temporali su PostgreSQL. Cinque giorni di hacking, trentasei commit, nessun test, e una confessione sul monkey-patching della costante dell&amp;rsquo;adapter PostgreSQL.&lt;/p&gt;&#xA;&lt;p&gt;Oggi taggo la &lt;a href=&#34;https://github.com/ifad/chronomodel/commit/aa07e74&#34; target=&#34;_blank&#34;&gt;v1.0.0&lt;/a&gt;. Il messaggio di commit e&amp;rsquo; &lt;code&gt;:gem: this is v1.0.0&lt;/code&gt;. Non proprio un discorso memorabile, ma il codice parla da solo: 506 commit, 31 release, 52 file modificati, 5.392 righe aggiunte. L&amp;rsquo;&lt;a href=&#34;https://sindro.me/it/posts/2012-05-07-chronomodel-time-travel-postgresql/#larchitettura&#34;&gt;idea di base&lt;/a&gt; — viste aggiornabili su &lt;code&gt;public&lt;/code&gt;, dati correnti su &lt;code&gt;temporal&lt;/code&gt;, storico su &lt;code&gt;history&lt;/code&gt; con table inheritance — non e&amp;rsquo; mai cambiata. Tutto il resto si&#39;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Un importatore senza vergogna di Translation Memory in Pontoon</title>
      <link>https://sindro.me/it/posts/2018-02-14-translation-memory-pontoon/</link>
      <pubDate>Wed, 14 Feb 2018 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2018-02-14-translation-memory-pontoon/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    Il repo a &lt;a href=&#34;https://github.com/ifad/translation-memory&#34; target=&#34;_blank&#34;&gt;github.com/ifad/translation-memory&lt;/a&gt; è ancora pubblico, ancora senza README, e il fork di Pontoon a cui parla resta privato. &lt;a href=&#34;https://github.com/mozilla/pontoon&#34; target=&#34;_blank&#34;&gt;L&amp;rsquo;upstream di Mozilla&lt;/a&gt; è aperto e molto vivo. Se qualcuno all&amp;rsquo;IFAD usi ancora Pontoon otto anni dopo, sinceramente non lo so — l&amp;rsquo;ho costruito per un progetto sulla mia scrivania, non come cambio di workflow aziendale. La regex che strippa i caratteri non-word ha fatto il suo lavoro per i mesi in cui mi serviva. Poi, presumibilmente, la successiva migration dello schema di Pontoon ha rotto qualcosa. È quello che succede alle integrazioni che parlano direttamente con un database.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;L&amp;rsquo;&lt;a href=&#34;http://www.ifad.org/&#34; target=&#34;_blank&#34;&gt;IFAD&lt;/a&gt; è un&amp;rsquo;agenzia ONU che opera in &lt;a href=&#34;https://www.ifad.org/en/web/operations/languages&#34; target=&#34;_blank&#34;&gt;inglese, francese, spagnolo e arabo&lt;/a&gt;. Ogni stringa visibile delle nostre app Rails deve esistere in quattro lingue, il che significa che abbiamo un team di traduzione, il che significa che abbiamo un workflow di traduzione, che sulla maggior parte dei progetti prevede un &lt;a href=&#34;https://it.wikipedia.org/wiki/Computer_assisted_translation&#34; target=&#34;_blank&#34;&gt;CAT desktop&lt;/a&gt;, file allegati alle email, e translation memory che girano in formato XML.&lt;/p&gt;&#xA;&lt;p&gt;Quel workflow non sopravvive a un progetto su cui sto lavorando in questo momento. È un&amp;rsquo;app web Rails con una scadenza stretta, le stringhe sorgente cambiano ogni settimana, e nel tempo che un traduttore impiega per finire un file TM e rimandarlo via email le stringhe si sono già spostate. Mi servono traduttori e sviluppatori che guardano lo stesso database in tempo reale. Scelgo &lt;a href=&#34;https://pontoon.mozilla.org/&#34; target=&#34;_blank&#34;&gt;Mozilla Pontoon&lt;/a&gt; — open-source, gratis, adattabile, scritto in Django, basato su Postgres — e lo tiro su per il mio progetto. La fregatura: c&amp;rsquo;è un corpus di traduzioni dal tool precedente che voglio usare per fare il seed di Pontoon dal primo giorno, così i traduttori non partono dal nulla.&lt;/p&gt;&#xA;&lt;p&gt;Oggi inizio un repo &lt;a href=&#34;https://github.com/ifad/translation-memory&#34; target=&#34;_blank&#34;&gt;translation-memory&lt;/a&gt; e scrivo il primo parser. Il progetto è descritto, con tutta la dovuta umiltà ingegneristica, come &lt;a href=&#34;https://github.com/ifad/translation-memory&#34; target=&#34;_blank&#34;&gt;&amp;ldquo;Parser per file TMX, SDL/XLIFF e TXML e importatore senza vergogna in Mozilla Pontoon&amp;rdquo;&lt;/a&gt;. Quel &amp;ldquo;senza vergogna&amp;rdquo; sta facendo molto lavoro in quella frase.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Da Heathen a Colore: una pipeline per i documenti</title>
      <link>https://sindro.me/it/posts/2016-01-15-document-pipeline-heathen-colore/</link>
      <pubDate>Fri, 15 Jan 2016 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2016-01-15-document-pipeline-heathen-colore/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    Colore è ancora vivo a &lt;a href=&#34;https://github.com/ifad/colore&#34; target=&#34;_blank&#34;&gt;github.com/ifad/colore&lt;/a&gt; — &lt;a href=&#34;https://github.com/ifad/colore/commits?author=tagliala&#34; target=&#34;_blank&#34;&gt;Geremia Taglialatela&lt;/a&gt; ha preso in mano il progetto dopo che io mi sono spostato su altre cose, e l&amp;rsquo;ha portato avanti attraverso Ruby 2.7, 3.0, 3.1, 3.2, sidekiq 6, e CI moderna. È a &lt;a href=&#34;https://github.com/ifad/colore/graphs/contributors&#34; target=&#34;_blank&#34;&gt;354 commit&lt;/a&gt; — tre volte i miei. Il &lt;a href=&#34;https://github.com/ifad/colore/tree/master/nginx/ngx_colore_module&#34; target=&#34;_blank&#34;&gt;modulo C per nginx&lt;/a&gt; che Joe ha scritto a febbraio 2015 è invariato. Heathen come servizio standalone è stato alla fine assorbito direttamente dentro Colore come libreria; il &lt;a href=&#34;https://github.com/ifad/heathen&#34; target=&#34;_blank&#34;&gt;repo originale&lt;/a&gt; è archiviato ma il codice vive dentro &lt;code&gt;lib/heathen/&lt;/code&gt; di Colore. Stessa idea, meno componenti.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;L&amp;rsquo;&lt;a href=&#34;http://www.ifad.org/&#34; target=&#34;_blank&#34;&gt;IFAD&lt;/a&gt; è un&amp;rsquo;agenzia delle Nazioni Unite che gira sui documenti. Accordi di prestito, rapporti di valutazione, note strategiche per Paese, decisioni del Board, brief di progetto — ogni applicazione web che costruiamo prima o poi deve prendere un file Word e restituire un PDF, o prendere una scansione e restituire qualcosa di indicizzabile, o prendere un blob qualsiasi e farne una thumbnail. Tre anni fa abbiamo deciso di smettere di risolvere questo problema un&amp;rsquo;applicazione alla volta e di metterlo dietro un singolo servizio.&lt;/p&gt;&#xA;&lt;p&gt;Oggi sto mergiando la &lt;a href=&#34;https://github.com/ifad/colore/commit/63d4fe0&#34; target=&#34;_blank&#34;&gt;v1.0.0 di Colore&lt;/a&gt;. È il secondo tentativo di quel servizio, ed è quello che ci teniamo. Questa è la storia di entrambi i tentativi e delle persone che li hanno costruiti — perché quasi nessuna riga del codice qui sotto è mia.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Eaco: il guardiano delle chiavi dell&#39;Ade</title>
      <link>https://sindro.me/it/posts/2015-02-28-eaco-authorization-ruby/</link>
      <pubDate>Sat, 28 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2015-02-28-eaco-authorization-ruby/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    Eaco ha raggiunto la &lt;a href=&#34;https://github.com/ifad/eaco/tree/v1.0.0&#34; target=&#34;_blank&#34;&gt;v1.0.0&lt;/a&gt; il 5 maggio 2016 — messaggio di commit: &amp;ldquo;This is v1.0.0. Two years in production.&amp;rdquo; E&amp;rsquo; cresciuto fino a 54 stelle, 8 fork, 240 commit, e ha gestito l&amp;rsquo;autorizzazione all&amp;rsquo;IFAD per altri cinque anni. &lt;a href=&#34;https://github.com/tagliala&#34; target=&#34;_blank&#34;&gt;Geremia Taglialatela&lt;/a&gt; l&amp;rsquo;ha preso in mano nel 2020 e l&amp;rsquo;ha mantenuto su Rails 6.0 e 6.1, poi ha &lt;a href=&#34;https://github.com/ifad/eaco/commit/19&#34; target=&#34;_blank&#34;&gt;modernizzato la CI&lt;/a&gt; a fine 2025. Il pattern ABAC con ACL-come-hash si e&amp;rsquo; rivelato esattamente la scelta giusta per un&amp;rsquo;organizzazione dove l&amp;rsquo;accesso e&amp;rsquo; determinato da posizione, dipartimento e gruppo di lavoro — non solo &amp;ldquo;admin o no.&amp;rdquo; Il &lt;a href=&#34;https://github.com/ifad/eaco&#34; target=&#34;_blank&#34;&gt;repo&lt;/a&gt; e&amp;rsquo; ancora online, e la &lt;a href=&#34;https://vjt.github.io/eaco/&#34; target=&#34;_blank&#34;&gt;documentazione YARD&lt;/a&gt; e&amp;rsquo; ancora tra le piu&amp;rsquo; complete che abbia mai scritto per una gem.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Scriptoria e&amp;rsquo; un&amp;rsquo;applicazione interna di workflow all&amp;rsquo;&lt;a href=&#34;http://www.ifad.org/&#34; target=&#34;_blank&#34;&gt;IFAD&lt;/a&gt; — un&amp;rsquo;agenzia specializzata delle Nazioni Unite a Roma — e il suo layer di autorizzazione mi sta dando sui nervi da mesi. Il codice funziona, ma e&amp;rsquo; aggrovigliato nell&amp;rsquo;app. Ogni volta che dobbiamo aggiungere un nuovo ruolo o cambiare chi puo&amp;rsquo; accedere a cosa, stiamo editando codice applicativo che non dovrebbe occuparsi di semantica di autorizzazione.&lt;/p&gt;&#xA;&lt;p&gt;Cosi&amp;rsquo; otto giorni fa ho iniziato a estrarlo. Oggi rilascio il risultato: &lt;a href=&#34;https://github.com/ifad/eaco&#34; target=&#34;_blank&#34;&gt;Eaco&lt;/a&gt; — un framework di Attribute-Based Access Control per Ruby, che prende il nome da &lt;a href=&#34;http://it.wikipedia.org/wiki/Eaco&#34; target=&#34;_blank&#34;&gt;Eaco&lt;/a&gt;, il guardiano delle chiavi dell&amp;rsquo;Ade nella mitologia greca.&lt;/p&gt;&#xA;&lt;p&gt;172 commit. Cinque release. 100% di test coverage. E un sabato pomeriggio che non rivedro&amp;rsquo; mai piu&#39;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hermes: help contestuale in 48 ore (Rails Rumble 2013)</title>
      <link>https://sindro.me/it/posts/2013-10-20-hermes-rails-rumble-2013/</link>
      <pubDate>Sun, 20 Oct 2013 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2013-10-20-hermes-rails-rumble-2013/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    Lo spazio dell&amp;rsquo;&amp;ldquo;help contestuale&amp;rdquo; è esploso in una vera categoria di prodotto — Intercom, Pendo, Appcues e altri oggi fanno questo commercialmente su scala. Il fork dell&amp;rsquo;IFAD ha continuato a vivere per anni dentro l&amp;rsquo;agenzia. La Rails Rumble stessa ha smesso di esistere dopo il 2015, e l&amp;rsquo;era degli hackathon competitivi da 48 ore ha lasciato il posto agli AI hackathon e agli startup weekend. Il &lt;a href=&#34;https://github.com/vjt/r13-hermes&#34; target=&#34;_blank&#34;&gt;repo&lt;/a&gt; è archiviato ma ancora online.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;La &lt;a href=&#34;http://railsrumble.com/&#34; target=&#34;_blank&#34;&gt;Rails Rumble&lt;/a&gt; è — era — un hackathon di 48 ore dove team di massimo quattro persone costruiscono un&amp;rsquo;app web completa da zero usando Ruby. Niente lavoro preparatorio, niente codice pre-scritto. Solo caffeina, git e una scadenza.&lt;/p&gt;&#xA;&lt;p&gt;Quest&amp;rsquo;anno il nostro team — &lt;a href=&#34;https://github.com/amedeo&#34; target=&#34;_blank&#34;&gt;@amedeo&lt;/a&gt;, &lt;a href=&#34;https://github.com/liquid1982&#34; target=&#34;_blank&#34;&gt;@liquid1982&lt;/a&gt;, &lt;a href=&#34;https://github.com/maisongb&#34; target=&#34;_blank&#34;&gt;@maisongb&lt;/a&gt; e il sottoscritto — ha costruito &lt;strong&gt;Hermes: the epic messenger service&lt;/strong&gt;, entry #385.&lt;/p&gt;&#xA;&lt;p&gt;(La mia &lt;a href=&#34;https://sindro.me/it/posts/2012-10-14-guess-the-friend-rails-rumble-2012/&#34;&gt;precedente partecipazione alla Rumble&lt;/a&gt; era stata &lt;em&gt;Guess The Friend&lt;/em&gt; nel 2012, con un team diverso.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>data-confirm-modal: quando un utente ha fatto troppi danni</title>
      <link>https://sindro.me/it/posts/2013-07-02-data-confirm-modal/</link>
      <pubDate>Tue, 02 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2013-07-02-data-confirm-modal/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    Questa piccola gem e&amp;rsquo; cresciuta fino a 268 stelle e 112 fork, con 32 contributori in 7 anni. Ha imparato &lt;a href=&#34;https://github.com/ifad/data-confirm-modal/blob/v1.6.0/vendor/assets/javascripts/data-confirm-modal.js#L12-L33&#34; target=&#34;_blank&#34;&gt;Bootstrap 3, poi 4 con auto-detection&lt;/a&gt; (v1.6.0), ha ottenuto una &lt;a href=&#34;https://github.com/ifad/data-confirm-modal?tab=readme-ov-file#without-rails-with-data-attributes-example-b3-example-b4&#34; target=&#34;_blank&#34;&gt;modalita&amp;rsquo; non-Rails&lt;/a&gt; con callback &lt;code&gt;dataConfirmModal.confirm()&lt;/code&gt; (v1.2.0), un &lt;a href=&#34;https://www.npmjs.com/package/data-confirm-modal&#34; target=&#34;_blank&#34;&gt;pacchetto npm&lt;/a&gt; che fa ancora 3.700 download a settimana (v1.6.2), e ha continuato a funzionare con ogni versione di Rails fino alla 6.0. Il concetto e&amp;rsquo; diventato talmente mainstream che ogni framework UI oggi ha il suo componente di conferma. Il &lt;a href=&#34;https://github.com/ifad/data-confirm-modal&#34; target=&#34;_blank&#34;&gt;repo&lt;/a&gt; e&amp;rsquo; ancora online.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Un utente all&amp;rsquo;&lt;a href=&#34;http://www.ifad.org/&#34; target=&#34;_blank&#34;&gt;IFAD&lt;/a&gt; ha fatto troppi danni la settimana scorsa.&lt;/p&gt;&#xA;&lt;p&gt;Non intenzionalmente — ha semplicemente cliccato attraverso una catena di azioni distruttive, liquidando allegramente i dialog &lt;code&gt;confirm()&lt;/code&gt; del browser senza leggerli. Perche&amp;rsquo; nessuno li legge. Sono brutti dialog di sistema grigi che si confondono con il flusso di lavoro. Clicca OK, clicca OK, clicca OK — e improvvisamente meta&amp;rsquo; dei dati e&amp;rsquo; sparita.&lt;/p&gt;&#xA;&lt;p&gt;Cosi&amp;rsquo; l&amp;rsquo;ho sistemato. E poi ho estratto la fix in una gem, perche&amp;rsquo; questo problema non e&amp;rsquo; specifico della nostra applicazione. Oggi rilascio &lt;a href=&#34;https://github.com/ifad/data-confirm-modal&#34; target=&#34;_blank&#34;&gt;data-confirm-modal&lt;/a&gt; — 116 righe di JavaScript che sostituiscono il &lt;code&gt;confirm()&lt;/code&gt; integrato di Rails con un &lt;a href=&#34;https://getbootstrap.com/2.3.2/javascript.html#modals&#34; target=&#34;_blank&#34;&gt;modal Bootstrap&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ChronoModel: viaggiare nel tempo con PostgreSQL</title>
      <link>https://sindro.me/it/posts/2012-05-07-chronomodel-time-travel-postgresql/</link>
      <pubDate>Mon, 07 May 2012 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/it/posts/2012-05-07-chronomodel-time-travel-postgresql/</guid>
      <description>&lt;div class=&#34;retrospective&#34;&gt;&#xA;  &lt;span class=&#34;retrospective-icon&#34;&gt;&amp;#x1f50d;&lt;/span&gt;&#xA;  &lt;div class=&#34;retrospective-body&#34;&gt;&#xA;    &lt;em&gt;Retrospettiva 2026&lt;/em&gt;&lt;br&gt;&#xA;    ChronoModel e&amp;rsquo; ancora vivo — 14 anni, 41 release, 201 stelle. Le regole sono state sostituite da trigger INSTEAD OF nella &lt;a href=&#34;https://github.com/ifad/chronomodel/tree/v0.6.0&#34; target=&#34;_blank&#34;&gt;v0.6&lt;/a&gt; (2014), l&amp;rsquo;hack &lt;code&gt;box()&lt;/code&gt;/&lt;code&gt;point()&lt;/code&gt; da colonne &lt;code&gt;tsrange&lt;/code&gt; native, e il monkey-patching da una corretta registrazione dell&amp;rsquo;adapter. &lt;a href=&#34;https://github.com/tagliala&#34; target=&#34;_blank&#34;&gt;Geremia Taglialatela&lt;/a&gt; ha preso in mano la manutenzione nel 2020 e l&amp;rsquo;ha portato alla &lt;a href=&#34;https://rubygems.org/gems/chrono_model/versions/5.0.0&#34; target=&#34;_blank&#34;&gt;v5.0.0&lt;/a&gt; con supporto per Rails 8.1 e Ruby 4.0. L&amp;rsquo;idea di base — viste aggiornabili su &lt;code&gt;public&lt;/code&gt;, dati correnti su &lt;code&gt;temporal&lt;/code&gt;, storico su &lt;code&gt;history&lt;/code&gt; con table inheritance — non e&amp;rsquo; mai cambiata. Il &lt;a href=&#34;https://github.com/ifad/chronomodel&#34; target=&#34;_blank&#34;&gt;repo&lt;/a&gt; e&amp;rsquo; attivo e mantenuto.&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Aggiornamento, aprile 2019:&lt;/strong&gt; &lt;a href=&#34;https://sindro.me/it/posts/2019-04-06-chronomodel-one-dot-zero/&#34;&gt;ChronoModel ha raggiunto la 1.0&lt;/a&gt; — sette anni, 506 commit e 31 release dopo.&lt;/p&gt;&#xA;&lt;p&gt;Stiamo costruendo un CRM all&amp;rsquo;&lt;a href=&#34;http://www.ifad.org/&#34; target=&#34;_blank&#34;&gt;IFAD&lt;/a&gt; — un&amp;rsquo;agenzia specializzata delle Nazioni Unite a Roma — e uno dei requisiti chiave sono i dati temporali. Dobbiamo sapere come appariva un record in qualsiasi momento del passato. Qual era il budget di questo progetto il 15 marzo? Quando e&amp;rsquo; cambiato l&amp;rsquo;indirizzo di questo beneficiario? Chi ha approvato cosa, e come appariva il record in quel momento?&lt;/p&gt;&#xA;&lt;p&gt;Stavo prototipando un approccio basato sullo schema di PostgreSQL — viste, regole, table inheritance — e funzionava. Poi &lt;a href=&#34;https://github.com/amedeo&#34; target=&#34;_blank&#34;&gt;Amedeo&lt;/a&gt;, il mio capo, ci ha dato un&amp;rsquo;occhiata e ha detto: &amp;ldquo;Questa roba non deve vivere dentro il CRM. Fanne un framework riusabile.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Aveva ragione. Il pattern temporale non ha niente a che fare con la logica del CRM. Va in una gem.&lt;/p&gt;&#xA;&lt;p&gt;Cosi&amp;rsquo; ho avuto cinque giorni di concentrazione totale, e oggi rilascio &lt;a href=&#34;https://github.com/ifad/chronomodel&#34; target=&#34;_blank&#34;&gt;ChronoModel&lt;/a&gt; — un&amp;rsquo;estensione ActiveRecord che da&amp;rsquo; ai tuoi modelli capacita&amp;rsquo; temporali complete su PostgreSQL. Quello che Oracle ti vende come &lt;a href=&#34;http://docs.oracle.com/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm&#34; target=&#34;_blank&#34;&gt;Flashback Queries&lt;/a&gt; facendoti pagare fior di quattrini, noi lo facciamo con SQL standard su Postgres 9.0+.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
