di .NET e di altre amenità

Enterprise Library v3 Feature Prioritization Survey

E' stato pubblicato un survey per decidere quali feature rendere prioritatie nella prossima release 3.0 di Enterprise Library. Forse è il caso di rispondere...

LINK: http://www.zoomerang.com/recipient/survey-intro.zgi?p=WEB225M39CYGVK

powered by IMHO 1.3

Tipi, proprietà e reflection

Ho letto il post di Lanny stamattina e ho deciso che probabilmente era il caso di postare un esempietto su come sia preferibile lavorare con la reflection per evitare i problemi più comuni. L'esempio di Lanny funziona ed è utile per capire come funziona la reflection, ma dovendo lavorare con essa è opportuno fare affidamento su una serie di classi belle e pronte che il framework mette a disposizione. Oltre a snellire il lavoro eliminando la necessità di riscrivere del codice che è già perfettamente funzionane, consentono soprattutto di avere un modo affidabile di operare conversioni di tipo senza incorrere nei comuni errori dovuti alla globalization. Ecco uno spezzone di codice commentato che mostra come creare un tipo, settarne le proprietà e operare delle conversioni da stringa a data utilizzando le comodissime TypeDescriptor e TypeConverter:

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Globalization;

namespace TestTipi
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
// ottengo il riferimento al tipo da istanziare
            
Type personType = 
                Type.GetType("TestTipi.Person, TestTipi");
            
            
// creo una istanza del tipo
            
object p = 
                TypeDescriptor.CreateInstance(
null, personType, nullnull);
            
            
// ottengo una collection delle property dell'istanzaa
            
PropertyDescriptorCollection personProperties = 
                TypeDescriptor.GetProperties(p);
            
            
// setto FirstName
            
PropertyDescriptor firstName = 
                personProperties.Find("FirstName", 
false);
            firstName.SetValue(p, "Andrea");

            
// setto LastName
            
PropertyDescriptor lastName = 
                personProperties.Find("LastName", 
false);
            lastName.SetValue(p, "Boschin");

            
// setto Birthday
            
PropertyDescriptor birthDay = 
                personProperties.Find("Birthday", 
false);
            TypeConverter converterToDate = 
                TypeDescriptor.GetConverter(birthDay.PropertyType);
            birthDay.SetValue(
                p,
                converterToDate.ConvertFromString(
                    
null
                    CultureInfo.CreateSpecificCulture("en-US"), 
                    "10/27/1968"));

            
// dump sulla console
            
Console.WriteLine(p);
            Console.ReadLine();
        }
    }

    
/// <summary>
    /// 
classina di test
    
/// </summary>
    
class Person
    {
        
private string firstName;
        
private string lastName;
        
private DateTime birthday;

        
public string FirstName
        {
            
get return firstName; }
            
set { firstName = value; }
        }

        
public string LastName
        {
            
get return lastName; }
            
set { lastName = value; }
        }

        
public DateTime Birthday
        {
            
get return birthday; }
            
set { birthday = value; }
        }

        
public override string ToString()
        {
            
return string.Format(
                "{0} {1} ({2})", 
                
this.FirstName, 
                
this.LastName, 
                DateTime.Now.Year - 
this.Birthday.Year);
        }
    }
}

Due note rapide sull'esempio: per creare l'istanza di un tipo è opportuno evitare l'uso di Assemply.LoadFrom() ovunque possibile. piuttosto è preferibile usare come nell'esempio la Type.GetType() passando il nome completo del tipo includendo anche version, culture e publickeytoken qualora l'assembly si trovi in GAC o sia firmato. Usare il riferimento al nome del file non è una buona politica perchè così facendo si esclude tutto il meccanismo di ricerca di fusion. La Type.GetType() è in grado di lavorare perfettamente anche con gli assembly autogenerati a patto che vengano messi in una directory che si trova nell'ambito del probing di fusion.

Secondo: convertire da stringa a qualsiasi tipo e viceversa è un'attività insidiosa tanto che nel framework ci sono svariati errori proprio su questo argomento. Meglio perciò usare la TypeConverter che per inciso è un grado di fare conversioni anche su tipi particolari come ad esempio le Unit. TypeDescriptor ha un bellissimo metodo GetConverter() che è in grado di istanziare l'opportuno convertitore semplicemente passandogli il tipo di destinazione. Okkio quindi che la Culture va passata SEMPRE!

Infine, attenzione ai null. Io nel post non ho messo alcun controllo per non risultare chilometrico, ma e' evidente che ogni volta che chiediamo di istanziare un tipo, un assembly, un convertitore, etc... dobbiamo verificare opportunamente che tutto sia andato a buon fine.

powered by IMHO 1.3

IMHO o non IMHO?

Ok, lo ammetto, sono stato preso in contropiede dall'uscita del nuovo e sfavillante Live Writer che - non ci vuole molto ad ammetterlo - surclassa e "seppellisce" definitivamente il mio IMHO 1.3. La domanda mi gira in testa da un po' di giorni ormai ma finalmente ho trovato il tempo di esprimerla su queste righe.

Continuo IMHO?

Ne ho parlato con parecchie persone in questi giorni, e i pareri sono molto discordi. Da chi mi dice chiaramente, "lascia perdere, non ha futuro" a chi invece invece mi incoraggia ad andare avanti e provarci lo stesso, probabilmente per affetto o magari perchè realmente crede che io ce la possa fare.

E' evidente che non abbiamo alcuna speranza di fare concorrenza a live writer, non fosse altro perchè non abbiamo un team di 20 programmatori. Le uniche speranze sono quelle di trovare una nicchia, in cui collocare Imho 2.0 oppure, quella che mi alletta di più di dare delle feature talmente innovative da superare le leccornie di live writer...

Il problema è che live writer è un prodotto nuovo che ha alle sue spalle la potenza di sviluppo e marketing di una azienda colossale, che in questo momento lo vede come uno strumento eccezionale per contrastare il suo diretto concorrente (Google). Per questo motivo, anche dovessi davvero inventare il ghiaccio bollente non ci vorrà molto per essere nuovamente superato.

Al momento sono molto dubbioso, nonostante stiamo lavorando alacremente sulla versione 2.0 che ha superato già le prime fasi del porting a nhibernate e che si avvia verso una prima release alpha a passi svelti. Avrei molte altre idee su cui investire, altri progetti che mi girano in testa, ma vi confesso che l'affetto che ho per questo progetto mi impedisce di chiuderlo definitivamente e repentinamente. Al momento perciò IMHO rimane vivo, nella speranza che altri vogliano aggregarsi al nostro team per dare il proprio contributo e che, il supporto che ho avuto in questi anni, non sia del tutto svanito.

Voi che ne pensate?

powered by IMHO 1.3

SqlServerCeDialect per NHibernate 1.2

Ho appena rilasciato sul sito di NHibernate una patch che consente l'utilizzo di NHibernate 1.2 Alpha 1 in collaborazione con Sql Server Everywhere. Il problema che ho riscontrato è che i dialetti definiti per SqlServer 2005 e per SqlServer 2000 fanno uso della funzione SCOPE_IDENTITY() per ottenere il valore della identity dell'ultimo record inserito. In Sql Server Everywhere invece questo valore deve essere ottenuto mediante l'uso della variabile @@IDENTITY. Inoltre, il database embedded, a differenza dei fratelli maggiori, non supporta l'esecuzione di più statement SQL nello stesso comando per cui la classica accoppiata insert + select non è valida. La patch che ho inviato al team di NHibernate a questo indirizzo risolve questi problemi, nella speranza che non ce ne siano altri.

http://jira.nhibernate.org/browse/NH-691

Ed ora IMHO può girare anche con NHibernate...

powered by IMHO 1.3

Letture di Luglio

Alcuni post orsono ho accennato alla lettura che mi ha occupato le assolate giornate di spiaggia. Si tratta di Getting Things Done, lo stupendo libro di David Allen che mi ha aperto gli occhi su quello che probabilmente sbaglio nell'organizzare il mio lavoro. GTD, questa l'abbreviazione del metodo perfezionato da David Allen in molti anni di pratica ha uno spirito davvero pragmatico e coerente con la realtà che ci circonda. Personalmente mi sono ripromesso di provarci, e attualmente mi sto organizzando al megli per reperire uno strumento che mi consenta di permeare tutta la mia vita, e non solo il lavoro di questo metodo. L'autore infatti parte da un presupposto che ai più potrebbe apparire esagerato, ma che a mio parere è solo la logica conseguenza di una corretta organizzazione. In effetti se tentiamo di introdurre il metodo di Allen solo in una parte della nostra vita, probabilmente sul lavoro ne deriverà uno sbilanciamento tale che in breve ci costringerà a lasciar perdere. Invece mi pare del tutto logico comprenetrare la vita lavorativa e la cosidetta "vita privata", di cui la prima è un aspetto rilevante, ma non necessariamente l'unico e più importante. Allen consiglia di pensare alle attività che vogliamo compiere come a progetto, ognuno dei quali composto da delle "azioni", necessarie a portarlo a termine. Nostro unico onere è quello di trovare la Next Action, per ognuno di essi, cioè l'azione immediatamente necessaria e fattibile perchè esso venga portato di un passo verso il compimento. Così, di passo in passo, le ferie con la famiglia, il traguardo personale, o il progetto di lavoro, ognuno con la giusta dose di analisi arriveranno naturalmente ad un traguardo che invece non sempre è così alla portata di mano. Forse sto un po' estremizzando. D'altronde sono fresco di lettura e non l'ho ancora provato, ma quello che mi ha più colpito di questo libro è un'affermazione talmente ovvia che ai più può apparire scontata, ma che invece ognuno di noi sa che spesso è disattesa. L'autore dice semplicemente: "prima di fare qualsiasi cosa occorre pensare". Banale vero? Ma voi lo fate sempre?

powered by IMHO 1.3

Some news about... IMHO 2.0!

E nei primi freddi di Agosto (?) e' giunto il momento che metta al corrente tutti delle novità che riguardano il mio progetto IMHO, che oramai molti potrebbero considerare quasi-defunto dato che da tempo non se ne sa più nulla. IMHO invece è ancora vivo, perlomeno respira, ma dopo un periodo di congelamento dovuto allo scarso tempo a disposizione sta per riprendere il via. Questo grazie soprattutto al fatto che da alcune settimane si è unito a me nello sviluppo Mauro Servienti, che ha risposto all'appello che qualche tempo fa ho lanciato sul mio blog. IMHO perciò non sarà più solo il mio progetto.

Attualmente ci stiamo allineando su quello che già esiste, e abbiamo abbozzato una divisione dei compiti che dovrebbe vedere Mauro occuparsi della parte client e io della parte server. Non siamo ancora in grado di prevedere una data di rilascio dato che non abbiamo nemmeno provato a quantificare il lavoro, ma sono fiducioso che ora la spinta di due persone possa portarlo avanti molto rapidamente, almeno nella versione che abbiamo definito "Personal". IMHO, soffre attualmente di alcuni problemi che dovremmo affrontare per primi in modo da rimetterlo in carreggiata. Primo fra essi l'adozione di NHibernate come motore di Mapping, in sostituzione di iBatis che è un po' troppo "macchinoso". L'adozione di NHibernate sarà resa possibile dal cambio della base dati che passerà da Access, probabilmente a SQL Everywhere, per la versione base. Infine, ma questo sarà un problema che dovrà affrontare soprattutto Mauro, ci dovremmo scontrare con la prossima "sparizione" del controllo DHTML Edit, che era il cuore del precedente software. Infatti pare che da Internet Explorer 7.0, per motivi legati alla sicurezza questo controllo non sarà più disponibile e saremo costretti a trovarne un valido sostituto.

Ma a proposito di IMHO c'è un'altra importante notizia. Pochi sanno che IMHO 2.0 aveva trovato posto sul sito gotdotnet, anche perchè non mi ero mai preoccupato di divulgare la notizia. Mi faceva comodo lavorare con un backup dei sorgenti in remoto e non avevo mai nemmeno usato le altre feature di GDN. Oggi però vale la pena che informi tutti che IMHO 2.0 è da poco ospitato da Codeplex, dato che Korby Parnell e la sua collaboratrice Julie Sander hanno deciso che ha le carte in regola per farne parte. Codeplex, a prima vista pare proprio ben fatto, sarà forse per il fatto che ormai mi sto abituando a Team Foundation Server che uso anche sul lavoro, ma dove dire che la versione web è proprio venuta bene. Spero che ci auguriate un buon lavoro, e se per caso avete voglia di darci una mano... qualcosa da fare lo troviamo di certo.

powered by IMHO 1.3

Maniaci della chat? Provate Kool IM

Kool IM è una applicazione Ajax, che consente di collegarsi contemporaneamente a diversi servizi di instant messagging. Tra questi Yahoo, GMail, Msn, ICQ  e AIM.

Link: http://www.koolim.com/

powered by IMHO 1.3

We are prisoners

go to English Translation

We are prisoners! Con questa frase ho risposto ad Anthoula, la proprietaria della taverna Greca in cui io e la mia famiglia abbiamo trascorso una delle più belle serate delle recenti vacanze. Anthoula mi chiedeva da dove venivamo. Probabilmente era la seconda volta che ci vedeva in zona, e il braccialetto fosforescente che portavamo al polso ci contraddistingueva in un modo che contrastava fortemente con le persone che normalmente frequentavano la sua taverna. Non è frequente in effetti che gli ospiti di un villaggio turistico si spingano su quella costa, che i tour operator (probabilmente per fortuna) omettono di nominare.

Eppure Agios Theologos è di gran lunga la spiaggia più bella e selvaggia che abbia visto sull'isola di Kos. Inospitale, con i suoi sassi battuti dalle onde incessanti. Spazzata costantemente da un vento insistente che si fatica a decidere se dia sollievo o fastidio. Agios Theologos, però riserva delle sorprese davvero piacevoli: mia figlia ha molto apprezzato gli ampi inserti sabbiosi e gli spazi liberi che gli hanno permesso di correre a rotta di collo fino ad essere stremata. Ma non solo, quello che più sorprende è un'acqua quasi tiepida, nonostante il continuo moto ondoso, e un fondale sabbioso che digrada lentamente consentendo di bagnarsi piacevolmente nonostante le alte onde, che invece si trasformano in divertenti compagne di gioco. Ma quello per cui più ricordo con piacere la spiaggia di Agios Theologos, che ho potuto frequentare per una sola giornata, è la totale, palese, quasi opprimente assenza del chiasso delle spiagge più in voga. Più di cento metri di distanza tra gli scarsi bagnanti, nessun rumore estraneo di motoscooter, motoscafi, musiche martellanti. Il giorno dopo ho avuto l'idea di andare a vedere la spiaggia di Paradise Beach, quella che viene continuamente consigliata dagli incaricati dei Tour Operator. Altro che "Paradiso"... un inferno di ombrelloni sul quale lanciando uno spillo si riscia di far male a qualcuno.

We are prisoners... la frase mi è uscita spontanea, mentre alzavo il polso scuotendo leggermente il braccialetto. Anthoula ha sollevato lo sguardo dal notes e si è aperta in un sorriso di solidarietà e ha preso a raccontarmi cosa significa per un'isola come Kos lo scacco dei villaggi turistici. Vi propongo un esercizio; andate alla vostra agenzia turistica di fiducia e chiedete di prenotare uno "Studios", un appartamento, presso una delle isole delle Cicladi o del Dodecanneso. La risposta invariabilmente sarà che non ci sono appartamenti liberi, ma che si può solo andarci in villaggio. Anthoula mi ha confessato che a Kefalos, la piccola cittadina che un tempo era la capitale di kos, ci sono più di 200 appartamenti, completamente liberi che nessuno degli isolani riesce ad affittare. Perciò sono costretti a lavorare per uno stipendio da fame per le strutture messe in piedi dai tour operator.

Mi perdonino Anthoula, Babby (la sua socia), e tutti gli abitanti dell'isola di Kos. Non mi permetterò mai più di frequentare queste strutture alienanti, queste catene di montaggio del turismo, e condannare così loro ad essere schiavi, e me stesso a perdere la bellezza di una chiacchierata come quella che queste semplici persone mi hanno regalato. Agios Theologos mi è rimasta nel cuore, così come mi è rimasta nel cuore la più bella giornata di una vacanza che altrimenti sarebbe stata di totale inutilità. Arrivederci.

powered by IMHO 1.3