Antonio "tdj"

(C'è sempre un modo migliore)
posts - 312, comments - 268, trackbacks - 17

My Links

News







Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

Articoli

Blogs

Controlli WinForm free

Guide

Siti vari

Sviluppo

martedì 22 aprile 2014

Un suite di controlli tematici da Aspose

Chi sviluppa, spesso fa uso di controlli di terza parti (sia gratuiti che a pagamento) per sopperire alle mancanze degli strumenti di sviluppo. Di suite complete ne esistono diverse ma quella proposta da Aspose si distingue perché non offre i "classici" controlli per realizzare interfacce grafiche (come dropdown, button, toolbar...) ma controlli tematici orientati ai servizi.

Ad esempio...

Abbiamo bisogno di generare documenti in PDF? C'è Aspose.Pdf.
Dobbiamo gestire email con allegati, invio massivo, ecc.? C'è Aspose.Email .
Dobbiamo interfacciarci con Office? Ci sono Aspose.Word, Aspose.Cells, Aspose.Note...

E tanti altri che trovate qui non solo per .Net ma anche per Java  e Android. Insomma ce n'è per tutti i gusti.


 

posted @ martedì 22 aprile 2014 09:23 | Filed Under [ Dev Visual Studio ]

lunedì 25 novembre 2013

15 anni e non sentirli

Nella smorfia napoletana il numero 15 rappresenta "il ragazzo" o il giovanotto e se nel settore informatico questa età rappresenta un'eternità lo stesso si potrebbe dire per una community che tratta di informatica sopratutto se consideriamo che questa community esiste ancora!

E infatti Visual Basic Basic Tips & Tricks compie proprio 15 anni.

E mi sono accorto che anche io ne compio 15. Cioè 15 anni da quando seguo (a mia memoria) questa community.
Ricordo di averla scoperta quando ancora l'url da digitare era www.beginend.com/vbasic ed io frequentavo l'Università Di Milano (Informatica ovviamente...)

Ho iniziato come utente alla ricerca di risposte alle tante domande che mi facevo quando smanettavo con VB6 nell'allora mailing list per poi iniziare a contribuire in prima persona nei forum e con alcuni articoli fino ad essere parte integrante di quel gruppo di persone che si occupa quotidianamente di portare avanti questa enorme community che conta, oggi, oltre 46.000 utenti!

15 anni fa mai avrei pensato di arrivare dove sono ora e questo rende il traguardo ancora più importante perchè significa che le community funzionano :)

Di cose ce ne sarebbero tante da dire e l'occasione sarà sicuramente l'evento speciale che abbiamo organizzato per festeggiare questo compleanno martedì 3 dicembre 2013 nella sede di Microsoft Italia (e dove sennò!).

Sarà un pomeriggio (14-18,30) davvero ricco perchè intanto ci sarà un pezzo da 90 direttamente da Redmond, un tale Anthony D. Green che è il Program Manager del Visual Basic Language Team che terrà una sessione sul progetto Roslyn che impatterà moltissimo sui compilatori dei linguaggi .Net nel prossimo futuro.
Ora, già questo vale la presenza Però per noi non basta e quindi Alessandro vi parlerà dello sviluppo moderno per applicazioni Windows con le nuove tecnologie del .Net Framework mentre io vi annoierò un po' con le novità di Entity Framework 6 :)

Non vi basta?

E allora ci mettiamo pure un bel collegamento live con i membri del Team di Visual Basic che oltre a farci gli auguri ci sveleranno qualche chicca su VB.

Non siete ancora soddisfatti?

Beh... iscrivetevi e trovere altre sorprese ;-)

Vi aspettiamo!

posted @ lunedì 25 novembre 2013 08:32 | Feedback (0) | Filed Under [ .NET Visual Studio Community Entity Framework Entity Framework Code First ]

venerdì 25 ottobre 2013

Unit Test con Microsoft Fakes

Qualche giorno fa ho avuto la necessità di fare unit testing su una classe piuttosto semplice: generazione di token con scadenza.
Semplice, fino a quando mi sono ritrovato a fare i conti con la presenza dell'istruzione DateTime.UtcNow.AddMinutes(...) utilizzata per creare una data di scadenza del token. La domanda che mi sono posto è stata "come diavolo faccio a testare qualcosa che dipende dalla macchina su cui è eseguito?".

Nel caso specifico, avevo la necessità di verificare la scadenza di un token con l'assert Token.IsExpired simulando l'esecuzione in due momenti temporali diversi. Che tradotto significava prendere in prestito la DeLorean di Doc per andare a spasso nel tempo :)

Tornando seri, la soluzione, nel caso di Unit Test, è quella di fare il Mock dell'oggetto DateTime, cioè simularne il comportamento con un oggetto equivalente. E durante le mie  ricerche sull'argomento mi sono imbattuto nei Microsoft Fakes.

Cosa sono?

Si tratta di una caratteristica introdotta già con Visual Studio 2012 che, per la verità, avevo già notato senza approfondire più di tanto,  che serve per creare degli assembly fake sia del .Net Framework che di progetti sviluppati da noi, da utilizzare proprio negli Unit Test.

Senza scendere troppo in dettaglio, con gli assembly fakes abbiamo la possibilità di isolare parti di codice del .net framwork mediante l'uso di Stub o Shim.

Vediamo un esempio concreto.
Consideriamo una classe di esempio (sulla falsa riga di quella che ho realmente usato io):

Public Class DemoClass
    
Sub New()
        SetDate()
    
End Sub

    
Private m_DueDate As DateTime
    
Public Property DueDate() As DateTime
        
Get
            
Return m_DueDate
        
End Get
        
Private Set(ByVal value As DateTime)
            m_DueDate = value
        
End Set
    
End Property

    
Private Sub SetDate()
        DueDate = 
DateTime.UtcNow.AddMinutes(5)
    
End Sub

    
Public ReadOnly Property IsExpired As Boolean
        
Get
            
Return DueDate <= DateTime.UtcNow
        
End Get
    
End Property
End Class

Banalmente è una classe che ha una scadenza di 5 minuti dal momento i cui viene istanziata.
Creiamo un nuovo progetto di tip Unit Test e aggiungiamo il nostro progetto Demo come reference.
La nostra esigenza è di fare uno unit test sulla proprietà IsExpired e per farlo dobbiamo simulare il comportamento del tipo DateTime di .Net utilizzando un assembly fake.
Abilitiamo l'opzione Show all files del progetto di test i modo da visualizzare il nodo References del progetto e facciamo click destro sulla reference di System. Dal menu contestuale selezioniamo la voce Add Fakes Assembly:



Dopo qualche secondo il progetto dovrebbe cambiare come segue:



In pratica Visual Studio ha creato le versioni Fake dell'assembly System e mscorlib (da cui dipende System) che saranno utilizzati per i nostri test.

Vediamo allora com'è il codice per testare la proprietà IsExpired:
<TestMethod()>
Public
 Sub Simulate_Expired_Instance()
  
Using ShimsContext.Create()
      
' Imposto la data Utc al 24/10/2013 10:00:00
      
ShimDateTime.UtcNowGet = Function() New DateTime(2013, 10, 24, 10, 0, 0)

      
Dim now As DateTime = DateTime.UtcNow

      
Dim test As New DemoClass

      
' Imposto la data Utc 6 minuti in avanti (al 24/10/2013 10:06:00)
      
ShimDateTime.UtcNowGet = Function() now.AddMinutes(6)

      
Assert.IsTrue(test.IsExpired)
  
End Using
End Sub

Innanzitutto utilizziamo un oggetto di tipo Shim perché non avendo una interfaccia di riferimento per DateTime dobbiamo simularne il comportamento con un oggetto equivalente. Tutti gli oggetti simulati hanno il prefisso ShimXxxxx ed espongono tutte le proprietà ed i metodi dell'oggetto reale ma con la possibilità di ridefinirne il comportamento mediante una lamda expression.
Però, perché tutto funzioni correttamente è necessario creare un contesto di simulazione utilizzando ShimContext.Create() (fondamentale lo Using!).
Nel nostro caso serve ridefinire la data UTC corrente simulando una certa data con questa istruzione:

ShimDateTime.UtcNowGet = Function() New DateTime(2013, 10, 24, 10, 0, 0)

in pratica decidiamo che tutte lechiamate DateTime.UtcNow, all'interno del contesto, restituiscano sempre il valore 24/10/2013 10:00:00. A questo punto diventa semplice simulare momenti temporali diversi e, di conseguenza simulare un intervallo di tempo della durata di oltre 5 minuti (durata massima di una istanza della nostra classe demo) semplicemente intervenendo sulla proprietà UtcNowGet  che viene spostata i avanti di 6 minuti subito dopo la creazione dell'istanza di test (come evidenziato nel codice di esempio precedente).

Eseguendo il nostro test il risultato sarà il seguente:


Per chi volesse approfondire l'argomento: Isolating Code Under Test With Microsoft Fakes

posted @ venerdì 25 ottobre 2013 07:32 | Feedback (0) | Filed Under [ Visual Studio Unit Test ]

giovedì 17 ottobre 2013

jQuery Validation e impostazioni multilingua con ASP.NET MVC

Realizzare applicazioni multilingua con asp.net MVC è abbastanza semplice grazie al namespace System.Globalization che offre decine di classi per questo scopo (senza dimenticare i file .resx).
Qualche problema, però, potrebbe sorgere quando bisogna gestire numeri e date lato client.
Di default, un progetto ASP.NET MVC utilizza la libreria jQuery Validation per gestire le validazioni lato client di numeri e date e il suo funzionamento dovrebbe tenere conto delle impostazioni internazionali. Dico "dovrebbe" perchè purtroppo non funziona proprio così.

Se, infatti , proviamo a definire una proprietà di tipo Decimal (o Double) nel modello, e proviamo a scriverci dentro un valore decimale, otteniamo un errore come questo:


Il motivo è molto semplice: jquery validation usa sempre le impostazioni americane per validare un numero decimale, considerando, cioè, il punto "." come separatore dei decimali.

La prima soluzione potrebbe essere quella di sovrascrivere il metodo di validazione incriminato ma in un contesto multilingua, non reggerebbe. Fortunatamente esiste una fantastica libreria javascript chiamata Globalize (che trovate anche su NuGet) che contiene le definizioni di tutte le culture permettendo la corretta interpretazione di numeri e date.

Si, ok, ma come posso integrare Globalize con jquery validation?

Tempo fa Scott Hanselman affrontò questo problema proponendo anche una soluzione piuttosto semplice, cioè fare l'override dei metodi di validazione number come nel codice javascript seguente:

$.validator.methods.number = function(value, element) {
   
if (Globalize.parseFloat(value)) {
        
return true;
    }
   
return false;
};

In pratica si utilizza il metodo Globalize.parseFloat() per intepretare i numeri decimali inbase alla cultura corrente. Per i più pigri, invece, da qualche tempo è disponibile un package NuGet chiamato jquery.validation.globalize che è sufficiente includere nelle view per applicare automaticamente l'override.
Queste sono le soluzioni che si trovano in giro per la rete.

Quindi è tutto risolto?

Beh non proprio perché il metodo parseFloat() presenta un picolo inconveniente.
Consideriamo un input di questo tipo:

10.5

per la cultura italiana, questo numero non è valido ma Globalize.parseFloat() restituisce il valore 105 che, essendo un valore numerico, rende vera la validazione vista in precedenza.
La soluzione che ho adottato io è di riprendere la regular expression usata da jQuery Validation basandomi, però, sulla cultura corrente impostata con Globalize:

$.validator.methods.number = function(value, element) {
  
var currentCulture = Globalize.findClosestCulture(Globalize.culture().name);
   
var _decimalSeparator = currentCulture.numberFormat["."],
        _digitsSepator = currentCulture.numberFormat[
","];

   
if (_decimalSeparator == ".") _decimalSeparator = "\\.";
   
if (_digitsSepator == ".") _digitsSepator = "\\.";

   
var reg = new RegExp("^-?(?:\\d+|\\d{1,3}(?:" + _digitsSepator + "\\d{3})+)?(?:" + _decimalSeparator + "\\d+)?$");

   
return this.optional(element) || reg.test(value);
};

In pratica recupero le impostazioni dei numeri decimali con Globalize e li applico alla regex che valida il numero in input.
Quindi, ritornando al nostro esempio iniziale, il valore 10,5 sarà accettato mentre 10.5 no:

Se qualcuno ha una soluzione alternativa, è il benvenuto :)

posted @ giovedì 17 ottobre 2013 07:32 | Feedback (0) | Filed Under [ Asp.net jquery Asp.net MVC ]

lunedì 16 settembre 2013

Evento autunnale con VBTT

 

L'estate sta finendo, cantavano i Righeira, e le attività lavorative riprendono ahimè (o per fortuna...).
Anche la nostra community di VBTT non è da meno, e dopo una meritata pausa estiva eccoci qui pronti per regalarvi un nuovo evento autunnale dedicato alle novità che Microsoft ci ha riservato per questo autunno.

L'appuntamento è per sabato 12 ottobre 2013, dalle 9,30 alle 13.00 presso l'Hotel Alfa Fiera a Vicenza, con tre sessioni dedicate allo sviluppo con il nuovo Windows 8.1, al nuovo IDE di Visual Studio 2013 e una sessione tutta dedicata alla programmazione WPF con trucchi e suggerimenti pratici.

Ovviamente non mancherà il consueto pranzo per tutti coloro che vorranno partecipare (leggete i dettagli dell'evento per sapere come fare)

Per tutti i dettagli dell'evento potete leggere qui!

 

posted @ lunedì 16 settembre 2013 08:36 | Filed Under [ Dev WPF Community Windows 8 ]

Powered by:
Powered By Subtext Powered By ASP.NET