Wednesday, February 24, 2010

Simple Mathematics

Let us consider now some simple mathematics.
We all want to find some easy way to remember formulae. So what we usually do is to "logically link" those hard formulae to something simpler, that our mind can easily remember.

This is not the case, when you are talking to an engineer.

In fact, consider the simple equality:

$\Large 1+1=2$

Every engineer should learn, since its early age, to refactor it in a more professional fashion.
In fact, taking into account calculus and trigonometry, we all know that $1 = \ln(e)$ and that $1 = \sin^2(\vartheta) + \cos^2(\vartheta)$. Further, remember that

$\large 2 = \sum\limits_{n=0}^\infty \left( \frac{1}{2} \right)^n$

So the equality can be rewritten as:

$\large \ln(e) + \sin^2(\vartheta) + \cos^2(\vartheta) = \sum\limits_{n=0}^\infty \left( \frac{1}{2} \right)^n$

Let us now consider hyperbolic functions. Remember that $1 = \cosh(\vartheta) * \sqrt{1 - \tanh^2(\vartheta)}$.
Again, from calculus we know that:

$\large e = \lim_{z\to0}\left(1+\frac{1}{z}\right)$

So, our equality can be rewritten as:

$\small \ln\left(\lim\limits_{z\to0} \left(1+\frac{1}{z}\right)\right) + \sin^2(\vartheta) + \cos^2(\vartheta) = \sum\limits_{n=0}^\infty \frac{\cosh(\vartheta) * \sqrt{1 - \tanh^2(\vartheta)}}{2^n}$

Consider now that $0! = 1$. Further, remember that the inverse matrix of a transposed matrix is equal to the transposed matrix of the inverse. Then, in a one-dimensional geometric space, we have that:

$(\bar{x}^T)^{-1} - (\bar{x}^{-1})^T$

Then, combining we get:

$\large \left[ (\bar{x}^T)^{-1} - (\bar{x}^{-1})^T \right]! = 1$

Thus, inserting this into the previous equality, we get:

$\ln\left(\lim\limits_{z\to0}\left( ((\bar{x}^T)^{-1} - (\bar{x}^{-1})^T) ! +\frac{1}{z}\right)\right) + \sin^2(\vartheta) + \cos^2(\vartheta) = $
$ = \sum\limits_{n=0}^\infty \frac{\cosh(\vartheta) * \sqrt{1 - \tanh^2(\vartheta)}}{2^n}$

Which is a de-facto simpler way for an engineer to remember some simple mathematics such as $1+1=2$.

Wednesday, February 17, 2010

Come scrivere codice incomprensibile

Non attribuire alla malizia ciò che può essere spiegato con l'incompetenza.
- Napoleone -

Nell'interesse di creare opportunità di assunzione nel campo della programmazione, comincio a pubblicare oggi una serie di consigli su come scrivere del codice che risulti talmente difficile da gestire che le persone che prenderanno il posto dopo di voi impiegheranno anni per fare persino le modifiche più semplici. Inoltre, se seguirete queste regole rigorosamente, vi assicurerete un lavoro per tutta la vita, dal momento che nessuno tranne voi avrà una minima speranza di gestire il codice. E forse, se avrete seguito le regole in modo religioso, nemmeno voi sarete più in grado di farlo!!!

Ovviamente non bisogna abusarne: il codice non dovrà sembrare senza speranze, ma lo dovrà essere e basta. Altrimenti ci potrebbe essere il rischio che venga riscritto o risistemato.

Quidquid latine dictum sit, altum sonatur.
- Tutto quello che viene detto in latino, sembra importante -

Per giocare dei buoni tiri al programmatore che deve modificare il vostro codice, dovete capire come ragiona. Ha davanti a sé il vostro enorme programma. Non ha tempo per leggerlo tutto, tanto meno per capirlo. Vuole trovare rapidamente il punto in cui fare la modifica, effettuarla, farlo girare e non trovare alcun effetto collaterale causato dalla modifica.

Vede il vostro codice attraverso un tubo di cartone della carta igienica: riesce a vedere soltanto un piccolissimo pezzetto di programma per volta. Quello di cui volete essere sicuri è che non riesca mai a tirar fuori l'immagine completa, muovendosi in questo modo. Volete far sì che gli risulti il più difficile possibile trovare il codice che sta cercando. Ma ancor più importante, volete togliergli a tutti i costi la possibilità di ignorare qualcosa che avete scritto.

I programmatori sono cullati nel compiacimento dalle convenzioni. Ogni tanto, violando subdolamente le convenzioni, lo obbligherete a leggere ogni singola riga del vostro codice con la lente di ingrandimento.

Forse vi siete già fatti l'idea che ogni caratteristica di ogni linguaggio può rendere il codice ingestibile. Non è così: soltanto se male utilizzata a dovere.



E quindi, cominciamo questa serie di consigli con qualcosa di concreto. I compilatori del C trasformano la sintassi di accesso ad elementi degli array in un modo che può essere facilmente utilizzato per far lacrimare gli occhi di qualsiasi programmatore che sta leggendo il vostro codice. In particolare, vale questa relazione:
  • myArray[i], viene trasformato in
  • *(myArray + i), che è equivalente a
  • *(i + myArray), che a sua volta è equivalente a
  • i[myArray].
I più esperti avranno già mille idee su come utilizzare questa tecnica in modo appropriato. Per camuffare le cose ancora di più, si può generare l'indice tramite una funzione:

int myfunc(int q, int p) {
return p%q;
}
...
myfunc(6291, 8)[Array];

Che, ovviamente, corrisponde ad un semplicissimo:
Array[8];
Ma... quanto tempo in più ci vuole per capirlo?

Wednesday, February 3, 2010

Fortunato di essere un programmatore

Nelle scorse settimane, ho lavorato ad un progetto che richiedeva ogni tipo di sforzo di programmazione. Ora è arrivato a un buon punto, quindi posso quasi ritornare agli impegni normali, ma quando la gente mi sente parlare delle "ore di pazzia" che ho passato, spesso dice che le dispiace. Non dovrebbe. Non lo farei mai spesso, o per lunghi periodi, o senza un compenso adatto se lo facessi per lavoro, ma la verità è che questi "concentrati di programmazione" sono alcuni tra i periodi che preferisco nella mia vita. Sotto le giuste condizioni, scrivere software provoca piacere talmente intenso che dovrebbe essere reso illegale.

Molti programmatori ci si ritrovano, ma altri restano sorpresi quando lo sentono. Credo che sia perché le istituzioni sono brave a spremere via il divertimento da ogni cosa. Fa impallidire, ad esempio, come le scuole possano prendere gli argomenti più vivaci e sfigurarli in mediocri e ripetitive "sgobbate". Ed è così anche per la programmazione. Molto spesso si trasforma un'esperienza naturalmente gratificante in qualcosa che la gente può a malapena sopportare, in cambio di un voto o di un assegno.

Che peccato. Sono poche le cose migliori di passare del tempo in uno stato creativo, consumati dalle idee, osservando il proprio lavoro venire alla luce, andando a letto tardi, desiderosi di alzarzi presto per andare a vedere se le cose funzionano. Non voglio dire che un numero di ore eccessivo è necessario o consigliabile, dei ritmi sani sono un dovere, ma facendo eccezione per "brevi" periodi intensi. Il fatto è che programmare è un intenso piacere creativo, un miscuglio perfetto di rompicapi, scrittura ed artigianato.

La programmazione offre sfide intriganti ed ampio spazio per l'inventiva. Alcuni problemi sono di tipo investigativo e di riduzione: perché questo codice gira lento? Cosa diamine sta causando questo bug? Altri sono di tipo costruttivo, come progettare un algoritmo o un'architettura. Sono entrambi una delizia, se si ama il lavoro analitico, immersi in un mondo pieno di "bestie" come il malware, i router, le cache, i protocolli, i database, i grafi, le codifiche, le rappresentazioni di dati ed i numeri.

Questo lato analitico è quello che viene associato, dalla maggior parte delle persone, alla programmazione. La rende interessante, come un complesso gioco di strategia. Ma nella maggior parte del software la prima sfida è la comunicazione: con gli "amici programmatori" attraverso il codice, con gli utenti attraverso le interfacce. Con poche eccezioni, scrivere codice è un esperimento piuttosto che un rompicapo. È dare forma alle proprie idee e ai propri schemi in un corpo coerente; è andare alla ricerca della chiarezza, della semplicità e della sintesi. Sia il codice sia le interfacce abbondano della semplice gioia della creazione.

Un'altra fonte di piacere è che, sotto alcune circostanze, dalla programmazione sorge la bellezza. Potranno sembrare cazzate, ma è la verità: quel tipo di cose che rendono una giornata migliore. Prendiamo per esempio la dimostrazione di due righe, di Euclide, che i numeri primi sono infiniti. Credo che molti la troverebbero bella, un risultato così succinto ed affascinante. Questa è la bellezza della matematica, fredda e austera, e questa stessa bellezza pervade il software. È insita in algoritmi intelligenti come il quicksort, nei sorgenti dei kernel e dei compilatori, in eleganti exploit e nei trucchi che ci inventiamo per risolvere i problemi di ogni giorno. Quando si osservano queste soluzioni, siano esse algoritmi famosi o trucchi di tutti i giorni, si sorride e si esclama "geniale!", e uno si sente bene. Il nobile ragionamento!

Nei programmi esiste anche una bellezza non matematica, analoga all'eloquenza nei discorsi. È presente nel software ben congegnato, che fa molto con poco codice, in metodi brevi e frizzanti, in architetture ben fatte. Alcuni linguaggi rendono tutto ciò difficile da fare, e non tutti i programmatori ne sono in grado, ma è un piacere leggere e lavorare su questo tipo di codice. Se si lavora con un linguaggio espressivo o su del codice che piace, spesso sembra che le cose si illuminino.

Ora, per quanto riguarda l'artigianato: in un certo senso il software è astratto. Dov'è che esiste il comportamento di un programma se non nella nostra mente? Tuttavia, si dice che il software viene costruito (built) per un motivo ben preciso: ai programmi viene data una forma, funzionalità per funzionalità, le architetture nascono come impalcature e poi crescono, le interfacce vengono assemblate, i bug vengono corretti ed i punti critici vengono ottimizzati per far sì che le cose girino più velocemente. Il software dà un profondo e soddisfacente "senso di manufatto". Le cose vengono costruite, a partire da idee pure, e poi le si osservano risolvere problemi reali, permettendo alle persone di stare un po' meglio. O molto meglio, in certi casi.

Ad esempio, la biologia. Dopo circa 400 anni di rivoluzione scientifica, la biologia non è stata in grado di svilupparsi riguardo a problemi cruciali come cure efficaci per infezioni virali o il cancro. Alcuni dei progressi migliori, come gli antibiotici, sono dovuti al caso oppure ad esperimenti casuali. Si avvia una sperimentazione clinica su un farmaco per l'ipertensione ed all'improvviso... Wow! Tutti i soggetti hanno un'erezione. E così è nato il Viagra. Sicuramente il caso gioca un ruolo fondamentale in ogni progetto di ricerca, ma se la fisica e la chimica hanno delle basi teoriche corpose, la biologia è stata confinata nell'ambito delle soluzioni improvvisate. Si vuole trattare il cancro? Ecco, bombardiamo il paziente con radiazioni e veleni, magari il cancro muore per primo! Sono soluzioni improvvisate anche brillanti, e sono contento che ci siano, ma non è nemmeno lontanamente paragonabile alla precisione che abbiamo in altri campi.

Il software sta cambiando questa situazione. Soltanto 50 anni fa fu scoperta la forma del DNA, ma ora chiunque può cercare su Internet e scaricare centinaia di sequenze complete di genomi. Oppure consultare centinaia di geni (il DLEC1 per fare un esempio preso a caso), completi di sequenze di nucleotidi, sequenze di amminoacidi per le proteine, bibliografia che tratta del gene, basta chiedere! Oppure cercare in database enormi di geni e proteine, fornendo come chiavi sequenze di nucleotidi o amminoacidi, magari dopo averle tirate fuori da qualche strumento ancora più economico, ottenendo un rapporto completo sui risultati. E non importa se le informazioni sono tutte esatte, perché l'algoritmo in BLAST, lo strumento standard di ricerca delle sequenze, tira fuori risultati parziali da database, ordinandoli per importanza. Questi avanzamenti permetteranno alla medicina di tirare fuori risultati enormi. La biologia sta per entrare in una nuova era, come la fisica del XVIII secolo, spinta in avanti dal software.

Sì, senz'altro, i biologi hanno un ruolo minore (:P), ma noi ne abbiamo uno importante nel permettere sviluppi maggiori nella scienza, nella cultura e nell'economia. Quando un bambino del terzo mondo consulta una pagina di Wikipedia, è anche merito dei programmatori! Siamo noi ad aver scritto le RFC, gli stack delle reti, i browser, MediWiki, i sistemi operativi, ed i server HTTP. Senza contare un gran numero delle pagine di Wikipedia stessa. L'influenza dei programmatori va oltre i bit e i byte: è stato un programmatore ad aver inventato i wiki, e la comunità degli informatici ha dato il via ai blog. Henry Mencken ha giustamente fatto notare che "la libertà di stampa è limitata a chi possiede una testata". È un peccato che ora non sia qui attorno ad osservare le nostre creazioni che rompono l'opprimente conformismo ed il servilismo sociale del giornalismo professionale. Con meno stile, ma con grandi benefici, si può dire che le applicazioni hanno portato crescenti guadagni in termini di produttività alle economie. E questi sono solo pochi esempi, da una possibile lunga lista.

Negli ultimi tre anni di università, molte esperienze mi hanno fatto pensare male dei computer e di quello che c'è attorno ad essi, ogni tanto (raramente!) facendomi anche passare la voglia di proseguire su questa strada. Ora sono contento di averci sbattuto la testa e di aver raggiunto un buon livello nella scrittura del software. Anche se probabilmente mamma pensa ancora che io scriva cose senza senso, ma vabbè, che ci posso fare! :)

Se vi trovate in una situazione che sta per uccidere la vostra innata passione per la tecnologia, senza ombra di dubbio, smuovetevi! Non fissatevi, mentre la vostra passione si affievolisce. È difficile trovare in giro gente motivata, in qualunque ambito! Per tutti quelli che pensano che programmare possa essere una cosa interessante, a livello economico i guadagni non saranno necessariamente alti. Ma credo che sia una delle carriere giuste. Non è soltanto per le prospettive di lavoro fighe che uno può avere, ma è perché, dal momento che il ruolo del software nella società cresce, si potranno vedere molti più benefici per le persone. Sono felice di essere in gioco, perché così posso cercare costantemente di migliorare la mia arte e la mia tecnica per un ideale.

Tuesday, February 2, 2010

Con l'amore...



Manifesto Hacker

Riflettendoci bene, ho deciso che una delle prime cose che occorre apprendere, nel lento cammino verso la nerdizzazione, è cosa significhi il termine hacker.
Tutti l'abbiamo sentito pronunciare, almeno una volta. Ma sempre con le più svariate accezioni. Quindi l'hacker è quel ladruncol che buca i server delle banche per rubare soldi, l'hacker è quel maledetto che programma i virus che ogni giorno impallano i nostri computer, l'hacker sei anche tu quando installi la tua copia di Word of Warcraft pirata.

Ebbene no, hacker significa qualcosa di più. Ma eviterò di definirne io il suo significato corretto. Sfrutterò piuttosto un testo ormai diventato famoso, scritto in un carcere nel lontano 1986 da un hacker in persona e pubblicato sulla famosa rivista Phrack.
Quella che pubblico di seguito è una mia traduzione.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Quello che segue è stato scritto poco dopo il mio arresto...

\/\ La Coscienza di un Hacker /\/

di

+++ The Mentor +++

Scritto l'8 gennaio 1986
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Un altro è stato catturato oggi, è su tutti i giornali. "Adolescente Arrestato in uno Scandalo di Crimini Informatici", "Hacker Arrestato dopo aver manomesso una Banca"...
Maledetti ragazzi. Sono tutti uguali.

Ma hai mai provato, dall'alto delle tue tre lauree in psicologia e del
tuo tecnocervello anni '50, a dare uno sguardo oltre gli occhi di un hacker? Ti sei mai chiesto cosa lo ha risvegliato, quali forze lo hanno plasmato, cosa lo ha forgiato?
Io sono un hacker, entra nel mio mondo...

Il mio è un mondo che incomincia a scuola... Sono più intelligente
della maggior parte degli altri bambini, questa merda che ci insegnano mi annoia...
Maledetto sfaticato. Sono tutti uguali.


Sono alle medie o al liceo. Ho sentito gli insegnanti spiegare per la
quindicesima volta come semplificare una frazione. L'ho capito. "No, professoressa, non l'ho scritto sul compito. L'ho fatto a mente..."
Maledetto ragazzo. Sicuramente ha copiato. Sono tutti uguali.


Ho fatto una scoperta oggi. Ho trovato un computer. Aspetta un attimo, è forte! Fa quello che voglio io. Se fa un errore, è perché sono io che ho incasinato tutto. Non perché non gli sto simpatico...
O perché si sente minacciato da me...
O perché pensa che io sono più intelligente...
O perché non gli piace insegnare e non dovrebbe essere qui...
Maledetto ragazzo. Passa tutto il tempo a giocare. Sono tutti uguali.

E poi è successo... una porta si è aperta sul mondo... precipitandosi lungo la linea telefonica come eroina nelle vene di un drogato, un impulso elettronico viene lanciato fuori, un rifugio dalle incompetenze di tutti i giorni viene cercato... Ho trovato un forum.
"Ecco... io appartengo a questo..."
Conosco tutti qui... anche se non li ho mai incontrati, anche se non sono mai andato loro incontro, anche se magari non sentirò più nulla da loro... Vi conosco tutti...
Maledetto ragazzo. Si collega di nuovo alla linea telefonica. Sono tutti uguali...

Puoi scommetterci le palle che siamo tutti uguali... siamo stati imboccati con omogeneizzati a scuola quando chiedevamo disperatamente una bistecca... i piccoli morsi di carne che sfuggivano di tanto in tanto erano già masticati e privi di sapore. Siamo stati dominati da sadici, o ignorati dagli apatici. I pochi che avevano qualche cosa da insegnarci ci scoprivano come pupilli desiderosi, ma quei pochi erano come gocce d'acqua nel deserto.

Ora è questo il nostro mondo... il mondo dell'elettrone e dello switch, la bellezza del baud.
Usiamo un servizio che esiste già senza
pagare per una cosa che potrebbe essere straeconomica, se non fosse gestita da ingordi approfittatori, e ci chiamate criminali.
Esploriamo... e ci
chiamate criminali.
Ricerchiamo la conoscenza... e ci chiamate criminali.

Possediamo un'esistenza che prescinde dal colore della pelle, dalla
nazionalità, da pregiudizi religiosi... e ci chiamate criminali.
Costruite
bombe atomiche, dichiarate guerre, uccidete, imbrogliate, e ci mentite tentando di farci credere che è per il nostro bene, e ancora, i criminali siamo noi.

Sì, io sono un criminale.
Il mio crimine è quello della curiosità.
Il
mio crimine è quello di giudicare le persone per quello che dicono e pensano, non per l'aspetto che hanno.
Il mio crimine è quello di essere
più intelligente di te, cosa che tu non mi perdonerai mai.

Io sono un hacker, e questo è il mio manifesto. Potrai fermare questo individuo, ma non puoi fermarci tutti... d'altra parte, siamo tutti uguali.

Monday, February 1, 2010

Nuovo Virus Berlusconi

Nuovo Virus Berlusconi: ferma tutti i processi