Sunday, March 16, 2008

Meeting XeDotNet: resoconto

Il viaggio di andata:
Trenitalia sempre peggio, treno strapieno che inteoria doveva avere l'obbligo di prenotazione peccato che ci fosse un sacco di gente che girovagava rimbalzata da un posto all'altro mano a mano che salivano le persone con la prenotazione.
Il Novotel e lo sponsor:
Albergo veramente bello, sala meeting adeguata e bem attrezzata la camera poi senza limiti, veramente figosa.
Il primo e secondo tempo (con tanto di supplementari):
La serata, a mio avviso anche se non dovrei essere io a dirlo, è andata abbastanza bene, anche se mi sono un po' rafffizzato sforando un tantino sui tempi.
L'argomento non era dei più semplici, con tanto codice non proprio adatto ad una sessione, ma direi che la platea a recepito abbastanza bene il messaggio.
Il terzo tempo:
Piacevolissimo post partita allo "Scarpon" in centro Mestre con il gruppo di XeDotNet.
Il "taxi":
Simpatico il taxi di ritorno dall'albergo alla stazione che è stranamente costato il doppio dell'andata e si è un po' scandalizzato quando gli ho chiesto una ricevuta del pagamento che alla fine non mi ha fatto... forse mi sarei dovuto insospettire della totale assenza di quel simpatico apperecchio che si chiama tassametro?
Come direbbe qualcuno: "bienveniuto... in italia..."
Il viaggio di ritorno:
No comment, EuroStar Italia completamente senza riscalmento...
Nel complesso sono decisamente soddisfatto dell'esperienza e non posso fare altro che ringraziare i ragazzi di XeDotNet per l'opportunità che mi hanno dato.
.m

Wednesday, March 12, 2008

[OT] TicketOne...

...è pietoso.
Ieri sera sono stato a vedere 'Le Cirque du Soleil' a Milano e la prevendita dei biglietti è stata affidata a TicketOne (non lo linko neanche non si merita hit per una polemica) che ha miseramente fallito.
All'esterno del DATCH Forum c'era una coda assurda per il rititro dei biglietti comperati online, la biglietteria ha aperto alle 21, con lo spettacolo che iniziava alle 21.15, e hanno aperto solo 2 casse che con una lentezza esasperante convertivano i vaucher cartacei in biglietti cercando a manina nel calderone delle buste... le operazione hanno richiesto 40 minuti, quindi spettacolo iniziato e incazzatura di quelle da paura.
Nonostante tutto lo spettacolo è stato decisamente degno di nota, anche se devo ammertterlo, non entusiasmante. Sono un appassionato di Musical tanto che sono riuscito ad orgnizzare week-end solo per andare a Londra a vedere il Fantasma dell'Opera, Cats, Fame, Starlight Express, Miss Saigon o Greese.
Questo show è un Mix tra un Musical e uno spettacolo dove la ginnastistica (intesa come acrobazia circense) e la fisicità la fanno da padroni ma purtroppo non è nessuno dei due lasciando un po' l'amaro in bocca.
Comunque se non avete mai visto nulla del genere non perdetelo, TicketOne a parte che meriterebbe solo una querela e una richiesta di risarcimento dei danni.
.m

Tuesday, March 11, 2008

Qualche esperimento con Entity Framework...

Sto cercando di comprendere Entity Framework in particolare per capire se ha senso pensare di svilupparci sopra e farci affidamento (anche se adesso è ancora in Beta3) per una applicazione "corposetta".
Sto partendo dall'ABC, quindi siate pazienti. la prima cosa che ho fatto è stata mettere in piedi una VM con Windows Server 2008, Visual Studio 2008 e un piccolo Sql Express 2005; ho poi installato EF beta3 e un update per VS2008 che mi ha permesso di installare i tool, ancora in CTP, per manipolare EF direttamente da VS2008.
Mi sono quindi creato un bel progettino console e da bravo bimbo stavolta ho letto le istruzioni, non è vero... sono partito con un esempio semplice senza cioè cercare di fare i tripli carpiati subito.
Ho quindi aggiunto un bel "Modello" a cui ho fatto generare le entity sulla base della struttura del buon Northwind, si lo so non si fa, ma io devo imparare quindi va bene così.
Alla fine ho scritto questo:
        using( MyModel.ModelContainer container = new MyModel.ModelContainer() )
        {
            var q = from customer in container.Customers
                    where customer.Orders.Count > 10
                    select customer;

            foreach( var c in q )
            {
                Console.WriteLine( c.CompanyName );

                if( !c.Orders.IsLoaded )
                {
                    c.Orders.Load();
                }

                Console.WriteLine( "    Orders: {0}", c.Orders.Count );
            }

            Console.Read();
        }
Ok non male anche se la necessità di verificare che Orders sia Loaded mi fa veramente schifo inoltre mi preme far notare che l'SQL generato è tutto tranne "intelligente":
SELECT
[Project2].[CustomerID] AS [CustomerID],
[Project2].[CompanyName] AS [CompanyName],
[Project2].[ContactName] AS [ContactName],
[Project2].[ContactTitle] AS [ContactTitle],
[Project2].[Address] AS [Address],
[Project2].[City] AS [City],
[Project2].[Region] AS [Region],
[Project2].[PostalCode] AS [PostalCode],
[Project2].[Country] AS [Country],
[Project2].[Phone] AS [Phone],
[Project2].[Fax] AS [Fax]
FROM ( SELECT
    [Extent1].[CustomerID] AS [CustomerID],
    [Extent1].[CompanyName] AS [CompanyName],
    [Extent1].[ContactName] AS [ContactName],
    [Extent1].[ContactTitle] AS [ContactTitle],
    [Extent1].[Address] AS [Address],
    [Extent1].[City] AS [City],
    [Extent1].[Region] AS [Region],
    [Extent1].[PostalCode] AS [PostalCode],
    [Extent1].[Country] AS [Country],
    [Extent1].[Phone] AS [Phone],
    [Extent1].[Fax] AS [Fax],
    (SELECT
        COUNT([Project1].[C1]) AS [A1]
        FROM ( SELECT
            cast(1 as bit) AS [C1]
            FROM [dbo].[Orders] AS [Extent2]
            WHERE [Extent1].[CustomerID] = [Extent2].[CustomerID]
        )  AS [Project1]) AS [C1]
    FROM [dbo].[Customers] AS [Extent1]
)  AS [Project2]
WHERE [Project2].[C1] > 10

Staremo a vedere, nel frattempo proseguo, tempo tiranno permettendo, con gli esperimenti.
.m

Tuesday, March 4, 2008

Trenitalia...

Sono sull'Eurostar da Milano per Bologna in viaggio verso la tappa bolognose del lancio di Visual Studio.
Oltre al semplice fatto che dovevamo essere in tre ma sono da solo, complice qualche problema e i soliti ritardi di Trenitalia: Raff è incastrato da qualche parte nelle lande desolate della pianura padana, quello che in realtà volevo sottolineare è che sono in 1° class, in un salottino "biz" ma nonostante tutto è un vero cesso, sporco da far paura e soprattutto scocciato e cucito alla "benemeglio"... ma sto biglietto mi è costato un botto, se facevo Orio al Serio <--> Bologna con RyanAir spendevo meno della metà...
Meritano di fallire e di andare tutti a casa (punto)
.m

Monday, March 3, 2008

System.AddIn: volete scoprire se fa per voi?

Il 14 marzo sarò a Mestre per l'evento di XeDotNet, la serata sarà tutta dedicata al nuovo e fiammante engine per la realizzazione di applicazioni a plugin (o come piace al team "AddIn"), cercheremo di capire quali sono le problematiche del mondo reale che hanno portato alla necessità di avere un framework per la gestione degli AddIn, del loro ciclo di vita e soprattutto, e questo è il vero problema, del versioning sia degli AddIn che dell'Host.
Vediamo un piccolo assaggio di quello di cui parleremo. La necessità, nata da un richiesta sui newsgroup Microsoft, è quella di gesire eventi eventualmente lanciati dagli AddIn all'interno dell'Host.
Per chi ha avuto modo di realizzare un'applicazione a plugin sa che questa non è certo una cosa scontata, il problema è che se l'applicazione è stata realizzata hostando gli AddIn in un appDomain separato di mezzo abbiamo l'infrastruttura di remoting che è tutto tranne che accondiscendente al veicolare eventi dal server verso i client.
In questa direzione il nuovo engine System.AddIn è una vera manna, possiamo infatti fare una cosa del genere:
namespace EventAddIn.Contracts
{
    [AddInContract]
    public interface IAddInContract : IContract
    {
        void DoSomething();

        [EventAdd( "AddInEvent" )]
        void AddInEventAdd( IAddInEvent handler );

        [EventRemove( "AddInEvent" )]
        void AddInEventRemove( IAddInEvent handler );
    }

    [EventHandler]
    public interface IAddInEvent : IContract
    {
        void Handler( IAddInEventArgs args );
    }

    [EventArgs( Cancelable = false )]
    public interface IAddInEventArgs : IContract
    {
        String Value { get; }
    }
}
Creiamo un contratto (IAddInContract) che ha, oltre ad un comunissimo metodo ha anche 2 strani metodi marcati con 2 strani attributi, se provate a compilare nonostante abbiate aggiunto le reference a System.AddIn e a System.AddIn.Contracts la compilazione fallisce miseramente perchè non è in grado di risolvere gli attributi EventAdd, EventRemove, EventHandlers e EventArgs. Questi fanno parte dei cosiddetti Pipeline Hints che vengono installati insieme al Pipeline Builder che è un fantastico tool che vi permette di generare tutta la Pipeline "a gratis" (come dicono a Bergamo ;-)), una volta aggiunta una reference a PipelineHint.dll potrete compilare e quello che otterete sarà una cosa del tipo:
static void Main( string[] args )
{
    IList<IAddIn> addins = new List<IAddIn>();

    String[] result = AddInStore.Update( PipelineStoreLocation.ApplicationBase );
    IList<AddInToken> tokens = AddInStore.FindAddIns( typeof( IAddIn ), PipelineStoreLocation.ApplicationBase );
    
    foreach( AddInToken token in tokens )
    {
        addins.Add( token.Activate<IAddIn>( AddInSecurityLevel.Internet ) );
    }

    IAddIn addin = addins[ 0 ];
    addin.AddInEvent += new EventHandler<AddInEventArgs>( addin_AddInEvent );
    addin.DoSomething();

    Console.ReadLine();
}

static void addin_AddInEvent( object sender, AddInEventArgs e )
{
    Console.WriteLine( e.Value );
}
...che funziona pure :-D
Allora ci si vede a Mestre?
.m