Il pattern "Driving Force"

Dal mio blog in inglese alcune considerazioni sulla forza oscura e le CTP di Microsoft :)

Eppure ci assomiglia...

Si è scritto e letto molto a proposito di cosa sia LINQ-to-SQL. E a cosa serva. Io stesso non ho fatto segreto di considerare LINQ-to-SQL soprattutto uno strumento buono per il DAL, ovvero una specie di ADO.NET object-oriented.

Ma ti ricordi improvvisamente di aver parlato una volta nella vita con Don Box. E ti ricordi di cosa disse quel santuomo in un pomeriggio olandese del luglio 1999--prima apparizione su un palco a parlare inglese. Per giunta, al TechED Europe. Quando mi disse che era lì per conoscere finalmente questo Dino Esposito di cui si leggevano meraviglie (che ci posso fare se "wonders" significa proprio questo...) ma che nessuno aveva ancora visto di persona (mai uscito di casa...) gli chiesi cosa c'era di vantaggioso per lui ad assistere alla mia presentazione su OLE DB. Il senso che Don apparentemente non colse era "potresti per cortesia accomodarti fuori, visto che già me la faccio sotto da solo senza che la tua onorevole presenza mi aumenti la ... tensione?"

Ma Don mi prese sul serio e rispose alla domanda su OLE DB dicendo "It's all about perspective, right?" Già si può sentire parlare di cose risapute ma la prospettiva "unica" di chi parla spesso ci da un valore aggiunto che talvolta ci apre la mente.

Giorni fa, assisto in quel di Varsavia ad una presentazione introduttiva su Entity Framework fatta da uno del team. Nessuna speranza di trarne vantaggio, ma alla fine ci faccio due chiacchiere e mi viene spontaneo pensare a LINQ-to-SQL sotto una luce diversa. E se lo potessimo considerare un O/RM, certo con una serie di limitazioni ma non per questo una roba da buttare via?

Ci ho preso gusto e ne sono venute fuori alcune considerazioni che, se vi va, potete leggere qui su DotNetSlackers.

 

La proprietà BehaviorID

Mi sono sempre chiesto a cosa servisse la proprietà BehaviorID nei controlli dell'AJAX Control Toolkit. E ho persino rischiato qualche figuraccia nei corsi quando mi appariva, inattesa, dentro un IntelliSense. E' una stringa che identifica univocamente un componente. Che differenza fa con l'ID? Se usata, la proprietà BehaviorID si usa per recuperare via script l'istanza del componente:

var extender = $find("...");

Se BehaviorID non è specificato bisogna passare a $find l'ID del controllo. Ma questo nel caso di master pages è una stringa ardua da ricordare. Allora si deve far ricorso al seguente codice:

var extender = $find("<%= Extender1.UniqueID %>");

Per evitarlo, è preferibile impostare BehaviorID il cui valore non è influenzato dalla presenza di master pages.

Servizi pubblici di AJAX

Nel FX 3.5 i servizi WCF sono stati estesi per supportare JSON e in generale uno schema di chiamata non-SOAP. E' stato perciò introdotto un nuovo binding noto come webHttpBinding. Si tratta di una estensione di basicHttpBinding con preimpostazione di MessageVersion a None e un po' di security.

Ecco, la security.

Quando si disegna un'applicazione AJAX (che non sia banalmente partial rendering) si ha bisogno di uno strato di servizi ad uso "esclusivo" dell'interfaccia Web. Per far contento Andrea <g>, chiamiamolo AJAX Service Layer (ASL). Si tratta di uno strato superficiale che nulla ha a che spartire con il service layer in cima al middle tier. Da questo, anzi, può anche essere fisicamente separato, passando su un altro tier.

I servizi dell'ASL (ahia ahia) sono pubblici--battuta facile facile, e sono ... cessi

Dicevo, i servizi dell'AJAX Service Layer sono pubblici nel senso che sono endpoint HTTP potenzialmente a disposizione di chiunque abbia voglia e tempo di invocarli. Questa roba si chiama (sia pure con trillioni di varianti) cross-site scripting. Della possibilità di iniettare codice script in pagine inconsapevolmente vittima di cattivi si sa abbastanza. La domanda è: questo script iniettato è in grado di chiamare un servizio pubblico? Risposta NO. O almeno credo. Diciamo che il dubbio dipende dal codice effettivamente iniettato. Se è un "semplice" <script src=...> allora NO; se fosse proprio un JS studiato per benino che conosce a menadito il proxy JS del servizio e se ne serve, allora direi che la cosa è possibile.

Perché non è possibile nel caso di un "semplice" <script src=...>? Perché il tag esegue una GET e non imposta content-type particolari. I servizi WCF di ASP.NET AJAX richiedono (di default) POST e application/json.

Bene. Cosa mi preoccupa allora?

Il fatto che qualcuno si scriva un programmino .NET e usando System.Net chiami il mio servizio. Questo è possibile. Altro che.

E allora? Il servizio pubblico solitamente non espone codice "pericoloso" e "critico" e questa è la miglior prevenzione possibile. Direi che ad oggi non si è mai andati oltre questo scenario. Ma se guardiamo oltre ad applicazioni PURE pensate col modello AJAX, beh signori, dobbiamo porci il problema di avere nel ASL del codice banale ma anche del codice "pericoloso", tipo metodi che finiscono per fare Update/Delete sul core system dell'applicazione.

Ergo pensiamo agli utenti, ma anche agli hacker. Poverini

Ne parliamo in Microsoft 31 marzo/2 aprile nel corso ASP.NET AJAX+ Silverlight. Prezzi modici, qualità alta. (s

 

XAP ma si legge ZAP (sui piedi)

Nella foga maniacal-erotico-provereccia scatenata dalle release a getto continuo di MS, ben due mesi di silenzio (meta dicembre/inizi marzo) hanno esasperato la gente. Al punto che uno si butta pesce su Silverlight 2.0 o MVC Preview 2 a seconda dei gusti e smanetta smanetta. E poi ti arriva l'hello-world precoce--la nuova malattia del secolo.  Ti viene fuori una cosa che è troppo presto per darti gusto e se la guardi un secondo dopo ti delude e magari deprime pure.

Se poi l'hello-world oltre a essere precoce è pure un mezzo fallimento, allora ci sta che uno cominci ad invocare santini e santarelli come fossero servizi pubblici.

[Questa dei servizi pubblici per smadonnare è una libera rielaborazione di una storiella raccontata nel libro "Why Software Sucks" di David Platt. David racconta di suo padre che avrebbe consigliato ad una societa dei telefoni di mettere su un numero verde da chiamare per lamentarsi. Del tipo: Prema 1 per dire "l'anima de li ... tua". Prema 2 per dire "Fan..lo te e tutta ..." Prema 3 per dire "...". Infine resti in linea per dirlo a voce all'operatore.]

Ieri alle prese con le slide e gli esempi del Silverlight 2 mi è scappato un hello-world precoce più che altro dovuto ad una forma cronica di documentatio-retardata di MS. Perché Silverlight 2.0 funzioni come ci si aspetta in un'applicazione IIS sembra che bisogna configurare IIS per riconoscere il MIME type XAP. Dettagli e oltre li trovate qui. [E io mi sono risparmiato un post.]

Silverlight 2.0 e i servizi pubblici

Adesso ce l'abbiamo, almeno in Beta1 e al TechED (inizio giugno) ce l'avremo col GoLive. Possiamo cominciare a ragionarci sopra.

Controlli e WPF
Per creare una interfaccia realmente accattivante come quelle che ci propinano ci vorrà sempre e comunque una schiera di grafici di professione. Ma per fare frontend di gestionali può bastare un misero programmatore e i controlli cominciano ad esserci

Networking
Il plug-in può chiamare chi vuole e usando un buon numero di protocolli. Sia chiaro che: le chiamate client DEVONO andare su un service layer APPOSITO, che filtra e non fa danni. O li riduce. Mi resta sempre difficile da dimostrare l'assoluta "sicurezza" di un approccio su servizi scriptabili; ma è il Web baby. Il rischio non sono le iniezioni di codice, ma il replay (automatico) di chiamate non autorizzate. Uno strato nel mezzo protegge ma non garantisce. Ma qui non è Silverlight il problema; sono i servizi pubblici

Cross-domain
Già si comincia a sentire dubbi sul cross-domain di Silverlight 2.0. Ma avete mai usato i frame? Avete mai usato Flash? E perché vi spaventa Silverlight? Preoccupazioni sul cross-domain hanno un senso sullo script; ma qui c'è la CoreCLR e la sua sicurezza.

Sicurezza
Ogni istruzione che la CoreCLR esegue deve essere eseguibile in un contesto di partial trust, a meno che il metodo sia marcato SafeCritical. Ma il programmatore NON può scrivere codice e marcarlo SafeCritical. Solo MS può farlo (firma digitale) e solo un assembly scaricato dal server MS può contenerlo. Uploadate se ci riuscite ...

Se avete ancora dubbi, l'appuntamento è per il 31 marzo in MS con il corso ASP.NET AJAX + Silverlight.

 

 

 

Sorgenti del libro

Da qualche giorno è disponibile la versione inglese del libro Programming ASP.NET 3.5 Core Reference. I sorgenti sono liberamente scaricabili dal seguente URL. Nel pacchetto non c'è la libreria AJAX Control Toolkit (v3.5) che va scaricata a parte. Nella directory Bin del progetto con i sorgenti del libro va poi copiata la DLL ajaxcontroltoolkit.dll.

Da quanto ne so, il libro uscirà in italiano da Mondadori dopo l'estate.

All'interfaccia della "user experience"

Mentre nel mondo si attende frementi il rilascio della beta di Silverlight 2.0 (settimana prossima, se non mi sono perso niente), e ci si domanda come disegnare e architettare nuovi front-end grafici per gestionali, nel puro mondo Web (dove la parola plug-in equivale a orticaria) le cose sono statiche statiche.

I paradigmi cambiano, le soluzioni aumentano (le tecnologie restano quasi obbligatoriamente le stesse ...), ma sono sempre troppi i siti che fanno sempre pena. E frustano gli utenti--altro che frustrazione ...

Hai voglia a dire AJAX; hai voglia a dire Silverlight o Flex; hai voglia a dire cross-platform o accessibility. Ce ne sono troppi che fanno proprio schifo. Ma mi irrita soprattutto la considerazione NULLA per l'utente. Alla faccia (anzi all'ìinterfaccia) della sbandierata user experience.

Stamattina ho chiari sintomi di acidità dunque me ne vengo con gli ultimi due tragici e fantozziani esempi in cui mi sono imbattuto. Con tanto di nomi e cognomi. E poi ho anche altri obiettivi

Ufficio Italiano Cambi
Pagina che offre i cambi fiscali giorno per giorno. Mi sarei aspettato la possibilità di scaricare un foglio Excel e lavorare offline.  Niente. Mi sarei aspettato di poter scegliere un periodo e fare un roundtrip solo. Niente. Bisogna procedere un giorno alla volta. Vabbé. Mi sarei aspettato una banale drop-down list con le divise possibili contro euro. Niente. Bisogna tirare su un pop-up (che tira su con mooolta fatica una pagina JSP) che ti fa scegliere "Dollaro USA" o quello che vuoi e poi se ne resta lì a coprire il campo di input finché non ti viene il sospetto che forse la devi chiudere/spostare da solo). Poi scegli il giorno--e miracolo della tecnologia--c'è un calendario JS. Poi finalmente puoi cliccare. Dopo 2 (due) minuti arriva la risposta. E si ricomincia.

A parte che è sempre la rete che fa schifo "a prescindere", non sarà che pure JSP è un pochinino più lento, "a prescindere", da ASP.NET?

Unicredit/Bancaroma Home Banking
Servizio di stampa fai-da-te dei famigerati F24. Il buon Visco, o chi per lui, dopo aver reso di fatto "obbligatorio" versare un obolo alle banche per l'home banking al solo scopo di pagare le tasse, ci faceva "di fatto" pagare pure la spedizione da parte della banca della quietanza. Senza della quale NON HAI PAGATO ovviamente, nonostante le evidenti tracce bancarie per le quali lo stesso Visco, o chi per lui, ha richiesto l'home banking. Poi passatasi una mano sulla coscienza, dice alle banche di mettere online un PDF quietanza (3 gg lavorativi dopo--ma con che cosa li producono i PDF? Artigianalmente?) che il ligio contribuente si stampa e allega alla documentazione fiscale. Bene, finalmente una buona notizia.
Poi lo fai con la suddetta banca e ti becchi una classica pagina con seleziona il periodo. Ma DEVI OBBLIGATORIAMENTE inserire data iniziale e data finale. Non vi è traccia di default.

Bisogna soffrire per pagare e dimostrare di avere pagato.

Alla faccia del Web, delle tecnologie e dei paradigmi. Quanto un po' di AJAX aiuterebbe quelle povere paginette ...

 

E infine dedicato agli sviluppatori di questi siti (e a tutti gli altri), dal 31 Marzo al 2 Aprile, venite a sentire dei pattern più idonei per AJAX e Silverlight. Certo visti gli standard dei costi Internet della PA e affini, il corso costa decisamente troppo poco. Ma volendo possiamo metterci d'accordo sul prezzo.

L'identity e la sessione

Nella posta di stamattina una "sfida" di Andrea. Dice

Avuto modo di leggere il post dedicato alla Identity Map? In caso affermativo, cosa ne pensi?

E che ne penso? Bah, proviamo ad articolare

Se ho capito bene direi che vale quanto segue:

In un mondo perfetto, l'esempio di Corrado funziona come "ci si aspetterebbe", ovvero con le modifiche al DB intercettate perché un fetch al di fuori della transazione dovrebbe essere risolto come tale, senza ricorso alla cache interna. Però sarebbe un bel casino, mi par di capire.
O meglio--a pelle riesco a sentire che sarebbe un casino. Ma faccio un po' di fatica a tradurre la "protection for your map" di cui parla Fowler in codice reale. Sarebbe forse a dire che se come da catalogo accademico associassimo identity-map alla transazione (invece che alla sessione, come tutti fanno incluso Andrea) dovremmo allora costruire copie delle mappe per ogni transazione che si scopre avviata e poi distruggerla per ogni transazione che termina?
Eh si, messa così sarebbe un bel casino che un "sane developer" si guarderebbe bene dal pianificare.
Vi prego, se davvero volete rispondere/commentare, fatelo solo con un SI/NO

[OT] Plis, vizit ur sait

Chiude il portale Italia.it dice Repubblica.IT e chiude proprio l'Italia intera se dobbiamo dar conto del signore che tenta di parlare inglese. Onestamente non so proprio dire per PAR CONDICIO se è meglio questo signore che ci prova (sia pure con risultati ridicoli) o quell'altro signore che conscio dei suoi limiti (diciamo così) nemmeno ci provava.

Non vedo l'ora di sentire Capello