Technology Experience
.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
Community

Upload Vs. Download

Questo post che ho letto ieri sera mi ha fatto riflettere. E’ un’analisi sul meccanismo di upload dei files sul Web, in modo particolare dei video, che sono files decisamente più grandi rispetto alla media. Il punto (3) dovrebbe invece far pensare un po’ tutti, ed in primo luogo le società che oggi ci danno la connessione ad Internet, quindi Telecom, Tele2 e via via tutti gli altri.

Da che mondo e mondo, quando ci colleghiamo ad Internet abbiamo una velocità di download ed una velocità di upload: la prima indica la velocità con la quale scarichiamo contenuti dalla Rete, la seconda la velocità con la quale inviamo contenuti. Man mano che passa il tempo la prima aumenta a dismisura, mentre la seconda aumenta in modo minore, e comunque rimane al di sotto della prima. Fino a poco tempo fa, questo ci interessava poco: alla fin fine per navigare è sufficiente mandare pochi bytes per dire al server dove vogliamo andare, perchè la parte più importante è lo stream di bytes che riceviamo, che compongono la home-page di Repubblica, il file mp3 che stiamo scaricando, il download da MSDN e via dicendo.

Credo che l’avvento del Web 2.0 debba cambiare radicalmente questa filosofia. O per meglio dire, il Web moderno, dove i contenuti sono gestiti dagli utenti finali, cioè noi. Al giorno d’oggi io uploado fotografie su Flickr e video su YouTube con una velocità estremamente ridotta rispetto alla quale invece le scarico, e questo nell’ottica di un Web User Generated Content non mi sembra che abbia molta logica. Penso anche che le società che danno connettività hanno poco sentore di queste nuove esigenze, e forse non hanno tutti i torti, nel senso che la grande maggioranza degli utenti Internet (almeno italiani) sono più che altro dei semplici navigatori, e partecipano poco alla vita vera di Internet, cioè esprimersi con il dialogo e fornendo davvero informazione nel modo più esteso possibile. Se ciascuno di noi aprisse un blog e parlasse delle cose nelle quali si sente competente, o che comunque vuole condividere con gli altri, il mondo sarebbe senz’altro migliore. Però oggi non si comunica solo con lettere e testo, ma il mondo si è evoluto, oggi abbiamo a che fare con immagini, video, presentazioni, screencast, webcast…e – insomma – per chi lavora con queste cose e per chi ha bisogno di metterle on-line un po’ più di velocità non sarebbe affatto male.

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
My personal life

Padrone del mio tempo

L’autunno è cominciato da qualche giorno, ed il lavoro a pieno regime pure. Ho davvero poco tempo per bloggare durante la giornata. Ed è in casi come questi che il mio blog assume il suo significato più vero, quello che già diverse volte ho detto, cioè bloggare solo quando si ha voglia davvero, altrimenti la qualità ne risente parecchio.

Qualche minuto fa la simulazione del mio Boeing 767 è atterrato al JFK di New York dopo essere decollato alle 21 da Chicago. La televisione trasmette I Robot, con Will Smith. Sono maledettamente stanco: giovedì e venerdì scorso ho scritto codice per tamponare defezioni e per implementare nuove features nel sorgente lasciato dal mio collega che era in ferie e che è rientrato solo oggi. Non lo nascondo: sabato sera avevo voglia di andare a Livorno, ma ho rischiato di arrivare davvero troppo stanco non fisicamente, ma psicologicamente. Per fortuna, il numero ridotto di partecipanti e la buona compagnia mi hanno invece rilassato.

Oggi è andata, e domani si ricomincia. Autostrade e tangenziali, tastiere QWERTY e stream di bytes da scaricare da http, implementazione dell’interfaccia ICeProgramming e test: tanto test. Ma prima che il ciclone della mia vita mi raggiunga, ho ancora un po’ di tempo. Ho un libro di Philip Dick da leggere, “In senso inverso“, e quando finirò questo ce ne sarà un altro, “La svastica sul sole“. Fino a domani mattina sono ancora davvero padrone del mio tempo.

Send to Kindle
Community

Stasera…serata a Livorno!

Tra qualche minuto io e mio fratello partiamo per trascorrere una bella serata in quel di Livorno, con gli altri amici di UGIdotNET, tra cui voglio ricordare Matteo Baglini ed Alessio Marziali. Non so chi altro ci sarà: chiunque venga, sappia che ci divertiremo!

Spero che il tempo regga: qui a Lodi c’è un leggero solino che va e che viene, sulla SideBar di Vista alla voce “Livorno” l’applet delle previsioni meteo mette un sole ed una nuvoletta. Speriamo bene! Adesso stacco le pile della mia macchina digitale e son pronto a partire.

Appuntamento alle 20-20:30 alla piazza della stazione di Livorno. Ragazzi, a dopo!

Send to Kindle
Software

Usare un palmare…senza toccarlo!

Avete mai pensato di utilizzare un palmare senza nemmeno toccarlo? Se vi state chiedendo il motivo per cui vi potrebbe capitare una cosa del genere, io uno ne ho. Ascoltate. Per sviluppare un’applicazione mobile con Visual Studio 2005 avete fondamentalmente due strade: o usate uno degli emulatori compresi nell’SDK oppure utilizzate un palmare fisico. Quest’ultimo deve ovviamente essere connesso al PC di sviluppo attraverso ActiveSync. La connessione via ActiveSync può essere ottenuta via USB, via Blutooth, via infrarosso e così via. Inutile dire che la connessione più veloce è quella che si ottiene con la porta USB, ed è quindi quella che vi consiglio.

Ieri pomeriggio il palmare che uso al lavoro per sviluppare l’applicazione ha avuto qualche problema. Il craddle – non si sa bene per quale motivo – perde la connessione ogni due per tre. Ho provato a sostituire il cavetto USB, ma niente da fare. Probabilmente è il craddle che ha qualche problema, magari qualcuno dei contatti è sporco o lievemente danneggiato, e quindi l’ActiveSync perde nei momenti più inattesi la connessione con il palmare. Capita che il deploy da VS2005 fallisca, che il debug che state facendo venga interrotto, che Windows vi dica “Periferica USB non riconosciuta” e così via. Insomma, un incubo.

Ho trovato una posizione nella quale il palmare rimane connesso, ma basta un lieve movimento per farlo sconnettere. Basta digitare con il pennino qualcosa sullo schermo, il più piccolo dei movimenti, e ActiveSync va in bomba.

Per risolvere il problema ho scaricato i Power Toys per Windows Mobile, che all’interno contengono un’utility chiamata ActiveSync Remote Display. Una volta lanciata – è un semplice .exe – l’utility visualizza sullo schermo del PC quello che appare sul display del palmare. I vantaggi sono diversi:

  1. Potete usare il mouse per interagire con l’interfaccia del software sul palmare
  2. Potete usare la tastiera del vostro PC per digitare qualcosa sul palmare
  3. Potete, se vi serve, catturare screenshot del software sul palmare
  4. Potete usare il palmare senza nemmeno sfiorarlo, il che non guasta mai, soprattutto per tutti i problemi che vi ho raccontato prima

L’unica nota negativa è che l’apertura di questo software sembra rallentare l’esecuzione del software su PPC. Credo che ogni x millisecondi venga inviata l’immagine del palmare verso il desktop, scatenando quindi un rallentamento del sistema.

Technorati Tags:   

Send to Kindle
IV del Venerdì

[IV] del Venerdì (19)

Oggi vi racconto una storia.

Un mio caro collega ha due anni meno di me, 29. Vive ad Asti ed ogni giorno si fa un paio d’ore di treno per arrivare a Milano, per lavorare assieme sul progetto a cui siamo stati assegnati. Il lavoro dello sviluppatore gli piace, insieme a tutto il gruppo ci si diverte, non avrebbe un motivo reale per cambiare posto di lavoro. Economicamente non si lamenta, e poi qui ce la caviamo piuttosto bene, perchè ci si riesce a ritagliare del tempo per leggere blog, per bloggare noi stessi, per vedere altre cose, per scherzare e così via. Tutto questo fino ad un cambiamento radicale della sua vita: la nascita del figlio Francesco, avvenuto ai primi di maggio di quest’anno.

Da quel giorno, la moglie gli fa un po’ di pressioni per tornare a casa prima e, soprattutto, per trovare un nuovo lavoro vicino a casa. Ad Asti non si trovano molte opportunità per programmatori, e quindi si è dato da fare per trovare qualcos’altro fino a Torino. Andare a Torino gli costerebbe meno tempo, arriverebbe prima a casa e quindi sarebbe in grado di dedicare più tempo libero a tutta la famiglia, bimbo compreso. Ma come al solito, non si sa se il nuovo lavoro gli potrebbe piacere davvero oppure no: d’altro canto, qui ci si diverte con dispositivi Pocket PC/Windows Mobile e ci sono tutti i vantaggi che ho detto prima, mentre di là (parlo di un lavoro presso una filiale bancaria) magari il tutto diventa più noioso e, alla lunga, meno soddisfacente. Credo che noi programmatori siamo strani: per noi – o almeno, per me – non è solo una questione economica. Credo che sia importante il “vivere felici”. Sapere di svegliarsi la mattina e sapere di andare a lavorare in un posto sereno, con colleghi onesti è fondamentale, perchè lavorare in altri contesti potrebbe logorare davvero, e arrivare a casa “pieni di soldi” ma infelici, secondo il mio umile parere, non serve proprio a nulla. Non voglio fare il maestro di vita, come mi è stato accusato molto tempo sul Muro di UGIdotNET, ma nel mio piccolo ci sono passato, ed è un’esperienza che non vorrei ripetere, e che non augurerei nemmeno al peggiore dei miei nemici (…ok, dai, forse a qualcuno sì!). Ovvio, non voglio prendere due soldi, voglio prendere il giusto…quello che vorrei trasmettere è che la qualità della vita deve ricoprire una parte importante delle nostre decisioni, cosa che secondo me non sempre si fa.

Leggevo l’altro giorno diverse statistiche sul giornaletto di tutto: sono statistiche che mi lasciano sempre perplesso, perchè vengono fatte di tutte le erbe un gran bel fascio. L’altro giorno – per l’appunto – si diceva che le donne sono meno infelici degli uomini perchè il lavoro le opprime e hanno poco tempo libero per loro stesse. Non voglio crederci più di tanto, francamente, però se faccio mente locale a penso alle mie amiche, quasi tutte fanno un lavoro che segue poco le loro ambizioni di una volta. Di una per esempio ho parlato qua, in un mio bellissmo post (scusate la modestia, ma rileggendolo…ho capito che mi piace davvero!). Non penso siano infelici in modo assoluto, penso solo che siano più infelici di me. Non è il lavoro che regala una felicità assoluta – ci sono ben altre cose, e ci mancherebbe – ma dato che si passano più di 8 ore al giorno nell’ambiente lavorativo, sarebbe proprio bello cercarsene uno che ci faccia vivere tranquilli.

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
Software

Half Life 2 Episone One : un’esperienza memorabile

Ho giocato sia al primo Half Life che al secondo. Quest’ultimo in particolare mi colpì moltissimo: innanzitutto, il motore fisico degli oggetti, poi la grafica estremamente realistica, dai paesaggi al viso dei personaggi principali, le animazioni di Alex, la storia, gli enigmi. Sebbene sia un appassionato dei 3D in soggettiva che mettono un po’ di angoscia (F.E.A.R. e Doom 3, per esempio), posso tranquillamente affermare che probabilmente HL2 ha il primo posto, perchè è sicuramente il più coinvolgente e poi per due fondamentali motivi regala un’esperienza fantastica. Quali sono questi due motivi? Eccoli:

  1. la continuità tra un livello ed un altro. Effettivamente, parlare di livello è difficile, perchè mi viene più da parlare di enorme grande mondo (chilometri e chilometri da esplorare, sia a piedi che usando veicoli), dove ogni tanto ci sono caricamenti.
  2. già detto parzialmente: la vastità del mondo. Capita a volte di essere su un veicolo e di vedere in lontananza un palazzo, una casetta o un qualsiasi altro edificio che sembra far parte dello sfondo. Beh, non è così. Alla fin fine, in quell’edificio potrete entrarci, raccogliere oggetti, far fuori il nemico e magari continuare la vostra missione passando proprio da lì.

L’unica nota negativa di HL2 era la musica di sottofondo, una musica unz-unz molto dance, assolutamente inappropriata e fuori tema. Non ho mai capito chi avesse deciso di cacciare dentro un capolavoro così una musica assurda come quella.

Ieri sera ho provato Half Life 2 Episode One. Ragazzi, è uno sballo assoluto. Praticamente tutti i migliori pregi di HL2 con musiche dannatamente migliorate, a livello cinematografico. Ieri sera, mentre cenavo, ho detto ai miei: “Se sentite strani rumori provenire dalla mia camera, non preoccupatevi troppo!“. Ho alzato a livello medio il volume delle mie casse sorround e THX-compliant e vi posso assicurare che l’esperienza è impagabile, al punto che nonostante tutta la giocata di ieri sera, stasera lo ricomincio per godermi un po’ l’esperienza videoludica. Non vi racconto nulla sulla trama, vi posso solamente dire che HL2E1 ricomincia esattamente dove era terminato il primo. E andrete subito a farvi un Bel Giro dentro la Sentinella, l’enorme edificio che si innalza fino alle nuvole. Spettacolo, assolutamente consigliato!

Technorati Tags:

Send to Kindle