Mi è stato affidato il compito di integrare l’autenticazione a due fattori con token hardware di OneSpan (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’API SOAP del OneSpan Authentication Server (originariamente chiamato Identikey Authentication Server, rinominato a metà progetto). Nessuno dei due aveva una libreria Ruby.

Per vacman_controller c’era un punto di partenza: una C extension Ruby di Marcus Lankenau che wrappava l’SDK AAL2. Un solo commit, nessuna release, parecchio grezza, ma le fondamenta — linking, import dei token e wrapper di base — c’erano. L’ho forkata in IFAD, sistemata, estesa e le ho spinto sopra 97 commit aggiuntivi. 14 release, dalla v0.1.0 alla v0.9.3.

Per identikey non c’era nulla — OneSpan distribuisce un SDK Java, nessuna libreria Ruby esiste. L’ho scritta da zero: 123 commit, 18 tag, dalla v0.2.0 alla v0.9.1.

Entrambe sono su GitHub. Ecco cosa c’è dentro.

🔍
Retrospettiva 2026
La mia ultima release e’ stata la v1.2.2 a maggio 2019. Dopo, Geremia Taglialatela ha preso in mano la manutenzione e l’ha portato alla v5.0.0 con supporto per Rails 8.1 e Ruby 4.0. 34 release in 14 anni, 201 stelle, e ancora attivamente mantenuta. La documentazione API e il repo sono entrambi vivi.

Sette anni fa ho rilasciato ChronoModel v0.1.0 — una gem Ruby che da’ ai modelli ActiveRecord capacita’ temporali su PostgreSQL. Cinque giorni di hacking, trentasei commit, nessun test, e una confessione sul monkey-patching della costante dell’adapter PostgreSQL.

Oggi taggo la v1.0.0. Il messaggio di commit e’ :gem: this is v1.0.0. Non proprio un discorso memorabile, ma il codice parla da solo: 506 commit, 31 release, 52 file modificati, 5.392 righe aggiunte. L’idea di base — viste aggiornabili su public, dati correnti su temporal, storico su history con table inheritance — non e’ mai cambiata. Tutto il resto si'.

🔍
Retrospettiva 2026
Il repo a github.com/ifad/translation-memory è ancora pubblico, ancora senza README, e il fork di Pontoon a cui parla resta privato. L’upstream di Mozilla è aperto e molto vivo. Se qualcuno all’IFAD usi ancora Pontoon otto anni dopo, sinceramente non lo so — l’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.

L’IFAD è un’agenzia ONU che opera in inglese, francese, spagnolo e arabo. 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 CAT desktop, file allegati alle email, e translation memory che girano in formato XML.

Quel workflow non sopravvive a un progetto su cui sto lavorando in questo momento. È un’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 Mozilla Pontoon — open-source, gratis, adattabile, scritto in Django, basato su Postgres — e lo tiro su per il mio progetto. La fregatura: c’è 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.

Oggi inizio un repo translation-memory e scrivo il primo parser. Il progetto è descritto, con tutta la dovuta umiltà ingegneristica, come “Parser per file TMX, SDL/XLIFF e TXML e importatore senza vergogna in Mozilla Pontoon”. Quel “senza vergogna” sta facendo molto lavoro in quella frase.

🔍
Retrospettiva 2026
Colore è ancora vivo a github.com/ifad/coloreGeremia Taglialatela ha preso in mano il progetto dopo che io mi sono spostato su altre cose, e l’ha portato avanti attraverso Ruby 2.7, 3.0, 3.1, 3.2, sidekiq 6, e CI moderna. È a 354 commit — tre volte i miei. Il modulo C per nginx che Joe ha scritto a febbraio 2015 è invariato. Heathen come servizio standalone è stato alla fine assorbito direttamente dentro Colore come libreria; il repo originale è archiviato ma il codice vive dentro lib/heathen/ di Colore. Stessa idea, meno componenti.

L’IFAD è un’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’applicazione alla volta e di metterlo dietro un singolo servizio.

Oggi sto mergiando la v1.0.0 di Colore. È 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.

📜

Questo articolo è stato scritto nel 2015. È qui per ragioni storiche — i dettagli tecnici potrebbero non essere più validi.

🔍
Retrospettiva 2026
Eaco ha raggiunto la v1.0.0 il 5 maggio 2016 — messaggio di commit: “This is v1.0.0. Two years in production.” E’ cresciuto fino a 54 stelle, 8 fork, 240 commit, e ha gestito l’autorizzazione all’IFAD per altri cinque anni. Geremia Taglialatela l’ha preso in mano nel 2020 e l’ha mantenuto su Rails 6.0 e 6.1, poi ha modernizzato la CI a fine 2025. Il pattern ABAC con ACL-come-hash si e’ rivelato esattamente la scelta giusta per un’organizzazione dove l’accesso e’ determinato da posizione, dipartimento e gruppo di lavoro — non solo “admin o no.” Il repo e’ ancora online, e la documentazione YARD e’ ancora tra le piu’ complete che abbia mai scritto per una gem.

Scriptoria e’ un’applicazione interna di workflow all’IFAD — un’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’ aggrovigliato nell’app. Ogni volta che dobbiamo aggiungere un nuovo ruolo o cambiare chi puo’ accedere a cosa, stiamo editando codice applicativo che non dovrebbe occuparsi di semantica di autorizzazione.

Cosi’ otto giorni fa ho iniziato a estrarlo. Oggi rilascio il risultato: Eaco — un framework di Attribute-Based Access Control per Ruby, che prende il nome da Eaco, il guardiano delle chiavi dell’Ade nella mitologia greca.

172 commit. Cinque release. 100% di test coverage. E un sabato pomeriggio che non rivedro’ mai piu'.

📜

Questo articolo è stato scritto nel 2014. È qui per ragioni storiche — i dettagli tecnici potrebbero non essere più validi.

🔍
Retrospettiva 2026
Dodici anni dopo, AnyConnect si è rinominato “Cisco Secure Client” ma la filosofia è identica: controllo totale, trasparenza zero. L’industria è andata avanti — Tailscale, WireGuard e Cloudflare WARP hanno reso lo split tunneling il default. macOS ha rimpiazzato i kext con il framework NetworkExtension, e i trucchi con scutil richiedono più attenzione. Ma OpenConnect funziona ancora, il protocollo non è cambiato, e gli script sono ancora su GitHub.

Cisco AnyConnect è il tipo di software che ti fa dubitare che chi l’ha scritto abbia mai usato un computer fuori da un cubicolo aziendale. Lo installi, ti connetti alla VPN, e improvvisamente tutto il tuo traffico viene incanalato attraverso la rete del datore di lavoro. La navigazione personale, Spotify, le sessioni SSH verso i tuoi server – tutto. E non c’è un’impostazione per cambiarlo. È by design. I sysadmin della sede centrale hanno deciso cosa è meglio per te, e cosa è meglio per te è un tunnel completo con zero controllo utente.

Il vero sistemista

Un meccanico che con amore mette a punto un rack server vintage nel suo garage di notte, luce ambra calda, stelle dalla porta aperta

Il vero sistemista e’ un po’ come il meccanico di una volta, quello che se gli portavi la macchina per rifare la convergenza e quando arrivavi sentiva che il minimo non andava bene, ti faceva la convergenza, e giustamente la pagavi, ma poi ti sistemava anche il minimo e non ti chiedeva nulla, lo faceva perche’ non sopportava di sentire una macchina che non era a punto come si deve.

Era quello che da ogni minimo e impercettibile rumore indovinava subito qualsiasi problema, anche quello di cui il cliente non si era ancora accorto.

Era quello che dopo cena a casa con la famiglia, tornava in officina, dove potevi vedere le luci accese fino a notte tarda, perche’ stava lavorando al “suo” gioiello, una qualche macchina semi d’epoca recuperata chissa’ dove che con passione piano piano sistemava fino a farla tornare nuova.

Ecco, il sistemista e’ come quel meccanico, e le sue auto sono i server.

Fonte: Veteran Unix Admins

goto fail;

Con le sue stesse parole:

goto fail diff

Sorgenti: 55179.13.c, 55471.c

Differenze nel codice sorgente tra due versioni consecutive del Security.framework, un componente macOS/iOS. L’apparentemente innocuo goto fail; in più — una riga duplicata senza parentesi graffe attorno al corpo dell’if — faceva sì che la verifica dei certificati SSL/TLS venisse silenziosamente saltata del tutto. Qualsiasi certificato veniva accettato come valido, rendendo ogni connessione HTTPS sui dispositivi affetti vulnerabile ad attacchi man-in-the-middle. Il bug (CVE-2014-1266) colpiva iOS 6/7 e OS X Mavericks, ed è stato patchato in iOS 7.0.6 e OS X 10.9.2. È diventato uno degli esempi più famosi del perché le parentesi graffe contano e del perché la code review trova quello che il compilatore non vede. Vedi l’analisi tecnica di ImperialViolet per tutti i dettagli.

📜

Questo articolo è stato scritto nel 2013. È qui per ragioni storiche — i dettagli tecnici potrebbero non essere più validi.

🔍
Retrospettiva 2026
Lo spazio dell’“help contestuale” è esploso in una vera categoria di prodotto — Intercom, Pendo, Appcues e altri oggi fanno questo commercialmente su scala. Il fork dell’IFAD ha continuato a vivere per anni dentro l’agenzia. La Rails Rumble stessa ha smesso di esistere dopo il 2015, e l’era degli hackathon competitivi da 48 ore ha lasciato il posto agli AI hackathon e agli startup weekend. Il repo è archiviato ma ancora online.

La Rails Rumble è — era — un hackathon di 48 ore dove team di massimo quattro persone costruiscono un’app web completa da zero usando Ruby. Niente lavoro preparatorio, niente codice pre-scritto. Solo caffeina, git e una scadenza.

Quest’anno il nostro team — @amedeo, @liquid1982, @maisongb e il sottoscritto — ha costruito Hermes: the epic messenger service, entry #385.

(La mia precedente partecipazione alla Rumble era stata Guess The Friend nel 2012, con un team diverso.)


In questa pagina