Technology Experience

.NET World

Programmazione, libri, snippet di codice, articoli tecnici

.NET World

E’ tempo di rinnovare MSDN Professional!

Due anni fa, correva l’anno 2005, acquistai ex-novo l’abbonamento Visual Studio 2005 with MSDN Professional della durata di 2 anni, aprofittando di un’offerta che mi era stata consigliata dalla mai dimenticata Giada Scarafiotti di Microsoft. Questa subscription sarebbe scaduta dopo domani, 20 Ottobre: dico dovrebbe perchè questa mattina l’ho rinnovata, con un bel bonifico bancario di €.1.200,38 a Gorilla.it. In questo modo, per i successivi due anni potrò essere un po’ tranquillo su software ed aggiornamenti vari. Se vi dovesse interessare, l’indirizzo del prodotto specifico è questo. Voglio ringraziare anche i vari commerciali di Gorilla, perchè sono tutti molti gentili e disponibili ed hanno giustamente cominciato ad avvisarmi della scadenza della subscription da un po’ di tempo (circa un mesetto fa), per evitare di dover fare l’acquisto di un MSDN nuovo del tutto, con una inevitabile perdita di un bel mucchietto di soldi. Ma io come al solito mi sono dato da fare all’ultimo momento.

Purtroppo l’acquisto in sè è stato travagliato per altri motivi: non volevo usare la carta di credito per il pagamento, ma fare un bonifico bancario attraverso il mio home-banking. Ma da un po’ di tempo la mia utenza sul mio home-banking risultava bloccata, e quindi non riuscivo a fare la disposizione bancaria. Però, dato che la tangenziale ovest di Milano stamattina era un incubo…ne ho aprofittato per rompere le scatole all’assistenza…farmi sbloccare l’utente…e procedere quindi al pagamento dell’ordine. Insomma…tutto è bene quel che finisce bene.

Tra l’altro, pensavo che a gennaio dell’anno prossimo mi scadrà anche la MSDN Universal che UGIdotNET mi aveva regalato lo scorso dicembre: ma questa è davvero troppo cara per le mie tasche, sebbene i contenuti siano inevitabilmente succulenti, a cominciare da Team System e dagli annessi e connessi come TFS, di cui ho beneficiato durante quest’anno.
Vabbè…il gioco è bello quando è corto!

Technorati Tags:  

Send to Kindle
.NET World

Virtual conference gratuita su Sharepoint

Andrew Connell avvisa tutti i lettori del suo blog che domani, 17 Ottobre, ci sarà una Sharepoint Pro Online virtual conference. Per maggiori informazioni cliccate qua. Gli argomenti sono diversi, e credo tutti molto interessanti, soprattutto per chi utilizza Sharepoint nel proprio lavoro. Bisogna registrarsi, ma è del tutto gratuita. Attenzione all’orario, però: la virtual conference è il 17 Ottobre dalle 11:00AM alle 05:00PM (GMT -5000). Noi siamo nel fuso orario di Roma (GMT +1000), quindi bisogna fare i dovuti calcoli per trovare l’orario giusto: se ho calcolato bene, le 11:00AM diventano le nostre 17:00 (6 ore in avanti) e si conclude alle 23:00 di domani sera. Ditemi se ho sbagliato, perchè a quest’ora sono abbastanza fuso (ehm…scusate il gioco di parole!)

Per conoscere le sessioni vi rimando a questo URL. A parte le due che parlano di Dynamic Applications with the SharePoint AJAX Toolkit, le altre le seguirei tutte.

Devo dirlo a mio fratello, ma in questo momento c’è una lezione in corso sull’FMC (Flight Management Computer) del MD80. Mai disturbarlo in questi frangenti.

UPDATE : se vi state registrando e non trovate l’Italia nell’elenco delle country, non spaventatevi. Non dovete cercare Italia seguendo l’ordine alfabetico, ma in cima…dove ci sono (credo) le nazioni più blasonate…mi pare di aver letto Francia, Inghilterra e così via.

Technorati Tags:   

Send to Kindle
.NET World

Microsoft diventa un po’ più open-source!

Questa è una notizia da leggere con calma e da digerire per bene. Fate così: sedetevi, prendete una lattina della vostra bevanda preferita – io ho optato per un bel Estathè – chiudete gli occhi, fate un bel respiro e riapriteli. Leggete di seguito.

La notizia è che con l’uscita di Visual Studio 2008 verrà rilasciato il codice sorgente del .NET Framework 3.5!!!

Il titolo del post originale recita “Releasing the Source Code for the .NET Framework Libraries“, e potete leggerlo qui. Ah, ferma: è scritto da un certo Scott Guthrie, che non è di certo l’ultimo arrivato. Non verrà rilasciato il codice sorgente di tutte le classi, ma di certo una bella parte succulenta che comprende i seguenti namespace:

System
System.IO
System.Collections
System.Configuration
System.Threading
System.Net
System.Security
System.Runtime
System.Text
System.Web
System.Windows.Forms
System.Data
System.Xml
System.Windows

Secondo il post, nei prossimi mesi sarà previsto il rilascio di altri namespaces del .NET Framework. Il post spiega altre cosucce interessanti, tipo che nel sorgente saranno presenti anche i commenti, oppure che se state debuggando il vostro codice sorgente ed arrivate su un metodo nativo del framework, premendo F11 (Step Into) verrà automaticamente scaricato il sorgente della classe interessata per eseguirlo direttamente senza interrompere alcunchè. Veramente forte!

Questa cosa è la notizia del giorno: molti post su MSDN parlano di questo. E ci credo bene. Non voglio dire che sia una vera e propria inversione di rotta – d’altro canto, per vedere i sorgenti del framework qualche trucchetto c’era – ma adesso risulta più come una scelta politica da parte di Microsoft. Per quello che può valere il mio parere, approvo in pieno.

L’ultima nota riguarda la licenza con la quale verranno rilasciati i sorgenti: è la Microsoft Reference License (MS-RL): maggiori dettagli qua. Non so nulla di licenze, so qualcuno vuole spiegarmi di cosa si tratta, mi lasci pure un commento breve, altrimenti andrò a leggermi il link.

Technorati Tags:    

Send to Kindle
.NET World

Le metriche del prossimo Visual Studio 2008

Non è mia abitudine quella di andare a prendere post a caso sugli altri blog e di riproporli in qualche modo sul mio, ma questa volta devo farlo. Un paio d’ore fa un certo David M.Kean ha parlato delle nuove metriche che saranno disponibili nel prossimo Visual Studio 2008. Troppo interessanti, le riassumo qua:

Class coupling
Depth of Inheritance
Cyclomatic Complexity
Lines of Code
Maintainability Index

La “Class Coupling” sinceramente è una di quelle cose di cui non farei a meno. Vi dico solo che per cercare di riportarla in condizioni accettabili sto lavorando dalla settimana scorsa ad un bel po-po di codice che è a dir poco devastante e con così tante dipendenze dappertutto che mi viene mal di testa ogni giorno.

Fonte : http://blogs.msdn.com/fxcop/archive/2007/10/03/new-for-visual-studio-2008-code-metrics.aspx

Technorati Tags:  

Send to Kindle
.NET World

La parte più ostica di WPF è il layout

Spesso e forse troppe volte leggo i pro ed i contro tra il classico Windows Forms e WPF, due tecnologie che io personalmente ritengo simili fra loro, soprattutto perchè tutto sommato si occupano di risolvere lo stesso problema, cioè quello della creazione di interfacce smart client efficaci e belle da vedere. WPF è ovviamente più moderno, offre molte cose in più che permettono di raggiungere risultati molto diversi e molto più piacevoli da vedere: parlo di tecniche proprie di WPF come gli stili, i triggers, le animazioni ed i tantissimi effetti grafici che possiamo sfruttare nativamente all’interno delle nostre applicazioni.

Ci sono molte cose però che WPF e WF hanno in comune. Se uno sviluppatore WF si trova a dover sviluppare un’applicazione WPF, avrà sempre a che fare con controlli, eventi Click sui pulsanti, ListBox e così via. Probabilmente non riuscirà a sfruttare fin da subito tutto quello che WPF offre, ma meglio di niente, giusto? Tutto sommato, con WPF possiamo comunque creare Windows grigie e tristi, con le solite TextBox e senza alcuna features in particolare. Mi viene in mente tutte le volte che ho letto il corso/sessione “Da VB6 a VB.Net“: non sarebbe male pensare a qualcosa del tipo “Da Windows Forms a Window Presentation Foundation“. Qualche idea degli argomenti da trattare ce l’avrei pure. Per quello che mi riguarda, la cosa più ostica di WPF rimane il meccanismo di layout: c’è sia in WF che in WPF, ma seguono ragionamenti e concetti molto diversi, coi quali mi trovo quasi sempre un po’ in difficoltà. Nelle classiche WF, tutto è posizionato con coordinate ben precise, mentre nelle window WPF tutto assomiglia un po’ più alla progettazione delle pagine Web, con posizionamenti relativi, con panel dove i controlli si adattano ai loro container e così via. Sì, sono convinto, se dovessi creare una lezione “Da Windows Forms a Window Presentation Foundation” forse la parte più grossa dovrebbe riguardare il layout dei controlli.

Technorati Tags:   

Send to Kindle
.NET World

Semplificare il codice creando un’interfaccia

Uno degli argomenti più interessanti che sto affrontando nel progetto su cui sto lavorando è la programmazione di un contatore elettronico attraverso un dispositivo Pocket PC. Con “contatore elettronico” intendo i contatori dell’energia elettrica, quelli che sono installati nelle nostre case e che misurano i consumi in modo tale che poi arrivi la brava bolletta da pagare. Il software che stiamo sviluppando permette ad un tecnico di andare in giro per la città con un palmare e di elaborare uno alla volta gli ordini che ha ricevuto la mattina in ufficio. Ciascun ordine – detto semplicemente – consiste fra le altre cose nella programmazione del contatore di turno, scrivendo una miriade di informazioni riguardanti: cliente, tariffe, calendario, festività, azzeramento dei consumi, settaggio data ed ora e così via. Il tutto, come dicevo, attraverso un normalissimo Pocket PC che monta anche una fotocamera in bianco/nero ed un lettore ottico su porta seriale che viene utilizzato per la comunicazione con il contatore vero e proprio.

Dal punto di vista più tecnico, la programmazione avviene attraverso l’utilizzo di una classe che espone un metodo, che chiameremo WriteCommand, che prende in input una stringa formattata in modo un po’ particolare. I primi due caratteri identificano il tipo di operazione (lettura o scrittura), i successivi quattro identificano il registro sul quale lavorare e quelli dopo ancora rappresentano i dati da scrivere (quando l’operazione è di scrittura, ovviamente). Il metodo WriteCommand ritorna un intero: se vale zero, l’operazione ha avuto successo; se diverso da zero, l’operazione per qualche motivo è fallita.

Inizialmente avevamo studiato un modo un po’ spartano: nel codice compariva un elenco brutale di chiamate, circa un centinaio, a WriteCommand. Tecnicamente il tempo richiesto per queste operazioni è pochissimo, dell’ordine dei decimi di secondo. In realtà, il tutto è notevolmente più complesso, perchè le informazioni da inviare al contatore arrivano da un file XML e sono sottoposte anche a controlli di validità. Non appena una delle WriteCommand fallisce, la programmazione del contatore viene interrotta e viene data comunicazione al tecnico che qualcosa non è andata a buon fine. Alla fine mi sono ritrovato con una classe con un metodo con qualche centinaio di righe: assolutamente inaccettabile.

Ci ho messo due giorni interi, ma ho fatto un bel refactoring del codice, passando da un’interfaccia ICEProgramming definita in questo modo:

interface ICEProgramming { // Properties int ErrorCode { get; } string MessageError { get; } string ProgrammingPhase { get; } CENativeClass NativeClass { set; } StreamWriter Logger { get; set; } // Methods Dictionary<string, string> CallNativeFunction(Dictionary<string, string> inputParameters); }

Ho poi creato un certo numero di classi che implementano questa interfaccia, ciascuna delle quali si occupa di programmatore il contatore con un particolare set di dati (anagrafica cliente, tariffe, calendario, festività, potenze e consumi previsti dal contratto, etc. etc.). Ciascuna di queste classi deve quindi implementare i seguenti membri pubblici:

  • ErrorCode, che ritorna lo stesso valore ritornato dalla WriteCommand relativa. Non appena un’operazione di scrittura fallisce, la programmazione viene interrotta ed il flusso del codice ritorna al chiamante, fino a visualizzare una MessageBox al tecnico.
  • MessageError, che contiene l’errore ritornato direttamente dal contatore.
  • ProgrammingPhase, che serve invece per visualizzare un messaggio in chiaro al tecnico. Se la programmazione non riesce, questo membro è in grado di dirci a che punto eravamo effettivamente arrivati.
  • NativeClass, la classe nativa, cioè quella che espone il metodo WriteCommand.
  • Logger, che è importante, perchè permette di scrivere su un file .log tutto quello che stiamo facendo. In pratica, appena dopo l’esecuzione di una WriteCommand, inviamo sullo stream di output il comando che abbiamo appena eseguito, così possiamo eventualmente vedere in un secondo momento quello che è stato inviato al contatore.
  • CallNativeFunction, nome ancora in beta. Questo è il metodo che effettivamente esegue la programmazione del contatore. Questo metodo prende in input un Dictionary<string, string>, che contiene eventuali parametri che servono al metodo. Ritorna ancora un Dictionary<string, string>: questo perchè può essere che abbiamo bisogno di avere un certo numero di valori di ritorno. All’uscita da questo metodo viene sempre controllato il valore di ErrorCode, per controllare che tutto sia andato bene oppure no.

Nel progetto ho creato classi come CEPowers (scrittura delle potenze), CEDisplay (configurazione del display del contatore), CEStartup (scrittura dei valori di default) e così via. Tutte le classi implementano ICEProgramming, come dicevo, e tutte hanno un approccio simile, anche se poi l’implementazione del metodo CallNativeFunction è molto, molto diversa. Tutti i Dictionary<string, string> vengono alla fine fusi in un unico Dictionary<string, string>, che viene scritto su database e che servirà in un secondo momento per motivi che esulano dallo scopo di questo post.

In questo modo ho potuto spezzare il codice suddividendolo in diverse classi, ciascuna con il proprio scopo ben definito.
Il codice è molto più leggibile e manutenibile.

Technorati Tags:  

Send to Kindle
.NET World

Fare l’attach di un file .mdf su un server hostato da WH4L

Tra i tanti servizi che WebHosting4Life (WH4L) mette a disposizione dei suoi clienti c’è anche un bel SQL Server 2005, su cui possiamo hostare uno o più database. Per esempio, nel mio hosting ho un database per Subtext, per far girare il blog che state leggendo.

Qualche minuto fa ho messo on-line anche il mio database “aziendale”, ovvero un database che contiene i dati del mio piccolo software di fatturazione, come gli articoli, i clienti, le fatture e così via. Se vi state chiedendo il perchè, è presto detto. In condizioni normali, le faccende burocratiche della mia attività me lo sbrigo la sera: alla fine di ogni mese devo fare il rapportino di lavoro, fare la fattura e mandare tutta questa documentazione alle persone giuste. Capita che la sera non abbia così tanto tempo, e quindi preferisco ritagliarmi 10 minuti durante la giornata. La conseguenza di tutto questo è che il mio database deve essere sempre raggiungibile indipendentemente dal fatto che sia a casa, in ufficio o su un treno. Quindi…ho sfruttato l’hosting di WH4L.

C’è una piccola chicca di cui non ero a conoscenza. WH4L mette a disposizione un’interfaccia web-based per gestire l’hosting: fin qua nulla di strano. Da qui possiamo tutto, compreso lavorare sui database: crearne di nuovi, fare lo shrink/backup/restore di quelli presenti e così via. La domanda è questa:

Se ho un file .mdf sul mio PC locale posso fare l’attach su un server SQL Server 2005 hostato su WH4L?

La risposta è sì. Ci ho messo un po’ per capirlo: basta uploadare il file .mdf nella root del server ftp che porta lo stesso nome del server SQL Server 2005. Attenzione: questo server ftp è diverso da quello che usate per uploadare files e pagine ASPX! Io personalmente non sapevo nemmeno che esistesse. Il nome del server lo leggete nel vostro Control Panel. Fatto questo, andate nel vostro Control Panel di WH4L, andate nella sezione Database e cliccate su Attach Database. Seguite la procedura, che consiste nello specificare il nome del file .mdf, il nome del database che volete creare e le credenziali per accedere al database stesso.

Ed il gioco è fatto. Da notare che è possibile accedere al database con qualsiasi strumento: dal Management Studio di Microsoft a tutti gli altri tool di programmazione, fino ad arrivare a software .NET e non, compreso il mio di fatturazione.

Technorati Tags:   

Send to Kindle