sindro.me

feeling bold
on the internet

info 🇬🇧🇮🇹

Il vero sistemista

- 1 min di lettura

Car repair

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

Installare node.js via APT su Debian Squeeze

- 1 min di lettura

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 :-)

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.

Un’ultima stranezza: se ti capita di fare dlopen() su shared object che linkano dinamicamente verso librerie fuori dai path canonici, non puoi caricarli tramite LD_LIBRARY_PATH (ad es. il SYBASE.sh) perché viene ignorato per i processi con setcap. Meglio spostare i path delle librerie in uno snippet dentro /etc/ld.so.conf.d.

tl;dr

Assumendo che tu sia l’ultimo e più grande sviluppatore Rails, dovresti diventare root — o usare sudo, come preferisci — e

PH-Neutral 0x7db

- 15 min di lettura

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.

Subito dopo, un altro speaker ci ha informato che le chiavi di accesso wifi ricevute alla registrazione ci permettono di usare una bestia con 6 AP/3 repeater pilotata da un box OpenBSD — vogliono che il pubblico la hacki perché, beh, “you are the Worst Case Scenario.” :-)

Poi è stato presentato il divertente video Hacker Hacker:

:-D

Dopo una prima serata fiacca e non troppo entusiasmante (per la stanchezza), vedremo cosa porta il giorno dopo.

Sniffjoke – un toolkit per eludere gli sniffer

Gli sniffer ad alta capacità usati nelle grandi aziende e sui gateway di frontiera nazionali che raccolgono traffico generato dagli utenti per trovare pattern potenzialmente “criminali” sono oggi generalmente disponibili per larghezze di banda fino a 10Gbps, e presto ci saranno appliance che elaboreranno flussi da 100Gbps. Sniffjoke, di vecna e evilaliv3, è uno strumento che può iniettare nelle connessioni TCP pacchetti estranei che ingannano lo sniffer intercettante ma senza effetti significativi sul destinatario. Questi pacchetti, per esempio, fanno credere allo sniffer che la connessione sia stata resettata anche se non è vero — iniettando un RST con checksum errato o un pacchetto con TTL inferiore di 1 rispetto al conteggio degli hop — oppure cercano di consumare la sua potenza di calcolo usando interpretazioni vendor-specific note del TCP RFC. Dettagli: sito web, slide, thread su Wireshark.

Roma RSC 2011

- 2 min di lettura

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 :-).

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.

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:

aer lingus, aib, argos, amazon.co.uk, argos.ie, asos, aa route planner, amazon, aldi, aib internet banking

Infine, perché ci sono stato di recente ed è stata un’esperienza profonda, Cuba:

asus, antonio maceo, amor, amigos, ain, antivirus, avira, alba, aduana, as

Sono sicuro che @nhaima sta sorridendo nel vedere queste parole, perché caspita, laggiù cercano davvero un sacco software antivirus (avira è uno di quelli) perché è un mondo senza Internet, quindi senza software libero: sei condannato a usare roba Windows, e hai quello per cui paghi. Antonio Maceo è stato un eroe della rivoluzione del XIX secolo, ed è nel cuore del popolo cubano. Amor, Amigos! :-)

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.

Abbiamo rilasciato anche altro codice sull’account GitHub di Panmind, incluso il bel AJAX Navigation Framework che implementa tutto il codice boilerplate per la navigazione AJAX ultra-veloce dei contenuti e dei progetti di Panmind.

La presentazione segue: puoi scaricarla in PDF (nessun exploit, lo giuro!) da questo link o visualizzarla/commentarla su Slideshare qui.