Archivio Categoria: .net

Il futuro si fà dual (screen)

Sono passati ormai più di cinque mesi da quando a inizio ottobre Microsoft ha presentato i suoi nuovi dispositivi della linea Surface che andranno a dar vita al nuovo filone dei dispositivi Dual Screen, rispettivamente il Surface Neo per quanto riguarda il mondo Windows ed il surface Duo per quanto riguarda il mondo Android.

surface duo e neo

I device

Microsoft per questa nuova avventura non si è limitata esclusivamente alla parte hardware, altrimenti avremmo avuto solo dei bei giocattolini su cui utilizzare 2 app contemporaneamente, ma è andata a realizzare tutta una serie di librerie e di modifiche ai sistemi operativi che permettono di sfruttare al massimo la presenza dei due schermi.

Per quanto riguarda il Neo è stata realizzata una nuova versione di Windows denominata 10X alleggerita e rivista che permette di avvicinarsi più ad un’utilizzo stile Tablet mentre per il Duo è stato fatto un lavoro insieme a Google per inserire all’interno del sistema del robottino verde nuove API per la gestione dei dual screen.

Al momento non è ancora disponibile una data di rilascio dei due device ma per noi sviluppatori sono già disponibili tutta una serie di emulatori ed SDK (entrambi in versione preview) per poter iniziare a fare i test ed adattare le nostre applicazioni.

Il punto di partenza per il mondo del dual screen è la pagina docs https://docs.microsoft.com/en-us/dual-screen che ci permette di accedere a tutti gli strumenti e la documentazione di cui abbiamo bisogno.

Gli emulatori

Ma andiamo innanzitutto a vedere come avere accesso agli emulatori; per quanto riguarda quello android possiamo andare direttamente a scaricarlo dall’indirizzo https://www.microsoft.com/en-us/download/details.aspx?id=100847 dove potremo scegliere il pacchetto per il sistema operativo che stiamo utilizzando, mentre per quanto riguarda quello per windows 10X non dobbiamo far altro che andare nello store di window 10 e cercare il Windows Emulator che una volta installato ci permetterà di scegliere al primo avvio quale versione del sistema operativo vogliamo andare ad installare. Finalmente dall’ultimo aggiornamento del programma è possibile installarlo anche su una normale versione di windows senza dover per forza essere sul ramo Insider di Windows 10.

In questo momento sono disponibili due versioni del sistema operativo (naturalmente in preview) ma quando saranno rilasciate potrete installare sempre da questa schermata eventuali nuove versioni disponibili che potremo anche far coesistere.

Come sviluppare

Ok adesso che abbiamo gli emulatori il passo successivo è sapere quale tecnologia è possibile utilizzare per inziare a svilupparci. Come al solito non esiste un solo modo di farlo ma al momento il consiglio che mi sento di darvi se volete sviluppare per questi dispositivi è di utilizzare Xamarin Forms in modo da avere una sola base di codice per tutte le piattaforme, ma oltre questo sono disponibili anche gli SDK per

  • UWP
  • Xamarin nativo Android
  • Android nativo

La prima cosa che balza all’occhio è che non è presente l’SDK per ios, questo naturalmente perchè (per ora) non c’è un dispositivo targato Apple che abbia il supporto al dual screen, questo vuol dire che se stiamo sviluppando nativamente non ne abbiamo bisogno, mentre se usiamo Xamarin Forms ci penserà comunque la libreria a gestire il tutto

Cosa mi permette di fare l’sdk?

L’sdk ci permette di gestire vari scenari, naturalmente non sarà obbligatorio utilizzare in ogni sezione della nostra applicazione lo stesso tipo di scenario, ne limitarci a quelli indicati ma possiamo utilizzare quello migliore in ogni situazione.

Vediamo nel dettaglio quali sono i principali scenari a cui possiamo far riferimento

layout

Extended canvas

E’ la modalità più tradizione e permette di estendere il contenuto della nostra applicazione sui due schermi senza applicare nessuna modifica particolare.

Master detail

Una delle situazioni più comuni in cui ci trova è quella in cui abbiamo una lista di elementi (dalle fatture alle immagini ad es) che una volta selezionate ci permettono di accedere ad un dettaglio dello stesso. Avendo questa visualizzazione su due schermi potremmo accedere in modo più veloce alla selezione di un elemento senza dover tornare indietro per accedere di nuovo alla lista.

Two page

La modalità a due pagine è quella più indicata quando visualizziamo del contenuto impaginato, questo ci permetterà di simulare nel modo migliore l’utilizzo di un libro o di un documento in cui il contenuto viene disposto in modo ordinato e diviso tra le due pagine

Dual view

La doppia vista ci permette di poter presentare i dati all’utente in due modalità diverse, come ad esempio un’elenco di luoghi e la visualizzazione degli stessi su una mappa oppure due immagini quando stiamo eseguendo delle modifiche.

Companion panel

la modalità companion è quella forse più interessante che ci permette di fornire maggiori controlli all’utente che altrimenti non avrebbero spazio per essere visualizzati, come può essere ad esempio un joypad che potrebbe essere presente sul secondo schermo quando si utilizzata un gioco oppure dei controlli aggiuntivi di modifica di un elemento che invece di essere presentati in una schermata a parte possono essere visualizzati contemporaneamente all’oggetto che si stà modificando. Decisamente comoda come funzionalità!

Perchè dovrei iniziare ad utilizzarlo?

Arriviamo adesso alla domanda che tutti vi starete facendo, se ancora questi dispositivi non sono sul mercato perchè dovrei perdere tempo a rendere le mie applicazioni compatibili?

Naturalmente perchè se stai leggendo questo articolo sarai un nerd o un amante della tecnologia e questo dovrebbe bastare come giustificazione, ma se proprio c’è bisogno di una motivazione sappiate che quando usciranno questi nuovi device le vostre app saranno una gioia per gli utenti.

Ma non finisce qui, una cosa molto interessante è che utilizzare queste libreria ci permetterà di ottenere dei benefici anche quando le nostre app verranno utilizzata su device che non sono dual screen, questo perchè quando andremo ad utilizzare il componente di gestione delle pagine TwoPaneView potremmo andare a definire una MinWideModeWidth e  una MinTallModeHeight che ci permetteranno di “simulare” i due schermi quando il nostro dispositivo supera una certa larghezza o altezza, questo permetterà alle nostre app di entrare in una delle modalità viste in precedenza e di sfruttare al meglio la dimensione dello schermo.

In questo modo modo le nostre app diventaranno automaticamente ottimizzate su device con una ampia diagonale come ad esempio i tablet android o i pieghevoli,i convertibili 2 in 1 ed anche gli ipad (ma non avevamo detto che non c’è l’sdk per Ios? si ma c’è per xamarin forms 😀 ). Quante volte le vostra applicazioni sono ben gestite se le provate su un telefono mentre poi quando vengono utilizzate su un tablet  in modalità orizzontale l’utente si trova di fronte ad un’interfaccia che “affoga” schermo? Utilizzando l’sdk per dual screen avremo quindi gratis anche questa funzionalità

Direi che a questo punto non avete scuse per non utilizzarlo 😀

I prossimi articoli

In questo articolo abbiamo sollevato il velo su quello che è il mondo dello sviluppo su dispositivi con più di uno schermo, a questo ne seguiranno altri in cui vedremo come sviluppare utilizzando sia la piattaforma UWP che Xamarin Forms in attesa di avere tra le mani questi nuovi dispositivi 😀

Per adesso quindi non mi resta altro che darvi appuntamento al prossimo articolo e augurarvi buon coding!!

 

Benvenuto XAML Studio

Da pochi giorni è disponibile sullo store di Windows 10 un nuovo applicativo sviluppato da Microsoft Garage che permette di realizzare in modo molto veloce prototipi di applicazioni UWP permettendoci di avere una preview in tempo reale di quello che stiamo sviluppando.

Quello che vedete nella foto in basso è l’interfaccia del programma che in maniera molto intuitiva mette a disposizione un editor con 2 aree: una dove inserire il nostro codice e una dove vedere la preview interattiva, questo vuol dire che se inseriremo un elemento interattivo (ad es una textbox) potremo interagire con essa direttamente dalla preview.

Nonostante l’applicazione sia molto giovane ha già molte funzionalità interessanti tra cui:

  • Preview in tempo reale
  • Intellisense
  • binding da testo json o con download direttamente da url
  • documentation toolbox

la funzionalità di documentation toolbox in particolare risulta essere molto comoda in fase di apprendimento, in quanto permette di accedere direttamente alla documentazione dei vari componenti dove poter trovare i vari pezzi di codice da poter incollare direttamente nel tool per provarli

A questo punto non vi resta da fare altro che scaricarlo dallo store a questo indirizzo https://aka.ms/GetXAMLStudio ed iniziare ad utilizzarlo.

Il programma è molto interessante quindi sicuramente ci saranno altri post su questo argomento, per il momento non mi resta da fare altro che augurarvi buon coding!

How to fix error loading onnx file from filesystem

The default use of trained machine learning model in UWP apps is to add onnx file to your solution and leave Visual Studio to generate the corresponding class and load the file directly in the solution, but in some case can be useful to load the file from other sources, like the filesystem.

This is not a problem, the CreateXXXXXModel generate take a StorageFile so you can use a FilePicker to take a file, but if you try a code like this

FileOpenPicker fileOpenPicker = new FileOpenPicker();
fileOpenPicker.FileTypeFilter.Add(".onnx");
StorageFile selectedStorageFile = await fileOpenPicker.PickSingleFileAsync();
try
{
	_model = await CustomVisionModel.CreateCustomVisionModel(selectedStorageFile);
}catch(Exception ex)
{
	new MessageDialog(ex.StackTrace,ex.Message).ShowAsync();
}

You can see that an exception is thown in the calling of method LearningModelPreview.LoadModelFromStorageFileAsync in the generated class

public static async Task CreateCustomVisionModel(StorageFile file)
{
	LearningModelPreview learningModel = await LearningModelPreview.LoadModelFromStorageFileAsync(file);
	CustomVisionModel model = new CustomVisionModel();
	model.learningModel = learningModel;
	return model;
}

The exception does not give us more info about the problem

Exception from HRESULT: 0x88900103
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at WinMLTester.CustomVisionModel.d__1.MoveNext()
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at WinMLTester.Views.MainPage.d__6.MoveNext()

it seems that file doesn’t have some permission for made WinML works, the solution is quite simple, before creating the model we need to copy the file in the app local folder and then use this file instead of the other.

We need only few lines of codes for do this

FileOpenPicker fileOpenPicker = new FileOpenPicker(); 
fileOpenPicker.FileTypeFilter.Add(".onnx"); 
StorageFile selectedStorageFile = await fileOpenPicker.PickSingleFileAsync(); 
//Fix for loading file
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sf2 = await selectedStorageFile.CopyAsync(storageFolder, selectedStorageFile.Name, NameCollisionOption.ReplaceExisting);
try
{
	_model = await CustomVisionModel.CreateCustomVisionModel(sf2);
}catch(Exception ex)
{
	new MessageDialog(ex.StackTrace,ex.Message);
}

Now your code work without problem

I have also created a new project on github for help to test your machine learning model created with Custom Vision service available on https://github.com/a-iafrate/WinMLTester that can be used to test this fix

happy coding!!

Benvenuto Windows Community Toolkit

Se sviluppate app UWP avrete sicuramente avuto a che fare con l’UWP Community Toolkit e (se non lo avete mai fatto vi consiglio di farlo 😀 ) che è un vero e proprio cortellino svizzero per noi sviluppatori e ci permette di non dover reinvere la ruota.

Da pochi giorni è disponibile una nuove versione che porta un importante cambiamento, quello del nome del progetto che passa da UWP Community Toolkit a Windows Community Toolkit il che ci fà capire anche alla luce degli annunci di Build di qualche giorno fà come presto si arricchirà di nuovi elementi e funzionalità non solo per le UWP.

Al momento non possiamo comunque lamentarci, come è possibile vedere nell’immagine i controlli presenti sono già molti ed utilissimi e  sono di grandi aiuto insime ai vari Helpers, Service che ci permettono di avere funzionalità già disponibile ad esempio per l’autenticazione sui vari social o l’utilizzo delle Notification.

Il modo migliore per avere una panoramica delle funzionalità disponibili è quello di scaricare l’applicazione demo disponibile sullo store a questo indirizzo (al momento della scrittura di questo post l’applicazione ha ancora il vecchio nome ma verrà aggiornato a breve)

Tutti i pacchetti del progetto sono disponibili su Nuget e se avete voglia di dare una mano il progetto è naturalmente OpenSource e disponibile su GitHub.

Se non lo avete mai utilizzato spero di avervi fatto cosa gradita a farvelo conoscere e come sempre

Buon Coding 😀

 

.Net standard su IoProgrammo

Questo mese su IoProgrammo numero 223 troverete il mio nuovo articolo sul framework .net standard, in’interessante tecnologia che ci permette di riutilizzare il nostro codice in tutte le tipologie di progetti.

Direi decisamente da non perdere 😀

Buon coding!!

Sessione Da A a Bot con un pizzico di cognitive

Grazie agli amici di DotNetPodcast, è disponibile la registrazione della mia sessione tenuta presso il LUISS EnLabs con la collaborazione di Codemotion e Syncfusion.

Abbiamo parlato di Bot e di come renderli più intelligenti con il servizio di Custom Vision ma non voglio rovinarvi le sorprese 😀

Fatemi sapere se l’argomento vi ha interessato e naturalmente buon coding 😀

Project Rome e cross device su IoProgrammo

ioprogrammo_july2017

Questo mese su IoProgrammo numero 215 di Luglio troverete il mio nuovo articolo su Project Rome e come utilizzarlo per condividere dati e funzionalità tra le varie piattaforme su cui la vostra applicazione è disponibile.

Una funzionalità disponibile in windows 10 che potrà dare una marcia in più alle vostre applicazioni.

Buon coding!!

 

Utilizzare il ProgressRing nell’ActivityIndicator in Xamarin Forms

Su Xamarin forms per le app UWP il componente ActivityIndicator è mappato sulla classe ProgressBar e come è possibile potete vedere nello screen non è un comportamento congruente con le altre piattaforme e la momento non c’è modo di cambiarlo con un ProgressRing.

activityindicatorCon il meccanismo dei CustomRenderer possiamo ovviare a questo problema in modo molto semplice inserendo una semplice classe nel nostro progetto UWP

[assembly: ExportRenderer(typeof(ActivityIndicator), typeof(RingActivityIndicatorRenderer))]
namespace DoGethersApp.UWP
{
    public class RingActivityIndicatorRenderer : ViewRenderer<ActivityIndicator, Windows.UI.Xaml.Controls.ProgressRing>
    {
        private Brush foregroundDefault;
        protected override void OnElementChanged(ElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)

            {
                if (Control == null)
                {
                    SetNativeControl(new Windows.UI.Xaml.Controls.ProgressRing());
                    Control.Loaded += OnControlLoaded;
                }
                UpdateIsRunning();
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == ActivityIndicator.IsRunningProperty.PropertyName)
            {
                UpdateIsRunning();
            }

            else if (e.PropertyName == ActivityIndicator.ColorProperty.PropertyName)
            {
                UpdateColor();
            }
        }

        void OnControlLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            foregroundDefault = Control.Foreground;
            UpdateColor();
        }

        void UpdateColor()
        {
            Color color = Element.Color;
            if (color == Color.Default)
            {
                Control.Foreground = foregroundDefault;
            }
            else
            {
                Control.Foreground = color.ToBrush();
            }
        }

        void UpdateIsRunning()
        {
            Control.IsActive = Element.IsRunning;
        }
    }

    internal static class ConvertExtensions
    {

        public static Brush ToBrush(this Color color)
        {
            return new SolidColorBrush(color.ToWindowsColor());
        }

        public static Windows.UI.Color ToWindowsColor(this Color color)
        {
            return Windows.UI.Color.FromArgb((byte)(color.A * 255), (byte)(color.R * 255), (byte)(color.G * 255), (byte)(color.B * 255));
        }
    }
}

in questo modo verranno modificati tutti gli ActivityIndicator per utilizzare il ProgressRing, se vogliamo avere però maggior libertà e decidere se  e quando utilizzarlo ci basterà fare nel progetto comune una nuova classe che estende ActivityIndicator e modificare il CustomRender facendo riferimento a quest’ultima classe.

In questo modo potremo decidere su utilizzare una o l’altra a seconda delle esigenze, sulle altre piattaforme sarà visualizzato sempre lo stesso componente mentre su windows verrà visualizzato un tipo di progressbar o l’altra in base alla classe che utilizzeremo.

Buon coding!!!

 

UWP: ricreiamo la funzione ToTitleCase

Come ben sappiamo la piattaforma UWP non dispone di tutte le funzionalità presenti nella versione del .Net Framework versione desktop. Una funzione che può essere utile in alcuni casi è ToTitleCase che come possiamo intuire dal nome converte il testo in parole con iniziali maiuscole come è possibile vedere nella documentazione ufficiale

https://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

La versione standard permette di fare controlli più fini anche in base alla lingua di sistema ma se abbiamo bisogno solo della sua funzione base possiamo utilizzare questo semplice metodo

public string toTitleCase(string value)
{
    if (value == null)
        return null;
    if (value.Length == 0)
        return value;

    StringBuilder result = new StringBuilder(value);
    result[0] = char.ToUpper(result[0]);
    for (int i = 1; i < result.Length; ++i)
    {
        if (char.IsWhiteSpace(result[i - 1]))
            result[i] = char.ToUpper(result[i]);
        else
            result[i] = char.ToLower(result[i]);
    }
    return result.ToString();
}

che converte in maiuscolo l’iniziale di ogni parola ed in minuscolo quelle seguenti.

Una piccola utility che a volte può tornare utile

Buon coding!!!

Eliminare le lingue non inserite quando si invia un’app UWP allo store

Se state sviluppando un’app solo a livello nazione per cui non volete inserire la lingua inglese potreste ritrovarvi la richiesta , anche se non avete inserito i relativi file, di compilare i dati nello store anche per questa lingua nel momento in cui la invierete.

Questo problema si presenta quando una libreria che stiamo utilizzando contiene già alcuni file localizzati, ad esempio per gestire i messaggi di errore (es. MVVM Light), in questo caso Visual Studio generà erroneamente anche il pacchetto per la lingua inglese.

Per risolvere il problema basterà aprire il file di progetto ed aggiungere la seguente riga
<SkipIntermediatePriGenerationForResourceFiles>false</SkipIntermediatePriGenerationForResourceFiles>

subito dopo l’apertura del primo tag PropertyGroup che troverete in modo da avere una situazione del genere

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
 <PropertyGroup>
 <SkipIntermediatePriGenerationForResourceFiles>false</SkipIntermediatePriGenerationForResourceFiles>
 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

Se avete dei problemi a trovare il file di progetto potete scaricare il progetto facendo tasto destro sull’elemento

unload_menu

e poi editarlo sempre utilizzando il tasto destro sul progetto scaricato

edit_project

una volta modificato il file, sempre con il tasto destro, sarà possibile ricaricarlo.

NB: Potreste ritrovarvi con un messaggio di errore simile a questo

err_1potete tranquillamente ignorarlo e caricare il vostro progetto.

Se adesso genererete il vostro pacchetto e lo invierete allo store vedrete che verranno richiesti i dettagli esclusivamente per le lingue effettivamente incluse nella vostra app

Grazie a Fela per il tip!!!

Buon coding!!

Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi