Beren.it

All that you can leave behind

La mia Africa... un anno dopo!

Sabato scorso in preda alla necessità di rievocare la bella vacanza di un anno fà esatto in Africa, mi scervellavo sul cosa scrivere e come scrivere ciò che dal cuore mi giungeva forte, in emozioni e sensazioni. E così, presi tastiera e notepad, mi riversavo nello scrivere qualcosa che però aveva poco di spontaneo e alcunchè di emozionante. Al che dopo aver spostato sull'HD esterno queste mie parole, un pò vuote, mi accingevo ad altre mansioni, senonche in preda ad un attacco di demenza senile con il piede urtavo il cavo dell'HD e lo facevo cadere rovinosamente in terra. Vabbè poco male, direte voi, dopotutto non hai perso ne un Campiello ne un Pulizer o un o Strega. Vero. Non fosse che in quel ammasso di silicio putrefatto esalassero gli ultimi respiri tutte le mie foto, documenti, mp3, film, etc...

Bene, questa è la faccia giusta!. Sconforto, terrore e tragedia!!! Naturalmente il buon vecchio HD una volta alimentato nuovamente e riconnesso al PC non dava più nessun segnale di vita. A questo punto, altro sconforto, altra tragedia. Ma non mi perdo d'animo e con un programma per ritrovare i file cancellati riesco a ritrovare su un altro HD tutte le foto perse, che avevo cancellato nello spostarle proprio su quello defunto. Giubilo, vittoria, trionfo!!! Poi però guardando meglio notavo che paradossalmente proprio quelle del Kenya non le ritrovavo. Al che mi sovviene che effettivamente su quel disco non c'erano mai state perchè le avevo riversate dalla fotocamera direttamente nell'HD defunto.

Terrore, rabbia, sdegno, morte, disgrazia. Passo così altri due giorni a struggermi nel dolore di non poterle più avere... Poi, questa sera, il lampo: e se riuscissi a rimediarle dalla memoria cancellata della fotocamera? Si, in effetti fortunatamente, ho due memorie, che uso in maniera alternata e tenendo conto che la fotocamera non la uso mai, qualche debole speranza mi tiene ancora in vita. Però, subito la probabilità si dimezza: una memoria l'ho utilizzata una settimana fa al concerto di Mark Knopfler e sono quasi sicuro di averla praticamente sovrascritta completamente.

Corro in mansarda. Bestemmio: "Dove caz.. ho messo la fotocamera?". Attimi di nebbia assoluta poi... Si eccola, vado diretto sulla memoria di riserva che tengo nella tasca anteriore della custodia. Trovo la memoria la apro e la inserisco nel PC. Incrocio le dita aspettandomi di trovare la cartella vuota e già apro il software che in questi giorni mi ha salvato ripetutamente la vita.

Plim! si apre la finistra di dialogo per la visualizzazione dei file sui dispositivi esterni. "Mah si, ok sarà vuota, però diamoci un occhio... non si sà mai". Altro che vuota, la cartella è piena di foto... Già, ma quali? Le icone non mostrano l'anteprima, quindi a colpo d'occhio vado a cercare la colonna della data: Agosto 2009... il periodo è quello!
Ho il cuore in gola, mi faccio coraggio e clicco su di una: BINGO!!!! O forse dovrei dire JAMBO... Ad ogni modo le foto del Kenya, in tutto il loro splendore. Tutte. Non ne manca una! Non le avevo nemmeno cancellate!

E così ora me le riguardo tutte, una dopo l'altra. Sono bellissime. Una lacrima di commozione mi fa urlare di gioia.

Morale della favola: Backuppate gente Backuppate!

Jambo, jambo bwana Habari gani, Nzuri sana. Wageni, wakaribishwa Kenya yetu, Hakuna Matata. Kenya nchi nzuri, Hakuna Matata Nchi ya maajabu, Hakuna Matata Nchi yenye amani, Hakuna Matata Hakuna Matata, Hakuna Matata Watu wote, Hakuna Matata Wakaribishwa, Hakuna Matata Hakuna Matata, Hakuna Matata

No, forse la morale è un pò diversa: le cose belle non se ne vanno mai, anche se passa il tempo rimangono e danno emozioni anche se riviste da lontano e... probabilmente anche senza bisogno di rivederle!

JAMBOOOOOOOOOOO

Classi Obsolete in C#

Durante il ciclo di vita di un software pò accadere, ed in effetti succede non di rado, che alcune classi vengano migliorate, ampliate o, in genere per motivi di compatibilità con il passato, affiancate da nuove versioni delle stesse. In questo caso, per dare evidenza allo sviluppatore di usare la nuova versione, è possibile in C# contrassegnare con l'attributo Obsolete la vecchia classe.

L'esempio di codice seguente illustra un semplice caso:

[C#]

[Obsolete("This class is obsolete; use class B instead")]
class A
{
   public void F() {}
}

class B
{
   public void F() {}
}

class Test
{
   static void Main() {
      A a = new A();       // Warning
      a.F();
   }
}

La classe A è marcata come obsoleta, questo significa che quando verrà instanziata il compilatore genererà un warning con il testo specificato nel tag obsolete che la decora.

Il costruttore dell'attributo oltre alla stringa che verrà visualizzata con il Warning offre anche un parametro booleano aggiuntivo che impone al compilatore di non effettuare l'escape sui caratteri speciali. In generale questo parametro dovrà essere tenuto a false (che è il default) a meno che non siano necessari comportamenti particolari, che andranno in ognicaso gestiti con molta attenzione.

Throw e Throw ex: le differenze

Nell'ambito della gestione delle eccezioni con il framework .NET è opportuno spendere due parole per capire come, in linea di massima, un'eccezione debba venire gestita e le modalità per farlo. Tutti sanno che per gestire un'eccezione durante l'esecuzione di un frammento di codice occorre inserirlo all'interno di un blocco try-catch. In questo modo al verificarsi un eccezione potremmo eseguire del codice dedicato in base anche alla tipologia dell'eccezione stessa. Calandoci però in un caso particolare voglio parlare di una parte specifica della gestione delle eccezioni definita "exception bubbling".

"Exception bubbling" è un'espressione abbastanza intraducibile che si riferisce alla possibilità di risollevare l'eccezione dopo aver eseguito le operazioni custom nel catch, per consentire di lavorare con l'eccezione anche esternamente al metodo in cui l'eccezione è avvenuta. Ed è proprio a questo proposito che qualora non si tenga in considerazione di alcune accortezze si potrebbe incappare in problematiche non di poco conto in fase di debugging.

Si prenda ad esempio in considerazione il frammento di codice qua sotto:

[C#]

try
{
    // esecuzione di una qualche operazione che fallisce
}
catch (Exception ex)
{
    // effettuare un cleanup
    throw ex;
}

Questo è certamente uno dei casi più comuni nella gestione di un eccezione: c'è un parte dedicata alla gestione dell'eccezione (detta cleanup) e quindi, al termine l'eccezione viene rilanciata.

E' un pò meno comune invece vedere qualcosa di simile:

[C#]

try
{
    // esecuzione di una qualche operazione che fallisce
}
catch (Exception ex)
{
    // effettuare un cleanup
    throw;
}

All'apparenza queste due gestioni sembrano molto simili in realtà nascondono una notevole differenza per quanto riguarda le informazioni dello Stack Trace. In pratica analizzando in debug le due situazioni si scopre che nel primo caso lo stack trace verrà troncato al di sotto del metodo in cui è raccolto il catch con il risultato che sembrerà che l'eccezione sia stata generata proprio dal vostro codice. Infatti in questo modo è come se screaste una vostra propria eccezione.

Utilizzare invece il semplice "throw" vi consentirà di preservare tutte le info dello stack. Tutto ciò è ancora più chiaro se si guardasse il codice IL generato che a fronte di un "throw" del primo caso userà un "rethrow" nel secondo.

Questo però non significa affatto che in generale il "throw ex" non debba mai venire utilizzato. Anzi, qualora si vogliano aggiungere informazioni aggiuntive oppure generare un nuova eccezione personalizzata è opportuno utilizzare questo approcio con l'unica accortezza, onde evitare il problema del troncamento dello stack, di passare l'eccezione originale nel costruttore della nuova in modo da salvare i dati dello stack all'interno dell'inner exception:

[C#]

try
{
    // esecuzione di una qualche operazione che fallisce
}
catch (Exception ex)
{
    // effettuare un cleanup
    throw new ApplicationException("L'operazione è fallita!", ex);
}

A conclusione di questa breve analisi elenco tre punti che possono essere utili nella gestione delle eccezioni:

  1. Catturare solo le eccezioni per le quali si debba effettuare una sorta di cleanup e che abbiano una certa importanza
  2. Per alzare nuovamente l'eccezione usate il throw
  3. Se doveste generare una nuova eccezione personalizzata oppure aggiungere qualche informazione a quella originale ricordatevi sempre di passare anch'essa onde perdere le info dello stack.

 

Aggiungere un collegamento al comando "Invia a"

Tra le poche opzioni che fornisce il menu contestuale di Windows "Invia a" ("Send To" per chi mastica l'inglese) è senza dubbio di una certa comodità. Infatti tra i comandi forniti ci sono alcune tra le funzionalità più ricorrenti ed utilizzate che consentono di risparmiare diverso tempo:

  • Compressed (zipped) Folder
  • Desktop (create shortcut)
  • Mail Recipients
  • My Documents
  • CD Drive

Nei giorni scorsi mi è capitato però di pensare quanto potesse essere utile aggiungere delle altre funzionalità a questo menu: nel mio caso durante gli sviluppi di un software ad esempio mi capitava spesso di dover copiare file appena generati dal compilatore in una cartella specifica, e per quanto il buon vecchio "Copia e Incolla" faccia sempre il suo porco lavoro spesso la ricerca della cartella corretta nell'explorer o semplicemente tra le mille aperte comportava inutili e tediose perdite di tempo. "In effetti - mi sono detto - sarebbe davvero comodo fare click sull'oggetto ed inviarlo direttamente alla cartella che mi serve". Detto e fatto. Dopo una breve ricerca su internet scopro che la ocsa è semplicissima.

In effetti è sufficiente individuare il folder "Invia a" e quindi una volta cliccato con il tasto destro sull'icona della cartella che si vuole includere nell'elenco dei comandi accessibili, trascinarla all'interno della cartella "invia a" stessa. Una volta rilasciato il tasto destro verrà chiesto se si vuole creare un semplice collegamento. Cliccando SI il collegamento sarà da ora incluso nell'elenco delle opzioni di "Invia a".

Questa è la lista in sequenza delle operazioni da fare:

  1. Aprire in una finestra la cartella che contiene la cartella che vole includere nell'"Invia a"
  2. Localizzare la cartella "Invia a" nel pc:
    • Windows XP, Windows Server 2003 e precedenti: C:\Documents and Settings\<user name>\SendTo
    • Windows 7: C:\Users\<user name>\AppData\Roaming\Microsoft\Windows\SendTo
  3. Cliccare con il tasto destro sulla cartella per la quale si vuole creare il collegamento e quindi trascinarla nella cartella del punto precedente (creando un semplice collegamento)

 

Tutto molto semplice. Tenete conto che funziona anche linkando semplici eseguibili, anche se non è ovviamente il modo più ortodosso, può essere comunque assai utile.