Si cambia casa

Eccoci qua, dopo tanti anni mando in pensione questo blog e ne apro uno nuovo. 

Un grande grazie alla community ugidotnet per l'ospitalità e ci vediamo sul nuovo blog  http://www.robertocappelletti.com ...

Metro Style App - Share Content

Windows 8 oltre ad essere un sistema operativo è una piattaforma che si integra con le nostre applicazioni e ci permette di arricchirle di funzionalità.
In questo esempio vedremo come è possibile condividere dati tra applicazioni.

Il caso che analizzeremo riguarda  una applicazione che mostra fotografie e vogliamo che possano essere condivise ad un indirizzo mail.
Nel modello classico windows dovremmo: salvare l’immagine, aprire un client di posta, allegare l’immagine e in fine inviarla.
Oppure potremmo integrare la nostra applicazione con un client di posta, ma se invece di una mail volessimo twittare o postare la foto su facebook?

Per rispondere a tutte queste esigenze Win8 mette a disposizione i Contracts che rappresenta il modello che permette alle applicazioni di comunicare tra di loro.
Ogni applicazione dichiara quali sono i contratti che è in grado di gestire:

  • Search: Funzione di ricerca estesa a tutte le altre applicazioni
  • Share: L’app può essere usata per condividere informazioni con e da altre applicazioni
  • AutoPlay: Attraverso la share charm l’app può inviare contenuti digitali a device DLNA compliant
  • Settings: La gestione dei settings è parte della experience di Windows 8
  • App to app picking: L’app diventa target di un operazione «Apri file»

Ritorniamo al nostro esempio e vediamo come è possibile realizzarlo.

Creiamo una nuova Blanck Application e inseriamo il seguente Xaml nella pagina

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Image      Grid.Row="0" x:Name="Photo"  Width="500" Height="383" Source="Images/Image1.jpg" />
    <TextBlock  Grid.Row="1" x:Name="Title" Text="A poem is a city" HorizontalAlignment="Center" FontSize="36" />
    <TextBlock  Grid.Row="2" x:Name="Description" HorizontalAlignment="Center" FontSize="14" >
        a poem is a city filled with streets and sewers <LineBreak/>
        filled with saints, heroes, beggars, madmen, <LineBreak/>
        ...
    </TextBlock>
</Grid>

Il risultato sarà il seguente:

image

A questo punto scriviamo il codice che consente di esporre dati verso altre applicazioni.
Abbiamo a disposizione una serie di metodi per ogni evenienza:
- SetUri per impostare un url
- SetText per del testo
- SetBitmap per le immagini
- SetStorageItems per un file allegato
In oltre abbiamo la possibilità di dare una titolo e una descrizione allo share e di utilizzare la property FailWithDisplayText per dare messaggi di errore in caso di problemi.

public BlankPage()
{
    this.InitializeComponent();

    DataTransferManager datatransferManager = DataTransferManager.GetForCurrentView();
    datatransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.DataRequested);
}

async void DataRequested(DataTransferManager sender, DataRequestedEventArgs e)
{
    e.Request.Data.Properties.Title = Title.Text;
    e.Request.Data.Properties.Description = "Share content with ...";

    var image = await Package.Current.InstalledLocation.GetFileAsync(@"Images\Image1.jpg");
    var imageList = new List<StorageFile>();
    imageList.Add(image);
    e.Request.Data.SetStorageItems(imageList);
}

Una volta lanciata la nostra applicazione accediamo alla Charms bar e selezioniamo la voce Share.

image

Abbiamo la possibilità scegliere l’applicazione con cui condividere i dati.

image

Selezioniamo la app Mail e ci viene proposta una mail già pronta da inviare.

image

Potete scaricare il codice dell’esempio da qui.

Tag di Technorati: ,,,,

Metro Style App - Camera Capture

Vediamo come è semplice andare ad interagire con la fotocamera e scattare una foto in windows 8 (CCP) creando una applicazione metro in xaml.

Per prima cosa creiamo un nuovo progetto di tipo Blank Application.
image

Nel codice Xaml della pagina principale andiamo ad inserire un controllo image che visualizzerà la nostra foto appena scattata, un button che farà partire l’evento di cattura dell’immagine, e un textblock che visualizzerà i messaggi.

<StackPanel>
    <Button Height="83" Width="142" Content="Scatta Foto" Click="TakePhoto"  />
    <Image x:Name="OutputImage" MaxWidth="392" Stretch="Fill" />
    <TextBlock x:Name="OutputText" Text=""/>
</StackPanel>

Nel code behind creiamo il metodo di gestione dell’evento del bottone e istanziamo  la classe CameraCaptureUI.
CameraCaptureUI viene utilizzata sia per catturare immagini che video e ed possibile personalizzare una serie di configurazioni come il ritaglio, il formato e la risoluzione.
CaptureFileAsync è il metodo che fa comparire la schermata di cattura della web cam, come si può notare è asincrono come tutte le chiamate in win 8 che potenzialmente possono essere superiori a 50ms.
Le nuove keyword asyc e await ci aiutano a semplificare molto lo sviluppo, notate come il metodo TakePhoto sia marcato async visto che nel corpo del metodo viene usato await.
Una volta che l’utente ha completato la scatto della foto viene restituito un oggetto StoregeFile che sarà comune i tutti gli scenari dove andiamo ad accedere a risorse.
A questo punto non ci resta che prendere il contenuto del file e impostarlo come risorsa del controllo image.

private async void TakePhoto(object sender, RoutedEventArgs e)
{
    try
    {
        //Inizializza l'oggeto camera
        CameraCaptureUI dialog = new CameraCaptureUI();
        //Attiva l'ambiente per scattare la foto e attende la risposta in maniera asincrona
        StorageFile file = await dialog.CaptureFileAsync(CameraCaptureUIMode.Photo);

        if (file != null)
        {//Se l'immagine è stata correttamente scattata dall'utente
            BitmapImage bitmapImage = new BitmapImage();
            using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read))
            {
                bitmapImage.SetSource(fileStream);
            }
            OutputImage.Source = bitmapImage;
            OutputText.Text = "Photo captured.";
        }
        else
            OutputText.Text = "No photo captured.";
    }
    catch (Exception ex)
    {
        OutputText.Text = ex.Message;
    }
}

Prima di provare la nostra applicazione però dobbiamo attivare la capability WebCam  all’interno del manifest, per concedere i privilegi necessari per accedere alla fotocamera.

image

Ecco il risultato … potete scaricare il codice qui.

image

image

Tag di Technorati: ,,,

Kanban

Dove vogliamo andare?
Quest'anno in azienda tra gli obbiettivi che ci siamo dati per il 2012 c'è la necessità di migliorare il processo di sviluppo software.
Due aspetti su cui vogliamo concentrarci sono la visibilità delle informazioni e la gestione del cambiamento perché sono quelli che ci danno maggiori difficoltà.

Dove siamo?
Facciamo un passo indietro; quale metodologia e quali strumenti utilizziamo?
La metodologia è incrementale adattativa, basata sul nostro modello di business, prende spunto per la parte di project management da Scrum e per la parte di sviluppo dalle pratiche di Xp (Continuous Integration, Testing …).
Lo strumento principe è ovviamente Tfs (Source Control, Work Item Tracking, Build) a cui si agganciano altri strumenti creati ad hoc.
Tfs è veramente eccezionale sul tracking ma, purtroppo è dentro un pc, NON lo vedo e NON lo tocco, perciò ci serviva qualcosa su cui “sbattere la faccia”.
Scrum è una ottima metodologia ma, ci siamo resi conto di non riuscire a mantenere Sprint con time box fisso e Sprint Backlog rigidi.
Quindi pur essendo Scrum poco prescrittivo abbiamo avuto il timore di snaturare la metodologia.

Cosa è Kanban?
Kanban letteralmente significa Cartellino e arriva dal mondo Lean Development.
Si basa su 3 concetti base:
- Rendere il lavoro visibile
- Limitare il work in process
- Aiutare il flusso a scorrere

Solitamente viene utilizzata una Kanban Board cioè una lavagna suddivisa in colonne che rappresentano gli stati.
Il lavoro viene diviso in parti e scritto sulle card, e queste sono appese sulla board.
Agli stati vengono assegnati dei limiti che vincolano il lavoro contemporaneo.
L’obbiettivo è ottimizzare il processo per rendere il lead time (il tempo di attraversamento) quanto più piccolo e prevedibile possibile.

kanban-3f

Come vogliamo adottarlo?
L’idea è di partire con una sperimentazione su alcuni team e di estendere poi il modello a tutti i team dell’azienda.
Non volevamo stravolgere il modo di lavorare quindi tutti gli strumenti e i processi nella prima fase resteranno invariati. Per fare una esempio chiarificatore i work item saranno ancora presenti in tfs, semplicemente saranno visibili anche sulla Kanban bord.
Ogni team avrà la sua board.
I post-it saranno di più colori e ogni colore rappresenterà una iterazione. Accade infatti che nel nostro modello di business, un team lavori per più clienti contemporaneamente o anche su più iterazioni contemporanee magari legate a branches differenti.
La board ci consentirà visualmente di monitorare l’avanzamento, le code e i colli di bottiglia, limitando i continui cambi di contesto sulle attività parallele.
Ricordo una bella sessione di Brandolini che mostrava come il costo di una funzionalità crescesse quanto più questa rimaneva bloccata e al tempo stesso impediva di fare crescere il Roi derivato.

Untitled2
Sulla card abbiamo deciso di riportare il numero di work item, una descrizione sintetica della richiesta, dei pallini neri che visivamente ci indicano che quella richiesta è stata soggetta a dei bug, e un peso indicativo in ore.
Durante l’incontro che abbiamo fatto insieme al team, che è partito per primo, abbiamo definito quali erano i limiti per ogni stato partendo dalla formula (numero dei componenti del team * 2 -1) e fatto piccoli adattamenti al modello della bord generale che avevamo preparato.

Untitled 

Per trarre conclusioni è presto ma, sicuramente sono emerse due evidenze:
Una pratica all’apparenza semplice (carta su una lavagna) in poco tempo fa emergere problemi invisibili prima e attira la non facile attenzione del management.

Tag di Technorati: ,,

Kinect SDK - Risorse

Insieme delle risorse e del materiale utile per lavorare con il Kinect e la sua SDK.

Sito ufficiale del Kinect SDK
è possibile scaricare sdk e materiale informativo
http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/default.aspx

Kinect for Windows SDK Beta Forums
http://social.msdn.microsoft.com/Forums/en-US/category/kinectsdk

 

Video


Video di lancio ufficiale del Kinect SDK Beta
http://channel9.msdn.com/Events/KinectSDK/BetaLaunch

Kinect for Windows SDK Quickstarts
video di channel 9 ben fatti che mostrano Skeletal Tracking, Depth Data e Audio
http://channel9.msdn.com/series/KinectSDKQuickstarts/

 

Librerie


Coding4Fun Kinect Toolkit
insieme di Extension Methods che facilitano lo sviluppo 
http://c4fkinect.codeplex.com/

Kinect Contrib
Visual Studio 2010 Templates non particolarmente utile
http://kinectcontrib.codeplex.com/releases

Kinect Toolkit
libreria per le gestures, comodo il record and replay
http://kinecttoolkit.codeplex.com/

 

Progetti


Kinect Paint
Disegnare con le mani 
http://paint.codeplex.com/

Become The Incredible Hulk
Diventi Hulk con poco
http://www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx

Light Saber
Schiabola virtuale
http://channel9.msdn.com/coding4fun/kinect/Of-course-our-first-Kinect-for-Windows-SDK-Project-has-to-involve-a-Light-Saber

Candescent NUI
Tracking delle dita
http://candescentnui.codeplex.com/

 

Articoli


Unleash the power of Kinect for Windows SDK
Introduzione sulle funzionalità base
http://blogs.msdn.com/b/eternalcoding/archive/2011/06/13/unleash-the-power-of-kinect-for-windows-sdk.aspx

Gestures and Tools for Kinect
David Catuhe spiega come rilevare gestures come lo swipe o il cerchio
http://blogs.msdn.com/b/eternalcoding/archive/2011/07/04/gestures-and-tools-for-kinect.aspx

Tag di Technorati:

Category Filter in AND in una build

Con il team volevamo creare una build che escludesse 2 categorie di test, l’attività sembrava semplice ma una la label ci ha tratto in inganno facendoci perdere un po’ di tempo.

image

Come si vede nell’immagine nella descrizione viene chiesto di utilizzare l’operatore && per legare due clausole.
L’operatore && in fase di build scatena un generico TF270015: 'MSTest.exe' returned an unexpected exit code. Expected '0'; actual '1' e non vien chiarito neanche impostando la verbosità dei log in modalità diagnostica. 
Dopo alcuni tentativi abbiamo scoperto che l’operatore da utilizzare era semplicemente &.

Tag di Technorati: ,

Frasi dal Team

Vi riporto alcune frasi uscite dai team della azienda dove lavoro che in qualche modo mi hanno fatto riflettere.
I citati spero mi scuseranno se non riporto le parole precise ma quello che mi è rimasto.

“Per fare in modo che lo sviluppo software funzioni davvero servono tutti i pezzi”
-Gigi-

Se non ho una architettura disaccoppiata, se non ho test unitari fatti in un certo modo, se non ho le build in countinuos integration che lanciano i test, non posso apprezzare totalmente i vantaggi derivanti dallo sforzo speso per sviluppare in un certo modo.
Il pacchetto va preso tutto insieme suocera inclusa, se ne si prende solo una parte i vantaggi sono presenti ma il ritorno sull’investimento non è soddisfacente.
Fino a quando non metto la chiave di volta l’arco non è saldo.

image “Se non avessi avuto i test quella modifica l’avrei fatta diversamente cercando di toccare il meno possibile”
-Riccardo-

Devo fare una modifica e non ho confidenza con il pezzo di codice, quindi decido di usare l’approccio “sal funsiuna tuca nient” anche se lo “smell” mi infastidisce, se invece ho le spalle coperte dai test posso avventurarmi in un refactoring che migliora l’applicazione.
Questo credo che faccia la differenza tra un software che dopo due anni è marchiato “da buttare” e uno che è in continua evoluzione.
Confidenza e refactoring sono legati a filo doppio.

 

Tag di Technorati: ,,,

Monitorare i pocessi attivi di Sql Server

In questi giorni mi è capitato di andare alla ricerca di qualcosa che portava la cpu di Sql Server al massimo, credo che sia interessante vedere quali sono gli strumenti che si possono utilizzare per un compito come questo.

Activity Monitor
L’Activity Monitor permette di visualizzare informazioni sui processi di SQL Server.
Vengono visualizzati tutti gli spid con il loro stato, l’applicazione che li ha generati ed è possibile fare il Kill del processo.

image

Profiler
Il profiler è uno strumento estremamente potente che ci permette di monitorare tutte quelle che sono le query che vengono eseguite sull’istanza di Sql Server.
Le configurazioni sono praticamente infinite, possiamo specificare il nome del db, l’utente, i tempi di durata delle query, vedere le stored procedure e anche gli statement eseguiti all’interno.
Una volta attivato è possibile esportare la traccia in una tabella o in file.
Le best practice dicono di attivarlo su una macchina diversa dal server sql per ridurre il carico di elaborazione che comunque è alto essendo uno strumento di analisi dei problemi.

sp_who2 e sp_WhoIsActive
La stored procedure sp_who2 ricalca in parte le funzionalità del Activity Monitor, ma essendo un script è sicuramente più veloce e comodo da eseguire.
sp_WhoIsActive invece è una interessante stored procedure che potete trovare qui http://sqlblog.com/files/folders/release/entry29675.aspx.
Questa sp_WhoIsActive permette di visualizzare in maniera dettagliata quali sono i processi attivi che query stanno eseguendo, nel mio caso è stata estremamente utile.

image

Tag di Technorati:

Configurare il net.tcp binding in un servizio wcf

Wcf si basa sui modello ABC (Address, Binding, Contract) questo modello è estremamente flessibile e ci permette ad esempio di cambiare il binding, cioè il modo in cui i servizi  comunicano, senza modificare come sono fatti.

Esistono diversi tipi di bindig, il NetTcpBinding utilizza il protocollo di trasporto Tcp, i pacchetti sono compressi in binario a differenza del basicHttp o del wsHttp che sono in soap. Vediamo quindi come configurare un servizio che sfrutti il NetTcpBinding e come ospitarlo in IIS 7.5.

Per prima cosa vediamo come configurare il servizio wcf

<system.serviceModel>
  <services>
    <service name="MyService" behaviorConfiguration="MyServiceBehavior">
      <endpoint address="" binding="netTcpBinding" bindingConfiguration="MyTcpConfiguration" contract="IMyService"/>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
  </services>
  
  <bindings>
    <netTcpBinding>
      <binding name="MyTcpConfiguration">
        <security mode="None"/>
      </binding>
    </netTcpBinding>
  </bindings>
  
  <behaviors>
    <serviceBehaviors>
      <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

IIS 7 permette di ospitare servizi che utilizzino il protocollo Tcp tramite Windows Process Activation Services.

Per prima cosa verifichiamo che sia installato nelle Feature il Non-HTTP Activation
image

Sul sito che conterrà il nostro servizio aggiungiamo un nuovo binding, come tipologia net.tcp e come binding information la porta ad esempio 809:*
image

All’interno della Application negli Advanced Settings aggiungiamo il novo protocollo supportato.
image

Per consumare il web service adiamo a specificare l’indirizzo del endpoint così

<endpoint address="net.tcp://server:809/MyService.svc"
    binding="netTcpBinding" 
    bindingConfiguration="MyBindingConfiguration"
    contract="IDocumentService" 
    name="MyService" />
Tag di Technorati: ,,

IIS Express e transferMode="Streamed"

IIS Express è un nuovo web server creato a partire da IIS 7.x ideale negli scenari di sviluppo. Si integra ottimamente in visual studio e va in qualche modo a sostituire ASP.NET Development Server (Cassini).

I vantaggi di questo nuovo web server sono innumerevoli:
- Leggero e semplice da installare (il pacchetto di installazione pesa meno di 4Mb)
- Non richiede un account amministrativo per funzionare
- Include tutte le funzionalità di IIS compreso SSL, URL Rewrite, Media Support, e i moduli aggiuntivi di IIS
- Supporta il modello di estendibilità di IIS e le configurazioni del web server nel web.config
- Può essere installato side by side con IIS e con ASP.NET Development Server
- Funziona sotto XP e si hanno le stesse funzionalità di IIS 7.x

Può essere scaricato del seguente indirizzo http://www.microsoft.com/downloads/en/details.aspx?FamilyID=abc59783-89de-4adc-b770-0a720bb21deb

Per iniziare ad utilizzarlo vi rimando a questo post dove viene introdotto
http://weblogs.asp.net/scottgu/archive/2010/06/28/introducing-iis-express.aspx

Questo altro post parla della integrazione di IIS Express con il Sp1 di Vs
http://weblogs.asp.net/scottgu/archive/2011/01/03/vs-2010-sp1-beta-and-iis-developer-express.aspx

Ritorniamo a noi una delle funzionalità che ora si possono utilizzare con IIS Express è la modalità di trasferimento Streamed, infatti Cassini supportava solamente il tranferMode Buffered per i servizi Wcf.

Streamed è consigliato negli scenari dove spostiamo grosse quantità di dati ad esempio file e quindi questa funzionalità ci aiuta durante la fase di sviluppo e di debug senza dover cambiare la configurazione.

Tag di Technorati: ,
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011