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


Share on:

.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


Share on:

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. :)


Share on:

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? :)


Share on:

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()));
            }
        }

 


Share on: