Technology Experience
Software

Viaggi con Flight Simulator

Questa sera ho inaugurato un nuovo photoset su Flickr, chiamato Flight Simulator Travelling, nel quale uploaderò tutti gli screenshot scattati durante le mie escursioni con Flight Simulator X. Questa sera ho volato in VFR prima fra le isole greche, e poi nei dintorni di Innsbruck.


Sopra: de Havilland in volo nel mare limpido del Mediterraneo, nei dintorni della Grecia.


Sopra: Money Bravo in decollo dall’aeroporto di Innsbruck, innevato e freddissimo


Sopra: volo a 5000 piedi. Le montagne innevate sono bellissime. Lo vedete il fiume sotto? L’ho visto durante il decollo, mi sono fatto un volo a caso tra le cime nei dintorni della città. Per tornare a casa, ho sfruttato il mio senso d’orientamento: ho ritrovato “a naso” il fiume, l’ho seguito per tornare in aeroporto. Così finalmente son potuto atterrare tranquillamente, come si vede qui sotto.

 

In futuro utilizzerò sempre lo stesso photoset, senza troppe complicazioni. Lo potete trovare qui.

Technorati Tags:

Send to Kindle
.NET World

Ripetere all’infinito un filmato con XAML

Sto preparando una Window con WPF e XAML per mettere in attesa l’utente quando il software sta facendo qualcosa di piuttosto lungo, che potrebbe annoiarlo. L’operazione prevede la connessione ad un Web services con WCF per scaricare delle informazioni: la durata può variare dai 4 secondi in su, in base ai soliti parametri…qualità della connessione, velocità, etc. etc.

Ho trovato tra i miei CD una vecchia licenza di Corel R.A.V.E., un software di animazione vettoriale: l’ho installato ed in un’oretta ho creato una piccola animazione, partendo dal logo VivendoByte che vedete in alto a sinistra sulle pagine del mio blog. Come inserirlo  in una Windows? La risposta è semplice: è sufficiente usare la classe MediaElement.

Ma non basta: se volete che l’animazione si ripeti all’infinito, bisogna passare attraverso l’utilizzo della classe MediaTimeline, inserito tra i trigger del MediaElement. Riporto lo XAML per chiarezza:

<MediaElement Name="WaitingAnimation" MediaOpened="MediaElement_BufferingEnded"> <MediaElement.Triggers> <EventTrigger RoutedEvent="MediaElement.Loaded"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <MediaTimeline Source="C:UsersIgorDesktopLogoVivendoByteAnimato.avi" Storyboard.TargetName="WaitingAnimation" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </MediaElement.Triggers> </MediaElement>

Ho aggiunto un MediaElement chiamato WaitingAnimation. Notare che intercetto l’evento MediaOpened, che si scatena non appena WPF fa partire il filmato: nell’evento – non riportato – faccio partire l’esecuzione di un BackgroundWorker che in un thread separato fa tutto quello che deve fare. Poi lavoro con i trigger del MediaElement: non appena si scatena l’evento MediaElement.Loaded comincia l’esecuzione di una storyboard, che contiene un MediaTimeline che fa il play del filmato indicato nella proprietà Source. Notare l’utilizzo della proprietà RepeatBehavior – non disponibile nel MediaElement – che dice a WPF di ripartire daccapo con l’animazione quando essa arriva alla fine.

Fonte : http://msdn2.microsoft.com/en-us/library/ms741866.aspx

Technorati Tags:  

Send to Kindle
.NET World

Siete bravi con Silverlight? Dimostratelo, è il vostro momento!

Se siete grafici, web-designer, web-developer e volete dimostrare di essere tosti con Silverlight, potete farlo partecipando al 1st European Silverlight Challenge, le cui iscrizioni sono state aperte oggi. Raggiungete il sito ufficiale della sfida, iscrivetevi e datevi da fare: la finale europea potrebbe essere vostra! La sfida è organizzata da Microsoft, da INETA e da XeDotNet, la community .NET in quel di Venezia.

Se vi state chiedendo come partecipare, potete leggere il regolamento qua. La versione breve è: iscrivetevi, spedite il vostro lavoro in Silverlight entro il 28 Gennaio 2008 ed attendete i risultati entro il 12 Febbraio 2008. Tutto il materiale deve essere totalmente scritto in inglese, deve essere libero da copyright e deve essere rilasciato tutto licenza open-source. I premi sono succulenti, soprattutto se lavorate con tecnologie Microsoft: ci sono licenze MSDN, Resharper, tool di terze parti come JetBrains e ComponentOne, controlli per ASP.Net, etc. etc, oltreche – da non sottovalutare – gloria e fama.

Credo che sia una straordinaria occasione per mettersi in gioco, per dimostrare la propria bravura con l’innovativa piattaforma di sviluppo per applicazioni Web rilasciata da Microsoft, capace di portare la potenza di WPF sui nostri browser per rendere sempre più accattivante la user-experience dei navigatori. Sarà pur vero che si comincia in un ambito italiano, ma avere l’occasione di poter apparire in un contesto internazionale è allettante.

Io con Silverlight non saprei fare nulla: è vero…ok…è WPF, ma ci sono alcune limitazioni che nella versione pura per smart-client non ci sono, e quindi – come qualcuno mi ha detto – sono abituato fin troppo bene. Ma se siete più web-oriented, questa è l’occasione che fa per voi.

Grazie a Lorenzo per la segnalazione e ad Andrea per il lavoro che stanno svolgendo!

Technorati Tags:   

Send to Kindle
.NET World

Salvare in modo asincrono gli stati di un processo transazionale

Uao, che titolo altisonante che ho tirato fuori dal cilindro questo pomeriggio.
Vi illustro lo scenario.

Immaginatevi un piccola applicazione mobile (Pocket PC o Windows Mobile, non importa) composta essenzialmente da 5 form diverse: Form1, Form2, Form3, Form4 e, sorpresa, Form5. L’applicazione parte mostrando Form1. Su ciascuna form ci sono due pulsanti – Next e Previous – per poter navigare avanti ed indietro da una forma all’altra. Gli stati possibili all’interno dell’applicazione sono i seguenti, con le varie possibilità di navigazione…

Partenza=Form1, Indietro=Form1, Avanti=Form2
Partenza=Form2, Indietro=Form1, Avanti=Form3
Partenza=Form3, Indietro=Form2, Avanti=Form4
Partenza=Form4, Indietro=Form3, Avanti=Form5
Partenza=Form5, Indietro=Form4, Avanti=Form5

Vediamo un po’ di codice per capire di cosa sto parlando. Questa è la classe Form1.

1 public partial class Form1 : Form 2 { 3 TransactionManager manager = new TransactionManager(); 4 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void previousButton_Click(object sender, EventArgs e) 11 { 12 manager.CurrentForm = this; 13 manager.NextIndex = 1; 14 manager.MoveToTransaction(); 15 } 16 17 private void nextButton_Click(object sender, EventArgs e) 18 { 19 manager.CurrentForm = this; 20 manager.NextIndex = 2; 21 manager.MoveToTransaction(); 22 } 23 }

Faccio uso di quello che ho chiamato TransactionManager, ovvero una classe che ha la responsabilità di farmi navigare avanti o indietro in base alla “posizione” in cui mi trovo. Se clicco sul previousButton e mi trovo su Form1, rimango su Form1. Se clicco su nextButton e mi trovo su Form1, vado su Form2, e così via, secondo lo schema (chiamiamolo così) che ho indicato sopra. Vediamo il codice di TransactionManager per capire un po’ di cose.

1 class TransactionManager : ITransaction 2 { 3 Form _currentForm; 4 int _nextIndex; 5 6 public Form CurrentForm 7 { 8 get { return _currentForm; } 9 set { _currentForm = value; } 10 } 11 12 public int NextIndex 13 { 14 get { return _nextIndex; } 15 set { _nextIndex = value; } 16 } 17 18 public void MoveToTransaction() 19 { 20 PDAManager.ShowWaitCursor(true); 21 22 string formName = "FormsNavigator.Form" + (_nextIndex).ToString(); 23 Form newForm = (Form)Assembly.GetExecutingAssembly().CreateInstance(formName); 24 25 if (newForm != null) 26 { 27 newForm.Show(); 28 newForm.BringToFront(); 29 30 if (_currentForm.GetType() != typeof(Form1)) 31 { 32 _currentForm.Close(); 33 } 34 } 35 36 PDAManager.ShowWaitCursor(false); 37 } 38 }

Qua ci divertiamo.

La classe TransactionManager implementa l’interfaccia ITransactionManager, che prevede due proprietà pubbliche (CurrentForm e NextIndex) e l’implementazione di un metodo MoveToTransaction(). Quest’ultimo è fondamentale: visualizza la clessidra sullo schermo del palmare. Poi viene creata tramite Reflection l’istanza del nuovo form da visualizzare: mi spiego meglio. Supponiamo di essere su Form2 e supponiamo di cliccare sul pulsante Next: il flusso di esecuzione entra nel metodo MoveToTransaction() e viene calcolato il nome del nuovo form: nel nostro caso FormsNavigator.Form3 (linea 22 del codice qui sopra). Il nuovo form viene creato (linea 23) e mostrato sullo schermo. Se il vecchio form non è Form1, lo chiudo, altrimenti rimane lì dov’è: Form1 è l’entry-point di questa applicazione, se lo chiudessi chiuderei tutto, perciò lo evito. La clessidra viene tolta e l’utente si ritrova con il nuovo form davanti.

Aggiungiamo un po’ di asincronia

Il codice qui sopra è semplice: permette di navigare avanti ed indietro sulle 5 form dell’applicazione. Supponiamo adesso che il passaggio da una form all’altra implichi il salvataggio di una qualche informazione su database locale, magari un SQL Server Compact Edition. Nulla ci vieta di mettere TextBox, ComboBox o altri controlli su ciascuna delle 5 form. Va da sè che il passaggio da uno stato all’altro deve prima occuparsi del salvataggio di queste informazioni da qualche parte, magari – come dicevo prima – un database locale. Questo caso può anche essere relativamente veloce, ma se la mole di dati cresce, oppure se utilizzo un database remoto, il tempo di attesa potrebbe anche crescere. Se c’è una cosa che non mi piace, è far aspettare l’utente per una cosa di cui non gliene può fregare di meno. Mi piacerebbe che la navigazione fosse veloce, che l’utente possa viaggiare da Form1 a Form2 senza aspettare troppo, mentre qualcun’altro sta facendo il lavoro sporco senza bloccare la UI, e senza far aspettare nessuno. Ho risolto così.

Alla classe TransactionManager di prima ho aggiunto un metodo privato:

1 void saveTransactionDataAsync() 2 { 3 System.Threading.Thread.Sleep(5000); 4 string msg = string.Format("Ho finito di salvare i dati della tx {0}", _nextIndex.ToString()); 5 MessageBox.Show(msg); 6 }

L’implementazione per questo post non fa nulla di interessante: il thread corrente viene messo in pausa per 5 secondi, poi visualizzo una MessageBox all’utente che lo informa che l’operazione di salvataggio dati è stata terminata con successo. Ho poi modificato l’implementazione del metodo MoveToTransaction che abbiamo visto prima, inserendo alla linea 21 le seguenti due linee di codice:

1 Thread thread = new Thread(saveTransactionDataAsync); 2 thread.Start();

In pratica, le operazioni su database vengono effettuate in un thread separato, mentre quello principale chiude ed apre le form molto velocemente, senza che l’utente si accorga di quello che sta succedendo in modo più “nascosto”.

Ci sono molte altre cose da dire, ma penso che per dare l’idea e per fornire qualche spunto può essere più che sufficiente. I commenti sono ben accetti.

Technorati Tags:    

Send to Kindle
Hardware

Ho deciso: ritorno ad un mouse con filo!!!

Ho passato alcuni anni ad utilizzare mouse wireless, perchè li consideravo più comodi, però ci sono anche innumerevoli svantaggi: bisogna ricordarsi di avere sempre pile pronte di ricambio (nuove oppure ricaricabili), il mouse è molto più pesante, la precisione non è ‘sto granchè e a volte il ricevitore fa le bizze. Nel mio caso, ed avevo il desktop set 6000 della Microsoft, dovevo comunque tenere il ricevitore a due passi dal mouse, altrimenti non riuscivo ad usarlo.

Aggiungo che a volte il mouse wireless lascia fin troppe libertà: venerdì sera la mia sorellina se lo è tenuto in mano un po’ troppo – mentre parlava – ed ha fatto un volo pazzesco. Adesso il clic sinistro è un po’ ballerino: da qui la mia decisione di cambiarlo.

Ho quindi deciso di tornare ad acquistare un mouse con filo serio. Il PC di casa lo uso per il 50% per giocare, e quindi stavo optando per il Microsoft Habu Laser Gaming Mouse, un mouse creato da Microsoft insiema a Razer, casa leader per la produzione di mouse dedicati al gioco. Sarà pure un mouse da giocare, però alla fin fine si ha tutto da guadagnarci se è preciso. Inoltre, come dicevo, ha il filo: basta con batterie, pile e ricevitori che ogni tanto non prendono.

Se avete altri consiglio, fatevi sotto: son qua e vi ascolto.

Technorati Tags:   

Send to Kindle
Software

Le impostazioni di IE7Pro

si trovano nella directory C:Users<username>AppDataLocalLowIE7Pro, almeno io li ho trovati lì sotto Windows Vista. C’è un file conf.ini che contiene un po’ tutto: copiatevelo da qualche parte per farvi il backup.

Pensavo fossero nel registro, invece no. Penso che sia comodo, perchè IE7Pro permette di configurare alias per i siti e doverli reimpostare a mano dopo un eventuale formattata del PC è davvero noioso e scomodo. Così invece….è tutto più semplice!

Send to Kindle
IV del Venerdì

[IV] del Venerdì (25)

Ci vuole sangue freddo per fissare un muro,
per viaggiare a fari spenti nella notte,
per tenere lo sguardo fisso davanti.

Ci vuole coraggio per tenersi strette le convinzioni,
per farsi forza quando si è stanchi,
per non urlare quando tutte le tue cellule ti chiedono di farlo.

Ci vuole freddezza per conoscere il nemico,
per impugnare il fucile e strappargli la vita
e poi tornare a casa e vedere lo stesso cielo di prima.

Ci vuole costanza per alzare la testa verso la pioggia che cade,
per svegliarsi la mattina presto e sentirsi sveglio,
per fare due ore di auto al giorno in mezzo al traffico.

Ci vuole bontà d’animo per aiutare il prossimo,
per dare un passaggio a qualcuno senza sapere nemmeno chi è,
per cedere l’ultimo biglietto del concerto a cui tenevi tanto.

Ci vuole sincerità per guardare una persona negli occhi,
per farle capire che sei lì solo per lei,
per viaggiare sui sentimenti senza dire una parola.

Ci vuole passione per insistere su una cosa,
per scivolare nel tempo chiusi in una stanza,
per esultare a braccia alzate per una cosa che altri reputano stupida.

Ci vuole entusiamo per uscire il venerdì sera,
per bersi una birra all’ora in cui altri dormono,
per appoggiare la testa sul cuscino ed addormentarsi, sognare e ripartire il giorno dopo.

Buon fine settimana a tutti!

Send to Kindle
My personal life

Volandia: Museo dell’Aeronautica a Malpensa!

Mio fratello è socio dei Piloti Virtuali Italiani, una community online e non dedicata alla simulazione del volo. Quello che UGI fa con .NET e la programmazione, PVI lo fa con il volo simulato. Serate passate in compagnia con comandanti di Boeing 737, lezioni on-line su come pilotare questo o quell’aeromobile, discussioni sui forum, consigli di navigazione visuale e strumentale, etc. etc.

PVI sarà tra quelli che domani 24 Novembre 2007 inaugurerà all’aeroporto di Malpensa il Parco e Museo del Volo che verrà chiamato Volandia. Il sito ufficiale del museo è qui. Mio fratello Omar sarà là per fare presenza, per partecipare attivamente all’evento e per dare un’occhiata ai simulatori e agli aeromobili che saranno esposti: su questo non vado oltre, perchè ha già lui ampiamente parlato in modo dettagliato in questo suo post di qualche giorno fa. Ci saranno aerei ed elicotteri reali, una sezione dedicata all’aspetto pioneristico del volo, e diversi simulatori, inteso come il cruscotto reale di veri aerei (MB339, per esempio, quello delle Frecce Tricolori) su cui gira Flight Simulator 9, etc. etc.

Io sarò là domenica pomeriggio per scattare qualche fotografia da pubblicare sul mio sito Flickr. Se vedete che domenica piove, o non sapete cosa fare, se volete vedere qualche aereo, se siete appassionati di volo simulato o non, venite a fare un giro perchè potrebbe davvero piacervi e vedreste cose a cui non siete abituati. Gli aerei, cari lettori, non volano solo nei cieli, ma spiccano il volo in modo mooolto realistico anche sugli schermi dei nostri PC. Vedere per credere. Se prenderete la decisione giusta, ci vediamo là!

Sito ufficiale manifestazione : http://www.museoaeronautica.it/

Post di mio fratello, utile : http://blogs.ugidotnet.org/odamiani/archive/2007/11/21/89855.aspx

Technorati Tags:  

Send to Kindle
Software

Fix sul VivendoByte Emoticon plug-in

Ieri un utente ha provato a scaricare il mio plug-in in WPF per inserire emoticon all’interno di Windows Live Writer. Purtroppo ha riscontrato un problema: colpa mia, perchè evidentemente dalla migrazione da VS2005 a VS2008 del progetto tutti i files contenuti nel folder Emoticons del progetto non erano più marcati come Embedded Resources, e quindi le immagini non venivano copiate dentro il folder…

C:Documents and SettingsAll UsersDati applicazioniVivendoByte Emoticons

Ho fixato questo problema, dopo averlo documentato con un WorkItem su CodePlex e dopo aver fatto un bel check-in delle modifiche apportate alla soluzione.

Download : VivendoByte Windows Live Writer Emoticons Plugin

Non posso che ringraziare un certo dovella (o una certa dovella) per avermi fatto notare questa cosa.

Technorati Tags:  

Send to Kindle