giovedì 9 maggio 2013
Nel post precedente abbiamo visto come, con poche righe di codice, sia possibile catturare immagini con la Webcam e salvarle su disco nelle applicazioni per Windows 8.
La classe CameraCaptureUI, già descritta, permette di catturare anche video con un procedimento sintattico molto simile.
Ipotizziamo di avere un controllo MediaElement, che andrà a rappresentare il video una volta catturato:
<MediaElement Name="Media1" />
Ora consideriamo il seguente codice:
'Richiede le seguenti direttive:
'Imports Windows.Storage.Streams
'Imports Windows.Media.Capture
'Imports Windows.Storage
Dim stream As IRandomAccessStream
Private Async Function CaptureVideo() As Task
Dim camera As New CameraCaptureUI
'Imposta il formato video
'Il default è Mp4, alternativa è .Wmv
camera.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4
'E' possibile, ma non obbligatorio, impostare la durata max del video
camera.VideoSettings.MaxDurationInSeconds = 20
'Se la imposto, devo consentire per forza il trimming
camera.VideoSettings.AllowTrimming = True
Try
'Catturo il video, che viene salvato su disco nello spazio dell'app
Dim file As StorageFile = Await camera.CaptureFileAsync(CameraCaptureUIMode.Video)
If file IsNot Nothing Then
Me.stream = Await file.OpenAsync(FileAccessMode.Read)
Me.Media1.SetSource(Me.stream, file.ContentType)
End If
Catch ex As Exception
End Try
End Function
'Poichè sto riproducendo il video nel MediaElement,
'non posso fare il Dispose dello stream prima. Quindi, lo
'faccio nell'evento Opened del MediaElement
Private Sub Media1_MediaOpened(sender As Object, e As RoutedEventArgs) Handles Media1.MediaOpened
Me.stream.Dispose()
End Sub
Come vedete l'utilizzo è abbastanza simile a quanto abbiamo visto per le foto. Diciamo che:
- bisogna abilitare entrambe le capability Webcam e Microphone. Questo perché la cattura video può prevedere anche l'audio.
- La proprietà VideoSettings permette di gestire le impostazioni del video
- il formato predefinito di cattura è l'Mp4 ma si può scegliere anche il Wmv
- facoltativamente si può specificare un tempo max di durata per il video (MaxDurationInSeconds). E' importante specificare che questo valore non limita la cattura, ma limita la lunghezza del video dopo che l'utente ha eseguito il ritaglio (trimming) che a questo punto diventa obbligatorio
- Il trimming è facoltativo solamente se la durata del video non ha limite.
E' anche possibile, poi, salvare il video altrove o con un altro nome partendo dal riferimento del file ottenuto, come abbiamo fatto la volta scorsa per le foto.
Alessandro
L'interazione con il dispositivo e le sue periferiche multimediali è alla base di Windows 8 e il Windows Runtime offre delle interessanti API per catturare immagini e video dalla Webcam e dal microfono in modo molto semplice.
Si interagisce col namespace Windows.Media.Capture. Questo namespace mette a disposizione due interessanti classi, CameraCaptureUI e CaptureElement.
In questo post vedremo la CameraCaptureUI per la cattura di foto, dal momento che è la classe di più semplice utilizzo e immediate comprensione.
Questa classe espone un metodo asincrono chiamato CaptureFileAsync, che non solo consente di specificare la modalità di cattura (foto/video), ma anche di salvare automaticamente su disco, nello spazio riservato all'app, il contenuto catturato che poi può essere gestito come oggetto StorageFile.
Per quanto riguarda le foto in modo specifico, è possibile stabilire il formato, la qualità, funzioni a disposizione a seguito del "click" del fotografo.
Supponiamo di avere un controllo Image su una nostra pagina, definito in modo molto semplice, che conterrà il risultato della cattura:
<Image Name="Image1" />
A livello di code-behind il seguente codice mostra come inizializzare la Webcam per la cattura di immagini in formato .Png alla più alta qualità disponibile. Al termine della cattura, il file originato dalla cattura viene spostato, con un nuovo nome basato sulla data corrente, nella cartella delle immagini:
Private Async Function CapturePictureAsync() As Task
Dim camera As New CameraCaptureUI
'Imposta il formato. Possibilità: Jpeg, JpegXR, Png
camera.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Png
'Imposta la risoluzione più alta
camera.PhotoSettings.MaxResolution = CameraCaptureUIMaxPhotoResolution.HighestAvailable
Try
'L'enum CameraCaptureUIMode stabilisce se foto o video
Dim file As StorageFile = Await camera.CaptureFileAsync(CameraCaptureUIMode.Photo)
If file IsNot Nothing Then
'Dopo la cattura, si ottiene un riferimento al file ottenuto
Using ras As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.Read)
'si crea una BitmapImage basata sullo stream
Dim source As New BitmapImage
source.SetSource(ras)
'che va a diventare il contenuto del controllo Image
Me.Image1.Source = source
End Using
'Nome file basato su data corrente
Dim newFileName As String = "Capture_" + Date.Now.Day.ToString + _
Date.Now.Month.ToString + Date.Now.Year.ToString + "_" + _
Date.Now.Hour.ToString + Date.Now.Minute.ToString + _
Date.Now.Second.ToString + ".png"
'Sposta il file. Si può usare CopyAsync per sola copia
Await file.MoveAsync(KnownFolders.PicturesLibrary, newFileName)
End If
Catch ex As Exception
End Try
End Function
E' fondamentale ricordare che bisogna specificare la capability Webcam nel manifest dell'applicazione altrimenti la Webcam non verrà attivata neanche in fase di debug. Inoltre, poichè la nostra app accede alla cartella delle immagini, è necessario specificare anche la capability Picture Library.
Quando eseguite il codice, la Webcam verrà attivata e potrete impostare altre opzioni sulla qualità. A seguito del tocco sullo schermo, sarà possibile accettare, ritagliare o ri-catturare la foto:
.JPG)
Il ritaglio può essere gestito attraverso la proprietà PhotoSettings, che espone AllowCropping per abilitarlo o disabilitarlo, e CroppedSizeInPixels che stabilisce le dimensioni in pixel del ritaglio e CroppedAspectRatio che stabilisce il rapporto di proporzione di ritaglio.
La cattura di video avviene in modo simile, ma ne parleremo nel prossimo post.
Alessandro
mercoledì 8 maggio 2013
Come sapete, in Windows 8 ciascun utente può avere un'immagine identificativa, come una fotografia. Non è una novità di Windows 8, ma in questo post vediamo come gestire la cosa da una Windows Store App.
Fate bene attenzione: ogni app può cambiare questa impostazione, ma non è detto che lo debba fare per forza. Ad esempio, ha senso che un'app di fotoritocco permetta di fare questa attività, ma un notiziario difficilmente avrà necessità di farlo. Questa piccola premessa è necessaria, oltre che per un discorso di uso dell'app, anche per delle capabilities di cui parliamo dopo.
Si usa la classe Windows.System.UserProfile.UserInformation, la quale espone 4 metodi asincroni:
- SetAccountPictureAsync, che prende l'immagine da un oggetto StorageFile
- SetAccountPictureFromStreamAsync, che prende l'immagine da un oggetto di tipo RandomAccessStream
- SetAccountPicturesAsync, simile al primo ma che in un sol colpo prende un'immagine piccola, una grande e un video
- SetAccountPicturesAsyncFromStream, come il precedente ma che prende le info da un RandomAccessStream piuttosto che da oggetti StorageFile
Il seguente codice mostra come ottenere uno StorageFile consentendo all'utente di selezionare un file su disco attraverso un FileOpenPicker e come sia possibile impostare l'immagine utente attraverso il metodo SetAccountPictureAsync:
'Richiede le seguenti direttive:
'Imports Windows.Storage.Pickers
'Imports Windows.System.UserProfile
'Imports Windows.Storage
Private Async Function SetUserPictureAsync() As Task
Dim openPicker As New FileOpenPicker
openPicker.FileTypeFilter.Add(".jpg")
openPicker.FileTypeFilter.Add(".jpeg")
Dim pictureFile As StorageFile = Await openPicker.PickSingleFileAsync()
If pictureFile IsNot Nothing Then
Dim result As SetAccountPictureResult = Await UserInformation.SetAccountPictureAsync(pictureFile)
If result = SetAccountPictureResult.Success Then
'operazione andata a buon fine
ElseIf result = SetAccountPictureResult.ChangeDisabled Then
'l'utente non ha accettato la modifica
ElseIf result = SetAccountPictureResult.FileSizeError Then
'il file è troppo grande
ElseIf result = SetAccountPictureResult.LargeOrDynamicError Then
'l'immagine è troppo grande
ElseIf result = SetAccountPictureResult.Failure Then
'errore generico
End If
End If
End Function
Si noti come sia possibile conoscere l'esito dell'operazione attraverso il risultato di tipo SetAccountPictureResult.
Affinché il codice possa essere certificato e riconosciuto correttamente dal sistema, nel manifest del Package dobbiamo specificare la dichiarazione Account Picture Provider.
Questo ha una importante conseguenza: la nostra app verrà mostrata nelle impostazioni relative all'immagine dell'account, come si vede nella seguente figura:

Ciò significa che l'utente avrà la possibilità di scegliere la nostra app come strumento per cambiare l'immagine utente e l'app stessa deve essere in grado di reagire alla selezione in questa finestra.
L'aver scelto la dichiarazione Account Picture Provider, abilita un protocollo chiamato ms-accountpictureprovider. Nel metodo OnActivated della classe App, dobbiamo capire se l'attivazione dell'app stessa avviene tramite un protocollo e, se si, se si tratta del protocollo di nostro interesse:
Protected Overrides Sub OnActivated(args As IActivatedEventArgs)
If args.Kind = ActivationKind.Protocol Then
Dim protocolArgs = CType(args, ProtocolActivatedEventArgs)
If protocolArgs.Uri.Scheme = "ms-accountpictureprovider" Then
'l'utente ha richiesto di aprire l'app
'per modificare l'immagine dalle impostazioni PC
End If
End If
End Sub
A questo punto si potrà invocare, ad esempio, il precedente codice per consentire la scelta dell'immagine da disco e impostarla.
Alessandro
martedì 7 maggio 2013
Nel post precedente abbiamo visto come avviare, da codice, URI o file nelle applicazioni per Windows 8. Abbiamo visto come utilizzare i metodi LaunchUriAsync e LaunchFileAsync della classe Windows.System.Launcher.
Entrambi i metodi, in realtà, accettano un overload di tipo LauncherOptions che permettono di specificare, tra l'altro, la possibilità di mostrare il selettore di app per il tipo di contenuto che si sta aprendo.
Riprendiamo il codice del metodo che apre un'email e supponiamo di voler consentire all'utente con quale app voglia scrivere il nuovo messaggio. Lo possiamo riscrivere in questo modo:
Private Async Function SendEmailAsync() As Task
Dim options As New Windows.System.LauncherOptions
With options
.DisplayApplicationPicker = True
.UI.InvocationPoint = New Point(100, 400)
.UI.PreferredPlacement = Windows.UI.Popups.Placement.Above
End With
Dim mailMessageUri As New Uri("mailto:alessandro.delsole@visual-basic.it")
'Apre il client di posta
Dim result As Boolean = Await Windows.System.Launcher.LaunchUriAsync(mailMessageUri, options)
If result = True Then
'operazione andata a buon fine
Else
'operazione fallita
End If
End Function
L'istanza della classe LauncherOptions permette di impostare alcune proprietà:
- DisplayApplicationPicker, che mostra il selettore delle app.
- UI.InvocationPoint, che permette di stabilire in quale area dello schermo debba essere visualizzato il selettore.
- UI.PreferredPlacement, che permette di stabilire, in modo relativo a InvocationPoint, se il selettore debba essere in alto, in basso, a destra o sinistra.
Di proprietà ce ne sono altre, come ad esempio FallbackUri che permette di specificare un URI alternativo se non c'è alcuna app disponibile per aprire l'URI specificato, oppure PreferredApplicationDisplayName che consiste in una stringa che consente di suggerire all'utente la migliore app da usare.
Il codice di cui sopra produce il seguente risultato, lasciando all'utente libertà di scelta:

Alessandro
Come in ogni contest applicativo, anche le Windows Store Apps per Windows 8 possono avere la necessità di avviare altre applicazioni, siano esse Store App o applicazioni desktop.
Nel mondo .NET classico, siamo abituati a usare Process.Start o un'istanza di Process per gestire l'avvio di applicazioni esterne.
In Windows Runtime, non è così nel senso che non possiamo lanciare applicazioni in modo arbitrario. In WinRT si lanciano gli URI, che già sapete cosa sono, per ciascuno dei quali è associato uno schema.
Ad esempio, lo schema http:// farà si che venga aperto il browser predefinito per l'URI specificato. Questo è forse scontato, ma magari non sapete che lo schema bingmaps:/// è registrato e consente l'apertura di mappe per la query string specificata.
L'avvio di app esterne avviene attraverso metodi della classe Windows.System.Launcher. Il primo metodo che consideriamo è LaunchUriAsync. Questo metodo si usa con schemi per protocolli Web, come ad esempio http:// e mailto:. Se il protocollo utilizzato è http, verrà sempre avviato il Web browser predefinito indipendentemente dal contenuto. Il seguente codice mostra un esempio di come aprire un sito Web:
Private Async Function ViewInBrowserAsync() As Task
Dim webSiteUri As New Uri("http://www.microsoft.com")
Dim result As Boolean = Await Windows.System.Launcher.LaunchUriAsync(webSiteUri)
If result = True Then
'operazione andata a buon fine
Else
'operazione fallita
End If
End Function
Se invece il protocollo è mailto: verrà aperto il programma di posta elettronica predefinito (nel mio caso Outlook 2013, quindi applicazione desktop):
Private Async Function SendEmailAsync() As Task
Dim mailMessageUri As New Uri("mailto:alessandro.delsole[@]visual-basic.it")
'Apre il client di posta
Dim result As Boolean = Await Windows.System.Launcher.LaunchUriAsync(mailMessageUri)
If result = True Then
'operazione andata a buon fine
Else
'operazione fallita
End If
End Function
Molto più interessante è la possibilità di aprire l'app delle mappe di Bing, sfruttando il protocollo bingmaps:///. Il seguente codice mostra come avviare l'app delle mappe e mostrare tutti i ristoranti della città di Cremona:
Private Async Function ShowMapAsync() As Task
Dim mapUri As New Uri("bingmaps:///?q=ristoranti&where=cremona")
'Apre l'app delle mappe
Dim result As Boolean = Await Windows.System.Launcher.LaunchUriAsync(mapUri)
If result = True Then
'operazione andata a buon fine
Else
'operazione fallita
End If
End Function
Dove q indica cosa cercare e where indica dove cercarlo. Non è una cosa da sottovalutare, ho visto fare questa domanda molte volte. Lo schema delle mappe e le relative query string sono descritti qui.
Diverso è il discorso per i file, visto che non esiste un protocollo specifico. Esiste, però, un metodo chiamato LaunchFileAsync che permette di aprire il programma predefinito per l'estensione del file specificato. Tenuto conto della sandbox in cui girano le Windows Store Apps, il seguente codice mostra come aprire un file di pertinenza dell'applicazione:
'Richiede Imports Windows.Storage
Private Async Function OpenFileAsync() As Task
Dim myFile As StorageFile = Await Package.Current.InstalledLocation.GetFileAsync("MioDocumento.pdf")
If myFile IsNot Nothing Then
Dim result = Await Windows.System.Launcher.LaunchFileAsync(myFile)
If result = True Then
'Operazione riuscita
End If
End If
End Function
Il metodo in questione vuole un oggetto di tipo StorageFile, che rappresenta un file contenuto nello storage riservato all'applicazione. Questo per ragioni di sicurezza, ovviamente una Windows Store App non può e non deve andare a prendere file in giro per il sistema. L'oggetto Package.Current rappresenta l'istanza del package dell'applicazione, InstalledLocation ovviamente la posizione su disco e GetFileAsync permette di ottenere un riferimento al file. Il metodo LaunchFileAsync, a questo punto, non farà altro che avviare il programma predefinito per quel file.
Alessandro
lunedì 6 maggio 2013
{Premessa}
Piccola premessa al post: vivere esperienze internazionali mi ha insegnato che se un prodotto, uno strumento, una tecnologia non vengono apprezzati o adottati in Italia non vuol dire che non siano validi e soprattutto non vuol dire che il prodotto stesso non abbia invece un gran successo all'estero. Parentesi chiusa 
Breve Intro
Come forse sapete, con il rilascio di Visual Studio 2012 Update 2 sono stati rilasciati anche i bit finali del client HTML per LightSwitch, che consente di allargare gli orizzonti dello sviluppo rapido di applicazioni line-of-business anche al mondo mobile, consentendo di generare applicazioni basate su HTML5/JavaScript, anche senza conoscerli, che siano fruibili da dispositivi quali tablet, telefoni, sistemi Android, iOS, Windows Phone, Windows 8 etc. etc. etc.
Viene dato il risalto più ampio possibile al mondo Web, Cloud e mobile. Questo è il succo.
L'interfaccia grafica si basa sul Microsoft Design Style e permette una fruizione ottimale su dispositivi dotati di touch screen.
Si tratta di un importante passo, chiesto a gran voce dalla comunità di sviluppatori Worldwide, che ha dimostrato, ancora una volta, l'apertura di mente di Microsoft nei confronti di altre piattaforme (che non sempre fanno la stessa cosa, leggi: quelli della mela morsicata). Sicuramente un passo necessario per rimanere competitivi, ma comunque non scontato.
In breve: cosa ci permette di fare
Con questo update, Visual Studio LightSwitch giunge alla sua terza versione. Dedicherò articoli e post tecnici specifici sulla creazione di applicazioni mobili con il client HTML5, nel frattempo potete guardare qualche video su LightSwitch Tips & Tricks, mentre in questo post voglio fare qualche considerazione sulla direzione che sta prendendo il prodotto, potendo godere di un punto di osservazione privilegiato dovuto ai rapporti quasi quotidiani col Team di LightSwitch a Redmond.
In breve, il client HTML5 ci permette da una parte di sfruttare l'approccio che già conosciamo (dati + screen = applicazione Web portabile), dall'altra ci permette di fruire dell'applicazione attraverso un qualsiasi browser Web che supporti HTML5, come nelle seguenti figure che dimostrano un'app all'interno di un iPad emulato e di tre device Windows (miei
):


Tutto molto bello, infatti molti sviluppatori che lavorano su piattaforme mobili diverse si stanno avvicinando a LightSwitch grazie al client HTML. Ma c'è chi viene e c'è chi va, molti sviluppatori desktop si sono spaventati quindi facciamo un po' di chiarezza.
E le postazioni desktop? E la mia immarcescibile filosofia Windows Forms?
{Nota: per desktop intendiamo applicazioni sia in-browser che out-of-browser, di tipo data-entry/consultazione, utilizzate in azienda su pc da tavolo e laptop}
Ricordo un amico MVP americano il quale disse senza fronzoli al Team di LightSwitch: non dimenticate il mondo Windows Forms, riferendosi sarcasticamente a coloro che mai abbandoneranno la mentalità a cui Windows Forms ha abituato gli utenti, anche nel 2013, e che usano LightSwitch per applicazioni di data-entry e consultazione su postazioni desktop con sistemi Windows, sapendo ovviamente che le applicazioni LightSwitch per il desktop si basano su Silverlight 5 e ASP.NET.
Chiarimento importante: è pacifico che il mondo desktop esiste e continua ad essere supportato e lo sarà per lungo tempo. Nessuno però può ancora sapere cosa intenderà fare Microsoft in futuro. Di certo, ci sono cose che dal client HTML non si possono fare e che non avrebbe senso fare da un telefono. Ci sono requisiti che si devono implementare attraverso applicazioni desktop, non fosse altro per le maggiori risorse che possono utilizzare e le maggiori interazioni col sistema che possono avere.
Basti pensare alla gestione di ruoli e utenti, che il client HTML non consente di fare e che va fatta attraverso il consueto client Silverlight (a meno che non siate disposti a deleteri bagni di sangue e conosciate JavaScript e la sua interazione con ASP.NET come le vostre tasche).
Il target di sviluppatori
Un primo cambiamento si ha nel target degli sviluppatori che LightSwitch v3 vuole abbracciare. Le nuove possibilità, i nuovi strumenti, le piattaforme utilizzate, lasciano ben intendere che LightSwitch tende ad allungare il passo e non è più quello strumento per c.d. "power users" a cui pensavamo nella prima versione.
LightSwitch v3 è uno strumento sfacciatamente indirizzato a sviluppatori professionisti che, per loro fortuna o sfortuna, devono avere a che fare con Web e portabilità.
Un primo segnale si è avuto con la v2: LightSwitch non è più venduto come prodotto autonomo, ma è incluso solamente in Visual Studio 2012 Professional o superiore. So bene che ci sono developer che hanno investito nell'edizione stand-alone, ma non posso farci nulla 
Gli sviluppatori Access che guardavano a LightSwitch con interesse probabilmente storceranno il naso, è anche però vero che l'esperienza insegna che pochissimi sono i power users che hanno avvicinato LightSwitch; bene o male sono sempre stati sviluppatori di professione ad iniziare ad usarlo per gli scopi più disparati e questa è la direzione.
Il target di utilizzo
Sempre più aziende dotano i propri dipendenti che svolgono i loro compiti in mobilità di dispositivi in grado di accedere alle applicazioni aziendali, dall'interno e dall'esterno. Basti pensare a rappresentanti, a magazzinieri.
La diffusione di tablet e smartphone (senza distinzione di piattaforma) nell'uso quotidiano lavorativo e di intrattenimento ha avuto la ovvia conseguenza di desiderare un client LightSwitch portabile. Ma portabile non vuol dire solo Web per come lo abbiamo sempre inteso. Portabile vuol dire anche Cloud. E Microsoft è da sempre in prima linea, parlando di Cloud. E allora parliamone.
Windows Azure, Office 365, SharePoint Online
Windows Azure e Office 365 sono le piattaforme Cloud più conosciute. Windows Azure è la "madre" ed è di tipo Platform-as-a-service, mentre Office 365 è di tipo Software-as-a-service e si basa proprio su Windows Azure.
Come in ogni tradizione che si rispetti, quando ti danno una piattaforma applicativa devono anche darti gli strumenti per fare le applicazioni. Ed ecco il client HTML di LightSwitch.
Visual Studio dà a LightSwitch la possibilità di pubblicare le applicazioni HTML5 sempre in pochissimi e facili passaggi. Il plus è che LightSwitch v3 si integra alla perfezione con SharePoint, sia "classico" che quello online su Office 365.
La Cloud diventa quindi compagna di LightSwitch, mettendo a disposizione Windows Azure come hosting rapido di applicazioni LOB per immediata produttività e Office 365/SharePoint 2013 online per l'hosting di applicazioni LOB aziendali, che sono così in grado di sfruttare gli strumenti offerti da SharePoint stesso.
Certamente ciò che era prima rimane invariato, quindi pubblicazione su server IIS, ma molti passi avanti sono stati fatti per la Cloud. Non è un caso, infatti, che se pubblichiamo un'applicazione LightSwitch sul nostro account di Azure, il database intrinseco viene anche automaticamente pubblicato su SQL Azure, cosa non prevista nelle precedenti versioni. Ancora, se la nostra applicazione viene pubblicata su SharePoint/Office 365, il database verrà ospitato su di un SQL Azure che fa parte dello spazio a disposizione del nostro account Office 365. Noi non lo vedremo, non lo maneggeremo, ma è così che funziona. E funziona molto bene!
La portabilità con OData
Non dimentichiamo, comunque, che LightSwitch v2 ha introdotto il supporto al protocollo OData. Questo vi permette di esporre dati ad altri client in grado di leggere XML e di consumare dati di altri nello stesso formato. Che, tradotto, vuol dire che se anche non ho portabilità di interfaccia grafica ho portabilità dei dati. Cosa particolarmente importante per chi non mangia grazie al mondo Web/Mobile/Cloud ma vive di desktop.
In conclusione
Il futuro è sempre più mobile, o almeno così si prevede. E la Cloud è entrata ormai nella nostra vita quotidiana, anche se non vogliamo farcene una ragione; non pensate solo a Windows Azure o a Office 365, ma pensate ai vostri contatti sincronizzati, calendari sincronizzati, SkyDrive, iCloud, ecc. ecc.
LightSwitch spinge in questa direzione. Null'altro si sa, ma ciò che si sa è questo. Se lo usate già o se intendete utilizzarlo per applicazioni interne di tipo desktop, comunque, (continuare a) farlo è sicuramente una scelta conveniente, indipendentemente dalle sorti di Silverlight.
Come promesso, seguiranno post, articoli, video che spiegano come creare in pratica applicazioni basate sul client HTML5 in LightSwitch.
Alessandro
venerdì 3 maggio 2013
Probabilmente molti di voi conosceranno già WebMatrix, strumento per lo sviluppo di siti Web che, oltre alla sua flessibilità, deve la sua fama al fatto di essere gratuito.
WebMatrix è giunto alla versione 3 e la novità più importante è l'integrazione con Windows Azure. In sostanza, ora potete gestire, aprire, manipolare i vostri Web Sites direttamente dall'interno dello strumento.
Inoltre, è possibile gestire lo sviluppo dei siti in Team sfruttando Team Foundation Server e GIT per il controllo dei sorgenti.
Ulteriori dettagli e link per il download (che avverrà attraverso la Web Platform Installer) a questo indirizzo.
Alessandro
Il 20 e il 21 Maggio si terrà il secondo giro dei Community Days, la prestigiosa conferenza organizzata dalle più importanti community italiane, questa volta nella soleggiata Catania presso la cittadella universitaria.
L'agenda è online e, se siete da quelle parti o volete farvi un giro, non potete non iscrivervi 
Si parlerà delle più recenti e importanti tecnologie Microsoft, come nello spirito della conferenza, tra cui ASP.NET 4.5, MVC, Windows Azure, sviluppo per Windows 8 e Windows Phone.
Con i migliori speaker, ovviamente.
Alessandro