Roberto Brunetti

ASP.NET - Mobility
Team System

SharePoint Conference

.NET Programming

Corsi

SharePoint

Web Futures News

Altre novitá rilasciate per Silverlight:

Microsoft Silverlight Tools Beta 2 for Visual Studio 2008

Add-on for Visual Studio 2008 for developing applications for Silverlight 2 Beta 2.

Microsoft Silverlight 2 Software Development Kit Beta 2 (June 2008)

This SDK provides documentation, libraries, and tools for developing Silverlight applications.

Microsoft Expression Blend 2.5 June 2008 Preview

Microsoft Expression Blend 2 is the professional design tool used to create engaging Web-connected experiences for Microsoft Windows. The Expression Blend 2.5 June 2008 Preview allows you to create Microsoft Silverlight 2-based applications.

Sessione Web Futures

Quando si parla del futuro, non si é mai troppo avanti :-)

Il 30 maggio, giorno dopo la fine di DevCon 2008, e qualche ora dopo la fine della sessione su Web Futures é uscita la Preview 3 di ASP.NET MVC Framework.

Nella sessione avevamo parlato della versione Preview 2, ultima disponibile al momento della conferenza.

Non é cambiato molto, soprattutto nelle cose che abbiamo mostrato nella mini-introduzione durante la sessione.

Il download ASP.NET MVC Preview 3

ASP.NET 3.5 Extensions e .NET FW 3.5 SP1 Beta

Continua la marcia verso la release delle estensioni per ASP.NET 3.5.

Dopo il mio delirante :-) post in cui cercavo di far luce sulle varie componenti, ma soprattutto su dove si trovano e in che versione sono (si veda http://blogs.devleap.com/rob/archive/2008/04/18/asp-net-3-5-extension-futures-mvc-preview-2-extension-preview-data-service-dynamic-data-silverlight-dinamic-language-ado-net-sync-service-e-sync-framework.aspx) da qualche giorno è stata rivoluzionata la pacchettizzazione.

In pratica

1) ASP.NET Dynamic Data
2) ASP.NET AJAX Browser History
3) ADO.NET Data Service
4) ADO.NET Entity Framework che facevano parte di ASP.NET 3.5 Extension Preview di Dicembre 2007 sono stati inserire nel .NET Framework 3.5 SP1 Beta (scaricabile da http://www.microsoft.com/downloads/details.aspx?FamilyId=8C36ACA4-E947-4760-9B05-93CAC04C6F87&displaylang=en)

In questo nuovo pacchetto troviamo anche un "quasi" nuovo componente della famiglia: ASP.NET Script Combining che cerca di ottimizzare la quantità di codice Javascript per AJAX quando si utilizzano solo alcuni controlli o un più controlli dello stesso tipo.

Quesito della Susy :-). Cosa manca ?

1) ASP.NET MVC Framework che resta in versione Preview 2 di Marzo 2007
2) Silverlight Controls for ASP.NET che sono stati pacchettizzati nel Silverlight 2 SDK Beta 1 (visto che non esiste più neanche il Silverlight Tools Beta 1 for VS 2008, si trovano solo quì)

Il SP1 Beta del FW 3.5 comprende anche la versione rivista dei synchronization service di ADO.NET per l'utilizzo anche su device Windows Mobile e ADO.NET Entity Framework per SQL CE su device Windows Mobile come indicato in questo mio post: http://blogs.devleap.com/rob/archive/2008/05/17/microsoft-sql-server-compact-3-5-sp1-beta-synchronization-services-for-ado-net-v1-0-sp1-beta.aspx.

Ricordo anche che il SP1 Beta del FW 3.5 non comprende il SP1 Beta per VS 2008 che si può scaricare separatamente. Esiste anche l'installazione combinata di entrambi a questo indirizzo: http://download.microsoft.com/download/7/3/8/7382EA08-4DD6-4134-9B92-8585A5B07973/VS90sp1-KB945140-ENU.exe. Alla nostra DevCon abbiamo due sessioni dedicate a questi argomenti.

Microsoft SQL Server Compact 3.5 SP1 Beta / Synchronization Services for ADO.Net v1.0 SP1 Beta

E' stato rilasciato in versione beta il SP1 per SQL Server Compact Edition versione 3.5: non si tratta peró di una patch, ma di un aggiornamento per supportare ADO.NET Entity Framework. Oltre a LINQ to SQLCE abbiamo quindi la possibilitá (anche se per adesso é una beta) di usare query LINQ su ADO.NET Entity Framework verso SQL CE.

Il secondo componente, sempre incluso nello stesso download, é il SP1, sempre beta, dei Synch Services for ADO.NET V 1.0 (presente in .NET FW 3.5). La vera novitá é il supporto per device (la versione presente nel .NET FW 3.5 gira solo su Desktop).

Questi due componenti si presentano in vari MSI:

1) SSCEDeviceRuntime che rappresenta appunto il runtime di SQL CE 3.5 SP1 Beta per l'ambiente Windows Mobile. Si installa sul Desktop come sempre e va a incastrarsi in Visual Studio 2008 SP1 Beta

2) SSCERuntime é invece il componente analogo per il desktop. Installa anche SQL Server 2008 CTP e Visual Studio 2008 SP1 Beta. Installare prima questo componente

3) SSCEServerTools é la componente server per la replica Merge e/o RDA via IIS. Occorre come sempre disinstallare la versione precedente su IIS prima di installare questa nuova versione. Per qualche dettaglio sulle componenti client e server dare uno sguardo a questo mio articolo http://thinkmobile.it/blogs/rob/archive/2006/08/20/5712.aspx. L'articolo era basato su SQL CE 3.0, ma, versione a parte, le componenti sono le stesse.

Le feature disponibili sono:

  • Supporto per ADO.NET Entity Framework tramite query LINQ.
  • Case-sensitive collation a livello DB
  • SS Management Studio in SQL Server 2008 per amministrare DB SQL CE 3.5 (finalmente) 
  • Replica dei nuovi data type di SQL 2008 come datetimeoffset, geography e geometry.
  • Data replication con SQL Server 2000, SQL Server 2005 e SQL Server 2008 tramite Synchronization Services for ADO.NET v1.0 SP1 Beta sia per desktop che windows mobile
  • Data replication con SQL Server 2005 and SQL Server 2008 tramite merge replication e Remote Data Access (RDA).
  • Alla nostra conferenza annuale DevCon 2008 abbiamo una sessione sull'argomento: la sessione tratta la versione 3.5 ufficiale (quella uscita con .NET 3.5) per coprire la versione attuale, inquadrando anche questi nuovi componenti.

    ADO.NET Sync Services

    Ho appena pubblicato un mio articolo uscito su Computer Programming di Marzo 2008 che ripercorre l'inizio della sessione di DevCon 2008.

    VSTS Web Access

    Facendo riferimento al post precedente http://blogs.devleap.com/rob/archive/2008/04/19/vsts-nuovi-componenti-e-versioni.aspx, mi sono arrivate un paio di mail sul funzionamento di questo oggetto. Condivido qualche screenshot per far capire quali sono i componenti di TFS accessibili via web.

    Prendo il progetto che abbiamo visto in tante nostre conferenze e che abbiamo mostrato come demo al lancio ufficiale di Visual Studio 2008

    Home page: si possono selezionare i TFS Project (a cui abbiamo accesso in base al login effettuato)

    01Home

    Si possono vedere i work item del progetto (bugs nello screenshot)

    02Bugs

    Si possono inserire nuovi work item come dal Team Explorer

    02bNewWI

    Questo il form di inserimento di un nuovo Bug

    02cNewBug

    L'accesso ai Report era garantito anche dalla versione "normale" di TFS tramite il portale esposto da SharePoint. Questa la nuova interfaccia:

    03Report

    Accesso ad un singolo report

    03bReport

    Vista e gestione dei documenti ospitati in SharePoint

    04Documents

    Accesso al Controllo dei sorgenti e relative operazioni su un file

    05SCC

    Accesso alle Build effettuate nel passato

    06Build

    e accodamento manuale di una build

     06bAccoda

    Impostazioni delle Alert su un progetto

    07TeamAlerts

    E gestione della security

     08Security

    In pratica tutte (o quasi) le operazioni effettuabili da Team Explorer e dall'interfaccia web/based nativa possono essere effettuate da questa nuova interfaccia via web.

    Off Topic: mentre facevo questi screenshot, come le brave casalinghe, di domenica mattina, stavo facendo un po' di pulizie...sul PC si intende :-).

    Copiando 79 MB di dati sul disco esterno, mi é apparso questo. Date un occhio al tempo stimato  :-)

    Copia

    Aggiunta al post precedente

    Oltre a quanto indicato in http://blogs.devleap.com/rob/archive/2008/04/18/asp-net-3-5-extension-futures-mvc-preview-2-extension-preview-data-service-dynamic-data-silverlight-dinamic-language-ado-net-sync-service-e-sync-framework.aspx, é stato rilasciato anche Entity Framework per SQL CE.

    Il tutto si trova sotto http://www.microsoft.com/downloads/details.aspx?FamilyID=68539FAE-CF03-4C3B-AEDA-769CC205FE5F&displaylang=en. E' in versione SP1 Beta ed é allineato a ADO.NET Entity Framework Beta 3 e ai Tool della December 2007 CTP. Se veda il post indicato all'inizio per i link e il significato dei vari componenti.

    VSTS: nuovi componenti e versioni

    Rilasciato Visual Studio Team System Web Access 2008 SP1 Power Tool Community Tecnology Preview.

    Prodotto dal titolo piú lungo d'Europa per indicare una nuova versione del famoso TeamPlain, ovvero l'intefaccia web-based per l'accesso a Team Foundation Server.

    Si scarica da http://www.microsoft.com/downloads/details.aspx?FamilyID=A06ED577-DE38-426F-9341-3F78E46DA09A&displaylang=en.

    Riporto l'elenco delle funzionalitá.

  • NEW: Single instance with multiple languages
  • NEW: Direct links to new work items with initial values
  • NEW: Share ad-hoc work item queries
  • NEW: Shelveset viewer
  • NEW: Improved search support
  • Direct links to work items, query results, diffs, change sets and more
  • Display custom controls on work item forms
  • View queued builds, queue new builds
  • Add new work items or edit existing ones
  • Work with any type of work item, including custom ones
  • Add new work item queries or edit existing ones
  • View, download, upload, check-in and check-out documents on SharePoint team portal
  • View reports, export as PDF or Excel
  • Browse source control repositories, download files, view changesets, diffs, histories, and annotated views
  • View build results, start or stop builds
  • Search for keywords in work items
  • Nuova CTP (la dodicesima per la precisione) di Rosario, la prossima versione di Visual Studio Team System.

    Disponibile sotto forma di Virtual Machine giá installata (una gran cosa vista la durata del setup) divisa nei classici .rar da scompattare. 1GB di RAM consigliata: sul mio portatile ho assegnato 2GB e direi che va piuttosto bene.

    Il tutto a partire da questo link http://www.microsoft.com/downloads/details.aspx?FamilyID=65D0E3BD-9DF3-421A-804F-8F01BD90F0B4&displaylang=en.

    Vengono usati i classici account per Setup, Service e Reports.

  • Username: TFSSETUP, password: tfssetup
  • Username: TFSSERVICE, password: tfsservice
  • Username: TFSREPORTS, password: tfsreports
  • ASP.NET 3.5 Extension, Futures, MVC Preview 2, Extension Preview, Data Service, Dynamic Data, Silverlight, Dinamic Language, ADO.NET Sync Service e Sync Framework

    Titolo breve :-)

    Questo post cerca di individuare la situazione attuale di metà aprile rispetto alle mille novità per gli sviluppatori web (e non solo) che ci attendono nei prossimi giorni/settimane/mesi. Come sempre accade quando possiamo dare un'occhiata alle varie CTP e Beta, le cose cambiano, e molto, da versione a versione, e, spesso, la prima cosa che viene modificata è la pacchettizzazione.

    Cerco di fare luce sui vari componenti disponibili e la loro "pacchettizzazione":

    Luglio 2007
    Esce ASP.NET Futures (July 2007 CTP appunto)
    L'idea è quella di inserire nel pacchetto le aggiunte future ad ASP.NET rispetto a quanto già previsto nella versione 3.5.

    I componenti di questo download sono:

    • AJAX History Management: funzionalità che sfruttando le librerie AJAX consentono di gestire la "History" del browser. Attualmente questo componente è nel nuovo pacchetto ASP.NET 3.5 Extension Preview di Dicembre 2007 (vedi sezione apposita). E' quindi diventata obsoleta queta versione
    • Silverlight Control for ASP.NET: espone un componente MediaPlayer pilotabile da Javascript e un componente Silverlight per contenere XAP della versione 1.0 di Silverlight. Anche questo componente è obsoleto ed esiste una nuova versione sia in ASP.NET 3.5 Extension Preview Dic 2007, sia in versione ancora più aggiornata nel Silverlight Tools Beta1 for Visual Studio 2008. Vedi sezione apposita
    • ASP.NET Dynamic Data: l'idea è quella di generare in automatico (e ovviamente poter poi personalizzare il tutto) le pagine di gestione dei dati; si parte dalla definizione di un modello (LINQ to SQL e XML sono nativi) per creare in automatico le pagina di inserimento, modifica, cancellazione, lista, dettaglio e master/detail partendo proprio dalla definizione dello schema del modello. Esiste una nuova versione (3.6) in ASP.NET 3.5 Extension Preview Dic 2007.
    • ASP.NET Application Services: con ASP.NET 3.5 rilasciato è possibile agganciare da pagina AJAX (tramite lo ScriptManager) e da client Windows Form e WPF i servizi applicativi esposti da ASP.NET: Membership, RoleManager, Profile. In pratica l'idea è esporre tramite servizi (è un Handler ASP.NET che se ne occupa) le componenti di Autenticazione (Login e appartenenza ai ruoli) e il Profilo dell'utente, consentendo a client diversi (primo fra tutti un client web basato su AJAX) di accedervi.
      In questo componente vengono esposti altri due servizi per aggiungere servizi di Live Search e SiteMap.
    • Dynamic Language Support for ASP.NET: IronPython e Managed JScript diventano linguaggi utilizzabili in ASP.NET

    Questo componente è ancora disponibile a partire da questo link: http://www.asp.net/downloads/futures/. Perchè lo indico visto che il componente è obsoleto ? Perchè ci sono alcune cose che non sono nei nuovi "package" scaricabili. Ad esempio il supporto a linguaggi dinamici e gli application services non ci sono nelle nuove pacchettizzazioni.

    Dicembre 2007
    Esce ASP.NET 3.5 Extension Preview (Dec 2007 CTP)

    Anche in questo caso troviamo molti componenti ancora attuali.

    I componenti di questa versione sono:

    • AJAX History Management: funzionalità che sfruttando le librerie AJAX consentono di gestire la "History" del browser. Questa è l'ultima versione (ad oggi ovviamente)
    • Silverlight Control for ASP.NET: espone un nuovo componente MediaPlayer pilotabile da Javascript e un nuovo componente Silverlight per contenere XAP della versione 1.0 e 2.0 (novità) di Silverlight. Anche questo componente è però obsoleto ed esiste una nuova versione ancora più aggiornata nel Silverlight Tools Beta1 for Visual Studio 2008. Vedi sezione apposita
    • ASP.NET Dynamic Data: l'idea è quella di generare in automatico (e ovviamente poter poi personalizzare il tutto) le pagine di gestione dei dati; si parte dalla definizione di un modello (LINQ to SQL e XML sono nativi) per creare in automatico le pagina di inserimento, modifica, cancellazione, lista, dettaglio e master/detail partendo proprio dalla definizione dello schema del modello. E' una nuova versione che utilizza la versione 3.6.0.0 della System.Web.Extension. Quando create un progetto dai template di Visual Studio occhio a scegliere la versione corretta: partite da un progetto Dynamic Data per ottenere la configurazione nel config che, sfruttando il classico, bindingRedirect porta all'utilizzo di questa versione al posto della 3.5 inclusa nel .NET Framework
    • ASP.NET Application Services: non è inclusa in questa versione quindi è ancora valida la precedente July 2007 CTP.
    • Dynamic Language Support for ASP.NET: non è inclusa in questa versione quindi è ancora valida la precedente July 2007 CTP.
    • ADO.NET Data Service: anche questo componente sfrutta la versione 3.6.0.0 della System.Web.Extensions (occhio quindi alla configurazione nel web.config, si può usare il template apposito di VS per creare nuovi progetti). L'idea in questo caso è esporre un modello basato su ADO.NET Entity Framework (da installa a parte) tramite servizi che consentono l'interrogazione e l'aggiornamento dei dati. Il modello esposto da questi servizi sfrutta REST per lo scambio delle informazioni da e verso i client: Nella libreria è presente uno script per interagire con i servizi da pagina AJAX-based
    • ADO.NET Entity Framwork: nel setup di ASP.NET Extension Preview è incluso solo il runtime della Beta3: per creare i modelli tramite designer è necessario un componente separato (Beta 3 Designer...occhio che durante il setup afferma di essere la versione Beta2...ma non lo è). Il tutto si scarica da http://www.microsoft.com/downloads/details.aspx?FamilyId=D8AE4404-8E05-41FC-94C8-C73D9E238F82&displaylang=en.
      N.B. Per installare questo componente occorre prima installare il runtime e una patch.
      L'ordine corretto è quindi: installare ASP.NET 3.5 Extension Preview da http://www.microsoft.com/downloads/details.aspx?FamilyId=A9C6BC06-B894-4B11-8300-35BD2F8FC908&displaylang=en, poi la patch da http://go.microsoft.com/fwlink/?LinkID=104985 e poi il designer.
    • ASP.NET MVC Framework: ne parliamo nella prossima sezione (più avanti) in quanto a febbraio 2008 è uscita una nuova versione.

    Questo componente si scarica da  http://www.microsoft.com/downloads/details.aspx?FamilyId=A9C6BC06-B894-4B11-8300-35BD2F8FC908&displaylang=en.

    Febbraio 2008
    Una nuova versione della Preview, ma solo della parte MVC. Il componente si chiama ASP.NET MVC Preview 2 e si scarica da http://www.microsoft.com/downloads/details.aspx?FamilyId=38CC4CF1-773A-47E1-8125-BA3369BF54A3&displaylang=en

    L'idea è quella di poter sfruttare il pattern standard Model View Controller anche nel mondo ASP.NET. Questo componente installa un nuovo handler che redirige le richieste per i vari URI direttamente al Controller. Il Controller effettua le operazione sul Model (che può essere creato con LINQ to SQL, ADO.NET Entity Framework o dai più classici BIZ e DAL) e tramite il metodo RenderView invoca la View che presenta i dati all'utente.

    Il secondo pacchetto uscito a febbraio 2008 prende il nome di Silverlight Tools Beta 1 for Visual Studio 2008 (link incluso). Comprende una nuova versione del controllo Media Player (uscito nella July CTP) e del controllo Silverlight (supportata la 2.0). E' una nuova versione rispetto alle altre due citate in questo post che aggiunge anche:

    • Silverlight 2 Beta 1
    • Silverlight 2 SDK Beta 1
    • KB949325 for Visual Studio 2008
    • Silverlight Tools Beta 1 for Visual Studio 2008

    Si installano due nuovi template in Visual Studio 2008, un generatore di codice XAML e il pieno (quasi :-)) supporto per Intellisense. Il debug funziona abbastanza bene. Per adesso troviamo il supporto per chiamate native a Web Service.

    Varie
    Olte a ADO.NET Data Service, in beta, troviamo SQL Server Data Service (in Beta 1), la cui idea è quella di esporre alcune funzionalità di accesso ai dati tramite servizi.

    ADO.NET Sync Service, componente poco citato ma presente nel framework 3.5, vede subito una sua evoluzione verso il Sync Framework (che attualmente comprende ADO.NET Sync Service 2 Beta, la possibilità di sincronizzare Feed RSS e altri componenti sia client-to-server sia peer-to-peer). La direzione è quella di costruire un framework di sincronizzazione che possa sfruttare anche i servizi ADO.NET Data Service e SQL Server Data Service per poter accedere a dati remoti quando siamo online e/o sincronizzarli per poter poi lavorare offline.

     Alla DevCon 2008 abbiamo due sessioni: la prima Web Futures sarà una sessione plenaria in cui faremo una carrellata di tutte le novità che riguardano in qualunque forma il Web, accennate nella prima parte del post; sarà una sessione a sale congiunte. L'altra sessione è invece dedicata a ADO.NET Sync Service rilasciata con il framework 3.5 e Visual Studio 2008.

     

    Posted: apr 18 2008, 10.40 by rob | with 2 comment(s) |
    Filed under: ,
    System Center Mobile Device Manager 2008

    E' stato rilasciata la versione 2008 di MDM. Questo il link per il download http://www.microsoft.com/downloads/details.aspx?FamilyID=8D244DCD-F5E7-4C9B-83AF-55502EA2996B&displaylang=en.

    Si tratta di un componente per Widnows Server 2003 che consente di gestire i device con a bordo Windows Mobile 6.1 come membri dell'infrastruttura IT. E'possibile accedere ai servizi aziendali come Active Directory, distribuzione del software e certificati digitali.

    Il download é circa 18 MB per ogni lingua.

    Nuovo Corso DevLeap

    Ho appena pubblicato un nuovo corso DevLeap dedicato all'accesso e alla replica dei dati verso dispositivi mobile. Per dispositivo mobile si intende il classico palmare, i notebook, gli UMPC, i Tablet e perché no anche i normali Desktop.

    L'idea é nata dal fatto che sulla piazza troviamo diverse tecnologie di replica dei dati che trattiamo nei nostri corsi mobile. Con l'uscita di .NET 3.5 ha visto la luce anche ADO.NET Sync Service e quindi abbiamo pensato di creare un corso apposito per analizzare nel dettaglio le varie tecnologie mettendole a confronto. Visto che ADO.NET Sync Service usa SQL CE 3.5 come store di informazioni la prima parte del corso affronta le metodologie e le tecniche piú efficienti di accesso ai dati verso SQLCE, tecniche spesso differenti rispetto a SQLServer/SQLExpress.

    Se siete interessati ecco la scheda tecnica dettagliata.

    Workflow Foundation: State Machine Event

    Ieri, al lancio di Visual Studio 2008, mi è arrivata questa domanda dopo la mini-sessione su Workflow Foundation. Condivido la risposta con tutti.

    "Come posso sapere quali eventi attente il workflow a stati quando si trova in uno stato".

    Gli eventi inviati verso una workflow instance vengono inviati all'istanza tramite una coda. La coda viene creata dalle activity di tipo HandleExternalEventActivity (o derivate ovviamente) durante la sua inizializzazione. Questa coda, di tipo EventQueueName viene creata in questo modo:

    protected sealed override void Initialize(IServiceProvider provider)
    {
        if (provider == null)
        {
            throw new ArgumentNullException("provider");
        }
        if ((!base.IsDynamicActivity && !this.IsNestedUnderMultiInstanceContainer) || this.IsInitializingUnderMultiInstanceContainer)
        {
            Type interfaceType = this.InterfaceType;
            string eventName = this.EventName;
            IComparable comparable = null;
            if (CorrelationResolver.IsInitializingMember(interfaceType, eventName, null))
            {
                comparable = new EventQueueName(interfaceType, eventName);
            }
            base.SetValue(QueueNameProperty, comparable);
            CorrelationService.Initialize(provider, this, interfaceType, eventName, base.WorkflowInstanceId);
        }
    }
    

    Quando il workflow si trova in uno stato che accetta una serie di eventi la collezione di WorkflowQueueInfo ci mette a disposizione le informazioni sulle code. E' sufficiente quindi fare un ciclo su tale collezione, verificare che si tratti di una EventQueueName (potrebbero essere attive anche code che non riguardano gli eventi di scambio dati con l'host) e ottenere le informazioni sull'evento in ascolto.

    Ecco il codice:

    ReadOnlyCollection<WorkflowQueueInfo> queueInfoData = this.workflowInstance.GetWorkflowQueueData();
    if (queueInfoData != null)
    {
        foreach (WorkflowQueueInfo info in queueInfoData)
        {
           
    EventQueueName eventQueue = info.QueueName as EventQueueName;
            if (eventQueue != null)
               
    eventQueue.MethodName   // Otteniamo il nome dell'evento (occhio ai nomi: la proprietà si chiama MethodName)

         }
    }

    Workflow Foundation: Uno Spettacolo !

    Chi ci conosce sa che non facciamo pubblicità a prodotti e tecnologie: spesso cerchiamo di evidenziare quanto sia importante conoscere a fondo una tecnologia prima di utilizzarla. Da qualche anno gli strumenti di sviluppo semplificano sempre di più la vita agli sviluppatori, ma è diventato sempre più difficile mettere insieme i pezzi: le tecnologie sono sempre più legate l'una all'altra ed è impossibile sapere tutto di tutto. I prodotti, lasciati ai loro default, funzionano ad un livello medio: non potrebbe essere diversamente. Spesso ci sono oggetti o componenti che vanno benissimo in certi contesti, ma sono assolutamente inappropriati in altri; tanto per cambiare mi vengono in mente le Session di ASP.NET che utilizzate in contesti molto piccoli non danno nessun tipo di problema e aiutano nello sviluppo, ma portate in applicazioni più serie (voglio anche dire applicazioni in cui occorre sapere cosa c'è nella sessione di ogni utente: ad esempio il carrello della spesa su un sito di eCommerce) sono assolutamente inutilizzabili.

    Workflow Foundation rientra in questa categoria di tecnologie: nasce come prodotto per gestire Worfklow (punto). Come tale deve essere impiegato in scenari statefull e stateless, può gestire i processi di Business così come la User Interface. Settimana scorsa ho erogato il nostro corso su WF da un nostro cliente e come è accaduto per tutte le edizioni precedenti, la prima mattina vola via sulle caratteristiche principali; l'impatto sull'audience è notevole e i commenti più blasonati sono "Spettacolo", "Quanto si semplifica lo sviluppo e la manuteniblità", "Utilissimo per dare uno strumento di disegno a chi non scrive codice ma conosce la problematica e lo stesso strumento allo sviluppatore di Activity che eseguire le operazioni fisiche".

    Il pomeriggio del primo giorno si riprendono tutti gli argomenti e si comincia a scendere nei dettagli di Hosting e Runtime (senza ancora affrontare i servizi) e la giornata sta per concludersi con l'entusiamo alle stelle visti quanti servizi espone. Si affronta l'argomento asincrono, già perchè Wf lavora in asincrono per default e iniziano i primi dolori :-) Lavorare in asincrono è bello, oltre che efficace.

    La mattina seguente si affronta il ManualScheduler che esegue le workflow instance sullo stesso thread del chiamante e la fiducia ritorna ai massimi livelli: ci sono però molte controindicazioni a lavorare in sincrono e il modo con cui si affronta l'hosting in applicazioni server-side (ASP.NET ad esempio) ricomplica anche lo scenario sincrono in quanto per evitare persistenze inutili (e soprattutto pesanti) occorre prestare molta attenzione e scrivendo il codice bene e configurando il runtime e la persistenza nel modo corretto. Tutti i parametri spaventano a prima vista.

    Poi si apre lo scenario comunicazioni con l'esterno partendo da Eventi e Metodi di scambio dati con host, che si effettua sempre tramite interfacce, e di seguito si affronta la comunicazione con altri workflow e con servizi ASMX tramite Activity asincrone che si avvalgono di code: a prima vista è una cosa complicata da realizzare e il "terrore" negli occhi dei partecipanti è visibile anche a luce spenta :-) Subito dopo però si evidenziano i benefici di lavorare in questo modo e tutto diventa di nuovo entusiasmante.

    Si chiude il tutto (il terzo giorno di solito) con una analisi dei servizi di persistenza, traking, commit e work batch, IPending Work: sui primi la valutazione iniziale è "cacchio", non è esattamente questa l'escalmazione ma ci assomiglia molto soprattutto nelle prime due lettere :-), mentre sugli ultimi due punti ritorna il panico.

    Workflow è veramente un gran prodotto: serve solamente una buona preparazione e un po' di pratica; del resto su tutti i prodotti servono questi due ingredienti. Sicuramente si possono fare tanti casini e il prodotto è relativamente nuovo quindi chi non lo approccia nel modo corretto si trova un qualcosa che vive di vita propria; in realtà la configurazione e il corretto utilizzo consentono di fare cose eccellenti.

    La nostra prima applicazione su Workflow risale ormai a due anni fa (abbiamo iniziato con la Beta su un progetto reale) e, nonostante le varie prove semplici e lo studio che avevamo alle spalle prima di intraprendere questa strada, Paolo e io abbiamo dovuto spendere un po' di tempo prima di trovare la strada giusta per il tipo di applicazione. A distanza di due anni posso dire che abbiamo preso la strada giusta e alla fine, lo sviluppo, anche nei primi mesi dopo le elucubrazioni di cui sopra, è stato molto più che soddisfacente in termini di produttività e modifiche che abbiamo dovuto fare in corsa causa analisi incompleta. Modificare i flussi da un designer significa risparmiare molto, ma molto tempo, rispetto a dover riprendere in mano centinaia di righe di codice.

    Il nostro mondo è bello proprio perchè possiamo lavorare con tecnologie come questa: a mio avviso è il più bel prodotto che sia stato presentato negli ultimi anni e rapprensenta un notevole, per non dire enorme, passo avanti nella scrittura di applicazioni.

    Spero di avervi convinto a dare almeno un'occhiata a questa tecnologia.

    PS: per chi non ha mai visto questa tecnologia abbiamo pensato ad una sessione di quasi 4 ore alla nostra DevCon 2008 che si terrà a Milano a fine maggio.

    Convertire una macchina virtuale VMWare a Virtual PC/Virtual Server

    Oggi, da un cliente, ho dovuto convertire un paio di macchine virtuali VMWare a Virtual Server: i server di sviluppo sono stati convertiti a Virtual Server.

    Non esistendo un tool nativo di importazione della macchina virtuale abbiamo deciso di usare l'utility VMDK to VHD Converter disponibile nella sezione Download di http://vmtoolkit.com/files/default.aspx.

    Lo strumento converte semplicemente il disco VMDK in VHD consentendo poi la creazione della macchina Virtual PC o Virtual Server agganciando un disco esistente.

    La conversione dell'hard disk deve però essere effettuata dopo qualche modifica manuale.

    Riporto tutti i passi seguiti oggi evitando di linkare post esterni visto che negli ultimi tempi sembra che la moda porti i webmaster a spostare le cose senza mettere redirezioni :-)

    0) Copiare la Virtual Machine o eseguire un Clone per lasciare intatta la macchina originale 

    1) Disinstallare i VMWare Tools. Al termine Reboot

    2) Se durante il reboot viene fuori il wizard di Add/Remove Hardware annullare l'operazione

    3) Verificare la versione del Service Pack. Se non ci sono SP installati prendere il CD originale o tenere a portata di mano la directory i386. Se ci sono SP installati occorrono i file di setup del Service Pack accessibil: se avete il SP installato con i file copiati in x:\windows\servicepackfiles è sufficiente copiare i file indicati senza bisogno del CD originale

    4) Aprire il Command Prompt

    5) Se avete il SP nella directory servicepackfiles copiare hal.dll sotto x:\windows\system32\

    6) Se non avete il SP nella directory servicepack file occorre la directory i386 a portata di mano e lanciare expand d:\\i386\\hal.dl_ %windir%\\system32\\hal.dll

    7) Eseguire la stessa operazione (5 o 6) per ntoskrnl.exe (copia del file oppure expand d:\\i386\\ntoskrnl.ex_ %windir%\\system32\\ntoskrnl.exe)

    In ultimo, prima di lanciare l'utility di esportazione del VMDK copiare nella macchina virtuale il seguente script e lanciarlo. Al termine dello script la macchina esegue uno shut down ed è pronta per l'esportazione dal tool citato all'inizio del post. 

    Create un file .vbs (per Windows Scripting Host) e lanciarlo. Se al termine dello script (dopo la MessageBox) il sistema non si riavvia, riavviarlo a mano: probabilmente l'impersonation non riesce e quindi non ci sono i diritti per fare shutdown.

     'prepvm.vbs
    'Removes VMware-specific drivers from a system
    On Error Resume Next

    ' Instantiate Shell Object
    Set objShell = CreateObject("WScript.Shell")

    ' Disable VMware Tools Service
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\VMTools\\Start", _
                     4, "REG_DWORD"

    ' Disable VMware vmx_svga video driver
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\vmx_svga\\Start", _
                     4, "REG_DWORD"

    ' Disable VMware vmmouse driver
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\vmmouse\\Start", _
                     4, "REG_DWORD"

    ' Disable VMware vmscsi driver
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\vmscsi\\Start", _
                     4, "REG_DWORD"
                 
    ' Disable VMware PCnet driver
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\PCnet\\Start", _
                     4, "REG_DWORD"

    ' Disable VMware Buslogic driver
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\buslogic\\Start", _
                     4, "REG_DWORD"

    ' Disable SCSI Miniport drivers
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\symc810\\Start", _
                     4, "REG_DWORD"
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\symc8xx\\Start", _
                     4, "REG_DWORD"
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\cpqarray\\Start", _
                     4, "REG_DWORD"
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\pcntn4m\\Start", _
                     4, "REG_DWORD"
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\cpqnf3\\Start", _
                     4, "REG_DWORD"
    objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\MRaidNT\\Start", _
                     4, "REG_DWORD"

    ' Restart Computer
    strComputer = "."

    'Prompt user of impending reboot
    WScript.Echo("The system is prepared for imaging and will now shutdown.")
    WScript.Sleep(3)
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate,(Shutdown)}!\\\\" & _
            strComputer & "\\root\\cimv2")

    Set colOperatingSystems = objWMIService.ExecQuery _
        ("Select * from Win32_OperatingSystem")

    For Each objOperatingSystem in colOperatingSystems
        objOperatingSystem.Shutdown()
    Next

     

    ADO.NET Synchronization Services: Considerazioni

    .NET 3.5 porta con sè un componente non troppo pubblicizzato denominato ADO.NET Synchronization Framework. L'idea fa parte di un ben più allargato Microsoft Synchronization Framework che vedrà la luce prossimamente come framework comune per la sincronizzazione di informazioni.

    In questo post volevo sottolineare alcuni aspetti su cui si trovano informazioni contrastanti.

    Gli oggetti supportati dal motore di sincronizzazione sono:

    1) Table per tutte le tipologie di sincronizzazione

    2) View per sincronizzazioni Snapshot e Download-Only

    3) Il client appoggia i dati su SQL CE 3.5 e NON su SQL Express (almeno nella versione attuale)

    4) Per default non vengono portati sul db locale i constraint di FOREIGN KEY, DEFAULT e UNIQUE.
        Se occorre abilitare (e spesso è giustamente necessario) questi constraint lato client occorre modificare lo schema del DB sul client.
        Questa operazione può essere effettuata utilizzando comandi DDL dopo la prima sincronizzazione dei dati, ma è consigliabile utilizzare l'oggetto SyncSchema.
        In ogni caso è poi possibile modificare lo schema del DB lato client.
        Se gli schemi sono diversi tenere in considerazione questa semplice regola:
            Se viene replicato un campo (ovvero fa parte della SELECT di scaricamento dei dati) che non esiste sul client, il campo viene ignorato
            Se il client ha un campo in più rispetto a quanto viene sincronizzato il campo verrà valorizzato con il suo DEFAULT se presente o con NULL.

    5) Le colonne con proprietà ROWGUIDCOL vengono invece portare su SQLCE, ma senza la proprietà ROWGUIDCOL

    6) Il client appoggia i dati su tabelle anche se viene sincronizzata una View...ovviamente

    7) Non sono supportati gli oggetti fully-qualified: in pratica se abbiamo una tabella EstatesManagement.tabSalesman dove EstatesManagement rappresenta l'owner o lo schema. Occorre usare solo il nome della tabella.

    8) Il framework fa parte di .NET 3.5 e non del .NET CF 3.5, quindi questo motore di sincronizzazione dei dati NON è utilizzabile (almeno nella versione attuale) da dispositivi Windows Mobile.

    Si possono lanciare una sincronizzazione alla volta: anche eseguendo la sincronizzazione da un thread separati non è possibile lanciare sincronizzazioni contemporanee sugli stessi oggetti: in pratica se una tabella è oggetto di una replica in corso, non è possibile lanciare un'altra sincronizzazione in parallelo che utilizzi la stessa tabella.

    Non è supportata la gestione dei campi Identity: in pratica il motore di sincronizzazione non ha meccanismi nativi per distribuire range di identity ai vari client.

    Particolare attenzione deve essere posta nelle procedure di recovery a fronte di un restore dei DB: se il database server viene ripristinato da un restore le modifiche successive potrebbero non venir propagate ai vari client; il motivo è semplice: i client memorizzano solo nel database locale il valore di anchor ottenuto dall'ultima sincronizzaione: se un client era arrivato nella sincronizzazione precedente a recuperare le modifiche, dopo un restore sul server il client continua a chiedere le modifiche effettuate sul server successive all'ultima anchor . Quindi alcune modifiche effettuare sul server dopo il restore non vengono propagate al client in quanto l'anchor sul server ripristinato è inferiore all'anchor memorizzato sul client. Inoltre il client che ha effettuato l'upload di modifiche, dopo un restore del database server, si ritrova delle righe che sul server non esistono (visto che il DB è tornato ad una situazione precedente), e, ancora una volta il client pensa di averle sincronizzate visto che la sincronizzazione precedente era andata a buon fine.

    Occorre quindi modificare il comportamento di default del motore di replica. Potremmo prendere spunto al processo utilizzato dalla Merge Replication di SQL Server: memorizzando anche sul server in una nostra tabella le anchor relative ai vari client. Durante ogni sincronizzazione, tramite una modifiche ai vari statement di select delle modifiche occorre incrociare l'anchor arrivata dal client con l'anchor presente sul server e utilizzare il valore minore per selezionare i record oggetto di modifica.

    Come ultimo punto, nelle repliche partizionate per singolo utente conviene indicare sempre il parametro ClientId che solitamente si memorizza in un file di configurazione: non specificando questa proprietà il ClientSyncProvider valorizza questa proprietà in base alla chiave di registry HKCU\Software\Microsoft\Microsoft SQL Server Compact Edition\v3.5. Come sappiamo è bene non accedere al registry visto che sono richiesti permessi amministrativi per l'accesso.

    Torneremo sull'argomento in altri post e in una sessione dedicata alla nostra DevCon 2008.

    Posted: feb 15 2008, 11.52 by rob | with no comments |
    More Posts Next page »