Leggere parametri custom dall’object di Silverlight

Print Content | More

Ultimamente sto lavorando ad una piccola applicazione in Silverlight, nello specifico un wall di DeepZoom che ha il compito di mostrare le immagini caricate dagli utenti, sfruttando questa fantastica tecnologia.
L’applicazione offre sì la possibilità di caricare le foto direttamente dagli utenti di una community, ma offre anche la possibilità di creare il wall lato editoriale, quindi da backoffice dell’applicativo, e di far ridistribuire sui clients soltanto l’object tag ed il javascript necessario.

Proprio per questo tipo di richieste si può avere la necessità di aggiungere dei parametri custom all’object che si rilascia, in modo che fornisca alcune informazioni utili alla visualizzazione.

In pratica è sufficiente aggiungere un parametro, il cui name sarà initParams, nel tag object della pagina, con al suo interno la coppia chiave-valore che si desidera utilizzare in Silverlight, separati dalla virgola.
L’esempio seguente mostra il markup dell’object.

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
    <param name="source" value="ClientBin/MyApplication.xap" />
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="3.0.40624.0" />
    <param name="autoUpgrade" value="true" />
    <param name="initParams" value="param=1,param2=prova" />
    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration: none">
        <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" />
    </a>
</object>

Lato server, all’avvio dell’applicazione viene effettuato uno split dei vari elementi ed vengono forniti tramite un dictionary nel metodo Application_Startup della classe App del progetto Silverlight.
Il codice seguente mostra come recuperare i valori inseriti nell’object e passarli alla nostra “Page”.

public partial class App : Application
    {
    
        public App()
        {
            Startup += Application_Startup;
            Exit += Application_Exit;
            UnhandledException += Application_UnhandledException;

            InitializeComponent();
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            int parameter1= 0;
            string parameter2 = string.Empty;
            
            if (e.InitParams != null && e.InitParams.Count > 0)
            {
                parameter1= int.Parse(e.InitParams["param1"]);
                parameter2 = e.InitParams["param2"];
            }

            RootVisual = new MainPage(parameter1, parameter2);
        }

        private void Application_Exit(object sender, EventArgs e)
        {
        }
}

Enjoy Silverlight!


Silverlight

0 comments

Utilizzare il Parallel For ed il Parallel ForEach in .NET 4.0

Print Content | More

L’utilizzo del Parallel Programming in .NET 4.0 va oltre a quanto già detto qui: di fatto all’interno del namespace System.Threading.Tasks esiste una classe Parallel che permette di effettuare cicli sfruttando più Threads, in modo da abbassare il tempo necessario all’iterazione.

Lo snippet seguente mostra un semplicissimo ciclo di 50 elementi con e senza il Parallel For, con risultati nettamente a vantaggio dell’istruzione Parallel.For.

static void Main(string[] args)
{
    Console.WriteLine("MTID={0}", Thread.CurrentThread.ManagedThreadId);

    ParallelMethod();
    NonParallelMethod();
    
    Console.WriteLine("\nFinished...");
    Console.ReadKey(true);
}

static void NonParallelMethod()
{
    Stopwatch sw = Stopwatch.StartNew();

    for (int i = 0; i < 50; i++)
    {
        Console.WriteLine("ThreadID={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i);
        SimulateProcessing();
    }

    sw.Stop();

    Console.WriteLine("It Took {0} ms with simple for", sw.ElapsedMilliseconds);
}

static void ParallelMethod()
{
    Stopwatch sw = Stopwatch.StartNew();

    Parallel.For(0, 50, i =>
    {
        Console.WriteLine("ThreadID={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i);

        SimulateProcessing();
    });

    sw.Stop();

    Console.WriteLine("It Took {0} ms with Parallel For", sw.ElapsedMilliseconds);
}

static void SimulateProcessing()
{
    Thread.SpinWait(80000000);
}

Dallo screenshot seguente è possibile capire come l’utilizzo del Parallel ci permette di sfruttare a meglio l’hardware a disposizione in quanto utilizza entrambi i processori, a differenza del classico ciclo for che ne sfrutta uno solo.

001r

Ovviamente la classe Parallel non offre soltanto metodi per il ciclo for ma anche per il ForEach che funziona allo stesso modo, come mostrato di seguito:

static void ParallelForEach()
{
    int[] values = Enumerable.Range(1,50).ToArray();

    Parallel.ForEach<int>(values, i =>
    {
        Console.WriteLine("ThreadID={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i);

        SimulateProcessing();
    });
}

Anche questo, come il precedente, resta un test dimostrativo della semplicità con cui si può sfruttare il Parallel Programming con il .NET Framework 4.0 e del fatto che i risultati ottenibili sono influenzabili dall’hardware che si ha a disposizione, numero di processori in primis.

Parallel.Ciauz()


.NET Framework 4.0 , Parallel , Performances

0 comments

Welcome Parallel Linq

Print Content | More

Il mio primo test della Beta 2 di Visual Studio 2010 non riguarda ASP.NET ma il mondo del Parallel Programming, e, nello specifico, del Parallel Linq, ossia la possibilità di utilizzare il Parallel Framework tramite la sintassi Linq.

L’utilizzo è semplicissimo e le prestazioni sono da paura se viene fatto un confronto con la stessa operazione ma senza l’utilizzo del Parallel. Ovviamente il test che riporto è banalissimo, ma serve a rendere l’idea di quanto semplice sia l’implementazione di Parallel Linq con il .NET Framework 4.0 e di che tipo di vantaggio si può trarre da un approccio di questo genere.

Come potete vedere dal codice seguente, l’unica differenza nella sintassi Linq è l’utilizzo dell’apposito Extension Method AsParallel() sull’oggetto da ciclare (Items in questo caso).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Parallel;
using System.Diagnostics;
using System.Threading;
using System.Collections;

namespace Imperugo.Test.ParallelLINQ
{
    class Program
    {
        private static IList items = new List();

        static void Main(string[] args)
        {
            PrepareData();

            ParalelTest();
            ClassicTest();

            Console.WriteLine("\nFinished...");
            Console.ReadKey(true);
        }

        private static void ParalelTest()
        {
            var results = from i in items.AsParallel() where i.SubValues.Contains(new Random(1000).Next()) select i;

            Stopwatch sw = Stopwatch.StartNew();
            IList resultsList = results.ToList();
            Console.WriteLine("{0} items", resultsList.Count());
            sw.Stop();

            Console.WriteLine("It Took {0} ms with parallel Linq", sw.ElapsedMilliseconds);
        }

        private static void ClassicTest()
        {
            var results = from i in items where i.SubValues.Contains(new Random(1000).Next()) select i;

            Stopwatch sw = Stopwatch.StartNew();
            IList resultsList = results.ToList();
            Console.WriteLine("{0} items with Linq", resultsList.Count());
            sw.Stop();

            Console.WriteLine("It Took {0} ms", sw.ElapsedMilliseconds);
        }

        static bool IsDivisibleByFive(int i)
        {
            return i % 5 == 0;
        }

        private static void PrepareData()
        {
            for (int i = 0; i < 1000000; i++)
            {
                var item = new DemoEntity
                                                {
                                                    Title = "New Title " + i,
                                                    SubValues = Enumerable.Range(1, 1000)
                                                };

                items.Add(item);
            }
        }
    }
}

Nel test è stata eseguita la stessa operazione due volte, una utilizzando il Parallel Linq (quadrato blu), ed una utilizzando Linq normalmente (quadrato rosso) su di una collection con 1.000.000 di elementi. I tempi richiesti per completare l’operazione sono ovviamente a vantaggio di Parallel Linq che conclude il ciclo con 9276 millisecondi, a differenza dei 16440 richiesti da Linq.

0023

Un aspetto molto interessante può essere lo scenario di utilizzo. Di fatto, per poter trarre vantaggio dall’utilizzo di Parallel Linq lo si deve sfruttare in elementi corposi (nel test ho utilizzato una collection con 1.000.000 di elementi, ma i vantaggi si cominciano a percepire dai 50.000 elementi in poi), altrimenti si rischia di ottenere l’effetto opposto. Ovviamente incide molto anche il numero di processori che si hanno a disposizione.
I dati riportati sono relativi ad un portatile dual core in modalità balanced, ma la differenza si nota.

Ciauz.AsParallel()


.NET Framework 4.0 , Linq , Performances , Parallel

0 comments

ASP.NET HealthMonitoring e le informazioni aggiuntive delle eccezioni

Print Content | More

L’HealthMonitoring di ASP.NET è sicuramente uno strumento potentissimo per tenere traccia dello stato di salute della nostra applicazione web. Uno dei suoi principali vantaggi è che dalla versione 2.0 di ASP.NET è già presente con un nutrito insieme di provider che permettono di loggare informazioni in svariati repository.
Entranto più nello specifico si hanno a disposizione i seguenti provider:

  • EventLogWebEventProvider (memorizza nell’Event Log di Windows);
  • SqlWebEventProvider (Database Sql Server 2000/05/08);
  • WmiWebEventProvider (sfrutta il Windows Management Instrumentation per gestire le notifiche);
  • SimpleMailWebEventProvider (Invia una Email);
  • TemplatedMailWebEventProvider (Invia una Email in base ad un template);
  • TraceWebEventProvider (sfrutta il trace di ASP.NET);

Ovviamente, essendo basato a provider, l’healthmonitorig offre la possibilità di realizzare ed utilizzare delle implementazioni custom, nel caso quelli precedentemente elencati non soddisfini le esigenze dello sviluppatore. Per far ciò è necessario realizzare una classe che implementi una delle apposite classi astratte messe a disposizione dal .NET Framework -WebEventProvider o BufferedWebEventProvider - ed aggiungere al loro interno propria logica.

Personalmente ritengo più che sufficienti i provider messi a disposizione e non sentirei la necessità di realizzarne uno custom se quelli messi a disposizione memorizzarsero anche le informazioni presente nella collection Data della classe Exception.
In attensa del Historical Debugger, per poter capire cosa non va nella nostra applicazione e riprodurlo, è necessario riempire il codice di logging per poter catturare e riprodurre una specifica situazione che scatena un’errore.
Purtroppo alcune volte un Logger che memorizza soltanto l’eccezione può non bastare in quanto il problema può riscontrarsi solo con alcuni paramentri e, in questi casi, è necessario memorizzare anche loro insieme all’eccezzione.

Per far ciò una buona pratica è quella di inserire questi valori nell’apposito Dictionary Data presente nell’oggetto Exception in modo da avere in un’unico oggetto sia lo stack che le informazioni legate all’eccezione.
Lo snippet seguente mostra come sfruttarlo:

public static void Send(Uri sourceUrl, Uri targetUrl)
{
    try
    {
        //do something
    }
    catch (Exception ex)
    {
        ex.Data.Add("Source Url: ", sourceUrl);
        ex.Data.Add("Target Url: ", targetUrl);

        Log.Log.General.Error("Send PingBack Error", ex);
    }
}

Purtroppo i provider dell’HealthMonitoring messi a disposizione dal .NET Framework non memorizzano questo tipo di informazioni, il che ci obbliga (se siamo interessati a tener traccia di queste informazioni) a scriverci un provider custom che dovrebbe essere più o meno così:

public class HealthMonitorDataBaseProvider : BufferedWebEventProvider
{
    public override void ProcessEvent(WebBaseEvent eventRaised)
    {
        if (UseBuffering)
            base.ProcessEvent(eventRaised);
        else
            Save(new[] { eventRaised });
    }

    public override void ProcessEventFlush(WebEventBufferFlushInfo flushInfo)
    {
        Save(flushInfo.Events);
    }

    private static void Save(ICollection eventCollection)
    {
        WebRequestInformation requestInformation = null;
        Exception errorException = null;
        MyLog item = new MyLog();

        foreach (WebBaseEvent eventRaised in eventCollection)
        {
            //popolo myLog 
            
            if (eventRaised is WebBaseErrorEvent)
                errorException = ((WebBaseErrorEvent)eventRaised).ErrorException;

            if (errorException != null)
            {
                StringBuilder sb = new StringBuilder(errorException.ToString());

                if (errorException.Data != null && errorException.Data.Count > 0)
                {
                    sb.Append(Environment.NewLine);

                    foreach (DictionaryEntry de in errorException.Data)
                    {
                        sb.Append(de.Key.ToString());
                        sb.Append(": ");
                        sb.Append(de.Value.ToString());
                        sb.Append(Environment.NewLine);
                    }
                }

                logInstance.Details = sb.ToString();
            }

            new LogService().Save(item);
        }
    }
}

stay connected!


ASP.NET , Exception Handling

0 comments

Un po’ di materiale su Visual Studio 2010 e .NET Framework 4

Print Content | More

Non è passata neanche una settimana dall’uscita della Beta 2 di Visual Studio 2010 e sul sito Microsoft è già disponibile il Training Kit che include parecchio materiale, presentazioni, hands-in labs e demo.

Il materiale è bello corposo, sono 95 Mb che includono i seguenti argomenti:

  • C# 4.0
  • Visual Basic 10
  • F#
  • Parallel Extensions
  • Windows Communication Foundation
  • Windows Workflow
  • Windows Presentation Foundation
  • ASP.NET 4
  • Windows 7
  • Entity Framework
  • ADO.NET Data Services
  • Managed Extensibility Framework
  • Visual Studio Team System

Il download è disponibile qui ed è basato sulla Beta 2 e, come potete vedere dall’elenco, non è presente del materiale su ASP.NET MVC 2, motivo per cui non potete mancare qui.

more to come...stay connected!


ASP.NET 4.0 , Beta , Visual Studio 2010

0 comments

Convertire un’applicazione da MVC 1 a MVC 2

Print Content | More

Ieri sera stavo valutando l’idea di convertire Dexter dalla versione 1.0 di ASP.NET MVC alla versione 2.0, per poter sfruttare tutte le nuove catatteristiche offerte da Visual Studio 2010 Beta 2 che, come comunicato dal PM Phil Haack qui, non supporterà la versione 1 di ASP.NET MVC.

Il passaggio non è particolarmente complesso, basta cambiare i riferimenti nei vari web.config (web application, test, ecc.) delle librerie routing e di mvc, i puntamenti nei vari progetti e l’applicazione è pronta per girare con la 2.0. 
Già dalla Beta 1 Scott Hanselman aveva mostrato, tramite il suo blog (qui), come realizzare una console application che convertisse il progetto in automatico; proprio da questo post Eilon Lipton ha realizzato una piccola windows form che, data una solution, converte in automatico tutti i progetti presenti al suo interno ed i vari files di configurazione.

L’applicazione sembra girare bene, senza particolari controindicazioni, ma, nel caso in cui abbiate effettuato dei forti cambiamenti alla struttura delle folders, potreste intercorrere in qualche errore :) : proprio per questo motivo non mi è stato possibile convertire dexter con questo tool.
Purtroppo, non avendo più la cartella Scripts, il tool è andato in errore cercando di caricare le librerie aggiornate di jQuery ed Ajax. Ovviamente ho inviato una segnalazione all’autore spiegando la situazione e non ci resta che sperare in un aggiornamento.

Sotto uno screenshot dell’applicazione:

mvc1

Maggiori informazioni ed il download sono disponibili al blog dell’autore (qui).


Beta , MVC , Visual Studio 2010

0 comments

Windows 7, Party with OrangeDotNet

Print Content | More

n156793021630_4016[1]_thumb Lo UserGroup siciliano OrangeDotNet fa la sua prima uscita ufficiale con un evento che prende spunto dal Party per Windows 7, per diventare un vero e proprio meeting live serale nel puro stile di community tecnologica.

Lunedì prossimo è di scena il Windows 7, party with OrangeDotNet in cui ci saranno una serie di mini-sessioni e, da quello che ho capito, anche dei PC su cui fare delle prove di persona.

Se volete incontrare janky e soci... presentatevi il 26 novembre alle 18 a Paternò (CT)...questo è l'evento su Facebook che riassume tutti i dati.
Maggiori info le trovate qui.

In bocca al lupo ragazzi!

PS: tenete d'occhio orange...perchè magari tra un po’ potrei essere in quel di Sicilia a parlare di MVC/ASPNET.....more to come...stay connected!


OrangeDotNet , Windows 7 , Eventi

0 comments

Esce la Beta2 di Visual Studio 2010 ed è tempo di studiare!

Print Content | More

Se volete approfondire ASP.NET MVC 2, che è presente in questa densissima release di Microsoft, possiamo incontrarci lunedì 16 novembre a Bologna, dove avrò l’opportunità di parlare appunto di questa nuovissima release insieme a Salvo.
La giornata sarà interamente orientata al web, infatti prima di me e Salvo, ci sarà Pietro a parlarci di Silverlight e .NET Ria Services in applicazioni Business.

Il taglio della sessione sarà parecchio pragmatico, ricco di codice e di esempi pratici riutilizzabili in applicazioni reali, e non mancheranno le sorprese, quindi non avete scuse per mancare :).

Un ringraziamento speciale va ad Alessandro e a tutti i ragazzi di DotDotNet per avermi offerto la possibilità di condividere la mia passione.

L’evento, organizzato da Microsoft Italia e DotDotNet, sarà totalmente gratuito e gentilmente ospitato dal
Consorzio Almacube, presso la Facoltà di Agraria dell'Università di Bologna in Via Fanin, 48 – Bologna.

Per registrarsi basta andare qui, mentre per abstract ed ulteriori info qui.

Non mancate!


Community , DotDotNet , Eventi , MVC

0 comments

Primissime impressioni su Visual Studio 2010 Beta 2

Print Content | More

Semplicemente wow!

Già dalla splash screen si capisce subito che Visual Studio ha fatto una bella virata rispetto ai predecessori (IMHO Vs2008 era il miglior tool di sviluppo in circolazione, dico “era” perchè vs2k10 vince già con la beta).
Comunque non solo la spash screen ha avuto un cambiamento, ma anche la home e l’icona hanno subito un restyling, come si suol dire, anche l’occhio vuole la sua parte.

Detto ciò un’altra novità che sale subito all’occhio sono le performances : decisamente più veloce rispetto alla Beta 1 che, aimé, era un po’ deludente da questo punto di vista, ma il team di VS ha saputo lavorare alla grande e portare la beta 2 ai livelli di Visual Studio 2008 RTM (vorrei sbilanciarmi ma non ho avuto modo di effettuare test approfonditi).

Purtroppo nella fase di setup ho avuto un errore durante l’installazione dei Silverlight 3 tools (probabilmente perchè li avevo già installati sulla macchina prima della Beta 2), ma la procedura si è conclusa ugualmente e sembra essere tutto perfettamente funzionante.
Confermo la presenza di ASP.NET MVC 2 Preview 2 e numerosi nuovi templates, tra cui SharePoint e Cloud Service, che dovrebbero essere una release indietro.

Purtroppo non ho avuto modo di effettuare dei veri e propri test sulle novità introdotte dalla Beta 2 del .NET Framework, a parte l’autoencode e l’ajax CDN (maggiori info rispettivamente qui e qui), ma sicuramente a breve ci saranno news, e magari qualcosa in più verso metà novembre :).

Sotto alcuni screenshots.

 

splash Home Templates


Visual Studio 2010 , ASP.NET 4.0 , Beta

3 comments

Beginning ASP.NET MVC 1.0 Book Review

Print Content | More

ASP.NET MVC 1.0 Ho appena completato la lettura del libro di Simone e Keyvan Nayyeri - Beginning ASP.NET MVC 1.0 – che si è rivelato un ottimo testo, e, nonostante io non mi ritenga più tanto beginner in ASP.NET MVC, ho avuto ugualmente modo di imparare qualcosa.
Devo dire che il libro scorre bene, di piacevole lettura e con un taglio pragmatico (che personalmente adoro), ricco di codice e di esempi riutilizzabili nelle proprie applicazioni. Cinquecento pagine che non sono assolutamente eccessive e non scoraggiano l’utente (personalmente non leggo mai un libro “mattone” di 1000 pagine).


Il libro è rivolto a chi decide di affacciarsi per la prima volta a questo Framework di Microsoft, ma non solo; infatti sono moltissimi gli argomenti trattati seguendo una linea ben distinta e mai azzardata, guidando l'utente dalle prime fasi dello sviluppo, passando per AJAX, Unit Testing, Estendibilità, differenze e benefici con le WebForms e migrazione dalle stesse verso MVC.

La cosa che personalmente mi è piaciuta di più è la semplicità con cui sono spiegati alcuni argomenti tutt’altro che banali, come la Dependency Injection in MVC, mantenendo la stessa linea di tutto il libro, senza mai disorientare il lettore con terminologie e spiegazioni complesse.

Personalmente consiglio questo libro a chiunque abbia una base di .NET e ASP.NET e decida di avvicinarsi a questo nuovo Framework.
Ancora complimenti a Simone e Keyvan Nayyeri!

Well done!


Book , MVC , Review

0 comments