Posts Tagged ‘ technicalities

Ripristino Grub tramite live-disto

Spesso succede che per qualche motivo strano (per esempio la re-installazione di windows in un sistema dual-boot) Grub (ovvero il boot loader utilizzato da llnux) venga sovrascritto da altro (il boot loader di windows).

Ripristinare grub è veramente molto semplice: mi occorre una qualunque distribuzione live o un linux boot disk.

Procederò come segue:

1) Avvio una distribuzione live

2) Entro in una shell con i privilegi di root (nel caso di x/k/ubuntu devo usare ‘sudo -s’ )

3) creo un mount-point per la mia partizione di boot di linux con ‘mkdir /media/linuxdistro’

4) monto la partizione di linux da ripristinare nel mount-point appena creato con ‘mount -t ext3 /dev/sda1 /media/linuxdistro’ sostituendo ‘ext3′ con il vostro filesystem e ‘sda1′ con il device della vostra partizione (ad esempio ‘hda2′ se è la seconda partizione di un disco ide posizionato come master sul primo canale ide)

I passi successivi consistono nel creare un ambiente funzionante utilizzando la vostra partizione di linux.

5) Monto il file system proc all’interno della partizione di linux con ‘mount -t proc none /media/linuxdistro/proc’

6) Monto il file system dei device all’interno della partizione di linux con ‘mount -o bind /dev /media/linuxdistro/dev’

7) Ora posso ‘isolare’ ed entrare nell’ambiente preparato con ‘chroot /media/linuxdistro /bin/bash’

Ora posso utilizzare linux esattamente come se avessi avviato la macchina con la distribuzione installata sul mio pc, quindi posso re-installare grub

8) in ubuntu ‘update-grub’ in altre distro è ‘grub-update’ oppure è necessario entrare in grub (digitando ‘grub’ da shell ed eseguire l’installazione a mano)
9) riavvio la macchina con ‘shutdown -r now’ e avvio linux tramite grub

Spero di esservi stato utile

Ciao Piero

Usiamo il “Blind Carbon Copy”… please!

Tanti di noi ricevono e-mail da amici o conoscenti, che per condividere barzellette, filmati o cose molto divertienti inviano la stessa mail a una ventina di indirizzi.
Sarebbe buono se queste persone, anzichè utilizzare il campo “To:” per inserire gli indirizzi dei destinatari utilizzassero il campo “BCC:”. In questo modo a chi riceverà la mail non apparirà la lista di tutti i destinatari.
Vantaggi? Un po’ più di privacy e si evitano mail infette e di spam.

(Tnx to Alby per il suggerimento)…

Ciao Piero

Simulare tipi enumerativi in Java

In certi linguaggi, come ad esempio Java, non sono a disposizione i tipi enumerativi, ecco che allora posso sfruttare la potenza della programmazione ad oggetti per poter creare una classe che ne simula il funzionamento.

Per poter far ciò posso scrivere una classe autoreferenziante. Ad esempio:

class Edificio{

private Edificio(){}  /* Costruttore vuoto */

public static final Edificio Casa = new Edificio(); /* elemento del tipo Edificio*/
public static final Edificio Villa = new Edificio();

public static final Edificio Appartamento = new Edificio();

public static final Edificio Magazzino = new Edificio();

}

In questo modo potrò fare operazioni del tipo:

Edificio MioEdificio = Edificio.Casa();

oppure

Edificio MioEdificio = Edificio.Villa();

Potrebbe essere utile…

Ciao Piero

When Darwin won’t start

Installare MacOs X su una macchina x86 standard non è una cosa semplice e quando è possibile le performance del sistema non sono paragonabili con la stessa macchina con linux installato.

Contrariamente è possibile installare il kernel di MacOs X (Darwin e OpenDarwin) su una qualunque macchina x86. Prima di tutto è necessario scaricare e masterizzare la ISO del cd di installazione da opendarwin.org. Una volta masterizzata è possibile fare il boot da cd. Il processo di installazione partirà automaticamente, e non comporta molte conoscenze tecniche, se non un po di esperienza nell’installazione di un sistema Unix-like.

Se si sceglie di partizionare manualmente l’hard disk, per avere una macchina multi-boot con linux e con GRUB come boot loader, è molto importante scegliere Apple UFS (Unix File System) come file system sulla partizione di boot di Darwin. GRUB è in grado di leggere partizioni Apple UFS ma non le più avanzate HFS+ (se utilizzerete HFS+ non vi sarà possibile usare GRUB come bootloader inquanto non riuscirà a caricare Darwin).
Ammettendo che si sia installato Darwin sulla prima partizione del primo disco del canale IDE i comandi da impartire a GRUB per fare il boot di Darwin sono:

rootnoverify (hd0,0)

chainloader +1

boot

Questi comandi possono essere impartiti premendo “C” nella schermata di GRUB.

Se siete fortunati (o meglio… avete fatto tutto correttamente) vedrete la schermata di boot di darwin (identica a quella di MacOs X).

Se dopo una trentina di secondi non vedete comparire una shell, vuol dire che qualcosa è andato storto.

Resettate il sistema e ri-eseguite il boot da GRUB. Per qualche istante comparirà il bootloader di Apple, premete un tasto qualsiasi e potrete passare dei parametri di boot al kernel. Per esempio se digitate “-v”, avrete un output verboso al boot, così potrete individuare più facilmente il problema.

Tante volte, leggendo sui vari forum, il problema risiede nel fatto che manca il parametro che identifica il disco di root. In questo caso potrete digitare

hd()mach_kernel rootdev=disk0s1

e tutto dovrebbe partire. Per salvare questa opzione dovrete poi modificare la chiave Kernel Flags del file XML

/Library/Preferences/SystemConfiguration/com.apple.Boot.plist

inserendo

rd=disk0s1

Ora avrete la soddisfazione di avere un po di mac sul vostro pc…
Ciao Piero

Debbuging or Thinking?

“The debugger isn’t a substitute for good thinking. But in some case, thinking isn’t a substitute for a good debugger either. The most effective combination is good thinking and a good debugger”

Steve McConnell, nel suo Code complete, fornisce una lauta Checklist a proposito del debugging.

Tra le tante voci vale la pena citare:

    • Exercise the code in your test suite
    • Reproduce the error several different ways
    • Use the result of negative tests
    • Keep a notepad by your desk, and make a list of things to try

Con questi piccoli accorgimenti sarà possibile fare bug fixing, qualora fosse indispensabile e il TDD non faccia luce sul problema, molto più velocemente. La velocità però non deve essere il principale fattore guida, troppa fretta porta altri bug rinchiudendo la fase di debugging in un circolo vizioso. Infatti la checklist continua con un “relax”, questo è un buon consiglio. Se manca tempo, o il debugging porta al malditesta, prendere cinque minuti (o dieci) possono portare un vantaggio consistente nel lungo periodo.

Solo su una voce della lista non sono pienamente d’accordo: “Change the code only for good reason”. E’ vero, non devo fare sciocchezze nel codice, ma essere coraggiosi e apportare cambiamenti sostanziali al design può essere più che produttivo, e far ciò mi è facilitato se ho sviluppato tramite Test dato che in ogni momento che apporto una modifica al codice sarò certo se questo funzionerà correttamente o meno.

Un buon inizio per capire come fare red-green refactor o il TDD è wikipedia, o questo articolo su agiledata.

Agile Day 2006

Venerdì 1° Dicembre 2006 mi sono recato insieme ad Andrea e a suo cugino Simone al terzo Italian Agile Day, tenutosi ad Assago (centro congressi Milanofiori – Milano).
L’Agile Day è una conferenza dedicata alla diffusione delle metodologie agili, quali eXtreme Programming e Scrum, e di tutto ciò che circonda il mondo agile (Linguaggi, metodi e tecniche, framework,ecc)
Partiti da Varese alle sette e mezza del mattino siamo arrivati ad Assago in poco più di un ora.

A dare il via ai lavori è stato Marco Abis, promotore dell’iniziativa. L’idea di quest’anno è stata l’open space conference: solo due sessioni plenarie e molti piccoli workshop in contemporanea (track).

La prima sessione plenaria è stata tenuta da Luca Minudel e Nicola Canalini del team Ferrari racing. E’ stato bello vedere come Xp venga applicata con successo in team dove il dinamismo sia necessario e continuo, e dove i termini di consegna siano categorici e frequenti (se il gran premio o il test drive della macchina è alle 14:00 il software deve essere pronto e testato prima delle 14…).

Successivamente ho avuto modo di assistere a diverse sessioni. Nella prima, tenuta da Luca Grulla, si è parlato di Scrum. Scrum è una metodologia agile progenitrice di eXtreme Programming, ne condivide obbiettivi (come la massimizzazione della comunicazione tra il team e il costumer), ed è molto adatta a progetti che richiedono molto dinamismo. Non posso ancora esprimere una opinione precisa su Scrum: mi sembra più “libera” di Xp, dato che posso prendere le pratiche che più mi sembrano congeniali per il mio problema da altri metodi. Forse proprio questa libertà ne è il tallone d’Achille: troppa libertà può significare confusione.

Nel contempo Matteo Vaccari ha tenuto una seconda track sul Test Driven Development proponendo il classico kata del Bowling di Uncle Bob. Il TDD è un’ottima tecnica di Xp per sviluppare software testato e funzionante in breve tempo. Durante la track (e la giornata) è traspirato il fatto che molti scambiano il TDD con il Test First, ovvero prima faccio il test e poi scrivo la funzione. Il TDD è un metodo di sviluppo, il test evolve insieme a ciò che devo testare, e mi guida fino a trovare la soluzione.

Una sessione che ho seguito con interesse è stata “Agile Web Development with Django”, tenuta da Carlo Miron. Django è un framework simile a Rails ma scritto in Python. Utilizza un modello di sviluppo simile al Model Controller View di RoR: MTV (Model Teplate View). Similmente a quanto accade nelle migrazioni di Rails, posso descrivere con il Modello lo schema di una tabella nel Db. Punto a sfavore è l’assenza delle migrazioni (sono in fase di sviluppo), che vanno fatte a mano.
Rispetto a rails, la localizzione è molto facilitata, esistono già traduzioni nelle lingue più disparate. Molto divertente è il testing delle applicazioni e del codice. Phyton permette di inserire del codice di testing nella documentazione della funzione.
Sebbene ne sia rimasto colpito, Django mi sembra meno maturo di rails, purtroppo non sono state mostrati slide o esempi di codice, che sicuramente sarebbero state molto utili.

Essere al contatto con persone e professionisti che lavorano nel mondo agile (e non lavoricchiano/studiano come me :-/ ) è stato molto stimolante e istruttivo. Spero che molti miei colleghi di Università e amici sviluppatori, possano in futuro utilizzare metodologie Agili e partecipare al prossimo Agile Day. Un buon punto di partenza sono l’eXtreme User Group di Varese e quello di Milano, oltre al sito dell’Agile Moviment in Italia.

Browser War? Che vinca il migliore

Cosa fa di un web browser il migliore presente sulla rete? Tante cose.

Prima di tutto un buon browser deve attenersi alla maggior parte degli standard W3C. Oggigiorno il web browser con la maggior compatibilità con HTML 4.01 (standard del 1999) è firefox il quale implementa il 92% delle specifiche, contro l’80% di Internet Explorer 6, l’81% di IE7 e l’86% di Opera9.

Lo stato di XHTML? Per la versione 1.0 (del 2000, con modifiche nel 2002) IE6 e IE7 supportano il 24% delle specifiche, mentre Firefox ne implementa il 100% già dalla versione 1.5, e opera9 ne implementa il 99%.

La versione XHTML 1.1 del 2002 non è in alcun modo implementata in nessuna versione di IE, mentre in FF è presente per il 63%.

Le percentuali scendono a sfavore di IE per tanti altri standards, come CSS, DOM.

Il problema persiste veramente, anche se meno di un tempo. L’assurdità è che nessuno dei maggiori browser passa il test Acid2 (che contrariamente viene passato da Opera9, Konqueror (e brower basati su di esso come safari, Omniweb ecc).

Per la fonte di questi dati e approfondimenti:
Webdevout.net

Ciao Piero

Live @ Linuxday 2006

Bella esperienza, non c’è che dire.

Sabato sono stato uno dei relatori al LinuxDay di Sesto Calende. L’argomento del mio seminario è stato Ruby on Rails.

Sebbene non conosca da molto questo framework, mi ha talmente entusiasmato che ho voluto tenere una demo pubblica.
Ho diviso il seminario in due pomodori, un primo teorico di 25 minuti seguito da 5 di pausa, e un secondo pratico, dove ho mostrato come sia veramente possibile sviluppare più velocemente applicazioni Web con Rails. L’idea è stata quella di sviluppare un blog (sulla traccia della demo di DHH presente sul sito di rails), chiedendo al pubblico quali features desideravano (es. “Modifichiamo la grafica o diamo la possibilità di inserire commenti?”).

Il momento più entusiasmante è stato al termine quando mi è venuto in mente di dimostrare quanto Rails sia intuitivo:
volevo contare i commenti presenti all’interno di un post del blog, non sapevo bene come fare, ma mi sono fidato di Rails.
Dissi che non sapevo se quello che stavo per scrivere avrebbe funzionato, così scrissi:
<%= post.comments.count %>

la cosa più logica che mi venne in mente… e funzionò!

Ho approfittato dell’occasione per parlare di alcune buone abitudini di eXtreme Programming, e di come queste siano ben utilizzabili in Rails. Mi pento di non aver mostrato come fare Tdd (Test Driven Development), il problema è che forse non era la presentazione adatta e che non sono ancora padrone di questa tecnica sotto Rails.

Sono stato molto contento del feedback, oltre alle domande, ho ricevuto anche un paio di mail di ringraziamento e di richiesta di maggiori informazioni su Rails e sul varese-xpug!

Ora non mi rimane che imparare veramente bene rails!

Ciao Piero

-

Ps: Peccato che una slide conteneva dei bug…

Bigino per Rails

Ecco un piccolo bigino per Ruby on Rails, da tenere a portata di mano sulla scrivania…

Ruby on Rails bigino

Java multi-threading in four steps

Ecco un breve appunto per creare un’applicazione multi-threading in Java:

1) Definire una nuova classe che implementi l’interfaccia Runnable

public void Slave implements Runnable {

}

2) Inserisci un metodo run() in questa classe e inseriscici all’interno il codice che deve essere eseguito in parallelo

public void Slave implements Runnable {

public void run(){

MyApp.executeSomethingStatic();

}

}

3) Nella classe principale, che andrà eseguita parallelamente, inserisci il codice per avviare un nuovo thread della classe Slave:

Thread peasant = new Thread(new Slave()); /* Istanzio un nuovo oggetto di tipo thread */

t.start(); /* Lancio il thread*/

/* il codice presente qui sotto sarà eseguito subito dopo insieme al nuovo thread*/

4) OOOPPs! Chi mi garantisce che la classe principale non acceda alle stesse risorse dell’istanza di slave? (es MyApp)

/* Utilizziamo i metodi sincronizzati */

public class MyApp {

public synchronized void executeSomethingStatic(){

/* Risorsa per un solo thread alla volta */

}

}

Abbiamo implementato un piccolo esempio di thread in Java, utilizzando il metodo classico per questo genere di applicazione in Java.

Esistono però alcune librerie Java SE che permettono di giocherellare con i thread in maniera più simpatica: gli Executors.

Tramite gli executors, per esempio, posso creare un pool di thread facilmente:

public class SwimmingPool{

private int poolSize = 20;

private SwimmingPool(){

ExecutorsService pool = newFixedThreadPool(poolSize); /*Creo 20 thread differenti, che saranno utilizzati all’occorrenza, e non saranno terminati fino alla chiusura della vm*/

Future threadResult = pool.submit(MyApp); /* Restituisce il valore di ritorno di MyApp quando verrà terminata*/

}

}

Ora rifattorizziamo la classe MyApp… è molto semplice, basta cambiare l’interfaccia implementata: da “runnable” a “callable” e sostuire il metodo run() con call() e il gioco è fatto.

Utilità? Potrebbero essere molto utili per lo sviluppo di un server web, personalmente li ho usati per scrivere un piccolo schedulatore di processi.

Fatemi sapere se ho scritto qualche errore, capita ai migliori… figuriamoci ai peggiori :)

Ciao Piero