martedì 14 maggio 2013

E-book tecnici gratuiti sulla piattaforma Microsoft


Anche se su internet e nei libri sono disponibili un sacco di informazioni sullo sviluppo software, normalmente queste informazioni sono difficili da digerire, da comprendere o anche solo da leggere. Se non ti diverti a leggere diversi libri con più di 500 pagine o perdere ore sul web per cercare informazioni, articoli e blog rilevanti, sei nel posto giusto.
Syncfusion ha pubblicato la serie "Succinctly", e-book tecnici gratuiti e "concisi", per gli sviluppatori che lavorano sulla piattaforma Microsoft. Ogni libro è di circa 100 pagine ed ti porta direttamente dentro i concetti che più interessano. Scarica una copia gratuita, prendi un bicchiere della tua bibita preferita, e divertiti!

lunedì 6 maggio 2013

Accesso ai dati con Windows 8 e Windows Phone 8: Evento by DotNetToscana


Windows 8 e Windows Phone:
tutto quello che avreste voluto sapere sull'accesso ai dati

DotNetToscana, community ufficiale Microsoft per la toscanadi cui faccio parte, organizza il giorno 18 maggio un evento gratuito sull'accesso ai dati da Windows 8 e Windows Phone 8 .

Le app Windows Store e Windows Phone 8 non forniscono un supporto nativo alla connessione verso i database. Come possiamo allora utilizzare una sorgente dati in queste due piattaforme? Nel corso della giornata, cercheremo di dare una risposta a tale domanda, mostrando quattro alternative che abbiamo a disposizione: servizi basati su WebAPI, Azure Mobile Services, database locali con SQLite e SkyDrive.

Per maggiori informazioni e per registrarti all’evento visita la pagina http://bit.ly/11IsgbI

Oppure scarica il volantino dell'evento: http://sdrv.ms/11NyZ1O

lunedì 8 aprile 2013

SharePoint 2013: The username is invalid. The account must be a valid domain account

Durante la configurazione di SharePoint 2013 in modalità “Complete” viene restituito il messaggio “The username is invalid. The account mist be a valid domain account” usando un account locale per la farm…


Questo accade perchè "out of the box" SharePoint supporta solo la modalità “Stand-alone” per le installazioni fuori dominio, e questo forza l'utilizzo di SQL Server 2008 R2 Express che, nella maggior parte dei casi, non è una soluzione valida.

La soluzione al problema è quella di usare un comando PowerShell per creare la configurazione iniziale della farm:


1) Avviare PowerShell di SharePoint (non la PowerShell "standard")

2) Eseguire il comando“New-SPConfigurationDatabase” e seguire le istruzioni a video. Questo comando crea la farm e configura tutte le impostazioni necessarie, tra cui l'account (che a questo punto può essere locale e non di dominio)


3) Riavviare il Configuration wizard. A questo punto non verrà più chiesto se configurare una nuova farm o usare quella presente. Il wizard rileva che c'è una farm esistente e utilizza quella per la configurazione. 


martedì 12 marzo 2013

Ottimizzazioni LINQ

1. Any oppure Count?
Quando si deve verificare la presenza di almeno un elemento in una collection o una lista, è meglio utilizzare
        if (query.Any())
al posto di
        if (query.Count() > 0)
In questo modo l'elaborazione si ferma al primo che trova.

2. Condizioni
È preferibile utilizzare
        query.FirstOrDefault(x => x.value > 1);
        query.SingleOrDefault(x => x.value > 1);
invece che
        query.Where(x => x.value > 1).FirstOrDefault();
        query.Where(x => x.value > 1).SingleOrDefault();
In questo modo viene eseguita una sola operazione invece che due operazioni concatenate.

3. Capire come funziona
Usando LINQ è sempre necessario cercare le performance migliori, per questo motivo è fondamentale capire bene come funziona internamente.
        using (MYDataContext context = new MYDataContext())
        {
            var customers = from cust in context.Customers
                            select cust;
            foreach (var customer in customer)
                Response.Write(customer.CustomerAddresses.Count().ToString());
        }
Nell'esempio precedente, da un'analisi con il Sql Server Profiler si nota che ogni volta che l'oggetto customer viene enumerato dentro il ciclo foreach viene eseguita una query per determinare il numero di indirizzi. ora consideriamo invece il seguente snippet:
        using (MYDataContext context = new MYDataContext())
        {
            var customers = from cust in context.Customers
                            select cust;
            DataLoadOptions dataLoadOptions = new DataLoadOptions();
            dataLoadOptions.LoadWith(A => A.CustomerAddresses);
            context.LoadOptions = dataLoadOptions;
            foreach (var customer in customer)
                Response.Write(customer.CustomerAddresses.Count().ToString());
        }
In questo esempio, usando DataLoadingOptions stiamo dicendo al motore di query LINQ che mentre si carica i dati da Customer deve anche associare direttamente i record della tabella CustomerAddresses. Il "beneficio" è che in questo caso viene eseguita UNA sola query per avere il risultato finale.

4. Infine...
Il successo dietro ad un'applicazione che fa uso di LINQ spesso sta dietro alle performance delle query scritte. Esistono diversi tool di terze parti che aiutano a sviluppare e ottimizzare le query LINQ, io preferisco e consiglio LINQPad (by Joseph Albahari).

venerdì 8 marzo 2013

Sondaggio sui pattern architetturali

Ho lanciato un sondaggio, qui a fianco, per sapere qual'è il vostro pattern architetturale preferito tra MVC, MVP e MVVM.

Il sondaggio sarà attivo fino al 31/03/2013 alle ore 23.59

Usate questo post per commentare il sondaggio o per specificare delle note nel caso scegliate "Altro"

Grazie :)

venerdì 22 febbraio 2013

Eliminazione valore di Default di una colonna

Assegnare via script T-SQL un valore di default ad una colonna è molto semplice. La sua rimozione, al contrario, non è semplicissima in quanto il nome della constraint che viene creata varia da server a server (quindi in un ambiente multi server oppure su ambienti diversi non avrà mai lo stesso nome).

Questo script recupera il nome del vincolo e lo elimina.


DECLARE @name nvarchar(100)

SELECT @name =  name FROM sys.objects WHERE type = 'D' AND object_id IN
(
SELECT default_object_id
FROM [sys].[all_columns]
WHERE name = 'column_name'
AND object_id =
(
SELECT  object_id FROM sys.objects WHERE type = 'U' AND name = 'table_name'
)
)

EXEC ('ALTER TABLE table_name DROP CONSTRAINT ' + @name)

giovedì 20 dicembre 2012

Controllo del timeout su un Task

Ci sono molti modi per verificare se l'esecuzione di un task si conclude entro un periodo di timeout. Questo è il più semplice ma non per questo meno efficace:
using System.Threading.Tasks;

[...]

try
{
    Task executeTask = STask.Factory.StartNew(() => DoSomething());

    //Wait for 5 minutes
    int index = System.Threading.Tasks.Task.WaitAny(new[] { executeTask },
     TimeSpan.FromSeconds(300));

    if (index == -1)
    {
        //Task execution Time Out
    }
    else
    {
        //Task executed in-time
    }
}
catch (AggregateException aex)
{
    foreach (Exception ex in aex.InnerExceptions)
        LogError(ex, ex.Message);
}
catch (Exception ex)
{
    LogError(ex, "Error");
}

domenica 2 dicembre 2012

Menu da Web.sitemap con separatori

Se si usa il file Web.sitemap per generare automaticamente le voci di menu in Asp.net, si nota subito che tutte le voci sono raggruppate insieme e non è possibile inserire un separatore. Utilizzando il codice di seguito, invece, è possibile.

Nel file Web.sitemap (per ogni node dopo il quale si vuole inserire il sepratatore):



Nel codice:

Protected Sub Menu1_MenuItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MenuEventArgs) Handles Menu1.MenuItemDataBound
    If e.Item.Text.IndexOf("[sep]") > 0 Then
        e.Item.Text = e.Item.Text.Replace("[sep]", "")
        e.Item.SeparatorImageUrl = Page.ResolveUrl("~/Common/images/dividerhoriz.gif")
    End If
 
    Try
        If Menu1.SelectedItem Is Nothing Then
            If IsNodeAncestor(CType(e.Item.DataItem, SiteMapNode), System.Web.SiteMap.CurrentNode) Then
                If e.Item.Selectable Then
                    e.Item.Selected = True
                End If
            End If
        End If
    Catch ex As Exception
 'Exception management
    End Try
End Sub
 
''' 
''' Determines if a  is the ancestor of a second one.
''' 
''' The  to analyze.
''' A  which may or may not be 
''' the 's child.
''' true, if the two nodes are related, false otherwise.
Private Function IsNodeAncestor(ByVal ancestor As SiteMapNode, ByVal child As SiteMapNode) As Boolean
    Dim result As Boolean = False
    Try
        If Not ancestor.ChildNodes Is Nothing AndAlso ancestor.ChildNodes.Contains(child) Then
            Return True
        Else
            If (Not child.ParentNode Is Nothing) AndAlso (Not ancestor Is child.RootNode) Then
                Return IsNodeAncestor(ancestor, child.ParentNode)
            End If
        End If
    Catch ex As Exception
 'Exception management
        Return False
    End Try

    Return result
End Function
 
Protected Sub SiteMapPath1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SiteMapNodeItemEventArgs) Handles SiteMapPath1.ItemDataBound
    If Not e.Item.SiteMapNode Is Nothing Then
        If e.Item.SiteMapNode.Title.IndexOf("[sep]") >= 0 Then
            Try
                e.Item.SiteMapNode.Title = e.Item.SiteMapNode.Title.Replace("[sep]", "")
            Catch
  'Exception management
            End Try
        End If
    End If
End Sub

sabato 1 dicembre 2012

Fonti per file multimediali

Ho deciso di inserire un post di riferimento per chunque (me compreso) abbia bisogno di foto, clipart, audio, musica o video. Aggiornerò questo post quando troverò nuove risorse.


Icone, Immagini e Foto
The Noun Project
http://thenounproject.com

IconFinder
http://www.iconfinder.com

Icons 8
http://www.icons8.com/

The XAML Project
http://www.thexamlproject.com/

SyncFusion Metro Studio
http://www.syncfusion.com/downloads/metrostudio

266 Icons
http://raphaeljs.com/icons/

Windows 8 App Icons
http://codefoster.com/win8icons

morgueFile
http://www.morguefile.com

iStockphoto
http://www.istockphoto.com

Corbis
http://www.corbis.com

Open Game Art
http://opengameart.org

Audio
freesound.org
http://www.freesound.org/browse

Incompetech
http://incompetech.com/music/royalty-free

Video
Ancora niente...

mercoledì 23 maggio 2012

Convertire un array di classi in DataTable

Utilizzando la Relfection e i Generics è possibile convertire (sarebbe meglio dire trasformare) un qualsiasi array di classi in un DataTable:


Imports System.Reflection


Public Shared Function convertFromClassToDatatable(Of T)(ByVal tableName As String, ByVal dati As T(), ByVal conIntestazione As Boolean) As DataTable

    Dim dt As New DataTable
    dt.TableName = tableName

    For Each prop As PropertyInfo In GetType(T).GetProperties
        dt.Columns.Add(prop.Name)
    Next

    If conIntestazione Then
        Dim drIntestazione As DataRow = dt.NewRow
        For Each col As DataColumn In dt.Columns
            drIntestazione.Item(col.ColumnName) = col.ColumnName.ToUpper
        Next
        dt.Rows.Add(drIntestazione)
    End If

    For Each dato As T In dati
        Dim dr As DataRow = dt.NewRow

        For Each prop As PropertyInfo In GetType(T).GetProperties
            dr.Item(dt.Columns.IndexOf(prop.Name)) = prop.GetValue(dato, Nothing)
        Next

        dt.Rows.Add(dr)
    Next

    Return dt
End Function


Utilizzo:

Dim mioArray As miaClasse()

convertFromClassToDatatable("Tabella di prova"),  mioArray, False)



Note: 
Siccome vengono utilizzati i Generics, in automatico il sistema sa che classe è "dati", che viene passata alla funzione. 
La DataTable risultante avrà TableName = tableName e i vari ColumnName saranno i nomi delle proprietà della classe "miaClasse"