di .NET e di altre amenità

Appunti di WPF: usare XamlWriter e problemi di serializzazione

Tempo fa ho accennato al fatto che XAML è uno dei migliori metodi di serializzazione che siano mai stati inventati. Tuttavia negli ultimi giorni ho avuto qualche delusione di troppo, che non ha variato la mia opinione in merito, ma semplicemente ha ridotto la mia fiducia nell'implementazione corrente. Il problema peggiore è dovuto ad una limitazione, per la verità esplicitata nella documentazione, che però crea più grattacapi del previsto. Se ad esempio provare a serializzare con XamlWriter un oggetto che contiene una stringa vuota vi troverete con uno XAML risultante che XamlReader non sarà in grado di riportare alla vita... Il problema come dicevo appare ovvio dopo che si è letta la documentazione. XamlReader non è in grado di deserializzare tipi che non abbiano un costruttore di default. A ben guardare il tipo String tale costruttore non lo ha proprio e l'effetto collaterale è che quando XamlReader tenta di deserializzare una stringa che abbia un valore tutto va bene, mentre ovviamente va in eccezione quando la stringa è vuota.

Comunque, per chi desidera cimentarsi, ecco un utile link dove si discute di XamlWriter

Link: http://blogs.msdn.com/mikehillberg/archive/2006/09...

Un dolce sugello a tre mesi di lavoro

Finalmente posso dirlo, dopo un periodo di fuoco, ora è arrivato il sugello che conferma che ce l'abbiamo fatta. La conferenza stampa di stamane alla BIT di Milano è andata bene, e quindi mi sento di rendere nota la mia ultima fatica e cogliere l'occasione per ringraziare chi in questi ultimi tre mesi ha lavorato nel mio team rendendo possibile questa memorabile giornata.

www.airdolomiti.it, il sito di una nota compagnia aerea è online da poche ore e quindi ora è giunto il momento dei ringraziamenti. Uno in particolare al collega Andrea Dottor che è stato insostituibile/infaticabile nel forgiare assieme a me il Content Management System che è alla base del sito web e sul quale nutro forti speranze. Si tratta infatti un po' della sintesi della mia esperienza con i CMS che ormai dura da qualche anno. In questo prodotto sono racchiuse tutte le migliori idee che ho visto negli ultimi anni. Un po' di Umbraco, qualcosina da Cuyahoga, DNN, e poi Documentum e qualche altro di cui nemmeno ricordo il nome mixate con un po' di follia da parte mia nel creare un engine che è in grado di erogare pagine composte dinamicamente come se fossero semplici pagine aspx sfruttando alla base le potenzialità dello strepitoso runtime di ASP.NET 2.0. Un'altro ringraziamento va a Davide Vernole che è stato vitale nel supporto che mi ha dato nell'ideazione dell'architettura SOA, delle centinaia di problemi che ci sono caduti addosso inaspettatamente nel passaggio dalla RC-1 alla RTM di ASP.NET AJAX 1.0 (per inciso, non perdetevi i suoi prossimi webcast sull'argomento). Ancora, un ringraziamento a Roberto Schiabel, che nonostante non fosse direttamente impiegato nel progetto non ha mancato di darci ossigeno supportandoci nei momenti di maggiore pressione e fornendoci dei preziosi suggerimenti. E poi a tutti gli altri, che non riesco nemmeno a nominare, i grafici, il management di MM-One, i commerciali (si, anche loro!!!), e le ragazze di AirDolomiti (Alessia, Silvia, Veronica, Cristina, etc...) che hanno avuto la pazienza di sopportare le decine di bug delle prime ore dopo la release del CMS.  Ora vado a casa e mi godo in santa pace la serata gustandomi la tavoletta di cioccolata fondente con mia moglie e mia figlia cui va il ringraziamento più sentito per aver saputo sopportare le mie notti di assenza. E Lunedì si riprende.

Prossimi webcast

Nella foga della consegna di questa settimana ho dimenticato di comunicare che ho ricevuto la conferma dei prossimi webcast che dovrà tenere. Si tratta di due appuntamenti, schedulati per la seconda metà di Marzo, nei quali parlerò di argomenti molto diversi:


Il primo dei due webcast verterà ancora una volta su WPF, che sta diventando un po' alla volta il mio tormentone. Le animazioni sono un argomento che nell'ultimo webcast avevamo avuto solo il tempo di sfiorare e ho ritenuto giusto approfondire l'argomento dedicando ad esso 90 minuti pieni. Con il secondo webcast invece inizio a parlare dell'argomento che mi sta molto a cuore. Si tratta naturalmente di ASP.NET, la piattaforma che uso tutti i giorni per lavoro. Recentemente ho avuto l'occasione di realizzare un software "cms" dedicato alla pubblicazione di siti web e di affrontare con esso una serie di problematiche relative il posizionamento sui motori di ricerca che credo troveranno il vostro gradimento.

Appunti di WPF: incoming meetings

Ne ho dato annuncio ieri sul sito dello usergroup, e finalmente oggi posso ribadire anche nel mio weblog l'appuntamento del prossimo 9 Marzo. In quella data infatti si terrà il primo di una serie di community meeting (come ama chiamarli l'amico Davide Vernole), organizzati da me e dagli altri soci di XeDotNet, che si snoderà nelle più moderne tecnologie proposte da Microsoft. Le date solo le seguenti:

9 Marzo 2007 - Windows Presentation Foundation - Speaker: Andrea Boschin

6 Aprile 2007 - Windows Communication Foundation - Speaker: Davide Bedin

11 Maggio 2007 - Workflow Foundation - Speaker : Raffaele Rialdi

22 Giugno 2007 - ASP.NET AJAX - Speaker: Davide Vernole & Andrea Dottor

Si tratta di un vero e proprio percorso formativo, all'interno del quale saremo guidati da persone di elevata competenza (me escluso ovviamente... :D) nella scoperta delle possibilità offerte da queste tecnologie. Come sempre gli incontri, che stavolta sono configurati come degli one-man-show per consentire di riservare un buona fetta del tempo al dibattito, verteranno sì su una overview dell'argomento ma soprattutto daranno molti esempi e spunti di codice da osservare, studiare e riutilizzare.

Vi invito perciò ad iscrivervi in massa in fretta perché al solito i posti sono limitati (30-35) e quindi chi primo arriva...

Iscrizioni: http://www.xedotnet.org/nextmeeting.aspx

Appunti di WPF: Anticipazioni "quasi" top-secret

Io non vi ho detto nulla... ma se andate a guardare bene nel sito dello troverete un primo indizio delle attività del 2007.

http://www.xedotnet.org/48/section.aspx/267

Si tratta di un assaggino però. A breve sarà pubblicato il calendario di una raffica di eventi con guest star di eccezione, cui attendiamo la vostra partecipazione in massa... non mi dispiacerebbe stavolta dover correre a cercare una nuova sala.

E per le iscrizioni??? E' ancora presto: datemi qualche giorno

ASP.NET 2.0: A volte ritornano

Non chiedetemi perchè, ma sono sempre stato uno sfegatato appassionato di Javascript. Sì, avete letto bene. proprio lui, l'odiata bestia nera dei programmatori web, il mostro del debugger, l'antitesi della programmazione ordinata. Eppure con javascript ho fatto le mie più belle cose. Ricordo ad esempio nel lontano 2002 quando ho sviluppato una piattaforma di elearning che sviluppai appoggiandomi ad un componente oggi arcinoto, tale XmlHttpRequest, una specie di player per corsi in formato SCORM che sfruttava una sorta di antidiluviano AJAX per evitare il postback. Tra l'altro lo faceva con un frameset e incorporava un mini serializzatore/deserializzatore XML scritto tutto in Javascript ad oggetti.

Poi con la nascita dei "dialetti" di Javascript altenativi a Internet Explorer lavorare con esso è diventato solo fonte di repentini mal di capo perciò ho lasciato un po' perdere a favore del server-side. Da qualche giorno però è unscita una cosa che promette di regalare una nuova giovinezza al mio infantile amore. Non so quanti se ne siano accorti, ma assieme al rilascio del decantato ASP.NET AJAX 1.0 è arrivata una splendida libreria Javascript cross-browser. Non per svalutare AJAX per carità, conosco qualcuno che me la potrebbe far pagare per questo, ma devo dire che la in questione è infinitamente più apprezzata dal mio punto di vista.

Tanto per darvi un'idea, avete presente che cosa occorreva fare per una semplice getElementById()? Ecco, ora il codice si limita alla seguente:

var element = $get('elementid');

Il tutto naturalmente cross-browser. Questo esempio è banale, ma se si mettono in conto tutti gli oggetti creati in questa fantastica libreria la programmazione Javascript torna as essere qualcosa de prendere in considerazione.

Ecco in poche righe un altro esempio che ho messo in piedi nei giorni scorsi:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Imagic</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <div id="main">
            <img src="~/images/s.gif" id="image" alt="image" runat="server" />
        </div>
    </form>
    <script type="text/javascript">
    $addHandler(window, "load", window_Resize);
    $addHandler(window, "resize", window_Resize);

    function window_Resize(eventElement)
    {
        var main = $get('main');
        var image = $get('image');
        var mainBounds = Sys.UI.DomElement.getBounds(main);
        var imageBounds = Sys.UI.DomElement.getBounds(image);
        image.style.top = (mainBounds.height - imageBounds.height) / 2;
        image.style.left = (mainBounds.width - imageBounds.width) / 2;
    }
    </script>
</body>
</html>

In questo modo il contenuto di "main" rimarra centrato nello schermo anche durante il resize del browser, grazie a posizionamento assoluto e Javascript... e naturalmente su tutti i browser!!!

Se questa non è magia...

Questione di priorità

L'apertura del TG di LA7 stasera ha presentato un sondaggio che chiedeva se la legge sulle unioni di fatto debba essere o meno una priorità del governo italiano. Confesso che di primo acchito la risposta che tra me e me ho dato è stata "no", di certo ci sono cose più importanti che riguardano molte piu' persone. Pensandoci bene però debbo rilevare che la domanda non ammette risposta, ne negativa ne positiva. Certo se ragioniamo con il criterio delle priorità ci sarebbero molte cose che vengono prima, ma a mio parere un governo non può avere delle "priorità" ma ha semplicemente dei problemi da risolvere. La priorità è una scusa bella e buona per non occuparsi di problemi che si preferisce non ammettere per dolo o per ipocrisia. C'è un problema? Il governo è li apposta per trovarvi una soluzione, possibilmente in anticipo, prima che esso diventi una priorità dato che tale problema per chi ne è afflitto è già una priorità per il solo fatto di esistere. Ma il tempo è limitato si potrebbe obbiettare. Il giorno ha 24 ore e di giorni in una anno ce ne sono ben 365. Esistono i consulenti e il meccanismo della delega. E se ancora non basta? Beh io sono da sempre favorevole alla legalizzazione delle droghe... un po' di anfetamina e...

ASP.NET AJAX: Implementare un box di attesa.

Dopo il post di Dino Esposito che informava a proposito di un bug del framework ASP.NET AJAX 1.0 RTM, mi sono trovato repentinamente nella necessità di scovare un work-around che mi permettesse di implementare un meccanismo di attesa durante le chiamate. Il bug segnalato in questo post poneva di fronte al fatto che il controllo UpdateProgress ha problemi a lavorare in collaborazione con l'UpdatePanel qualora quest'ultimo abbia dei trigger specificati al suo interno. M'è perciò venuto in mente di provare ad usare la  di Simone Busoli, per vedere se in qualche modo riuscivo a dare un feedback all'utente di ciò che stava accadendo. Qui sotto vi propogno il pezzo di codice che genera lo script necessario ad agganciare gli eventi del PageRequestManager di ASP.NET AJAX.

/// <summary>
/// Creates the busybox script.
/// </summary>
private void CreateBusyboxScript()
{
    StringBuilder builder = new StringBuilder();

    builder.AppendLine(@"var isBusyBoxShow = false;");
    builder.AppendLine(@"Sys.Application.add_load(ApplicationLoadHandler);");
    builder.AppendLine(@"function ApplicationLoadHandler()");
    builder.AppendLine(@"{");
    builder.AppendLine(@" Sys.WebForms.PageRequestManager.getInstance()" +
            ".add_beginRequest(ajaxBeginRequest);");
    builder.AppendLine(@" Sys.WebForms.PageRequestManager.getInstance()" +
            ".add_pageLoaded(ajaxEndRequest);");
    builder.AppendLine(@"}");
    builder.AppendLine(@"function ajaxBeginRequest(sender, args)");
    builder.AppendLine(@"{");
    builder.AppendFormat(" if (!isSuppressBusyBox(args.get_postBackElement()))" +
            " {{ {0} isBusyBoxShow=true; }}\n", busybox.ShowFunctionCall);
    builder.AppendLine(@"}");
    builder.AppendLine(@"function ajaxEndRequest(sender, args)");
    builder.AppendLine(@"{");
    builder.AppendLine(@" if (isBusyBoxShow)");
    builder.AppendFormat(" {0}\n", busybox.HideFunctionCall);
    builder.AppendLine(@" isBusyBoxShow=false;");
    builder.AppendLine(@"}");
    builder.AppendLine(@"function isSuppressBusyBox(element)");
    builder.AppendLine(@"{");
    builder.AppendLine(" if (element.suppressBusyBox==null) return false;");
    builder.AppendLine(" return (element.suppressBusyBox.toLowerCase()==\"true\");");
    builder.AppendLine(@"}");

    this.Page.ClientScript.RegisterStartupScript(
            this.GetType(), 
            "showBusyBox", 
            builder.ToString(), true);
}

In sostanza grazie alle API di ASP.NET AJAX si predispongono due handler per gli eventi beginRequest e pageLoaded che scattano rispettivamente prima dell'invio del callback al server e immediatamente dopo la risposta. All'interno di questi handler è iniettata la chiamata alla funzione che provoca l'apparizione della busybox. La parte comoda di questa implementazione è che l'apertura e la chiusura del messaggio è completamente indipendente dal codice che si è realizzato. Per consentire un minimo i controllo ho deciso anche di adottare un meccanismo che consenta di specificare per quali controlli non mostrare la busybox. Per ottenere questo risultato ho sfruttato la capacità di ASP.NET di iniettare degli attributi custom nel markup.

<asp:LinkButton runat="server" ID="bButtonBar" suppressBusyBox="true" />

Il codice javascript controlla se l'elemento che ha scatenato il postback contiene questo attributo e qualora lo trovi valorizzato a "true" evita di mostrare la busybox. Naturalmente per adottare questo codice è necessario inserire nel markup il codice della busybox, ma per questo troverete una ottima documentazione sul sito del progetto.

Technorati tags: , , ,