Set 11 / Igor Damiani

Modena, 5 giorni, corso su WPF e MVVM

Da domani parte una nuova settimana, e si torna a fare corsi targati Overnet Education dopo la pausa delle ferie estive. Ho tanta voglia, per tre motivi:

  • Mi piace tantissimo fare corsi
  • Mi piace ovviamente l’argomento, perchè tutto ciò che è XAML-based è un po’ casa mia
  • Mi piace l’Emilia-Romagna
  • Conosco il cliente, perchè ci sono già stato già negli anni scorsi, ed oggi ha espressamente richiesto ancora la mia presenza. I partecipanti saranno diversi rispetto alle volte precedenti, per cui sarà ancora più divertente e stimolante

Trolley quasi pronto, hotel prenotato, si parte domani mattina presto per raggiungere il cliente e procedere alla prima giornata di corso. E’ entusiasmante incontrare ogni volta nuove persone a cui cercare di trasmettere nozioni nuove, unendo teoria & pratica, tanta tanta passione che credo sia il vero valore aggiunto. Spesso infatti ho declinato – se possibile – corsi, quando non conosco a sufficienza la materia: se non si ha abbastanza esperienza, si vede lontano un miglio che si sta solo recitando una parte. No, molto meglio affrontare argomenti conosciuti, perchè il cliente reagisce positivamente quando nota che chi sta parlando ha una certa marcia in più.

Non sempre è possibile, ovviamente. Ed allora si passano i weekend a studiare.
Ma questa è un’altra storia.

Send to Kindle
Ago 30 / Igor Damiani

Webete, che parola geniale. Grazie Enrico!

Oggi ritorno dalle mie ferie estive per scoprire che Enrico Mentana – noto giornalista – conia un vocabolo fantastico, “webete”, nato durante una delle sue discussioni su Facebook e che unisce il significato di web e di ebete. E’ una naturale evoluzione di “utonto”? Forse! Eppure per me webete ha un significato un po’ più profondo. L’utonto è quello che tecnicamente non sa fare qualcosa davanti ad un particolare dispositivo elettronico, che ti fa mille domande sciocche perchè va in panico, mentre il webete è perfettamente in grado di scrivere, pigiare bottoni, selezionare una voce da un elenco, ma causa più che altro danni a sè ed alla società.

Purtroppo, Facebook ne è pieno. Se non fosse per lavoro, e se non fosse per tante persone fortunatamente intelligenti fra i miei contatti che lo popolano, avrei abbandonato Facebook da un bel pezzo. A seguito di un qualsiasi fatto di cronaca (terremoto, attentato terroristico, volo aereo non andato a buon fine, treno deragliato, partita di calcio persa o vinta, alluvione, caso di malasanità, nuova legge, etc.), la bacheca di Facebook si riempie di scemenze colossali, di gente esperta che sa tutto. Facebook è pieno di gente che si spaccia per politici, allenatori, geologi, esperti di terrorismo internazionale, giornalisti, registi televisivi, e chi ne più ne metta. Parlo di Facebook, ma credo che questo ragionamento possa essere applicato tranquillamente ad altri social meno conosciuti.

Ne ho le scatole piene delle bufale. Voglio che tutti abbiano la possibilità di parlare, ma non voglio che idee malsane raggiungano un certo grado di visibilità. Non voglio che si diffonda la notizia che i vaccini facciano male ai bambini, oppure che i terremoti possono essere previsti guardando la conformazione delle nuvole in cielo, oppure che il canone rai da 100 euro fosse iva esclusa (quando in realtà è esente iva), non voglio. Nessuno dovrebbe volerlo.

Mi è stato fatto notare che posso combattere questo fenomeno delle bufale semplicemente rimuovendo dagli amici determinati soggetti. Sbagliato, non è lo strumento giusto. Non voglio rimuovere dagli amici un contatto semplicemente perchè scrive scemenze. E’ il post da eliminare e condannare, non l’intera persona. Credo che sia molto più utile un sistema basato sulle ricompense, che sarebbe tra l’altro lo stesso meccanismo dei giochi e dei videgiochi, o addirittura una metafora della stessa vita. Quando nasciamo, le possibilità che abbiamo a disposizione sono pochissime, non possiamo neppure uscire di casa senza il permesso dei nostri genitori. Man mano che cresciamo, e studiamo, e maturiamo, le nostre possibilità crescono: andiamo a scuola, poi entriamo nel mondo del lavoro, acquistiamo un’automobile o una casa, ci sposiamo, etc. etc. Tornando con i piedi per terra, e tornando al mondo digitale, suggerisco:

  • Un utente appena iscritto a Facebook dovrebbe poter postare un solo contenuto al mese, sulla falsa riga di ciò che fa YouTube con i video
  • Un utente dovrebbe poter segnalare un certo contenuto (quello che ho in testa è una lieve sfumatura di ciò che è possibile adesso)

Il mondo d’altronde è pieno di regole, perchè non dovrebbero esserlo anche i social? Qualsiasi aspetto della società è governato da regole, perchè non dovrebbero esserlo anche i social? Guidare, andare a scuola, lavorare, acquistare un qualsiasi bene, fare la spesa, fare la fila alle Poste. Ci sono regole dappertutto. Perchè Facebook – ed i social – sono l’unico posto in cui uno può liberamente postare testi, foto, video, bufale, senza alcuna penitenza? Qualsiasi strumento, dal sasso alla bomba nucleare, nelle mani dell’uomo diventa una potenziale minaccia. Servono regole, come è sempre stato.

Non sono completamente d’accordo su quello che mi hanno detto in tanti, cioè che non va rifatto Facebook, ma il cervello delle persone. E’ sicuramente la soluzione migliore, ma non è fattibile. Inoltre, è giustissimo che nascano e ci siano teorie più o meno strampalate su tutto lo scibile umano; vorrei solo che l’idea strampalata nascesse nel giusto contesto, crescesse nella direzione giusta, che venga stroncata nel piccolo se non è buona, ma che fiorisca come una rosa se l’idea è ottima. Oltre a tutto questo, non è assolutamente fattibile educare miliardi di cervelli allo stesso modo: è giusto che ci siano geni come Einstein, gente intelligente, gente mediocre, gente brava a fare una cosa piuttosto che l’altra, gente stupida, gente frivola, gente credulona, etc. etc. E’ il naturale stato delle cose, da quando esiste l’uomo su questo pianeta. Tutti devono parlare, tutti devono esprimere la propria idea, ma c’è un limite imposto dal buon senso, dall’educazione, dalla scienza, dalla religione.

E, per favore, non offendete la mia intelligenza se mi dite “gli ignoranti ci sono sempre stati, è sufficiente evitarli”, facendo confronti imbarazzanti con situazioni del mondo reale come il bar o le piazze dei nostri paesi. Perchè mi offendete e basta. Innanzitutto, per sentire una scemenza al bar occorre essere nello stesso posto e nello stesso momento insieme all’idiota di turno. E non è cosa da poco, credetemi. Nel momento in cui scrivo, nei bar di tutto il mondo vengono sparate una quantità colossale di sciocchezze, ma nessuno le sente, perchè non possiamo essere contemporaneamente ovunque. Il mondo reale, fortunatamente, ha dei limiti fisici che ci aiutano. Non è così per i social. Qualsiasi cosa scritta perdura nel tempo, infettando il web anche a ore e giorni di distanza. Follia. L’idea più sciocca viene scritta, raggiunge centinaia di persone, senza alcun filtro, viene condivisa da altri, a volte raggiunge la massa critica, in pochi minuti si potrebbe diffondere qualsiasi idea malsana, dal finto attentato alla morte fasulla di qualsiasi personaggio noto dalla TV o dal cinema. Siamo sinceri: qualcosa non va.

Ritengo, infine, che sia nell’interesse di Facebook gestire tutte queste problematiche. Non credo che sia nei piani di Facebook quello di riempirsi di spazzatura, no?

Send to Kindle
Lug 22 / Igor Damiani

Microsoft REST API Guidelines

Lo scorso 8 Luglio ho partecipato ad una giornata interamente dedicata ad ASP.NET Core 1.0, evento organizzato da Overnet Education, e portato a termine da Gabriele Gaggi ed Ugo Lattanzi. In quel frangente ovviamente si parlava di web, controller, web api, e via dicendo. Ricordo che Ugo ad un certo punto disse una cosa simile alla seguente: “secondo la convenzione, quando si invoca un metodo REST che aggiunge un oggetto al nostro repository, la response deve includere almeno due informazioni: l’ID dell’elemento appena aggiunto e l’URL al quale si possono reperire i dettagli dell’elemento stesso”. Scusate l’imprecisione, ma il web non è propriamente il mio campo. Ricordo di aver trovato interessante quell’affermazione di Ugo, al punto che lo interruppi chiedendogli…ma dove posso trovare queste regole, convenzioni, buone norme di implementazione di API di tipo REST?

Beh, oggi la risposta ce l’ho.

Su GitHub Microsoft ha pubblicato un repository denominato “Microsoft REST API Guidelines” ricco di documentazione, allo scopo di fornire a tutti gli sviluppatori le migliori guideline per l’implementazione di API REST. Tra gli autori figura un certo Mark Russinovich. Troverete informazioni su un po’ tutto: gestione degli errori, struttura degli URL, serializzazione in JSON, gestione corretta del versioning delle API, e molto altro ancora.

image

Sono piuttosto certo che troverete la lettura molto interessante!

Send to Kindle
Lug 19 / Igor Damiani

Ottenere le Api Key per i Cognitive Services

I Cognitive Services sono un servizio relativamente nuovo che Microsoft ha reso disponibile. Grazie a questi servizi abbiamo a disposizione tutta una serie di API che ci permettono di effettuare riconoscimenti di immagini, emozioni, volti, testi, voci, riconoscimento degli speaker in un file audio, ed altro ancora. Trovate maggiori informazioni sul sito ufficiale.

Come sempre, per accedere a queste API è necessario registrarsi sul sito ed ottenere le Api Key da includere poi nelle chiamate REST. Nulla di particolarmente complicato.

Attenzione ad un particolare, però. Se un determinato servizio si appoggia su Azure, le Api Key non saranno quelle visibili sul portale dei Cognitive Services, ma saranno quelle visibili sul portale Azure. Mi spiego meglio. Se vado sul sito https://www.microsoft.com/cognitive-services/en-US/subscriptions e do un’occhiata al mio account, vedo la situazione seguente:

image

Sto facendo esperimenti con il servizio Speaker Recognition, che in forma gratuita prevede 10.000 transazioni al mese, 20 al minuto. Ho mantenuto nascoste le Api Key per privacy, ma anche facendole vedere sarebbe stato inutile, perchè queste API si appoggiano su Azure, e quindi le Api Key giuste vanno prelevate dal portale Azure. Notare infatti la presenza del bottone Buy On Azure proprio lì accanto. Cliccando su quel link viene aperto il marketplace su Azure che permette di completare l’acquisto del servizio vero e proprio. Ed è da Azure che dovrete copiare & incollare le Api Key corrette da utilizzare all’interno del proprio codice.

image

Notare che a me il servizio Cognitive Services risulta già attivo, nella sua forma FREE. Nel momento in cui vi scrivo, tale servizio è esposto solo dal data-center in West US. Una volta che avete attivato il servizio, esso sarà raggiungibile come tutte le altre risorse allocate sul cloud, e quindi da lì banalmente potete ottenere le Api Key corrette.

image

Send to Kindle
Lug 4 / Igor Damiani

Esame 70-355 passato!

Questa mattina ho sostenuto l’esame 70-355 “Universal Windows Platform – App Data, Services, and Coding Patterns”, e l’ho pure passato con un punteggio di 830. Studiando nell’ultimo mese poco e male, per giunta. Evidentemente le esperienze lavorative, ed il fatto di scrivere app Windows 10 a tempo perso aiutano, e non poco.

E’ facile? E’ difficile?

Come è facile intuire, dipende molto dal vostro background di sviluppatori software. Nonostante dal titolo dell’esame sembra che i contenuti siano direttamente connessi al mondo client UWP, purtroppo non è così. Vi verranno chiesti concetti riguardanti Azure, autenticazione, Mobile Services, MongoDB, sicurezza, crittografia, GAC, schema XML del web.config, pattern architetturali (il Factory, per esempio) e molto altro ancora. Quindi, se siete esclusivamente sviluppatori lato client (e quindi conoscete bene la piattaforma UWP, XAML e C# lato client), sarà tosto. Se come me ogni tanto siete “one-man-band”, e quindi ogni tanto litigate con ApiController, Authorize, JSON, AuthenticationContext, AccessToken ed affini, allora siete un po’ più fortunati e ve la caverete meglio. Il concetto generale è: sbattetevi davvero tanto. Io mi sono considerato fortunato perchè comunque sia ho sviluppato tantissime app Windows Phone, Windows 8/8.1 ed oggi Windows 10, tirando in ballo WCF, Web Api ed Azure, e quindi l’esperienza si fa sentire. Ma siete un po’ a digiuno, studiate e datevi da fare.

Per chiudere: ho trovato utilissimo questo post di Alex Drenea, che io stesso ho utilizzato per studiare. Elenca in modo esemplare tutti gli argomenti toccati dall’esame, con tutti i link da seguire per ciascun argomento. Leggetelo, seguitelo e raggiungerete l’obiettivo.

Send to Kindle
Giu 20 / Igor Damiani

8 Luglio, Focus Day su .NET Core 1.0

Il prossimo 8 Luglio Overnet Education organizza un Focus Day dedicato a tutti gli sviluppatori Web che desiderano rimanere al passo con ciò che Microsoft offre su questo fronte. La giornata sarà infatti dedicata a ASP.NET Core 1.0, la nuova versione di ASP.NET con tantissime novità in arrivo.

L’evento non è gratuito, ma la spesa è assolutamente alla portata di tutti, soprattutto se siete sviluppatori ed intendete sfruttare sin da subito le ultime novità nel campo dello sviluppo Web secondo Microsoft. Gli speaker saranno il mio capo Gabriele Gaggi ed Ugo Lattanzi, noto MVP Microsoft. Per tutti questi motivi, e per altri ancora, non potete mancare.

Registratevi oggi e non perdete l’appuntamento!!

Trovate maggiori informazioni a questa pagina.

Send to Kindle
Giu 15 / Igor Damiani

Amerò sempre l’Italia

L’Italia è il paese in cui sono nato, in cui voglio vivere, ed è il paese che amerò sempre.

Se gli scontri fra tifosi ad Euro 2016 fossero avvenuti da noi, tanti italiani avrebbero gridato allo scandalo, paventando come da noi le Forze dell’Ordine sono senza soldi, senza risorse, sono dei dilettanti allo sbaraglio.

Stessa cosa se gli attentati terroristici di Parigi o Bruxelles fossero avvenuti da noi. In realtà, i nostri servizi segreti sono più che addestrati per affrontare scenari di questo tipo. Mafia di varia natura & terrorismi di diverse matrici, che abbiamo combattuto ed in parte sconfitto, lo dimostrano.

Idem con le alluvioni delle scorse settimane, a Parigi ed in altre zone della Francia. Da noi avrebbero gridato (ed in realtà è successo) che le nostre amministrazioni comunali lavorano allo sbaraglio, non curandosi dello stato idrogeologico del territorio, eccetera eccetera.

Idem quando sento dire che altre nazioni hanno connessioni Internet più veloci della nostra. Persone che giustamente prendono un aereo da Malpensa, atterrano nella capitale dell’est europeo e si ritrovano con una connessione molto più veloce della nostra. Ma dubito seriamente che tutti gli USA abbiano una cablatura in fibra. Idem per la Romania, la Cecoslovacchia, la Polonia, e via dicendo.

Ci sono paesi nel nord Europa molto più efficienti di noi. Uao, che novità. Sono paesi come l’Islanda che ha poco più di 300.000 abitanti; o come la Danimarca che di abitanti ne ha 5.707.251 (a gennaio 2016); o come la Norvegia che ne totalizza 5.142.000. E nelle valutazioni di un paese, della sua economia, del suo modello del mondo del lavoro, non si può non tenere conto di questo. Finitela, per favore, con le frasi fatte. Grazie.

Tanti italiani denigrano costantemente il nostro Paese, e francamente ne ho piene le palle.

Ho appena consumato il mio bonus annuale per la parolaccia dell’anno. Ne è valsa la pena.

Lo ripeto. L’Italia è il paese in cui sono nato, in cui voglio vivere, ed è il paese che amerò sempre.

Cari italiani, certi fatti quando accadono, semplicemente accadono. E’ vero, possiamo tentare di prevederli, gestirli, combatterli nel migliore dei modi. Ma vi svelerò un segreto: non esiste un paese migliore degli altri in senso assoluto. Ogni paese ha i suoi pro ed i suoi contro. Ho visto la polizia francese tentare di tenere a bada gli hooligans. Ho visto macchine “parcheggiate” in verticale causa alluvioni, in Italia ed all’estero. Ho visto nei TG sparatorie, esplosioni, bombe, come credo tutti voi: sono fatti recentemente accaduti all’estero. Sono accaduti anche da noi, ovviamente, nei mesi e negli anni scorsi. Significa semplicemente che accadono. Dobbiamo fare il possibile per prevenire, combattere, migliorare lo stato delle cose, ma allo stato attuale accadono.

L’Italia è un paese unico e spettacolare. E’ un paese unico per la sua gente dai mille dialetti ed inflessioni diverse, per la sua gastronomia varia e salutare. Ci sono italiani più abituati a vedere il mare, ed altri vedono più la montagna. Chi ha a che fare con l’acqua salata, e chi con l’acqua dolce. Chi va al lavoro in bicicletta, e chi invece prende l’auto o il treno. C’è chi vede la nebbia, e c’è chi vede il sole splendere. C’è chi cena alle 19:30, e c’è chi cena alle 22. Siamo diversi, siamo belli, siamo forti. Ne ho piene le scatole di chi non la pensa così.

La verità è che noi italiani dobbiamo quasi per definizione piangerci sempre addosso. Chi sta dall’altra parte del mondo non vede l’ora di prendere un aereo per venire a vedere il nostro paese. E molte persone, poche o tante che siano, si fermano pure a vivere qui. Pensate un po’.
Le nostre donne d’altronde sono le più belle del mondo. Gli uomini…non so!

L’Italia è un paese dalle mille opportunità come tutti gli altri, e chi vi dice che non è così, semplicemente è gente perdente, che vuole e vede solo il bicchiere mezzo vuoto, e non vuole sbattersi più di tanto. Può essere un periodo (molto lungo) un po’ in sofferenza, per la nostra nazione (c’è qualcuno disposto a dire di no, per caso?), ma non è una scusante, onestamente. E’ ovvio: al Sud c’è meno lavoro rispetto al Nord. Lo dicono tutti ed io stesso lo percepisco in prima persona. Ma sono ragionevolmente convinto che anche in altre nazioni si presenta uno scenario simile al nostro Sud Italia (per altri motivi, problemi, cause, effetti). Non c’è alcun buon motivo per bastenare l’Italia, sempre e comunque. Scusate, voi da che parte state?

Non ho piene le scatole di gente che mi fa alzare la pressione con i post su Facebook costantemente irritanti.

Così la penso io. Scusate lo sfogo.
Amen.

Send to Kindle
Giu 9 / Igor Damiani

Windows Insider procede a spron battuto, e sono molto soddisfatto

Prima che uscisse Windows 10 RTM, il 29 Luglio scorso, ero piuttosto scettico, perchè l’esperienza d’uso che avevo del sistema operativo era piuttosto preoccupante. Lento, pulsante Start un po’ troppo spesso KO, impossibilità di accedere alla rete LAN, etc. etc. Beh, Microsoft onestamente mi ha fatto proprio ricredere. Da quel 20 Luglio, Microsoft ha fatto le cose per bene. Windows 10 ha tutto ciò di cui ho bisogno: è affidabile, non richiede il tradizionale formattone ogni X mesi per avere sempre un sistema stabile, ha Cortana che adoro, ha lo Store, è veloce, è compatibile con tutti i software che usavo, sia per lavoro, che per hobby, che per gioco. Insomma, se siete utenti consumer non c’è alcun buon motivo per rimanere legati a sistemi operativi più vecchi.

Detto questo, anche Windows Insider mi soddisfa molto. Ogni poche settimane ho una nuova build di Windows 10, con nuove feature, tanti fix e tante correzioni che migliorano parecchio le cose. Vi dirò: ho un desktop ed un ultrabook. Sul primo ho disattivato Windows Insider perchè voglio evitare beta e voglio un PC che so che funziona sempre; sull’ultrabook – che uso prevalentemente per corsi ed altre attività meno importanti – ho attivato Windows Insider per avere sempre le build rilasciate nel Fast Ring. A volte gli avanzamenti del Fast Ring sono tali che quando poi ritorno sul desktop, la differenza si fa davvero sentire, e sembra quasi di aver a che fare con un Windows 10 un po’ più vecchiotto, cosa che in effetti è parzialmente vera. Ovviamente Microsoft mette in guardia ed avvisa che le build rilasciate con il programma Windows Insider hanno bug, problemi, per cui evitiamo di usarli su PC per noi importanti e vitali per il nostro lavoro quotidiano. Avvisi che puntualmente ignoro, ovviamente.

L’ultimo rilascio del programma Windows Insider è la Build 14361.
Trovate maggiori informazioni qui.

Send to Kindle
Giu 6 / Igor Damiani

[UWP] Concetti importanti delle AppService

Un’app service è quel meccanismo di UWP che permette ad un’app di invocarne un’altra, di potergli passare determinati valori, per ottenere un risultato di qualche tipo. C’è quindi un legame tra “app client” ed “app service”, anche se tecnicamente si tratta di due app UWP che risiedono sullo stesso PC. Per poter dialogare, l’app client deve conoscere un po’ di informazioni:

  • L’AppServiceName
  • Il PackageFamilyName
  • Di quali informazioni l’AppService necessita per poter svolgere il suo lavoro. Tra app client ed app service viaggia un’istanza di ValueSet, che può essere tranquillamente visto come un Dictionary<string, object>.

L’AppService deve essere implementato tramite un BackgroundTask, il quale però non ha bisogno di essere registrato come accadrebbe con un BackgroundTask tradizionale. Quindi, per riassumere:

  • Abbiamo un’app UWP contenuta in una solution (l’AppService deve comunque sia essere hostato all’interno di un’app UWP tradizionale)
  • All’interno di questa solution aggiungiamo un progetto di tipo “Windows Runtime Component”
  • All’interno di questo progetto aggiungiamo una classe che implementa l’interfaccia IBackgroundTask, esattamente come un normalissimo BackgroundTask

Nel metodo Run previsto dall’interfaccia IBackgroundTask dobbiamo fare quanto segue:

  • Dall’istanza IBackgroundTaskInstance che arriva in ingresso al metodo, dobbiamo sfruttare la proprietà TriggerDetails e farne il casting verso AppServiceTriggerDetails
  • Sottoscriviamo l’evento RequestReceveid esposto dall’oggetto AppServiceConnection (ovvero, vedere la proprietà AppServiceConnection)
  • All’interno dell’evento RequestReceveid, dobbiamo prelevare i valori che il client ci ha eventualmente passato. Questa cosa la si ottiene con:
    var message = args.Request.Message;
    int number = (int)message[“param1”];
    string strValue = message[“param2”].ToString();
  • All’interno dell’evento RequestReceveid, prima o poi dovremo restituire qualcosa al client. Questo si ottiene con la seguente riga:
  • ValueSet returnValue = new ValueSet();
    returnValue["ReturnValue"] = result;
    await args.Request.SendResponseAsync(returnValue);

    Come si vede, “returnValue” è un’istanza di ValueSet al cui interno abbiamo inserito una o più chiavi con il corrispondente valore.

Questo delegate verrà invocato quando l’app client invocherà l’AppService. A proposito di client, come si attiva il dialogo tra client ed il nostro AppService? Il legame è molto loose coupled.

service = new AppServiceConnection();
service.AppServiceName = "randomNumberService";
service.PackageFamilyName = "bcbc4d41-504f-4d99-8a93-43f5b9d4c404_xe5ny6wrzrhn8";

var status = await this.service.OpenAsync();

if (status != AppServiceConnectionStatus.Success)
{
    return;
}

La proprietà AppServiceName deve coincidere con quanto stabilito nel file di manifest dell’app UWP che hosta l’AppService. Idem per il PackageFamilyName. La chiamata al metodo OpenAsync() della classe AppServiceConnection ci restituisce un valore tratto dall’enum AppServiceConnectionStatus. Se qualcosa è andato storto, allora interrompiamo immediatamente l’esecuzione.

Altrimenti:

var message = new ValueSet();
message.Add("Operation", "Random");
message.Add("NumberA", 1);
message.Add("NumberB", 100);
AppServiceResponse response = await this.service.SendMessageAsync(message);

if (response.Status == AppServiceResponseStatus.Success)
{
    int result = (int)response.Message["ReturnValue"];
}

Nel frammento di codice qui sopra, preparo un oggetto ValueSet, con alcune coppie di chiave/valore, ed invoco l’AppService. Notare che la chiamata a SendMessageAsync passa all’AppService il nostro ValueSet. Otteniamo un valore di risposta; se è Success possiamo prelevare il valore di ritorno.

Notare che all’interno di ValueSet possiamo inserire oggetti serializzabili: numeri, stringhe ma anche ovviamente classi complesse.

L’AppService va dichiarato nella sezione “Declarations” del file di manifest dell’app UWP che hosta il servizio. E’ necessario quantomeno specificare il Name e l’entrypoint. Quest’ultimo, come accade con i BackgroundTask tradizionali, deve contenere il nome della classe (compreso di namespace) che implementa l’AppService stesso. Ricordo ancora una volta che questo BackgroundTask non va registrato come accadrebbe con un BackgroundTask tradizionale.

Send to Kindle
Giu 5 / Igor Damiani

[UWP] Utilizzo di ThreadPoolTimer

La classe ThreadPoolTimer ci fornisce due metodi statici che creano e danno lo Start a due tipi differenti di Timer:

  • CreateTimer: crea un’istanza di ThreadPoolTimer che esegue un metodo dopo X secondi. Poi il timer si ferma.
  • CreatePeriodicTimer: crea un’istanza di ThreadPoolTimer che esegue un metodo ogni X secondi (timer periodico)

In entrambi i casi il metodo da eseguire è specificato tramite il delegate TimerElapsedHandler.

In entrambi i casi il secondo parametro è un’istanza di TimeSpan. Nel primo caso rappresenta dopo quanto tempo il metodo deve essere eseguito. Nel secondo caso rappresenta l’intervallo di tempo che scatena periodicamente l’esecuzione del timer.

Entrambi i metodi prevedono un terzo parametro, un delegate TimerDestroyedHandler, che è il metodo che viene eseguito quando il timer termina la propria esecuzione.

Nel caso di CreateTimer, questo metodo viene eseguito in due momenti:

  • quando il timer raggiunge il TimeSpan: prima viene eseguito il metodo TimerElapsedHandler, e poi TimerDestroyedHandler
  • quando il timer viene (eventualmente) annullato dall’utente, ad esempio cliccando su un bottone

Nel caso di CreatePeriodicTimer, il metodo TimerDestroyedHandler viene eseguito solo quando l’utente eventualmente annulla e ferma il timer. Trattandosi di un timer periodico, teoricamente potrebbe proseguire all’infinito.

Entrambi i metodi restituiscono un’istanza di ThreadPoolTimer, istanza che dobbiamo salvarci da qualche parte, ad esempio per poterne invocare il metodo Cancel(). L’oggetto ThreadPoolTimer, oltre a questo metodo, espone anche tre property read-only:

  • Delay, che è l’oggetto TimeSpan utilizzato dal Timer
  • Period, che è l’intervallo di tempo previsto dal Timer periodico

Nel caso di CreateTimer, Delay contiene l’intervallo di tempo, mentre Period è zero.

Nel caso di CreatePeriodTimer, le due property equivalgono. Un timer periodico attende X secondi prima di eseguire TimerElapsedHandler, e poi ripete ogni X secondi. Delay e Period coincidono.

All’interno di TimerElapsedHandler o TimerDestroyedHandler non abbiamo ovviamente accesso al thread della UI, per cui dobbiamo passare dal Dispatcher della Window e chiamarne il metodo RunAsync se dobbiamo aggiornare qualcosa sull’interfaccia utente dell’applicazione.

Send to Kindle