Distributori in autogrill
Ditemi quello che volete, ma è la prima volta che vedo nei servizi un distributore di stuzzicadenti/spazzolino da denti/dentifricio.
Ditemi quello che volete, ma è la prima volta che vedo nei servizi un distributore di stuzzicadenti/spazzolino da denti/dentifricio.
Bienno è un piccolo comune con 5.000 abitanti nella Valcamonica, in provincia di Brescia. Come recitano diversi cartelli sparsi per il paese, è uno dei borghi più belli d’Italia. Ci sono stato oggi pomeriggio. L’obiettivo principale era Cividate Camuno, un paese a due passi da Bienno dove c’erano da visitare alcune antiche rovine romane.
Ci sono tre cose che mi hanno colpito di Bienno: i mattoni in vista di mura, pareti ed archi. L’acqua che scorre probabilmente sotto le vie del paese e che raggiunge 23 fontane disposte un po’ dappertutto. L’assoluta irreperibilità di posti dove mangiare: se doveste capitarci anche voi, non cercate troppo in giro. L’unico posto aperto la domenica è l’ Hostaria Vecchia Fontana. Io purtroppo ho trovato il ristorante solo dopo aver mangiato qualcosa da un’altra parte, ma sembra il classico posto dove si mangia alla grande. Ho una buona scusa per ritornarci un’altra volta.
Ho ovviamente fatto qualche fotografia. Alcune sono qui sotto, le altre sono in questo photoset di Flickr.
La fotografia qui sopra riprende una normale villetta come tante. Le pareti esterne sono completamente ricoperte di antichi strumenti per fare di tutto: lavorare il ferro, ferri da stiro, padelle, campane, ruote, etc. etc.
Le altre fotografie sono raggiungibili qui. Buona visione!
Technorati Tags: italy brescia valcamonica bienno
Windows Presentation Foundation soffre a mio avviso di una grave lacuna: nello XAML non è possibile creare animazioni (e relative storyboard) in grado di mandare in play files .wav o .mp3 in determinati momenti. Se questo assunto è sbagliato fermate la lettura di questo post, scorrete fino in fondo e lasciatemi un commento.
Introduzione
Supponiamo di avere una finestra (Window) grande 640×480. Supponiamo di avere una palla colorata in alto a sinistra e supponiamo di creare un’animazione che faccia spostare questa palla verso il basso, fino a quando essa non “rimbalza” contro il bordo inferiore della finestra tornando alla sua posizione originaria…e così via…all’infinito. Possiamo mandare in play il file boeing.wav nel momento in cui la nostra palla rimbalza? Se vogliamo fare in modo dichiarativo nello XAML, la risposta è no. Se invece siamo disposti a scrivere codice, la risposta è sì. Siccome siamo sviluppatori, prendiamo questa seconda strada e vediamo come fare.
In questo momento non ho un progetto demo pronto per essere uploadato se volete dargli un’occhiata. Se a qualcuno di voi dovesse servire, fatemelo sapere con un commento e provvederò.
Andiamo al dunque (un po’ troppo velocemente)
Spiegare da zero in solo post come usare Blend per creare una Window, come posizionare i Panel che si servono, come posizionare i controlli e come creare un’animazione è davvero troppo. Perciò supponiamo di averlo fatto.
La prima cosa da capire è che se vogliamo in qualche modo gestire una storyboard da codice, non possiamo farla partire tramite un trigger di sistema. Ad esempio, quando creiamo un’animazione con Blend, questi ci mette automaticamente un trigger sull’evento Window.Loaded per far partire la storyboard che abbiamo disegnato e che fa spostare la palla (sembra più un CD!) verso il basso. Cancelliamo dallo XAML questo trigger e mettiamo un pulsante che fa partire manualmente la storyboard. Il codice C# è molto semplice:
public Window1() { this.InitializeComponent(); // Insert code required on object creation below this point. story = (Storyboard)this.FindResource("FallCd"); }
Nel costruttore della form otteniamo l’istanza della Storyboard chiamata “FallCd”. L’oggetto story che si vede qui sopra è dichiarato privato della Window. L’evento Click del Button è questo:
private void StartAnimation_Click(object sender, RoutedEventArgs e) { story.Begin(this.cd, true); }
A questo punto possiamo fare una cosa molto semplice. Possiamo sottoscriverci nello XAML all’evento CurrentTimeInvalited dello Storyboard:
<Storyboard x:Key="FallCd" CurrentTimeInvalidated="Storyboard_CurrentTimeInvalidated"> ... ... </Storyboard>
In questo modo siamo notificati ad ogni step di avanzamento del Clock che regola l’animazione stessa. Ad esempio…supponiamo di visualizzare nel Title della Window il tempo che passa:
private void Storyboard_CurrentTimeInvalidated(object sender, EventArgs e) { TimeSpan span = story.GetCurrentTime(this.cd).GetValueOrDefault(); this.Title = span.ToString(); }
Ottengo il TimeSpan dalla storyboard e semplicemente la visualizzo. Da qui a fare il play di un file .mp3 al momento opportuno passa davvero poco:
private void Storyboard_CurrentTimeInvalidated(object sender, EventArgs e) { if (span.Seconds == 1) { player.Play(); } }
player è un’istanza della classe SoundPlayer già istanziata e caricata con un file .wav nel costruttore della form. Il codice qui sopra manda il play il file non appena siamo ad un secondo dall’inizio dell’animazione? Sì, ma c’è un grandissimo problema. Le animazioni in WPF sono regolate con un clock molto preciso. Un secondo è diviso in 1.000 millisecondi, per cui quel metodo Play() viene chiamato in realtà un’infinità di volte. La cosa è semplicemente risolvibile con una variabile booleana, in modo tale che entriamo nell’if soltanto una volta. Quindi:
private void Storyboard_CurrentTimeInvalidated(object sender, EventArgs e) { if (span.Seconds == 1 && !playing) { playing = true; player.Play(); } }
La variabile playing è dichiarata come privata dalla Window e all’inizio vale false.
L’ultimo dubbio è: ma è proprio vero che viene usato un thread secondario???
La classe SoundPlayer espone due metodi che fanno il play del file audio precedentemente caricato. Il metodo Play() ed il metodo PlaySync(). Che differenza c’è fra i due? Ve lo riporto direttamente da come lo dice MSDN.
Metodo Play
Plays the .wav file using a new thread, and loads the .wav file first if it has not been loaded.
Metodo PlaySync
Plays the .wav file using the user interface (UI) thread, and loads the .wav file first if it has not been loaded.
Noi abbiamo usato Play, per cui mi aspettavo di non avere problemi sull’animazione, cosa che invece non avviene. Quando siamo ad un secondo dall’inizio dell’animazione, il SoundPlayer parte, ma l’animazione subisce un rallentamento, uno scatto. E’ proprio vero che viene istanziato un thread per fare quel play? Supponiamo di voler creare noi il nostro thread da lanciare quando è il momento opportuno.
Creiamo un metodo privato chiamato sparo() che non fa altro che fare il play del file:
void sparo() { player.Play(); }
Dichiariamo un’istanza di Thread come privato della Window e definiamolo nel costruttore:
soundThread = new Thread(new ThreadStart(sparo)); soundThread.Priority = ThreadPriority.Highest; soundThread.IsBackground = true;
A questo punto è sufficiente chiamare soundThread.Start() per mandare in play il file:
private void Storyboard_CurrentTimeInvalidated(object sender, EventArgs e) { if (span.Seconds == 1 && !playing) { playing = true; soundThread.Start(); } }
Il Play del SoundPlayer viene invocato con il nostro thread, pronto per l’esecuzione e questa volta la nostra animazione rimane fluida e veloce anche quando si sente lo sparo! Evviva!
Sincronizzare un evento con il play del file
Chiudo questo post domenicale mattutino con una piccola osservazione. Nel mio test ho usato semplicemente il tempo – fare il play in un determinato momento temporale – ma nulla vieta di inserire nell’evento CurrentTimeInvalited tutti i controlli del caso, quindi…magari accorgersi quando la palla si sta allontanando dal bordo invece che avvicinarsi e così via.
Buona domenica a tutti!!!
Questa settimana è stata annunciata l’uscita del Service Pack 1 per Windows Vista Italiano. Quello Inglese era già disponibile da un po’. L’ho scaricato oggi pomeriggio dal Download Center di Microsoft. Il download è di 544,3Mb, mentre mi dicono che da Windows Update il download pesa circa 66Mb.
Io personalmente ho avuto un piccolo problema, perchè avevo già installato il SP1 in versione Release Candidate e quindi non ho potuto installare il SP1 definitivo senza prima disinstallare quello vecchio.
Il problema era: come procedere con la disinstallazione? Il SP1 RC non compare nell’elenco dei programmi da disinstallare. Compare invece nella Cronologia degli Aggiornamenti, ma non ha un nome “in chiaro” che lo identifica bene. Ho googlato un po’: il SP1 di Vista è identificato dalla sigla KB936330: basta disinstallare l’aggiornamento con questa sigla (ci mette un po’!), riavviate il PC e vi ritroverete Vista senza alcun Service Pack installato. A quel punto potete installare senza problema il Service Pack senza problemi (ci mette un po’!).
Il mio PC lo sta ancora installando, motivo per il quale sto scrivendo questo post con le dita incrociate. Vi farò sapere come va a finire.
Technorati Tags: service pack Windows Vista
indossavo questa roba. Praticamente, un Igor in versione metallaro.
La pulizia di questi giorni ha portato alla luce molti oggetti di molti Igor Damiani fa. Ho trovato sotto i mobili monetine da 20 lire e da 50 lire. Ho trovato un biglietto di carta ingiallito con la mia calligrafia dell’epoca. Mi sono liberato della maggior parte di questi oggetti – compreso il bracciale borchiato qui sopra. E la discarica del mio paese sta per ricevere un cumulo enorme di carta e di libri da riciclare.
La settimana che si sta chiudendo è stata stancante e stressante sopra la media. Lo si può vedere dal numero di post su questo blog, che è stato molto più basso rispetto al solito. Lo avreste potuto vedere anche dalla mia faccia all’uscita dal lavoro, se ci foste stati. Ma non c’eravate: meglio così.
Ma non è solo a causa del lavoro che sono un pochino stanco. In realtà, i miei hanno deciso di ritenteggiare tutte le pareti di casa nostra. Come potete ben immaginare, un’operazione di questo tipo richiede un po’ di impegno e di lavoro preliminare: smontare mobili e scrivanie, spostare letti, togliere soprammobili, etc. etc.
Neppure la mia scrivania è stata ovviamente risparmiata.
Prima |
Dopo |
Sulla sinistra potete vedere la mia scrivania com’è di solito (in realtà la foto è di qualche mese fa, quando avevo ancora il Samsung CRT 19″). Sulla destra potete vedere come appariva – mi pare – mercoledì sera. Potete farvi un’idea della quantità di cavi, cavetti, alimentatori, ammennicoli vari, gadget UGIdotNET che ho dovuto rimuovere e mettere da parte prima di essere rimesse al loro giusto posto.
Ora è tutto a posto, per fortuna.
Mio fratello ha aprofittato di un’offerta della Next e si è preso una combinata mainboard Gigabyte + CPU Intel Core2 Quad Q6700 a 2,66Mhz + 2Mb di RAM a 800Mhz. Ho visto girare Flight Simulator X a 100 frames per secondo. Io sopravvivo con AMD 3500+ e mi trovo benissimo. A parte Colin McRae Rally DIRT che onestamente penso sia programmato da schifo per girare a 5fps quando ci sono più di due macchine sullo schermo. Non cambio il PC per un videogame.
Ciò nonostante, vedendo certi prezzi credo che stia arrivando l’ora di un quad-core.
Non oggi, nemmeno domani. Forse nemmeno il mese prossimo.
Ma…chissà…dopo l’estate. Vedremo.
Technorati Tags: Hardware cpu quad
L’applicazione che ho sviluppato gira su un palmare con Pocket PC 2003. Venerdì pomeriggio la società fornitrice ci ha consegnato un nuovo modello, su cui invece gira Windows Mobile 5.0. Abbiamo già provato ad installare il nostro prodotto utilizzando il CAB di installazione: inutile dire che tutto è filato liscio senza problemi.
Fino ad adesso non abbiamo avuto un grosso bisogno di sfruttare la componente telefonica del palmare, cosa che invece dovremo fare in futuro. La nostra applicazione dovrà connettersi ad Internet via GPRS per scaricare e ricevere ordini da lavorare, dovrà magari in futuro utilizzare il GPS interno per comunicare la posizione, etc. Probabilmente tutto questo sarebbe molto difficile con un vecchio PPC2003, perchè le API di questo sistema operativo arrivano fino ad un certo punto. Già adesso per abilitare e disabilitare il flight mode abbiamo dovuto scrivere alcuni metodi un po’ a basso livello. Credo proprio che con Windows Mobile 5.0 le cose siano un po’ più semplici.
Ma siccome se ce la faccio mi piace essere in anticipo sui tempi, stasera mi sono installato sul portatile il Windows Mobile 6.0 SDK che per caso ho trovato in giro in camera mia.
Technorati Tags: SDK Windows Mobile
La signora dall’occhio rosso.
La signora dall’occhio rosso è una donna che vedo tutte le mattine alla fermata M2 di Romolo, nei corridoi sotterranei che dall’uscita della metropolitana portano alle banchine per prendere i filobus delle linee 90/91. La signora dall’occhio rosso è una senzatetto, una povera di strada, senza fissa dimora. Non so quanti anni abbia: potrebbe averne intorno ai 50, ma sembra dimostrarne di più. Ha l’occhio destro un po’ gonfio, un po’ rosso…forse è il freddo, forse è qualche infiammazione che non riesce a curare. E’ per questo che io la chiamo così. Chissà qual’è il suo vero nome, da dove arriva e qual’è la sua storia.
Siede sulla plastica, su un giornale, avvolta tutti i giorni nella stessa giacca a vento, sempre in attesa che qualcuno le doni qualche monetina, che lei raccoglie in un piccolo sacchetto di carta. Qualcuno come me che, quando ha monete da 20 o 50 centesimi, uno o due euro, gliele dà volentieri per fare un piccolo gesto che per me è insignificante, mentre per lei può fare la differenza tra mangiare e non mangiare.
Le tiene sempre gli occhi bassi, non guarda quasi mai il volto delle persone che le sfrecciano accanto e che vanno e tornano indaffarate verso il lavoro. Li alza leggermente solo quando ottiene una moneta in più, e a volte sorride, e a volte addirittura accenna un grazie ciao sottovoce.
Ultimamente quando la incrocio sorride un po’ di più, e la voce si è fatta più sicura.
Credo che la signora dall’occhio rosso abbia qualche problema.
L’altra mattina, mentre passavo accanto a lei con il mio zaino sulle spalle, è accaduto qualcosa di diverso. Si è alzata in piedi e mi ha chiesto un favore. Si è messa a chiaccherare e alla fine mi ha detto di aver bisogno di 300 euro perchè deve pagare casa sua.
Non so voi, ma non mi capita tanto spesso di usare Paint.NET per elaborare le immagini, perchè non faccio un lavoro che mi fa lavorare con JPG o roba simile. Nel tempo libero sto scrivendo qualcosa di più divertente con WPF, e qui la componente grafica è un po’ più pesante.
Se aprite una qualsiasi immagine con Paint.NET, potete andare sotto il menù Image e selezionare una delle voci: Rotate 90° Clockwise, Rotate 90° Counter-Clockwise e Rotate 180° per ruotare l’immagine a blocchi di 90 gradi.
Dove dovete andare se volete ruotare l’immagine in modo più preciso?
Risposta: andate sotto il menù Layer e cliccate sulla voce Rotate/Zoom, che invece è un po’ più raffinata, perchè da qui potete ruotare l’immagine, farne il pan, applicare uno zoom, etc. etc. sia in modo visuale sia editando a mano i valori.