di .NET e di altre amenità

IEnumerable Tales: Oltre le query expressions

Le query expressions di C# 3.0 che di solito si usano per comporre le query di LINQ sono in realtà una facility che permette di ottenere una maggiore leggibilità del codice. Esse infatti vengono tradorre dal compilatore in una sequenza di chiamate ad Extension Methods che poi viene eseguita runtime.

Questo preambolo serve per introdurre in voi il dubbio che le query expressions abbiano qualche limite che possiamo superare facendo uso diretto dei metodi. Un esempio è dato dalla clausola "where" che a prima vista è esaustiva. Un esame più approfondito del relativo metodo Where() ci rivela che quest'ultimo ha due overload, e che solo uno dei due mappa direttamente la query expression. Il secondo metodo accetta come argomento una lambda expression che espone non solo l'elemento ma anche il suo indice nella collection.

Ecco un esempio di quello che possiamo fare:

   1: public static void Main(string[] args)
   2: {
   3:     var r1 = from name in stars
   4:              where name.StartsWith("Gamma")
   5:              select name;
   6:  
   7:     var r2 = stars.Where((name, index) => name.StartsWith("Gamma") && index % 2 == 0);
   8:  
   9:     Display(r1);
  10:     Console.WriteLine("**************************");
  11:     Display(r2);
  12:     Console.ReadLine();
  13: }

La variabile "stars" del mio esempio è un array di stringhe che contiene una serie di nomi di stelle. Per brevità l'ho omessa. Nell'esempio abbiamo che r1 viene valorizzato con una normale query expression mentre per r2 si fa uso del secondo overload di Where(). In questo modo si riesce a selezionare solo gli elementi pari. Si tratta di un esempio semplice, ma rivela che conviene approfondire bene lo strumento perchè ha dei risvolti nascosti che devolo essere rivelati.

Technorati Tag: ,

News: MSDN Code Gallery

Somasegar ha oggi la disponibilità di , un'area del sito MSDN dove sono pubblicati (e dove è possibile pubblicare) esempi di codice, snippet, e risorse varie.

The MSDN Code Gallery is a portal for snippets, samples and other resources.  In it you can find pages that describe samples and supporting documents including screenshots and design documents.  In addition, you will find hosted conversations about these samples, sample projects or other resources that have been provided to the community.  This destination is open to the entire community to contribute content to.

Attenzione però a non confonderlo con

IEnumerable Tales: Ordinare con LINQ un IEnumerable per una proprietà scelta dinamicamente

Poniamo di avere una collection di nostre custom entities che implementa IEnumerable<T> e poniamo di doverla ordinare rispetto ad una proprietà. Se ad esempio la entity rappresenta una riga ordine potremmo dover ordinare le righe per codice prodotto; con LINQ faremmo una cosa del genere:

   1: public void SortRowsBySKU(IEnumerable<OrderRow> rows)
   2: {
   3:     return from item in rows
   4:         orderby item.SKU ascending
   5:         select item;
   6: }

Linq è decisamente vantaggioso, e ci risparmia un bel po' di lavoro. Ma poniamo per un momento di dover ordinare ora la stessa collection per la proprietà Price, e magari dare all'utente la possibilità di scegliere la colonna a runtime. Ovviamente sarebbe una pessima idea creare una query per proprietà. Il codice diventerebbe inutilmente proolisso e poco manutenibile. Per parametrizzare la clausola di orderby potremmo invece usare la reflection come segue:

   1: public void SortRows(IEnumerable<OrderRow> rows, string sortExpression)
   2: {
   3:     return from item in rows
   4:         orderby item.GetPropertyValue(sortExpression) ascending
   5:         select item;
   6: }

Il metodo GetPropertyValue è un ExtensionMethod che viene da una classe di utilità relativa la reflection e semplicemente ottiene il valore di una proprietà di un oggetto passata come argomento di tipo stringa:

   1: public static class ReflectionExtensions
   2: {
   3:     public static object GetPropertyValue(this object value, string propertyName)
   4:     {
   5:         Type type = value.GetType();
   6:         PropertyInfo property = type.GetProperty(propertyName);
   7:         return property.GetValue(value, null);
   8:     }
   9: }

L'esempio in questione probabilmente è poco significativo perchè chiunque di voi avrà da obbiettare che sarebbe meglio fare l'ordinamento direttamente nella istruzione SQL che estrae i valori e io non posso che essere daccordo su questo. Ma sono certo che esistono un buon numero di casi in cui avendo a disposizione un semplice IEnumerable<T> sia necessario ordinarlo per una specifica proprietà. Mi raccomando però, questo esempio si applica solo a LINQ to objects.

Technorati Tag: ,

Scaricare i sorgenti di System.Web.dll

In serata ho provato a collegare il mio Visual Studio 2008 al repository dei sorgenti del Framework 3.5 e ho provato a vedere come funzionasse. Il primo tentativo, con una console application è andato a buon fine e sono riuscito a scaricare il sorgente di mscorlib.dll, ma non appena ho collegato una web application e ho provato a fare la stessa cosa con System.Web.dll mi sono reso conto di un fastidioso problema. Dato che i simboli ammontano a circa 10 Megabyte, il tempo di primo download è superiore al tempo di timeout della pagina.

il problema in effetti dipende dal fatto che per scaricare dei simboli e poi i relativi sorgenti è necessario andare in debug e dalla finestra del "call stack" caricare esplicitamente i simboli di una delle dll referenziate in quel momento dal flusso di esecuzione. Alla fine me la sono cavata con un piccolo stratagemma. Tornato alla mia Console Application ho referenziato System.Web e ho scritto il seguente codice:

   1: class DummyControl : System.Web.UI.WebControls.Label
   2: {
   3:     public DummyControl()
   4:     {
   5:         this.Load += new EventHandler(DummyControl_Load);
   6:         OnLoad(EventArgs.Empty);
   7:     }
   8:  
   9:     void DummyControl_Load(object sender, EventArgs e)
  10:     {
  11:         // Put Breakpoint here...
  12:     }
  13: }

Dopo aver messo un breakpoint nell'event handler ho avviato l'applicazione console nella quale viene creare un'istanza della classe DummyControl, quando il breakpoint viene raggiunto nella finestra di "call stack" è presente anche un riferimento a System.Web.dll. A questo punto è possibile selezionare Load Symbols e attendere che il pdb venga scaricato. Una volta che esso è presente nella cache sulla nostra macchina potremmo caricarlo rapidamente anche dal debug di una web application e magicamente debuggare anche i sorgenti del framework senza alcun timeout.

Highway to (Powers)Hell

Questo è veramente fuori... ecco come ci si riduce a usare strumenti come PowerShell!


(tratto dal quasi omonimo brano "" degli AC/DC)

MIX08: Volete andare al MIX? Rifate l'home page!

logo Ho scoperto che è iniziato un nuovo concorso, che riguarda il MIX 2008.

Se volete provarci, la sfida è quella di prendere l'home page del MIX e a colpi di CSS farne un restyle completo. Il concorso infatti si chiama RESTYLE!

L'idea mi alletta parecchio, ma siceramente non ho il tempo di partecipare...

Info: http://visitmix.com/2008/restyle/

La quotidiana battaglia contro la noia...

Da quando mi muovo nell'ambito delle community, e soprattutto in questo periodo in cui la mia attività si è notevolmente intensificata e diventa ancora più evidente la quantità di lavoro che mi richiede questo impegno, trovo puntualmente qualcuno che mi pone la fatidica domanda, declinata in diverse varianti:

Ma come fai?

Ma dove trovi la forza?

e ancora,

Ma dove trovi il tempo?

e la più subdola di tutte,

Ma chi te lo fa fare?

In realtà non mi sono mai posto il problema, ma qualche minuto fa parlando in chat con un amico la domanda si è ripresentata, e io ho risposto - di botto - con una frase che mi è venuta pressochè naturale, ma che esprime molto bene le motivazioni che mi spingono ad essere così attivo nella mia community e in generale in quello che ruota attorno ad essa:

"...La quotidiana battaglia contro la noia..."

E vi assicuro che i questa frase c'è nascosta una grande verità. Potrei elencare numerosi "benefici" che mi sono venuti da queste attività, ma vi assicuro che il primo in assoluto è stato la possibilità di battere la noia che si cela nella ripetitività del nostro lavoro. Se non ci credete provate voi stessi...

Technorati Tag: ,

Un gioco per le vostre bimbe

Qualche giorno fa ho ad un gioco online cui mia figlia mi ha chiesto di giocare, anche a costo di scandire l'intero web allo scopo di trovarlo. L'origine della sua richiesta è da ricercare nelle lunghe chiacchierate che fa con la sua migliore amica, nel tragitto che da scuola la porta a casa con lo scuolabus. Me le immagino, mentre parlano fitto, dandosi istruzioni l'un l'altra su come curare i propri cavalli virtuali o come accedere ad un nuovo interessante gioco...

Questa breve introduzione, per arrivare a dirvi che alla fine il sito web lo abbiamo trovato, bastava avere la buona volontà di leggere una carta che Gaia ha ricevuto in regalo dalla sua amica. Ve lo voglio proporre, perchè dopo un paio di volte che guido Gaia nella mezzoretta di gioco serale subito dopo cena, mi sono convinto che si tratti di un software ben fatto che merita di essere citato, chissà che qualcun'altro di voi non abbia una figlia e così trovi il modo di passare un po' di tempo con lei.

Il sito, http://www.bellasara.it si basa su alcune carte che si possono acquistare in edicola, un po' come si faceva con le figurine panini un tempo, e che si concretizzano in alcuni cavalli virtuali che poi possono essere accuditi grazie ad un animazione flash proprio ben fatta. Mia figlia grazie a questo gioco sta prendendo notevole confidenza con la tastiera, e con il mouse e nel frattempo riesco anche a farla leggere qualcosa oltre ai libri di scuola, non fosse altro che per capire cosa deve fare. La cosa che mi è molto piaciuta è che nonostante il sito sia tutt'altro che scabroso e violento come talvolta sono alcuni cartoni, all'atto dell'iscrizione mi è stato recapitato un account per il pannello di controllo genitori nel quale è possibile disabilitare alcune funzioni.

Perciò, se anche a voi piace trascorrere un po' di tempo giocando con le vostre bimbe (per i maschi il gioco non è proprio adatto...), sono certo che troverete il sito di loro gradimento.

Technorati Tag: ,,

ONE-Day: Un collage di foto...

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40

Beata innocenza

Ieri sera, finalmente ho dedicato un'intera serata alla famiglia, e mia figlia ne ha approfittato per chiedermi di giocare con il computer. Io che non avevo alcuna voglia di accenderlo dopo l'overdose degli ultimi giorni, ho cercato di glissare ma poi alla fine ho ceduto:

Gaia: papà giochiamo con il sito della mia amica?

Io: Gaia, sono stanco giochiamo domani con il computer

Gaia: Ma papà, me lo avevi promesso...

Io: (in effetti è vero... lo avevo promesso) Ok, qual'è il sito?

Gaia: Il sito della mia amica?

Io: Sì, ma quale?, ce ne sono tanti...

Gaia: Non lo so...  ... "provali tutti!"

:D

Beata innocenza!

Technorati Tag: ,

ONE-Day Web: L'ora di tirare le somme

ONE-Day 014Il ONE-Day è concluso e ora posso dire che si è trattato di un vero successo seguito da un ragguardevole numero di persone, circa 75, che anche a giudicare da un veloce sguardo ai feedback hanno dimostrato di essere soddisfatte di ciò che abbiamo presentato.

Al termine della spendida giornata che si è ormai conclusa, è venuto il momento di tirare le somme e fare i dovuti ringraziamenti.

Innanzitutto devo ringraziare , che posso dire senza ombra di dubbio sia stato una risorsa indispensabile per la riuscita dell'evento. Il suo lavoro e le sue idee sono state linfa vitale per l'organizzazione, ed è obbligatoriamente a lui che va il mio primissimo grazie per la dedizione e la continuità con cui egli si impegna nelle attività di XeDotNet, lavorando instancabilmente su moltissimi fronti.

Il secondo pensiero va a , la cui sessione su Silverlight 2.0 e i webgames è stata strepitosa. Ho visto un Davide davvero convincente, che ha miscelato con coscienza la parte ludica e la parte didattica dell'indovinato argomento della sua sessione.

Poi viene , che pur avendo iniziato a presentare nei nostri meeting da poco tempo, ha migliorato notevolmente rispetto i suoi primi interventi. La sua sessione è riuscita a mostrare una serie di argomenti che nessuno aveva mai affrontato su AJAX, e questo è un merito indiscutibile.

Ringrazio poi , e con lui tutto il DPE di Microsoft Italia  e in particolare Sara Morandini, che ha reso possibile l'evento. Pietro ha proposto una sessione che ha mostrato la vision di Microsoft rispetto la tecnologia web, mostrando tutta una serie di prodotti che sono usciti da poco oppure che dovranno uscire nei prossimi mesi.

Un ringraziamento particolare anche allo staff del Novotel, la cui precisione e puntualità è stata impeccabile. A detta di molti, il buffet che abbiamo gustato è stato di gran lunga il migliore da lungo tempo sia per qualità che per quantità. E con esso vorrei ringraziare anche la persona che nei moduli di feedback ha riportato "Troppa roba da mangiare!". Se i feedback negativi sono questi siamo orgogliosi anche di essi.

Ringrazio i 75 partecipanti, 75 volte a ciascuno, per la presenza, per l'apprezzamento, per i feedback, per la simpatia, e per le domande che ci hanno fatto e alle quali spero abbiamo risposto con completezza.

E poi c'ero anche io. Sul palco, verso la fine della sessione pensavo tra me e me che mi sono sentito un'altra persona. Non è certo compito mio darmi un giudizio, ma credo di aver dato il massimo e spero che questo sforzo che mi ha visto lavorare sul materiale della sessione fin da Natale si sia concretizzato in una sessione che abbia lasciato almeno un piccolo segno nei vostri cuori. Nel mio ha lasciato una profonda soddisfazione.

Technorati Tag: ,,

One-Day: ormai ci siamo...

charts

Ho passato l'intero weekend lavorando per preparare i contenuti per la sessione che mi aspetta il 17 Gennaio a Mestre. Ormai ci siamo, l'applicazione è pronta, suddivisa nelle sue parti logicamente consecutive, le slide sono praticamente finite anche se sono convinto che nei prossimi due giorni mi capiterà di fare qualche ritocco e ho anche fatto un paio di prove per cercare di creare un percorso logico e discorsivo e soprattutto di riuscire a stare nei tempi.

E' in effetti quest'ultima la mia maggiore preoccupazione. Il tempo disponibile ammonta a circa 70 minuti a cui vanno sottratti i tempi tecnici per il cambio di speaker, il tempo di qualche domanda, e un fisiologico rallentamento iniziale dovuto all'emozione di doversi confrontare con un centinaio di persone.

L'applicazione invece è prontissima. L'idea che ho messo in pratica è stata quella di scaricarmi i log del mio weblog e di creare una applicazione che sia in grado di mostrare in forma di grafici le elaborazioni dei dati. In figura si vede uno screenshot di una delle schermate. In questa applicazione avrò l'occasione di mostrare la combinazione di ASP.NET AJAX 1.0, dell'AJAX Control Toolkit e naturalmente di Silverlight 1.0 con l'intendo di mostrare lo stato dell'arte dello sviluppo di Rich Internet Applications, con gli strumenti attualmente disponibili.

Non mi resta ora che dedicarmi agli ultimi ritocchi, e ai problemi organizzativi cos'ì da trovare tutto in perfetto ordine. E speriamo che tutti ne beneficino