.net comments edit

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

asp.net comments edit

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!

silverlight comments edit

Da alcuni giorni ho cominciato a lavorare ad una applicazione sviluppata in Silverlight che fa uso di DeepZoom. Nello specifico viene data la possibilità agli utenti di caricare foto in alta risoluzione che automaticamente finiscono nel wall.
Oltre alla parte più ovvia e scontata dell’upload della foto da parte dell’utente, ciò che risulta sicuramente interessante è la parte di resize dinamico delle immagini per DeepZoom, che può sembrare piuttosto complessa.
In un primo step avevo approcciato ad un sistema come quello spiegato qui, ma senza l’utilizzo dell’HttpHandler. Successivamente, grazie al preparatissimo Alessio, ho cambiato metodo andando ad utilizzare l’apposita libreria messa a disposizione da DeepZoom Composer, che possiamo trovare in “C:\Program Files\Microsoft Expression\Deep Zoom Composer” con il nome di DeepZoomTools.dll.

Questa libreria (totalmente managed) mette già a disposizione tutti i metodi necessari ad effettuare il resize e la creazione del file contenente la collection di foto rendendo semplice la parte di resize. Di fatto, una volta referenziata la libreria nel nostro progetto web, è semplicissimo effettuare il resize, come mostrato dagli snippet seguenti:

public void Image(string sourceFile, string targetFolder)
    {
        ImageCreator ic = new ImageCreator
                            {
                                TileSize = 256,
                                TileFormat = ImageFormat.Jpg,
                                ImageQuality = 0.95,
                                TileOverlap = 0
                            };

        string target = string.Concat(targetFolder, "\\output_images\\", Path.GetFileNameWithoutExtension(sourceFile));

        ic.Create(sourceFile, target);
    }

    public void Batch(string sourcePath, string targetFolder, bool generateCollectionFile)
    {
        List images = GetImagesInDirectory(sourcePath);
        List data = new List();

        foreach (string image in images)
        {
            Image(image, targetFolder);

            string target = string.Concat(targetFolder, "\\output_images\\", Path.GetFileNameWithoutExtension(image));
            data.Add(Path.ChangeExtension(target, ".xml"));
        }

        if (generateCollectionFile)
        {
            CollectionCreator cc = new CollectionCreator
                                    {
                                        TileSize = 256,
                                        TileFormat = ImageFormat.Jpg,
                                        MaxLevel = 8,
                                        ImageQuality = 0.95
                                    };

            cc.Create(data, string.Concat(targetFolder, "\\output"));
        }
    }

    private static List GetImagesInDirectory(string path)
    {
        return GetImagesInDirectory(new DirectoryInfo(path));
    }

    private static List GetImagesInDirectory(DirectoryInfo di)
    {
        List images = new List();

        // get all the images in this directory first
        foreach (FileInfo fi in di.GetFiles("*.jpg"))
            images.Add(fi.FullName);

        // get all the directories with their images
        foreach (DirectoryInfo sub in di.GetDirectories())
            images.AddRange(GetImagesInDirectory(sub));

        return images;
    }

Un grazie ad Alessio per l’ottima info.

.net comments edit

In un paio di post di circa un mesetto fa (li trovate qui e qui) Alkampfer aveva mostrato un ottimo tip per migliorare le performances di Visual Studio, spostando i files temporanei della compilazione ed il database di test in un RamDisk.

Inutile parlare dell’incredibile aumento di performances che si può ottenere con un approccio di questo tipo; prendendo spunto dall’idea mostrata da Alkampfer, ho pensato di fare lo stesso per la parte di testing.
Proprio oggi ho avuto la necessità di eseguire più volte dalla mia macchina diversi test, alcuni di questi molto onerosi in termini di performances, testing su disco, database, ecc, ed ho notato un certo rallentamento nell’esecuzione degli stessi.
Da qui è nata l’idea di spostare la directory di output dei test, che normalmente si trova nella stessa folder della solution, dal disco fisico al RamDisk, in modo da ridurre al minimo lo swap su disco di tutte quelle informazioni di cui non ho bisogno che rimangano persistite anche dopo il riavvio.

Per effettuare ciò è necessario andare modificare il file di configurazione LocalTestRun.testrunconfig presente nello stesso percorso della solution ed aggiungere la seguente riga:

In questo modo tutte le cartelle contenenti l’output dei test verranno create nel RamDisk con un discreto incremento delle performaces.

Ciauz

asp.net comments edit

La settimana scorsa mi sono imbattuto in uno “strano” errore  sollevato da Internet Information Service 7 (IIS7): nello specifico veniva sollevata una System.Web.HttpException con il seguente messaggio:

Request is not available in this context

L’eccezione veniva sollevata dall’ Application_Start del Global.asax, in quanto cercavo di accedere all’HttpContext per effettuare il log di avvio dell’applicazione; in realtà non avevo necessità di accedere all’ HttpContext, ma il logger che utilizzavo di default ad ogni chiamata verificava che il Context non fosse nullo e nel caso aggiungeva info sull’url richiesto (Referrer, ecc), più o meno come mostrato di seguito:

public static IExtendedLogger General
{
    get
    {
        AddExtraInformation(general);
        return general;
    }
}


private static void AddExtraInformation(IExtendedLogger logger)
{
    HttpContext ctx = HttpContext.Current;

    if (ctx != null)
    {
        logger.ThreadProperties["Url"] = ctx.Request.Url;
        logger.ThreadProperties["UrlReferrer"] = ctx.Request.UrlReferrer;
        logger.ThreadProperties["UserAgent"] = ctx.Request.UserAgent;
        logger.ThreadProperties["UserHostName"] = ctx.Request.UserHostName;
        logger.ThreadProperties["ServerVariables"] = ServerVariables(ctx.Request.ServerVariables);
        logger.ThreadProperties["Form"] = ServerVariables(ctx.Request.Form);
        logger.ThreadProperties["RawURL"] = ctx.Request.RawUrl;
        logger.ThreadProperties["ServerName"] = ctx.Server.MachineName;
        logger.ThreadProperties["ThreadLanguage"] = Thread.CurrentThread.CurrentCulture.DisplayName;
    }
}

In realtà non c’è nulla di strano, di fatto lo stesso codice in un’altro webserver funzionava alla grande. “Sbingando” (cercando con bing) un po’, ho scoperto di non essere l’unico ad avere questo problema e la motivazione scatenante è dovuta da un insieme di fattori:

  • IIS 7/7.5;
  • Integrated Mode;
  • Accesso all’HttpContext dall’Application_Start del global.asax;

L’unica soluzione che ho trovato (al momento) è quella di cambiare uno di questi fattori, quindi o cambiare la modalità da Integrated a Classic, o evitare di utilizzare l’HttpContext nell’Application_Start.
Personalmente ho scelto la seconda, ritengo che l’integrated mode di II7.x sia una delle features più interessanti (maggiori info qui), o per lo meno è sicuramente più utile dell’HttpContext nell’Application_Start per un semplice log di avvio.

Un’altra possibile soluzione può essere quella di “aspettare” che il metodo Application_Start sia concluso per poi accedere all’HttpContext come spiegato da Mike Volodarsky qui e mostrato dallo snippet seguente:

void Application_BeginRequest(Object source, EventArgs e)
{
    HttpApplication app = (HttpApplication)source;
    HttpContext context = app.Context;
    // Attempt to peform first request initialization
    FirstRequestInitialization.Initialize(context);
}

class FirstRequestInitialization
{
    private static bool s_InitializedAlready = false;
    private static Object s_lock = new Object();
    // Initialize only on the first request
    public static void Initialize(HttpContext context)
    {
        if (s_InitializedAlready)
        {
            return;
        }
        lock (s_lock)
        {
            if (s_InitializedAlready)
            {
                return;
            }
            // Perform first-request initialization here ...
            s_InitializedAlready = true;
        }
    }
}

Ciauz

asp.net comments edit

Da pochi giorni è stata rilasciata una serie di controlli ASP.NET per Internet Explorer 8.

  • ASP.NET Web Slice control: permette all’utente di sottoscrivere i propri contenuti;
  • ASP.NET Accelerator control: facilita l’accesso a servizi o applicazioni web da siti esterni;
  • ASP.NET Visual Search control: permette di poter effettuare delle ricerche all’interno del proprio sito tramite il browser;
  • ASP.NET Browser Helper control: permette di capire se l’utente collegato utilizza IE8 oppure no;

Per chi non li conoscesse, si tratta di una serie di features introdotta con Internet Explorer 8 per migliorare la navigazione e l’interattività dell’utente con il sito internet, con il coneguente aumento delle pageview ed del average time:

Home Web Slice  accelerator Search

Dopo un primo test i controlli sembrano ottimi e facili da utilizzare; giustamente se non si sta visitando il sito con Internet Explorer 8 non appaiono gli appositi pulsanti per aggiungere le webslice, accelerator, ecc evitando così di avere link inutilizzabili con browser differenti.
Unico neo è che il database incluso nel progetto è per Sql2008 e questo impedisce l’utilizzo a chi possiede la 2005 (come me); ovviamente è un ostacolo facilmente aggirabile grazie all’utilizzo della Express Edition.

Il download dei controlli ed il codice di esempio sono disponibili qui, mentre un screencast di Giorgio Sardo  lo trovate in fondo sul permalink.

FONTE : Giorgio Sardo’s Blog - ASP.Net Controls for IE8 released!

continue...

asp.net comments edit

Da pochi giorni è stata rilasciata la Preview 2 di ASP.NET MVC 2, come annunciato dal Program Manager Phil Haack (qui).
Come per la Preview 1, anche per questa versione è richiesto ASP.NET 3.5 SP1, mentre nel progetto di installazione trovate tutti i tools di integrazione con Visual Studio.

Dalla release note (disponibile qui) notiamo una serie di novità interessanti, che trovate elencate di seguito:

  • ModelMetaData e ModelMetaDataProvider;
  • Client-Side Validation e Model Validator Provider;;
  • New Code Snippet on Visual Studio 2010;
  • New RequireHttpsAttribute ActionFilter;
  • Overrriding the Http Method Verb;
  • Single-Project Areas;
  • New HiddenInputAttribute for Templated Helpers;

Molto apprezzata la parte di validazione client-side (assente nella versione 1.0 del Framework), che sfrutta le potenzialità della libreria jQuery Validation e consente di specificare una libreria di validazione custom tramite il Model Validator Provider, un po’ come avviene per il Framework xVal (di cui ho parlato qui).

Il principio di funzionamento rimane molto simile a quello sfruttato dalla libreria prensente in Codeplex, ossia si dovrà decorare il custom Binder tramite le DataAnnotation più adatte (StringLengthAttribute, RequiredAttribute, RegexAttribute, RangeAttribute, ecc).

Ottimo anche il RequireHttpsAttribute da poter utilizzare con le actions, che penserà ad effettuare il redirect allo stesso indirizzo ma forzando l’https.

Purtroppo per sfruttare alcune features (come l’auto HtmlEncode di cui ho parlato qui e altri code snippets) bisognerà aspettare la prossima beta di VisualStudio 2010 che, a differenza di quanto accaduto con la preview 1 di ASP.NET MVC, conterrà già al suo interno questa preview e le rispettive RTM saranno sincronizzate e rilasciate assieme.

Di seguito tutti i downloads:

Stay tuned!

various comments edit

MVP ProgramDirei giorno specialissimo, e non solo perchè è festa per tutte le software house, scuole di informatica, ecc (vedi qui),  ma soprattutto perchè ho trovato nella casella di posta una mail con un subject che mi ha lasciato senza fiato:

[MVP Award Program] Congratulation

Devo ammettere che ci ho messo un po’ a capire cosa stesse realmente accadendo, ma la felicità è stata talmente tanta che sto ancora festeggiando (se passate in zona Lambrate a Milano non guardate alle finestre dei palazzi, vero Mighell?).
Detto ciò, è veramente un onore essere stato nominato MVP.

Ovviamente un super grazie a tutte le persone che mi sono state vicine e che hanno contribuito alla mia crescita, tutti voi che mi seguite nel blog, facebook, twitter, ecc; in particolar modo a: Alessandro Teglia per tutto il supporto, pazienza e molto altro ancora, il vero e unico Genio del male che sa inventare features incredibili ma sempre realistiche, lo sciuro Sudano che non può mancare mai (anche lui rinnovato MVP), Salvo che mi segue in ogni mia idea folle (vedi dexter) senza neanche domandarsi di cosa si tratti, Mighell che ormai vive sulle due ruote (è come parlare di .NET con Valentino Rossi), Andrea che continua instancabilmente a darmi preziosissimi consigli tecnici e non, super Raf che mi fa sempre emozionare per l’impegno e l’energia che mette nell’aiutare le persone.

Un super grazie a tutti e complimenti a tutti gli mvp nuovi e rinnovati.

asp.net comments edit

Sinceramente mi ero chiesto perchè non esistesse in ASP.NET un qualcosa per effettuare l’encode di una stringa nel markup senza ricorrere ogni volta all’apposito metodo della classe HttpUtility; ovviamente questo non è un grandissimo problema, ma allunga i tempi di scrittura del codice e, IMHO, aggiunge verbosità allo stesso.

Per comodità mi sono realizzato un extension method per le stringhe che si occupa di effettuare l’encode/decode sia per l’html che per l’url, facilitando un po’ la scrittura del codice, come mostrato di seguito:

<!-- metodo classico -->
<%= Server.HtmlEncode(myVar) %>

<!-- con extension method -->
<%= myVar.EncodeHtml() %>

In ASP.NET 4.0 esisterà qualcosa di ancor più comodo ed immediato - lo annuncia Phil Haac qui - ossia una nuova “sintassi” per i blocchi di codice nelle pagine aspx (ovviemente vale anche per i controlli, view, ecc)  che effettuerà per noi l’encode in HTML: infatti oltre al binding ed al response ci sarà Html Encoding, come mostrato di seguito:

<%: myVar %>

Sarebbe bello poter specificare un provider per cambiare il sistema di encoding, e magari anche sostituire l’HtmlEncode della classe HttpUtility con quello della Anti-XSS.

asp.net comments edit

A non molto tempo dall’uscita della 3.0 è stata rilasciata una nuova versione di quest’ottima libreria, la 3.1.

Come è facilmente intuibile dal version number,  quest’ultima versione non apporta sgnificanti migliorie, ma sicuramente ne migliora la versione precedente.

Maggiori informazioni (con video) sulla Anti-XSS Library sono disponibili qui, mentre il download lo trovate presso Microsoft qui.

Ciauz