lunedì 21 ottobre 2013

Dimensioni in MB di un Database su Windows Azure

Se usiamo un Database su Windows Azure sappiamo che non è possibile conoscere la sua dimensione utilizzando il Sql Management Studio, ma è necessario utilizzare l'Azure Portal che però non è aggiornato in real time... Se vogliamo quindi conoscere la dimensione del database, possiamo utilizzare la query seguente:

/*Dimensioni Database in MB*/
SELECT SUM(reserved_page_count) * 8.0 / 1024
FROM sys.dm_db_partition_stats


Se invece vogliamo sapere la dimensione in MB di ogni tabella nel database, questa query fa al caso nostro:

/* Dimensioni tabelle in MB */
SELECT sys.objects.name AS 'Nome tabella', SUM(reserved_page_count) * 8.0 / 1024 AS 'Mb'
FROM sys.dm_db_partition_stats
INNER JOIN sys.objects ON sys.dm_db_partition_stats.object_id = sys.objects.object_id
WHERE sys.objects.type = 'U'
GROUP BY sys.objects.name

sabato 10 agosto 2013

Eliminare un progetto da Team Foundation Service

Visto che su "Team Foundation Service" non si dispone di una console di amministrazione, non è ovviamente possibile utilizzarla per eliminare un progetto hostato.

Quindi, per eliminare un Team Project da una Collection di TFService bisogna usare il comando "tfsdeleteproject.exe" dall CLI:

tfsdeleteproject /collection:https://<nome collection>.VisualStudio.com/DefaultCollection <"Nome Progetto">

Per ulteriori informazioni, vedere: http://social.msdn.microsoft.com/Forums/en-US/TFService/thread/81997146-a64f-43fb-9952-57d71542cd11

mercoledì 5 giugno 2013

Scroll di una GridView sul gruppo desiderato in una Windows Store App

Di default, in una Windows Store App, il focus in una GridView viene posizionato sull'elemento 0 del gruppo 0. Ma se volessimo cambiare questo comportamento e fare in modo che venga "aperta" ad un elemento a nostro piacimento?

Per farlo bisogna gestire l'evento itemGridView_Loaded ed utilizzare le CollectionView:

Nello XAML:
<GridView
    x:Name="itemGridView"
    AutomationProperties.AutomationId="ItemGridView"
    AutomationProperties.Name="Grouped Items"
    Grid.RowSpan="2"
    Padding="116,137,40,46"
    ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
    ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
    SelectionMode="None"
    IsSwipeEnabled="false"
    IsItemClickEnabled="True"
    ItemClick="ItemView_ItemClick"
    Loaded="itemGridView_Loaded">

Nel code-behind:
private bool firstTime = true;
        
   private void itemGridView_Loaded(object sender, RoutedEventArgs e)
   {
        ICollectionView view;
        ICollectionViewGroup myGroup;
        Data.MyDataType myItem;
 
        if (!this.firstTime) return; else firstTime = false;
        view = itemGridView.ItemsSource as ICollectionView;
        view.CurrentChanged += view_CurrentChanged;
        int groupIndex = 2; // an integer value between 0 and # of items in the groups collection
        myGroup = view.CollectionGroups[groupIndex] as ICollectionViewGroup;
        myItem = recipeGroup.GroupItems[0] as Data.MyDataType;
        view.MoveCurrentTo(myItem);
    }
     
    private void view_CurrentChanged(object sender, object e)
    {
        ICollectionView view;
        Data.MyDataType  myItem;
         
        view = itemGridView.ItemsSource as ICollectionView;
        view.CurrentChanged -= view_CurrentChanged;
        myItem = view.CurrentItem as Data.MyDataType;
        itemGridView.ScrollIntoView(view.CurrentItem, ScrollIntoViewAlignment.Leading);
    }

mercoledì 29 maggio 2013

Privacy Policy nella Charm Bar: il modo più semplice...

Quando si sviluppa una Windows Store App, se l'applicazione usa un qualsiasi tipo di connettività (rete locale o internet), è necessario specificare le Privacy Policy sia nella pagina dello store sia nella Charm Bar.

Ma come farlo? Qual'è il metodo più semplice?

Vediamolo...

Fare le seguenti modifiche nel file App.xaml.cs:

1) Aggiunta dei namespace
using Windows.UI.ApplicationSettings;
using Windows.UI.Popups;


2)Aggiunta dell'handler nel metodo OnLaunched()
SettingsPane.GetForCurrentView().CommandsRequested += SettingCharmManager_CommandsRequested;


3) Implementazione dell'handler
private void SettingCharmManager_CommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args)
{

    args.Request.ApplicationCommands.Add(new SettingsCommand("privacypolicy", "Privacy policy", OpenPrivacyPolicy));

}

4) Aggiunta del metodo OpenPrivacyPolicy
private async void OpenPrivacyPolicy(IUICommand command)
{

    Uri uri = new Uri("http://il_mio_sito/la_privacy.html");
    await Windows.System.Launcher.LaunchUriAsync(uri);

}


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 Toscana di 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)