Novità

Tante novità, per cominciare sono molto soddisfatto dell’acquisto del Mac Mini. Ho avuto la sfortunata idea di installare windows media player 9 per Os X per vedere i filmati i wmv e da quel momento Safari ha iniziato a piantarsi ogni volta che vede un file di quel tipo. Eliminare windows media player non ha eliminato il problema… Al suo posto ho messo mplayer per Os X, che vede un sacco di formati e pare funzionare bene.

Infine ho appena comperato un dominio e dello spazio web, appena tutte le pratiche saranno concluse inizierò a spostare il sito, purtroppo questo blog è destinato ancora a qualche travaglio. Aggiornamenti a seguire.

Esamoni

Lunedì ho superato uno degli esami considerati tra i peggiori di tutto il corso di laurea in Informatica. Trattasi del famigerato Algoritmi e strutture dati: algoritmi, calcolabilità e complessità.
Con la riforma della nuova laurea il corso che avevo frequentato due anni fa è stato sostituito da altri due. Il passaggio è avvenuto con delle modalità molto strane. Tanto per cominciare prima era un corso annuale con un esame in tre parti:

  • scritto primo semestre
  • scritto secondo semestre
  • orale su entrambe le parti

Ora ASD:DCC è equivalente ai seguenti corsi:

  • CASD: scritto, orale e laboratorio
  • CC: scritto e orale

All’orale di CASD ha partecipato il Prof. Moggi, che non era elencato in commissione, ma che era il titolare del vecchio ASD. La Prof. De Floriani, titolare, non si è vista. Moggi tentava di chiedere cose fuori dal programma del corso, ma di solito veniva imbrigliato dalla tuttofare Prof. Magillo. In generale CASD non è difficile, anzi è sicuramente più semplice della prima parte di ASD.

Invece CC è oggettivamente difficile, bisogna aver compreso a fondo (leggi: studiato a memoria) tutto il programma per riuscire a passare.
Per lo scritto sembra che la teoria non serva a nulla, si tratta soltanto di provare a rifare gli scritti passati risolti da precedenti generazioni di studenti e sperare che capitino esercizi già fatti negli anni passati. Dopo parecchio studio si capisce che è possibile fare uno scritto decente arrivandoci col ragionamento (ma l’ho capito dopo aver passato lo scritto, mente preparavo l’orale).

All’orale di CC c’è lui, Moggi, da solo. È estremamente preciso, un parser umano di formule logiche. Finché ripeti quello che c’è sulle dispense, tutto ok. Se sbagli qualcosa ti aspetta una fine lenta e dolorosa.
Si inizia con un ‘no !’ e si prosegue con un ‘perché ?’. Difficilmente Moggi ti aiuta a trovare l’errore in quello che affermi, sta lì e aspetta, paziente.
In ogni caso (che uno si corregga o meno) ti aspetta la dimostrazione. Giustamente se affermi qualcosa di poco convincente vuol dire che sai dimostrarlo, altrimenti non ti verrebbe neanche in mente.

Peccato che la mente dello studente medio non funzioni così. Lui è abituato a presentarsi ad un esame con un certo bagaglio di conoscenze appiccicate con lo sputo ed a usare l’intuito e un buona dose di fortuna per tutto quello che manca. In generale l’obiettivo è superare l’esame con il minor sforzo possibile e il massimo rendimento. Ovviamente questo non vale per tutti gli studenti, né per tutti gli esami, però…
Quindi se lo studente è veramente bravo (o la sa raccontare molto bene) riesce a dimostrare la sua affermazione, altrimenti, beh, c’è sempre la prossima volta…

Qui ci sono i voti di tutti gli studenti che hanno incontrato Moggi almeno una volta nella loro vita, è un club esclusivo, ma l’elenco dei partecipanti è pubblicamente consumabile per la gioia di grandi, piccini e del garante della Privacy.

La mia opinione sulla questione BitKeeper

Qualche giorno fa si è scatenato l’ennesimo thread infinito su linux-kernel@vger.kernel.org sul problema che BitMover (la ditta dietro al prodotto BitKeeper) non fornisce abbastanza informazioni per ricostruire completamente la storia dei sorgenti del kernel di Linux. Io non credo che questo sia un problema reale, le patch su ftp.kernel.org hanno una granularità sufficiente per la maggior parte degli usi che mi vengono in mente.

Il problema che vedo io riguarda i piccoli sviluppatori, come me. Per noi è diventato estremamente difficile seguire lo sviluppo del piccolo pezzetto di kernel di cui ci vogliamo occupare senza utilizzare BitKeeper.

Qualche mese fa mi sono trovato delle modifiche (perfettamente giuste e legittime) al driver che mantengo, già incluse nella release stabile, mentre le mie povere patch faticavano a passare i molti filtri. Ho dovuto rifare le mie patch perché non si applicavano più… In pratica sono stato aggirato da qualcuno con BitKeeper.

Non ha alcun senso che per mantenere un driver di 50KB io debba mantenere un albero cvs (o svn o bk) di diverse centinaia di megabyte contenente tutta la storia possibile. Attualmente uso una soluzione fatta in casa, quasi totalmente automatizzata che mi permette di fornire patch che si applicano all’ultimo snapshot di Torvalds. Internamente uso Subversion per mantenere la storia delle modifiche ai sorgenti. E’ un buon prodotto, decisamente migliore di cvs e più intuitivo di arch (e forse anche più avanti nello sviluppo).

Quindi il mio problema non è che la gente usi BitKeeper, a loro fa comodo, a me no. Il problema è che BitKeeper consente a chi lo usa una via rapida e veloce per includere modifiche senza che ci sia un reale controllo da parte della comunità. Si sono formate due categorie, quelli che usano BitKeeper e tutti gli altri, con questi ultimi che si sbattono con scriptini e casini vari perché non possono (o non vogliono) usare un programma che ha una licenza alquanto discutibile.
Dato che la maggior parte dei piccoli sviluppatori lo fa per hobby, più gli rendi le cose difficili e meno avranno voglia di continuare il lavoro.

Traslochi

Dopo aver spostato il blog da initd (uno spazio web offerto da associazioni LUG di Torino ed Alessandria) a qui, sul mio server, per poterci giocare più facilmente, senza dover rompere tutte le volte a fog per chiedergli di installarmi qualche nuovo plugin, ho buttato via pyblosxom, passando a drupal.

Il cambio non è stato del tutto indolore perché non ho potuto importare i vecchi post mantenendo la data originale.

Li ho ripostati lo stesso, aggiungendo in fondo la data, sono solo un paio e li trovate subito dopo di questo.

Mi trovo bene con drupal, è senz’altro esagerato per le mie esigenze, ma funziona bene, in particolare il post via xmlrpc e non ha problemi con le immagini.

Chiusura della mailing list di Zena su initd.org

Ieri sera tardi ho chiuso la lista del Gruppo Zena, di cui ero il moderatore.
È un altro capitolo che si chiude in un lungo elenco, sembra che Linux a Genova riesca sempre a tirar fuori il peggio delle persone, causando conflitti e scontri su argomenti in gran parte irrilevanti.
Dopo esser stato tra i fondatori del LUGGe, del GeLUG e del Gruppo Zena, ogni gruppo con sempre meno regole e sempre più ristretto, è arrivato il momento in cui dico basta e mi occupo di altro nella vita. Una parte del gruppo continuerà a portare avanti le attività sotto il nome di Zena, a loro auguro una buona continuazione.

Che bello il blog di initd

Era da un po’ che pensavo di mettere insieme un mio blog, solo che non ho mai avuto il tempo di installarne uno sul mio server di casa. Avevo guardato un po’ i vari software esistenti, ma mi sono sembrati tutti abbastanza complicati da richiedere un certo tempo per l’installazione (e soprattutto per il mantenimento).

Ora, visto che qualcun altro ha fatto il lavoro per me (grazie fog), come rinunciarvi ?

Font PSF

Il PSF è un vecchio formato di font in formato bitmap. È ancora usato ed è supportato dai pacchetti che gestiscono la console di Linux. Se usate Linux da qualche parte avete sicuramente dei file PSF, magari compressi con gzip.

Il codice qui sotto mostra come decodificare i singoli caratteri (glyph). L’avevo scritto per una piccola libreria grafica.

#include <stdio.h> #include "FBlib.h" FILE *gunzip(FILE* fp, char* path) { char command[200]; fclose(fp); sprintf(command, "gunzip -c %s > /tmp/FBfont.psf", path); system(command); fp = fopen("/tmp/FBfont.psf", "r"); system("rm /tmp/FBfont.psf"); return fp; } int main(int argc, char *argv[]) { FILE *font; char byte; int filemode; char fontheight; int i, j, k; if (argc > 1) { font = fopen(argv[1], "r"); if (font == NULL) { printf("%s was not found", argv[1]); return -1; } } else { font = stdin; } byte = fgetc(font); if (byte == 31) { byte = fgetc(font); if (byte = 139) { font = gunzip(font, argv[1]); byte = fgetc(font); } } if (byte != 0x36) { printf("%s is not a psf font file", argv[1]); return -1; } byte = fgetc(font); if (byte != 0x04) { printf("%s is not a psf font file", argv[1]); return -1; } filemode = fgetc(font); if (filemode == 1 || filemode == 3) filemode = 512; if (filemode == 0 || filemode == 2) filemode = 256; fontheight = fgetc(font); for (k=0; k &lt; filemode; k++) { for(j=0; j &lt; fontheight; j++) { byte = fgetc(font); for(i=128; i>0; i/=2) { if(byte & i) printf("O"); else printf(" "); } printf("\n"); } printf("\n"); } fclose(font); return 0; }

Thread

This sample code shows how to execute a function (my_thread) in a different thread.

#include <stdio.h> #include <pthread.h> void *my_thread(); int a, b, c, x=1, y=4, z=9, w; int main() { pthread_t my_thr; int err; err = pthread_create(&my_thr, NULL, &my_thread, NULL); a = x + y; pthread_join(my_thr, NULL); c = a - b; w = c + 1; printf("a=%d b=%d c=%d x=%d y=%d z=%d w=%d\n", a, b, c, x, y, z, w); exit(0); } void *my_thread() { b = z + 1; pthread_exit(NULL); }