Technology Experience
HardwareSoftware

Tablet, Surface, evoluzione

Mamma mia, come corre il nostro mondo digitale. Facciamo un gioco. Se vi chiedessi la definizione di “tablet”, cosa mi rispondereste? Sono assolutamente convinto del fatto che se avessi la macchina del tempo e facessi questa domanda a quattro persone provenienti da anni diversi, le risposte sarebbero diverse. Ma facciamola breve.

La mia personale definizione di “tablet” indica un dispositivo leggero, portatile, da usare ovunque, in mobilità e non. L’interazione con un tablet avviene tramite lo schermo touch, il cui sistema operativo è stato progettato e realizzato tenendo ben presente che l’utente lo utilizzerà con le dita. Tutte le funzionalità di sistema e tutte le app sono utilizzate con le dita. L’utilizzo di un tablet avviene solo in modalità “scanzonata” (tutti i diritti su questa parola sono riservati): intendo dire che si usano le dita, e che comunque usare app su un tablet non deve richiedere particolare attenzione, non deve richiedere una superficie piana ed ovviamente nessuna particolare “precisione sullo schermo”. Un tablet posso usarlo sbragato sul letto o sul divano davanti alla tv, per esempio. Lo posso usare tenendolo appoggiato sulle gambe accavallate, in un bar, oppure in un palazzetto sportivo. Posso usarlo in piedi, durante una fiera come speaker, o in mezzo alla gente per prendere prenotazioni o appunti su qualcosa. Poco importa se opzionalmente ci posso collegare tastiera Bluetooth, oppure un mouse, se il sistema operativo non supporta appieno questi dispositivi di input per svolgere il 100% delle operazioni siamo punto e a capo. Un tablet lo devi usare solo con le dita. Non appena allontani le dita dallo schermo, magari per usare una tastiera fisica, in realtà ci si accorge che ogni minima operazione richiede il touch, per cui occorre quasi immediatamente tornare a tappare sul display. Questo perchè banalmente ci sono elementi dell’interfaccia utente non raggiungibili se non attraverso il touch.

Assioma: l’unità minima indirizzabile su uno schermo da un utente su un tablet è la dimensione del suo polpastrello.

Questo è ciò che io considero un tablet. Inutile dire che leader indiscusso di questa categoria è iPad.

Windows 8 è un sistema operativo nato per unire i mondi. Prendiamo Surface RT che – lo sappiamo – monta a bordo Windows RT. Lo puoi usare con tastiera, mouse & touch. Windows RT nativamente supporta al 100% tutte e tre le modalità di utilizzo, senza alcun deficit nel passare dall’uno all’altro. La modalità di interazione touch è solo una delle possibilità, ma non è assolutamente necessaria. Chiunque di voi abbia già provato Windows 8 sul proprio PC desktop non-touch sa benissimo che questo è vero. La famigerata Start Page è perfettamente utilizzabile con tastiera & mouse. Leggere questo mio vecchio post di Marzo 2012. Qui qualcuno di voi comincerà a storcere il naso: ma come – starete dicendo – Surface RT permette l’utilizzo di app esclusivamente di tipo Metro Windows Store Apps, devo per forza usare il touch!!!! Falsissimo. Le app Windows Store sono e devono essere perfettamente utilizzabili anche con tastiera & mouse, proprio perchè nella fisolofia Windows 8 l’utente deve poter cambiare dispositivo di input senza perdere appeal o feeling nei confronti del dispositivo e dell’app stessa. E’ per questo motivo che il team che controlla e valida le app per lo Windows Store le controlla anche con tastiera & mouse. Su Surface devono esistere “app scanzonate”, come dicevamo prima, ma non solo. Assolutamente non solo. Io, per esempio, auspico che sullo Windows Store arrivino app come Paint.NET ed Audacity, per citarne due a caso, che adoro. La prima è un’applicazione di grafica freeware irrinunciabile, la seconda è un’applicazione di editing audio freeware ed open-source. Per essere sfruttate appieno, probabilmente bisogna usarle con tastiera & mouse, e non il touch, ma io le voglio sullo store, perchè un dispositivo ARM con Windows 8 prevede non solo il touch. Su un tablet, da usare con le dita, app così non avrebbero senso.

Assioma: l’unità minima indirizzabile su uno schermo da un utente su Surface è il polpastrello se lo sta usando in modalità touch, il pixel se lo sta usando con tastiera e/o mouse.

La morale di tutto questo è riassumibile con poche frasi.

  1. Un dispositivo il cui display è touch non è assolutamente per forza un tablet (se così fosse, tra circa 4 mesi ci ritroveremo con milioni e milioni di tablet Windows 8 in giro per il mondo, il che è falso: sono pc, ultrabook convertibili, che hanno lo schermo touch – ma non tutti sono tablet)
  2. Su iPad, tablet per eccellenza, hanno senso solo “app scanzonate”
  3. Su computer Windows RT hanno senso sia “app scanzonate”, sia app dalla usability più tradizionale (tastiera & mouse), che però girano nello stile delle app Windows Store
  4. Surface non è un tablet

Per tutti questi ragionamenti, io non paragono il prezzo di Surface a quelli di un tablet, ma a quelli di un pc. Perchè ciò che conta non sono tanto le app disponibili (che comunque devono crescere di numero), ed il fatto che il processore sia un ARM piuttosto che un “vero x86: ciò che conta sono le modalità con cui interagisci con il dispositivo. E Surface non è un tablet.

Send to Kindle
Software

Seguite la pallavolo femminile? Diretta Volley vi aiuta!

Nei mesi scorsi ho sviluppato l’app Diretta Volley per Windows Phone, che vi permette di seguire in real-time gli incontri della regular season di pallavolo femminile, per ora solamente di Serie A1. L’app è ovviamente gratuita e, se avete un qualsiasi smartphone Windows Phone e vi interessa la pallavolo, fa al caso vostro.

Sorriso

La potete scaricare a questo indirizzo.

Ecco alcune delle caratteristiche principali:

  • potete seguire i punteggi delle gare in corso, e sapere le prossime gare del campionato
  • potete seguire l’account Twitter MezzoTempo, che vi mantiene aggiornati sul mondo della pallavolo, ed in alcuni casi straordinari vi dà la twit-cronaca degli incontri più importanti
  • potete sottoscrivere una o più squadre del campionto per ricevere in diretta gli aggiornamenti tramite Live Tile, senza quindi dover tenere aperta l’app

Diretta Volley è un’app in costante aggiornamento. La 1° giornata di campionato è sabato 20 ottobre (anticipo tra Yamamay Busto Arsizio e Banca Reale Yoyogurt Giaveno), con tutte le altre gare il giorno dopo, domenica 21. Per questa prima giornata prevedo qualche ora di testing e bug-fixing, ma conto di poter fixare tutto in breve tempo: purtroppo aver sviluppato ed ideato l’app in un periodo fuori dal campionato ha i suoi svantaggi. VivendoByte ve lo promette!

Sorriso

Send to Kindle
My daily work

E così, son tornato a WordPress

Se state leggendo questo post, significa che state leggendo il mio nuovo blog, Technology Experience (Reborn 4), la quarta generazione del mio blog. Per fare un breve riassunto (ogni tanto è bello tornare alle origini):

  • primo blog, hostato su UGIdotNET, con Subtext
  • secondo blog, indipendente, su Webhost4life, sempre con Subtext
  • terzo blog, migrato su Winhost, sempre con Subtext
  • quarto blog, quello attuale, sempre su Winhost, questa volta con WordPress

Ma perchè nel titolo ho messo “tornato a WordPress”, quando invece sembra essere la prima volta che lo uso? Non è proprio così: c’è stato un breve periodo (un paio di mesi) in cui avevo lo avevo già adottato, abbandonandolo quasi subito a causa del cambiamento del service provider su cui mi appoggiavo. Troppo lungo da spiegare adesso, ed è inutile rivangare adesso. In questo mio vecchio post, se vi interessa, trovate qualche info in più.

Perchè questo weekend ho deciso di fare il grande balzo? E’ presto detto: Subtext, il blog-engine che mi ha accompagnato per tanti anni, mi costringeva a mantenere l’adozione del .NET Framework sulla piattaforma di hosting alla versione 3.5, chiudendomi un po’ le porte. Il pannello di controllo di Winhost permette ovviamente di switchare a versioni più recenti del framework, ma se provavo ad impostarlo su 4.x, ecco che Subtext smetteva di funzionare. Come ben sanno le persone che mi leggono, le mie esperienze con lo sviluppo Web non sono granchè, quindi invece che sbattere la testa per capire il problema, ho sempre preferito ignorare il tutto a tempi migliori.

C’è un altro motivo per cui ho deciso di fare il grande salto: quando migrai a suo tempo su Winhost, ormai qualche anno fa, non c’era la possibilità di avere MySQL come database engine. E quindi questo chiudeva le porte all’adozione di WordPress. Oggi invece la situazione è ben diversa.

Così venerdì sera, senza alcun preavviso, mi sono quindi reso conto di aver tutti i requisiti necessari per migrare a WordPress: Winhost supporta tranquillamente PHP e mi dà MySQL (100 database, per un totale di 2,5GB di spazio complessivo su tutti i database). E non solo: grazie a questa utility di Gian Maria Ricci, è stato anche abbastanza semplice effettuare la migrazione. L’unica nota dolente è stata la perdita di tutti i commenti, che comunque – lo ammetto – negli ultimi tempi erano davvero pochi pochini. Quindi, dopo attenta riflessione, e dopo aver deglutito un po’ di volte, un passo alla volta, ecco il mio nuovo blog online.

E dato che c’ero, ho dato una rispolverata grafica al tutto. Aprofittando dell’innovazione stilistica e grafica apportata da Microsoft sui suoi prodotti, ho ridisegnato il mio logo e ho fatto un po’ di pulizia sui miei server. Anche la mia homepage è stata modificata con il nuovo stile.

Detto questo, non penso che mi sposterò più da WordPress, fino alla fine dei miei giorni. WordPress è decisamente una piattaforma di blogging matura, completa, ricca di template e plugin. Non c’è alcun motivo per preferire un altro blog-engine, a meno che non abbiate esigenze particolari.

Send to Kindle
My personal life

Ho dato spazio alla mia creatività: VivendoByte Emotion

Lo so, lo so, voi tutti probabilmente mi leggete perchè sviluppo app per Windows Phone e per Windows 8, perchè lavoro per Brain-Sys, perchè non me la cavo con la grafica. Insomma, pù che altro per la mia natura da dev, con zero capacità artistiche.

Beh, per una volta mi son voluto sbizzarrire pure io. Ho creato una serie di video dedicati al mio brand VivendoByte; brand nel senso che è il marchio ideato ormai alcuni anni fa, ed è il nome che rappresenta il mio blog, il publisher con cui pubblico app per Windows Phone, è il nome del mio dominio. Insomma, VivendoByte è il nome che mi rappresenta sulla Rete.

Quindi, perchè non dare un look diverso al mio logo? Perchè non seguire il rinnovamento apportato da Microsoft a Windows 8, dando una rinnovata anche al mio? Ecco quindi ciò che ho creato in pochi giorni.

VivendoByte Emotion – Spot 01

VivendoByte Emotion – Spot 02

VivendoByte Emotion – Spot 04

VivendoByte Emotion – Spot 05

VivendoByte Emotion – Spot 06

 

Send to Kindle
Hardware

I miei prossimi acquisti sul fronte Windows 8 e Windows Phone

Come ben sapete, l’autunno sul fronte Microsoft è davvero molto caldo per tutta una serie di nuove uscite hardware e software che sono davvero imperdibili. Ho molto entusiasmo soprattutto per quanto riguarda Windows 8, e per tutto ciò che comporta: in primis Surface e tutti i nuovi ultrabook di nuova generazione. Insomma, soldi da spendere ne voleranno parecchi (purtroppo, almeno per le mie tasche, visto che non dispongo di fondi illimitati), per cui l’intento di questo post è quello di buttare giù qualche idea da convidere con tutti voi. Dunque, vediamo…gli elementi sul piatto sono tre:

  1. un nuovo ultrabook convertibile x86 (ultrabook/tablet) per lavoro e per hobby
  2. un tablet con Windows RT, preferibilmente Surface RT
  3. un nuovo telefono Windows Phone 8

Di questi, obbligatorio è sicuramente il punto (1). Il mio notebook attuale è piuttosto datato (estate 2009), ed ormai è inservibile, anche solo per il fatto che ormai lo utilizzo senza batteria, sempre collegato all’alimentazione. E da parecchi mesi. Inoltre è lento, non sfrutta appieno le caratteristiche di Windows 8, e via discorrendo. Ultimo punto: lavoro principalmente da casa, con un desktop multi-monitor; l’ultrabook mi servirebbe solo nelle giornate di trasferta, per cui non mi serve nulla di particolarmente pretenzioso, veloce e potente. E sì, conterrà ahimé un totalmente inaffidabile SSD, ma come ho già detto non sarà mai il mio pc principale di lavoro, per cui…accettabile.

Passiamo al punto (3). Windows Phone mi piace, mi piace davvero tanto. Sia dal punto di vista utente, sia dal punto di vista developer. Mi piace sviluppare app per Windows Phone, mi piace usarlo, mi piace il suo lato social. Di Windows Phone mi piace tutto. E quindi penso proprio che prenderò un nuovo telefono Windows Phone 8. I Nokia sono sicuramente un passo avanti dal punto di vista sia hardware che software, ma francamente io preferisco altro. Sono uno di quelli che va sempre in giro con due (a volte persino tre) batterie, per cui esigo un telefono che nell’arco della giornata mi permetta di cambiare batteria per essere sempre online.

Infine, la nota dolente, il punto (2).

L’idea è quella di avere un tablet leggero, che possa sostituire iPad. L’idea, da parecchi mesi, è quella di avere un Surface RT. L’idea è quella di poter twittare, di poter scrivere sul blog (cosa impossibile da fare con iPad e la sola UI touch), di fare qualche partita. Ma ad oggi (28 Settembre) non si sa ancora il prezzo, nè in dollari, nè in euro. Quindi, cosa farò? E’ facile a dirsi. Se il prezzo è contenuto (circa 300 euro) probabilmente sarà mio. Se sarà superiore, probabilmente skipperò questo acquisto. La cosa triste è l’aspetto commerciale che Microsoft ha improntato alla cosa: secondo me è assurdo che non si sappia ancora il prezzo, a probabilmente meno di un mese dall’uscita ufficiale. Se fai un evento che presenta un prodotto (anche se era dedicato alla sola stampa, se ricordo bene), dì anche il prezzo. Punto. Un prodotto completo contempla anche il prezzo, su questo non faccio passi indietro; perchè se costasse 200 è una botta al mercato, se costasse 400 un po’ meno e se invece costasse 600 sarebbe la fine prima dell’inizio. Quindi, di fatto è l’unico hardware opzionale, in balìa del prezzo finale.

Fine, tutto qua. E voi, cosa avete in ballo, come prossimi acquisti? Avete consigli da darmi? Cosa ne pensate?

Send to Kindle
Software

Il VERO baco della Start Page di Windows 8 di cui nessuno parla

Tralasciamo le critiche alla Start Page di Windows 8, perchè ho già avuto modo di parlarne in passato e secondo me sono davvero inconsistenti. E’ vero, la Start Page sostituisce il buon vecchio menù Start, probabilmente senza offrire tutte le possibilità che avevamo prima. Ma il mio personale punto di vista è che offre un pochino di più, bisogna solo abituarsi – questione di qualche secondo – e si lavora meglio di prima.

Il vero problema o baco è un altro, credo piuttosto grave, che ben presto sarà sulla bocca di tutti.

Il vero problema è che quando si installa un programma (di qualsiasi tipo) non vengono distinte icone/tiles di serie A e di serie B. Ve le ritrovate tutte quante sulla Start Page, da quella essenziale (per lanciare l’exe), e quelle più stupide ed inutili che magari non userete mai.

Quindi se installate un videogioco, non solo vi ritrovate l’icona per lanciare il gioco in sè, ma avrete anche le icone per aprire la pagina web del sito ufficiale, del forum, magari l’icona per aprire il manuale in pdf, etc. etc. Se installate Visual Studio, vi ritrovate decine di icone/tiles: quella per avviare l’IDE (ovvio) a quelle più inutili (per aprire i vari command prompt, il Tool Create Guid, compilatori vari, e tutte le altre decine di utility di corredo e via discorrendo). Le icone non sono per nulla organizzate, sono lì spiattellate una accanto all’altra, senza cartelle, senza un minimo di struttura. La cosa vale per ogni tipo di software, da quelli più banali da consumer a quelli più complessi da developer.

Me ne sono accorto e ho ragionato su questa cosa nelle ultime settimane, quando mi sono installato Windows 8 RTM. A forza di fare installazioni – i soliti che uso per lavoro – avevo la Start Page piena zeppa di icone che NON avrei mai usato. Mai e poi mai. In Windows 7 accadeva la stessa cosa, però c’era il meccanismo delle cartelle che organizzava e nascondeva meglio questa faccenda; e soprattutto nessuno ormai apriva e navigava più il menù Start, per cui nessuno si lamentava. Anche la Start Page può essere organizzata a gruppi, però è una cosa da fare manualmente.

Con Windows 8, invece, vi ritroverete decine e decine e centinaia di icone inutili, lì elencate, una di seguito all’altra. Appena installato un software, di qualsiasi tipo, vi consiglio caldamente di andare subito sulla Start Page e di vedere quali icone sono state aggiunte, e di rimuovere subito quelle che pensate di non usare mai. Secondo me le software-house devono cambiare modalità: non devono più pensare di fornire automaticamente collegamenti attraverso il menù Start (per evitare appunto il proliferare di icone sulla Start Page), ma devono farlo in un altro modo.

Send to Kindle
.NET World

App Windows 8, suspending e resuming dello stato

Una delle cose che ho trovato più complicate da capire quando si sviluppa un’app per Windows 8 Metro-style è la gestione del suspending e del resuming. Non perchè sia di per sè complicata, quanto perchè se aprite Visual Studio 2012 e iniziate con un qualsiasi progetto per il Windows Store, vi viene già fornita un set di classi che – sotto sotto – fanno il lavoro sporco di salvataggio e di recupero dei dati. Quindi secondo me non si capisce esattamente cosa faccia davvero il sistema operativo di base, e cosa invece viene fatto dal template classico di un’app Windows Store.

Andiamo con calma. Supponiamo di dover fare una semplice app Metro che chiede all’utente tre informazioni: cognome, nome e data di nascita. Il tutto avviene in modo molto semplice, con tre TextBox. Aprite Visual Studio 2012, cominciate con un progetto scegliendo il template “Blank App (XAML)”, che si trova all’interno dei folder Visual C# –> Windows Store. Editiamo la MainPage.xaml ed incollate questo:

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
        
    <TextBlock Grid.Row="0" Grid.Column="0"
                Text="Cognome" FontSize="34" VerticalAlignment="Center" Margin="4" />
    <TextBlock Grid.Row="1" Grid.Column="0"
                Text="Nome" FontSize="34" VerticalAlignment="Center" Margin="4" />
    <TextBlock Grid.Row="2" Grid.Column="0"
                Text="Data di Nascita" FontSize="34" VerticalAlignment="Center" Margin="4" />

    <TextBox Grid.Row="0" Grid.Column="1" Text="Damiani"
                x:Name="Cognome" FontSize="32" VerticalAlignment="Center"
                Foreground="Black" Margin="4" />
    <TextBox Grid.Row="1" Grid.Column="1" Text="Igor"
                x:Name="Nome" FontSize="32" VerticalAlignment="Center"
                Foreground="Black" Margin="4" />
    <TextBox Grid.Row="2" Grid.Column="1" Text="01/01/1900"
                x:Name="DataNascita" FontSize="32" VerticalAlignment="Center"
                Foreground="Black" Margin="4" />

</Grid>

 

Nulla di insolito. Per ora evitiamo MVVM. Abbiamo messo tre TextBox, ciascuna con il suo nome. Adesso, facciamola girare ed osserviamone il comportamento.

  1. All’avvio vi vengono ovviamente proposti i valori di default cablati nello XAML (il mio nome, cognome, e la mia data di nascita falsa)
  2. Provate a cambiare tali valori, scrivendoci i vostri, o quello che volete
  3. Tornate in Visual Studio a suon di Alt+Tab e – utilizzando la toolbar Debug Location cliccate sull’opzione Suspend and Shutdown: questa opzione simula il fatto che Windows termina la vostra app perchè ha bisogno di memoria, o per qualsiasi altro motivo. Ad esempio, se passate da un’app Metro all’altra, quella che finisce in background viene sospesa, per non consumare memoria, batteria, etc. etc.
  4. Se avete fatto correttamente il passo (3), l’app viene terminata: Visual Studio ed il suo debugger terminano ovviamente la sua esecuzione
  5. Se rilanciate l’app, DEVE accadere una cosa molto importante: l’app parte ma NON DEVE riproporre i valori di default, ma deve recuperare il precedente stato!!

A questo punto è necessario soffermarsi sul punto (5). Per chi viene da un avanzato sviluppo di app Windows Phone come me, troverà una notevole differenza. Quando toccate una tile su Windows Phone, l’app parte SEMPRE da zero, senza alcun bisogno di restorare il precedente stato. Questo NON E’ VERO con Windows 8. Il motivo è presto detto: con Windows Phone non potete chiudere manualmente l’app, mentre con Windows 8 sì. Con Windows 8, fin tanto che non la chiudete, essa deve SEMPRE recuperare lo stato che l’utente aveva. In breve: con il nostro piccolo test di prima l’app è stata sospesa (ovvero: non l’abbiamo volutamente chiusa), per cui se la rilanciamo (dalla tile sulla Start Page oppure prendendola dalle app aperte, usando lo charm sulla sinistra dello schermo) essa deve recuperare lo stato, proponendoci non i valori di default, ma quelli che avevamo modificato. Questo adesso ovviamente non accade, perchè in questo momento il meccanismo di suspending & resuming nella nostra piccola app di prova non esiste, perchè non è stato ancora implementato. Ma è stato importante capire, secondo me, cosa succede by default, e cosa invece dobbiamo implementare.

Andiamo avanti.

Suspending, salvataggio delle informazioni

Diamo un’occhiata al costruttore della classe App, contenuto nel file App.xaml.cs. Esso sottoscrive l’evento Suspending:

this.Suspending += OnSuspending;

 

L’handler di questo evento fa una cosa semplice:

private async void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    await this.SaveCurrentState();
    deferral.Complete();
}

 

La parte più interessante è il this.SaveCurrentState(), che fa una cosa di cui magari parleremo in un altro post. Questo metodo viene eseguito ogni qualvolta il sistema operativo manda in sospensione la nostra app: lo scopo quindi è quello di salvare lo stato, con tutto ciò che comporta. Caselle di testo, contenuto di ListBox, viewmodel, etc. etc.: tutto ciò che serve per dare l’illusione che l’app non si sia mai chiusa, insomma. Ed il tutto deve avvenire – se ben ricordo – nell’arco di 5 secondi: trascorso questo tempo, Windows killa la nostra app e tutto è perduto.

Resuming, recupero delle informazioni

Ovviamente deve esistere anche l’operazione inversa. Quando l’app viene lanciata potrebbe essere necessario recuperare le informazioni e riadattare la view dell’utente secondo quanto salvato. Diamo un’occhiata a:

protected async override void OnLaunched(LaunchActivatedEventArgs args) { }

 

Ad un certo punto troverete una riga di codice simile alla seguente:

if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
    await this.RestoreLastState(rootFrame);
}

 

La proprietà PreviousExecutionState ci dice la modalità con cui è stata chiusa l’app: nel caso fosse Terminated (ovvero chiusa dal sistema operativo) allora dobbiamo recuperare lo stato. Negli altri casi (ClosedByUser, NotRunning, Running, Suspended) no. Nel mio caso ho implementato un metodo RestoreLastState che fa tutto il lavoro.

Conclusioni

Quello che mi ha confuso per un po’ di tempo è il fatto che se usate un altro template per il Windows Store (Grid App, Split App, etc.) vi viene già fornita una classe SuspensionManager che fa buona parte del lavoro, con il fatto però che non ho mai capito cosa facesse il sistema operativo nativamente, e quanto invece facesse l’app e la parte di codice già implementata per noi. Per questo ho preferito partire da una Blank App e vedere cosa accadesse. Magari in un altro post parlerò di ciò che fanno i metodi SaveCurrentState() e RestoreLastState(). In breve, vanno a recuperare la view corrente e tramite un’interfaccia ISuspendInfo chiedono alla view le informazioni che devono essere salvate o recuperate.

Send to Kindle
Software

Windows RT, tablet, iPad, concorrenza e molto altro

E’ un post difficile, questo, come non me ne capitavano da tempo.

Vediamo di buttare giù qualche premessa. Windows 8 è il primo sistema operativo in grado di unificare l’esperienza d’uso. Ciò significa che sia stiate usando un tablet, un desktop, un ultrabook, un vecchio notebook, vi ritroverete sempre lo stesso tipo di interfaccia utente. Ma non solo questo:

  1. Microsoft permette ai costruttori di produrre hardware convertibili, come se ne sono visti nei video nelle settimane e mesi scorsi: ultrabook che diventano tablet e viceversa, monitor da desktop in grado di inclinarsi fino a diventare (quasi) orizzontali e quindi, di fatto, grossi tablet, etc. etc.
  2. Con questa mossa Microsoft vuole colpire i consumer, e rubare fette di mercato ovviamente ad Apple con il suo iPad, ma anche ad Android, Amazon con il suo Kindle Fire, etc. etc. Perchè per la prima volta affronta seriamente il problema di andare ben oltre il classico pc da scrivania, ma offre la possibilità di creare nuovi prodotti che prima erano alla mercé di altri
  3. Per me un device è “tablet” se lo si usa per la stra-grande-maggior parte del tempo con le dita. E se, soprattutto, il sistema operativo che monta è esclusivamente studiato per essere utilizzato con le dita. Un iPad possiamo utilizzarlo con una tastiera bluetooth, ma alla fine vi ritroverete sempre ad usarlo con le dita, per ogni tipo di operazione, anche la più semplice. Morale: Surface RT non è un tablet.

Detto questo, voglio precisare una cosa. Tutti i ragionamenti successivi non si applicano ai noi professionisti, a noi developer, a noi sistemisti, a noi programmatori, etc. etc. Si applicano ai consumer, come siamo noi stessi quando stacchiamo dal lavoro.

Detto questo: per quello che mi riguarda, per il consumer medio è adattissimo un device come Surface RT. Credo che possa sostituire perfettamente un tablet ed un pc contemporaneamente. Consideriamo per un attimo l’utilizzo medio di un consumer:

  • ascolta musica, guarda video
  • guarda Facebook
  • scarica le foto dalla macchina fotografica e le pubblica sui social network
  • riceve e scrive e-mail
  • forse videogioca un po’
  • compila moduli web (si iscrive ai siti, fa acquisti, etc. etc.)
  • e molto, molto, molto altro ancora

Ora, prendiamo in considerazione l’iPad. E’ davvero molto difficile che si riescano a portare a termine tutte queste operazioni nel modo più congeniale. Su musica & video non discuto, ma per tutte le altre. Provate a scrivere una mail, sia con la tastiera virtuale che con quella eventuale fisica: prima o poi, senza mouse, dovrete usare le dita per andare a puntare una frase precedente o successiva, per correggerla. Provate a compilare un modulo Web, di qualsiasi tipo: molto più comodo utilizzare tastiera & mouse. Sono davvero molte, molte, molte le occasioni in cui vorrei tastiera & mouse su iPad, molte più di quelle che pensavo. E difatti una tastiera BT l’ho presa, poco utilizzata perchè alla fine l’OS è studiato per essere touch. Il fatto è che iPad è pensato per essere un device da affiancare ad un pc tradizionale: nessuno si sognerebbe mai di avere in casa un iPad e basta, perchè è volutamente limitato, prima di tutto nell’offerta delle app. Ok, ce ne saranno milioni e miliardi, ma sono tutte app apposta per iPad, studiate per il touch.

Io mi sento di dire, insomma, che per l’utente medio, Surface RT è in grado di sostituire senza problemi un notebook. Poco conta che non ci sia il desktop. A cosa serve il desktop? Office 2013 c’è. E se manca, cosa manca davvero all’utente finale medio? Lui vuole Facebook, vuole un gioco, i social network, navigare sul Web. E se il mercato delle app Metro, chiamiamolo così, cresce, avrà tutto ciò che serve.

Per questo dico che se il prezzo di Surface RT, supponiamo, fosse di 599 euro, non va considerato come il prezzo di un misero tablet come iPad, ma quasi messo a confronto con il prezzo di un pc. Perchè iPad è solo un tablet con sue app dedicate, mentre Surface (anche solo RT) è un PC. Perchè per me “pc” non sta ad indicare che c’è il desktop o chissà cosa, ma è soprattutto una questione di usability. Se sono sul letto con Surface, a navigare, ed improvvisamente devo scrivere una mail urgente, vado alla scrivania e usando lo stesso dispositivo, attacco tastiera & mouse e diventa un pc in tutto e per tutto. Fatelo con un iPad: impossibile! Idem per i videogiochi: grazie ai tablet e ad iPad sono rinate tante belle idee sui videogiochi (bloccando un po’ la rincorsa alla grafica più sfrenata), ma tornando indietro al concept ed al gameplay semplice, casual ed efficace. una cosa odio davvero: il joystick virtuale, sullo schermo, che è proprio inusabile. Inusabile. Inusabile. E’ solo un pagliativo per far credere a noi gamer che spostando le dita sullo schermo come se ci fosse un joypad sia una cosa bella e figa. Inusabile.

Con Surface questo problema non sussiste: sono assolutamente convinto che fra un po’ le software-house di videogiochi afferreranno la grande opportunità di fare videogiochi capaci di sfruttare l’ambiente Windows 8, e quindi fare videogame che supportano tastiera/mouse/touch/giroscopi/gps/etc. etc. Ma non solo: per tutti i motivi già detti, potremo anche switchare da una usability all’altra, in base a come decidiamo di usare il device in un dato momento.

Insomma, 600 euro per un iPad sono una cosa. 600 euro per un Surface RT sono molto meglio. Tecnicamente parlando, come sempre. Sono prevalentemente un tecnico, e non sto dicendo da che parte andrà il mercato, niente affatto. Sto dicendo che con Surface RT le possibilità di utilizzo sono molte, molte, molte, molte di più. Mail, Evernote, ovunque ci sia da scrivere un po’…con la tastiera fisica è meglio.

Concludo dicendo che ci sarebbe molto altro da dire. Preciso una cosa: mi auto-escludo da questo mio pensiero. Non mi considero un utente medio, e spendere quei soldi per un device comunque limitato non mi sembra l’ideale. Le mie esigenze sono altre. Punterò direttamente a Surface Pro, che invece sarà un vero ultrabook convertibile.

Send to Kindle
Software

Toast volant, Tile manent

Parlando di Windows Phone, fondamentalmente sono due i tipi di notifica supportati: le Toast e le Tile.

La notifica di tipo toast è in pratico un piccolo banner che appare per qualche secondo lungo il lato superiore dello schermo: esso riporta l’icona dell’app che ha ricevuto quella notifica, ed un breve testo informativo sulla notifica stessa. E’ in pratica ciò che vedete quando ricevete un SMS. Il testo ovviamente dipende dall’app, e può contenere una mention che arriva da Twitter, una nuova medaglia vinta alle Olimpiadi, etc. etc.

La tile invece è la tile dell’app che avete posizionato sulla Start Page. Se l’app lo prevede (ad esempio quella di WhatsApp) la tile viene aggiornata in modo silenzioso. WhatsApp vi mette un numerino che vi dice quanti messaggi avete ricevuto. Le app di previsioni del tempo aggiornano la tile dicendovi la temperatura corrente, Foursquare su richiesta può mostrarvi la classifica corrente, Facebook vi dice le notifiche, etc. etc.

La tile ha un enorme vantaggio rispetto alla toast, che secondo me è ben riassunto dal titolo. Se nel momento in cui ricevete una notifica di tipo toast non avete lo smartphone a portata di mano, sotto’occhio, molto probabilmente ve la perderete. Il display si accende, visualizza il toast, e poi si spegne. Non ne rimane traccia. Toast volant, insomma. La tile invece si aggiorna e rimane lì dov’è. Quindi se lasciate il telefono per due ore, quando lo riprendete in mano vedete le varie tile aggiornate. Che poi è la stessa cosa che accade con gli SMS, le telefonate perse, etc. etc. Tile manent.

Per questo io consiglio a tutti voi di implementare sempre le notifiche di tipo tile. Dal punto di vista sviluppatore, se avete messo in piedi tutta l’infrastruttura per inviare notifiche alla vostra app, cambiare da toast a tile è poca cosa. E’ solo questione di formattare in modo corretto il messaggio, cambiando l’XML e qualche altro parametro. Dal punto di vista utente…lui non le perde mai e probabilmente consumano meno (lo schermo non si accende, e non c’è alcun suono).

Ultima cosa, ma questa è più che altro un suggerimento a Microsoft: secondo me, se un’app richiede in modo importante che la sua tile sia pinnata sulla Start Page, deve essere indicato in modo forte all’utente. Addirittura, sono quasi dell’idea che la tile deve pinnarsi automaticamente sulla Start Page, esattamente come in Windows l’icona viene messa sul desktop. Immaginate il già citato WhatsApp: lo installate, ma se non mettete la tile sulla Start Page non riuscirete mai a capire quando ricevete qualcosa oppure no. Siete costretti ad aprire l’app ogni tanto, giusto per controllare. Non è accettabile, si perde il concetto di notifica, ma è più un polling da parte nostra. WhatsApp richiede che la tile sia sulla Start Page: perchè a questo punto non metterla automaticamente. O magari fare una domanda all’utente proponendogli di mettere la tile?

Send to Kindle
.NET World

Utilizzare servizi WCF con callback al chiamante da app Windows 8

Introduzione
Utilizzare un servizio WCF mi è diventato così istintivo in tutte le cose che faccio che francamente non riesco più a farne a meno. Non sto qui ad elencare i vantaggi e a discutere le varie tecniche, perchè prima di tutto non ne ho le competenze (rischierei di usare termini non corretti), per cui vado diretto al succo di questo post.

Generalmente, dal punto di vista client (quindi un’applicazione WPF, un’app Windows Forms o Windows Phone, un’applicazione ASP.NET MVC, etc. etc.) un servizio WCF è un servizio al quale forniamo dati, compie elaborazioni e restituisce qualcosa. Questo avviene con chiamate a metodi esposte dal servizio tramite un contratto (un’interfaccia IQualcosa), grazie al quale noi sappiamo come comunicare, cosa passare e cosa ci aspettiamo come valori di ritorno. Questo tipo di approccio non presenta nessun tipo di problema (in realtà ce ne sono una valanga, sicurezza in primis, ma sorvoliamo): una volta che il servizio è stato esposto via http, è sufficiente aggiungerlo al nostro progetto corrente tramite il comando “Add Service Reference”. Sul nostro client viene creata una classe proxy da utilizzare per effettuare le chiamate.

Quello che succede in uno scenario di questo tipo è che il client, indipendentemente dal tipo, invoca il servizio WCF. Quest’ultimo lavora un po’ e poi restituisce i dati al client. Semplice, almeno concettualmente.

Quello su cui ho lavorato per una giornata intera è invece lo scenario seguente:

  • applicazione Windows 8 Metro-style, scritta in C#
  • servizio WCF in ascolto su http://localhost:1976
  • il servizio WCF non solo espone dei metodi che vengono invocati dall’applicazione, ma è in grado – tramite callback ed un canale di comunicazione duplex, di invocare un metodo definito sul client

Il servizio WCF, quindi, ha diverse particolarità:

  • si deve memorizzare da qualche parte il “chiamante”
  • deve definire non solo un contratto col quale dialogare con il client, ma anche un contratto di callback. Quest’ultimo definisce il/i metodi da invocare sul client

Arriviamo al sodo, vediamo un po’ di codice.

Codice Server Side
Implementiamo un servizio che prende in input un ExecuteRequest e restituisce, prima o poi, un ExecuteResponse.

[DataContract]
public class ExecuteRequest
{
    [DataMember]
    public int Value { get; set; }
}

[DataContract]
public class ExecuteResponse
{
    [DataMember]
    public int Value { get; set; }
}

 

Ho scritto “prima o poi” perchè supponiamo che l’esecuzione server-side sia piuttosto lunga; quindi, NON facciamo un metodo simile a questo:

[ServiceContract]
public interface IExecuteService
{
    [OperationContract]
    ExecuteResponse Execute(ExecuteRequest value);
}

 

bensì facciamo come segue:

[ServiceContract(CallbackContract = typeof(IExecuteServiceCallback))]
public interface IExecuteService
{
    [OperationContract]
    void Execute(ExecuteRequest value);
}

 

Invochiamo il metodo Execute passandogli un ExecuteRequest, che restituisce void. Il servizio WCF lavora, lavora, lavora, e prima o poi chiamerà la callback per informarci del risultato. La funzione di callback è indicato all’interno dell’attributo ServiceContract, ed è IExecuteServiceCallback.

public interface IExecuteServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void ExecuteTerminated(ExecuteResponse response);
}

 

L’implementazione del servizio è piuttosto semplice:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ExecuteService : IExecuteService
{
    private ExecuteRequest Request;
    private ExecuteResponse Response = new ExecuteResponse();
    private IExecuteServiceCallback Callback;

    public void Execute(ExecuteRequest value)
    {
        this.Callback = OperationContext.Current.GetCallbackChannel<IExecuteServiceCallback>();
        this.Request = value;

        Timer timer = new Timer(10000);
        timer.Elapsed += (s, e) =>
            {
                timer.Stop();

                this.Response.Value = this.Request.Value * 3;
                this.Callback.ExecuteTerminated(this.Response);
            };
        timer.Start();
    }
}

 

Quando il cliente invoca il metodo Execute esposto dal servizio, accade che:

  • il servizio si memorizza chi è il chiamante e predispone la callback
  • al client restituisce un void

A solo scopo di test, parte un timer che fa aspettare il client 10 secondi, al termine dei quali viene invocata la callback sul client con il risultato dell’operazione. Praticamente, ciò che accade è che il client invoca il metodo passando un numero intero, ed il servizio restituisce il doppio di tale numero. Ripeto: è solo a scopo di test, si presuppone che un processore moderno si metta un po’ meno a calcolare il doppio di un numero!

Sorriso

Un pezzetto di web.config

C’è qualche accorgimento da apportare anche nel web.config. L’endpoint deve essere di tipo netHttpBinding. Come recita MSDN all’indirizzo http://msdn.microsoft.com/en-us/library/hh674273.aspx, infatti:

NetHttpBinding is a binding designed for consuming HTTP or WebSocket services and uses binary encoding by default. NetHttpBinding will detect whether it is used with a request-reply contract or duplex contract and change its behavior to match – it will use HTTP for request-reply contracts and WebSockets for duplex contracts.

Riporto qui sotto la parte più significativa del web.config:

<system.serviceModel>
    <services>
      <service name="WcfCallbackSample.ExecuteService"
            behaviorConfiguration="bev1">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1000/Service" />
          </baseAddresses>
        </host>
        <endpoint name="duplexendpoint" address=""
            binding="netHttpBinding"
            contract="WcfCallbackSample.IExecuteService" />
        <endpoint name="MetaDataTcpEndpoint" address="mex"
        binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="bev1">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
    multipleSiteBindingsEnabled="true" />
</system.serviceModel>

 

Ovviamente alcuni valori, attributi e nodi XML dipendono dal vostro servizio.

Client Side con un’applicazione Metro per Windows 8

Ok, abbiamo quasi finito. Adesso arriva il bello, ovvero usare il nostro servizio dal client. Dopo averlo aggiunto nei service reference, ci verrebbe istintivo utilizzare la classe client proxy che ci è stata auto-generata. No. Falso. Nada. Fermi tutti.

Innanzitutto con Visual Studio 2012 creiamo una nuova Blank app, sotto la categoria Windows Store.

Dentro troveremo un’unica Page, nel cui costruttore metteremo:

EndpointAddress address = new EndpointAddress("http://localhost:1924/ExecuteService.svc");
var binding = new NetHttpBinding();
var cf = new DuplexChannelFactory<IExecuteService>(new InstanceContext(this), binding, address);
service = cf.CreateChannel();

 

L’oggetto service, definito come private della Page, è di tipo IExecuteService, ed è grazie a questo che potremo utilizzare il nostro servizio.

A questo punto aggiungiamo un Button nello Xaml, gestiamo l’evento Click, e nel code-behind inseriamo:

service.ExecuteAsync(new ExecuteRequest() { Value = 4 });

 

Proviamo ad eseguire l’app: è Metro-style, per cui come sappiamo che gira in full-screen. Clicchiamo sul Button. Non accade nulla. Ed è perfettamente normale, pensiamoci bene. La chiamata a Execute (che avviene in async) restituisce void. Cosa manca? Non abbiamo la callback, ovvero quel meccanismo che il server adotta per avvisarci quando lui ha terminato il calcolo. Morale: la Page deve implementare l’interfaccia di callback.

public sealed partial class MainPage : Page, IExecuteServiceCallback
{
    public async void ExecuteTerminated(ExecuteResponse response)
    {
        MessageDialog dialog = new MessageDialog(response.Value.ToString());
        await dialog.ShowAsync();
    }
}

 

Il timer, istanziato ed in esecuzione lato server, invoca la callback chiamando il metodo ExecuteTerminated sul client, e quindi apparirà la nostra MessageDialog con il risultato dell’operazione.

In ottica Model-View-ViewModel

In ottica MVVM, ovviamente, non sarà direttamente la Page ad implementare l’interfaccia IExecuteServiceCallback, ma la classe View Model che governa quella view. Il View Model gestisce la callback, lavorerà sulle proprie proprietà pubbliche per aggiornare la view.

Send to Kindle