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
Giu 4 / Igor Damiani

[UWP] Accesso alla SD da un’app Windows 10

In giro per il web troverete tonnellate di documentazione relativa all’accesso alla SD da un’applicazione UWP. Ci sono certe cose che non mi entrano in testa, per cui mi appunto qui un po’ di cosucce interessanti.

  • La chiamata a:
    var folder = KnownFolders.RemovableDevices;
    è la porta di accesso per ottenere un riferimento alla SD
  • E’ necessario attivare la capability “Removable Storage”, altrimenti la riga sui sopra vi spara una bella System.UnauthorizedAccessException
  • Se tutto è andato bene, otterrete un oggetto simile al seguente:

    image

  • Come si può notare, non è la vera root della vostra SD. Per ottenere la root dell’SD dovete nuovamente richiedere l’elenco dei folder:
    var root = await folder.GetFoldersAsync().FirstOrDefault();
  • L’oggetto root potrebbe valere null nel caso in cui non sia presente alcuna SD nel dispositivo Windows 10. L’oggetto folder invece è sempre valorizzato, indipendentemente dal fatto che la SD sia presente oppure no
  • Su un PC Desktop, i dischi USB ed un eventuale lettore CD/DVD vengono visti come “Removable Storage”. In questo caso, la proprietà Name di StorageFolder vi dà la lettera del drive (esempio: “E:\”).
  • Da notare che potreste avere più root SD, semplicemente per il fatto che avete più dischi removibili presenti nel sistema, e quindi avete una root per ciascun drive.
  • E’ necessario andare nel file di manifest, nella sezione “Declarations”, ed aggiungere tante voci “File Type Associations”, una per ciascun tipo di file che volete leggere/scrivere dalla scheda SD. Volete leggere i file .txt? Dovete specificarlo! Volete leggere i file .pdf? Idem come sopra!
  • Se non indicate alcun “File Type Associations” nel file di manifest, qualsiasi tentativo di lettura/scrittura vi spara una System.UnauthorizedAccessException (esempio: GetFileAsync, GetFilesAsync, CreateFileAsync)
  • Se fra le “File Type Associations” indicate i file JPG (è solo un esempio), la chiamata a GetFilesAsync() vi restituirà solamente quel particolare tipo di file, anche se sul disco ci sono altri tipi di file
  • Le operazioni sui folder (creazione, lettura, etc.) non richiedono ovviamente alcuna voce definita fra le “File Type Associations”
  • Parliamo un attimo di GetItemAsync ed affini. Questo metodo esposto da StorageFolder permette di ottenere un’istanza di IStorageItem che punta ad un file o cartella.
    Se indicate il nome di una cartella, e questa cartella esiste, tutto bene.
    Se la cartella non esiste, ottenete un’eccezione.
    Se indicate il nome di un file, e questo file esiste, deve essere dichiarato nella sezione “File Type Associations” del file di manifest.
    Se il file non esiste, ottenete un’eccezione.
  • Meglio usare TryGetItemAsync, che restituisce null nel caso in cui il file o la cartella non esiste
  • Su uno smartphone Windows 10, è possibile ottenere un ID univoco della SD:
  • var id = await sf.Properties.RetrievePropertiesAsync(
        new List<string>()
        { "WindowsPhone.ExternalStorageId" });

Direi che è tutto!

Send to Kindle
Mag 31 / Igor Damiani

Focus Day, tutto ciò che non vi ho detto

60 minuti erano il minimo indispensabile per raccontarvi tutto ciò che avevo da dire. Ma i blog esistono anche per questo, e quindi aprofitto del mio per integrare un po’ di contenuti.

Mi rendo conto che i contenuti di questo post sono molto a rischio, per un semplice motivo. Ognuno di noi sviluppatori vede, credo, “la sua fetta di mondo”. Uno sviluppatore Web crede che il mondo sia governato solo ed esclusivamente dal Web; crede che in giro ci siano clienti che gli chiederanno solo ed esclusivamente portali, siti ed applicazioni Web. Assolutamente falso. Ma sbaglia anche lo sviluppatore desktop che crede che in giro ci sia solo ed esclusivamente desktop. In realtà, ci sono aziende che chiedono applicazioni a tutto tondo, capaci di esistere sul desktop, sul Web, sul cloud, sul mobile. Il Web è un grande collante, è una serie di fili che collega un dispositivo all’altro. Di sicuro non esiste più un’applicazione disconnessa: un’applicazione moderna in ogni caso sincronizza i dati, si basa sul cloud, salva su OneDrive, parla con servizi esterni e remoti, e via dicendo.

Quindi, di volta in volta dobbiamo scegliere le tecnologie giuste.

Arriviamo al dunque, in merito al contenuto della mia sessione al Focus Day.

Ma se Windows Phone muore, che senso ha UWP?
UWP non è solo telefono, anzi. Il destino di Windows Phone non c’entra nulla con il destino di Universal Windows Platform. Windows Phone è destinato a morire, per il semplice fatto che Windows Phone 8 o 8.1 è destinato a morire. Gli smartphone che potranno farlo migreranno verso Windows 10. E su Windows 10 c’è e e ci sarà UWP per un bel pezzo di tempo.

Windows 10 ha una piccola fetta di mercato, che senso ha imparare/sviluppare UWP?
Non è vero. Windows 10 non ha una piccola fetta di mercato, anzi tutt’altro. Lo è se considerate solo ed esclusivamente il mondo degli smartphone. E quindi dipende dal mercato che volete o dovete seguire. Ma Windows 10 attualmente è installato su 300.000.000 milioni di PC in giro per il mondo (fonte), e cresce ogni giorno. Se dovete sviluppare un client per Windows, UWP può essere una scelta.

Ma se Microsoft dismette gli smartphone Windows 10, che senso ha UWP?
Beh, ha perfettamente senso. Se come me è circa 20 anni che sviluppate per il desktop, UWP può essere la scelta ideale. Perchè dico “può”? Perchè ad oggi UWP richiede Windows 10, e può essere benissimo che i vostri clienti – per miliardi di motivi diversi – non possano e non vogliano migrare. Se cadete in questa situazione, scegliete ovviamente WPF. Per tornare alla domande, se anche gli smartphone Windows 10 dovessero scomparire, UWP continuerebbe ad esistere, perchè UWP significa Windows 10, e Windows 10 non è solo telefoni, ma molto di più.

Ma Microsoft non potrebbe inventarsi un porting di UWP verso Android ed iOS?
Sarebbe imho una grande follia. UWP è un framework strettamente legato a feature del sistema operativo Windows. Comprende classi legate a XAML ed al suo essere vettoriale, Cortana, Live Tile, drag’n’drop, push notification, OneDrive, utilizzo della penna o della tastiera, Azure. UWP è Windows, punto. Deve essere la scelta se il sistema che dovete raggiungere è esclusivamente Windows.

Non avrebbe davvero senso affrontare un porting UWP verso altri sistemi operativi. Se il vostro obiettivo è quello di scrivere codice una volta e di eseguirlo ovunque (write once, run everywhere), Xamarin Forms DEVE essere la vostra scelta.

UWP è in diretta concorrenza con Android?
No. Android è un sistema operativo mobile per smartphone/tablet, UWP è anche questo e molto di più. UWP è solo ed esclusivamente per Windows, e raggiunge smartphone, ultrabook, desktop, IoT, HoloLens, magari in futuro le XBOX.

UWP è in diretta concorrenza con iOS?
No. iOS è il sistema operativo di Apple, che raggiunge iPhone ed iPad. Valgono le stessa considerazioni fatte per Android qui sopra.

Dovrei scegliere UWP o Xamarin?
Bella domanda. UWP è legato esclusivamente al mondo Windows. Xamarin è un framework per lo sviluppo di applicazioni mobile cross-platform (Android, iOS, Windows Phone, ed anche UWP). Scegliete UWP se il vostro cliente vi chiede esclusivamente un’applicazione per Windows desktop/mobile, da distribuire tramite gli Store (pubblico o quello For Business); consiglio spassionato: scrivete bene il vostro codice (mvvm a go-go & PCL, tanto per citare due keyword), così siete pronti a reagire al cambiamento e potete scrivere codice non totalmente relegato alla piattaforma UWP. UWP secondo me è un’ottima scelta per applicazioni business simil-desktop, nativamente mobile, e se il sistema operativo è Windows 10. Potete realizzare app che una volta avreste implementato con WPF, ma con una miriade di feature in più, come ho accennato nella mia sessione del Focus Day del 27 maggio scorso: Cortana, Live Tile, notifiche push, impostazioni in roaming, distribuzione tramite gli Store (che vi evitano deploy via ClickOnce o via file zip da scaricare), etc.

Scegliete Xamarin se dovete fare un’app consumer multi-piattaforma, quindi se dovete raggiungere, oltre alla piattaforma Windows, anche Android iOS.

Send to Kindle
Mag 23 / Igor Damiani

Windows Store Api, la mia partecipazione a DotNetPodcast

E’ con un pizzico di contentezza che vi annuncio la messa in onda della mia intervista sulle Windows Store Api sul sito della community DotNetPodcast.

Vi confesserò che sono molto contento di questa iniziativa. Ho trovato l’idea dei podcast in ambito .NET semplice e geniale allo stesso tempo. Spesso mi ritrovo in auto a guidare per raggiungere clienti o la sede del prossimo corso che devo tenere, e trascorrere un po’ di tempo con le puntate di questo bellissimo podcast è utile e divertente. Oggi il protagonista di una di queste puntate sono io, spero di tenervi compagnia anche io per qualche minuto.

image

Buon ascolto!!!!!

Send to Kindle
Mag 20 / Igor Damiani

Si rompe il sync di OneDrive for Business?

Utilizzo praticamente tutti i giorni il OneDrive aziendale offerto da Office 365, per condividere documenti di ogni tipo con colleghi e capi. Ovviamente, dopo un po’ di tempo la password di Office 365 va rinnovata, operazione che faccio dal portale senza alcun problema.

Peccato che il client Windows di OneDrive for Business, quello che si posiziona nella tray-bar di Windows, non reagisca come dovrebbe. Non appena cambiamo la password, infatti, sull’icona compare il classico punto esclamativo giallo, segnalando la necessità di reinserire la password per rimettere in piedi il meccanismo di sync automatico.

Ovviamente lo facciamo, ma purtroppo a volte non basta. Cercando di risolvere il problema, sullo schermo vi appare l’autenticazione di Office 365: ovviamente voi inserite le nuove credenziali aziendali. Ma questo prompt continua ad apparirvi, come se stiate inserendo credenziali non valide.

Ho trovato un’unica soluzione. Aprire il tool Gestione Credenziali di Windows e trovare l’account che ho evidenziato nel riquadro verde:

image

MicrosoftOffice16_Data:orgid:mail_aziendale_office_365

Espandete il nodo, cliccate su Modifica e reinserite le credenziali. Il problema dovrebbe sparire.

Giusto per scrupolo, date un’occhiata alla voce:

MicrosoftOffice16_Data:SSPI:mail_aziendale_office_365

Quest’ultima dovrebbe riferirsi al portale SharePoint che è dietro le quinte la condivisione dei file di Office 365 e OneDrive. Incrociamo le dita, e spero di avervi dato una mano.

Send to Kindle