ComputerLand

Tu sei qui: Articoli MSDN

Notizie dal web

Guest post: F# vs C#

E-mail Stampa PDF

Questo articolo è stato scritto da Nicola Iarocci, sviluppatore, esperto di MongoDB e autore di alcuni progetti open source in Python e .NET

Secondo la definizione ufficiale F# è "un linguaggio che offre supporto per la programmazione funzionale in aggiunta a quella tradizionale, imperativa e procedurale, orientata agli oggetti."

Come incipit non è granché. Tante volte mi son detto che sì, un nuovo linguaggio Microsoft è interessante, ma in fin dei conti cosa aggiunge di nuovo? Supporta la piattaforma .NET e va bene, ma .NET già lo uso da C#. E poi, "funzionale"... suona come una roba da matematici e statistici. Io scrivo applicazioni business e lo faccio manipolando oggetti. Proprietà e metodi, non funzioni, sono il mio pane quotidiano. Meglio lasciare F# e le sue funzioni alle università, ai centri di ricerca o magari ai trader rampanti.

Ed è così che F# è rimasto per un bel po' nel cassetto delle cose interessanti da guardare prima o poi, senza fretta. Se più o meno vi ci ritrovate in queste considerazioni non preoccupatevi perché non siete i soli. In tempi più o meno recenti praticamente chiunque ho incontrato in giro per l'Italia mi ha risposto in questi termini ogni volta che la discussione dirottava in un modo o nell'altro su F# e sui linguaggi funzionali: "Bello sì, interessante. Prima o poi..."

Per me il "poi" è finalmente arrivato un paio d'anni fa quando ho ripreso in mano il linguaggio e mi sono messo a pastrocchiarci per davvero. Ho scoperto un modo nuovo di risolvere problemi e un linguaggio super interessante.

Perché F# è interessante

La prima cosa da sapere su F# è che è adattissimo a ogni tipo di applicazione, non solo quelle matematico-scientifiche. Una volta presa dimestichezza col linguaggio scopriamo che tutti i problemi che affrontiamo ogni giorno possono essere risolti brillantemente in F#; spesso in modo più succinto, leggibile e meno prono ad errori.

La seconda è che, pure essendo un linguaggio funzionale, F# ci consente di usare gli oggetti. Non potrebbe essere altrimenti visto che supporta il .NET Framework. Quello che segue è il classico Hello World implementato in Windows Forms con F#, ed è tratto dall'ottimo Real World Functional Programming di Tomas Petriceck (pag. 26):

open System.Drawing
open System.Windows.Forms

type HelloWindow() =
    let frm = new Form(Width = 400, Height = 140)
    let fnt = new Font("Times New Roman", 28.0f)
    let lbl = new Label(Dock = DockStyle.Fill, Font = fnt,
        TextAlign = ContentAlignment.MiddleCenter)

do frm.Controls.Add(lbl)

member x.SayHello(name) =
    let msg = "Hello " + name + "!"
    lblT.Text <- msg

member x.Run() =
    Application.Run(frm)

Per lanciare l'applicazione:

let hello = new HelloWindows()
hello.SayHello("caro lettore")
hello.Run()

Familiare, vero? Il buon vecchio .NET Framework al lavoro. Il codice non è certo un esempio di purezza funzionale, ma porta a casa brillantemente il risultato.

La terza cosa da sapere su F# è che essendo anch'esso un linguaggio CLR offre interoperabilità completa con C# e VB. Così come è possibile avere soluzioni Visual Studio che combinano progetti C# e VB, lo stesso possiamo fare con F#. Questo ci offre l'opportunità di cominciare a inserire piccole componenti F# all'interno di soluzioni già mature, scritte in altri linguaggi. E' questo l'approccio che ho usato io non appena ho smesso di giocare con progetti di studio.

Immutabile e funzionale

Una caratteristica dei linguaggi funzionali che lascia sempre interdetti noi "oggettisti" di vecchia data è l'intrinseca immutabilità dei valori. Per incrementare un numero in C# faremmo qualcosa di questo genere:

var numero = 10;
numero++;

Dopo aver assegnato un valore iniziale a number procediamo ad incrementarne il valore. number dunque è mutabile, tant'è vero che lo definiamo una "variabile" (nomen omen). Se volessimo adottare un approccio funzionale allo stesso problema dovremmo andare in un'altra direzione, dato che non possiamo mutare nulla:

const int numero = 10; 
const int risultato = numero + 1;

Intanto, numero è una costante, non più una variabile, il che ha senso visto che non possiamo mutarne comunque il valore. Ne incrementiamo ancora il valore, ma il risultato dell'operazione lo assegniamo ad un'altra costante. Potrebbe sembrare che in questo modo stiamo usando più risorse e scrivendo più del necessario, ed in effetti in C# questo è probabilmente vero, ma quel che ci interessa è comprendere la differenza tra un approccio imperativo e mutabile ("cambia il valore di numero, aumentandolo di una unità") e quello funzionale e immutabile ("risultato è pari alla somma tra il valore di numero e uno"). Visto un codice di questo tipo verrebbe subito voglia di creare una funzione che, dato un numero n, restituisce il valore di n + 1, vero? Non è un caso.

Sappiamo per certo che sia numero che risultato non cambieranno mai, il che ci tranquillizza nell'utilizzare queste costanti ovunque nel nostro programma. Vi è mai successo che il cambio di stato all'interno di un oggetto (alla cui implementazione magari non avete accesso) causasse conseguenze impreviste sul vostro codice? Un cosa del genere non capita mai in un linguaggio funzionale puro, semplicemente perché non esiste uno stato che possa mutare.
In effetti, i linguaggi funzionali classici non contemplano il concetto di "variabile" e tantomeno quello di "costante": in un linguaggio funzionale si maneggiano solo "valori" (e naturalmente le funzioni sono valori a loro volta).

Detto questo, e per le ragioni viste sopra (compatibilità con .NET e i suoi oggetti), F# è meno intransigente, e consente in realtà l'uso di valori mutabili:

let mutable numero = 10 numero <- 11 

Potete farlo, ma dovete essere espliciti, con tanto di parola chiave mutable ed operatore <- dedicati. I valori, anche in F# come negli altri linguaggi funzionali, sono immutabili per default.

L'immutabilità non è un concetto alieno allo stesso C#. Le stringhe per esempio sono immutabili, il che spiega perché in C# i metodi di una stringa restituiscono nuove stringhe invece di aggiornarla.

Ci si abitua in fretta ad usare valori invece di variabili. E se all'inizio può sembrare una gran perdita di tempo ben presto ci si rende conto dei notevoli vantaggi che l'immutabilità comporta, soprattutto in termini di stabilità del codice.

Fortemente tipizzato, come fosse dinamico

F# è fortemente tipizzato come C#, ma adotta un sistema di inferenza dei tipi che lo fa sembrare in tutto e per tutto un linguaggio dinamico. In C# abbiamo imparato (io con qualche resistenza) ad usare var per ottenere qualcosa di simile, ma F# sposta l'asticella a tutta un'altra altezza.
In effetti a parte rari casi non vi troverete mai a dichiarare un tipo in F#. Un esempio l'abbiamo già visto prima, vediamone un altro paio:

let x = 42 
let b = false

Il valore a destra dell'operatore consente di indovinare facilmente il tipo di valore. Fin qui non c'è molto di nuovo: potremmo considerare let l'equivalente di var in C#. Considerate però l'esempio seguente:

let d = new Dictionary<int,string>()

for kvp in d do
    printfn "%d: %s" kvp.Key kvp.Value

La seconda e terza riga sono interessanti, vero? L'inferenza dei tipi aiuta a rendere il codice estremamente compatto, il che, oltre a risparmiarci del lavoro, lo rende anche più leggibile.
Per una trattazione approfondita della inferenza dei tipi vi invito a leggere Overview of type inference in F#, da cui questi esempi sono tratti. Tra parentesi, se come il sottoscritto siete già abituati ad un linguaggio dinamico come Python, qui vi troverete a casa.

Una shell interattiva

Un'altra caratteristica interessante di F# che di nuovo ricorda i linguaggi dinamici è la sua shell interattiva (fsi.exe) che consente di sperimentare liberamente, anche man mano che si sta scrivendo il programma principale. In Visual Studio la attivate con Ctrl+Alt+F, oppure dal menu Viste. Potete anche lanciarla manualmente dal prompt dei comandi.

Inserite il codice come fareste nell'editor di testo, anche su più righe. Quando siete pronti a lanciarlo completate con una sequenza di due punti e virgola (;;).

Approfitto della shell per proporre un esempio di codice interessante, anche questo preso dal libro di Petriceck (pag. 42), che ci consente di vedere rapidamente una serie di caratteristiche interessanti del linguaggio:

> let numbers = [1 .. 10]
let isOdd(n) = n % 2 = 1
let square(n) = n * n
;;

val numbers : int list
val isOdd : int -> bool
val square : int -> int

> List.filter isOdd numbers;;
val it : int list = [1; 3; 5; 7; 9]

> List.map square (List.filter isOdd numbers);;
val it : int list = [1; 9; 25; 49; 81]

Andiamo con ordine. Definiamo una lista numbers che contiene i numeri da 1 a 10 (la sequenza è auto generata per noi), quindi due funzioni in linea: isOdd ci dice se un valore è dispari e square calcola il quadrato di un valore. Infine lanciamo la compilazione digitando i due punti e virgola. La shell ci risponde confermandoci che il sistema di inferenza dei tipi ha fatto il suo lavoro: numbers è in effetti un valore, nello specifico una lista di interi; isOdd una funziona che accetta un intero e restituisce un valore booleano; square invece accetta e restituisce valori interi.

Nella seconda fase invochiamo una funzione di libreria, List.filter, che accetta una funzione di convalida (isOdd nel nostro caso) e una lista di valori (numbers). I valori verranno passati uno alla volta alla funzione di convalida e, se convalidati, aggiunti a una nuova lista di valori in uscita. Poiché in questo caso diamo subito il comando di esecuzione (al solito, il doppio punto e virgola) possiamo apprezzare subito il risultato, ovvero la lista di numeri dispari contenuti in numbers.

La terza fase è simile alla prima, solo che questa volta usiamo un'altra funzione predefinita, List.map, la quale non fa altro che passare i valori in ingresso a una funzione che li manipola, nel nostro caso square. Come potete vedere qui ci complichiamo la vita usando il risultato di List.filter come serie di input. Il risultato è una lista con i quadrati dei numeri dispari in numbers.

Notate anche come in F# non si usano parentesi per passare parametri alle funzioni, cosa che inizialmente può creare confusione all'occhio non allenato (nel caso di List.map le parentesi sono state usate solo per indicare una precedenza). Questione di minuti, poi ci si chiede come possa essere altrimenti.

Niente parentesi e punti e virgola (yay Python!)

Come abbiamo già visto in F# è stato messo molto impegno nella semplificazione della sintassi: inferenza dei tipi, niente parentesi nei passaggi di parametri e, se non l'avete già notato, niente punti e virgola a chiudere le istruzioni; ma non finisce qui.

La novità senz'altro più interessante in questo ambito è l'adozione della indentazione a fini sintattici. Non è vera innovazione poiché diversi linguaggi (Python, Haskell, occam, ABC, ecc.) l'hanno adottata da tempo, e per un'ottima ragione: addio parentesi graffe!

let isOdd n =
    let mod = n % 2
    mod = 1

Tutto quel che è nidificato sotto la dichiarazione let fa parte della funzione isOdd. Notate anche che non c'è return. Non è necessario, o meglio, è sottointeso: una funzione restituisce sempre il risultato dell'ultima espressione contenuta al suo interno.

Piping come fosse LINQ (o viceversa?)

A ben guardare, il processo di ibridazione tra OOP e programmazione funzionale è avviato da tempo e C# e VB stanno lì a dimostrarlo. Le espressioni lambda vengono dai linguaggi funzionali, e LINQ è in effetti una vera e propria “bomba funzionale” innestata di soppiatto nell’universo .NET.
In LINQ quel che facciamo continuamente è passare il risultato di una elaborazione (funzione) ad un'altra funzione. In C#:

var interi = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var pari = interi.Select(e => e * 2).ToArray();

// {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}

In F# otteniamo lo stesso con l'operatore di piping:

let interi = [1 .. 10]
let pari = interi |> List.map(fun(x) -> x * 2)

// [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

Il valore a sinistra dell'operatore |> viene passato in ingresso alla funzione a destra.

Quale è il vantaggio del piping? Prima di tutto l'inferenza dei tipi, di nuovo. F# supporta l'inferenza da sinistra a destra dell'operatore, il che vuol dire che non è necessario definire il tipo dei valori in entrata.
Nell'esempio qui sopra non si apprezza una grande differenza perché usiamo una funziona anonima, ma in LINQ alcuni metodi come GroupBy richiedono che il tipo sia sempre conosciuto; ciò non è mai vero in F#.

let aumenta items = items |> Seq.map (fun i -> i + 1) 

In LINQ (che naturalmente è supportato in F#) diventa:

let aumenta (items:seq<_>) = items.Select(fun x -> x + 1) 

In cui dobbiamo definire il tipo di items. Man mano che si prende confidenza con lo stile funzionale viene naturale rendere il codice sempre più conciso. Il codice in effetti può essere ridotto in:

let aumenta = Seq.map ((+) 1) 

Aggiungo che mentre in C# il chaining dei metodi è possibile nel contesto di LINQ, il pipeline operator di F# è parte integrante del linguaggio e può essere (e di fatto viene) usato ovunque. Ecco un altro esempio che mette insieme molte delle cose viste finora:

let sommaDeiQuadrati = [1..10] |> List.map square |> List.sum 

Non si può certo dire che F# non sia un linguaggio conciso.

Altre cose belle e un consiglio

Ci sono molte cose eccitanti da scoprire in F#: pattern matching, unit of measure (queste le adoro), discriminated unions, type providers... ma io mi fermo qui.
Vi consiglio di non perdervi il famoso talk An Introduction to Microsoft F# di Luca Bolognese. Se non ci sono riuscito io, cosa più che probabile, lui senz'altro saprà convincervi a rispolverare quella vecchia idea di dare un'occhiata a F#. Meglio prima che poi.


read full article

#TecHeroes, il nuovo show italiano su Channel9

E-mail Stampa PDF

 

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

***

Ciao a tutti!

Sono felicissimo di presentarvi oggi #TecHeroes, il nuovo show italiano su Channel 9.

Questo show è rivolto a chiunque, che siate Developer, ma anche IT Professional, Studenti o Startupper, ogni settimana troverete interviste a Persone che vi racconteranno la loro storia, e di come, grazie alla Tecnologia, sia possibile creare vera Innovazione, diventando così i nuovi Eroi!

E questa è solo una parte, perché avrete anche modo di conoscere meglio i Technical Evangelist, che, insieme anche ad alcuni ospiti speciali, vi illustreranno tutte le novità sul mondo Microsoft.

Inoltre, questo show non si limita solo a presentarvi contenuti, ma vogliamo parlare con voi, quindi scriveteci, dateci feedback e fate domande su Twitter all’hashtag #TecHeroes!

Ma adesso, bando alle ciance, e scoprite tutto quello che c’è da sapere sullo show in questa prima puntata.

Vi aspettiamo su Twitter!

          Il team Developer eXperience & Evangelism di Microsoft Italia

TecHeroes Intro

E prima di lasciarvi, desidero fare, a nome di tutto il team Microsoft, un ringraziamento speciale a Eleonora Pellini per la creazione dei fantastici loghi, e a Ruggero Raimondi per la regia e il montaggio video.


read full article

Un esempio pratico di IoT: dal sensore ad Azure. Overview del progetto.

E-mail Stampa PDF

 

Internet of Things è sicuramente uno degli argomenti di maggiore interesse di questi tempi, non soltanto per le aziende, ma anche per studenti, sviluppatori, maker e appassionati. Nelle case, nelle città e nelle aziende il numero di oggetti connessi è in costante crescita, ma uno degli aspetti che lo rende un tema davvero interessante è sicuramente la possibilità di creare IoT. Si può cominciare con un semplice sensore in grado di rilevare dati grezzi, trasformandoli poi in informazioni, utili per effettuare analisi predittive o più in generale per eseguire determinate azioni o comandi.

L'obiettivo di questo post è quello di illustrare un progetto molto semplice che utilizza sensori per il rilevamento della luce e della temperatura, trasmettendo i dati rilevati su Azure e visualizzandoli in un website sotto forma di grafico. Questo progetto si ispira a Connect The Dots, un progetto molto più ampio ed in costante sviluppo realizzato da Microsoft Open Technologies , ma è stato semplificato al massimo allo scopo di fornire un esempio il più semplice possibile per permettere anche a chi è alle primissime armi di capire quali sono gli step da seguire per "creare IoT". In seguito, saranno pubblicati alcuni post di approfondimento che spiegheranno nel dettaglio step-by-step come potete implementare concretamente questo progetto utilizzando i vostri dispositivi.

Vediamo per prima cosa l'hardware che è stato utilizzato:

image

  • Una board Arduino Uno
  • Un sensore di temperatura
  • Un sensore di luce
  • Lo shield necessario per connettere in maniera molto semplice e rapida i sensori all'Arduino
  • Una Raspberry Pi B+ da utilizzare come gateway, indispensabile in questo esempio in quanto la scheda Arduino non ha la possibilità di connettersi direttamente a internet. E' importante però sottolineare il ruolo del gateway anche in termini di scenario più generale: se si pensa ad esempio ad una smart home, sarebbe complesso e costoso connettere ogni singolo oggetto direttamente alla rete. Sarà sicuramente molto più comodo ed economico interfacciare il frigorifero, la lavatrice e le tapparelle e ogni altro dispositivo ad un gateway all'interno della casa, il quale poi si occuperà della gestione dei dati ricevuti in ingresso e dell'opportuno indirizzamento sul cloud.

Una volta che il dato arriva online, si utilizzano i seguenti servizi di Azure per trasformare il dato grezzo e poco significativo in una informazione vera e propria, in questo caso grafica:

  • Azure Event Hub come punto di accesso al cloud
  • Azure Stream Analytics per l'analisi in tempo reale dei dati e l'esecuzione di determinate azioni
  • Una Azure Web App per la visualizzazione grafica dei dati. In pratica, si tratta del vecchio Azure Website, rinominato appunto Web App dopo l'introduzione di App Service. Per approfondimenti in merito a questo annuncio si può fare riferimento a questo blog post.

L'immagine sottostante è molto utile per capire qual è il processo per trasformare il dato in informazione utile

image

Vediamo ora nel dettaglio il percorso effettuato da ogni singolo dato rilevato:

Sensori e device: Arduino

I sensori di luce e temperatura sono connessi allo shield e, di consegunza, all'Arduino in maniera molto semplice. La scheda Arduino, ovviamente, è stata programmata con un codice che la rende in grado di leggere e interpretare in maniera adeguata gli input provenienti dai sensori, effettuando le opportune conversioni e serializzando i risultati in un JSON che viene poi utilizzato per il trasferimento dei dati da Arduino a Raspberry, tramite cavo USB.

Gateway: Raspberry Pi

Per la configurazione corretta del gateway è stato necessario un lavoro preliminare di installazione del sistema operativo e di alcune librerie, i dettagli verranno forniti nei successivi post di approfondimento.

Su Raspberry è stato caricato un codice che si occupa della lettura dei dati provenienti dalla porta USB, che vengono deserializzati ed inviati sul cloud. Ovviamente, assume un'importanza fondamentale la scelta del protocollo da utilizzare per impacchettare i dati, in modo da garantire sia la sicurezza delle informazioni sia la capacità da parte del cloud di interpretarli nel modo corretto.

Cloud: Event Hub

Come già detto, la porta di accesso a Azure è il servizio Event Hub, che è in grado di interpretare il protocollo AMQP. In questo post non entreremo nel dettaglio del codice utilizzato per interfacciare il gateway con Event Hubs, ma è importante sottolineare la necessità di inserire un riferimento al servizio di Azure all'interno del codice che è stato caricato su Raspberry.

In particolare, come si può notare nello schema, sono stati creati due distinti servizi su Event Hub: uno utilizzato per la semplice visualizzazione dei dati sul website, e l'altro per l'invio di alert al website quando si verifica una certa condizione.

Cloud: Stream Analytics

Per poter interpretare i dati che arrivano su Event Hub e prendere decisioni di conseguenza, è necessario utilizzare il servizio Stream Analytics. Si tratta di un servizio ancora in preview, pertanto per poterlo utilizzare si deve inviare una richiesta di accesso qui. Questo servizio è in grado di leggere i dati da Event Hub ed eseguire delle query per estrapolare le informazioni utili. Nel nostro esempio, lo abbiamo utilizzato per l'aggregazione dei dati e per inviare un alert al website nel momento in cui la temperatura supera un determinato valore di soglia.

Anche in questo caso, i dettagli dell'implementazione verranno forniti nei successivi post di approfondimento.

Cloud: Web App

Per la visualizzazione grafica delle informazioni è stato utilizzato un semplice website, che sfrutta le elaborazioni effettuate dai servizi Azure descritti in precedenza per fornire una rappresentazione grafica in tempo reale.

 

In conclusione, all'interno di questo post abbiamo mostrato tutti gli elementi fondamentali per per poter creare il vostro IoT, descrivendo le connessioni tra i vari elementi e il percorso che il dato deve effettuare per poter essere trasformato in un'informazione utile. Se volete implementare concretamente questo semplice scenario, seguite i prossimi post di approfondimento!


read full article

Guest Post: Integrare il login tramite Google nelle Universal Windows app

E-mail Stampa PDF

 

Questo post è stato scritto da Alessio Iafrate, Windows Developer e fondatore della community DotNetAbruzzo

 

Tutti prima o poi nelle nostre app ci siamo trovati davanti alla necessità di permettere all'utente di potersi autenticare tramite i social network più usati. Se avete la necessità di farlo tramite Facebook il modo migliore è seguire l'ottimo post scritto da Matteo Pagani su come Integrare Facebook nelle Universal Windows app che trovate QUI.

Come ben sappiamo però bisogna cercare di facilitare l'utente il più possibile e vista la grande quantità di persone che utilizza i servizi Google è giusto fornire anche il login tramite questo provider.

Purtroppo come spesso succede Google fa le cose un pochino diverse e quindi non basta cambiare le stringhe di connessione utilizzate con altri provider tipo il già citato Facebook ma bisogna seguire qualche passaggio in più.

Andiamo con ordine:

 

 

1° passo: Registrazione alle API di Google.

 

Per poter utilizzare le API dei servizi Google occorre innanzitutto recarsi all'indirizzo

https://console.developers.google.com/

e creare un nuovo progetto. Fatto ciò nella sezione APis & auth -> API sarà possibile scegliere quali API saranno utilizzate in questo progetto.

Ultimo passo sarà recarsi nella sezione APIs & auth -> Credentials e creare un nuovo Client ID

 

 

 

fatto questo avremo a disposizione tutti i dati per poter procedere.

 

2° Inserire il codice nella nostra app

 

Iniziamo con la cosa più importante, la definizione delle varie costanti che useremo.

 

 

#if !WINDOWS_PHONE_APP

public const string GoogleCallbackUrl = "urn:ietf:wg:oauth:2.0:oob";

#else

        publicconststring GoogleCallbackUrl = "http://localhost";

#endif

publicconststring GoogleClientId = "XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com";

publicconststring GoogleClientSecret = "YYYYYYYYYYYYYYYYYYYYYYY";

 

 

La cosa più importante, ma più difficile da trovare, è che per poter avere l'applicazione funzionante occorre utilizzare un indirizzo di callback diverso a seconda se ci troviamo in una applicazione per Windows Phone o per desktop, noi abbiamo gestito questo in modo molto elegante con la compilazione condizionale che ci mettono a disposizione le UA.

Fatto questo siamo pronti ad invocare il WebAuthenticationBroker per effettuare l'autenticazione tramite OAuth 2, in questo esempio utilizzeremo la versione per Windows Phone, ma come detto precedentemente nel link suggerito troverete tutti i dettagli per utilizzare l'autenticazione anche nelle app Windows 8

Nell'esempio seguente è stato richiesto il permesso

https://www.googleapis.com/auth/userinfo.email

che dà accesso a recuperare l'email dell'utente, naturalmente potremo inserire tutti i permessi di cui abbiamo bisogno nello stesso URL avendo l'accortezza di separarli con uno spazio bianco.

 

 

String GoogleURL = "https://accounts.google.com/o/oauth2/auth?client_id=" + Uri.EscapeDataString(Const.GoogleClientId) + "&redirect_uri=" + Uri.EscapeDataString(Const.GoogleCallbackUrl) + "&response_type=code&scope=" + Uri.EscapeDataString("https://www.googleapis.com/auth/userinfo.email");

System.Uri StartUri = newUri(GoogleURL);

System.Uri EndUri = newUri(Const.GoogleCallbackUrl);

WebAuthenticationBroker.AuthenticateAndContinue(StartUri, EndUri, null, WebAuthenticationOptions.None);

 

 

Una volta effettuata l'autenticazione verremo rimandati al nostro metodo ContinueWebAuthentication dove poter gestire l'avvenuta autenticazione.

 

 

publicasyncvoid ContinueWebAuthentication(WebAuthenticationBrokerContinuationEventArgs args)

{

    WebAuthenticationResult result = args.WebAuthenticationResult;

    if (result.ResponseStatus == WebAuthenticationStatus.Success)

    {

        //Estraggo il parametro code ed ottengo il vero token

        Uri uri = newUri(result.ResponseData.ToString());

        WwwFormUrlDecoder decoder = new WwwFormUrlDecoder(uri.Query);

        TokenResponse tr = await Utility.GetGoogleToken(decoder.GetFirstValueByName("code"));

    }

}

 

 

Andando ad analizzare il valore della variabile result.ResponseData ci troveremo davanti ad una stringa di questo tipo

 

 

http://localhost/?code=4/mpoxyWVYn_E0MbfBVuOjF99TrwFUx7DFcdabClbd1Sk.kqeNhfgjU04cyjz_MlCJoi0M4ylkjQI

 

 

A questo punto a differenza di quanto avviene con Facebook o simili dobbiamo eseguire un ulteriore passo, poiché quello ritornato non è il vero token da poter utilizzare per le successive richieste, ma un token da passare alla pagina https://accounts.google.com/o/oauth2/token che in caso di controllo positivo risponderà con un JSON simile al seguente con tutti i dati necessari.

 

 

{

  "access_token" : "ya29.TQE6noEOzeZKAt47_7Trth6jCiCs-8-EXyls-k5L7igj6hl04ghFa4PKaHPl0j5sZ5nsbtXTk8qwyw",

  "token_type" : "Bearer",

  "expires_in" : 3600,

  "refresh_token" : "1/ughE-aNXoFJc_wpCighj55ulV-tglkTdvjnlkf56SNs"

}

 

 

Procediamo quindi con la creazione di una classe in cui poter deserializzare il JSON ritornato

 

 

publicclassTokenResponse

{

    publicstring access_token { get; set; }

    publicstring token_type { get; set; }

    publicint expires_in { get; set; }

    publicstring refresh_token { get; set; }

}

 

 

e di un semplice metodo che prende in ingresso il codice ritornato precedentemente e si farà carico di ritornarci un oggetto di tipo TokenResponse popolato con tutti i dati che ci serviranno per poter gestire la nostra autenticazione.

 

 

publicstaticasync Task<TokenResponse> GetGoogleToken(string code)

{

 

    conststring TokenUrl = "https://accounts.google.com/o/oauth2/token";

 

    var body = newStringBuilder();

    body.Append("code=");

    body.Append(code);

    body.Append("&client_id=");

    body.Append(Uri.EscapeDataString(Const.GoogleClientId));

    body.Append("&client_secret=");

    body.Append(Uri.EscapeDataString(Const.GoogleClientSecret));

    body.Append("&redirect_uri=");

    body.Append(Uri.EscapeDataString(Const.GoogleCallbackUrl));

    body.Append("&grant_type=authorization_code");

 

    var client = new HttpClient();

    var request = new HttpRequestMessage(HttpMethod.Post, newUri(TokenUrl))

    {

        Content = new StringContent(body.ToString(), Encoding.UTF8, "application/x-www-form-urlencoded")

    };

    var response = await client.SendAsync(request);

    var content = await response.Content.ReadAsStringAsync();

 

    var serviceTequest = JsonConvert.DeserializeObject(content);

    return serviceTequest;

}

 

 

Seguendo questo approccio e modificando adeguatamente i permessi richiesti saremo in grado di poter richiedere l'autenticazione e ricevere il token per poter utilizzare tutte le API di tutti i servizi esposti pubblicamente da Google.

 

 

Se volete saperne di più, non esitate a contattarmi tramite il mio account Twitter @alessioiafrate oppure sul mio blog: http://www.acquariusoft.com


read full article

Novità Microsoft Azure: App Service

E-mail Stampa PDF

 

Il 24 marzo 2015 è stato annunciato il servizio di App Service, ora disponibile in Preview su Microsoft Azure.

App Service è l'unico servizio cloud che integra tutte le funzionalità necessarie per sviluppare rapidamente applicazioni web e per dispositivi mobili. Si tratta di un servizio completamente gestito da Azure, offerto come servizio Platform-as-a-Service e può essere integrato con strumenti che permettono il continuos deployment come Visual Studio Online e GitHub. Inoltre permette di avere un ambiente di staging per testare la soluzione che si sta sviluppando e switchare facilmente a un ambiente di produzione nel momento in cui lo sviluppo è terminato.

appservice

Insomma, si tratta di un singolo servizio che include al suo interno tutte le funzionalità degli Azure Website, degli Azure Mobile Service e dei servizi BizTalk, aggiungendo anche caratteristiche ulteriori.
Quello che si vuole offrire con un servizio simile è soprattutto la possibilità di avere un set integrato di funzionalità che permetta un'esperienza di sviluppo e gestione delle applicazioni unificata.

Il servizio mette a disposizione diverse componenti per la creazione di app con un’esperienza di sviluppo unificata:

  • Web App
  • Mobile App
  • API App
  • Logic App

App Service offre la possibilità di mettere insieme queste componenti come un singolo servizio integrato, permettendo di creare applicazioni che hanno come target sia il web che dispositivi mobili, utilizzando backend unici, integrati con sistemi on-premise come per esempio Office 365 e salesforce.com.
Inoltre, il servizio offre un set di caratteristiche e funzionalità che possono essere condivise tra più applicazioni.

aspreview

Ma vediamo più nel dettaglio ogni singolo elemento che compone il servizio.

WEB APP

WEB APP è una piattaforma completamente gestita che permette di costruire, eseguire il deploy e scalare a livello enterprise le applicazioni web in modo semplice e rapido. Il focus dello sviluppatore può limitarsi al codice, mentre Azure si occupa di gestire l'intera infrastruttura, la scalabilità e l'esecuzione dell'app in un ambiente sicuro.
Sostanzialmente questo servizio va a sostituire il servizio di Azure Website. Sul portale di gestione di Azure il servizio è già presente con il nuovo nome, mentre sul portale in Preview si trova all'interno del servizio di App Service.
Tutte le caratteristiche che erano offerte dal servizio di Website restano invariate, come la semplicità di configurazione e gestione della scalabilità manuale e automatica, la Gallery di framework preconfigurati e la possibilità di utilizzare strumenti di continuos deployment.

MOBILE APP

In più rispetto al servizio di Mobile Service, che resterà disponibile sul portale di gestione di Azure e completamente supportato, il servizio di MOBILE APP offre funzionalità ulteriori come il supporto del servizio di Traffic Manager, la possibilità di avere ambienti di sviluppo e di produzione tra i quali poter rapidamente switchare la propria soluzione, la possibilità di avere dei WebJob che vengono eseguiti in background per l’esecuzione di determinati task.
L’unificazione di WEB e MOBILE APP in un unico servizio consente anche un risparmio sui costi, in quanto è possibile effettuare un singolo deployment della propria applicazione e questa sarà disponibile direttamente sia per Web che per dispositivi Mobile, senza la necessità di andare a creare due servizi diversi su Azure.

API APP

Questo è un servizio nuovo che è stato introdotto con l'annuncio di App Service.  
In particolare, è pensato per migliorare l'esperienza di sviluppo da parte degli utenti cloud e rendere più semplice le fasi di creazione, pubblicazione e gestione delle API. Consente di creare un’API personalizzata per il proprio sistema e andarla a richiamare attraverso il servizio di LOGIC APP per implementare determinati flussi di operazioni o direttamente nelle MOBILE APP o WEB APP. È possibile, non solo creare API che possono essere utilizzate dalle proprie applicazioni, ma anche renderle disponibili in un marketplace e permettere ad altri di utilizzarle, o ancora utilizzare quelle già sviluppate da altri.
Una volta che si hanno a disposizione questi blocchi di codice possono essere inseriti all’interno delle applicazioni richiamandoli in modo semplice, utilizzando poche righe di codice.

LOGIC APP

Questo servizio permette di automatizzare in modo semplice i processi di business. Infatti permette di definire l'ordine in cui le API APP devono essere invocate all'interno dell'applicazione. Per esempio, tramite il tool grafico presente sul portale di gestione in preview, è possibile configurare un workflow che viene eseguito in modo automatico ogni volta che un’API viene richiamata, o quando vengono salvati dei dati all’interno di un DB, oppure secondo un timer preciso (ad esempio, ogni ora), e tramite questi flussi di operazioni è possibile andare a scatenare determinati azioni, come l’invio di un SMS o la pubblicazione di un post su Facebook o su Twitter, o ancora l’inserimento di uno schedule su un Calendar di Office 365.

image

Si può ben capire come un simile strumento possa facilitare molto e rendere più efficiente la gestione dei flussi operativi delle proprie applicazioni.

Al momento tutti questi servizi possono essere configurati e testati sul portale in preview.
Per avere maggiori informazioni a riguardo e trovare spunti per i vostri test potete visitare la pagina della documentazione ufficiale relativa al servizio che potete trovare al seguente link http://azure.microsoft.com/it-it/documentation/services/app-service/.

Continuate a seguirci per avere sempre tutti i dettagli sulle ultime novità di Microsoft Azure :)

J.


read full article

Visual Studio 2015: Annunciata la nuova linea di prodotti

E-mail Stampa PDF

Questo post è stato scritto da Ginevra Napoli, Product Marketing Manager Cloud & Dev Platform e Microsoft Student Partner

Ieri sera è stata annunciata la nuova linea di prodotti Visual Studio che sarà disponibile a partire da questa estate. L’obiettivo è quello di aumentare le funzionalità e la produttività indipendente dalla piattaforma o dal tipo di app che si sta sviluppando e rendere al tempo stesso più semplice la scelta dell’edizione che fa al caso vostro.

Visual Studio Premium e Visual Studio Ultimate verranno uniti in un unico tool: Visual Studio Enterprise con MSDN. Quest’ultima edizione andrà ad includere tutte le feature che fanno parte al momento della versione Ultimate oltre alle novità che faranno parte della release 2015. Quindi, oltre a Visual Studio Community e a Visual Studio Professional con MSDN, Visual Studio Enterprise con MSDN andrà a completare la nuova offerta disponibile con Visual Studio 2015. Resteranno invece pressoché invariate in termini di benefit: Visual Studio Professional, Team Foundation Server, Visual Studio Express e MSDN Platform.

clip_image002

Nuove funzionalità

Saranno molte le nuove funzionalità che entreranno a far parte della nuova suite Visual Studio 2015: CodeLens, feature che era disponibile esclusivamente in Visual Studio Ultimate, sarà adesso disponibile a partire dalla versione Professional, mentre le capacità di storyboarding su PowerPoint saranno disponibili per tutti gli utenti che avranno la versione Community, Professional o Enterprise. Se non lo avete ancora fatto, è possibile scaricare Visual Studio 2015 CTP 6 per testare le nuove feature presenti.

Come ottenere Visual Studio 2015

Tutti coloro che hanno una sottoscrizione Visual Studio Premium con MSDN o Visual Studio Ultimate con MSDN attiva riceveranno automaticamente l’upgrade alla versione Visual Studio Enterprise con MSDN. Inoltre il prezzo della versione Enterprise sarà significativamente minore rispetto alla versione Visual Studio Ultimate con MSDN attualmente presente.

Per i dettagli riguardanti le feature e i prezzi potete consultare Visual Studio 2015 Product Editions mentre per seguire le novità potete fare riferimento al Blog di Visual Studio in cui ieri sera è stato pubblicato l’annuncio ufficiale.


read full article

Windows 10 Preview: Project Spartan e Developer Tools

E-mail Stampa PDF

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

Nella notte di ieri è stata rilasciata la nuova build di Windows 10 per PC, dedicata al ramo “Fast” dei Windows Insiders, la 10049, che porta con se’ il nuovo browser di casa Microsoft: Project Spartan.
Questo nuovo browser sarà disponibile su tutto l’ecosistema di dispositivi supportati da Windows 10, ed è stato disegnato e costruito appositamente per il web moderno; è quindi veloce, e garantisce la compatibilità con la maggior parte degli attuali siti Web.

 clip_image002

Ma le novità non finiscono qui, Project Spartan, infatti, include tante altre funzionalità, come la possibilità di scrivere e disegnare direttamente sulle pagine web, per poi condividere facilmente sui social, o via mail, la propria “Web Note”; o ancora, una nuova Reading List che permette di raccogliere qualsiasi pagina, da leggere in seguito nella Reading View integrata, disegnata per eliminare qualsiasi distrazione e lasciare l’attenzione sul contenuto.
Ma questa è solo una piccola anteprima di tutto ciò che è possibile fare con Project Spartan, per approfondire, segui questo link.

Inoltre vi ricordo che settimana scorsa sono stati rilasciati i Developer Tools for Windows 10 Preview da utilizzare con Visual Studio 2015 CTP 6.
Grazie a questi potrete provare in anteprima la nuova Universal App Platform, e cominciare a sviluppare le vostre applicazioni per Windows 10, testando alcune delle funzionalità già disponibili nella preview, come l’Adaptive UX, o i nuovi User Control che si adattano automaticamente all’input dell’utente. Per tutti i dettagli e la documentazione relativa vi rimando a questo articolo.

clip_image004

Come scritto all’inizio, la nuova build 10049 è accessibile solo dal ramo “Fast”, questo perché, al momento della scrittura dell’articolo, contiene alcuni importanti bug che colpiscono soprattutto gli sviluppatori, in particolare non è possibile utilizzare gli emulatori, e il designer XAML crasha sia su Visual Studio che su Blend. Se quindi state utilizzando Windows 10 Preview a scopo di sviluppo, è raccomandato restare sul ramo “Slow” fino a che questi bug non saranno risolti.

Questo è solo l’inizio, molto altro sarà mostrato durante il prossimo //build/ del 29 Aprile… Stay tuned!


read full article

Un piccolo cambio nei rapporti con le community Dev

E-mail Stampa PDF

Sono tanti anni ormai che seguo, dal punto di vista tecnico, le community Dev italiane, Microsoft e non, dopo averne fatto parte per tanti tanti anni.

Ricordo con affetto tutti gli anni passati a discutere, lavorare insieme, organizzare eventi, cene, le avventure in giro per l’Italia e con alcuni di voi anche in Europa e negli States, le nottate in bianco, le soddisfazioni che mi avete dato, le mail, le telefonate, l’amicizia…

Scrivo questo post durante una pausa di Codemotion, dopo aver passato dei giorni fantastici ai Community Days, e proprio durante i Community Days abbiamo annunciato che il focus tecnico sulle community Dev passa ad Erica Barone, la nostra super evangelista che le persone delle community già conoscono per la sua disponibilità e professionalità, oltre alla sua competenza tecnica e alla sua passione per il mondo IoT!

image

Sono sicuro che darete tutti in *benvenuto* ad Erica in questa nuova avventura!

p.s. Naturalmente la nostra Sara Campagna continuerà a seguire assieme ad Erica la parte più organizzativa del rapporto con le community, gli eventi e tutte le altre attività correlate.

Buon lavoro ragazze!

image

p.s. naturalmente continuate a seguirmi, il @_geniodelmale non va in pensione! Occhiolino


read full article

Pagina 5 di 49

 
 
 
 
Certificazioni