Buone notizie, orali interminabili ed elezioni Aggiungi un commento

13 maggio 2008, 22:39

Dopo varie peripezie, sono ancora assieme alla mia amata Federica, che ora non sta bene (di salute) e mi verrà a trovare nei prossimi giorni. Sono felice che tu stia meglio oggi, mia cara!

Succede che ho passato l’esame di Matematica Discreta (Complementi). A parte il ritardo di due anni… evviva! Chissà com’è andata a quelli che ho lasciato lì… mah!

Che ho nuovamente installato e disinstallato Windows Vista Business Edition (BSOD Edition, per quanto mi riguarda) sulla mia umilissima postazione fissa, solo per essere gratificato dalle ennesime schermate blu. che mi hanno fatto tornare in tutta fretta al buon vecchio XP (recentemente Service Pack 3). Perfino la partizione su cui ho installato Vista, è stata eliminata e inglobata dalla partizione di XP, tutto questo grazie ad Acronis Disk Director Suite, che consiglio per ogni operazione di questo tipo.

Nonostante questo, prevedo di effettuare un nuovo tentativo, con accorgimenti per la stabilità del sistema operativo prima di installare gli updates (leggi: disabilitare l’overclock). Una volta raggiunta una certa stabilità, seguiranno test per capire se e in quali campi Vista è più veloce di XP, su questo computer.

Queste sono cose che mi riguardano direttamente. Ce ne sono altre, che mi riguardano indirettamente, a cui però vale la pena accennare.

Primo, come tutti sanno, Veltroni ha perso le elezioni. Ora, com’è possibile che milioni di italiani si identifichino nell’uomo che accentra il potere, che spreca risorse di Stato per creare leggi a suo vantaggio, che con le sue “battute di spirito” e la sua galanteria rende l’Italia lo zimbello del mondo (solo per poi dire che “tutti i giornalisti esteri sono di sinistra“) e, ultimo ma non ultimo, definisce “eroe” un mafioso solo per aver taciuto il suo nome e quello dei suoi collaboratori? Solo una parte di questi difetti, lo renderebbe ineleggibile in un paese come l’Inghilterra o l’America, per non parlare del fatto di avere processi e condanne penali in corso (ma questo è comune a molti politici). Mi si dice che non dobbiamo giudicare un uomo dalle azioni non pertinenti al suo compito, ma come ignorare che quando si vota, si vota una persona e non un concetto, sebbene tutti vogliano far credere questo?

Ora pare che si sia calmato, ma… solo il tempo darà i suoi frutti.

Secondo, per l’ennesima volta il Papa ha ficcato il naso nella politica italiana, dicendo che la tale o talaltra legge “è il male” (in questo caso, la Legge 194, ovvero la regolamentazione dell’aborto). Ora, sicuramente il Papa può legiferare nella Città del Vaticano, ma non mi risulta che abbia potere decisionale sullo Stato italiano. Eppure la sua voce ha un immenso peso. Non tanto sui politici (che pure si sentono in dovere di rispondere), ma sul popolino, perché l’opinione del singolo uomo viene diffusa e drammatizzata dai suoi ministri, i sacerdoti, su tutte le parrocchie, con una capillarità sconosciuta alla maggior parte dell’informazione politica. Dove ancora non ci sono televisioni, ci sono chiese, chiesette e preti che ripetono la parola del Papa. E dov’è, in tutto questo, la dignità della donna? Dov’è la dignità di un bambino non voluto, a cui vorrebbe essere negato il diritto a non soffrire, a morire in pace?

Ma si sa, la Chiesa raramente ammette posizioni ragionevoli. La fede è l’esatto contrario della ragione, nonostante quello che dicono i clericali. Basta vedere l’opera dei missionari in Africa, che vietano l’uso dei preservativi perché “sono il male”, ma la gente muore di AIDS e molti dei bambini che nascono, muoiono per denutrizione; ma no, i contraccettivi “sono il male”.

Che dire? Non mi resta che andare a letto, oggi, dopo 8 ore passate ad attendere un orale durato 15 minuti, stanchissimo ma pronto a ricominciare lo studio per i prossimi esami, Analisi (complementi) e Ricerca operativa ormai alle porte. Se qualcuno ha libri (anche da suggerire) e/o appunti… fatevi avanti!

Inizia l’avventura MacBook Aggiungi un commento

28 dicembre 2007, 9:49

Ebbene sì: sull’onda dei miei recenti successi universitari, e considerato che le idee migliori mi vengono quando sono fuori casa, lontano dalle distrazioni insomma, ho deciso che un portatile potrebbe aumentare la mia produttività. La scelta, per farla breve, non c’è stata: a parte alcuni piccoli dubbi, il mio sguardo era fisso da tempo (diciamo pure dal suo rinnovamento a base di Intel, core Santarosa) sul MacBook 13,3”.

E finalmente, alcuni giorni fa, ho potuto acquistarlo grazie a una sorta di contratto non scritto tra me e i miei genitori (che vi risparmio) direttamente dal sito della Apple, per usufruire dello sconto studenti di cui il personale della Mediaworld negava l’esistenza. Accidenti a loro!

Così, dopo essermi scontrato con la superstiziosa resistenza di mia madre verso gli acquisti online (“Tu stai dando soldi a qualcosa di incorporeo, a un fantasma!“) ho caricato la mia fidata carta Postepay, che è arrivata ad avere esattamente 1 K€.

Un Mega di euro

Procedura d’ordine senza intoppi, ho ordinato il prodotto standard, senza migliorie. Al massimo, cambierò la RAM in seguito.

Alla fine il mio ordine appariva così:

Il mio ordine.

Ho ordinato e stamattina è arrivata la mail di conferma della spedizione. L’avventura comincia!

Intanto, informo tutti quelli che leggono questo blog (i miei 2,5 lettori… chi mi sa cogliere la citazione?) che io scompaio per i prossimi 7 giorni in compagnia fisica della persona che già da sola rende la mia vita degna di essere vissuta. A risentirci dopo il 3 gennaio e auguri di buon anno a tutti!

Gestione della memoria in C – Le considerazioni di un inesperto Aggiungi un commento

14 dicembre 2007, 11:44

Oggi ho finalmente dato l’esame che preparavo da due settimane, Laboratorio di algoritmi e strutture dati (per chi se lo stesse chiedendo, esiste solo per gli immatricolati prima del 2005/2006). Voto superiore alle mie aspettative, perchè il progettino richiesto… ecco, per farla breve, non funzionava. Ma avevo studiato la teoria e ho capito da solo i miei errori nella pratica, e questo mi è valso la promozione e un voto accettabile, anzi buono, tutto sommato.

Il progettino in questione prevedeva di implementare, in C o C++, l’algoritmo di Kosaraju per trovare le componenti fortemente connesse di un grafo orientato. Diviso in 4 parti: lettura dei dati da un file e implementazione delle strutture dati necessarie, implementazione della visita in profondità (DFS) sul grafo, creazione del grafo trasposto, isolamento delle componenti fortemente connesse. Corrispondono grosso modo ai passi dell’algoritmo, che consiste in:

  • Dato un grafo, effettuarne una DFS;
  • Creare il grafo trasposto;
  • Effettuare una DFS del grafo trasposto, visitando i vertici nell’ordine di fine visita decrescente dato dalla prima DFS;
  • Isolare gli alberi DFS dell’ultima visita, che risultano essere le componenti fortemente connesse.

L’implementazione di questi algoritmi è di per sé facile, una volta conosciute le basi del linguaggio. Non serve altro che tradurre in C (o C++) l’algoritmo in pseudocodice presentato nell’ottimo libro Introduzione agli algoritmi e strutture dati di Cormen, Leiserson, Rivest e Stein, una vera bibbia per trovare velocemente tutto ciò che c’è da sapere sugli algoritmi e le strutture di dati elementari (si parla di astrazioni naturalmente, non dell’implementazione in un particolare linguaggio).

I problemi vengono a monte, quando si tratta di implementare la struttura dati necessaria, soprattutto per me che da troppo poco tempo mastico il linguaggio C.

Questo potente strumento di programmazione, con tutta la sua libertà, ha uno svantaggio: non gestisce automaticamente la memoria del sistema, ma ne affida la gestione completamente al programmatore. Che, nel mio caso, può essere inesperto, non sapere esattamente come funzionano le cose e trovarsi davanti ad errori del tutto inaspettati e a prima vista incomprensibili.

Ogni variabile che non sia di un tipo primitivo di dati, dev’essere allocata: bisogna, con un comando esplicito (cioè malloc e le sue varianti calloc e realloc), dichiarare che si vuole riservare X bytes di memoria per quell’oggetto. Alla fine dell’utilizzo, è buona norma liberare la memoria così riservata, con il comando free. Se non lo si fa, si rischia di “scrivere dove non si dovrebbe” (parole del mio professore di Laboratorio di algoritmi). Stesso discorso se si alloca la quantità sbagliata di memoria o se si usa più memoria del previsto, andando, per esempio, fuori dei confini di un array. Supponiamo di avere allocato spazio per 10 caratteri, assegnati a una variabile name di tipo char *, usando regolarmente una malloc:
Allocazione di 10 caratteri.
E ora, supponiamo di aver dichiarato, per esempio, un array di int, numbers[], senza dichiararne la dimensione e dimenticando di allocare la memoria necessaria, riempendolo volta per volta. Come può benissimo accadere, il primo valore, numbers[0] (ogni int occupa una parola di 4 bytes, qui sto rappresentando i bytes come caratteri ASCII) non è molto distante dal blocco di memoria puntato da name.
Assegnazione di un primo valore correttamente allocato
Ora, ecco cosa succede se assegno qualche valore a numbers[1] e numbers[2]:
Assegnazione di valori su memoria non allocata...
E infine, assegnando un valore anche a numbers[3]:
...con relativo comportamento imprevisto!
E’ successo un guaio: i valori per cui non era stato allocato spazio, scritti su blocchi di memoria contigui, sono andati a sovrascrivere parte del mio nome, che credevo memorizzato al sicuro nella variabile name. Per evitare questo problema, sarebbe stato sufficiente dichiarare la dimensione dell’array, o allocare una dimensione massima (ad esempio 1024 bytes), o ancora mantenere un indice che segnalasse la dimensione corrente dell’array e riallocasse lo spazio (con realloc), secondo il bisogno. C’è più di un modo per gestire efficacemente la memoria in C, l’importante è non trascurare questo aspetto della programmazione.

Il prototipo della funzione standard per allocazione di memoria è void *malloc(size_t size). Per utilizzarla con successo, bisogna ricordare che:

  1. malloc restituisce un puntatore a void che deve essere esplicitamente convertito nel tipo della variabile per cui allocare memoria;
  2. Bisogna allocare la giusta quantità di memoria, altrimenti si va incontro agli errori di cui ho parlato prima.

Adempiere al secondo punto è importante. Di solito si usa la funzione sizeof(...) con, come parametro, il tipo di dato che la variabile allocata conterrà. Non so quanto sia banale, ma è un errore che ho ripetuto spesso, prima di rendermi conto cosa stavo facendo. Se si alloca un puntatore a char, bisogna richiedere spazio per char; se si alloca una variabile di tipo Node, definito come struct _node *, bisogna richiedere spazio per struct _node, e così via. Un errore come quello precedentemente descritto, porta a perdere la metà di una stringa; errori del genere con variabili più complesse e di maggiori dimensioni, porta a errori di paginazione, corruzione dello heap, sovrascrittura della memoria di sistema, vulnerabilità nel programma, cecità, tumori e morte.

In definitiva, ho capito che programmare in C richiede disciplina, forse più degli altri linguaggi. Tutto considerato, posso dire che finora mi è andata bene!