Mauro is moving: a new life has come


…alla fine il momento è arrivato, si cambia!

The journey is the most important thing, not the destination.
Find your next destination and start travelling again.

Negli ultimi mesi sono successe parecchie cose, proprio parecchie, un viaggio è finito e ne sta per iniziare un altro.

Dal 1° di febbraio Mauro lascia Managed Designs per iniziare una nuova e stimolante avventura con Gaia dovre andrà a fare un sacco di cose, note e meno note :-), occupandosi, tra le tante cose, delle sue grandi passioni: TFS e Wpf.

L’idea di una nuova avventura è decisamente stimolante e quello che c’è sul piatto lo è ancora di più non vedo l’ora di iniziare a lavorare con il nuovo gruppo.

Volevo ringraziare pubblicamente Managed Designs, Andrea e tutto il team che mi ha insegnato parecchio dandomi l’opportunità di vivere un’esperienza decisamente interessante e profiqua. Grazie e ancora grazie!

I prossimi quindici giorni saranno frenetici e decisamente pieni, ho avuto anche la bella idea di dire si a questo gruppo di matti :-) giusto perchè non ho nulla da fare…

--

Ma non è tutto anche questo blog si sposta (http://milestone.topics.it), e qui la motivazione è solo ed esclusivamente legata al fatto che quello su Ugi non va più :-(

Un paio di note tecniche:

  • per chi ha sottoscritto il feed direttamente su feedburner il passaggio è indolore e già effettivo;
  • per ha sottoscritto il feed di Ugi e vuole continuare a seguirmi è meglio se sottoscrive il nuovo feed: http://feeds.feedburner.com/tpx
  • per chi legge solo il muro, mi spiace ma non ci sarò più… magari chi legge solo il muro è felice :-)

Ho in coda una montagna di post-fiume e qui adesso posso darci dentro alla grande!

Ne approfitto per ringraziare anche Ughetto che mi ha gentilmente sponsorizzato dandomi l’opportunità di usare Dexter.

.m

author: Mauro Servienti | posted @ venerdì 15 gennaio 2010 12.16 | Feedback (1)

Torino


In questi ultimi mesi mi capita di andare avanti e indietro da Torino molto spesso e ormai approfitto delle frequenti visite anche per scopi culturali, finora ho avuto l’occasione di visitare:

  • Il Museo Egizio;
  • il Palazzo Reale, in 2 tranche, con una visita guidata al secondo piano e una visita guidata alle cucine;
  • l’Armeria Reale (notevole);

Sono rimasto piacevolmente colpito dall’organizzazione e dal rapporto qualità prezzo decisamente favorevole, il pacchetto comulativo per le visite a Palazzo Reale è costato 10€ che, per 2 visite guidate di circa 1h l’una, direi essere veramente a buon mercato.

Compliementi, la città merita.

.m

author: Mauro Servienti | posted @ lunedì 7 dicembre 2009 10.33 | Feedback (4)

Premessa: doverosa :-)


…che in quanto tale forse andava fatta prima… :-)

Approfitto dell commento di Nicolò per farla adesso, nonostante ne abbia già parlato anche se mi rendo conto solo ora che probabilmente annegata in un discorso ampio e complesso la cosa possa passare inosservata.

Attenzione… :-)

Osservate il post di Corrado sulla localizzazione:

imageimage

Se provate, in un qualsiasi punto del ViewModel, a scrivere “this.LocalizedText.” scoprite che l’intellisense non vi fa vedere un bel nulla…eppure questo funziona che è un piacere:

image

Come è possibile?

Il giochetto è abbastanza semplice ed è basato su qualcosa che esiste da che mondo è mondo nel framework: Reflection.

Buffaldino e pure un po’ sacripante :-)

Se però andiamo a spulciare un po’ meglio scopriamo che non è sempre così… esiste infatti un sistema, che ad esempio la PropertyGrid usa massicciamente, ben più sofisticato: TypeDescriptor;

Il motore di Data Binding di Wpf utilizza un TypeDescriptor nel momento in cui l’oggetto (la sorgente dati) con cui deve andare in binding implementa l’interfaccia ICustomTypeDescriptor.

Ciack si gira!

public class MyCustomEntity : ICustomTypeDescriptor
{
    public PropertyDescriptorCollection GetProperties( Attribute[] attributes )
    {
        throw new NotImplementedException();
    }

    public PropertyDescriptorCollection GetProperties()
    {
        return this.GetProperties( null );
    }

Facciamo la cosa più semplice possibile, implementiamo su una nostra entità l’interfaccia ICustomTypeDescriptor, noterete che ha una pletora di metodi che in un contesto di data binding fortemente basato su proprietà possiamo tranquillamente ignorare.

Essenziale è implementare i 2 metodi GetProperties() implementazione in cui possiamo tranquillamente demandare tutto il lavoro a uno dei 2 oveload, credo non esista nessuno nel framework (forse la sola PropertyGrid) che chiami l’overload di GetProperties che prende un array di attributi passando qualcosa di diverso da null.

Quello che dobbiamo ritornare è una lista di PropertyDescriptor che essendo però abstract non può essere usata direttamente:

public class MyCustomPropertyDescriptor : PropertyDescriptor
{
    public MyCustomPropertyDescriptor( String propertyName, Type propertyType )
        : base( propertyName, null )
    {
        this._propertyType = propertyType;
    }

    public override bool CanResetValue( object component )
    {
        return false;
    }

    public override Type ComponentType
    {
        get { return typeof( MyCustomEntity ); }
    }

    public override bool IsReadOnly
    {
        get { return false; }
    }

    public override void ResetValue( object component )
    {
        throw new NotSupportedException();
    }

    public override bool ShouldSerializeValue( object component )
    {
        return false;
    }

    Type _propertyType;
    public override Type PropertyType
    {
        get { return this._propertyType; }
    }

    public override object GetValue( object component )
    {
        return "Hello World!";
    }

    public override void SetValue( object component, object value )
    {
        
    }
}

Lascio a voi il tedioso lavoro di scoprire su MSDN il significato, che direi intuitivo, dei vari metodi e delle proprietà.

I due metodi fondamentali sono GetValue e SetValue, quest’ultimo chiamabile solo se IsReadOnly è false; quello che succede a runtime è che:

  • l’infrastruttura di binding si accorge che l’istanza che ha in mano come data source implementa ICustomTypeDescriptor;
  • Sull’istanza che ha per “le mani” chiama GetProperties(), o meglio chiama TypeDescriptor.GetProperties( instance ) lasciando al TypeDescriptor l’onere di maneggiare un ICustomTypeDescriptor, per avere l’elenco delle proprietà supportate, e qui potete spudoratamente mentire :-);
  • Sulla base della binding expression va alla ricerca della proprietà tra quelle che avete generato e chiama GetValue passandovi l’istanza del componente (la data source) per cui vuole ottenere il valore. Stesso discorso per SetValue();

A questo punto è facile immaginarsi che in quel GetValue() potete fare il bello e cattivo tempo. Il discorso è molto diverso, e pure molto più complesso, se volete prendere in considerazione anche una chiamata di questo tipo:

TypeDescriptor.GetProperties( typeof( MyCustomEntity ) );

Questa da ingannare è decisamente peggio, fattibile (forse) ma molto complessa, e per ora il gioco non vale la candela… ma io non mollo! :-P

Adesso che avete un’abbozzo di infrastruttura potete provare ad usarla:

public PropertyDescriptorCollection GetProperties( Attribute[] attributes )
{
    var property = new MyCustomPropertyDescriptor( "Foo", typeof( String ) );
    return new PropertyDescriptorCollection( new[] { property } );
}

e da Wpf/xaml fare una cosa del tipo:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="Window1" Height="300" Width="300">
    <Window.DataContext>
        <local:MyCustomEntity />
    </Window.DataContext>
    <Grid>
        <TextBlock Text="{Binding Path=Foo}" />
    </Grid>
</Window>

Adesso…:

  1. aprite la stessa solution con un altro Visual Studio (il debuggatore);
  2. dal debuggatore attaccate il debugger al Visual Studio di partenza;
  3. dal debuggatore piazzate un po’ di breakpoint;
  4. provate dal “debuggato” ad aprire il designer visuale della Window1.xaml… :-)

Ne riparleremo abbiate fede… :-)

.m

Technorati Tags: ,

author: Mauro Servienti | posted @ domenica 6 dicembre 2009 23.15 | Feedback (0)

una volta si e una no…


… chissà adesso per quanto tempo non funzionerà più.

Sono riuscito a postare ma ha subito rismesso di funzionare…

.m

author: Mauro Servienti | posted @ giovedì 3 dicembre 2009 13.52 | Feedback (2)

[OT] Pensieri sparsi… #3


  • è curioso come la diversità per molti sia un problema anche se apparentemente fanno di tutto per nasconderlo;
  • l’altra sera ho assistito ad una scena di altri tempi, una coppia (Peruviana direi, anche se è solo parzialmente importante) cenava in un ristorante del mio paese era l’emblema della felicità nonostante l’aspetto comunicasse che evidenti disagi quotidiani facessero parte della loro vita, la felicità che però emanavano in quel momento mi ha ricordato che ormai noi diamo per scontate troppe cose, troppe;

.m

author: Mauro Servienti | posted @ giovedì 3 dicembre 2009 13.48 | Feedback (1)

Interessante e decisamente inutile


Da un po' non bloggo, o meglio ne ho una paccata in coda, ma non c'è mezzo di postare più nulla e sinceramente di mettermi a bloggare on-line non ne ho proprio nessuna voglia.

La domanda, decisamente polemica ma mi sono stufato di non esserlo, che mi faccio è:

  • possibile?
  • possibile non avere mezzi per sapere quello che succede, posti... non va... il log tace... nessun errore... ma non va?
  • posti su un altro blog e funziona tutto come si deve, quindi dove e cosa devo cercare?

.m

author: Mauro Servienti | posted @ domenica 29 novembre 2009 14.24 | Feedback (8)

Fantastico!


throw new ServiceException( "Error sending e-mail, but e-mail sent successfully" );

e pure affascinante :-)

.m

author: Mauro Servienti | posted @ mercoledì 25 novembre 2009 14.48 | Feedback (3)

Chi sa se così mi vuole bene...


Da stamattina Subtext mi rimbalza i post scritti con Windows Live Writer... o meglio WLW postare posta ma poi qui non compare un bel nulla, senza il benchè minimo errore.

Figo :-)

Vediamo che succede a postare dall'interfaccia web...

<update>
non se ne parla neanche... da WLW continua a non funzionare...
</update>

.m

author: Mauro Servienti | posted @ mercoledì 25 novembre 2009 8.58 | Feedback (2)

Un doveroso grazie :-/


…a quel simpaticone, sinonomo di strunz, che in metropolitana ha cercato di estrarmi 2 costole, dalla loro sede naturale, salendo sul treno… mentre io scendevo…

Tutto quello che si è limitato a fare è stato “salutarmi” con aria sconsolata da dentro la carrozza senza neanche pensare di scendere, per fortuna che un disponibilissimo signore marocchino (e sottolineo marocchino) si è premurato di capire se da “per terra” dove stavo riuscivo ancora a respirare… shukran.

Al simpaticone direi che… meglio che non mi pronunci :-)

.m

author: Mauro Servienti | posted @ martedì 24 novembre 2009 18.42 | Feedback (7)

Sviluppare per Windows Mobile su una macchina x64…


…è praticamente impossibile, mettevi l’anima in pace :-) ma non tutto è perso, altrimenti che scriverei a fare?

Il problema di fondo è che per sviluppare in maniera decente per Windows Mobile avete 2 requisiti:

  • che l’emulatore sia in grado di connettersi alla rete e qui sorgono i primi problemi perchè l’emulatore usa il driver di rete di Virtual PC 2007 che purtroppo non convive felicemente con Windows Virtual PC su Wiundows 7;
  • che il Cellular Emulator faccia il suo fantastico sporco lavoro e qui proprio non c’è mezzo perchè il Cellular Emulator non parte neanche su una macchina x64…

VMware Workstation

il tentativo, riuscito, è stato quello di spostare l’ambiente di sviluppo in una macchina virtuale:

  • ho installato Windows 7 x86;
  • ho installato Visual Studio 2008 e tutto quello che serve per lo sviluppo mobile, SDK compreso;
  • ho installato, con successo e con sorpresa, Virtual PC 2007 Sp1 x86 dentro la macchina virtuale;

e il risultato è questo:

vm

dove si vede l’emulatore connesso a internet con una “incoming call”.

.m

author: Mauro Servienti | posted @ martedì 24 novembre 2009 11.20 | Feedback (4)