ComputerLand

Tu sei qui: Articoli MSDN

Notizie dal web

Guest post: Azure e Hadoop: HDP incontra HDInsight #AzureOpenDay

E-mail Stampa PDF


Questo articolo è stato scritto da
Andrea D’Orio, co-founder e CTO di Ecube, architetto certificato Hortonworks di soluzioni Hadoop 1.x e 2.x e primo docente italiano della Hortonworks University

Uno dei pochi assunti ancora validi è che le vie dell'informatica sono infinite. E' infatti quantomeno singolare che, dopo 25 anni di esperienza nel mondo Microsoft e dopo aver passato gli ultimi 5 nel vortice della gestione dei dati e dell'ecosistema Hadoop, mi ritrovi a parlare di creare ambienti ibridi on-premises / on-cloud sfruttando il meglio di Azure e della Hortonworks Data Platform in un ambito prettamente open source.

Ma facciamo un passo indietro.

Hadoop vede la luce a fine del 2004 e, dopo essere stato adottato da Yahoo, nel 2008 è pronto a spiccare sotto l'ala protettrice dell'Apache Foundation. L'adozione da parte delle più grandi società informatiche del mondo è quasi un passaggio obbligato.

Hortonworks nasce a giugno del 2011 con l'obiettivo di introdurre sul mercato la prima distribuzione veramente fully open source di Hadoop e di supportarla con servizi di assistenza e formazione. Un obiettivo quantomeno ambizioso il cui successo coglie di sorpresa l'intera comunità informatica: a dicembre 2013 Hortonworks ha più di 300 clienti con un ritmo di 75 nuovi customers ogni quarter. A gennaio 2014 viene indicata da Forrester come leader nelle soluzioni Hadoop Big Data e un anno dopo si quota in borsa con una capitalizzazione di 1 miliardo di dollari.

clip_image002

Tutto questo cosa centra con Microsoft?

I rapporti tra Microsoft e Hortonworks sono molto più stretti di quanto si possa pensare: la soluzione HDInsight di Microsoft è a tutti gli effetti il porting della Hortonworks Data Platform su Azure fortemente voluto e supportato da entrambe le società. E non solo: la Hortonworks Data Platform è l'unica distribuzione Hadoop a funzionare su ambienti Windows. Questo significa che Microsoft non solo crede fortemente in questa sinergia ma che ha basato l'intera sua strategia Big Data su HDP, posizionando la piattaforma Hortonworks al centro di un ecosistema complesso composto da strumenti tradizionali quali Microsoft SQL Server 2014, Windows Server 2012 R2, Office e Power BI e strumenti innovativi quali Azure Events Hub, Azure Data Factory, Azure Machine Learning e DocumentDB fino ad arrivare alla Microsoft Analytics Platform System.

Una strategia mirata a rendere fruibili le offerte on-premises e on-cloud in una soluzione ibrida ad alto valore aggiunto per l'utente finale.

Cosa è Hadoop?

Hadoop è un insieme di elementi che definiscono sinergicamente un sistema complesso in grado di immagazzinare ed elaborare in modo parallelo e distribuito un'enorme quantità di dati. Il file system distribuito di Hadoop si chiama HDFS (Hadoop Distributed File System) mentre il "sistema operativo di Hadoop" si chiama YARN (Yet Another Resource Negotiator). Sopra questi due layer agiscono tutti gli elementi dell'ecosistema (es: sistemi SQL on Hadoop, database NoSQL, framework in-memory come Spark, algoritmi di machine learning o job MapReduce). Hadoop può scalare virtualmente all'infinito (nell'ordine delle decine e centinaia di migliaia di nodi) e può gestire qualsiasi tipologia di dato, sia esso strutturato o meno. Inoltre Hadoop propone l'approccio rivoluzionario dello schema-on-read: è quindi possibile ridurre enormemente il tempo di acquisizione del dato costruendo uno schema solo in fase di lettura.

L'ultima buona notizia, ma non certo meno importante, è che Hadoop viene implementato su commodity hardware: non sono quindi necessari investimenti enormi per implementare un cluster per la gestione di centinaia di terabyte. Inoltre il costo a singolo terabyte raw è secondo solo a quello del cloud e di ordini di grandezza inferiore ai sistemi enterprise tradizionali quali NAS, MPP e SAN (secondo Juergen Urbanski, Board Member di Big Data & Analytics BITKOM, Hadoop fornisce uno storage scalabile a un costo del 5% rispetto alle altre alternative).

Il Data Lake

In generale il primo obiettivo di un cluster Hadoop è quello di create un Data Lake, cioè un'enorme contenitore di informazioni di tipo eterogeneo dal quale estrarre valore. Le potenzialità di un Data Lake sono molteplici: innanzitutto consente operazioni su larga scala e abilita gli utenti a esplorare, raffinare e arricchire i dati. Tutte le operazioni all'interno del Data Lake possono essere di tipo batch, interattivo o in real-time. In ultima analisi il Data Lake rappresenta la soluzione più efficace ed efficiente per trasformare i dati in valore per il business.

All'interno del Data Lake è possibile istanziare, sia internamente ad Hadoop sia esternamente utilizzando gli strumenti di ETL disponibili, Data WareHouse alimentati da subset di dati presenti su HDFS e dagli stessi DWH è possibile creare numerosi Data Mart con scopi ancora più specifici.

Le potenzialità del Data Lake non si fermano qui: è inoltre possibile abilitare utenti a effettuare Deep Learning o Data Exploration consentendo loro di "scoprire" nuove correlazioni e relazioni capaci di estrarre valore dai dati. I classici algoritmi di machine learning e predictive analytics sono tanto più precisi quanto è ampio il dataset sul quale vengono tarati. Sorprendentemente il Data Lake è il repository all'interno del quale le aziende stanno trovando nuove tipologie di correlazioni dalle quali estrarre valore: questo fenomeno è spiegabile con il fatto che prima non era possibile concentrare questo volume di dati all'interno di un unico strumento senza investimenti eccezionalmente consistenti.

Hortonworks e Microsoft per le soluzioni ibride

Se il valore aggiunto di una soluzione on-premises è ora chiaro, si può intuire quanto sia preziosa la possibilità di estendere il proprio cluster Hadoop con il servizio on-cloud HDInsight. Tralasciando il fondamentale utilizzo di HDInsight per la realizzazione di PoC o cluster di sviluppo, riducendo i tempi di deployment in modo drastico, la possibilità di espandere on-demand la capacità elaborativa del proprio cluster on-premises (bursting) aggiungendo fino a 32 nodi di HDInsight rappresenta un valore aggiunto importante.

clip_image004

In questo contesto l'esecuzione di "commoditized queries", cioè query la cui esecuzione non sarebbe economicamente conveniente in modalità on-premises ma che invece diventa estremamente vantaggiosa on-cloud, è solo uno dei possibili contesti operativi. E' infatti possibile utilizzare HDInsight (o quantomeno i Blob Storage di Azure) per archiviare ed effettuare operazioni di backup dei dati presenti on-premises: questa procedura, in unione con la precedente, riduce ulteriormente i tempi di "attivazione" della modalità ibrida avvicinando il momento di estrazione del valore dai propri dati. Una pratica ormai consolidata consiste nell'utilizzare uno o più Blob Storage posizionati all'interno di un account di archiviazione Azure per effettuare il salvataggio dei dati: quando si manifesta la necessità di istanziare un cluster HDInsight in modalità bursting sarà sufficiente agganciarlo all'account esistente per avere già i dati a disposizione.

Movimentazione dei dati

Se può sembrare complesso lo scenario dal punto di vista descrittivo tutt'altro appare dal punto di vista tecnico. Presupponendo la disponibilità di un cluster on-premises HDP, in versione 2.1 o 2.2, sarà sufficiente avere a disposizione un cluster HDInsight con un Blob Storage collegato. A questo punto l'unica operazione da compiere all'interno del cluster on-premises sarà l'aggiunta di una proprietà tramite Ambari, lo strumento di provisioning, configurazione e monitoraggio di HDP

fs.azure.account.key.<nomeblob>.blob.core.windows.net

al file di configurazione di HDFS inserendone come valore la chiave di accesso in lettura e scrittura al Blob Storage con il quale è stato istanziato il cluster HDInsight su Azure. Una volta fatto questo sarà possibile accedere in lettura e scrittura al cluster su Azure mediante il protocollo wasb secondo la sintassi

wasb://<nomecontainer>@<nomeblob>.blob.core.windows.net/

Istanziando lo storage on-cloud in questa modalità sarà possibile spostare dati verso il cloud con gli strumenti tipici di Hadoop (es: distcp), sfruttandone le caratteristiche che lo contraddistinguono: elaborazione distribuita sui singoli nodi e scalabilità. Un esempio di comando è il seguente:

hadoop distcp /tmp wasb://<nomecontainer>@<nomeblob>.blob.core.windows.net/

che provvederà a copiare l'intero contenuto della cartella /tmp su HDFS all'interno del container indicato.

Lo scenario tipico di utilizzo è rappresentato dalla necessità di eseguire elaborazioni sui propri dati che non è possibile implementare on-premises senza acquistare ulteriori nodi fisici. Istanziare un numero di nodi adeguato per il tempo necessario a ottenere il risultato nel più breve tempo possibile è il secondo passo. L'ultimo sarà quello di trasferire il risultato on-premises ed effettuare il de-provisioning del cluster HDInsight. Il tempo impiegato per la movimentazione dei dati verso HDInsight è solo una minima frazione di quello che sarebbe stato necessario eseguendo la query on-premises. In più il cluster HDP può continuare a operare senza interruzioni durante l'intera procedura.

Conclusioni

Una delle lezioni più importanti che ho imparato nel corso di questi anni è l'assoluta necessità di utilizzare gli strumenti informatici in modo corretto e all'interno del contesto idoneo al fine di raggiungere il miglior risultato possibile. Grazie a Microsoft e Hortonworks questo è oggi possibile: la Hortonworks Data Platform (HDP) è oggi la distribuzione fully open source più completa sul mercato e il servizio on-cloud HDInsight ne è il suo naturale complemento. L'adozione di entrambe le tecnologie può consentire non solo di raggiungere il risultato voluto nel più breve tempo possibile ma permette di estrarre valore dai propri dati in modo più veloce ed efficiente.

 

Andrea D’Orio


read full article

Guest post: Introduzione al Microsoft Band SDK

E-mail Stampa PDF

Questo post è stato scritto da Matteo Tumiati, MVP Windows Platform Development, e Giancarlo Lelli, Software Developer in iCubed srl.

Lo scorso ottobre Microsoft ha presentato, cogliendo un po’ tutti di sorpresa, il Microsoft Band, uno smartband che segna l’ingresso di Microsoft nel mondo dei wearable.

Il Microsoft Band è un device che, una volta indossato al polso, ci permette di avere accesso a circa 10 sensori che raccolgono una quantità importante di informazioni che vengono poi elaborate dal servizio Microsoft Health. Oltre ai sensori, abbiamo accesso anche alle notifiche attraverso le applicazioni del calendario, del meteo, delle mail e dei messaggi. Non per ultimo dobbiamo ricordare che abbiamo completo supporto per Cortana, ovvero potremo avviare la nostra assistente personale direttamente dal Microsoft Band, avviare un comando e vedere come questo verrà eseguito sul nostro device.

L’SDK per il Microsoft Band è stato rilasciato da pochi giorni e ci dà l’accesso a ben 8 dei 10 sensori che sono installati sul device ed inoltre questo SDK è disponibile per Android, iOS e ovviamente Windows Phone. Da pochissime ore invece è ufficiale anche il rilascio come componente di Xamarin.

I sensori disponibili sul Microsoft Band sono i seguenti:

Sensore

Descrizione

Accelerometro

Fornisce le coordinate X, Y, Z di accelerazione in metri per secondo quadro.

Giroscopio

Fornisce le coordinate X, Y, Z di velocità angolare in gradi al secondo.

Distanza

Fornisce la distanza totale in centimetri, velocita attuale in centimetri al secondo, la modalità di spostamento (corsa, camminata) e l’andatura in millisecondi al metro.

Battito cardiaco

Fornisce il numero di battiti al minuto, inoltre indica se il sensore è in sync perfetto con il battito cardiaco di chi lo indossa.

Pedometro

Fornisce il numero di passi che l’indossatore ha fatto.

Temperatura della pelle

Fornisce la temperature attuale della pelle dell’indossatore in gradi Celsius. Da notare che la temperatura è quella esterna (non la stessa di quella che usiamo per misurarci la febbre).

UV

Fornisce l’intensità di esposizione ai raggi UV.

Contatto fisico

Permette allo sviluppatore di capire se il dispositivo è attualmente indossato.

Installazione dell’SDK

Per leggere i dati dei sensori, la prima cosa che dobbiamo fare è creare una nuova applicazione Windows Phone da Visual Studio 2013, andare su NuGet ed installare il pacchetto Microsoft.Band. Da notare che questo pacchetto è una preview, quindi ricordatevi di abilitare le pre-release (-Pre se andate dalla console).

clip_image002

L’SDK scaricato dovrebbe abilitare in automatico la capability sul Bluetooth RFComm: per verificarlo basta aprire come XML il file package.appxmanifest e controllare che ci siano queste stringhe:

<DeviceCapability Name="bluetooth.rfcomm" xmlns="http://schemas.microsoft.com/appx/2013/manifest">

<Device Id="any">

<Function Type="serviceId:A502CA9A-2BA5-413C-A4E0-13804E47B38F" />

<Function Type="serviceId:C742E1A2-6320-5ABC-9643-D206C677E580" />

</Device>

</DeviceCapability>

Una volta completato questo passaggio andremo ad abilitare anche la capability della Proximity e saremo quindi pronti a scrivere il vero codice.

Lettura dei sensori

La prima cosa che dobbiamo fare adesso è capire se il Band è connesso. Ci basterà usare questa riga:

IBandInfo[] pairedBands = await BandClientManager.Instance.GetBandsAsync();

All’interno di pairedBands avremo l’elenco dei Microsoft Band collegati. Chiaramente se il numero di elementi contenuti in questo array è zero, allora non avremo nessun device connesso, altrimenti dovremo scegliere a quale device connetterci attraverso questa riga (al posto di 0 ci va il device scelto):

IBandClient bandClient = await BandClientManager.Instance.ConnectAsync(pairedBands[0]);

Una volta ottenuto il Band del quale vogliamo leggere i valori dei sensori citati sopra, ci basterà registrarci agli EventHandler dei vari sensori per iniziare a ricevere i dati:

bandClient.SensorManager.Accelerometer.ReadingChanged += Accelerometer_ReadingChanged;

await bandClient.SensorManager.Accelerometer.StartReadingsAsync();

In questo caso ci siamo registrati all’accelerometro e abbiamo creato un metodo Accelerometer_ReadingChanged che, ad esempio, mostrerà a video i dati ricevuti:

private async void Accelerometer_ReadingChanged(object sender, BandSensorReadingEventArgs<IBandAccelerometerReading> e)

{

IBandAccelerometerReading accel = e.SensorReading;

Debug.WriteLine(accel.AccelerationX + ", " + accel.AccelerationY + ", " + accel.AccelerationZ);

}

Allo stesso modo, possiamo collegarci ad uno qualsiasi dei sensori che abbiamo elencato in precedenza.

N.B.: poiché questo SDK è una preview, possiamo testare l’applicazione solamente dal device e non sugli emulatori di Windows Phone già installati con Visual Studio. Sempre perché è una preview, è bene inserire tutto il codice elencato sopra in blocchi try-catch, che abbiamo evitato per semplificare la lettura del codice, ed inoltre lo stesso SDK potrebbe cambiare in vista del rilascio ufficiale.

In conclusione

Volendo è anche possibile leggere i valori delle versioni del firmware del Band, cambiare il tema, oppure creare una tile direttamente sul device per la nostra applicazione (attenzione: non stiamo ancora parlando di applicazioni ad hoc per il Band) che verrà usata solamente per mostrare le notifiche (di tipo messaggio o finestra di dialogo) o per mandare avvisi attraverso le vibrazioni (si può scegliere tra 9 differenti vibrazioni).

Per un maggiore approfondimento su questo SDK per il Microsoft Band vi invitiamo a leggere l’articolo completo pubblicato su ASPItalia.com e vi ricordiamo anche che terremo una sessione ai CommunityDays.


read full article

I BizSpark Camp. Cosa sono, come funzionano e come trarne il massimo vantaggio

E-mail Stampa PDF

Ripartendo dal mio precedente blog post sul programma BizSpark approfondiamo il format e i contenuti tecnici esclusivi che si possono ottenere partecipando ai camp di BizSpark. 
Innanzitutto i camp che eroghiamo in Italia sono di due tipi: BizSpark Camp e BizSpark IT Camp entrambi focalizzati sul cloud e sulle architetture distribuite (mobile & IoT comprese).

Nonostante i nomi siamo molto simili stiamo parlando di due camp molto diversi tra loro per format e finalità. Infatti i BizSpark Camp sono maggiormente focalizzati sulle tematiche di sviluppo di applicazioni mobile e/o web che vogliono sfruttare i paradigmi del cloud computing ed hanno un format più vicino alla consulenza progettuale. Al contrario i BizSpark IT Camp sono degli hands-on lab per approfondire  alcuni aspetti molto tecnici della piattaforma Microsoft Azure ed hanno un format più tradizionale di laboratorio.

 image

Ma vediamoli più da vicino…

BizSpark CAMP

I BizSpark Camp sono eventi esclusivi di un giorno per un massimo di 12-15 startup registrate nel programma. Lo scopo di questi incontri è duplice: da un lato spiegare come sia possibile sfruttare la piattaforma Azure per sviluppare la propria idea di business e dall’altro discutere la propria idea direttamente con tecnici Microsoft specializzati nelle architetture distribuite per avere un primo feedback su come sia possibile disegnarla in ambito cloud!

Infatti il formato della giornata è il seguente:image

La mattina è dedicata ad una brevissima overview di Azure (con qualche facile esercizio per provare la piattaforma) e una breve analisi dei diversi modelli di business che possono essere implementati sfruttando le caratteristiche del Cloud Computing.

Il pomeriggio invece è completamente dedicato alla discussione architetturale dei progetti dei team presenti (questo è il motivo per cui non accettiamo più di 12-15 team per volta). Ogni team descrive la propria idea in termini di funzionalità e di stack tecnologico ed insieme vengono disegnate direttamente a video la o le possibili soluzioni tecniche che potrebbero essere implementate. E’ una discussione molto costruttiva perché i feedback e la partecipazione non è solo tra noi e la singola startup ma spesso è un confronto tra tutti i presenti, dove ognuno condivide la propria idea di soluzione.

A chi è rivolto?

La mattina questo camp è pensato per tutti i membri del team, sia business che tecnico. Infatti la prima parte non solo presenta Azure come una piattaforma tecnologica ma viene condivisa la nostra esperienza sui nuovi paradigmi e modelli di business che il cloud rende possibile per le aziende innovative.

Il pomeriggio invece è dedicato solamente alle persone tecniche della startup quali il CTO e i developer più esperti per poter sfruttare al meglio le discussioni architetturali e tecnologiche.

BizSpark IT CAMP

Mi piace sempre ricordare che i BizSpark IT Camp sono nati dai feedback dei partecipanti ai primi BizSpark Camp.
Infatti leggendo i feedback form dei camp e analizzando le discussioni post evento delle startup sul nostro forum “BizSpark Italy” (LinkedIn) ci siamo accorti che il BizSpark Camp rispondeva molto bene all’esigenza della prima definizione o del porting della propria soluzione sul cloud da un punto di vista di sviluppo software mentre copriva poco gli aspetti operativi sistemistici. Quindi, dopo una breve survey nel forum e un po’ di brainstorming da parte nostra, abbiamo creato questo nuovo seminario ad hoc che si concentra esclusivamente sugli aspetti più operativi e pratici nell’uso di Azure e spiega come sfruttare al massimo tutte le risorse messe a disposizione alle startup (e quindi sfruttare potenzialmente fino a 1200$ al mese di Azure). Ecco svelata la genesi di questo nuovo Camp! :-)

Quindi, dai feedback e dalle domande ricorrenti dei team abbiamo creato un camp di 1 giorno composto da 7 scenari comuni per le startup (e non solo):

  • LAB A: (IaaS) Iniziamo con i diversi modi di creare le macchine virtuali tramite: Azure Wizard, VM Depot, Powershell ed Azure CLI.
  • LAB B: (IaaS) Creiamo ambienti cross subscription per creare collegamenti diretti.
  • LAB C: (PaaS) Deployment e maintenance di una soluzione Cloud Service (CS) con un Web Role un Worker Role con comunicazione asincrona tramite code, uso del table storage e blob storage. Qui non guardiamo il codice (lo vediamo nel BizSpark Camp) ma ci focalizziamo sugli aspetti di deployment e di operations
  • LAB D: (PaaS) Alta affidabilità cross subscription, ovvero come bilanciare CS installati in diverse aree geografiche. Si proveranno diversi scenari di load balancing, round robin e performance.
  • LAB E: (IaaS) si riprende il lab B e si aggiungono subnet per creare diversi layer. Si installano nuove VM in alta affidabilità e si integra un DB in IaaS su un’altra subscription/subnet. Successivamente si analizzano come, con semplici modifiche ai file di configurazione di un’applicazione WEB di demo (PHP) deployata sulle VM, sia possibile  passare dal DB in IaaS ad Azure SQL Database (PaaS).
  • LAB F: Cross subscription tra WebSite e SQL Server/SQL Database
  • LAB G: Backup di dati e di VM

image

Come detto questo camp è un hands-on lab… e come tale contiene veramente pochissima teoria per focalizzarci esclusivamente sugli aspetti tecnici operativi.

A chi è rivolto?

Questo camp ovviamente è pensato solo ed esclusivamente per i CTO e i tecnici della startup! Sono 8 ore no stop (il mangiare lo forniamo noi ai tavoli mentre si lavora) dove ogni startup usa le proprie subscription per implementare tutti gli scenari mentre una persona Microsoft mostra a video in modalità step-by-step il laboratorio. Inoltre ci sono ulteriori due, tre tecnici Microsoft che sono a disposizione delle startup nel caso rimangano indietro o trovano delle difficoltà nello svolgimento. 

Come trarne il massimo beneficio

Come ormai penso sia chiaro i camp di BizSpark NON sono degli eventi divulgativi generici sul cloud ma piuttosto dei momenti di scambio di esperienza e di consulenza sulle principali architetture cloud con Azure. Come tali richiedono un po’ di lavoro preparatorio da svolgere prima della giornata del camp (il BizSpark Camp un po’di meno, il BizSpark IT Camp molto di più)!!

Per questo motivo provo a riassumere i mie personali consigli per usufruire al massimo i nostri camp:

  1. (per tutti i camp) iscriversi per tempo: Entrambi i camp richiedono dei check da parte nostra prima del camp. Inoltre arrivati al numero massimo di iscrizioni chiudiamo la possibilità di partecipare.
  2. (per tutti i camp) Allocare il giusto tempo per essere aiutati telefonicamente e prepararsi: Ad ogni iscrizione al camp si viene contattati telefonicamente per sapere se ci sono problemi o se si hanno dei dubbi nell’apertura delle subscription Azure. Please, dedicate il tempo necessario perché sarà ripagato durante la giornata del camp in quanto sarete operativi dal primo minuto!
  3. (BizSpark Camp) avere 1 slide della propria soluzione: è senza dubbio più incisivo parlare della vostra soluzione se c’è uno schema (1 slide di numero… non venite con un deck di 20 slide :-)) sul quale successivamente poter disegnare delle modifiche o dei riferimenti ad Azure.
  4. (BizSpark Camp) avere GIA’ aperta ALMENO una Azure Subscription per ogni partecipante: durante la mattina viene mostrato come si lavora con Azure con le macchine virtuali, i Website, i Cloud Services e i Mobile Services. Questa attività serve per prendere un minimo di confidenza con la piattaforma al fine di agevolare la discussione del pomeriggio. Se cercate di aprire le subscription di Azure durante il camp perdete più della metà degli esercizi!
  5. (BizSpark IT Camp) : avere GIA’ TUTTE le Azure Subscription aperte: Ricordo che con BizSpark si hanno a disposizione fino a 8 account Azure gratuiti per 3 anni e che questo camp ha l’obiettivo di far capire come distribuire la propria soluzione su più subscription per sfruttare tutti i crediti mensili (fino a 1.200$/mese). Quindi al BizSpark IT Camp se NON si hanno aperto ALMENO 5 o 6 subscription (meglio se tutte 8) è inutile partecipare perché non si riuscirà a fare più della metà dei laboratori e non c’è assolutamente tempo per aspettare la creazione di una o più subscription durante il camp! Quindi rimando al punto 2 :-)
  6. ah, quasi dimenticavo :-) portare sempre il proprio PC o MAC (sempre meglio ricordarlo :-))

Vi aspetto ai prossimi Camp di BizSpark :-)

M.


read full article

Guest post: Introduzione ai Visual Studio Tools for Apache Cordova

E-mail Stampa PDF

 

Questo post è stato scritto da Gabriele Gaggi, owner di Brain-sys s.r.l.clip_image002

E’ inutile negarlo. Se dovessimo scegliere due buzzword che rappresentino gli ultimi 5 anni di evoluzione del mondo dell’informatica la scelta probabilmente ricadrebbe su: HTML5 e Mobile. I dati riportarti da Mary Meeker nel suo rapporto annuale su internet per KPCB riportano cifre da capogiro relative alla crescita degli utenti che navigano con device mobili: è un trend che non può più essere ignorato.

HTML5 e CSS3 non hanno bisogno di presentazioni: sono il vero acceleratore del web dal 2012 ad oggi e hanno rivoluzionato l’approccio ad Internet sia per chi fornisce contenuti sia per chi ne fruisce.

L’approccio web al mobile

Fortunatamente da tempo i web designer tengono conto delle esigenze dei dispositivi mobili. Numerose sono le filosofie ed i framework che si sono fatti strada nel tentativo di semplificare la vita di chi si trova ogni giorno a combattere con decine (se non centinaia) di risoluzioni diverse, browser diversi e user agent a volte bizzarri. Wurfl, progetto open source fondato dall’italianissimo Luca Passani, riporta all’interno del suo database ben 22.218 diversi user agent (fonte: file XML versione 2.3.5 scaricato dal sito ufficiale).

Tra i framework più famosi è d’obbligo citare Bootstrap e jQuery mobile, che approcciano il sito web per dispositivo mobile con filosofie diametralmente opposte: il primo basandosi sul concetto di design responsivo (qui un interessante articolo di Katrien De Graeve), mentre il secondo sul concetto di sito dedicato ai dispositivi mobili (per scoprire come applicare questa tecnica con ASP.NET Microsoft ha prodotto un esaustivo “How to”).

Far fruttare il know-how web: Apache Cordova

Nel 2015 non esiste web designer che non si sia trovato ad affrontare la questione mobile, questione quindi ben nota a chi mastica quotidianamente HTML5 e CSS3. Ebbene, questi designer, potenzialmente, hanno già ora il know-how adatto per poter diventare sviluppatori di app mobile, e per far sì che le app da loro create possano essere pubblicate agevolmente sugli store delle diverse piattaforme.

clip_image004Nel lontano 2009 una fortunata azienda di nome Nitobi presentò un framework di sviluppo con questo semplice slogan: “PhoneGap Simplifies iPhone, Android, BlackBerry Development”. L’idea geniale fu di creare una sorta di web browser full screen, dove far girare applicazioni scritte utilizzando unicamente HTML5, CSS3 e Javascript, mettendo a disposizione di queste applicazioni delle API per l’interfacciamento al dispositivo. L’accoglienza fu positiva, ma non poteva non saltare all’occhio un problema legato alle performance: erano notevolmente ridotte rispetto a soluzioni native. Qualcuno però riuscì a guardare oltre e ad immaginare un futuro prossimo con web view ottimizzate e device più potenti. Quel futuro è ora, e quel progetto oggi ha un figlio open source dal nome Apache Cordova. Il momento è maturo per salire a bordo e far fruttare il proprio know-how web nell’ambito della produzione di applicazioni mobile.

Microsoft <3 Open Source

clip_image006Microsoft, ad inizio 2014 con il rilascio della update 2 di Visual Studio 2013, rilascia l’estensione per “Multi-Device Hybrid App Development”, estensione attualmente nota con il nome di “Visual Studio Tools for Apache Cordova” e giunta proprio in questi giorni alla versione CTP 3.1. La stessa viene inclusa di default nell’installazione di Visual Studio 2015 CTP 6. Questa estensione consente lo sviluppo di applicazioni Apache Cordova direttamente utilizzando Visual Studio: senza mai abbandonare l’ambiente di sviluppo che utilizziamo abitualmente, possiamo creare, debuggare e predisporre i pacchetti per la pubblicazione delle nostre applicazioni mobile. Tutto questo non è per nulla triviale, dato che l’estensione predispone per noi l’installazione e la configurazione dei numerosi elementi necessari per lo sviluppo completo con Apache Cordova.

Un esempio: la calcolatrice

Allo scopo di illustrare la semplicità e rapidità di sviluppo con i Visual Studio Tools for Apache Cordova proviamo insieme a creare la classica calcolatrice dotata delle 4 funzionalità di base (Il sorgente completo dell’esempio è scaricabile da https://github.com/gaggiga/CordovaDemo). Al fine di adattare automaticamente il layout alla risoluzione dei diversi dispositivi utilizzeremo il già citato framework bootstrap.

Per cominciare è necessario creare un nuovo progetto utilizzando l’apposito template presente nella sezione Javascript -> “Apache Cordova Apps”.

clip_image008

clip_image010

Creato il nuovo progetto possiamo subito notare la struttura molto semplice e decisamente simile a quella che siamo abituati a vedere in un sito web. Abbiamo una pagina index.html che rappresenta il punto di ingresso della nostra applicazione ed una struttura di cartelle contenente pochi file, tra cui il relativo foglio di stile ed il file Javascript index.js. Merita di essere menzionato il file config.xml, che attraverso un apposito editor presente in Visual Studio ci permette di configurare tutti i dettagli della nostra applicazione: display name, start page e molto altro; tra cui l’attivazione dei plugin di cui abbiamo bisogno per interagire con il dispositivo mobile. Non ci soffermiamo a lungo su questi dettagli, di cui esiste molta letteratura sul web (indispensabile la documentazione presente in MSDN), il nostro obiettivo ora è di dare alla luce la nostra prima applicazione ibrida multi device. La pagina index.html è una semplice pagina HTML5 senza nessuna particolarità. Questo dovrebbe farci sentire a nostro agio. Il template di default include nell’header il foglio di stile index.css, e prima della chiusura del tag body, come ormai è consuetudine, tre script Javascript: cordova.js, platformOverrides.js e index.js.

· Cordova.js è il riferimento al framework Cordova, file che viene aggiunto automaticamente in fase di build e che non è tra quelli presenti nella solution.

· PlatformOverrides è un meccanismo che ci consente di scrivere codice personalizzato per le diverse piattaforme di destinazione. In fase di build viene sostituito con il corrispondente file dedicato alla piattaforma per cui stiamo compilando che è presente nella cartella merges.

· Infine arriviamo a index.js che andrà a contenere il codice per la gestione della nostra pagina.

Includiamo Bootstrap

Per assicurarci un aspetto piacevole e la responsività della pagina alle diverse risoluzioni è conveniente appoggiarsi ad un framework a cui far fare il lavoro sporco. Nello specifico la nostra scelta ricade sul noto framework Bootstrap. Ma per non appesantire più del necessario la nostra applicazione andremo ad includere solo ciò che effettivamente ci serve: il foglio di stile.

Per fare questo andiamo sul sito ufficiale di Bootstrap e scarichiamo l’ultima versione. Dal file .zip estraiamo solo il file bootstrap.min.css e lo andiamo a posizionare all’interno della cartella css del nostro progetto.

Appena prima dell’inclusione del file di stile index.css andiamo quindi ad includere il file di Bootstrap:

<link rel="stylesheet" href="css/bootstrap.min.css">

Il nostro obiettivo è di creare una calcolatrice responsiva. Quindi dovremo far sì che graficamente la stessa occupi l’intera larghezza e altezza dello spazio riservato alla nostra app sullo schermo. A questo scopo inseriamo il seguente tag nell’header della pagina, tag che toglie all’utente la possibilità di ingrandire il contenuto della nostra calcolatrice.

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

Disegniamo il layout

clip_image012

L’aspetto che vogliamo ottenere è quello della classica calcolatrice che consente di gestire le 4 funzionalità di base. A lato possiamo vedere l’aspetto finale con evidenziate in rosso le 4 macro aree che dobbiamo predisporre all’interno della pagina html.

Come anticipato desideriamo che la nostra calcolatrice sfrutti tutto lo spazio a disposizione sia in orizzontale che in verticale. L’occupazione orizzontale ci viene fornita direttamente dal framework bootstrap con l’uso della classe “container-fluid” da utilizzare sull’elemento base della nostra struttura. Per quanto riguarda invece l’occupazione verticale dobbiamo inserire nel file index.css una nuova classe dove indicare l’occupazione al 100% dell’altezza.
La stessa regola dobbiamo applicarla sia al tag html che al tag body:

html, body, .fullHeight {

height:100%;

}

Cominciamo quindi a dividere la nostra pagina nelle 4 macro sezioni indicate in figura, avendo l’accortezza di aggiungere la classi container-fluid e fullHeight all’elemento contenitore principale e la classe bootstrap “row” ad ogni sezione in modo che queste vengano appunto trattate come righe di una ipotetica tabella.

<div class="container-fluid fullHeight">

<div class="row"></div>

<div class="row"></div>

<div class="row"></div>

<div class="row"></div>

</div>

Di seguito andiamo ad inserire in ogni macro sezione i diversi contenuti: un div dove riportare il risultato nella prima sezione e 4 pulsanti nella seconda. La terza e la quarta sezione vanno a loro volta divise in due sotto sezioni orizzontali per consentire lo sviluppo su due righe del pulsante a destra. La prima sotto sezione conterrà quindi due nuove righe, ognuna composta da 3 pulsanti e la seconda il solo pulsante di destra.

Utilizzando le classiche classi di bootstrap per la suddivisione in 12 colonne di ogni riga, questo è il codice che andremo ad ottenere.

<div class="container-fluid fullHeight">

<div class="row">

<div id="casella" class="col-xs-12">0.0</div>

</div>

<div class="row">

<button class="col-xs-3 btn btn-default">C</button>

<button class="col-xs-3 btn btn-default">&divide;</button>

<button class="col-xs-3 btn btn-default">&times;</button>

<button class="col-xs-3 btn btn-default">-</button>

</div>

<div class="row">

<div class="col-xs-9">

<div class="row">

<button class="col-xs-4 btn btn-default">7</button>

<button class="col-xs-4 btn btn-default">8</button>

<button class="col-xs-4 btn btn-default">9</button>

</div>

<div class="row">

<button class="col-xs-4 btn btn-default">4</button>

<button class="col-xs-4 btn btn-default">5</button>

<button class="col-xs-4 btn btn-default">6</button>

</div>

</div>

<button class="col-xs-3 btn btn-default">+</button>

</div>

<div class="row">

<div class="col-xs-9">

<div class="row">

<button class="col-xs-4 btn btn-default">1</button>

<button class="col-xs-4 btn btn-default">2</button>

<button class="col-xs-4 btn btn-default">3</button>

</div>

<div class="row">

<button class="col-xs-8 btn btn-default">0</button>

<button class="col-xs-4 btn btn-default">.</button>

</div>

</div>

<button class="col-xs-3 btn btn-default">=</button>

</div>

</div>

clip_image014

Ora possiamo compilare e visualizzare il risultato della nostra fatica. Per fare questo è necessario compilare selezionando dall’apposita combo nella toolbar principale una delle piattaforme supportate. Di default all’avvio viene selezionata la piattaforma Android, ma come possiamo vedere dall’immagine è possibile selezionare una qualunque delle altre piattaforme presenti. Un discorso a parte merita iOS, che, causa policy di Apple, richiede il possesso di un computer Mac per poter compilare e debuggare le app. Al seguente link è possibile trovare maggiori dettagli in merito: https://msdn.microsoft.com/en-us/library/dn771551.aspx

Una volta selezionata la piattaforma, nella combo alla sua sinistra, dobbiamo selezionare dove eseguire l’applicazione. Per quanto riguarda Android ed iOS è presente l’emulatore Ripple con le sue diverse configurazioni ma esiste anche la possibilità di utilizzare altri emulatori / simulatori ed addirittura di eseguire il codice direttamente su un device connesso al pc. Analoghe, ma con emulatori nativi, le soluzioni per Windows Phone e per Windows 8.1.

Fatte queste selezioni, per esempio Android e Ripple – Nexus (Galaxy), possiamo compilare ed eseguire il codice premendo il tasto F5 sulla tastiera. Il risultato che verrà mostrato non è troppo lontano dall’aspetto desiderato: dobbiamo innanzitutto occuparci dello spazio verticale.

Occupiamo tutta l’altezza

clip_image016

Per fare questo torniamo al file index.css, dove andiamo ad aggiungere anche i button alla regola del 100% di altezza: questi devono infatti occupare il 100% dell’altezza a loro disposizione. Aggiungiamo inoltre al foglio di stile le specifiche di allineamento del testo per la casella che mostra il risultato e quattro classi utili per la distribuzione dello spazio disponibile in altezza. Decidiamo di voler impostare il 15% dell’altezza totale come spazio dedicato ad ogni singola riga di pulsanti. Quindi le macro sezioni contenenti due righe dovranno necessariamente occupare il 30% di spazio. Creeremo quindi le seguenti classi:

.singleRow { height:15%; }

.doubleRow { height:30%; }

La prima andiamo ad applicarla solo sulla seconda macro sezione, che è effettivamente costituita da una singola fila di pulsanti. La seconda classe la utilizziamo per le due macro sezioni successive, ognuna composta da due file di pulsanti.

Per completare il lavoro abbiamo bisogno di altre due classi. La prima segnala di occupare la metà dell’altezza a disposizione, ci serve per dividere equamente le ultime due macro sezioni.

.halfHeight { height:50%; }

La seconda è necessaria per assegnare lo spazio restante alla casella del risultato:

.quarterHeight { height:25%; }

Adattiamo le dimensioni dei caratteri

Rimane un’ultima cosa per definire la grafica e renderla totalmente responsiva: le dimensioni del font. Per fare questo dobbiamo necessariamente intervenire con del codice Javascript. Visto che si tratta di poco codice, senza particolari complessità, andiamo ad inserirlo direttamente nel file index.js. Qui rimuoviamo il codice predefinito, utile per gestire eventuali salvataggi di stato dell’applicazione, ma non necessario nel nostro esempio. Inseriamo quindi del codice che ci consenta di effettuare il resize del font alle diverse risoluzioni. L’approccio è quello di creare una funzione che imposti le dimensioni del testo pari ad una percentuale fissata delle dimensioni del suo contenitore. La funzione deve essere richiamata una prima volta a seguito del caricamento della pagine, ed ogni qualvolta le dimensioni della pagina cambieranno.

Di seguito il codice commentato in ogni parte:

(function () {

"use strict";

// L'elemento casella viene utilizzato più volte quindi vale la pena

// estrarlo in una variabile globale

var casella = document.getElementById('casella');

// Funzione che effettua il resize del font

function resizeFont() {

// Lettura dell'array button presenti nella pagina

// e lettura dell'altezza effettiva assunta dal primo di essi

var buttons = document.getElementsByTagName('button');

var buttonHeight = parseInt(buttons[0].offsetHeight);

// Calcolo del fontSize da impostare sui button pari al 50%

// dell'altezza dei button stessi

var fontSize = Math.round(buttonHeight * 0.5) + "px";

// Impostazione del font per ogni button presente nella pagina

for (var i = 0; i < buttons.length; i++) {

buttons[i].style.fontSize = fontSize;

}

// Lettura dell'altezza effettiva assunta dalla casella

var casellaHeight = parseInt(casella.offsetHeight);

// Impostazione del font size al 40% dell'altezza contenitore

// e del line-height al 100% dell'altezza del contenitore per centrare

// il testo verticalmente

casella.style.fontSize = Math.round(casellaHeight * 0.4) + "px";

casella.style.lineHeight = casellaHeight + "px";

}

// Chiamata alla funzione di resize del font al variare delle dimensioni della finestra

window.addEventListener('resize', resizeFont);

// Prima chiamata alla funzione

resizeFont();

})();

clip_image019 clip_image020

E con quest’ultima modifica possiamo ritenerci soddisfatti: l’aspetto grafico risulta piacevole ed il layout si adatta automaticamente alle diverse risoluzioni disponibili. Ora è necessario implementare le funzionalità.

Javascript clean code

Javascript è un linguaggio di programmazione allo stesso tempo molto amato e molto odiato. La tendenza ad utilizzarlo un po’ ovunque è la chiara dimostrazione di quanto sia amato (last but not least Node.js). La smodata crescita di linguaggi che cercano di migliorarlo dimostrano quantomeno che l’uso disordinato di questo linguaggio può essere spiacevole (a risoluzione definitiva di tutto questo è importante citare l’indispensabile TypeScript).

Senza complicarci troppo la vita cerchiamo di utilizzare Javascript nel modo più pulito possibile, seguendo best practices ormai universalmente riconosciute. Andiamo quindi a creare un nuovo file chiamato calcolatrice.js all’interno della cartella scripts. Qui inseriremo il codice necessario per gestire la nostra calcolatrice.

In particolare andiamo a creare una classe Calcolatrice dotata di costruttore, di un metodo da richiamare per inserire una nuova cifra numerica (nuovaCifra) e di un metodo da richiamare per inserire una nuova operazione (nuovaOperazione). Infine Calcolatrice mette a disposizione la proprietà testo che contiene il testo da mostrare nella casella del risultato e l’evento testoCambiato per notificare il variare del valore della proprietà testo.

var Calcolatrice = (function () {

function Calcolatrice() {

...

this.testo = "0";

}

Calcolatrice.prototype = {

constructor: Calcolatrice,

nuovaCifra: nuovaCifra,

nuovaOperazione: nuovaOperazione,

addListenerTestoCambiato: addListenerTestoCambiato,

...

}

return Calcolatrice;

...

})();

Il codice completo è scaricabile a questo indirizzo:

https://github.com/gaggiga/CordovaDemo/blob/master/Calcolatrice/scripts/calcolatrice.js

Creata la classe pronta a gestire la nostra calcolatrice, ora è necessario agganciarla all’interfaccia. A questo scopo andiamo ad identificare nell’html i pulsanti che se premuti dovranno richiamare il metodo nuovaCifra, e quelli che se premuti dovranno richiamare il metodo nuovaOperazione. Banalmente aggiungiamo la classe css cifra al primo gruppo (pulsanti numerici e separatore decimale) e la classe css operazione al secondo gruppo (pulsanti delle 4 operazioni, di azzeramento e di uguale).

<button class="col-xs-3 btn btn-default operazione">C</button>

...

<button class="col-xs-4 btn btn-default cifra">7</button>

Inseriamo infine il seguente codice Javascript nel file index.js per completare la connessione tra l’interfaccia e la classe calcolatrice.

// Istanza di calcolatrice

var calcolatrice = new Calcolatrice();

// Recupero dei button delle cifre e delle operazioni

var cifre = getElementsByClass('cifra');

var operazioni = getElementsByClass('operazione');

// Gestione del click sulle cifre

for (var i = 0; i < cifre.length; i++) {

cifre[i].addEventListener('click', function (e) {

calcolatrice.nuovaCifra(e.target.innerText);

});

}

// Gestione del click sulle operazioni

for (var i = 0; i < operazioni.length; i++) {

operazioni[i].addEventListener('click', function (e) {

calcolatrice.nuovaOperazione(e.target.innerText);

});

}

// Gestione dell'evento testoCambiato

calcolatrice.addListenerTestoCambiato(function (e) {

casella.innerText = calcolatrice.testo;

});

La nostra calcolatrice è terminata. Grazie ai diversi emulatori / simulatori installati con Visual Studio possiamo testare il funzionamento e verificare l’aspetto sulle diverse piattaforme supportate, o addirittura verificare immediatamente su dispositivi reali. Dispositivi che però devono essere stati predisposti in precedenza a questo scopo (qui le istruzioni per Windows Phone, qui per Android e qui per iOS).

clip_image022

Deploy sugli store

Completato lo sviluppo, configurati gli asset relativi alle diverse piattaforme (icona, splash screen ecc.), è arrivato il momento di predisporre i pacchetti da pubblicare sui diversi store. Anche in questo Visual Studio ci assiste consentendoci di generare e firmare i package per Android, iOS, Windows 8 e Windows Phone 8. Compito nostro sarà quello di sottomettere al processo di approvazione l’applicazione.

Consigli utili

Con il medesimo sforzo con cui avremmo creato un’applicazione web abbiamo creato una vera e propria app pubblicabile sugli store dei diversi dispositivi mobili, il tutto senza mai abbandonare Visual Studio.

Nell’intero processo ci sono due criticità da tenere in considerazione:

- L’interfaccia utente: Dobbiamo fare attenzione a rispettare i requisiti dei differenti store per assicurarci l’approvazione. Sta a noi decidere se uniformare l’interfaccia per tutti gli store o se effettuare delle specifiche personalizzazioni per agevolarne l’uso agli utenti dei diversi sistemi operativi. A mio parere questo secondo approccio è preferibile e non richiede un grosso sforzo. Qui una serie di link che potranno guidarci per assicurarci l’approvazione dei diversi store.

- Il codice Javascript: E’ fondamentale la pulizia e l’ordine del codice: con un linguaggio non tipizzato l’entropia cresce in modo esponenziale al crescere dell’applicazione, quindi è vitale darsi delle regole e scrivere codice pulito, magari facendo uso di TypeScript. Dedichiamo anche un po’ di tempo a rintracciare soluzioni performanti: i dispositivi su cui potrà girare la nostra app hanno le caratteristiche più disparate, e l’obiettivo dovrebbe essere quello di raggiungere la maggior parte di potenziali utenti.

Infine suggerisco di non abusare di framework di terze parti. Se è vero che Cordova ci consente di utilizzare qualunque framework CSS / Javascript questo non vuol dire che siamo obbligati a farlo. Escludendoli avremo l’effetto di rallentare un po’ i tempi di sviluppo, ma eviteremo di appesantire inutilmente la nostra app.

Risorse

Ricordo che il progetto completo è liberamente scaricabile da qui.

Taming Mobile Apps with Cordova and Visual Studio

Using Cordova and Visual Studio to build iOS Mobile Apps

OOP In JavaScript: What You NEED to Know

Custom events in JavaScript

Mobile Development Platform Performance (Native, Cordova, Classic Xamarin, Xamarin.Forms)

Mobile Development Platform Performance Part 2 (Native, Cordova, Classic Xamarin, Xamarin.Forms)


read full article

Guest post: Integrare gli inviti di Facebook in una Universal Windows app

E-mail Stampa PDF

Questo post è stato scritto da Matteo Pagani, Support Engineer in Microsoft per il programma AppConsult, con il prezioso supporto di Gianluca Bertelli, Microsoft Support Engineer.



Nel corso di uno dei post precedenti abbiamo visto come integrare Facebook e, nello specifico, la parte di autenticazione, all’interno di una Universal Windows app. Al termine del post, eravamo in grado di sviluppare un’applicazione per Windows e Windows Phone in grado di far autenticare correttamente l’utente con le sue credenziali Facebook e, successivamente, di utilizzare le Graph API (tramite la libreria Facebook C# SDK) per effettuare operazioni come recuperare il profilo dell’utente o pubblicare un post sulla sua timeline.

Per motivi di sicurezza, però, alcune attività su Facebook (come invitare gli amici ad un gioco o ad usare un’applicazione) non posso essere gestite direttamente tramite API, ma devono passare tramite una schermata web gestita direttamente dal social network. Questo per evitare, ad esempio, che un’applicazione possa inviare in automatico centinaia di inviti senza l’esplicito consenso dell’utente. Allo sviluppatore però, vengono forniti gli strumenti necessari per generare correttamente l’URL della web view da mostrare e per ricevere l’esito dell’operazione effettuata dall’utente.

In questo esempio vedremo come integrare gli inviti di Facebook in una Universal Windows app. Darò per scontato che la parte di autenticazione, spiegata nel post precedente, sia già stata implementata e che l’utente si sia già loggato correttamente nell’applicazione.

Registrare l’applicazione sul portale Facebook

Il primo passo è collegarsi al portale sviluppatori di Facebook ed accedere alle impostazioni dell’applicazione che avevamo già creato e configurato in precedenza per il login.

Il trucco per gestire gli inviti all’interno di una Windows Store app è quello di trattare l’applicazione Facebook come se fosse un gioco, dotato di un suo Canvas (ovvero l’area nella quale viene fatto il rendering dell’applicazione web all’interno delle pagine di Facebook). Ad un Canvas è associato un URL, che viene invocato al termine della procedura di invito: useremo questo URL per determinare l’esito dell’operazione e recuperare l’elenco degli amici invitati.

Per proseguire, perciò, dovremo cliccare nella sezione Settings sul pulsante Add platform e aggiungere una nuova applicazione di tipo Facebook Canvas. L’unica impostazione che ci serve configurare è il Secure Canvas URL, che è l’indirizzo che viene richiamato quando l’operazione è terminata: ci servirà per determinare se si è conclusa correttamente o meno. Possiamo specificare un URL qualsiasi, l’importante è che sia HTTPS, come nell’esempio seguente.

clip_image002

Il gioco è fatto: ora possiamo passare a scrivere il codice vero e proprio nella nostra applicazione.

Visualizzare la pagina di invito nell’applicazione

Per mostrare il codice necessario per gestire gli inviti partiremo dal progetto di esempio usato nel primo post dedicato all’autenticazione: darò per scontato, perciò, che abbiamo già utilizzato le classi FacebookClient e WebAuthenticationBroker per far autenticare l’utente e che abbiate già ricevuto l’access token, ovvero la chiave necessaria per effettuare qualsiasi operazione con le Graph API di Facebook.

PPer implementare gli inviti tornPiamo ad usare la classe FacebookClient, che fa parte dell’SDK di Facebook C# e che è necessario installare tramite NuGet sia nel progetto Windows che in quello Windows Phone della nostra Universal Windows app. Tale classe offre un metodo chiamato GetDialogUrl() che, dato il tipo di dialog che si vuole visualizzare e i parametri di inizializzazione, restituisce l’URL da mostrare all’interno di un controllo WebView.

Ecco un esempio di utilizzo:

private void OnInviteFriendsClicked(object sender, RoutedEventArgs e)

{

FacebookClient client = new FacebookClient(AccessToken);

dynamic parameters = new ExpandoObject();

parameters.app_id = ClientId;

parameters.message = "Invite your friends";

parameters.title = "Invite friends";

parameters.redirect_uri = "https://wp.qmatteoq.com/";

Uri dialogUrl = client.GetDialogUrl("apprequests", parameters);

RequestView.Visibility = Visibility.Visible;

RequestView.Navigate(dialogUrl);

}

I parametri sono gestiti con un oggetto dinamico, che ha una serie di proprietà:

· app_id: è l’ID dell’applicazione Facebook, che si recupera dal portale sviluppatori e che avevamo già utilizzato in precedenza per il login. Si trova nel portale alla voce Settings dell’applicazione, all’interno del campo App ID.

· message: è il messaggio che spiega lo scopo dell’invito e che viene mostrata nella vista web.

· title: è il titolo della vista web che consente di invitare gli utenti.

· redirect_uri: è il Secure Canvas URL che abbiamo specificato in precedenza nella configurazione sul portale sviluppatori di Facebook.

Dopodiché, usando la classe FacebookClient (inizializzata con l’access token che abbiamo recuperato dopo la fase di login), chiamiamo il metodo GetDialogUrl(), passando come parametri il tipo di dialog (nel caso degli inviti, apprequests) e la configurazione. Ci viene così restituito l’URL della schermata da mostrare, che dobbiamo visualizzare all’interno di un controllo WebView. Nel nostro esempio, tale controllo è stato incluso nella pagina a tutto schermo, ma nascosto di default:

<Grid>

<WebView x:Name="RequestView" Visibility="Collapsed" Width="400" Height="800" NavigationCompleted="RequestView_OnNavigationCompleted"/>

<StackPanel Margin="12, 20, 0, 0" x:Name="AppContent">

<!-- il contenuto della pagina -->

</StackPanel>

</Grid>

Quando viene invocato il metodo, il controllo WebView viene reso visibile (impostandone la proprietà Visibility su Visible) e viene scatenata una navigazione, tramite il metodo Navigate(), verso l’URL restituito dal metodo GetDialogUrl().

L’utente vedrà una schermata simile alla seguente:

clip_image003

Elaborare il risultato dell’operazione

L’utente avrà la possibilità, direttamente nella vista web, di selezionare uno o più amici: dopo aver premuto il pulsante Send, l’operazione sarà completata e noi potremo elaborarne il risultato. Lo facciamo sottoscrivendo l’evento Navigation_Completed del controllo WebView, che viene scatenato nel momento in cui una pagina è stata caricata completamente.

Nel momento in cui l’utente ha premuto il pulsante Send, viene scatenata una navigazione verso l’URL specificato come Secure Canvas URL: è quello che dobbiamo intercettare. In questo caso, infatti, l’URL conterrà la risposta con le informazioni relative agli amici che sono stati invitati.

Ecco un esempio di codice:

private async void RequestView_OnNavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)

{

if (args.Uri.DnsSafeHost == "wp.qmatteoq.com")

{

sender.Visibility = Visibility.Collapsed;

AppContent.Visibility = Visibility.Visible;

FacebookClient client = new FacebookClient(AccessToken);

dynamic result = client.ParseDialogCallbackUrl(args.Uri);

if (result.error_code == null)

{

var items = (IDictionary<string, object>) result;

ObservableCollection<FacebookUser> invitedFriends = new ObservableCollection<FacebookUser>();

foreach (KeyValuePair<string, object> value in items)

{

if (value.Key != "request")

{

string query = string.Format("/{0}", value.Value);

dynamic user = await client.GetTaskAsync(query);

FacebookUser facebookUser = new FacebookUser();

facebookUser.FullName = user.name;

invitedFriends.Add(facebookUser);

}

}

Friends.Visibility = Visibility.Visible;

FriendsHeader.Visibility = Visibility.Visible;

Friends.ItemsSource = invitedFriends;

}

else

{

MessageDialog dialog = new MessageDialog("The user has canceled the operation");

await dialog.ShowAsync();

}

}

}

Se l’host dell’URL (contenuto all’interno della proprietà Uri dei parametri di ritorno) coincide con quello specificato sul portale sviluppatori Facebook, allora ci troviamo nel caso in cui l’utente ha terminato di invitare i suoi amici. Possiamo perciò elaborare il risultato dell’operazione tramite il metodo ParseDialogCallbacUrl(), che ci restituisce un oggetto dinamico (usiamo, infatti, la keyword dynamic). L’operazione, però, potrebbe non essere andata a buon fine, oppure semplicemente l’utente potrebbe aver premuto il pulsante Cancel della dialog: a questo scopo, verifichiamo se il risultato contiene una proprietà di nome error_code. In caso negativo, vuol dire che tutto è andato a buon fine e l’utente ha selezionato uno o più amici dall’elenco. Possiamo perciò procedere a trattare il risultato come una collezione di tipo Dictionary<string, object>, che contiene:

· Un primo valore, identificato dalla chiave request, che rappresenta l’identificativo univoco della richiesta.

· Una serie di valori numerici, uno per ogni amico invitato dall’utente, con l’identificativo univoco della persona invitata.

Nel codice di esempio, tramite un ciclo foreach, passiamo in rassegna tutti gli utenti invitati (scartando l’identificativo della richiesta, che per i nostri scopi non ci serve) e, per ognuno di essi, andiamo a chiamare il servizio delle Graph API che ci restituisce le informazioni dettagliate sull’utente (la sintassi è semplicemente l’identificativo numerico dell’utente preceduto dal simbolo /, ad esempio /123456890), sfruttando il metodo GetTaskAsync() della classe FacebookClient.

Nell’esempio, per ogni utente, ci limitiamo a recuperarne il nome (contenuto nella proprietà name) e a salvarlo nella proprietà FullName della classe FacebookUser, che è una semplice wrapper in C# alle informazioni ritornate dalle Graph API così definito:

public class FacebookUser

{

public string FullName { get; set; }

}

Ognuno di questi oggetti viene infine aggiunto in una collezione di tipo ObservableCollection<FacebookUser>, così poi da mostrare all’utente l’elenco di tutti gli amici che ha invitato tramite un controllo ListView così definito:

<ListView x:Name="Friends" Margin="0, 20, 0, 0" Visibility="Collapsed">

<ListView.ItemTemplate>

<DataTemplate>

<StackPanel>

<TextBlock Text="{Binding Path=FullName}" Style='{StaticResource BodyTextBlockStyle}' />

</StackPanel>

</DataTemplate>

</ListView.ItemTemplate>

</ListView>

Come vedete, viene utilizzato un template molto semplice, che si limita a mostrare il nome dell’utente invitato.

In conclusione

Nel corso di questo post abbiamo visto come integrare il meccanismo di gestione degli inviti di Facebook (per invitare i nostri amici ad utilizzare il nostro gioco o la nostra applicazione) all’interno di una Universal Windows app. Potete scaricare il codice sorgente del progetto di esempio da GitHub all’indirizzo https://github.com/qmatteoq/FacebookSample-Universal: ricordatevi, come sempre, di sostituire i parametri di configurazione (come l’App Id di Facebook o il Canvas Secure URL) con quelli della vostra applicazione Facebook.


read full article

Guest post: Application Insights: monitoraggio di App Windows Phone e Windows Store

E-mail Stampa PDF

Questo post è stato scritto da Davide Benvegnù, MVP Visual Studio ALM

Nell’ultimo periodo ci sono stati due annunci piuttosto importanti che riguardano Application Insights (AI), la suite di monitoraggio applicativo online di Microsoft.

La prima importante novità è che la piattaforma di supporto ad AI viene ufficialmente spostata da Visual Studio Online ad Azure. In questo modo tutte le funzionalità avanzate del monitoraggio sono disponibili e gestibili direttamente accedendo all’Azure Portal Preview.

Già da un po’ di tempo, in realtà, era iniziata la “doppia vita” di AI, che era stata resa disponibile su entrambi i portali web (quindi sia su VSO che su Azure). Con questo annuncio, però, è stata indicata chiaramente la rotta che il servizio prende ed, inoltre, è stata inibita la possibilità di creare nuove sottoscrizioni sul portale di VSO: chi vuole creare nuovi servizi in AI deve farlo dal portale di Azure, dove saranno comunque migrati nel tempo anche tutti i servizi già esistenti.

La seconda novità è il nuovo supporto al monitoraggio di app Windows Phone e Windows Store, oltre alle webapp Java. Finora, infatti, con il servizio di Application Insights disponibile su Azure era possibile monitorare solamente le webapp Asp.NET.

 

Supporto a Windows Phone App e Windows Store App

Aggiungere il monitoraggio di Application Insights ad un’app per Windows Phone o per Windows Store è molto semplice.

È sufficiente cliccare con il tasto destro sul progetto dell’app utilizzando Visual Studio 2013 con Update 3 (o successivi) e selezionare la voce “Add Application Insights Telemetry”.

msohtmlclipclip_image001

(negli esempi ho utilizzato una Windows Store App, ma il procedimento è assolutamente identico per una Windows Phone App)

Non appena si avvia la procedura di aggiunta di AI al progetto, Visual Studio richiede di accedere al proprio account Azure (o di crearne uno nuovo). Questo è necessario perché, come detto precedentemente, è Azure a fare da backend al servizio ed a fornire l’interfaccia tramite il Portal Preview.

msohtmlclipclip_image002

Dopo aver effettuato il login ad Azure è possibile selezionare la sottoscrizione (nel caso in cui si disponga di più di una sottoscrizione) in cui creare il nuovo servizio di Application Insights.

msohtmlclipclip_image003

Selezionata la sottoscrizione, è necessario indicare quale servizio AI utilizzare. È possibile infatti creare un nuovo servizio di monitoraggio che si chiamerà come il progetto a cui stiamo associando AI (scelta di Default) oppure utilizzare un servizio precedentemente creato direttamente dal portale di Azure.

msohtmlclipclip_image004

C’è anche la possibilità, utilizzando “Configure settings” di cambiare il Resource Group associato al servizio e, quando la funzionalità sarà in GA (attualmente si tratta di una public preview), modificare la location (che al momento è fissa a Central US)

Fatte le opportune selezioni, è sufficiente cliccare sul bottone “Add Application Insights To Project” per aggiungere, come dice il nome, AI alla nostra App.

Dietro le quinte accadono le seguenti operazioni:

· Visual Studio si connette alla nostra sottoscrizione Azure, crea il nuovo servizio AI (se non abbiamo scelto di utilizzarne uno già esistente) e recupera l’”Instrumentation Key”, ovvero un valore che identifica in modo univoco il nostro servizio

msohtmlclipclip_image005

· Viene scaricato da NuGet il pacchetto che contiene le librerie necessarie al monitoraggio

· Viene configurata Application Insights sul progetto, utilizzando l’Instrumentation Key recuperata precedentemente

· Viene aggiunto allo start dell’applicazione (quindi dentro il file App.xaml.cs) l’inizializzazione del componente “Telemetry Client” che si occupa appunto del monitoraggio della nostra app.

using Microsoft.ApplicationInsights;

[…]

public static TelemetryClient TelemetryClient;
 

[…]

public App()
{
    TelemetryClient = new TelemetryClient();
 

[…]

}
 

A questo punto non rimane che avviare l’app e verificare cosa succede.

 

Verifica del monitoraggio

Dopo aver avviato la nostra app e navigato un po’ tra le pagine, veniamo notificati con un popup su Visual Studio che i dati sono stati inviati al servizio di monitoraggio.

msohtmlclipclip_image006

Per verificare quali e quanti dati di monitoraggio sono stati inviati basta accedere all’Azure Portal Preview, navigare fino alla sezione relativa ad Application Insights ed entrare sul servizio creato. In alternativa, è possibile semplicemente cliccare con il tasto destro sul nome del progetto e selezionare la voce “Open Application Insights”, che ci porta direttamente alla pagina con i dati di monitoraggio.

msohtmlclipclip_image007

In entrambi i casi il risultato sarà lo stesso, simile a quello visibile in questa immagine:

msohtmlclipclip_image008

La dashboard presenta una gran quantità di dati utili, tra cui il numero di utenti che hanno utilizzato l’app, il numero di sessioni ed il numero di pagine visualizzate. Tutti i grafici sono personalizzabili e, se cliccati, presentano molte informazioni di dettaglio.

Cliccando ad esempio sul grafico delle pagine, si può avere il dettaglio delle stesse, con alcuni dati aggiuntivi.

msohtmlclipclip_image009

Cliccando nuovamente sul grafico, si apre la blade delle personalizzazioni dove è possibile configurare completamente il comportamento del grafico stesso.

msohtmlclipclip_image010

Una delle configurazioni più utili che troviamo è la possibilità di segmentare e raggruppare i dati per alcune condizioni. Nell’immagine vediamo che il grafico è raggruppato per tipologia di pagina, ma è possibile scegliere molti altri valori tra cui il tipo di Device dell’utente, il sistema operativo utilizzato, la lingua, ecc.

msohtmlclipclip_image011

L’utilità del raggruppamento diventa ancora più evidente per il grafico degli utenti: utilizzando ad esempio il raggruppamento per tipo di device possiamo orientare il nostro sviluppo ottimizzando l’applicazione per i dispositivi più utilizzati; oppure selezionando la lingua dell’utente possiamo verificare se non sia il caso di tradurre la nostra app in una lingua che ancora non abbiamo supportato, nel caso in cui ci siano tanti utenti che la usano.

Oltre al monitoraggio sull’utilizzo, sono presenti out-of-the-box anche il monitoraggio sui crash (in modo simile a quanto presente sul portale dello store) e su eventuali eccezioni verificatesi.

Se il monitoraggio di default non fosse sufficiente, abbiamo diverse possibilità di personalizzazione.

 

Monitoraggio personalizzato

Riguardando le immagini precedenti, si nota subito che sull’elenco delle pagine visitate compaiono delle generiche “application:StoreAppAIDemo.HubPage” e “application:StoreAppAIDemo.ItemPage” (si tratta in questo esempio di una Windows Store App con template di tipo Hub). Per alcuni scenari potrebbe essere sufficiente, ma se per esempio avessimo necessità di tracciare la visualizzazione dei singoli Item invece che il totale su tutti gli Item, come avviene di default?

Per supportare uno scenario come quello appena illustrato, possiamo utilizzare la funzione TrackPageView del TelemetryClient:

 
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    App.TelemetryClient.TrackPageView(string.Format("ItemPage: {0}", e.Parameter));
 
    navigationHelper.OnNavigatedTo(e);
}
 

Come vediamo è sufficiente aggiungere una riga di codice all’interno dell’evento OnNavigatedTo. Il risultato di questa operazione sarà che al posto delle pagine generiche avremo visualizzato nel riepilogo il nome che abbiamo scelto, seguito dall’ID dell’Item che viene visualizzato (che, in questo caso, è rappresentato dal valore di e.Parameter).

msohtmlclipclip_image012

 

Eventi personalizzati

Altro tipo di personalizzazione del monitoraggio, anch’esso molto comodo, è la generazione di eventi custom.

Supponiamo, ad esempio, di voler tener traccia di tutte le volte che un utente utilizza una determinata funzionalità. Senza il supporto di Application Insights dovremmo implementare un handler per l’evento che spedisca i dati attraverso un web service o altre tecnologie simili. Con AI, invece, anche quest’operazione si traduce in una sola riga di codice:

 
App.TelemetryClient.TrackEvent("Nome_Evento");
 

È possibile inserire questa chiamata al TrackEvent ovunque sia necessario (pressione di un bottone, recupero di valori via API effettuata con successo, ecc). Il risultato sarà anch’esso visibile sul portale, ma nella sezione “Eventi personalizzati”.

msohtmlclipclip_image013

Oltre al tracking di un evento semplice, come nell’esempio precedente in cui ne viene tracciato solo il nome, è possibile anche aggiungere delle proprietà e delle metriche custom. Ancora una volta, farlo è molto semplice e richiede solo poche righe di codice:

 
var properties = new Dictionary<string, string>();
properties["IDUtente"] = App.TelemetryClient.Context.User.Id; //questo valore è null
properties["MiaProprieta_2"] = "valore2";
 
var metrics = new Dictionary<string, double>();
metrics["OffsetTicks"] = DateTimeOffset.Now.Offset.Ticks;
metrics["Metrica_2"] = 144;            
 
App.TelemetryClient.TrackEvent("Evento_Con_Metriche", properties, metrics);
 

Innanzitutto è importante notare che “proprietà” e “metriche” sono rappresentate da due oggetti di tipo Dictionary ma con diverso tipo del valore. Nel primo caso si tratta di valori di tipo testuale (string) mentre nel secondo di tipo numerico (double).

In entrambi i casi, comunque, quello che viene inserito all’interno dei Dictionary è assolutamente libero e personalizzabile, sia come valore sia come numero degli elementi (purché sia ovviamente rispettato il tipo).

Utilizzando questa funzionalità potremo quindi avere sulla dashboard del servizio l’indicazione dell’evento, come nel caso precedente, ma con anche i dati personalizzati inseriti.

msohtmlclipclip_image014

Si noti che non viene riportato il valore della proprietà “IDUtente” in quanto a Runtime, come riportato nel commento vicino al codice, era NULL.

Accedere ai valori richiede qualche click in più rispetto a quanto visto finora. Innanzitutto bisogna cliccare sul nome dell’evento nella dashboard principale, poi di nuovo sul nome dell’evento nella tabella denominata “Totale di events per event name”, fare clic poi sul singolo evento e finalmente si arriverà alla schermata con i dati.

image

Altre personalizzazioni

Oltre a pagine ed eventi, è possibile tracciare altri elementi:

 
//EXCEPTION
var ex = new Exception();
App.TelemetryClient.TrackException(ex);
App.TelemetryClient.TrackException(ex, properties, metrics);
 
//METRIC
App.TelemetryClient.TrackMetric("Mia_Metrica", 123546);
App.TelemetryClient.TrackMetric("Mia_Metrica", valore_medio, numero_valori, 
        valore_minimo, valore_massimo, properties);
 
//REQUEST 
App.TelemetryClient.TrackRequest("Mia_Richiesta", DateTimeOffset.Now, durata_richiesta,
        reponse_code, successo);
 
//TRACE
App.TelemetryClient.TrackTrace("Messaggio");
App.TelemetryClient.TrackTrace("Messaggio", 
 Microsoft.ApplicationInsights.DataContracts.SeverityLevel.Information);
App.TelemetryClient.TrackTrace("Messaggio"", 
 Microsoft.ApplicationInsights.DataContracts.SeverityLevel.Warning,
        properties);
 

Ogni tipo di tracciamento verrà visualizzato nella sua rispettiva area della dashboard. Per quanto riguarda le metriche personalizzate, è anche possibile includerle nel grafico principale andando sulla sua configurazione (semplicemente cliccandoci sopra) e selezionando i valori da visualizzare.

 

Informazioni utili

Ci sono due cose da considerare, quando si utilizza il monitoraggio con Application Insights.

La prima riguarda l’invio dei dati al servizio:

· Quando l’applicazione è compilata in Debug, l’invio avviene in tempo reale. Sarà quindi possibile vederli immediatamente inseriti nei grafici e nelle tabelle sul Portal Preview.

· Quando l’applicazione, invece, è compilata in Release il comportamento è differente. I dati infatti vengono salvati in locale sul device e l’invio al servizio avviene allo start dell’App oppure al resume della stessa. Nel caso in cui non sia disponibile la connettività l’invio verrà posticipato al prossimo evento di start o resume.

Il secondo elemento di cui tenere conto è che, al momento, il monitoraggio di Application Insights non supporta direttamente le Universal App, ma solamente le Windows Phone App e le Windows Store App; non c’è quindi la voce “Add Application Insights Telemetry” nel menu contestuale della solution. C’è tuttavia un workaround che permette di monitorare anche questo tipo di app.

Come abbiamo detto precedentemente, infatti, una delle operazioni che Visual Studio effettua quando aggiungiamo AI al nostro progetto è il download di un pacchetto da NuGet. Basterà quindi aggiungere ad entrambi i progetti della Universal app il relativo pacchetto NuGet.

Conclusioni

Il monitoring applicativo è una componente molto importante ed abbiamo visto com’è semplice implementarlo utilizzando Application Insights.

Grazie al recente supporto alle App è quindi ora possibile monitorare anche gli aspetti più “interni”, come il verificarsi di eventi, la visualizzazione delle pagine ed il verificarsi di eccezioni, oltre ad aggiungere metriche personalizzate alla dashboard.

La visualizzazione sull’Azure Portal Preview, poi, permette di accedere ai dati in modo semplice e veloce e di poter gestire e configurare grafici e tabelle in modo completo.


read full article

Guest post: Angular and Typescript. Together forever...

E-mail Stampa PDF

Questo articolo è stato scritto da Andrea Boschin, MVP Windows Platform Development

E’ da un po’ che Typescript è entrato nei miei progetti web, si potrebbe dire portando ordine laddove regnava il caos. In effetti se ripenso a quale fosse la qualità e la manutenibilità del codice nei progetti in cui Javascript regnava sovrano e la paragono a quello che è invece il risultato dell’utilizzo di Typescript mi rendo conto che quest’ultimo ha cambiato completamente il modo in cui sviluppo, l’affidabilità che mi aspetto da questo codice e soprattutto il modo in cui il esso evolve nel tempo. Javascript è un linguaggio potentissimo e dalla sua ha anche l’indiscutibile vantaggio di essere diventato ormai la lingua franca che accomuna dispositivi mobili e workstation desktop, ma per quando ligi e rigorosi si sia nell’applicare regole che aiutino a mantenere una certa qualità del codice, esso non manca di essere fonte di numerosi grattacapi e di una crescente confusione. E’ questo in effetti che sta spingendo notevolmente la comunità degli sviluppatori a prendere sempre più spesso in considerazione Typescript, è questo che riempie le sale delle conferenze di sviluppatori che sentono questo stesso problema e che sono alla indefessa ricerca di una soluzione. Typescript in effetti non solo è uno strumento che consente di applicare un modello di programmazione più rigoroso e maggiormente efficiente, ma porta con il vantaggio di poter sfruttare tutti gli strumenti di Visual Studio quali ad esempio l’Intellisense, ma soprattutto la possibilità di sfruttare la pletora di librerie javascript esistenti con molta semplicità.

A dimostrazione di quello che da un po’ vado professando, in questi giorni è divenuta pubblica la notizia che AngularJS, una popolare libreria Javascript prodotta da Google, ha deciso di adottare Typescript come linguaggio di sviluppo della versione 2.0. La notizia è di certo una conferma dell’efficacia del linguaggio ma non solo. In effetti, il risultato della collaborazione instaurata tra Microsoft e Google sarà che AngularJS contribuirà a migliorare ulteriormente Typescript (i primi risultati di questo sono già attesi nella versione 1.5 del compilatore) e che i file di definizione saranno sempre molto aggiornati. Ma quello che non deve essere dimenticato è che Typescript è già uno strumento efficace che consente di usare a tutti gli effetti Angular proficuamente. Esistono molte ragioni per scegliere questa combinazione. Angular è di certo uno strumento molto raffinato per applicare un pattern di programmazione che separi la logica dall’interfaccia utente, pattern molto simile a MVVM, grazie al fatto che dispone di un raffinato databinding. Essa inoltre fornisce numerosi strumenti per dependency injection e unit testing, consente lo sviluppo di applicazioni Single Page (SPA) e infine supporta lo sviluppatore mediante oggetti quali factories, services e direttive che sono insostituibili per massimizzare il riutilizzo del codice.

Utilizzare Angular con Typescript è molto semplice. Dopo aver installato Typescript 1.4 per Visual Studio 2013 scaricandolo dal sito ufficiale si dovrà creare un progetto web, non necessariamente con ASP.NET. E’ sufficiente in effetti una semplice pagina HTML. A questo punto utilizzando Nuget si dovranno scaricare le seguenti due librerie:

· AngularJS

· Definitely typed for AngularJS

Mentre la prima altro non è che la libreria stessa che sarà scaricata nella cartella Scripts, la seconda è un file con estensione “.d.ts” che verrà copiato in una cartella “typings”. Questo file ha lo scopo fondamentale di istruire il compilatore Typescript dell’esistenza della libreria e dei tipi che possono essere ritrovati al suo interno. Senza di esso saremmo in buona sostanza ciechi ai tipi e il compilatore continuerebbe a darci innumerevoli errori per proprietà e metodi che non conosce. Il suo scopo è in effetti molto simile ai file header del C, ma in questo caso non è necessario includere il file. Basterà la sola presenza di questo file nelle cartelle del progetto web perchè il compilatore lo tenga in dovuta considerazione. Non sarà invece sufficiente ai fini dell’inclusione della libreria Javascript che dovrà per forza di cose avere una referenza all’interno della pagina HTML in cui viene utilizzata, esattamente come si fa normalmente.

<script src="/Scripts/angular.min.js"></script>

Di solito questo caricamento si pone nella parte finale della pagina, subito prima del tag </body>. A questo punto possiamo ipotizzare di creare un file Typescript per ciascuna delle pagine della nostra applicazione. Per ipotesi, ad un file “default.html” facciamo corrispondere un file “default.ts” e aggiungiamo esso stesso come inclusione nella pagina. Per comodità possiamo semplicemente trascinare il file TS nella giusta posizione nella pagina e Visual Studio si occuperà di referenziare il file Javascript risultante dalla compilazione.

<script src="/Scripts/angular.min.js"></script>

<script src="/default.js"></script>

Forse è superfluo dirlo ma è importante notare che l’ordine dei file conta. Infatti dato che il nostro default.ts utilizza Angular quest’ultimo deve essere caricato in precedenza. In una applicazione ben organizzata potremmo vedere una sezione di caricamenti simile alla seguente:

<script src="/Scripts/jquery-2.1.1.min.js"></script>

<script src="/Scripts/moment.min.js"></script>

<script src="/Scripts/angular.min.js"></script>

<script src="/Scripts/bootstrap.min.js"></script>

<script src="/sys.js"></script>

<script src="/sys.services.js"></script>

<script src="/sys.directives.js"></script>

<script src="/default.js"></script>

In questo esempio abbiamo incluso jQuery, MomentJS per la gestione delle date, AngularJS e Bootstrap per i layout responsivi. I file da sys.js in poi sono nostre librerie che contengono utilità comuni a tutte le pagine. Ultimo il file che rappresenta la pagina stessa.

Ora nel tag body inseriamo due attributi:

<body ng-app="defaultApp" ng-controller="defaultController">
   
<script src="/Scripts/jquery-2.1.1.min.js"></script>
   
<script src="/Scripts/moment.min.js"></script>
   
<script src="/Scripts/angular.min.js"></script>
   
<script src="/Scripts/bootstrap.min.js"></script>
    <script src="/sys.js"></script>
    <script src="/sys.services.js"></script>
    <script src="/sys.directives.js"></script>
    <script src="/default.js"></script>
</body>

L’attributo ng-app istruisce Angular che l’applicazione da utilizzare per questa pagina si chiama “defaultApp”. Con ng-controller invece determiniamo che il controller, ovvero la parte di codice che contiene la logica, si chiama “defaultController”. Sarà nel file Typescript che dovremo inizializzare il controller come segue:

angular.module('defaultApp', [])
.controller('defaultController',
['$scope', ($scope) => { $.extend($scope, new DefaultController()); }]);

Con la prima riga viene creata l’applicazione “defaultApp”. In seguito si chiama il metodo controller che dichiara appunto il controller “defaultController”. Questa operazione richiede l’utilizzo di un oggetto denominato “scope”. Lo scope è a tutti gli effetti il connettore tra pagina HTML e Controller. Un po’ l’alter-ego del ViewModel nel pattern MVVM. In buona sostanza tutte le proprietà e i metodi dichiarati al suo interno saranno disponibili nell’html per il databinding. In questo esempio, come mia abitudine faccio uso di jQuery per “fondere” lo scope con una classe Typescript (DefaultController). Questa fusione fa si che lo scope diventi a tutti gli effetti la classe stessa e consenta di lavorare sfruttando al meglio la programmazione orientata agli oggetti e l’Intellisense di Visual Studio. Ecco ora il controller minimale:

class DefaultController
{
    value: number;
    result: number;
    calc(): void
    {
       
this.result = Math.sqrt(this.value);
    }
}

Il controller è molto semplice. La chiamata del metodo calc() esegue la radice quadrata del numero “value” e lo mette in “result”. Ora se usiamo il databinding di Angular possiamo rapidamente visualizzare le informazioni nel body dell’HTML.

<input type="number" ng-model="value" value="2" />
<button ng-click="calc();">Calcola</button>
Math.sqrt({{value}}) = {{result}}

Abbiamo quindi una input type il cui valore è collegato alla variabile “value” mediante la direttiva ng-model. Il pulsante invece usa la direttivsa ng-click per richiamare il metodo “calc()” ed eseguire quindi l’operazione. Infine, nella terza riga i valori di “value” e “result” vengono visualizzati nell’HTML mediante la sintassi che usa le graffe. Questo provocherà la visualizzazione della seguente:

Il tutto è di una semplicità davvero disarmante. Per i programmatori XAML come me questo dovrebbe essere evidentemente molto simile all’utilizzo del pattern MVVM. In verità AngularJS ha dei piccoli vantaggi rispetto all’applicazione del pattern MVVM in C#, come ad esempio il fatto che è possibile creare scope annidati (anche implicitamente come nel caso del binding di liste) ma ciascuno di essi sarà gerarchicamente referenziato allo scope che lo contiene e quindi esisterà una sorta di fallback nelle proprietà che consente di tratte vantaggio da questa gerarchia. Ma questo argomento richiederebbe molto più spazio di quello di questo post. Per approfondimento, vi consiglio di valutare la possibilità di assistere ad una delle mie sessioni sull’argomento, a Mestre il 13/3/2015 (http://www.xedotnet.org/Home/Meeting/20150313) e a Roma il 28/3/2015 (http://rome2015.codemotionworld.com/conference/23/).


read full article

MWC e GDC: Novità per gli sviluppatori

E-mail Stampa PDF

 

Questo post è stato scritto da Francesco Rifugio, Technical Evangelist Intern e Microsoft Student Partner.

Quest’anno Microsoft è stata grande protagonista del Mobile World Congress (MWC) 2015 a Barcellona.clip_image002

Sono stati presentati alcuni nuovi device come il Lumia 640, il Lumia 640 XL e la Universal Foldable Keyboard, che hanno subito accolto il consenso della fiera, come dimostrato dai 10 fra premi e riconoscimenti ottenuti, tra cui:

  • Best Mobile Tablet – Surface Pro 3
  • Best of Mobile World Congress 2015 – Lumia 640
  • Top Pick of Mobile World Congress 2015 – Lumia 640 XL.

clip_image004

Ma questa è solo una parte degli annunci fatti da Microsoft, che ha approfittato dell’occasione per mostrare ai fortunati Insiders presenti alcune importanti novità per gli sviluppatori, una fra tutte, la Universal App Platform

clip_image006

Questa nuova piattaforma è l’emblema della totale convergenza di Windows 10, permetterà infatti di sviluppare una nuova categoria di Universal App: applicazioni scritte una volta sola, caricate su un unico Store con un unico pacchetto, ma che saranno in grado di raggiungere qualsiasi tipologia di device, dai device IoT a smartphone e tablet, passando dai PC a Xbox One, fino ad arrivare agli HoloLens; rimanendo sempre consistenti e familiari all’utente finale, pur adattandosi alla tipologia di input e alla dimensione dello schermo dei differenti dispositivi.
Per approfondire vi rimando a questo articolo.

clip_image007

Ma le novità non finiscono qui, perché Microsoft era presente anche ad un altro importantissimo evento: la Game Developer Conference (GDC) a San Francisco; dove Phil Spencer, capo della divisione Xbox, ha mostrato la nuova strategia di unificazione del gaming fra i device Windows 10, in una keynote interamente dedicata agli sviluppatori.
Qui ha annunciato, ad esempio, l’arrivo dell’ Xbox Live SDK for Windows 10, che permetterà a qualsiasi sviluppatore di accedere ai servizi offerti dalla piattaforma Xbox Live; oppure lo Universal Development Center, un nuovo portale che permetterà la sottomissione dei giochi in modo facile e veloce.
E le novità non finiscono qui, perché adesso per i game developer si aprono nuovissime opportunità, a partire dal cross-buy che permetterà di acquistare un gioco una volta sola e averlo disponibile su qualsiasi piattaforma; fino ad arrivare all’apertura del programma ID@Xbox anche per Windows 10, non limitandolo più, quindi, alla sola piattaforma Xbox One.
clip_image009
Se volete scoprire tutte le altre novità dalla GDC, leggete questo articolo e guardate i video su Channel 9..

Questo è solamente un assaggio di tutte le novità di Windows 10 per gli sviluppatori, e molto di più sarà condiviso durante il Build 2015, e se non potrai partecipare, non preoccuparti, perché potrai vedere le keynote in live-streaming, o le varie sessioni registrate i giorni seguenti.

Nel frattempo ti puoi preparare a Windows 10 in due modi:

· Partecipa al programma Windows Insider, in questo modo avrai acccesso anticipato a Windows 10, e sarai subito avvisato quando saranno disponibili gli strumenti di sviluppo in anteprima.

· Comincia subito a sviluppare Universal App. Questo è il miglior modo di preparare la propia applicazione all’arrivo della nuova Universal App Platform.

Stay tuned!


read full article

Pagina 6 di 49

 
 
 
 
Certificazioni