Blog Stats

  • Blogs - 41
  • Posts - 4232
  • Articles - 185
  • Comments - 23656
  • Trackbacks - 950

Bloggers (posts, last update)

Powered By:
Powered by Subtext

Latest Posts

Connect(): Le novità per Xamarin

Xamarin è una tecnologia che, per vari motivi, mi interessa particolarmente. Come riportato nel blog ufficiale, per Xamarin ci sono le seguenti novità e annunci (in alcuni casi si tratta di RTM di prodotti già in preview):

  • Xamarin Profiler, dedicato a Visual Studio Enterprise, che consente di analizzare performance e scoprire colli di bottiglia e memory leak nelle proprie app per Android, iOS e Windows.
  • Xamarin Inspector, uno strumento per Visual Studio Enterprise che si collega all'app in fase di debug e consente di analizzare, modificare e visualizzare in tempo reale il comportamento della UI
  • Xamarin Workbooks, una console interattiva per esplorare le funzionalità di C# contestualizzate sullo sviluppo Android, iOS, UWP e anche WPF
  • Remote iOS Simulator, che consente di avere una visualizzazione dell'app simulata senza lasciare l'IDE

Nel blog ufficiale di Xamarin c'è inoltre un post riepilogativo della giornata di oggi e delle relative novità annunciate a Connect();

Alessandro

posted @ 16/11/2016 21:36 by Alessandro Del Sole

Connect(): Visual Studio 2017 RC, Visual Studio for Mac e molto altro

Oggi è iniziata la conferenza Connect(); di Microsoft e subito ci sono stati tanti annunci succulenti. Innanzitutto la Release Candidate di Visual Studio 2017, con tantissime novità a livello di IDE e di strumentazione, tra cui (ma non solo) IntelliSense migliorato, installazione semplificata, novità sugli unit test, apertura di cartelle di file senza progetto, code style, Find All References a gerarchia, novità in termini di extensibility.. e molto altro.

Post di annuncio qui.

Altra novità incredibile, la preview di Visual Studio for Mac, un ambiente di sviluppo nativo per Mac, iOS, Android e .NET Core utilizzando C# e F#. Non si tratta di un tool code-centric come VS Code, ma di un vero e proprio IDE completo con tanto di finestre di progettazione, IntelliSense e.. powered by Roslyn! Altro segnale della lungimirante visione della nuova Microsoft.

Post di annuncio qui.

Sempre sul fronte dello sviluppo cross-platform, due importanti annunci: Visual Studio Mobile Services (preview), un insieme di servizi basati su cloud per chi sviluppa app per Android e iOS e certamente .NET Core 1.1, la nuova versione del runtime modulare e cross-platform che gira su Linux, Mac e Windows e le distribuzioni specificate in questa pagina di annuncio.

Altre novità riguardano l'ALM con Team Foundation Server 2017 e Visual Studio Team Services, in cui compare il nuovo package manager e molto altro.

Non da ultimo, Microsoft diventa partner della Linux Foundation per l'open source. Un sempre maggiore impegno su altre piattaforme che certamente porterà grossi benefici a Redmond.

Potete seguire i restanti due giorni della conferenza via streaming su Channel9.

Alessandro

posted @ 16/11/2016 20:26 by Alessandro Del Sole

Segui Connect(); in streaming

Dal 16 al 18 novembre si terrà, a New York, l'ormai annuale conferenza Microsoft chiamata Connect();

Anche quest'anno sarà possibile seguirla in streaming, utilizzando le informazioni a questo indirizzo.

Ci saranno tanti annunci succosi, molti di più di quelli trapelati in rete... quindi non perdetevela

Alessandro

posted @ 14/11/2016 20:06 by Alessandro Del Sole

Visual Studio Code: version control con Visual Studio Team Services (Windows e Mac)

Come sapete, Visual Studio Code è uno strumento estremamente utile e versatile. E' uno strumento di sviluppo cross-platform di cui mi sono personalmente occupato col mio ebook Visual Studio Code Succinctly e con una sessione a Future Decoded (a proposito, se l'avete persa potete rivedere lo streaming).

Tra le varie caratteristiche che lo connotano come strumento di sviluppo e non come semplice editor, c'è l'integrazione nativa con Git, il popolare motore di version control anche lui open source e cross-platform. Nell'ebook ho spiegato come integrare Code con GitHub, in questo post spiegherò invece come integrare Visual Studio Code con i repository Git di Visual Studio Team Services, sia con Windows che con Mac.

Prerequisiti
Vi occorrono alcune cose:

  • Visual Studio Code
  • Un account su Visual Studio Team Services. Ricordate che è gratuito fino a 5 persone nello stesso team
  • Git. Se avete installato Visual Studio 2015, dovreste già averlo. Su Mac, dovreste già averlo se avete installato XCode. Altrimenti, che siate su Windows o su Mac, seguite le istruzioni nell'apposita pagina di download.
  • .NET Core e la relativa CLI.
Obiettivi
Raggiungeremo due obiettivi: aggiungere un progetto .NET Core a un repository appena creato e clonare un repository esistente.

Creazione di un repository con Visual Studio Team Services
Do per assunto che abbiate creato il vostro account e che siate entrati nel portale, normalmente raggiungibile a nomeutente.visualstudio.com. Nell'home page troverete un link per creare un nuovo Team Project, esattamente come fareste per l'engine di TFS. Quando pronti, specificate il nome per il team project, un'eventuale descrizione e accertatevi che Git sia selezionato come engine per il source control:



Dopo aver cliccato Create project, ci sarà una pagina di benvenuto in cui cliccherete su Add some code. Vi verrà offerta la possibilità di clonare il repository tramite Visual Studio, ma non ci interessa. Vi verrà fornito l'URL del repository e dovrete specificare le credenziali associate a Git. L'URL del repository servirà tra poco, quindi copiatelo da qualche parte o in memoria. Sebbene sia possibile specificare nome utente e password, è preferibile generare un token. Questo servirà più avanti in Visual Studio Code, quindi cliccate su Create a personal access token (se ne avete già uno, potete saltare questo passaggio):



Nella pagina di creazione del token dovrete specificare un friendly name, la durata e l'account. Quest'ultimo è necessario perché il vostro indirizzo email potrebbe essere associato a più account su VSTS e questa pagina è svincolata dal repository. Scegliete l'account in cui avete creato il repository Git. Quando create il token, assicuratevi di avere selezionato i permessi come in figura:



E' interessante il permesso Work items: questo vi fa capire che sarà possibile gestire anche le pull requests. Dopo aver fatto click su Create Token, verrà visualizzato il token generato. Importante: copiatelo da qualche parte e conservatelo, servirà tra poco e soprattutto non perdetelo perché è l'unica volta in cui lo vedrete.

Creazione di un progetto di esempio

La configurazione del repository Git con VS Code vale con qualunque cartella di file che Code stesso sia in grado di gestire, ma per comodità lo faremo con un progetto .NET Core. Aprite un prompt dei comandi, e all'interno della cartella in cui vorrete creare il progetto, digitate la seguente riga:

> dotnet new -t web WebApp

Questo creerà un nuovo progetto ASP.NET Core in C#. Fatto questo, aprite il progetto appena creato con Visual Studio Code. All'avvio, vi verrà detto che deve creare dei file di supporto e ripristinare i pacchetti NuGet. Dite di si ad entrambe le richieste.

Configurazione di Visual Studio Code

I passaggi illustrati di seguito sono identici anche su Mac e Linux, in questo caso uso Windows. Affinché Code sia in grado di dialogare con Visual Studio Team Services, è necessario installare l'omonima estensione, gratuita e fornita da Microsoft:



Nel mio caso è già installata, quindi il pulsante è disabilitato. Una volta installata e riavviato Code, dal pannello a sinistra cliccate sull'icona di Git, quindi su Initialize Git repository. Questo passaggio è necessario perché, come sapete, Git lavora prima di tutto con un repository locale e solo successivamente con uno remoto. Fate un primo commit con un commento a piacimento, in locale:



Ora che avete configurato il repository locale e associato il progetto ad esso, è necessario associare anche il repository remoto. Aprite un prompt dei comandi sulla cartella che contiene il progetto e digitate le seguenti righe:

> git remote add origin https://nomeaccount.visualstudio.com/_git/nomerepository
> git push -u origin master

Nella prima riga, ovviamente sostituirete nomeaccount col nome del vostro account su VSTS e nomerepository con il nome del repository creato in precedenza. La seconda riga fa una prima sincronizzazione della branch master col repository remoto e, di fatto, completa l'associazione.

Tornate a Visual Studio Code. Ciò che bisogna fare ora è associare l'ambiente col repository remoto. In realtà è presto fatto. Avete due alternative: cliccare l'icona Team nella status bar in basso a sinistra, oppure digitare Team login nella command palette. Nel primo caso vedrete comparire questo errore:



Cliccando su Close, o comunque dalla command palette, avrete poi la possibilità di inserire il token che avete creato in precedenza nel portale di Visual Studio Team Services:



A questo punto sarete autenticatie Visual Studio Code si accorgerà automaticamente del fatto che il repository locale ha un corrispondente remoto, come testimoniato dalla status bar in cui vedrete comparire il nome del repository più una serie di icone che vi serviranno per gestire le branch e le pull request (ma di cui non ci occuperemo):



Vicino al nome della branch corrente, master in questo caso, comparirà il pulsante per fare il sync. Prima, però, fate un commit perché l'associazione al repository remoto ha causato la creazione di due file. Fatto il commit, cliccate l'icona di sincronizzazione. Dopo alcuni secondi potrete vedere il vostro codice su Visual Studio Team Services:



Ora siete pronti a collaborare in team al progetto. Ovviamente, gli altri membri del team dovranno clonarlo. Lo descrivo nei prossimi passaggi, che ovviamente valgono nel clonare un repository già esistente e non necessariamente appena creato come nel nostro caso.

Clonazione del repository (Mac edition)

Per descrivere come fare per clonare un repository Git su Visual Studio Team Services per Visual Studio Code, utilizzerò Mac. Passaggi ovviamente identici anche su Windows e Linux. Su Mac, create una cartella all'interno della quale vorrete clonare il repository ed aprite un'istanza del Terminal su quella cartella. Fatto questo, digitate la seguente riga:

> git clone https://nomeaccount.visualstudio.com/_git/nomerepository

sostituendo, ovviamente, nome account e nome del repository. Dopo qualche secondo vi verrà chiesto indirizzo email e password. L'indirizzo email è quello associato all'account VSTS, la password invece è sempre il token creato all'inizio. Nota bene: Mac non mostra alcun carattere quando digitate o incollate una password, quindi anche se rimane tutto bianco non temete:



Completata la clonazione, sarete pronti per aprire il progetto in Visual Studio Code, ovviamente dopo aver installato, anche su Mac (o Linux) l'estensione per Visual Studio Team Services:



I commit che farete verranno inviati al repository remoto e gli altri membri del team saranno in grado di collaborare al progetto semplicemente sincronizzando con l'apposita icona.

Visual Studio Team Services è un ambiente estremamente potente e offre i vantaggi della Cloud, quindi combinarlo con Visual Studio Code rende quest'ultimo un compagno molto valido nello sviluppo su altre piattaforme.

Alessandro

posted @ 24/10/2016 02:00 by Alessandro Del Sole

Ciao LightSwitch, benvenute PowerApps

Era nell'aria da un po'. Qualche Insider come me lo sapeva già da tempo, ma ora è arrivata la notizia ufficiale: LightSwitch, strumento per la creazione semplificata di line-of-business applications con Visual Studio, non avrà seguito.

Visual Studio 2015 è l'ultima edizione in cui LightSwitch rimane disponibile. Le ragioni sono varie, ma non entro nel merito. Non è mio compito, sebbene sia molto dispiaciuto anche perché ho personalmente investito molto in questo tool.

Anche la nostra community LightSwitch Tips & Tricks è stata dismessa, già da un po' a dire il vero.

Ad ogni modo, Microsoft sta lavorando su PowerApps, nuova serie di strumenti per la creazione semplificata di line-of-business applications pensate però per essere cross-platform e cross-device, un importante e deciso passo in avanti verso quella che è l'evoluzione del mondo applicativo.

PowerApps è già utilizzabile, esiste anche una Universal Windows app per Windows 10 attraverso cui creare delle applicazioni. E' però richiesto un account Office 365.

Il blog post ufficiale della notizia è questo:

https://blogs.msdn.microsoft.com/lightswitch/2016/10/14/lightswitch-update/

Alessandro

posted @ 15/10/2016 11:10 by Alessandro Del Sole

Future Decoded e Community Days 2016 anche in streaming

E' una comunicazione che abbiamo passato in community con varie forme, ma repetita iuvant quindi, se non avete possibilità di venire a Milano giovedì e venerdì 6 e 7 ottobre per l'evento dell'anno, potete ugualmente godervi l'evento in diretta streaming registrandovi gratuitamente a Future Decoded / Community Days 2016 registrandovi qui: https://www.microsoft.com/italy/futuredecoded/

Avrò il piacere e l'onore di parlare di Visual Studio Code dalle 12.55 alle 13.55 del giorno 6, ma soprattutto voi non dovete perdervi l'appuntamento col grande Scott Guthrie venerdì

Per chi viene, ci vediamo li!

Alessandro

posted @ 04/10/2016 23:57 by Alessandro Del Sole

Copia di oggetti .NET nelle Portable libraries

Come sapete, in .NET esistono i concetti di shallow copy e deep copy per la copia di oggetti. In molti casi, non quando si espongono API pubbliche, si può implementare l'interfaccia ICloneable per rendere un reference type "copiabile".

Tuttavia ICloneable non è disponibile in tutte le piattaforme, quindi non è ad esempio utilizzabile nelle Portable Class Libraries. Le tecniche di copia sono tante, ma una semplice può essere posta in atto ricorrendo alla serializzazione JSON.

Quindi installiamo l'ultima versione del pacchetto NewtonSoft.Json da NuGet e, in una classe statica (o modulo in VB), scriviamo questo metodo extension generico:

Visual Basic

Public Module Extensions
    <ExtensionPublic Function Clone(Of T)(source As TAs T
        If (Object.ReferenceEquals(source, Nothing)) Then Return Nothing

        Return JsonConvert.DeserializeObject(Of T)(JsonConvert.SerializeObject(source))
    End Function
End Module

C#

public static T Clone<T>(this T source)
{
    if (Object.ReferenceEquals(source, null))
    {
        return default(T);
    }

    // In the PCL we do not have the BinaryFormatter
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source));
}

Che useremo semplicemente in questo modo:

Visual Basic

Dim copia = myObj.Clone()

C#

var copia = myObj.Clone();

Cosa fa il codice? serializza e contestualmente deserializza l'oggetto di origine, creandone una nuova istanza; coi generics, si può usare con qualunque oggetto in modo tipizzato e questo serve proprio alla deserializzazione JSON.

Alessandro

posted @ 03/10/2016 02:00 by Alessandro Del Sole

I resource dictionary in Xamarin.Forms

La versione 2.3.0.49 di Xamarin.Forms ha introdotto il supporto ai resource dictionary, che ci consentono di separare e riutilizzare risorse di tipo XAML come gli stili.

Non vi aspettate quanto potete avere con WPF o UWP... ma almeno è già qualcosa. Per creare un resource dictionary devo:

1. Aggiungere una nuova ContentPage XAML al progetto
2. Cambiare l'elemento radice da ContentPage a ResourceDictionary.
3. Nel code-behind, togliere l'ereditarietà da ContentPage.
4. Mettere le risorse di mio interesse all'interno del dizionario così ottenuto.

In altre parole, nello XAML una cosa di questo tipo:

<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms" 
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                     x:Class="DelSole.XamUtilities.Styles.SharedResources">
 
  <!-- Sample resource -->
  <Style x:Key="baseStyle" TargetType="Label">
    <Setter Property="FontSize" Value="Small" />
    <Setter Property="FontAttributes" Value="Italic" />
  </Style>
 
</ResourceDictionary>

Mentre in C#, questo:

public partial class SharedResources
{
    public SharedResources()
    {
        InitializeComponent();
    }
}

Utilizzare un resource dictionary richiede poi, nella pagina in cui lo si utilizza, la dichiarazione dell'elemento ResourceDictionary all'interno delle Resources, unitamente alla parola risevata MergedWith a cui passo:

1. un namespace XML che punta all'assembly o namespace in cui è definito lo stile
2. il nome del dictionary

  <ContentPage.Resources>
    <ResourceDictionary MergedWith="styles:SharedResources" />
  </ContentPage.Resources>

Un esempio di tutto questo è disponibile in XamUtilities, la libreria che ho pubblicato recentemente e di cui vi ho parlato ieri.

Alessandro

posted @ 27/09/2016 02:00 by Alessandro Del Sole

XamUtilities, una nuova libreria open source per Xamarin.Forms

Se avete seguito i miei ultimi post, avete visto come abbia voluto condividere alcune problematiche incontrate nello sviluppo di app con Xamarin.Forms attraverso controlli, behavior, converter.

Ho quindi pensato di raccogliere il tutto in una nuova libreria che ho chiamato XamUtilities, il cui codice sorgente è disponibile su GitHub. La libreria contiene i behavior descritti nei post sulla validazione lato client, i controlli per il binding di enumerazioni e di date nullable, i converter utilizzati per il funzionamento di questi ultimi. Inoltre, è anche inclusa una piccola app di esempio che mostra come usare il tutto.

Nota: è richiesto Xamarin.Forms 2.3.0.49 o superiore per via del supporto ai resource dictionary.

Infine, se non vi interessa il codice ma solo la libreria, potete anche solo installare il relativo pacchetto NuGet. Chiaramente su GitHub c'è qualche spiegazione in più.

Divertitevi!

Alessandro

posted @ 26/09/2016 02:00 by Alessandro Del Sole

Xamarin.Forms e la validazione dell'input lato client - parte 2

Nella prima parte abbiamo implementato dei behavior da utilizzare per validare l'input dell'utente, ma quella è l'infrastruttura che ancora non abbiamo visto in azione, perché da collegare alla UI e quindi allo XAML.

L'obiettivo è mostrare anche una Label di colore rosso, oltre alla logica applicata dal behavior sulle Entry. Per farlo devo convertire lo stato del behavior in un oggetto bool per capire se lo stato del controllo è valido oppure no e, conseguentemente, mostrare o nascondere la label. Mi serve quindi un converter, tipo di oggetto caro a chi conosce XAML e che si implementa sempre attraverso l'interfaccia IValueConverter, che in questa piattaforma è esposta dal namespace Xamarin.Forms. Eccolo:

public class BoolToObjectConverter<T> : IValueConverter
{
    public T FalseObject { setget; }
 
    public T TrueObject { setget; }
 
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        return (bool)value ? this.TrueObject : this.FalseObject;
    }
 
    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        return ((T)value).Equals(this.TrueObject);
    }
}

Successivamente, nello XAML della pagina in cui intendiamo utilizzare i behavior, definiremo 3 stili per il controllo Label. Il primo, uno stile base che stabilisce corsivo e font small. Due stili, poi, che stabiliscono come la Label deve apparire a seconda che la proprietà IsValid nei behavior sia vera oppure falsa, quindi se la Label in questione deve o meno essere visibile. Eccoli:

  <Style x:Key="baseStyle" TargetType="Label">
    <Setter Property="FontSize" Value="Small" />
    <Setter Property="FontAttributes" Value="Italic" />
  </Style>
 
  <converters:BoolToObjectConverter x:Key="boolToStringEmpty"
                                   x:TypeArguments="Style">
    <converters:BoolToObjectConverter.FalseObject>
      <Style TargetType="Label" BasedOn="{StaticResource baseStyle}">
        <Setter Property="TextColor" Value="Red" />
        <Setter Property="Text" Value="Field cannot be empty" />
      </Style>
    </converters:BoolToObjectConverter.FalseObject>
 
    <converters:BoolToObjectConverter.TrueObject>
      <Style TargetType="Label" BasedOn="{StaticResource baseStyle}">
        <Setter Property="TextColor" Value="Default" />
        <Setter Property="Text" Value="" />
      </Style>
    </converters:BoolToObjectConverter.TrueObject>
  </converters:BoolToObjectConverter>
Nota: in Xamarin.Forms 2.3.0.49 è stato introdotto il supporto ai Resource dictionary che prima non c'era, quindi può essere eventualmente utile da tenere a mente.

Ottimo, a questo punto ho tutto quello che mi serve. Dichiaro un namespace XML per fare riferimento alla classe che definisce il converter e uno per fare riferimento al namespace che definisce i behavior, e poi vado ad utilizzare i behavior così:

  <ContentPage.Resources>
    <ResourceDictionary MergedWith="styles:SharedResources" />
  </ContentPage.Resources>
  
  <StackLayout VerticalOptions="Center" HorizontalOptions="Center">
    <Entry Text="{Binding Name, Mode=TwoWay}" WidthRequest="250">
      <Entry.Behaviors>
        <behaviors:FieldEmptyValidatorBehavior x:Name="StringEmptyValidator" />
        <behaviors:FieldLengthValidatorBehavior MaxLength="255" />
      </Entry.Behaviors>
    </Entry>
    <Label Style="{Binding Source={x:Reference StringEmptyValidator}, 
                        Path=IsValid, 
                        Converter={StaticResource boolToStringEmpty}}" />
  </StackLayout>

La Entry ha una collection chiamata Behaviors, all'interno della quale metto tutte le istanze dei behavior che voglio usare. Notate come il primo abbia anche un nome, grazie al quale la Label sottostante può fare binding per conoscere lo stato della proprietà IsValid e per applicare il relativo stile a seconda del suo valore.

Alla fine di tutto, il risultato è questo:



La Label rossa sparirà quando digiteremo del testo all'interno della Entry e se tenteremo di scrivere più di 255 caratteri, la stringa verrà tagliata.

Gli errori vengono aggiunti e rimossi al Dictionary definito la volta scorsa, che controlleremo prima di fare altro anche perché, come detto, questa è più una forma di presentazione nella UI di un problema, più che una vera validazione dei dati. Ma tant'è.

Alessandro

posted @ 22/09/2016 00:07 by Alessandro Del Sole