Alcuni link utili

Print Content | More

Seguire tutte le tecnologie di cui siamo appassionati diventa sempre più difficile, e le quantità di informazioni presenti in rete a volte superano di gran lunga il tempo che si ha a disposizione per studiarle/lavorarci; se proviamo a seguire l’hashtag #html5 su twitter ci rendiamo conto che arrivano centinaia di tweet al minuto.
Proprio da queste problematiche ed esigenze è nata l’idea di creare dei post con cadenza più o meno regolare (l’idea è sul settimanale) che raccolgono i principali link per le tecnologie di cui sono appasionato.
Buona lettura Smile

Windows Azure:

HTML5:

ASPNET MVC:

Testing:


News , HTML5 , MVC , Azure , Testing

0 comments

Gli Action Filter ed i Global Filter di ASPNET MVC

Print Content | More

Già dalla prima release di ASPNET MVC è stato introdotto il concetto di Action Filter, ossia un attributo che può decorare sia una singola Action o che addirittura un intero Controller.

Lo scopo di questi Filter è quello di aggiungere funzionalità che spesso ci troveremmo a scrivere con molta frequenza, o addirittura per ogni singola chiamata; per capire il concetto è sufficiente pensare ad una serie di Action che dovranno essere accessibili soltanto agli utenti loggati. Se provate ad immaginare questo scenario, un possibile risultato potrebbe essere questo:

public class HomeController : Controller {
    public ActionResult Index ( ) {
        if(!HttpContext.User.Identity.IsAuthenticated)
            Redirect ( "/Login" );

        //TODO: Fai qualcosa

        return View ( );
    }

    public ActionResult Products ( ) {
        if (!HttpContext.User.Identity.IsAuthenticated)
            Redirect ( "/Login" );

        //TODO: Fai qualcosa

        return View ( );
    }

    public ActionResult Details ( ) {
        if (!HttpContext.User.Identity.IsAuthenticated)
            Redirect ( "/Login" );

        //TODO: Fai qualcosa

        return View ( );
    }
}

Come si può notare in tutte e tre le Action c’è un blocco di codice ripetuto che non fa altro che verificare che l’utente corrente sia autenticato e, nel caso non lo sia, lo reindirizza alla pagina di Login. Lo scopo degli Action Filter è di racchiudere tutta la logica che può essere comune alle Action, indipendentemente dal Binder in entrata e da ciò che la Action stessa deve fare, permettendoci così di sostituire tutte quelle righe di codice con un semplice attributo. Di fatto l’esecuzione del Filter avviene prima dell’esecuzione del codice presente all’interno della Action.
Lo snippet seguente mostra le stesse identiche Action dell’esempio precedente, ma con l’utilizzo degli Action Filter:

public class HomeController : Controller {
    [Authorize]
    public ActionResult Index ( ) {
        //TODO: Fai qualcosa

        return View ( );
    }

    [Authorize]
    public ActionResult Products ( ) {
        //TODO: Fai qualcosa

        return View ( );
    }

    [Authorize]
    public ActionResult Details ( ) {
        //TODO: Fai qualcosa

        return View ( );
    }
}

Oppure a livello di controller

[Authorize]
public class HomeController : Controller {
    public ActionResult Index ( ) {
        //TODO: Fai qualcosa

        return View ( );
    }

    public ActionResult Products ( ) {
        //TODO: Fai qualcosa

        return View ( );
    }
    
    public ActionResult Details ( ) {
        //TODO: Fai qualcosa

        return View ( );
    }
}

All’interno di MVC esistono già diversi Action Filter, come l’Authorize mostrato sopra, oltre ad altri come OutputCache, HandleError, etc; inoltre nulla ci vieta di crearne dei nostri custom, come mostrato in un mio precedente post (qui).

L’ultima release di MVC (la 3, di cui ho già parlato in parte qui) offre la possibilità di registrare i controlli in modalità globale per tutta l’applicazione, evitandoci così il noioso copia ed incolla per tutti i controller dell’applicazione.

Per far ciò è necessario registrare l’Action Filter nel global.asax, come mostrato di seguito:

protected void Application_Start ( ) {
    AreaRegistration.RegisterAllAreas ( );

    GlobalFilters.Filters.Add ( new HandleErrorAttribute ( ) );
    GlobalFilters.Filters.Add ( new AuthorizeAttribute ( ) );

    RegisterRoutes ( RouteTable.Routes );
}

Non male direi.

Ciauz


MVC , Filter

0 comments

Introduzione a NuGet

Print Content | More

Sicuramente la parola NuGet, precedentemente conosciuto come NuPack, non è un termine nuovo per i tecnici; non avendo però mai avuto modo di parlarne colgo l’occasione per scrivere questo post, che riassume un po’ il suo funzionamento e ne spiega gli scenari d’uso.
In primis NuGet è un’extension free per Visual Studio 2010, quindi per chi non utilizza questa release di VS questo post può risultare poco utile. Lo scopo dell’extension è di agevolare lo sviluppatore nell’utilizzo di Framework esterni, principalmente Open Source all’interno dei propri progetti C# o VB.

Ogni mia solution utilizza diversi pacchetti come NHibernate, ConfORM, Castle, JQuery etc, e, specie in fase di startup, è necessario aggiungere queste librerie sia ad ogni progetto sia al source control;
NuGet facilita parecchio questa fase permettendoci con pochi click, di completare gli step descritti precedentemente, ma anche di aggiornare le librerie a versioni più recenti con estrema facilità.

Installazione:

Essendo questo tool sviluppato dal team di ASP.NET/MVC, l’istallazione è disponibile sia tramite gli ASP.NET MVC 3 Tools Update (download qui) che tramite la gallery delle extension di Visual Studio (qui). Se siete sviluppatori web consiglio l’installazione di NuGet insieme ad MVC, che include altre ottime features per il mondo “WWW”; se invece il vostro target di sviluppo non è il web, sicuramente l’installazione della singola extension è la soluzione migliore.

Utilizzo:

Una volta installato il tutto è possibile utilizzare NuGet in due differenti modi:

  • Riga di comando direttamente dentro Visual Studio (molt geek ma poco utile a mio avviso);
  • Tramite l’apposita UI.

Se si opta per la prima soluzione basta digitare all’interno della finestra “Package Manager Console” (disponibile dopo l’installazione di NuGet dal menu View => Other Windows) il comando “Install-Package”, seguito dal nome del package da installare. Supponendo di voler installare jquery, il codice da scrivere deve essere il suguente:

image

Se invece si opta per l’utilizzo tramite la UI di Visual Studio è sufficiente andare sul progetto desiderato e, cliccando con il tasto destro sulle reference, premere “Add Library Package Reference” e ricercare JQuery, come mostrato dagli screenshot seguenti:

SNAGHTML3ecbbb5cSNAGHTML3eccda80

SNAGHTML3ecedf9eSNAGHTML3effd3fb

Dipendenze:

Oltre al download della singola libreria, NuGet si occupa di fornire al nostro download anche le dipendenze del package scelto. Riferendosi ad un esempio pratico, se si prova a scaricare Castle Windsor verrà scaricato anche il package di Castle.Core, in quanto necessario al funzionamento del primo; il tutto risulterà come una duplice installazione di librerie tramite NuGet, ossia è come installare prima Castle.Core e poi Castle.Windsor. Lo screenshot seguente mostra la dipendenza:

SNAGHTML3f150ee9

FileSystem:

Ovviamente, tutti i package installati nelle nostre solution devono essere fruibili anche in assenza di connessione, e questo significa che esiste una copia in locale all’interno del proprio FileSystem. Il comportamento di default di NuGet è quello di copiare tutte le librerie all’interno della folder (packages) presente nella stessa folder della solution.
Purtroppo nella versione attuale di NuGet (la 1.3, e ricordiamoci che stiamo parlando di un “prodotto” in beta) non esiste ufficialmente la possibilità di specificare in che folder devono essere installati i package. Alcune settimane fa il buon Andrea ha postato un “trick” che permette di cambiare i settings di NuGet e poter gestire liberamente il path che conterrà le librerie. Come detto dal PM del progetto Phil Haack qui:

SNAGHTML3f06ea2a

Le prossime release saranno incompatibili con la soluzione descritta da Andrea. Speriamo di avere a disposizione una soluzione alternativa.

Gallery:

Ovviamente è già disponibile un gran numero di package che si possono utilizzare liberamente,  ed esiste un apposito sito che ci consente di consultare l’archivio e di lasciare dei feedback sulle varie librerie o di caricarne di nuove. Il sito in questione è http://www.nuget.org 

SNAGHTML3efc4016SNAGHTML3efc90d4

SNAGHTML3efd9bdcSNAGHTML3efcd1ab

Estendibilità:

NuGet è fortemente basato su feed xml per la consultazione dei package disponibili e, andando sui suoi setting, potete aggiungere feed custom per installazione di pacchetti “privati”, e quindi utilizzare questa potente extension anche per librerie non open source o non rilasciate pubblicamente.
Sul sito di Codeplex (http://nuget.codeplex.com) è disponibile un’ottima documentazione che, tra le tante info, spiega come creare ed “hostare” un proprio feed all’interno di Nuget (vedi qui).

Considerazioni:

Sinceramente rientra tra i “Must Have” e, una volta rotto il ghiaccio, è difficile farne a meno. Una cosa che sicuramente sarebbe carina è la possibilità di configurare i package per il singolo download. Per esempio è possibile utilizzare NHIbernate con diversi proxy (LingFu, Castle, etc.), e in NuGet trovate tanti pacchetti quante sono le opzioni. Sicuramente la possibilità di personalizzarsi il package può essere di aiuto nello “sfoltire” una gallery molto grande.


NuPack , Visual Studio 2010 , Visual Studio

0 comments

Un mese molto intenso

Print Content | More

Quattro sessioni in tre eventi;
Da Milano alle Marche e ritorno;
Dall’HTML5 ad ASPNET MVC passando per Orchard;

HTML5 il martedì 03 maggio 2011 a Milano => Workshop Community Tour, New Wave
Orchard il venerdì 27 Maggio 2011 presso l’Università di Ancona => Community Tour 2011 - CMS Edition
ASPNET MVC il 6 Giugno a Milano => Titolo da decidere.

Vi aspetto!


MVC , HTML5 , Orchard

0 comments

La developer toolbar di IE9

Print Content | More

Internet Explorer, nonostante sia sempre stato uno dei browser più diffusi in ambiente Windows, non ha mai brillato per caratteristiche di sviluppo, a paragone con quelle offerte da Firefox con Firebug o Chrome con la sua developer toolbar.

Fortunatamente il team di Redmond si è dato da fare per cercare di colmare questa lacuna e, nell’ultima release, ha introdotto alcune feature che lo collocano al “pari” della concorrenza e, in alcuni scenari, anche leggermente avanti.

Banalmente se si preme F12 in IE9 si possono subito notare alcune voci precedentemente assenti, come il tab Network, che ci permette di effettuare un monitoring sulle richieste che partono dal client verso il server.
Sinceramente non volevo soffermarmi su questa feature o effettuare un paragone tra le varie toolbar, ma semplicemente mostrare una funzionalità molto comoda che in alcune situazioni può essere la nostra migliore amica Smile.

Sicuramente tutti i dev sono a conoscenza della “minifizzazione” dei file (normalmente file .js e .css) e, di fatto, jQuery e molte altre librerie offrono due versioni dei proprio framework: una normale ed una compressa.
Per ovvi motivi è sempre giusto utilizzare la seconda nei propri siti; questo ci permette di ridurre banda e, di conseguenza, i tempi di caricamento delle nostre pagine. Purtroppo di riflesso si ha anche lo svantaggio di perdere leggibilità e facilità di debugging dei javascript.
Internet Explorer 9 offre una fantastica funzione che ci consente di scavalcare questa problematica aiutandoci parecchio nella fase di sviluppo. Questa feature ci permette di “indentare” il codice javascript presente all’interno della toolbar, come mostrato dagli screenshot seguenti:

001002003


IE9 , Ottimizzazione , Browser , Chrome , Firefox

0 comments

ConfORM, NHibernate, Oracle e gli Integration Test

Print Content | More

In questi giorni sto lavorando parecchio ad un’applicazione che usa Oracle come repository e NHibernate come framework di persistenza. Essendo questa un’applicazione “delicata” ho necessità di creare una serie di integration test che mi “garantiscano” il corretto funzionamento, in modo da non avere spiacevoli sorprese in fase post deploy.

Letta così la questione non presenta particolari criticità, ma ho dovuto affrontare un nuovo scenario riguardante Oracle e la sua gestione degli indici.

Prima di entrare nel dettaglio tecnico vorrei puntualizzare che la soluzione da me adottata è la conseguenza di una totale inesperienza relativamente al mondo Oracle, potrebbe quindi esistere una strada migliore e più corretta per arrivare alla soluzione (magari se la conoscete, datemi qualche consiglio Open-mouthed smile).

Fatta tale premessa provo a descrivere un po’ lo scenario. Nella mia installazione interna all’azienda ho un solo database engine di Oracle che contiene al suo interno l’applicazione di sviluppo, quella di test ed infine quella di quality assurance. Quindi, lato database, ho tre schema/utenti ben differenti denominati rispettivamente Dev, Test e QA, ed ognuno di questi ha le proprie tabelle con i propri dati, come mostrato dalla tabella seguente:

dev

test

QA

dev.users

test.users

qa.users

dev.roles

test.roles

qa.roles

dev.usersinroles

test.usersinroles

qa.usersinroles


Essendo l’applicazione in uno stato di sviluppo più o meno avanzato, il database delle linea dev non subisce molti “restyling”, al contrario del database dei test che viene cancellato e ricreato ad ogni test.

Il mio problema è nato proprio durante la fase di “drop & create” dello schema: questo viene creato correttamente, ma poi la procedura di NHibernate non completa correttamente il tutto perché, al contrario di quanto avviene per le tabelle, gli indici non sono legati ad uno specifico schema, sollevandomi una brutta eccezione del tipo “nome oggetto già utilizzato” (riferendosi all’indice che si stava cercando di creare).
Se si riosserva la tabella riportata in precedenza si può facilmente intuire che l’univocità del nome della tabella è data dalla combinazione dello schema con il nome della tabella stessa. Purtroppo o per fortuna (direi più per fortuna) questa “combo” non esiste per gli indici, il che si traduce nel dover creare indici con nomi differenti per ogni “environment” in quanto trasversali all’interno del database engine.

L’indice IX_ItemType non è dev.IX_ItemType!

La mia configurazione di NHibernate creava automaticamente degli indici per alcuni scenari (nello specifico per il “Table Per Class Hierarchy”) in modo da aiutare il database nell’eseguire le query. Con il supporto del buon Fabio ho creato un Applier per ConfORM (in realtà ho fatto copia ed incolla di quello esistente) che mi permette di stabilire un prefisso per tutti gli indici, in modo da avere un risultato tipo il seguente:

  • IX_MyIndex;
  • IX_Test_MyIndex;
  • IX_QA_MyIndex;

Una volta creato l’applier mi è bastato effettuare una merge dello stesso e, come per magia, tutti i test sono diventati verdi.
Per chi fosse interessato posto il codice dell’applier di ConfORM

public class DiscriminatorIndexNameApplier : IPatternApplier<Type, IClassAttributesMapper> {
    private readonly IDomainInspector domainInspector;
    readonly string indexPrefix;

    public DiscriminatorIndexNameApplier ( IDomainInspector domainInspector, string indexPrefix ) {
        this.domainInspector = domainInspector;
        this.indexPrefix = indexPrefix;
    }

    #region IPatternApplier<Type,IClassAttributesMapper> Members

    public bool Match ( Type subject ) {
        return domainInspector.IsTablePerClassHierarchy ( subject );
    }

    public void Apply ( Type subject, IClassAttributesMapper applyTo ) {
        applyTo.Discriminator ( dm => dm.Column ( cm => cm.Index ( indexPrefix + subject.Name + "EntityType" ) ) );
    }

    #endregion
}

 

e per il suo utilizzo:

IPatternsAppliersHolder patternsAppliers = ( new ImperugoPatternsAppliersHolder ( orm , NHConfiguration.Instance.IndexPrefix ) )
    .Merge ( new ConfORM.DiscriminatorValueAsEnumValuePack <Person, PersonDiscriminatorMap> ( orm ) )
    .Merge ( new ConfORM.DiscriminatorValueAsEnumValuePack <View , ViewDiscriminatorMap> ( orm ))
    .Merge ( new ConfORM.DiscriminatorIndexNameApplier ( orm, NHConfiguration.Instance.IndexPrefix ) );

dove l’ultima riga cambia la naming convention degli indici leggendo il prefisso dal file di configurazione. Enjoy!

Nhibernate , Oracle , ConfORM

0 comments

È tempo di HTML5

Print Content | More

La chiusura delle specifiche dell’HTML5 è prevista intorno al 2014, ma la percentuale di penetrazione sul mercato ha sicuramente raggiunto un livello che “impone” a noi dev web di dare un’occhiata un po’ più da vicino a cosa ci offre questa nuova tecnologia.
Al community tour di Milano avrò modo di parlare un po’ più in dettaglio di alcune caratteristiche, di fare un po’ il punto su quanto è già utilizzabile dell’HTML5 e su ciò che verrà, facendo un po’ di chiarezza sui punti più bui.
Quindi “save the date” 3 maggio c/o Microsoft Italia. L’iscrizione gratuita è disponibile qui.

Vi aspetto!


HTML5 , Community

0 comments

Un MIX 2011 ricco di novità

Print Content | More

MIX11_BB_SeeYouAt_2_thumbSi è conclusa da poche ore la prima giornata del MIX11, e le novità di cui parlare sono già tante. Essendo io un web addicted mi soffermerò principalmente sulle novità riguardanti il mondo “www”, quindi per le novità su WP7 dovrete leggere altrove Smile.

Nella keynote si è ribadito quanto l’HTML5 sia il futuro del web e quanto Microsoft stia investendo su questa tecnologia. La stessa società lo ha dimostrato presentando e rilasciando pubblicamente la prima Platform Preview di Internet Explorer 10, che potete scaricare gratuitamente qui.
La demo, visibile direttamente dal blog del team qui, ha dimostrato quanto Internet Explorer sia un passo avanti rispetto alla concorrenza sul fronte delle performance.
Quest’incredibile lavoro da parte del team mi fa sempre più pensare che HTML5, e nello specifico l’engine di IE, saranno parte integrante della prossima release di Windows (magari si potranno sviluppare applicazioni HTML5 per Windows 8).

Un’altra importante novità è il rilascio dei Visual Studio Tool per ASP.NET MVC 3, che vanno ad aggiornare i template di Visual Studio e ad aggiungere nuove funzioni.
Nello specifico ora si ha la possibilità di specificare se il progetto MVC andrà a fare uso dell’HTML5 e, nel caso si opti per tale tecnologia, si avrà direttamente a disposizione la libreria Modernizr 1.7, che aiuta l’utente a creare applicazioni HTML5 cross browser.
Rimanendo in tema di librerie javascript, anche jquery è stato aggiornato all’ultima release e, grazie a NuGet, sarà possibile aggiornarlo direttamente da Visual Studio in maniera del tutto automatica.
Passando un po’ alla parte di backend, i nuovi tool includono Code First di ADO.NET Entity Framework 4.1 e lo scaffolding per MVC, confermando un po’ la tendenza di andare a sovrapporsi un po’ a Ruby On Rails.

Il download ovviamente è disponibile sia dal Web Platform Installer che tramite il download diretto da qui.


Mix11 , MVC , ASP.NET , Visual Studio , HTML5 , Scaffolding

0 comments

Registrare un mime type dal web.config

Print Content | More

Internet Information Service (IIS) versione 7.x offre la possibilità di configurare il proprio sito un po’ più in autonomia rispetto alle versioni precedenti.

Quando parlo di autonomia mi riferisco alla possibilità di cambiare tutti quei parametri che normalmente richiedono l’accesso alla console di IIS sul server, come compressione dei files, static content, mime types, etc. ; e proprio dell’abilitazione dei mime-type volevo parlare quest’oggi.

Prima di vedere come aggiungere nuovi mime-type alla configurazione di IIS, è giusto capire il perché un webserver non consenta l’accesso ad alcune estensioni di default, bloccando di conseguenza alcuni file a noi utili.
La risposta si racchiude in una sola parola: Sicurezza.

Di fatto, se non ci fosse questo tipo di blocco, un utente potrebbe scaricare anche files con dati sensibili, tipo .mdb, .inc, etc., ossia tutti quei files che il client non dovrebbe mai vedere J.

Capito il perché esistono questi blocchi, è necessario capire come abilitarne alcuni non accessibili normalmente.
A partire dalla versione 7.x di IIS siamo abituati a vedere una nuova sezione nel file di configurazione: “system.webServer”, sezione questa che viene ignorata nel caso l’applicazione stia girando in una versione antecedente alla 7.x (quindi non spaventiamoci se ci troviamo su Windows 2003 ed abbiamo questa strana sezione J).

Al suo interno possiamo impostare parecchi parametri, tra i quali ci sono i mime-type. Questa procedura è veramente molto semplice, ci basta infatti aggiungere poche righe di XML per avere ciò che ci serve, come mostrato dal codice seguente:


    
        
        
    

È molto importante fare attenzione a cosa ci è consentito fare e cosa no da IIS. Infatti non è detto che l’amministratore di sistema voglia offrire la possibilità allo sviluppatore di cambiare alcuni settaggi. Infatti è necessario che le “Delegation” di IIS siano impostate in “Allow” per le sezioni che ci interessano.

Chi fosse interessato all'argomento può buttare un occhio qui http://learn.iis.net/page.aspx/94/delegating-administration/

IIS Rulez!


IIS 7.5 , IIS , Configurazione

0 comments

Migrare un progetto esistente ad Azure

Print Content | More

Dopo il deploy di Dexter, finalmente torno a fare un po’ di post tecnici (speriamo che duri Smile) e spero di raccontare un po’ delle tante “figosità”- passatemi il termine - che ho inserito nell’ultima versione, prima fra tutte il supporto a Windows Azure.
Non che ci siano cose difficili da fare lato tecnologico per migrare una piattaforma ad Azure, ma alcune cose, se pur semplici, non è detto che siano scontante. Quando mi è stato chiesto il supporto al cloud di casa Microsoft, la prima domanda che mi sono posto è stata: come modifico la soluzione e come aggiungo un qualcosa di preesistente?

I passaggi sono veramente pochi e semplici; per prima cosa ci basta aggiungere alla Solution un nuovo progetto di tipo “Windows Azure Cloud Service” e non associare nessun web/worker role al nuovo progetto. Da questo momento la nostra solution dovrebbe contenere il nuovo progetto e, una volta cliccato con il tasto destro, si ha la possibilità di associare un progetto esistente presente nella solution come webrole del nostro Cloud Service.
Gli screenshot seguenti mostrano la proceura passo passo.

29-03-2011 23-29-42 29-03-2011 23-30-2329-03-2011 23-30-36

29-03-2011 23-33-3929-03-2011 23-33-58

Una volta completati questi passaggi è necessario che la nostra applicazione referenzi le tre assembly indispensabili al funzionamento sul cloud:

  • Microsoft.WindowsAzure.Diagnostics;
  • Microsoft.WindowsAzure.ServiceRuntime;
  • Microsoft.WindowsAzure.StorageClient;

Come ultimo passaggio è necessario inserire una classe, “WebRole.cs” nel nostro caso, nel progetto web per far sì che l’environment di sviluppo di Azure possa verificare il corretto funzionamento dell’istanza.

La classe dovrà contenere il seguente codice:

 

using System.Linq;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace Dexter.Web.UI.Azure {
    public class WebRole : RoleEntryPoint {
        public override bool OnStart ( ) {
            // For information on handling configuration changes
            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
            RoleEnvironment.Changing += RoleEnvironmentChanging;

            CloudStorageAccount.SetConfigurationSettingPublisher ( ( configName , configSetter ) => configSetter ( RoleEnvironment.GetConfigurationSettingValue ( configName ) ) );

            return base.OnStart ( );
        }

        static void RoleEnvironmentChanging ( object sender , RoleEnvironmentChangingEventArgs e ) {
            // If a configuration setting is changing
            if ( e.Changes.Any ( change => change is RoleEnvironmentConfigurationSettingChange ) ) {
                // Set e.Cancel to true to restart this role instance
                e.Cancel = true;
            }
        }
    }
}

Da questo momento in poi possiamo fare il run dell’applicazione, ed il tutto dovrebbe girare sotto “Azure”.

Soon altri post del tipo “come migrare un’applicazione ad Azure senza referenziare Azure Smile


Azure , ASP.NET , Cloud

0 comments