Archive for February, 2006

Minix 3 on a Mac

Monday, February 27th, 2006

Installing Bochs on a Mac is a pain. First you have to compile it, (no big deal with the standard ./configure && make && make install). Then you find it trashed your /usr/local directory with its files. When you finally make it run, it turns out the Carbon interface sucks 100% CPU even when the emulated PC is doing nothing. On top of all that, Minix fails to boot.

Given that Minix is the reason I wanted Bochs for in the first place, this is a bit of a let down. Luckily I found out about the Mac OS X version of QEmu. It booted Minix from the CD-ROM image with no problems. I ran “setup”, and in a couple of minutes I had Minix installed on the emulated disk. Joy!

]]>

Siti web realizzati da geni

Wednesday, February 22nd, 2006

Ore 9.07, navigo su www.genialloyd.it (non cliccate!) per rinnovare l’assicurazione della mia auto. L’altoparlante del mio computer inizia a blaterare ad alta voce “Benvenuto in Genialloyd!” Aaaaargh! Come si permettono di fare partire dei suoni sul mio computer? Abbasso il volume, e intanto la voce continua, “…per escludere l’audio clicca sull’icona dell’altoparlante…”. Da bravo utente clicco, e intanto la voce continua. Riclicco, e la voce continua.

Quando si fa un sito web, bisogna ricordare che il computer su cui gira il browser appartiene all’utente. Non dobbiamo permetterci di fare partire suoni senza che l’utente lo richieda esplicitamente. Così come non dobbiamo aprire nuove finestre o spostarle; sono atti che mandano il messaggio “Il tuo computer appartiene a noi.”

Oltre a tutte queste considerazioni, che dovrebbero essere ovvie per chiunque faccia del web il suo mestiere, c’è la figuraccia di mettere un bottone per escludere l’audio che non funziona.

Molto bene. Chi l’ha fatto, alla fine, il sito di Genialloyd? In fondo alla pagina leggo: “Sito realizzato in collaborazione con Accenture”. Complimenti.

]]>

Un sistema operativo estremo

Wednesday, February 22nd, 2006

Ogni anno, quando si approssima l’inizio del mio corso di Sistemi Operativi, sento il bisogno di illustrare i meccanismi del S.O. con del codice funzionante. Il problema è che mettere il naso dentro il codice di Linux, per dirne una, è difficilissimo anche per me. Anche con l’ausilio di ottimi libri come Understanding the Linux Kernel di Bovet e Casati, nel codice di Linux ci sono troppe complicazioni. Che sono necessarie per realizzare un SO realistico, ma rendono difficile afferrarne il funzionamento.

In alternativa, ci sono un numero di SO giocattolo, pensati per la didattica. L’esempio più famoso è Minix di Tanenbaum, che è una versione molto semplificata e comprensibile di Unix, e gira sui comuni PC Intel. Poi c’è Xinu, che non è Unix, come da acronimo ricorsivo, ma ha lo stesso spirito di Minix: realizzare un SO funzionante in C su hardware comune.

Un’altra categoria sono i SO giocattolo “non realistici”, cioè che non sono in grado di ospitare un completo sistema di sviluppo e compilare sè stessi. Al politecnico di Zurigo c’è Topsy, che è un SO microkernel che gira su processore RISC. Ad Harvard c’è OS/161, che gira su una CPU fittizia (con un assembler ancora più semplice.) Il mio preferito in questa categoria è GeekOS, che ha tutto un percorso didattico associato: ci sono una serie di esercizi che devono essere realizzati (in C e assembly x86), e il tutto gira su Bochs.

Ancora un’altra categoria è quella dei simulatori, che illustrano il funzionamento del SO simulando in maniera più o meno realistica l’hardware. Il più famoso è Nachos.

Alla fine, non ho mai usato nessuno di questi SO didattici, e ho sempre nel profondo l’idea che sarei forse in grado di realizzarne uno che centri il giusto equilibrio di semplicità e completezza. Giusto l’altro giorno stavo tornando su questi pensieri, e mi è venuto in mente che potrei affrontare il problema in stile XP, sfruttando questa mia nuova abilità nel Test Driven Development. L’idea che mi è venuta è vedere se si riesce a fare un simulatore che sia assurdamente semplice.

Ho lanciato Eclipse (ho scelto Java perché i miei studenti già lo conoscono) e ho cominciato a chiedermi come lo testerei questo SO giocattolo. Quello che è saltato fuori è abbastanza strano, sicuramente molto diverso da quello che avrei fatto lavorando nel vecchio metodo non-TDD. Dopo numerosi rimaneggiamenti ho prodotto un paio di test. Il primo dimostra che il SO contiene un task di init, il cui sorgente viene passato al costruttore del SO:

  public void testGetInitTask() {
    String source = "again: JMP again";
    InsubOS os = new InsubOS(source);
    Task init = os.getTask(1);
    assertEquals(source, init.getSource());
  }  

Il secondo test verifica il comportamento della chiamata di sistema fork(2):

  public void testFork() {
    String forkOnce = "fork; again: JMP again";
    InsubOS os = new InsubOS(forkOnce);
    assertEquals(1, os.getTaskCount());
    os.step();
    assertEquals(2, os.getTaskCount());
    assertEquals(forkOnce, os.getTask(1).getSource());
    assertEquals(forkOnce, os.getTask(2).getSource());
  }

Questi test sono semplici schizzi, buttati lì per vedere che effetto mi fa vederli (il codice che li fa passare è semplicissimo.) Non avrò mail il tempo di portare avanti questo progetto, purtroppo. Però quello che vedo mi piace. Penso che mi piacerebbe lavorare sul concetto di sorgente: invece di una stringa di pseudo assembler, mi piacerebbe una costruzione secondo il pattern Composite; qualcosa tipo

  new Source(new Syscall("fork"), new Loop(new Noop()))

E sicuramente va aggiunto un concetto di root filesystem. Ragiono in termini Unix-centrici, perché questo è quello che insegno e che mi piace.

Chissà se lo porterò avanti?

]]>

Che vergogna

Thursday, February 16th, 2006

Essere alleati degli aguzzini di Abu Grahib e Guantanamo.

]]>

From the way too cool dept.

Saturday, February 11th, 2006

Bel momento per lavorare con Rails. Ci sono tantissime risorse che spuntano in giro…

  • Kevin Clark ha pubblicato un bell’articolo Rails Best Practices, Tips and Tricks, dove, fra l’altro, dà alcuni utili consigli sul testing
  • www.globalize-rails.org pubblica un plugin che risolve i numerosi problemini di localizzazione di Rails
  • Duane Johnson ha realizzato un simpatico plugin che facilita l’uso di widget dinamici, come ad esempio una textarea che può essere ridimensionata dall’utente
  • Le Migrazioni permettono di evolvere con facilità lo schema dei dati; ma anche di sviluppare con un database molto leggero come SQLite o MySql e andare in produzione con Oracle. (Per i clienti che ritengono di avere bisogno di Oracle…)
  • Con Capistrano è facile installare, disinstallare, far ripartire e in generale manutenere un’applicazione su uno o più server
  • Techno-weenie ha realizzato acts_as_authenticated, un semplice e dolce plugin per generare i meccanismi di registrazione e login. Sempre Techno-weenie ha anche un plugin che permette di versionare in maniera molto semplice i contenuti di una qualsiasi tabella.
  • Jonas Bengtsson ha realizzato un plugin per facilitare l’uso di Selenium in Rails. Selenium è una libreria per fare test di accettazione di applicazioni web. I test girano direttamente nel browser. Quelli che Rails chiama “functional tests” in realtà sono programmer tests sui controller; per fare veri test di accettazione occorre un tool esterno a Rails come Selenium.

Pain, and still no gain.

Monday, February 6th, 2006

Jamie Andreas è un fighissimo maestro di chitarra, uno che è
veramente in grado di insegnarti come suonare la chitarra. Non che lo
conosca personalmente, ma solo dai suoi ottimi e numerosi scritti. Sulla sua
mailing list stamattina:

Hello Jamie,


I remember asking my high school band teacher (who I thought was a great guitar player) if it was possible for anyone (me) to become a good player. He assured me that “Yes” it was and it just depended on how hard you work at it.

… your teacher is wrong. Actually, your teacher is half right, but there is nothing more untrue than half of the truth!

Now, the reason your high school teacher was wrong is because you can work as hard as you want, but if you are working the wrong way, you will go nowhere. It doesn’t matter how fast I drive, if I am on the wrong road I will not get where I want to go! Now, I agree, it is better to keep going, no matter what, than to give up. There is always the chance you will come upon the right knowledge, the right teaching, the right road. Then, you can put the other half of the truth with what your teacher said, and fulfill the two requirements of success in anything: do the right thing, and do enough of it.

Questo mi fa venire in mente certi sviluppatori che lavorano 10 o più ore al giorno, e comunque consegnano tutto in ritardo e con tanti difetti. Non serve lavorare tanto, serve lavorare bene. Tempo fa raccontavo di questo mio cliente che mi diceva:

Guarda Pino, lui sì che si impegna! Sta su fino a notte tarda tutte le sere!

Il mio amico che ascoltava (lui stesso un dirigente) ha esclamato “uno che fa tardi tutte le sere è un pirla! E’ uno che non si sa organizzare“.

Sono tornato spesso col pensiero a questo Pino (non è il suo vero nome) e
alla sua famiglia che lo aspetta a casa fino a tardi. Ho ripensato al lavoro
che gli ho visto fare, e ho trovato due cose.

Prima di tutto, Pino fa un sacco di cose che proprio non sono
necessarie
. Per esempio, aggiungere a un database dei vincoli che non
servono a supportare nessuna delle cose che il cliente ha chiesto; vincoli che
poi risultano errati e vanno tolti, con il risultato che tutti perdono un
sacco di tempo. Oppure complicare l’applicazione per “renderla più sicura”,
senza avere ben chiaro qual’è il modello della minaccia da cui
vogliamo difenderci e comunque senza un’esplicita richiesta da parte del
cliente
.

La seconda cosa è che Pino non automatizza nulla. I programmatori pragmatici mi
hanno insegnato che qualunque operazione vada fatta più volte (per esempio:
creare un nuovo database, fare il rilascio di un’applicazione) deve essere
realizzata con un solo
comando
. Per esempio make install, o ant
create-database
. Se non ti crei uno script per fare operazioni
complicate, finisce che perdi un sacco di tempo non solo a ripetere
manualmente le operazioni, ma anche a ricordarti di preciso come bisognava
farle, a controllare che siano state fatte correttamente, a correggere gli
inevitabili errori che si fanno quando si deve ripetere manualmente una
sequenza di operazioni.

Cerchiamo di non fare come Pino. Basta seguire due semplici regole: tutto
quello che si fa, è per implementare una storia che
mi è stata data dal cliente. E tutte le operazioni ripetitive
vanno automatizzate.

]]>