giovedì 18 febbraio 2010
Premessa: sto solo facendo una pura (sega mentale) divagazione.
Esiste un caso in cui poter scrivere extension methods statici non sarebbe male. Avete presente tutte quelle classi per cui esiste una proprietà statica “Current”? Che sono HttpRequest.Current tanto per fare un esempio.
Ebbene, ho a che fare con una libreria di terze parti per cui tramite CoCreate (sono in ultima istanza oggetti COM) è possibile istanziare l’oggetto singleton Application che si riferisce proprio all’applicazione stessa in quel momento attiva. Ebbene sarebbe tanto bello, dal punto di vista puramente estetico (da qui la “divagazione”), poter scrivere nel codice Application.GetCurrent, invece che sporcarlo con una chiamata ad un generico metodo statico ApplicationHelper.GetApplication.
Ovviamente GetCurrent dovrebbe essere un metodo statico del tipo Application da implementare appunto tramite un extension method statico (che non esistono beninteso).
Mi rendo perfettamente conto che sia un unico e in qualche modo poco importante caso in cui sarebbe comodo averli.
sabato 2 gennaio 2010
Oggi mi sono trovato di fronte ad una strana situazione che mi ha impegnato l’intera mattinata per venirne a capo (sì sto lavorando, devo recuperare…): binding di oggetti COM in WPF.
Antefatto: è un mesetto che sto prendendo WPF e Silverlight per le corna, due tecnologie che in passato non avevo modo di utilizzare e che invece da un mese a questa parte sono entrate di prepotenza nel mio panorama professionale.
Sto procedendo alla personalizzazione di un applicativo di terze parti che fa uso pesantemente di COM per quanto riguarda i mattoncini di cui è composto e che vengono utilizzati anche per la sua customizzazione mediante un vasto SDK (si tratta di un applicativo GIS desktop: ESRI ArcMap).
l’SDK in questione è stato totalmente wrappato per l’utilizzo con .NET mediante la metodologia standard dei Remote Callable Wrapper (RCW), questi non sono altro che classi proxy .NET che effettuano il marshaling delle chiamate a metodi e proprietà da e per l’oggetto COM vero e proprio.
In generale se la classe COM si chiama MyClass, il processo di importazione (che si esegue mediante l’utility tlbimp.exe) crea lato .NET un’interfaccia denominata MyClass e una classe RCW denominata MyClassClass.
Il problema nasce quando è l’infrastruttura dell’applicativo che fornisce un oggetto a seguito di una chiamata all’SDK: in generale accade che l’oggetto ritornato non è di tipo MyClassClass bensì di tipo System.__ComObject. Questo è un tipo interno al framework (è marcato internal) ed in sostanza è il contenitore generico per ogni oggetto COM wrappato, in pratica si perde la possibilità di castarlo a MyClassClass nonostante l’oggetto di per se in effetti lo sia.
Che cosa comporta tutto questo? Ad esempio che se siamo in presenza di binding WPF mediante path che punta ad una proprietà di un oggetto RCW, questo non funziona perché l’infrastruttura di WPF non è in grado di risolvere la chiamata alla proprietà indicata a partire da un oggetto System.__ComObject.
Nota a margine: da quello che ho letto durante le mie ricerche su Google questo comportamento lo si ha anche nell’interoperabilità con Office, tanto che la soluzione al problema mi è stata suggerita in un post di un forum MSDN che trattava il binding all’interno di un’applicazione WPF, la quale andava a filtrare gli appuntamenti archiviati con Outlook.
La soluzione a questo problema è quella di utilizzare il metodo statico CreateWrapperOfType della classe System.Runtime.InteropServices.Marshal, questo metodo serve in pratica a trasformare un oggetto RCW in un altro oggetto RCW di tipo diverso. In sostanza è proprio quello che ci serve per trasformare (castare non sarebbe il termine adatto in senso stretto) un oggetto System.__ComObject in quello che sarebbe il suo vero tipo RCW:
//myGenericComObj è di tipo System.__ComObject
MyClassClass rcwObj = Marshal.CreateWrapperOfType(myGenericComObj, typeof(MyClassClass)) as MyClassClass;
Nota importante: questo metodo va utilizzato con il tipo della classe RCW e non con il tipo dell’interfaccia, ovvero non funziona se al posto di MyClassClass si specificasse l’interfaccia MyClass (ricordo che entrambe sono il risultato della procedura di importazione di un oggetto COM).
A questo punto, con l’oggetto RCW non più generico, il binding WPF funzionerà correttamente riuscendo a risolvere normalmente i vari riferimenti alle proprietà che identificano i path.
giovedì 5 novembre 2009
In questi giorni ho molto tempo per pensare, bloccato a letto dopo l’incidente, fra quel poco di lavoro che riesco a svolgere con la sola mano sinistra e gli esercizi di fisioterapia spicciola che ho cominciato a fare.
Quando penso troppo è un dramma perchè tendo ad essere logorroico anche con me stesso. In particolare oggi mi sono soffermato a pensare che cosa sia in realtà la nostra professione, sarà colpa della torta di mele in doppia razione di ieri sera.
Spesso, soprattutto se liberi professionisti, ci paragoniamo a degli artigiani, ma onestamente credo che sia estremamente riduttivo. Soffermiamoci un attimo su quelli che sono gli skill che ci vengono richiesti, in alcuni casi anche dalla normativa ISO (mica il primo pirla che passa per strada):
- definizione dei requisiti funzionali e non funzionali a fronte di un’esigenza di business che ci viene presentata
- definizione dei confini del progetto, delle stime di rischio e delle strategie di mitigazione, stima dei tempi e dei costi (indipendentemente dalla metodologia di conduzione del progetto, sia essa waterfall, agile, ibrida, ecc.)
- capacità di individuazione dei chenge request e di conseguente negoziazione (anche in questo caso nella sua accezione più generica)
- conoscenza dei principi dello sviluppo software, dal design all’implementazione, adatti ad ogni scenario richiesto
- conoscenza degli strumenti di software engineering: versionamento del codice sorgente, automazione del processo di build, bug/issue/workitem tracking
- conoscenza delle tecniche e degli strumenti per la definizione e il perseguimento della software quality (qualunque sia il livello concordato con il cliente)
- un certo livello di conoscenza sistemistica sia sul fronte della system integration che del deployment
Dimentico certamente qualcosa, altri aspetti invece sono impliciti come ad esempio la continua necessità di autoformazione e ricerca, senza contare che ognuno dei punti che ho indicato portano con se tutta una serie di aspetti e conoscenze che un professionista “dovrebbe” possedere. E possiamo nasconderci che spesso tutto questo è applicabile a diverse tecnologie e piattaforme (windows, web, mobile)? Ovviamente no…
Decisamente sono propenso a credere che stiamo pesantemente sottovalutando in generale quelle che normalmente sono le nostre qualifiche professionali. Attenzione, la mia non è una considerazione sull’eccessiva modestia che il nostro ambiente dimostra, tutto il contrario. La mia è una considerazione su quanto spesso ci “dimentichiamo” di quello che comporta fare il nostro lavoro.
Non siamo artigiani, e credo dobbiamo smetterla di considerarci tali perchè troppo spesso questa diventa la chiave di lettura per un approccio al nostro lavoro un po’ naif, bohemienne. Un po’ genietto, un po’ scanzonato, un po’ fuori dalle righe.
Oppure soffriamo della sindrome da Dr. House, sindrome di cui ho pesantemente sofferto pure io, e da cui spero di guarire, ovvero quella che ti rende il polo indispensabile del team, ma ovviamente anche il maggior problema di efficienza ed efficacia per quanto riguarda la produttività dello stesso.
Siamo ancora in una fase edonistica della nostra professione? Io credo di sì onestamente. Credo che non abbiamo ancora fatto quel necessario passo per considerare in maniera maledettamente seria i pillar della nostra attività lavorativa. Ci portiamo dietro ancora troppo spesso l’indole giocosa per il nuovo giocattolo, per la nuova buzzword, e troppo spesso sottovalutiamo aspetti fondamentali di ciò che il mondo del business si aspetta da noi.
La chiave di lettura deve essere questa: calarsi anima e corpo in una realtà in cui dobbiamo essere consapevoli di quale dovrebbe essere il nostro ruolo “effettivo” e non quello “desiderato” ( da noi stessi ovviamente").
Faccio un esempio: quando un cliente ci interpella per un nuovo progetto troppo spesso ci limitiamo ad essere dei driver tecnologici, che è solo uno dei nostri compiti. Ma quanti di noi, io in primis, durante la fase di start-up di un progetto promuovono con il proprio cliente fronti di discussione come quello della definizione di una policy di software quality, o quello sulle strategie di deployment, o quello su strategie di analisi condivise, ecc., ecc.?
A volte autolimitiamo lo scope delle nostre competenze professionali e questo spesso ci si ritorce contro contribuendo a creare lo stereotipo del tecnicone sviluppatore di codice. Non dico che sia solo colpa nostra, ma accade più spesso di quanto si pensi.
venerdì 7 agosto 2009
Il mio portatile Dell Latidute a settembre compie 3 anni, fino a 6 mesi fa ero quasi certo che in autunno sarebbe arrivato il tempo di sostituirlo, anche perchè è da tempo che penso di passare ad un formato 13” dopo anni di notebook a 15”.
Poi è arrivata la Beta di Windows 7 che ho montato su un pc desktop del 2001, da quel giorno non ho fatto altro che aspettare l’uscita della RTM per poterla montare sul portatile: l’idea di cambiarlo è immediatamente svanita avendo visto come Windows 7 ha rigenerato un pc abbastanza datato.
In fin dei conti il mio Latitude è ancora oggi piuttosto carrozzato, nel senso che quando lo ho acquistato nel 2006 era una specie di astronave ed oggi, dopo l’upgrade dell’anno scorso della sola RAM, si difende più che bene con il suo HD da 7200 rpm (che tre anni fa mi è costato una fortuna, ma la scelta è stata assolutamente saggia), il suo processore da oltre 2 GHz, e la RAM da 4 GByte. L’unica vera incognita rimane la scheda grafica, ma se ci girava decentemente Vista ci girerà altrettanto bene Windows 7.
Confesso che avrei preferito installare Windows Server 2008 R2, dato che da un annetto uso Windows Server 2008, ma non mi è possibile visto che sarà disponibile solo per macchine x64, e la mia non lo è (nel 2006 non c’erano ancora i Core Duo per i portatili…).
Ho scaricato abbastanza velocemente da MSDN la iso di Windows 7 Ultimate e prima di installarlo sul portatile sto procedendo a:
- Creare una virtual machine VMWare Player con VMWare vCenter Standalone Converter (da macchina fisica a virtual machine), in modo da avere un backup “vivo” ed utilizzabile del vecchio ambiente comunque disponibile per qualsiasi evenienza (anche perchè di sicuro, nonostante check-list fatte da tempo, andrà a finire che mi servirà quel dannato file di configurazione che mi sarò dimenticato di mettere da parte)
- Creare un’immagine dell’attuale disco C per poter ripristinare fisicamente sulla macchina in tempi brevi l’attuale configurazione
- Formattare il disco C (e forse anche modificare la grandezza della partizione a scapito di quella dedicata ai dati visto che quest’ultima è quasi sempre vuota grazie all’uso dei dischi esterni usb per lo storage spicciolo)
- Installazione di Windows 7 su macchina pulita
- Installazione di tutto il resto dell’ambiente di lavoro
martedì 4 agosto 2009
Scandagliando la rete, in particolar modo alcuni forum in cui si discute della nostra professione dal punto di vista ingegneristico (tema a me molto caro visto che, come molti, sono un ingegnere), ho trovato questo paper del 1992 che per certi versi mi ha illuminato.
Più che altro so che non sono solo nell’universo…
venerdì 24 luglio 2009
In jQuery una chiamata Ajax può essere fatta mediante il metodo ajax, il più completo e generico, ma ovviamente anche il più ostico da invocare, proprio per la pletora di opzioni che lo caratterizza (anche se ad onor del vero, quelle veramente necessarie sono poche).
Esistono anche altri due metodi che sono delle scorciatoie che focalizzano l’obiettivo agli scenari di chiamate Ajax più comuni: get e getJSON.
Nello scegliere quali dei tre metodi utilizzare è necessario però fare molta attenzione ad un aspetto che nella documentazione di jQuery non è particolarmente messo in evidenza: get e getJSON non hanno la possibilità di disabilitare il caching del risultato, cosa che invece è possibile fare con ajax mediante l’opzione cache, un valore boolean che di default è a true (ovvero di default è abilitato il caching).
Che cosa significa? significa che se la request ajax che viene fatta è formalmente sempre la stessa (url, parametri, ecc.), con il caching attivato viene eseguita solo la prima volta, tutte le altre volte viene riproposto il primo risultato ottenuto (e quindi andando in debug sulla vostra applicazione web, ad esempio ASP.NET MVC, la action indicata nell’url verrà invocata solo la prima volta).
Quindi, se come è capitato a me, avete necessità che una stessa chiamata JSON venga eseguita tutte le volte, non utilizzate getJSON, bensì ajax disabilitando il caching.
martedì 9 giugno 2009
Il primo worskshop UGIDotNet in trasferta è stato un autentico successo. A volte aggettivi come questo si utilizzano un po’ a sproposito, ma stavolta io credo che illustri esattamente quanto è accaduto ieri.
Parliamo della giornata di workshop. Ho due parole che lo possono definire: Surfraf e Mono.
Surfraf è qualcosa che non posso descrivervi, non tanto perchè non sia possibile farlo, ma perchè provarci non renderebbe minimamente giustizia all’incredibile lavoro di Raf che nella sua sessione ci ha letteralmente stupefatti. Non posso fare altro che rimettermi alle buon anime che hanno scattato qualche foto dell’oggetto e a Raf stesso. A proposito: il prossimo che mi dice che Windows 7 è giusto una serive pack di Vista gli sputo in un occhio, gli spezzo le ginocchia e non contento lo denuncio al tribunale internazionale per i diritti dell’umanità.
Mono. Per me (vile, ignorante e peso come si dice nella mia terra natale) è stata un’autentica sorpresa. Un progetto incredibilmente maturo non solo dal punto di vista del framework, ma anche dei tools, sia quelli già disponibili, sia quelli che arriveranno a breve. Dopo aver abbracciato la virtualizzazione con VMWare, la persistenza con Oracle, sono deciso ad affrontare anche l’hosting di applicazioni C# su Linux, ovvero ampliare e arricchire la mia visione di “target” tecnologici. Un grazie molto sentito a Massimiliano per la sua sessione illuminante e per la chiaccherata tecnologica in albergo la sera prima del workshop.
La mia sessione sull’uso di RDBMS diversi con Entity Framework è andata abbastanza bene, devo certamente migliorare la tecnica oratoria (un po’ caotica e ripetitiva a volte), però dal punto di vista della fluidità della presentazione e il rispetto del tempo a disposizione devo dire che sono soddisfatto.
Durante tutta la giornata si è veramente respirata l’atmosfera di community, e spero che sia stato lo stesso per i partecipanti, sono tornato a casa veramente a mille anche grazie ai moschettieri Mauro, Corrado, Lorenzo, Ugo e ovviamente al Pres, promotore e anima di tutto questo.
Infine, proprio per chiudere in bellezza questo post, un pensiero alla location. Un grazie non abbastanza sufficiente a contraccambiare l’ospitalità va a Dental Trey, perchè la gentilezza e la disponibilità che ci hanno dimostrato è stata semplicemente imbarazzante. Non solo durante tutta le giornata del workshop, ma anche il giorno prima quando alcuni di noi sono stati ospiti per una cena (anzi LA cena) che credo rimarrà negli annali per qualità e quantità sia di buona compagnia, sia di libagioni.
La speranza è che questa esperienza possa essere stata la prima di un appuntamento ricorrente, una sorta di evento da consolidare anno dopo anno.
venerdì 22 maggio 2009
Come detto qualche giorno fa venerdì prossimo 29 maggio, terrò un workshop tematico su Entity Framework a BASTA! Italia 2009 in quel di Mliano.
Come mi fanno notare dalla regia, mi devo reputare abbastanza fortunato perchè per una banale concomitanza temporale, proprio questa settimana è uscito Visual Studio 2010 Beta 1, in cui è presente, fresco fresco (e magari stavolta anche libero, agile e felice), Entity Framework 4.0 Beta 1.
Ebbene, la decisione è stata presa, il dato è stato tratto, bando alle ciance, gambe in spalla:
- ho creato una bella macchina virtuale VMPlayer con Windows 7 RC, SQL Server 2008 SP1 e Visual Studio 2010 Beta 1
- sto alacremente approfondendo Entity Framework 4.0 Beta 1, almeno nelle sue peculiarità più importanti e che lo differenziano maggiormente dalla versione 1.0 attuale (la 2.0 e la 3.0 chissà che brutta fine hanno fatto poverine…)
- sto aggiornando la scaletta del workshop per fare qua e là un po’ di posto proprio al nuovo arrivato, modificando qualche demo sul tono “Prima e Dopo” (del resto “aggiungi un posto a tavola che c’è un amico in più” cit.)
Insomma chi verrà al workshop si beccherà compresa nel prezzo (quello ufficiale, alla fine della giornata passerò con un cestino delle offerte per la mia questua personale) una overview anche sulla prossima versione di Entity Framework.
E visto che ci sono, qualcosina dirò anche la sera prima al Community Night quando metterò a confronto dal punto di vista della product selection proprio Entity Framework ed NHibernate.
Dimenticavo: chi conoscesse già NHibernate 2.x, può tranquillamente farsi una pausa caffè mentre parlo di Entity Framework 4.0...
lunedì 11 maggio 2009
BASTA! Italia raddoppia e dopo la tappa di Roma stavolta è il turno di Milano (28 e 29 maggio) in una veste più orientata ai workshop.
Anche a questo giro sarò presente sulle tematiche di Entity Framework: il 29 maggio terrò un workshop di una giornata intera dove cercherò di affrontare l’uso del famigerato Entity Framework nel mondo reale.
La tappa di Roma, la vera e propria conference, è stata decisamente positiva e mi fa piacere che gli organizzatori abbiano trovato il modo di replicare a Milano andando ad approfondire tematiche che stanno riscuotendo grande attenzione. Per me il formato workshop è una novità, ma devo dire che l’aspettativa è quella di poter presentare la tecnologia nel contesto di un discorso organico, senza la premura di dover stare nella fatidica ora della singola sessione.
Di cose da dire ce ne sono decisamente molte: in Managed Designs stiamo utilizzando Entity Framework in maniera molto intensiva da quasi un anno in progetti reali, uno dei quali oggi in produzione su RDBMS Oracle. La nostra attività ci ha portato ad affrontare, oltre l’uso di un db che non sia SQL Server, anche tutte quelle problematiche relative all’uso di un Entity Data Model in contesti distribuiti con WCF e Silverlight 2, senza esserci fatti mancare ASP.NET MVC (ebbene sì, siamo dei pazzi furiosi…).
Per i soci UGIDotNET esiste uno uno sconto del 15% sulla quota di iscrizione, le informazioni a riguardo si possono trovare nella sezione Benefit.
Ovviamente non poteva mancare l’ormai irrinunciabile Community Night, la sera del 28 maggio, in cui UGIDotNET e ASPItalia si troveranno nuovamente a braccetto con tre sessioni nell’after-hour totalmente gratuito. Anche in questo caso, per scaldare i motori in vista del giorno seguente, terrò una sessione sempre su Entity Framework. Proporrò un percorso di valutazione in caso di scelta tecnologica sull’adozione di un ORM: Entity Framework o NHibernate?
giovedì 19 marzo 2009
Sono molto soddisfatto di Basta! Italia 2009.
Innanzitutto lasciatemi un plauso all’organizzazione, perchè per essere il debutto in Italia di una delle manifestazioni più importanti di Germania è stato veramente un ottimo inizio. Credo che l’anno prossimo andrà anche meglio.
La compagnia poi è stata come al solito entusiasmante, soprattutto perchè stavolta in trasferta, e le mangiate sono state spettacolari (mi avete beccato: sono state la cosa più importante…).
Per quanto riguarda le sessioni che ho potuto seguire devo dire che averne anche in inglese è solo un fatto più che positivo: dobbiamo cominciare ad essere molto meno provinciali, provare ad invitare speaker non italiani, anche solo per un confronto sull’approccio all’esposizione di una sessione.
Per quanto riguarda me, bè, tre sessioni in un giorno solo sono state un bel banco di prova, certo giocavo in casa in un certo senso (tutte e tre su Entity Framework, che uso quotidianamente da almeno 8 mesi), ma il giorno prima non ero affatto tranquillo. Sono soddisfatto sinceramente, non ho ancora i feedback ufficiali, ma personalmente penso di essere stato all’altezza di un’esposizione dignitosa. La cosa curiosa è che mi sono divertito di più nell’unica sessione in cui non ho fatto vedere codice (incentrata sul confronto qualitativo fra EF, NH e LINQ to SQL), un po’ perchè mi ha fatto tornare in mente l’esposizione della tesi all’università, un po’ perchè essendo l’ultima sessione della giornata dalle 18:00 alle 19:00 ho avuto la sensazione che la platea apprezzasse un’esposizione di questo tipo, dopo un’intera giornata di (piacevole) bombardamento a botte di Visual Studio.
Come al solito poi, ho fatto la spugna in fatto di apprendimento, rubando consigli ed esperienze a tutti coloro a cui potevo rubare.
Ultima considerazione: il viaggio. L’era degli spostamenti in aereo fra Milano e Roma è terminata. L’alta velocità è un piacere sotto tutti i punti di vista, non penso che userò mai più un aereo per andare a Roma, soprattutto quando a fine anno apriranno anche le gallerie fra Bologna e Firenze. Ovviamente da geek quale sono, durante il viaggio di ritorno, sulla tratta Bologna-Milano ho attivato il navigatore Garmin sul mio palmare per vedere a che velocità stavamo procedendo: superati i 300 km/h nel massimo comfort di viaggio.