Archivio dell'autore: gigabytes

Come vietare argomenti nulli ai parametri di una funzione

C’è una buona regola quando si sviluppa codice, soprattutto in grossi progetti, e cioè abbondare nelle asserzioni di debug. In C++ in particolare, l’header <cassert> fornisce la macro assert(), utilissima per assicurarsi a runtime che valgano sempre tutte le precondizioni, le postcondizioni e gli invarianti che si intende mantenere. Assicurare la validità di tutte le assunzioni aiuta ad evitare i bug alla radice e facilita il riutilizzo del codice. Inoltre, trattandosi di una macro, ci si può lasciar andare in controlli anche molto numerosi e/o costosi perchè nella build di release la macro non verrà espansa, avendo quindi un impatto sulle performance pari a zero.

Per quanto mi riguarda, la precondizione più frequente che mi trovo ad asserire in ogni funzione è la non-nullità dei parametri di tipo puntatore.
Stamattina mi sono accorto che il mio codice era zeppo di righe del genere:

void func(SomeType *);
 
void func(SomeType *p) {
   assert(p);
 
   p->method(); // ... codice ...
}

Se da un lato sono contento di essermi ricordato di riempire il codice di tutte queste assert, dall’altro mi sono accorto di alcuni punti negativi di questo approccio:

  • Il codice è ripetitivo e distrae dal vero contenuto della funzione
  • Non c’è traccia di queste pre-condizioni nel prototipo della funzione, ovvero l’unica cosa a cui gli utilizzatori della funzione hanno (o dovrebbero avere) accesso.

Anche se il secondo punto dovrebbe essere risolto da una buona documentazione, che comunque dovrebbe sempre esserci, penso esista un modo migliore per gestire questo caso particolare di asserzione, ovvero evitare argomenti nulli.

Non ho certo la presunzione di aver inventato una soluzione nuova. Semplicemente c’ho messo meno a implementarla che a cercarla in giro, quindi eccola qua.
Continua a leggere

Tra il dire e il fare…

Esiste un famoso detto cinese che recita più o meno così:

Dai un pesce a un uomo e lo nutrirai per un giorno.
Insegnagli a pescare e lo nutrirai per tutta la vita.

Questo detto non sembra molto conosciuto né apprezzato nella didattica della scuola italiana. Parlo ovviamente dell’insegnamento di materie tecniche e/o scientifiche. In questo contesto, nutrirsi sta per fare qualcosa, avere un pesce significa aver imparato a farlo, mentre saper pescare rappresenta la teoria che sta dietro ciò che si ha imparato.

Se si impara ciecamente una lista di istruzioni, non si è imparato in realtà nulla. Si fa un esercizio di memoria, che alla lunga diventa un esercizio di costanza per i propri riflessi incondizionati. Si è poco più di un rudimentale computer, ma molto più lenti e con tanta memoria quanto un foglio di quaderno. Se invece si impara a ragionare sul perchè delle cose, se veramente si riesce ad acquisire un metodo di ragionamento logico invece che un metodo di calcolo, allora si ha in mano un potere immenso. Chi confeziona i programmi di insegnamento delle scuole, e soprattutto la maggior parte di chi poi questi programmi li applica, non ha capito evidentemente questo fatto basilare.

Continua a leggere

Qt 5 su Raspberry Pi

Per il mio intervento all’Open Source Day 2012 ho sperimentato il funzionamento della nuova Raspberry Pi, un piccolo computer ARM a basso costo che sta spopolando tra hobbisti e appassionati per la quantità di progetti in cui si può utilizzare.
Proprio nello stesso periodo è uscita la beta1 di Qt 5, la nuova versione del framework di sviluppo multiplatform di Nokia, passato di recente definitivamente nelle mani di Digia dopo la migrazione di Nokia al mondo Windows Phone.

Questa è una breve guida passo-passo su come configurare Qt5 per sviluppare applicazioni embedded sulla Raspberry Pi.
Continua a leggere

Ubuntu 12.04 su MacBook Pro 13″ Mid-2009

Questo non è un tutorial, o una guida… si tratta più che altro di una breve testimonianza.

Per poter fare dei test con Qt 5 sulla mia nuova Raspberry Pi (di cui parlerò sicuramente in futuro), ho avuto bisogno di installare un sistema linux. Dopo brevi prove, avevo capito che le macchine virtuali non fanno per me, così decisi di provare il multiboot, installando Ubuntu assieme a OS X 10.8 e Windows 7.
Il mio MacBook Pro è il 13″ uscito a giugno del 2009, per essere precisi il modello è il “MacBookPro5,5″

All’inizio provai ovviamente l’ultima versione, ovvero la 12.10, ma ebbi parecchi problemi riguardo EFI (il firmware, sostituzione del vecchio BIOS, che si trova sui Mac e su PC recenti).
La 12.04 invece si è rivelata più affidabile, come del resto era previsto, essendo una versione LTS (Long Term Support).

Ricapitolando, tanto per esser chiari:
Ubuntu 12.04 funziona out-of-the-box
Ubuntu 12.10 non funziona
Almeno per quanto riguarda il mio modello…

Ecco le cose che vale la pena notare:

  • Con mia somma sorpresa, il supporto hardware è, per il mio modello, perfetto, e lo è stato out-of-the-box fin dal principio, salvo installare i driver proprietari per la GPU nVidia e per il WiFi Broadcom lanciando manualmente jockey dal terminale perchè dalle preferenze di sistema non si riusciva ad avviare.
  • Il trackpad multitouch funziona quasi alla perfezione (e ciò, detto da un utente OS X, vale qualcosa). Sembra esserci in principio anche il supporto a gesture a tre o quattro dita, ma le impostazioni di default non le sfruttano in nessun caso.
  • La durata della batteria, sebbene inferiore rispetto a OS X, è comunque più che accettabile.
  • La velocità di boot è impressionante

Per quanto riguarda l’installazione, l’unica cosa a cui bisogna stare attenti è il partizionamento. Ovviamente non si può fare in automatico perchè il triplo boot non è previsto. Su un Mac con EFI, con OS X (dal 10.7 Lion in poi) e Windows installati in modo abituale, ci sono 4 partizioni. La partizione nascosta EFI, la partizione di sistema di OS X, la partizione di sistema di Windows, e la partizione di recovery del setup di OS X. L’ordine è questo, a meno che non abbiate installato Windows prima dell’aggiornamento a Lion, nel qual caso avrete la partizione di recovery e quella di windows invertite.

Ciò che bisogna decidere è dove infilare la partizione di Ubuntu. O meglio, le partizioni di Ubuntu. Ne servono come minimo due, una di qualche centinaio di megabyte, segnalata come “BIOS Boot partition”, che serve al funzionamento di GRUB 2 su EFI (e non va confusa con la partizione montata su /boot), e una per il sistema. Io ho 8GB di RAM, quindi la partizione di swap l’ho evitata. Ho posizionato entrambe le partizioni tra la quella di Windows e quella di recovery, ridimensionando la partizione di Windows direttamente dall’installer di Ubuntu, formattando la partizione di root di Ubuntu come Ext4.

Bisogna stare attenti a dove installare GRUB. EFI ignora bellamente l’MBR, per cui GRUB va installato nella partizione di root, non altrove.
Successivamente all’installazione, è necessario installare un boot manager per EFI per poter selezionare all’avvio quale sistema operativo avviare. Sui Mac Intel è sempre stato disponibile rEFIt. Basta installarlo seguendo le istruzioni e dovrebbe tutto funzionare a dovere. Il progetto rEFIt è abbandonato e fermo da tempo, sebbene funzioni ancora bene. Esiste un fork moderno chiamato rEFInd, che promette molto ma non ho ancora avuto il tempo di provare.

Finisce qui questo promemoria su Ubuntu vs MacBook Pro. Alla prossima.

C’è spazio per tutti

Che gli antichi fossero grandi astronomi e amassero la geometria, lo sanno tutti. Un po’ meno nota è forse la storia di come si è evoluta la matematica dell’antichità, a partire da Egizi e Indiani per arrivare ai grandi matematici greci come Archimede e Pitagora, che passarono poi la palla agli arabi medievali. La storia, come dice l’introduzione del libro, dello sviluppo nel tempo del concetto di spazio.

Di questo parla C’è spazio per tutti, un libro di Piergiorgio Odifreddi che cerca di spiegare i principali argomenti della geometria elementare ripercorrendo il percorso storico che ha portato alla loro scoperta e alla nascita stessa della matematica, intesa come gioco di Ipotesi-Dimostrazione-Tesi teorizzato per primo da Aristotele e messo in pratica da Euclide nei suoi Elementi.

Nonostante si cerchi di dimostrare alcuni dei risultati più importanti, come il teorema di Pitagora o quelli di Talete, non si tratta di un testo di matematica. Le dimostrazioni sono raccontate in modo discorsivo e logico senza nessun formalismo e con l’uso di molte figure, e messe in pratica spiegando le più importanti scoperte astronomiche dell’antichità, nate proprio grazie alla geometria. Ma le questioni tecniche sono solo un elemento del racconto, che si intreccia con la storia dei popoli antichi coinvolti, dagli Egizi ai Greci passando per Arabi ed Indiani. Sono molti anche i riferimenti alla geometria presente in arte, architettura e simbolismi religiosi di ogni epoca.

Il racconto si ferma attorno al 400 d.C. per poi riprendere nel secondo volume della serie, Una via di fuga, che ancora non ho letto, dove viene raccontata invece la geometria moderna.

Più che nozioni di geometria, ciò che questo libro cerca di trasmettere è la passione che i popoli antichi, Greci in testa, nutrivano per le sfide intellettuali che matematica e astronomia pongono alla mente umana. Passione che traspare in ogni pagina, ma mai quanto nell’introduzione stessa del libro, dove, parafrasando Borges, Odifreddi scrive:

Anch’io ho preferito raccontare ai miei lettori non la storia della matematica, che ignoro, ma l’amore per certe discipline. O, meglio ancora, per certe dimostrazioni. O, meglio ancora, per certi risultati. E spero che questo basti. Uno si innamora di un risultato, poi di una dimostrazione, poi di una disciplina.
Apri dunque il tuo cuore alla matematica, e preparati ad innamorarti.

Non so se il suo libro basti a far innamorare qualcuno della matematica, ma Odifreddi ha ragione quando dice che è proprio così che accade, come è esattamente successo a me innamorandomi anni fa del teorema sull’indecidibilità dell’halting problem, dando così vita alla mia passione.

Paolini racconta Galileo e la nascita del metodo scientifico

Guardo sempre con molto interesse gli spettacoli di Marco Paolini, dove riesce a tenere incollati gli spettatori in un monologo di due ore, parlando di temi a prima vista ostici e/o pesanti, ma presentandoli in modo tale da impedire a chiunque di cambiare canale.
Chi ha visto i suoi monologhi sulla tragedia del Vajont o sugli esperimenti di eugenetica nazisti sa di cosa sto parlando. La sua bravura nel raccontare le cose è indiscussa.

Questa volta, in uno spettacolo andato in onda su La7 lo scorso 25 aprile, si concentra sulla vita di Galileo Galilei, il creatore del moderno metodo scientifico. È un argomento solo apparentemente più leggero, perchè la storia della persecuzione delle sue idee da parte della “Santa Inquisizione” non è solo un promemoria della tragedia intellettuale che è stato il ristagno scientifico in cui è rimasto per secoli il mondo occidentale, ma ricorda anche e soprattutto le infinite stragi compiute “in nome di Dio” nel corso dei secoli, dalle varie chiese cristiane ma non solo.

Riguardo all’assurda irrazionalità della Chiesa cattolica in tutta questa storia, Paolini affronta l’argomento in modo molto più diplomatico di quanto abbia fatto, ad esempio, Piergiorgio Odifreddi in “Hai vinto, Galileo!”, forse per istinto personale, o forse per andare incontro alle esigenze della TV italiana, ma riesce comunque a rendere molto bene l’idea. Racconta Galileo a tutto tondo, passando dalla sua vita privata alle sue scoperte scientifiche, lo scambio di idee con Keplero, l’invenzione del cannocchiale, la pubblicazione dei suoi libri più importanti, gli altalenanti rapporti con il papato e i problemi con il Santo Uffizio.

Come riesce sempre incredibilmente a fare, Paolini tiene incollato allo schermo lo spettatore con un ritmo narrativo incalzante, una sana dose di comicità e tanto talento.

Trovate l’intero spettacolo su YouTube a questo indirizzo, che consiglio di visitare a chiunque sia appassionato di scienza, ma anche e soprattutto a chi non lo è.

Higgs boson for dummies

Beh, non proprio for dummies, ma meglio di niente.
Sto parlando di un articolo, Unveiling the Higgs mechanism to students, scritto da Giovanni Organtini, docente di Fisica all’Università La Sapienza di Roma e fisico dell’INFN (Istituto Nazionale di Fisica Nucleare).
Potete trovare l’articolo a questo link.

Il suo scopo è spiegare cos’è il Bosone di Higgs e dare un’idea della teoria che ci sta dietro, in un linguaggio comprensibile da uno studente undergraduate che non abbia necessariamente conoscenze di teoria dei campi o di fisica quantistica.

Dopo tutto il clamore mediatico causato dalla supposta scoperta della particella di Higgs all’LHC del CERN, si sentiva l’esigenza di una risorsa del genere. Personalmente, avevo voglia di capirci di più, ma tutti gli articoli che ho trovato fino ad oggi non spiegavano nulla di più di ciò che si può sentire in un telegiornale. Questo articolo colma la lacuna. Dopo una lettura molto rapida mi sembra che sia comprensibile a qualcuno che abbia sostenuto (e capito) un corso di fisica di base di qualche corso di laurea di ambito scientifico, seppur con un po’ di impegno.

Il problema della fermata

No, questo post non parla ne di autobus ne di treni (anche se di problemi con questo tipo di fermate ce ne sono molti).
Una sera della scorsa settimana mi sono ritrovato in mezzo ad una discussione “quasi” tecnica tra un paio di bravi ingegneri elettronici con tanta voglia di bere birra e chiacchierare. Uno dei due ad un certo punto sfodera con ammirevole sicurezza una rassicurante verità:

Qualsiasi cosa tu abbia bisogno di calcolare, un computer può farlo. Basta conoscere l’algoritmo giusto e avere abbastanza tempo.

La leggerezza della conversazione e il mezzo litro di De Koninck ormai in dirittura di arrivo hanno persuaso il matematico che c’è in me dal contraddire questa affermazione a prima vista scontata.
Non è così facile da intuire, ma esistono problemi che un computer non può risolvere. Risposte che non possono essere calcolate.

Continua a leggere