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
Apr 29 / Igor Damiani

Il byte e l’incontro con gli Spettri

E’ una nottata frizzante e ricca di eventi, per la città. Un byte qualunque, uscendo dalla sua locazione di memoria – sospinto dal bus di trasmissione – l’avrebbe capito immediatamente. E’ come se nell’aria ci fosse uno strano fermento, una specie di energia capace di spingere tutti all’euforia. I locali erano agitati da spettacoli musicali di ogni tipo, dal rock al jazz, fino a melodie più ricercate eseguite da artisti di nicchia che intrattenevano il loro pubblico. Ciascuno dei byte poteva trovare tranquillamente il suo envinronment preferito: bastava lasciarsi trasportare dal battito del clock ed il gioco era fatto.

In uno dei tanti locali c’era stato un ritrovo di vecchi amici che, tra un boccale di sprite e l’altro, si erano raccontati con un velo di malinconia i tempi che furono. Nessuno di loro era davvero troppo vecchio, ma il loro lifetime era comunque sufficientemente ampio da far comparire stream di capelli bianchi sulle loro chiome. I più anziani venivano da vecchie console 8-bit degli anni ‘90, la cui potenza di calcolo era appena sufficiente per soddisfare le esigenze dei videogame dell’epoca, mentre i più giovani erano nati su sistemi più recenti. Uno di loro si vantava addirittura di non essere stato ancora shutdownato neppure una volta; pivello, lo definivano gli altri. Una delle fasi più importanti per la crescita di un byte è proprio quella di capire se si è un byte persistente oppure transiente. Se vivi al sicuro su un hard-disk – e quindi in grado di sopravvivere tra una sessione di lavoro e l’altra – oppure in forma più volatile allocato in memoria RAM. E questo lo puoi capire solo attraverso un processo di shutdown. Chi non lo aveva ancora capito era un pivello.

Il locale del ritrovo, il Buffer, si trovava in un array di byte, in una posizione defilata del file di swap del sistema operativo, ed era stato scelto proprio per la sua location di memoria. Grazie all’elevato livello di entropia del file .swp, i byte potevano spostarsi al suo interno senza disturbare più di tanto le celle adiacenti tenute sotto stretta sorveglianza dall’OS. Man mano che passava il tempo, i partecipanti al ritrovo tornavano nelle loro celle. Il Task Scheduler del sistema operativo era inesorabile, e consultandolo ogni byte poteva sapere quali compiti lo aspettavano il giorno dopo. Byte[739082] era stato assegnato ad un file batch non meglio identificato. Byte[90824293] sapeva che avrebbe dovuto prendere vita nel processo “SearchIndexer.exe”, e lo aspettavano montagne e montagne di file e di directory da indicizzare. Ogni byte – in un sistema che si rispetti – sa chi è e sa che cosa ci si aspetta da lui.

Alla fine rimasero solo in due, il byte ed un ammasso di classi partial. Si salutarono brindando un’ultima volta, svuotarono i bicchieri fino in fondo, poi ciascuno prese la sua strada.

Il byte uscì dal locale, felice di quella rimpatriata, ed imboccò la direzione più rapida per raggiungere il bus PCI Express che l’avrebbe condotto in pochi istanti a casa. Percorse un tratto di strada di buona lena, cadenzando il suo passo con il battito del clock per rispettare le normative vigenti. Meglio non ficcarsi nei guai a quell’ora.

Il byte non poteva sapere che sarebbero stati i guai ad andare alla sua ricerca. Girò per entrare in un vicolo buio e scuro, ai cui lati erano ammassati frammenti di memoria, messi qua e là in mezzo a sporcizia di ogni tipo. Di sicuro il Garbage Collector non passava da lì da un bel po’.

Fu allora che vide gli Spettri.

Comparvero alle sue spalle, uscendo dalle pareti, trascinandosi lentamente come fantasmi in grado di attraversare le superfici solide. Erano figure evanescenti di ogni tipo, umanoidi e non. Erano decine e decine, e si fecero largo uno alla volta fino ad occupare tutto il vicolo. Poi si voltarono verso il byte, che era rimasto pietrificato dalla visione, al punto che non riusciva a capire se si trattasse di realtà o di un brutto incubo. Non seppe cosa fare. L’istinto gli stava suggerendo di uscire dal vicolo e di darsela a gambe, dimenticando quegli esseri inquietanti. Ma qualcosa lo trattenne, e non potè fare a meno che osservarli, lottando con tutte le sue forze per rimanere lucido.

C’era un marine, armato fino ai denti, imbottito in un’uniforme da guerra tutta ammaccata. Sul casco era riportata la dicitura UAC, e questo non lasciava dubbi sulla sua origine.
C’era un tale che aveva tutta l’aria di essere uno scienziato. Un tizio piuttosto magro, che indossava soltanto una tuta lacerata ed un paio di occhiali da professore, su cui capeggiava quello che sembrava essere il suo nome: Gordon Freeman.
Poco più indietro, seduta a terra mentre consultava un’antica pergamena, c’era una giovane ragazza dalle forme prosperose, e non faceva nulla per nasconderle. Se ne andava in giro in un posto come quello indossando una semplice canottiera celeste, e shorts che mettevano in bella mostra le sue gambe. Era tutta concentrata a decifrare un simbolo che aveva un qualcosa di religioso, e non si curava di nient’altro.
C’erano membri di una sorta di famiglia reale fantasy, riconoscibili per il loro vestiario sgargiante.
C’era una bambina dai lunghi capelli neri, che in modo timido si guardava le mani senza avere il coraggio di alzare lo sguardo verso il byte o gli altri. Che fosse Alma?

C’erano altri uomini, altre donne, un androide scheletrico con al posto degli occhi due lampadine rosse.

Oltre a tutti questi personaggi, ce n’erano altri di statura più piccola. C’erano folletti e creature di varie specie. Chi strisciava, chi saltellava, chi svolazzava freneticamente. C’erano piccoli draghi, viscidi serpentelli sputafuoco, ed altri esseri a cui il byte non seppe dare un nome. C’era chi era silenzioso, e invece chi non poteva fare a meno di respirare rumorosamente.

Era un’accozzaglia di personaggi di ogni tipo, usciti in modo spettrale da chissà dove.

Ma il byte notò – nonostante il suo stato mentale alterato – che c’era qualcosa che non quadrava affatto, qualcosa di insano e di innaturale, che lo inquietava ancora di più. Quando ne fu cosciente provò una strana sensazione di terrore, un formicolio che fece tremolare la composizione di bit che lo rendevano vivo. Rimase in silenzio, e non seppe cosa fare.

Tutti quegli esseri erano emaciati ed in qualche modo perverso, anche deperiti. Erano apparsi tutti in una scala di grigi povera, con un canale alpha dai valori elevati. Il marine sembrava l’ombra di ciò che fu un tempo; sembrava debole, e non aveva affatto l’aspetto di una persona forte ed indistruttibile. Anzi, teneva le spalle ricurve su se stesso. Se il byte avesse potuto guardarlo per un attimo negli occhi, avrebbe notato che era sull’orlo di una crisi di pianto. La ragazza, nonostante il fisico impetuoso, mostrava un’età più avanzata di quella che aveva in realtà. E sembrava isterica, continuava a sistemarsi nervosamente la coda di cavallo. Grattava la pergamena continuamente con l’unghia, come se tentasse di estrarne la verità violentando la carta, per cui invece avrebbe dovuto avere soltanto rispetto. La bambina, che lui aveva battezzato Alma, sembrava la classica protagonista di un videogame horror, una di quelle dall’aspetto inquietante, disegnate appositamente per atterrire il giocatore. Teneva la testa bassa, con i capelli che nascondevano in parte il volto pallido.

Di fronte a quell’orda di creature, il byte non ebbe altra reazione se non quella di parlare.

– Chi siete? Cosa volete da me?

Prima che qualcuno rispose, passò molto tempo. Tra la folla di esseri decadenti si fece largo un mago con addosso una tunica rossa. Nella mano destra impugnava un bastone di quercia decorato con rune e simboli arcaici luminescenti. In condizioni normali sarebbe stato alto ed imponente. Adesso era davvero molto vecchio, ed era quasi trasparente. Persino il bastone sembrava sul punto di spezzarsi da un momento all’altro; era annerito, marcio e ad ogni passo che il mago faceva verso il byte, si piegava cigolando un poco. Come se si fosse autoproclamato portavoce del gruppo di creature, il mago si portò davanti a tutti, fino a raggiungere il byte.

– Siamo gli Spettri

La voce non era una sola. Era una cacofonia di voci, come se insieme al mago stessero parlando anche tutti gli altri, che però non si erano mossi di un millimetro.

– Siamo Giochi Incompleti, Giochi in disuso, Giochi Abbandonati. Siamo personaggi che i Creativi hanno abbandonati nei loro mondi, immersi nelle loro esperienze. Siamo maghi senza più un briciolo di magia, siamo un’archeologa perennemente braccata dai suoi nemici. Siamo un marine con una guerra da vincere freezata nel tempo, siamo draghi dal soffio di fuoco congelato. Siamo principesse che non verranno mai salvate, siamo gare di rally senza un vincitore. Siamo bambini senza le loro madri. Siamo palline da golf sospese in aria, senza mai sapere se saremo un par o un birdie. Siamo flotte interstellari alla deriva nello spazio profondo. Siamo esseri condannati, di ogni tipo, forma e colore.

Un respiro, un lungo istante. Un istante in cui il byte forse cominciò a capire.

– Tutte le volte che il creativo comincia un nuovo gioco, lo deve portare a termine. Altrimenti rimarremo intrappolati per sempre. Diventiamo personaggi senza scopo, esseri senzienti che vagano nel sistema senza una meta, costretti a vivere a metà, in un mondo a metà strada tra la nostra realtà virtuale e l’incubo costante. Ed alla fine diventiamo Spettri.

– Come posso aiutarvi? Cosa posso fare per voi?

In quel momento un urlo fece trasalire il byte. Fu la ragazza – probabilmente l’archeologa – ad emetterlo. Fu un grido di frustrazione, probabilmente la pergamena metteva a dura prova le sue conoscenze di lingue antiche. O forse era altro. Forse era solo la profonda disperazione per la sua condizione. Ma le voci, guidata da quello del mago, riportarono il byte alla realtà.

– Oh, sei gentile a chiederlo. Ma non puoi fare nulla. Solo il Creativo può salvarci. Deve riportarci in vita, o disinstallarci definitivamente. In queste condizioni siamo tecnicamente vivi, ma non ci sentiamo affatto come tali. Guardaci. Preferiremmo morire. Preferiremmo essere lasciati andare liberamente, e decidere del nostro destino, e di non essere imprigionati quaggiù.

– Ma allora perchè mi siete apparsi? Cosa volete che io faccia?

Di nuovo il mago attese un attimo prima di rispondere, come se avesse bisogno di pensarci.

– Oh, ecco la domanda più importante di tutte. Cosa vogliamo da te? Vogliamo divorarti, assaporarti fino all’ultimo bit. Vogliamo accedere alla tua linfa vitale, e dopo di te, divorare un altro byte, e poi un altro ancora, uno alla volta, fino a conquistare l’intero sistema. Ci sono trilioni e trilioni di byte, in questo hardware. Saranno tutti nostri. Diventeranno tutti Spettri, vagheremo tutti assieme in questo oblio fatto di dannazione.

Poi i volti si fecero famelici. Tutti, dal primo all’ultimo, alzarono lo sguardo vacuo, ed aprirono le loro bocche, mostrando denti piccoli ma aguzzi e deturpando il loro volto in una maschera. Divennero mostri a tutti gli effetti, e cominciarono ad avvicinarsi al byte, trascinando un passo dopo l’altro. Non mostrarono alcuna fretta, come se quello del byte fosse un ineluttabile destino già segnato, dal quale non poteva scappare.

Il byte si riprese ed in un attimo indietreggiò. Guardando dietro di sè, vide che nulla gli impediva di scappare via da quel posto. Ed infatti fece ciò che gli suggeriva l’istinto. Si voltò e se la diede a gambe, cercando di allontanarsi il più possibile da quelle creature. Raggiunse la fine del vicolo, dal lato opposto rispetto a quello da cui si trovava il Buffer. Tornò alla sicurezza della luce dei lampioni digitali che, con il loro bagliore vagamente #FFFFFF, lo avevano tranquillizzato un pochino. La gente che camminava sulla strada principale era poca, ciò nonostante c’era ancora qualcuno che si divertiva e che teneva fra le mani il suo drink, incurante degli esseri immondi che vivevano (o tentavano di farlo) a pochi passi da loro.

Prese un po’ di coraggio, cercando di dimenticare, scese le scale per entrare nel metrobus, così come aveva pensato di fare fin dall’inizio, ed in pochi attimi era al sicuro nella sua locazione di memoria, in uno dei registri della CPU. Si chiese dove fossero adesso gli Spettri, chi stessero divorando. Ci mise molto a prendere sonno, e fu comunque un sonno agitato e pieno di incubi.

Al suo risveglio, c’era stato un nuovo boot del sistema, ed il clock scaldava il pavimento vibrante.
Al prossimo ritrovo fra amici avrebbe avuto una storia in più da raccontare.

Send to Kindle