di .NET e di altre amenità

Pronti.. meeting... via :)

appz Domani sera sarò nuovamente impegnato in un meeting di XeDotNet dove sarò protagonista di una sessione sul mio beneamato Silverlight. Durante i 90 minuti della sessione parlerò diffusamente delle tecniche di accesso alla rete che il plugin mette a disposizione.

Il fulcro della serata sarà una piccola applicazione, sviluppata appositamente per domani sera, che dimostra come usare il Polling Duplex per aggionare un ipotetico pannello di orari di autobus. Questa tecnica è davvero interessante e apre la strada ad una tipologia di applicazioni molto efficace e di semplice sviluppo.

Un altro esempio divertente sarà quello si un mini task manager in grado di mostrare in tempo reale l'uso del processore sulla macchina server. Grazie all'uso di un socket i dati raccolti che fluiscono in vero realtime andranno ad aggiornare un pannello con un grafico e due barre indicatrici rispettivamente di processore e memoria RAM. Nella figura a fianco ho postato due screenshot del risultato...

Subito dopo il meeting mettero a disposizione il codice delle applicazioni. Ora ho finito di prepararmi e me ne vado a dormire che domani ho bisogno di tutta la concentrazione necessaria per dare il massimo.

Silverlight xml:lang... impostare la culture di uno UserControl

Diversamente da quello che ci si aspetta, la localizzazione di uno UserControl (e quindi della stessa pagina) in Silverlight non segue strettamente la cultura che è stata impostata nel browser. In effetti se provate a effettuare il binding di un TextBlock su di una proprietà di tipo DataTime vi renderete conto immediatamente di uno strano comportamento, soprattutto se la lingua del browser è impostata su una cultura diversa da en-US:

   1: <TextBlock Text="{Binding Today}" />
   2:  
   3: ... si ottiene ...
   4:  
   5: 2/23/2009 8:20:53 PM

La data espressa in questo esempio è palesemente in formato anglosassone. Il motivo di questo comportamento è dovuto ad un valore di default che viene assegnato all'attributo xml:lang (corrispondente alla proprietà Language di FrameworkElement). Se infatti provate a scrivere un IValueConverter custom e a mettere un breakpoint nel metodo Convert() vi renderete rapidamente conto che il valore che arriva al metodo come CultureInfo è "en-US", indipendentemente dalla cultura che valorizza la proprietà CultureInfo.CurrentCulture.

La documentazione in proposito è piuttosto chiara:

The Language property will default to "en-US" if not otherwise set either through the property itself or through processing the xml:lang attribute.

Correggere questo comportamento è piuttosto semplice. E' sufficiente valorizzare la proprietà Language dello UserControl cui fa riferimento la pagina nel costruttore del controllo in questo modo:

   1: this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name);

In WPF c'è più o meno il medesimo problema che ha una soluzione un po' più elegante, dato che è possibile effettuare l'override dei metadati di una DependencyProperty. Con Silverlight 2.0 invece occorre settare esplicitamente tale valore in ogni UserControl.

 

Qualcosa non va, senza guardare troppo lontano...

E' un po' di tempo che non parlo di politica, ma questa volta questa notizia mi ha fatto pensare che fosse il caso di esprimere la propria opinione. La notizia in questione è che il vincitore della notte degli oscar che ha portato a casa 8 statuine, ha incassato 150 Milioni di dollari decuplicando l'investimento necessario a girare il film. Unendo questa notizia con quella passata per il TG2 si viene a sapere che i due bambini indiani che ricoprono un ruolo nella trama del flim, sono stati pagati solo 125000 rupie cioè 2000$

Più volte mi sono espresso contro gli sfruttatori del lavoro minorile, sempre rivolgendomi a paesi come la Cina che di questa pratica ne fa un uso comune. Ma evidentemente non occorre andare troppo lontano per trovare casi di questo tipo. Forse è il caso che iniziamo a fare un po' di pulizia in casa nostra...

Technorati Tag: ,,

Disponibile un aggiornamento per Silverlight 2.0

E' stata pubblicata sul sito di Silverlight la nuova GDR Release 2.0.40115.0 che contiene una serie di fixing di bug noti.

La nuova release non è ancora disponibile su Microsoft Update.

Raggiungete questa pagina per il download:

Technorati Tag: ,,

Rilasciato Moonlight 1.0

Ne da notizia :

http://weblogs.asp.net/scottgu/archive/2009/02/11/moonlight-1-0-release.aspx

Qualche pensiero sulla diffusione di Silverlight 2.0

In questo articolo Tim Sneath propone una interessante analisi riguardo la diffusione di Silverlight 2.0 rispetto ad altre piattaforme concorrenti. Si tratta di una lettura interessante anche perchè mostra in luce diversa le parole di Adobe rispetto la propria piattaforma:

Link:

Silverlight 2.0: Usare AsyncOperationManager per sincronizzare thread e UI

Stamane, girovagando all'interno del framework come mi capita spesso, in compagnia del fido Reflector, mi sono imbattuto in un paio di classi che non sapevo facessero parte di Silverlight 2.0. Di AsyncOperationManager e AsyncOperation avevo già letto, ma non avevo mai pensato di poterle sfruttare nel plugin per sincronizzare un thread di download e la user interface. Un rapido refactoring mi ha infine confermato che la tecnica funziona e anche bene consentendo il grande vantaggio di non doversi portare in giro un riferimento al Dispatcher o al SynchronizationContext.

Ecco un breve esempio di come usare AsyncOperationManager; Poniamo di dover scaricare un file dalla rete, facendo uso di HttpWebRequest. L'uso di BeginGetResponse() implica una chiamata asincrona e al rientro per notificare l'interfaccia, ad esempio sollevando un evento, saremmo costretti all'operazione di sincronizzazione:

   1: public class DownloadManager
   2: {
   3:     /// <summary>
   4:     /// Enqueues the download.
   5:     /// </summary>
   6:     /// <param name="uri">The URI.</param>
   7:     public void DownloadFile(Uri uri)
   8:     {
   9:         DownloadState state = new DownloadState
  10:         {
  11:             Operation = AsyncOperationManager.CreateOperation(null),
  12:             Request = (HttpWebRequest)WebRequest.Create(uri)
  13:         };
  14:  
  15:         state.Request.Method = "GET";
  16:         state.Request.BeginGetResponse(new AsyncCallback(Download_Completed), state);
  17:     }
  18:  
  19:     /// <summary>
  20:     /// Download_s the completed.
  21:     /// </summary>
  22:     /// <param name="result">The result.</param>
  23:     private void Download_Completed(IAsyncResult result)
  24:     {
  25:         DownloadState state = result.AsyncState as DownloadState;
  26:  
  27:         if (state != null)
  28:         {
  29:             try
  30:             {
  31:                 HttpWebResponse response = (HttpWebResponse)state.Request.EndGetResponse(result);
  32:  
  33:                 if (response.StatusCode == HttpStatusCode.OK)
  34:                     state.Operation.PostOperationCompleted(
  35:                         new SendOrPostCallback(OnDownloadCompleted), response);
  36:                 else if (response.StatusCode == HttpStatusCode.NotFound)
  37:                     state.Operation.PostOperationCompleted(
  38:                         new SendOrPostCallback(OnDownloadFailed), new InvalidOperationException());
  39:             }
  40:             catch (Exception ex)
  41:             {
  42:                 state.Operation.PostOperationCompleted(
  43:                     new SendOrPostCallback(OnDownloadFailed), ex);
  44:             }
  45:         }
  46:     }
  47:  
  48:     /* ... omissis ... */
  49:  
  50:     private class DownloadState
  51:     {
  52:         /// <summary>
  53:         /// Gets or sets the operation.
  54:         /// </summary>
  55:         /// <value>The operation.</value>
  56:         public AsyncOperation Operation { get; set; }
  57:         /// <summary>
  58:         /// Gets or sets the request.
  59:         /// </summary>
  60:         /// <value>The request.</value>
  61:         public HttpWebRequest Request { get; set; }
  62:     }
  63: }

In buona sostanza un attimo prima di avviare il download chiedo al AsyncOperationManager di fornirmi un AsyncOperation. Quest'ultima viene inserita assieme alla Request in una classe DownloadState e al momento giusto viene recuperata per effettuare la sincronizzazione mediante PostOperationCompleted().

In questo modo il componente sarà facilmente riutilzzabile, senza doversi portare dietro una referenza ad un componente di Interfacce...

Technorati Tag: ,

Mi inchino e rendo onore...

E menomale!

http://www.ansa.it/site/notizie/awnplus/topnews/news/2009-02-06_106312251.html

Un ringraziamento a DotNetWork

Voglio ringraziare i partecipanti del Workshop di DotNetWork e con essi anche i membri dello user group che ieri hanno accolto la mia sessione su con una partecipazione davvero esemplare, e con una serie di domande l'una più interessante dell'altra. Spero di essere stato all'altezza della loro sete di sapere...

Grazie di cuore a tutti. E' stata una bellissima esperienza, sia dal punto di vista umano che dal punto di vista "culinario" :)

Quince: UX Patterns Explorer

image_3 Infragistic ha lanciato in queste ore un nuovo sito che consente di cercare la giusta soluzione ai più comuni preoblmi di User Interface.

Il suo nome è Quince ed è anche un buon esempio di cosa si possa fare con Silverlight. La ricerca è semplice e ricca di esempi e sono certo che potrà aiutare molti a districarsi nei nella soluzione dei propri problemi di interattività.

Link: http://quince.infragistics.com/

Technorati Tag: ,,

Anche in Google ci sono esseri umani... ne ho le prove... :P

Ecco la spiegazione ufficiale di Google rispetto il problema che avevo sottolineato nel weekend.

http://googleblog.blogspot.com/2009/01/this-site-may-harm-your-computer-on.html

Ebbene sì, anche in Google lavorano esseri umani... ora si tratta di capire quanti siano :)

Technorati Tag:

Un meeting senza precedenti!

Spendo due parole per ringraziare le persone che nella serata di Venerdì hanno letteralmente preso di assalto il nostro meeting su Windows Presentation Foundation, costringendoci perfino a richiedere sedie aggiuntive all'hotel per ben due volte. Alla fine abbiamo totalizzato per la seconda volta nella storia del nostro ug una drop negativa (cioè abbiamo avuto più partecipanti che iscritti) fermandoci a 66 presenti.

Certo l'argomento del meeting è tra i più sentiti in questo periodo, però mi piace pensare che le persone abbiano compreso l'importanza degli eventi che presentiamo in termini di occasioni di formazione personale e di incontro e condivisione. Ringrazio perciò tutti, e con particolare simpatia gli eroi che sono partiti da Trieste e da Adria, per raggiungere un meeting a 150 KM di distanza per poi rientrare nella notte.

Un ringraziamento particolare va inoltre a Teorema che ha sponsorizzato l'intero semestre coprendo le spese vive dell'hotel fino a giugno.

La nostra attività continua, spinti come siamo da questi successi e dal continuo incremento di soci che finanziano la nostra attività. Nonostante il periodo numerose persone hanno ritenuto importante sottoscrivere la nostra tessera per il 2009 versando la ragguardevole cifra di 50€ regalando a tutti la possibilità di finanziare 3 o 4 meeting.

Vi aspetto tutti al prossimo appuntamento: http://www.xedotnet.org/meet/silverlightnet.aspx