di .NET e di altre amenità

The day after... MVP Open Days

Colgo l'occasione di questo post di per ringraziare io stesso tutte le persone che ho conosciuto durante i miei primi Open Days di Pistoia da cui sono tornato giusto ieri sera. E' stato un weekend spendido sia per la compagnia che per la (per non parlare delle pietanze toscane...) nel quale ho finalmente dato una faccia a molte persone che finora avevo incontrato solamente online nei blog nella chat e nei newsgroup. Sono estrememente colpito dall'affiatamento che tiene insieme questo gruppo di persone al quale spero di riuscire ad amalgamarmi nonostante la mia natura poco espansiva. Ieri, nonostante questo sono stato accolto a braccia aperte da chiunque, e per questo ringrazio veramente di cuore tutti i membri di questo fantastico A-Team cui oggi posso dire di essere parte anche io.

Technorati tags: , ,

Silverlight che c'è

Ormai da un po' di giorni sto assistento ad uno stillicidio che non condivido e che ritengo equivoco e dannoso. Perciò e venuto il momento che dica la mia a proposito di alcuni post che ho letto e alcune opinioni che ho sentito esprimere sulla versione 1.0 di Silverlight. Secondo taluni Silverlight 1.0 sarebbe un "giocattolo" destinato a morire prima ancora di essere concepito che servirebbe solo da specchietto per le allodole in attesa di una matura versione 1.1 che verrà. Certo non si può dire che Silverlight 1.0 sia una piattaforma definitiva (ma onestamente, ne è mai esistita una?) e di ciò credo ne dobbiamo essere tutti pienamente coscienti, ma degradare questo bel pezzo di software a mero "media player" significa non aver nemmeno avuto la voglia di provare a farci qualcosa.

Pare che il peccato originale di Silverlight sia di richiedere l'uso dell'odiato Javascript che forse qualcuno considera un linguaggio poco onorevole ma che - come credo di aver dimostrato - è un dignitosissimo strumento con delle peculiarità che altri linguaggi possono solo sognare. Senza considerare che è ancora l'unico valido strumento in grado di regalarci una cosa come AJAX (e nessuno credo si sia mai lamentato di questo).

E poi chi conosce Flash sa che ActionScript altro non è che un pessimo Javascript condannato ad essere spalmato all'interno di centinaia di frame contro ogni regola di buona programmazione. E allora che male c'è ad avere un Silverlight che usa Javascript (quello vero) e che permette di lavorare anche in modo Object Oriented considerando anche che chi viene da Flash di certo non ha voglia e il tempo di imparare C#?

E poi XAML che sarebbe solo un pallido sottoinsieme di quello di WPF. Sì, certo con la 1.0 non si fa il 3D (), ma non mi risulta che lo si faccia nemmeno nella 1.1 se non con una qualche  (ma a che prezzo?). Certo, con la 1.0 non ci sono layout evoluti, ma basta un minimo sforzo e due righe di Javascript e si ottiene più o meno tutto ciò che si può ragionevolmente desiderare. Ma è XAML. Forse a qualcuno sfugge, ma la vera novità non è che si possa fare qualunque cosa, ma piuttosto che all'interno di 1,3 MB si riesca a caricare uno XAML che è un sottoinsieme compatibile con quello di WPF - e incidentalmente compatibile persino con le regole di SEO - e che finalmente, lasciatemelo dire, da vera dignità e una struttura a tutta quella porcheria che si trova negli swf e che è sostanzialmente incomprensibile anche a chi l'ha realizzata.

Io non considero Silverlight 1.0 perfetto. Probabilmente nemmeno lontanamente ci si avvicina. Ma è innegabile che sia un passo avanti notevole, che tutto ciò che faremo oggi con questa versione non verrà buttato all'uscita della prossima, che finalmente possiamo dire che esista almeno un embrione di alternativa ad un mondo - quello di flash & co - che personalmente ho sempre cercato di evitare per la lentezza e la improduttività che si porta dietro. Per ora ci dovremmo accontentare di trovare le giuste applicazioni, che non sono solamente i media player o i bannerini, ma tutta una galassia di applicazioni RIA in grado di organizzare in modo diverso e innovativo i dati acquisiti per mezzo di AJAX e WebServices (Sì, si può fare anche con la 1.0...) e di mostrare dei pannelli di controllo usabili, leggibili e compatibili con qualunque browser senza doverci arrovellare con CSS e HTML.

Dategli un'occasione e non ve ne pentirete. E soprattutto ricordatevi che il tempo che impiegherete oggi per imparare ad usare Silverlight non è tempo buttato ma tornerà utile anche in futuro.

Technorati tags: , ,

ASP.NET: Evento AJAX a Pordenone

Oggi è la giornata delle segnalazione. E stavolta tocca all'evento organizzato da - una associazione per lo sviluppo informatico che opera nel friuli - che vedrà ospite e in particolare me e Andrea Dottor.

Durante la nostra permanenza avremo occasione di intrattenere il pubblico per un paio di ore a proposito di ASP.NET AJAX 1.0. Si tratta di una riedizione - riveduta e corretta - dell'evento che XeDotNet ha organizzato lo scorso giugno a Mestre. Durante la sessione io e Andrea proveremo a spiegare il framework AJAX rilasciato ormai da un po' di mesi da parte di Microsoft e a dimostrare la semplicità con cui è possibile AJAXizzare (scusate il pessimo neologismo) le proprie applicazioni. L'intervento sarà diviso in due parti, le prima in cui vedremo una serie di slide esplicative ed alcuni esempi - quick & dirty mentre nella seconda parte vedremo l'applicazione sul campo della tecnologia.

Al termine della sessione un'ampia zona Q&A e l'estrazione di alcune licenze offerte da Jetbrains tra cui e .

Per iscrizioni:

Technorati Tag: , ,

Calendario Webcast

Finalmente sono riuscito a sistemare le date dei prossimi webcast che dovrò tenere per conto di Microsoft Italia ed ecco pubblicato l'elenco completo.

12/10/2007 - Silverlight: Introduzione (Livello 200) (Speaker: Pietro Brambati)

17/10/2007 - Silverlight: Introduzione a XAML (Livello 300)

07/11/2007 - Silverlight: Scripting (Livello 300)

28/11/2007 - Silverlight: Silverlight tecniche avanzate (Livello 300)

19/12/2007 - Silverlight: Silverlight 1.1 Preview (Livello 300)

Nei mesi scorsi ho trovato in Silverlight uno strumento interessante e pur se non dotato come molti si aspetterebbero, di certo valido a supporto della realizzazione anche di piccole applicazioni. Certo, sappiamo tutti che fra non molto avremo a disposizione la 1.1 ma tutto ciò che si può oggi ragionevolmente dire di Silverlight 1.0 sarà valido anche per la versione successiva.

Technorati Tag: , ,

ASP.NET AJAX: Chiamare il metodo di un WebService dinamicamente

Con l'avvento di ASP.NET AJAX 1.0, l'uso dei webservice asmx per popolare contenuti delle pagine in modo asincrono, almeno nel mio caso sta godendo di un notevole favore. Trovo davvero proficuo l'uso di questo metodo perchè alleggerisce notevolmente il roundtrip verso il server facendo transitare il minimo indispensabile. Credo ormai tutti sappiano come si fa a mettere una referenza e a sfruttare un webservice, perciò non tornerò su questo argomento (a meno che non me lo chiediate...) ma vorrei invece sollevare un caso pratico.

Poniamo di realizzare uno ScriptControl, utilizzando l'interfaccia IScriptControl. Questo controllo sfrutta un webservice per popolare il controllo (pensate ad esempio ai nodi di un albero). Anzichè mettere la referenza al WebService hardcoded sarebbe opportuno usare una coppia si proprietà alla stregua di quello che fa il Control Toolkit nel controllo AutoComplete.

/* ... omissis ... */ private string servicePath; private string serviceMethod; public string ServicePath { get { return this.servicePath; } set { this.servicePath = value; } } public string ServiceMethod { get { return this.serviceMethod; } set { this.serviceMethod = value; } } /* ... omissis ... */

Assodato che ServiceMethod deve per forza implementare una determinata firma ben conosciuta tra client e server, ecco come fare a chiamare questo metodo in modo dinamico senza mettere una referenza nello ScriptManager. il primo passo è esportare le proprietà nella parte client dello ScriptControl:

/* ... omissis ... */ public IEnumerable<ScriptDescriptor> GetScriptDescriptors() { ScriptControlDescriptor classDescriptor = new ScriptControlDescriptor("MyControl", this.ClientID); if (!string.IsNullOrEmpty(this.ServicePath)) classDescriptor.AddProperty("servicePath", VirtualPathUtility.ToAbsolute(this.ServicePath)); if (!string.IsNullOrEmpty(this.ServiceMethod)) classDescriptor.AddProperty("serviceMethod", this.ServiceMethod); yield return classDescriptor; } /* ... omissis ... */

in seguito aggiungeremo le proprietà corrispondenti nella parte client, servicePath e serviceMethod che sono valorizzate per mezzo del precedente spezzone di codice:

/* ... omissis ... */ get_servicePath : function() { return this._servicePath; }, set_servicePath : function(value) { this._servicePath = value; }, get_serviceMethod : function() { return this._serviceMethod; }, set_serviceMethod : function(value) { this._serviceMethod = value; }, /* ... omissis ... */

Infine ecco come usare la classe Sys.Net.WebServiceProxy per effettuare la chiamata:

/* ... omissis ... */ Sys.Net.WebServiceProxy.invoke( this.get_servicePath(), this.get_serviceMethod(), false, { mode : this.get_mode()}, Function.createDelegate(this, this._onMethodComplete), Function.createDelegate(this, this._onMethodFailed), null, null); /* ... omissis ... */

in particolare i primi due parametri sono appunto il path del servizio e il metodo da invocare. In seguito si specificano i parametri del metodo con una sintassi JSON, poi ancora i callback consueti per Complete e Failed. Per la documentazione completa del metodo vedere .

Technorati Tag: , , ,

Un po' di link alla rinfusa #3

Silverlight

: Una libreria interessante per usare facilmente i downloadable fonts di Silverlight al posto del "banale" testo HTML

ASP.NET

: La risposta ad una domanda ricorrente da parte di Scott Guthrie... "Come posso gestire le configurazioni di sviluppo e produzione nello stesso progetto di Visual Studio 2005?"

ASP.NET Centric Extensions : Una serie di Extension Methods pensati per lavorare meglio con ASP.NET. Da provare!

Windows Presentation Foundation

Free Vector Images for your WPF Projects : Un paio di utili link a risorse vettoriali per chi lavora con Windows Presentation Foundation

3D Programming for Windows... con dedica

Ieri l'altro al mio ritorno dall'ufficio ho trovato una piacevolissima sorpresa. Tempo fa ho risposto a di Charles Petzold, che mi aveva incuriosito. Ieri l'altro mi è stato recapitata una copia del suo recente libro 3D Programming for Windows, che più di una volta avevo già pensato di acquistare. All'interno del libro, sulla prima pagina è riportata la dedica "Andrea, best wishes and happy 3D programming" con in calce la firma autografa dell'autore.

Conserverò questo libro con cura, molto meglio di come di solito faccio. E naturalmente a va il mio ringraziamento e tutta la mia stima per la impagabile qualità dei contenuti che tutti i giorni leggo sul suo weblog. Vi consiglio di sottoscrivere il suo feed se ancora non lo avete fatto. Non appena avrò letto il libro vi farò sapere la mia opinione, anche se so già per certo che l'autore è una garanzia.

Community Meeting: Windows Vista Gadgets

Ieri sera si è tenuto il primo meeting della stagione 2007/2008 di XeDotNet. Ospite della serata Simone Chiaretta. noto blogger di UgiDotNet che ci ha illustrato le potenzialità dello sviluppo di Gadgets su Windows Vista.

Nonostante i presenti al meeting non fossero molti, circa una decina di persone, la serata a mio parere è stata lo stesso molto interessante. Purtroppo come discutevo con Simone poco dopo il termine della sessione, la cattiva nomea che è stata affibiata a Windows Vista fa si che siano ancora poche le persone che ritengano di iniziare ad approfondire gli aspetti di questo sistema operativo. Quello che spesso sento dire è: "Vista io ancora non lo considero". Pur se questo comportamento è comprensibile non si può dire che sia giustificabile. Windows Vista è un ottimo sistema operativo che risponde a delle esigenze che sono state manifestate più volte negli anni scorsi e che ad oggi sono state "dimenticate". Ci si è sempre lamentati della notevole vulnerabilità dei sistemi Windows, ma oggi che abbiamo la UAC, la prima cosa che si cerca di capire è come fare a disattivarla. Ritengo miope non considerare Vista, ad ormai molto tempo dalla sua uscita e mentre siamo in vista (!) della prima Service Pack. Prima o poi ci si dovrà scontrare con esso e allora si pagherà lo scotto di essercisi tenuti lontani fino all'utlimo momento.

Simone si è destreggiato bene, affrontando i vari aspetti di queste mini applicazioni che a dispetto del nome possono regalare delle feature interessanti ai nostri software. Con il suo MacBook, ci ha condotto attraverso una serie di esempi gradualmente più complessi ad esplorare i risvolti più impensabili. Non mi resta che ringraziarlo ancora una volta nella speranza di vederlo ancora nostro ospite.

Chi volesse vedere alcune immagini del meeting può visitare il .

Technorati tags: , ,

Una classe Javascript per le pagine... ovvero, come organizzare meglio i propri script

Ci ho messo un po' a decidere come intitolare questo post, e alla fine ho optato per questo titolo alla Wertmuller perchè mi sembra che il succo del post che sto scrivendo sia proprio questo: imparare ad organizzare per bene il codice di scripting che come ho già detto più volte ha la spiacevole abitudine di infestare le pagine.

L'idea che vorrei presentare mi è venuta lavorando con la Microsoft AJAX Library, e in breve è diventata il mio modo standard di approcciare lo sviluppo in Javascript su pagine HTML perchè mi consente di lavorare con una sorta di codebehind in cui ragruppo tutto il codice di scripting. La base per poter raggiungere questo scopo è una classina che mi sono scritto in -Javascript:

Type.registerNamespace('Elite'); Elite.Page = function() { this.onload$delegate = Function.createDelegate( this, function(eventData) { this.load(); }); this.onunload$delegate = Function.createDelegate( this, function(eventData) { this.unload(); }); window.onload = this.onload$delegate; window.onunload = this.onunload$delegate; Elite.Page.initializeBase(this, [window]); } Elite.Page.prototype = { initialize : function() { Elite.Page.callBaseMethod(this, 'initialize'); }, load : function() { }, unload : function() { }, dispose : function() { if (this.onload$delegate) delete this.onload$delegate; if (this.onunload$delegate) delete this.onunload$delegate; Elite.Page.callBaseMethod(this, 'dispose'); } } } Elite.Page.registerClass('Elite.Page', Sys.UI.Control);

La classe che ho realizzato dovrà essere utilizzata come base per la classe che rappresenta la pagina. Al suo interno infatti sono stati realizzati una serie di metodi stub che ricalcano il funzionamento normale di una pagina asp.net. Troviamo ad esempio il metodo load() che viene collegato automaticamente all'evento window.onload enaturalmente anche la controparte unload().

Ecco come procedere se si vuole utilizzare questa tecnica in una propria pagina che poniamo si chiami dashboard.aspx:

1) create un file Javascript denominato dashboard.aspx.js. questo consente di tenere i file a scelta in una stessa cartella e reperirli facilmente oppure affiancarli alla pagina e vederli nel solution explorer accanto al codebehind. Al termine dello sviluppo se fate uso del Web Application Project potreste convertire tutti gli script in risorse embedded e caricali con webresource.axd.

2) includere il file javascript contenente la classe Elite.Page (ad esempio page.js). Dato che è obblgatorio fare uso della Microsoft AJAX Library è opportuno mettere la referenza all'interno dello ScriptManager che vi ricordo essere il luogo di elezione per qualsivoglia script.

3) nel file dashboard.asp.js creare una classe che rappresenti la pagina e erediti dalla classe Elite.Page. Ecco un esempio:

 

Type.registerNamespace('MyApplication'); MyApplication.DashboardPage = function() { MyApplication.DashboardPage.initializeBase(this, [window]); } MyApplication.DashboardPage.prototype = { load : function() { this.bSave = $get('bSave'); MyApplication.DashboardPage.callBaseMethod(this, 'load'); } }; MyApplication.DashboardPage.registerClass('MyApplication.DashboardPage', Elite.Page);

 

La particolarità di questa classe è di "registrare" il controllo bSave usando $get(). L'evento load() è il posto migliore per questo genere di attività dato che vi si arriva subito dopo che il download e il rendering della pagina è stato effettuato.

4) Inserire mediante ScritpManager.RegisterStartupScript() il codice che istanzia la classe:

var currentPage = $create(MyApplication.DashboardPage, {}, {}, null, null);

Questa chiamata in particolare istanzierà la classe e inizierà il ciclo di vita invocando il metodo initialize. Poi non appena caricata la pagina sarà invocato il metodo load() e di conseguenza la referenza verrà valorizzata con il controllo bSave. Naturalmente a questo punto sarà opportuno agganciare via script gli eventi dei controlli. Vi ricordo che per fare questo  è necessario l'uso di Function.createDelegate() che come ho già consente di mantenere il contesto di partenza e quindi di rimanere all'interno della classe.

Rimane solo un problema. Sappiamo tutti che i controlli di ASP.NET hanno un id generato a runtime che può essere semplice o composto. Per questo vi sarà necessario passare come argomenti della classe gli id estratti dai ClientID. In realtà ho un'altra idea in incubazione ma... questo sarà l'argomento di uno dei prossimi post.

I would want to be there...

La early bird del TechED Developers di Barcellona sta per scadere. Il 28 Settembre prossimo sarà l'ultimo giorno utile per chi voglia iscriversi alla prestigiosa conferenza. Io che invece anche quest'anno non riuscirò ad essere presente mi accontento di guardare i video di presentazione... Barcellona aspettami, magari il prossimo anno.

Link: http://www.microsoft.com/europe/teched/toolkit/video.aspx

11/9

ricordando le vittime...

Imagic promosso a "vero" blog

Finalmente stasera sono riuscito a trovare il tempo di dotare il mio di un feed rss. Lo potete sottoscrivere su feedburner all'indirizzo http://feeds.feedburner.com/imagic. Consentitemi di ringraziare l'autore dell' RSS Toolkit che mi ha graziato permettendomi di ottenere il risultato voluto in meno di 20 minuti...

Se a qualcuno interessa lo può trovare qui: http://www.asp.net/downloads/sandbox/

Technorati tags: , ,