📜

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

🔍
Retrospettiva 2026
Questa piccola gem e’ cresciuta fino a 268 stelle e 112 fork, con 32 contributori in 7 anni. Ha imparato Bootstrap 3, poi 4 con auto-detection (v1.6.0), ha ottenuto una modalita’ non-Rails con callback dataConfirmModal.confirm() (v1.2.0), un pacchetto npm 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’ diventato talmente mainstream che ogni framework UI oggi ha il suo componente di conferma. Il repo e’ ancora online.

Un utente all’IFAD ha fatto troppi danni la settimana scorsa.

Non intenzionalmente — ha semplicemente cliccato attraverso una catena di azioni distruttive, liquidando allegramente i dialog confirm() del browser senza leggerli. Perche’ 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’ dei dati e’ sparita.

Cosi’ l’ho sistemato. E poi ho estratto la fix in una gem, perche’ questo problema non e’ specifico della nostra applicazione. Oggi rilascio data-confirm-modal — 116 righe di JavaScript che sostituiscono il confirm() integrato di Rails con un modal Bootstrap.

📜

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

🔍
Retrospettiva 2026
Questo gioco usava le API Facebook Graph per accedere alla lista amici, alle foto profilo e ai dati personali — nome, posizione, interessi, tutto. Sono esattamente le stesse API che Cambridge Analytica ha sfruttato nel 2018 per raccogliere i dati di 87 milioni di utenti Facebook a fini di profilazione politica. Noi ci abbiamo costruito un gioco da festa; loro una macchina di sorveglianza. Facebook ha chiuso queste API nel 2018 dopo lo scoppio dello scandalo. Il gioco non funziona più da allora. L’ironia è spessa — le stesse funzionalità della piattaforma che rendevano possibili i giochini social hanno anche reso possibile uno dei più grandi scandali sulla privacy nella storia della tecnologia.

Lo scorso weekend abbiamo partecipato alla Rails Rumble 2012 — 48 ore per costruire un’app web da zero usando Ruby on Rails, nessuna preparazione consentita. Il nostro team faceva parte della community italiana 48rails e abbiamo costruito Guess The Friend: un gioco Facebook che implementa il classico Indovina Chi? da tavolo, ma usando i tuoi veri amici di Facebook come personaggi.

(Sarei tornato alla Rumble l’anno dopo con un team diverso, a costruire Hermes.)

📜

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

🔍
Retrospettiva 2026
ChronoModel e’ ancora vivo — 14 anni, 41 release, 201 stelle. Le regole sono state sostituite da trigger INSTEAD OF nella v0.6 (2014), l’hack box()/point() da colonne tsrange native, e il monkey-patching da una corretta registrazione dell’adapter. Geremia Taglialatela ha preso in mano la manutenzione nel 2020 e l’ha portato alla v5.0.0 con supporto per Rails 8.1 e Ruby 4.0. L’idea di base — viste aggiornabili su public, dati correnti su temporal, storico su history con table inheritance — non e’ mai cambiata. Il repo e’ attivo e mantenuto.

Aggiornamento, aprile 2019: ChronoModel ha raggiunto la 1.0 — sette anni, 506 commit e 31 release dopo.

Stiamo costruendo un CRM all’IFAD — un’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’ cambiato l’indirizzo di questo beneficiario? Chi ha approvato cosa, e come appariva il record in quel momento?

Stavo prototipando un approccio basato sullo schema di PostgreSQL — viste, regole, table inheritance — e funzionava. Poi Amedeo, il mio capo, ci ha dato un’occhiata e ha detto: “Questa roba non deve vivere dentro il CRM. Fanne un framework riusabile.”

Aveva ragione. Il pattern temporale non ha niente a che fare con la logica del CRM. Va in una gem.

Cosi’ ho avuto cinque giorni di concentrazione totale, e oggi rilascio ChronoModel — un’estensione ActiveRecord che da’ ai tuoi modelli capacita’ temporali complete su PostgreSQL. Quello che Oracle ti vende come Flashback Queries facendoti pagare fior di quattrini, noi lo facciamo con SQL standard su Postgres 9.0+.

📜

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

🔍
Retrospettiva 2026
Debian Squeeze ha raggiunto l’end-of-life nel 2016, e Node.js ora distribuisce pacchetti .deb ufficiali tramite NodeSource o arriva già pacchettizzato in ogni release moderna di Debian. Di sicuro non vuoi più cross-compilare da SID — usa nvm o i repo ufficiali.

In breve: aggiungi la sorgente APT di SID, configura l’APT Pinning per dare priorità ai pacchetti di squeeze rispetto a quelli di SID, ricompila il pacchetto nodejs sotto squeeze.

  • Aggiungi la sorgente APT di SID creando /etc/apt/sources.list.d/sid.list (usa il tuo mirror più vicino):
deb http://ftp.us.debian.org/debian/ sid main
deb-src http://ftp.us.debian.org/debian/ sid main
  • Configura il pinning APT creando /etc/apt/preferences.d/sid:
Package: *
Pin: release a=unstable
Pin-Priority: 50
  • Installa manualmente l’ultima versione di libv8, libv8-3.8.9.20 al momento di questo articolo:
apt-get install libv8-3.8.9.20
  • Scarica i sorgenti del pacchetto nodejs, le dipendenze e compilali:
cd
apt-get source nodejs
apt-get build-dep nodejs
cd nodejs-*
debuild -nc -uc
  • Se incontri errori di dipendenze di build, dovresti provare prima ad abbassare la dipendenza in debian/control, sia in Build-Depends che in Depends, e rieseguire debuild. Se la compilazione fallisce (ad es. con undefined reference to 'ev_run') la versione precedente non ha le funzioni richieste. Quindi, devi installare le versioni aggiornate delle dipendenze necessarie (ad es. libev4) da sid, usando apt-get install nome=versione ad es. libev4=1:4.11-1. Lo suggerisco perché dovrai aggiornare manualmente i pacchetti installati da sid, quindi meno sono, meglio è.

  • Installa il pacchetto generato

dpkg -i nodejs_*.deb nodejs-dev*.deb
  • Profit :-)
📜

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

🔍
Retrospettiva 2026
Da Linux 4.11 (2017), sysctl net.ipv4.ip_unprivileged_port_start=0 permette a qualsiasi utente di fare il bind sulle porte basse senza capabilities — niente setcap. Inoltre, il web server Thin mostrato qui è obsoleto da quando Puma è diventato il server Rails di default in Rails 5 (2016). E se usi Docker, niente di tutto questo conta comunque.

Neo Tux

Quindi hai una VM Linux che usi per lo sviluppo, perché vuoi replicare l’ambiente di produzione il più fedelmente possibile. Hai molte applicazioni da gestire, devono girare tutte contemporaneamente perché sono dei bei web service REST JSON.

Sei stanchissimo di ricordarti quale hai messo sulla porta 8081, e i tuoi file di configurazione stanno diventando un vero casino. Quindi configuri degli alias per gli indirizzi IP sull’interfaccia di rete e decidi di assegnare persino dei nomi host — /etc/hosts va benissimo — per ogni applicazione.

Poi, in una configurazione del genere, perché dovresti ancora farle girare su porte superiori a 1024? Non sarebbe fantastico digitare il nome dell’applicazione nella barra degli indirizzi del browser? Sì che lo sarebbe, ma è meglio non farle girare come root, comunque.

La soluzione sono le Linux capabilities (vedi anche qui). Quella che ci interessa è cap_net_bind_service: dà a un processo il diritto di fare il bind su porte well-known (< 1024). Se usi un linguaggio interpretato, ovviamente dovrai aggiungere la capability all’interprete stesso. Ecco perché c’è sviluppo nel titolo di questo articolo — non dovresti configurare questo su un server di produzione, se non sai cosa stai facendo.

PH-Neutral 0x7db

📜

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

🔍
Retrospettiva 2026
PH-Neutral è stata l’ultima edizione — fedele al motto sul badge, “if it is good, they stop making it.” Phenoelit si è sciolta poco dopo. Molte delle tecniche di attacco descritte qui (bypass ASLR, downgrade Chip & PIN, intercettazione TETRA) sono state nel frattempo patchate o mitigate, ma le lezioni di fondo sui difetti implementativi nelle tecnologie “sicure” restano senza tempo. La ricerca sull’exploitation DWARF di James Oakley e Sergey Bratus è diventata un paper fondamentale nel campo.

If it is good, they stop making it”, il payoff stampato sui laccetti della conferenza, distribuiti a ogni partecipante, insieme a un badge über-l33t personalizzato con il nostro nickname e l'hash della chiave.

Essendo la mia prima esperienza a una conferenza di sicurezza internazionale (sono stato solo al camp ccc2k+7), ed essendo un outsider di ph dato che non avevo mai partecipato alle edizioni precedenti, il keynote di apertura tenuto da FX, staffer e frontman, è stato illuminante: “you ought to be here!”, ha urlato indicando il palco, indossando una camicia bianca col logo Phenoelit stampato su entrambe le maniche.

“Questa conferenza non è mai iniziata in orario”, ha continuato, “quindi non c'era motivo di farlo per quest'ultima”. Il programma è lineare: festa, il giorno dopo talk dalle 12:00 alle 19:30, poi festa, e l'ultimo giorno talk dalle 12:00 alle 17:30. Decisamente un setup che si sposa bene con l'alcol disponibile :-D.

Roma RSC 2011

📜

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

🔍
Retrospettiva 2026
RVM esiste ancora ma la maggior parte dei Rubyisti è passata a rbenv, asdf o mise per la gestione delle versioni. I meetup del Ruby Social Club si sono spenti, ma la community Ruby italiana vive attraverso il RubyDay e vari gruppi locali.

Grazie agli sforzi di @jodosha e sulla scia del vecchio evento Javaday, ora ribattezzato codemotion che ha portato a Roma tanti sviluppatori Ruby da Milano, Padova e altre parti d’Italia — il primo Ruby Social Club ufficiale a Roma è stato un gran successo. Ovviamente, l’ufficialità si misura solo nella quantità di spam su Twitter postato a riguardo! :-): i precedenti RSC a Roma risalgono al 2006 organizzati dagli attuali membri di mikamai e altri meetup promossi da @jeko nel 2007.

Quello che conta è che c’è una community, c’è passione, e c’è voglia di condividere conoscenza — non importa chi organizza gli incontri, l’importante è che si facciano :-).

L’evento è stato semplice e diretto — prima qualche birra, poi la mia presentazione su RVM e gli interpreti Ruby, poi quella di Luca che ha annunciato il suo progetto minege.ms e dopo il vero social networking :-). Ho rivisto @gravityblast dopo tanto che non ci vedevamo, ho conosciuto il gruppo PIP e ho incontrato @svarione, @punkmanit, @leonardoperna, @riggasconi, @ogeidix e altre persone in gamba. Inoltre, abbiamo passato del gran bel tempo insieme, mettendo su un weekend davvero sgangherato e divertente. Ovviamente, enormi kudos alla macchina di @nhaima — che ci ha instancabilmente portato in giro per Roma per due giorni :-)

Ora, in attesa del prossimo meetup, grazie a tutti quelli che hanno partecipato, che mi hanno offerto birre e, ultimo ma non meno importante, grazie a @etapeta per avermi portato in tempo all’incontro — sei il vero eroe :-).

*BSD su un MacMini 4,1? Neanche per sogno. :-(

📜

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

🔍
Retrospettiva 2026
Buone notizie: FreeBSD supporta pienamente l’hardware del MacMini 4,1 (NV MCP89 SATA, BCM57762 NIC) da FreeBSD 9.x (2012). Anche NetBSD e OpenBSD hanno aggiunto il supporto. Il “neanche per sogno” nel titolo non è invecchiato bene — i BSD girano tranquillamente su questa macchina ormai.

Ho passato gli ultimi due giorni a cercare di configurare il Mac Mini in alluminio (rev. 4,1) come NAS server casalingo con storage crittografato, e volevo metterci un sistema BSD. C'è già un OpenBSD embedded sul gateway soekris, e un compagno sarebbe stato carino. :-)

Indovinate un po', non c'è verso:

  • FreeBSD 8.1 non completa il processo di boot, a causa di un bug nel chipset SATA, NV MCP89;
  • FreeBSD 8.2-RC1 fa il boot ma, a causa dello stesso bug, non riconosce nessun drive SATA né nessun dispositivo USB umass;
  • NetBSD 5.1 fa il boot senza problemi, gestisce i dischi SATA tramite il driver generico pciide (niente DMA, quindi piuttosto lento) ma, sfortunatamente, non gestisce il controller ethernet BCM57762. Ho provato con patch veloci e sporche per portare il driver bge al livello di -current, ma niente da fare: il MII link detection funziona, la scheda trasmette ma non riceve. Anche il controller sdmmc funziona con -current ma non con la 5.1-RELEASE. L'ACPI funziona correttamente;
  • OpenBSD 4.8 fa il boot, accede ai drive SATA senza DMA, e riconosce la scheda di rete bge, ma mostra lo stesso identico comportamento di NetBSD 5.1 col driver di -current;
  • DragonFlyBSD 2.8.2 non entra nemmeno in kernel mode, sospetto a causa di bug ACPI;
  • PureDarwin non mi ha ispirato granché, a causa dei tanti problemi bloccanti.

Tutti supportano lo storage crittografato, ho tirato su un disco NetBSD CGD senza problemi su dk wedge; FreeBSD ha gli interessanti strumenti gbde(8) e geli(8) basati su GEOM che non ho potuto testare, mentre OpenBSD supporta la crittografia tramite una personality softraid. Purtroppo, il supporto per l'hardware Apple, ormai esotico, è fuori discussione.

📜

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

🔍
Retrospettiva 2026
Per il quadro generale — perché Myousica era in anticipo sui tempi e chi lo fa oggi — vedi la retrospettiva del 2026.

Questo è il terzo e ultimo post della serie Myousica. Il primo copriva la piattaforma Rails, il secondo l’editor multitraccia Flash. Questo copre come l’audio arriva effettivamente dal microfono dell’utente a un MP3 riproducibile — la pipeline che collega tutti i servizi insieme.

L’uploader è un’applicazione Rails 2.2 separata — headless, niente database, niente ActiveRecord. Solo controller, worker in background e strumenti di elaborazione audio. Andrea Franz ha costruito la versione iniziale ad aprile 2008, io ho preso in mano da maggio 2008 in poi. 120 commit, originariamente chiamato multitrack_server prima di essere rinominato in mewsic-uploader a marzo 2009.

La pipeline completa

Ecco il flusso completo dal microfono alla traccia riproducibile:

graph TD MIC["Microfono"] -->|RTMP| RED5["Red5 Media Server"] RED5 -->|FLV| DISK["Disco (spool)"] FLASH["Client Flash"] -->|"stop registrazione"| UC["UploadController"] FLASH -->|"upload MP3"| UC UC --> BG["Worker BackgrounDRb"] BG -.->|legge FLV| DISK BG --> FLV{"Input FLV?"} FLV -->|sì| WAV1["ffmpeg: FLV → WAV"] FLV -->|no| ANALYZE WAV1 --> ANALYZE["sox: analisi volume"] ANALYZE --> NORM["sox: normalizza al 90%"] NORM --> ENCODE["ffmpeg: WAV → MP3"] ENCODE --> WAVE["wav2png: waveform PNG"] WAVE --> CALLBACK["Callback HTTP a Rails"]

Due punti di ingresso: l’utente può caricare un file MP3 direttamente, oppure registrare via microfono (che produce uno stream FLV attraverso Red5). Entrambi finiscono come un MP3 con un PNG della forma d’onda.

📜

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

🔍
Retrospettiva 2026
Per il quadro generale — perché Myousica era in anticipo sui tempi e chi lo fa oggi — vedi la retrospettiva del 2026.

Questo è il secondo post della serie Myousica. Il primo copriva la piattaforma Rails. Questo si immerge nell’editor multitraccia — il componente Flash/Flex dove gli utenti mixano effettivamente la musica nel browser.

Il multitraccia è stato inizialmente sviluppato da Vaclav Vancura, che ha costruito l’architettura originale, la libreria di componenti UI e il motore di riproduzione audio. Poi ho preso in mano io e l’ho ricablato pesantemente — integrando la registrazione, l’upload, i servizi backend e la macchina a stati che tiene tutto insieme. 81 file ActionScript, ~7.300 righe di codice, 129 commit.

Ecco lo screenshot originale di Vaclav che mostra la vista remix — dove le canzoni si collegano e si ramificano in nuovi remix:

Vista remix di Myousica — canzoni che si ramificano in remix

Cosa fa

L’editor si carica nel browser come SWF Flash. Si può:

  • Caricare fino a 16 tracce audio simultaneamente
  • Riprodurle tutte in sincrono con un unico controllo di trasporto
  • Regolare volume e bilanciamento per ogni singola traccia
  • Registrare la propria traccia dal microfono, sincronizzata con la riproduzione
  • Vedere le forme d’onda di ogni traccia
  • Cercare tracce da aggiungere al mix (via API Rails)
  • Salvare e pubblicare il risultato

Tutto questo avviene lato client in Flash Player 9, con il lavoro pesante (encoding, storage) delegato ai servizi backend.


In questa pagina