Microsoft Azure Storage Explorer si aggiorna alla versione 0.8.8

E' stata da poco rilasciata la nuova versione di Microsoft Azure Storage Explorer.
Per chi non lo conoscesse è un'applicazione cross platform che permette di esplorare praticamente tutti i tipi di storage presenti sul proprio (o propri) account di Azure.
Oltre a navigare il contenuto, è anche molto comodo per fare upload o download di file molto grandi.

In questa release le novità sono tante, fra le più importanti secondo me:

  • da questa versione in poi si aggiornerà automaticamente, senza dover scaricare l'installer ogni volta
  • hanno aggiunto il supporto ai caratteri Unicode nei metadata
  • hanno migliorato la stabilità durante gli upload di file di grandi dimesioni

Potete comunque la release notes completa al seguente link: http://storageexplorer.com/releasenotes.html

.NET Core: Zero to Hero

Vorrei segnalarvi questo video di Channel 9 rilasciato a inizio di gennaio in cui viene fatta una panoramica di .NET Core, dalle basi a operazioni un po' più avanzate.
Questo video è utile anche per chi vuol approcciare ad ASP.NET Core, in quanto spiega alcuni concetti del nuovo framework che sta alla base della nuova piattaforma di sviluppo web.

Questo il link del video: https://channel9.msdn.com/Events/Microsoft-Azure/AZGroups-Scott-Guthrie-2017/NET-Core

Utilizzare Visual Studio Code per collegarsi a SQL Server

Qualche post fa avevo fatto una lista delle estensioni per Visual Studio Code che utilizzo e che ritengo utili.
Una delle ultime che ho provato e ritengo comodissima è l'estensione per collegarsi ed eseguire query su SQL Server: https://aka.ms/mssql-marketplace

Questa estensione, ancora in preview, permette di connettersi a SQL Server, Azure SQL Server e SQL Data Warehouse.
Oltre a questo ha un intellisense che funziona molto bene e sopratutto permette di visualizzare i risultati delle query in una griglia, direttamente dentro Visual Studio Code.

Per installare l'estensione è molto semplice, come sempre.
Potete andare direttamente nel pannello delle estensioni di Visual Studio Code, cercare "mssql" e installare il primo risultato fra quelli proposti.
Se invece siete amanti dei comandi, potete premere Ctrl + Shift + P e immettere il comando: "ext install mssql".

La prima connessione

A questo punto non ci resta che effettuare la prima connessione a un database.
Per farlo è sufficiente premere Ctrl + Shift + P e scrivere "sql".
Vi compariranno in un menu a tendina tutti i comandi disponibili per il nuovo plugin appena installato.
Selezionado "MS SQL: Connect" partirà un wizard che vi guiderà alla connessione del database.
Se la connessione avrà esito positivo, nella barra in basso a destra potete vedere a che database siete connessi e con che utenza.

Eseguire la prima query

Una volta che vi sarete connessi, potete eseguire le query come in un normalissimo SQL Management Studio.
Se create, per esempio, un file denominato "query.sql" e ci inserite una query del tipo:

SELECT * FROM dbo.Product
WHERE dbo.Product.ShowOnHomePage = 1
GO

Potete eseguirla sul vostro database, semplicemente utilizzando la sequenza di tasti Ctrl + Shift + E.

Immediatamente i vostri risultati saranno visualizzati all'interno della stessa schermata di Visual Studio Code, sotto la vostra query.

Se invece i risultati vi venissero visualizzati di lato, potete cambiarne la posizione, selezionando dal menu "View", il comando "Toggle Editor Group Layout".

Operazioni sulla griglia dei risultati

Oltre ad avere informazioni utilissime come il numero de righe interessate dalla vostra query e soprattutto il tempo di esecuzione, Visual Studio Code vi mette a disposizione alcune funzionalità sulla griglia molto interessanti.
Ad esempio se cliccate con il tasto destro sulla griglia e seleziona "Select all" e successivamente "Save as JSON" vi vengono esportate le righe a video in un file JSON che potete utilizzare come volete.
Stessa cosa con un file CSV.
Un'altra funzione molto utile nel menu contestuale nella griglia è la possibilità di copiare le righe nella clipboard, con anche le intestazioni.
Questo vi permette per esempio di incollare i risultati in un file Excel in modo semplice e veloce.

 

Ovviamente tutto quello che ho scritto sopra, è disponibile sia per Mac e Linux.
Direi che non è poco. :)

L'importanza di scrivere bene il codice HTML e CSS

Spesso quando scriviamo codice C# stiamo molto attenti alla sintassi, a commentare bene il codice o comunque sia cerchiamo di seguire degli standard per far sì che chi legga il codice dopo di noi o noi stessi dopo qualche mese, risulti facilmente interpretabile, soprattutto nei passaggi più complessi.
Purtroppo questa cosa non accade spesso quando invece scriviamo codice HTML o CSS.
I motivi sono semplici:

  • non abbiamo un compilatore che ci impedisce di scrivere "come vuole lui"
  • la parte di UI è quella più soggetta a modifiche (anche all'ultimo momento)

Ovviamente scrivere bene il codice HTML e CSS ci fa risparmiare molto tempo se dobbiamo apportare delle modifiche e sopratutto il browser riesce a interpretarlo meglio e quindi renderizzarlo più velocemente.
Qua sotto provo a fare un elenco di alcuni degli accorgimenti che andrebbero adottati.
Ce ne sono tanti, ma inserirò quelli più importanti.

HTML

  • Usare sempre il doppio apice e mai il singolo sugli attributi
  • Non chiudere mai i tag che non hanno bisogno di chiusura (es. img)
  • Chiudere sempre i tag che hanno la chiusura opzionale
<!DOCTYPE html>
<html>
  <head>
    <title>Page title</title>
  </head>
  <body>
    <img src="images/logo.png" alt="Logo">
    <h1 class="title">My first page</h1>
  </body>
</html>
  • Impostare sempre l'attributo della lingua sul tag html. Questo aiuta anche gli strumenti di sintesi vocale a utilizzare il dizionario giusto
<html lang="it-it">
  • Per una facile lettura, gli attributi dei tag html dovrebbero rispettare il seguente ordine:
    • class
    • id
    • data-
    • src, href, value
    • title, alt
<a class="..." id="..." data-toggle="modal" href="#">
  Link
</a>
  • Gli attributi booleani non hanno bisogno del valore, quindi meglio non specificarlo (es. disabled, checked)
<input id="todo" type="checkbox" value="1" checked>

CSS

  • Quando si usano più selettori per un classe, andare a capo per ognuno di essi
  • Inserire uno spazio dopo i :
  • Non inserire lo 0 quando un numero inizia per 0 (es. .8)
  • Usare i caratteri minuscoli per i valori esadecimali (es. #ccc)
  • Non specificare l'unità di misura per i valori impostati a 0 (es. margin: 0)
.title,
.title-secondary {
  padding: 15px;
  margin-bottom: 15px;
  background-color: rgba(0,0,0,.5);
  box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
}
  • Seguire sempre lo stesso ordine quando si dichiara un classe
    • Posizione
    • Box-model
    • Font e colori
    • Sfondo e bordi
    • Altro
.title-primary {
  /* Posizione */
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 100;

  /* Box-model */
  display: block;
  float: right;
  width: 100px;
  height: 100px;

  /* Font */
  font: normal 13px "Helvetica Neue", sans-serif;
  line-height: 1.5;
  color: #333;
  text-align: center;

  /* Sfondo e bordi */
  background-color: #f5f5f5;
  border: 1px solid #e5e5e5;
  border-radius: 3px;

  /* Altro */
  opacity: 1;
}
  • Le definizioni di classi di visualizzazione alternativa con media queries è buona norma inserirle subito sotto la classe originale. In questo modo si trova facilmente.
  • Non utilizzare file separati per le definizioni delle media queries
.title { ... }

@media (min-width: 960px) {
  .title { ...}
}
  • Evitare di utilizzare le dichiarazioni abbreviate per gli elementi che lo supportano. In questo modo vengono settati anche i valori che non vengono utilizzati.
    Gli elementi più comuni sono:
    • margin
    • padding
    • background
    • border
.title {
  margin-bottom: 10px;
  border-top-left-radius: 3px;
  border-top-right-radius: 3px;
}
  • Cercare di inserire commenti che spiegano il significato di quello che c'è scritto sotto
  • Non scrivere nel commento la stessa cosa che c'è scritta nel nome della classe
/* the title of homepage and contact page */
.title {
  ...
}
  • I nomi delle classi devono essere minuscoli
  • Si può usare il simbolo - per separare eventuali parole, non _
  • Cercare di fare le classi più piccole possibili, in modo da poter riutilizzarle più facilmente
.title { ... }
.important { ... }
.title-header { ... }

 

E voi, quanti di questi accorgimenti stavate usando? :)

Leggere il profilo di un utente da uno SharePoint Addin con C# e ASP.NET

In uno SharePoint Addin, realizzato con ASP.NET, può capitare di dover leggere delle proprietà dal Profile Service.
Per leggere le proprietà dell'utente corrente è molto semplice.
Basta istanziare l'oggetto People Manager con il contesto dell'applicazione e leggere le proprietà con il metodo "GetMyProperties()".

            var peopleManager = new PeopleManager(clientContext);
            var personProperties = peopleManager.GetMyProperties();

Se invece dobbiamo leggere il profilo di un altro utente, il lavoro da fare è un po' più complesso e sicuramente non risolvibile con una soluzione "pulitissima".

In questo caso dobbiamo istanziare un nuovo contesto, non per il sito corrente, ma del sito di amministrazione di SharePoint.
Ovviamente questo vi fa capire subito che l'utente che deve avere accesso a quelle informazioni, deve avere accesso anche all'amministrazione del tenant.
Visto che non è il caso di dare a tutti i diritti su quel sito, conviene creare un utente di servizio che ci possa accedere ed usare quello.
Per comodità vi inserisco il codice che sto usando io.
Ovviamente dovete sostituire i valori di esempio che ho messo con i vostri.
Altra nota: il nome dell'utente di cui si vogliono prendere le proprietà deve essere esattamente in quel formato.

        public void ReadUserProfileProperties()
        {
            var serverUrl = "https://tenant-admin.sharepoint.com/";
            var targetUser = "i:0#.f|membership|###email###";

            var adminUsername = "";
            var adminPassword = "";

            var securePassword = new SecureString();
            foreach (char c in adminPassword)
            {
                securePassword.AppendChar(c);
            }

            var clientContext = new ClientContext(serverUrl);
            clientContext.Credentials = new SharePointOnlineCredentials(adminUsername, securePassword);

            var peopleManager = new PeopleManager(clientContext);
            var personProperties = peopleManager.GetPropertiesFor(targetUser);

            clientContext.Load(personProperties);
            clientContext.Load(personProperties, p => p.AccountName, p => p.UserProfileProperties);
            clientContext.ExecuteQuery();

            foreach (var property in personProperties.UserProfileProperties)
            {
                Console.WriteLine(string.Format("Key: {0} - Value: {1}",
                    property.Key.ToString(), property.Value.ToString()));
            }
        }

 

Risorse utili per ASP.NET Core

In questo post cercherò di raccogliere nel tempo (mano a mano lo aggiornerò) alcune delle risorse, secondo me, più significative per iniziare ad usare ASP.NET Core.
Ho diviso le varie risorse in tre categorie: Tutorial, Articoli e Video in modo da facilitarne la lettura.

Articoli

Tutorial

Video

Introduction to ASP.NET Core

Intermediate ASP.NET Core

ASP.NET Core Cross-Platform

Try ASP.NET Core

Tutti i video di ASP.NET Monsters :)

ASP.NET Core sì o ASP.NET Core no?

In questo ultimo periodo, sia a lavoro sia per progetti miei, mi capita sempre più spesso di trovarmi di fronte al "dilemma" che dà il titolo a questo post: in questo nuovo progetto utilizzo ASP.NET 4.x o ASP.NET Core?

Quando usare ASP.NET Core

Uno dei punti di forza di ASP.NET Core è la possibilità di essere eseguito anche su altre piattaforme oltre che Windows.
Tali ambienti (Linux e macOS) possono essere usati anche durante lo sviluppo e non solo in produzione.
A supporto delle attività di sviluppo ci sono strumenti come Visual Studio Code che garantiscono comunque una certa velocità nelle operazioni quotidiane di uno sviluppatore, rispetto a un banale editor di testo.
Inoltre, la leggerezza e scalabilità di ASP.NET Core rendono le applicazioni molto adatte ad un'architettura applicativa basata su microservices.
Questo discorso va a braccetto con la possibilità di utilizzare una infrastruttura a containers come Docker.
Questo punto è molto interessante: data la possibilità di eseguire l'applicazione anche su Linux, può essere utilizzata indistintamente sia la versione di Docker per Windows, sia quella per Linux.
Un altro dei motivi per cui si può scegliere di utilizzare ASP.NET Core piuttosto che la versione "standard", è la necessità di avere performaces molto elevate.
ASP.NET Core è almeno 10 volte più veloce rispetto ad ASP.NET.
Questo è dovuto anche alla sua elevata scalabilità.

Quando usare ASP.NET 4.x

Se la vostra applicazione web utilizza già ASP.NET Full Framework e non avete intenzione di migrare ad ASP.NET Core, potete anche smettere di leggere qua l'articolo e rimanere su questo ecosistema. :)

Un altro punto che vi può far optare subito per questa scelta è la disponibilità di librerie di terze parti solo per il full framework e non per ASP.NET Core. Sia che queste siano su NuGet che componenti di terze parti quali Telerik o Syncfusion.
Altre cose che non sono supportate da ASP.NET Core e che vi dovrebbero "trattenere" su quest'altra scelta sono ad esempio la mancanza di Web Forms e WCF.
Se utilizzate almeno una di queste due tecnologie e non volete riscrivere la vostra applicazione, vi conviene rimanere su questa strada.

Ricapitolando

Quando usare ASP.NET Core:

  • i server sono su Linux
  • si è scelto di utilizzare Docker come container delle proprie applicazioni
  • performance e scalabilità sono due requisiti fondamentali

Quando usare ASP.NET Full Framework:

  • l'applicazione che state sviluppando utilizza già il Full Framework e non avete le necessità dei punti precedenti
  • utilizzate librerie di terze parti che non supportano .NET Core

Conclusioni

Le mie conclusioni sono che non esiste una verità assoluta sull'adozione di ASP.NET Core su un progetto, che sia nuovo o una migrazione di uno esistente ASP.NET 4.x.
Questa scelta dipende sempre dai requisiti che avete e da quanto la vostra applicazione sfrutterà le nuove funzionalità di ASP.NET Core da cui non potete prescindere assolutamente (le vedremo nel prossimo post).

Visual Studio Extensions: SolutionColor

Non so a voi, ma a me capita molto spesso di lavorare con molte più istanze di Visual Studio aperte contemporaneamente.
Spesso, passando da una finestra all'altra, devo innanzitutto capire in che solution mi trovo e quindi ricercare quello che stavo guardando.
Ho provato anche ad usare il multidesktop, ma il risultato cambia poco.
L'unica soluzione che ho trovato più rapida e che mi fa perdere meno tempo è aggiungere un'estensione per Visual Studio 2015, molto semplice: https://marketplace.visualstudio.com/items?itemName=Wumpf.SolutionColor

Questa piccola estensione non fa altro che aggiungervi nella toolbar due pulsanti: il primo vi permette di selezionare un colore che vi andrà a ricolorare la toolbar della finestra di Visual Studio e il secondo vi azzera questa impostazione.
In questo modo potete andare a colorare le vostre finestre di Visual Studio in base alla solution e quindi ricordarvi a colpo d'occhio di quale progetto si tratta.
Attenzione che il colore lo memorizza in base alla posizione del file .sln e non del nome della solution, quindi se spostate i sorgenti, perdete l'impostazione.

That's all folks!

Evento: Visual Studio 2017, novità e dintorni da Connect()

Venerdì 3 Febbraio presso il dipartimento di Informatica a Pisa, ci sarà un nuovo evento targato DotNetToscana.
Questa volta parleremo delle tante novità che ci sono state negli ultimi mesi, lato sviluppo.

In particolar modo, durante la mia sessione, andremo a vedere le novità di ASP.NET Core 1.1 dal punto di vista di un progetto reale.
Quindi, niente "Hello World" ma un progetto vero e proprio sviluppato con l'ultima versione di ASP.NET.
Nel dettaglio andremo a vedere cose del tipo:

  • Dependency Injection
  • Dapper
  • Custom Tag Helper
  • Response Caching
  • Response Compression
  • Globalization e Localization
  • Memory Cache
  • Redis Cache
  • Bower, Gulp
  • Swagger for ASP.NET CORE
  • EF con SQLite

Queste sono quelle che mi vengono in mente, ma sicuramente c'è altro. :)

A questo link http://dotnettoscana.org/eventi/visual-studio-2017-novit%C3%A0-e-dintorni-da-connect potete trovare l'agenda con le altre sessioni e soprattutto il link per la registrazione.
Questo il link dell'evento su Facebook: https://www.facebook.com/events/191992654607241

Ci vediamo a Pisa!

[UPDATE]
Piccolo aggiornamento.
Visto che non ho tutto il giorno, ma solo un'ora ho dovuto cambiare un po' gli argomenti.
In rosso quelli eliminati, in verde quelli aggiunti.
[/UPDATE]

Evento: DevOps@Work 2017

Vi segnalo un evento molto interessante che si terrà Venerdì 10 Febbraio a Roma (nella sede Microsoft).
Come si può capire dal titolo dell'evento sarà una giornata all'insegna di DevOps.
Verranno affrontati argomenti come Visual Studio Online, TFS 2017, Azure, Docker, Git, GitFlow e tanti altri.
La giornata sarà divisa su due track parallele (difficilissimo scegliere!) e gli speaker sono tutti veramente in gamba.

Potete trovare maggiori informazioni e soprattutto le track e gli abstract sulla pagina di EventBrite in cui, ovviamente, è possibile anche registrarsi.
Fatelo prima possibile, non rischiate di perdervi questo evento interessantissimo.

https://www.eventbrite.it/e/biglietti-devopswork-2017-30931208076?aff=es2