📜

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.

📜

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.

Mewsic

Dal video promozionale di Myousica — la band animata

Oggi rilasciamo il codice sorgente di Myousica — la piattaforma collaborativa per il remixaggio musicale che stiamo costruendo dalla fine del 2007. Abbiamo lanciato a settembre 2008 dopo 9 mesi di sviluppo, l’abbiamo tenuta in piedi per circa 5 mesi, e abbiamo messo il sito in pausa a febbraio 2009. Il progetto è stato ribattezzato Mewsic lungo il percorso, ma l’idea è la stessa. Piuttosto che lasciare il codice a marcire su un server privato, lo mettiamo tutto su GitHub. Cronologia completa, difetti inclusi.

Questo è il primo di tre post che esplorano il codice. Questo copre l’applicazione Rails principale — la piattaforma vera e propria. I prossimi due copriranno l’editor multitraccia Flash e la pipeline di elaborazione audio.

L’idea

Il pitch è semplice: io carico una traccia di basso di Let It Be, tu carichi la tua voce, qualcun altro aggiunge chitarra e batteria. Attraverso Myousica, c’è un editor multitraccia che gira nel browser dove puoi mixare tutto insieme, regolare i volumi e pubblicare il risultato. Altre persone possono poi prendere il tuo remix, aggiungere le proprie tracce e remixare il remix.

📜

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

Una barra di ricerca con nastri di autocompletamento che si collegano a monumenti del mondo su un globo stilizzato

Per curiosità, stavo guardando come un browser interagisce col backend di Google Instant. Mentre osservavo gli scambi HTTP con Firebug, prima mi sono chiesto perché codificano HTML e JS con sequenze di escape \xYY, poi perché le stessissime funzioni JS vengono mandate avanti e indietro ad ogni richiesta, e poi mi sono imbattuto nel servizio JSONp google.com/s?q=QUERY.

Dagli una query, e ti restituirà le frasi suggerite correlate che vengono usate per costruire il menu sotto la barra di ricerca quando usi i suggerimenti e/o Instant (non ho scavato troppo in tutti gli altri parametri).

Ad ogni modo, la cosa interessante è che, ovviamente, i suggerimenti sono personalizzati per paese. Per mostrare le differenze in modo esplicito, chiediamo al servizio la query più semplice possibile, a:

Per l’Italia otterrai:

$ curl http://www.google.it/s?q=a
window.google.ac.h(["a",[["ansa","","0"],
["alice","","1"],["alitalia","","2"],["alice mail","","3"],
["apple","","4"],["agenzia delle entrate","","5"],
["audi","","6"],["aci","","7"],["autoscout","","8"],
["atm","","9"]],"","","","","",{}])

hmm, togliamo il JSONp e i parametri:

$ curl -s http://www.google.it/s?q=a | ruby -rjson -ne 'puts JSON($_[19..-2])[1].map(&:first).join(", ")'            
ansa, alice, alitalia, alice mail, apple, agenzia delle entrate, audi, aci, autoscout, atm

Per gli USA otterrai:

amazon, aol, att, apple, american airlines, abc, ask.com, amtrak, addicting games, aim

Regno Unito:

argos, amazon, asda, asos, autotrader, aa route planner, aol, apple, amazon uk, aqa

Irlanda:

📜

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

🔍
Retrospettiva 2026
Panmind non esiste più. Le repo GitHub esistono ancora come reperti storici, ma l’ecosistema di plugin Rails descritto qui è stato sostituito da gem e engine da un pezzo. Per la storia più profonda dell’architettura — il framework SPA, la pipeline di analytics, la condivisione di sessioni cross-linguaggio — vedi la retrospettiva del 2026.

Il 22 luglio 2010, Mikamai ha ospitato un Ruby Social Club a Milano, dove circa 50 persone hanno assistito a cinque talk su Ruby, sviluppo web e startup. Sono stato contento di essere uno degli speaker, e ho presentato un insieme di plugin Rails che noi abbiamo estratto dal nostro ultimo (e più grande) progetto: Panmind (leggi di più nella pagina about), rilasciati come Open Source su GitHub.

La presentazione è divisa in due parti: la prima spiega perché dovresti seguire il sano principio di ingegneria del software di scrivere codice modulare e a responsabilità separate, e poi come potresti (e dovresti) estrarlo dalla tua applicazione Rails disaccoppiando la configurazione e preparando il rilascio Open Source, scrivendo documentazione E presentando a un evento Ruby così, si spera, qualcun altro scriverà i test unitari! :-)

Abbiamo rilasciato un plugin SSL helper che implementa dei filtri (come ssl_requirement di Rails) ma anche degli helper per le named route: basta con <%= url_for :protocol => 'https' %>! Avrai qualcosa come plain_root_url e ssl_login_url — come se fossero integrati nel framework.

Poi, un plugin semplicissimo per Google Analytics, con supporto <noscript>, un paio di helper per i test e un embrione di framework JS per Analytics — si spera che evolva in un plugin jQuery completo. Poi, un’interfaccia ReCaptcha, con supporto alla validazione AJAX, e infine un’interfaccia Zendesk per Rails.


In questa pagina