martedì 27 luglio 2010

ASP.NET MVC 3 Preview 1 disponibile per il download

Microsoft non l’ha ancora annunciato ufficialmente ma dal sito è possibile scaricare la preview 1 di ASP.NET MVC 3:

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=cb42f741-8fb1-4f43-a5fa-812096f8d1e8

Maggiori info sul Blog di Simone Chiaretta : http://codeclimber.net.nz/archive/2010/07/27/ASP-NET-MVC-3-Preview-1-is-out.aspx?utm_source=twitterfeed&utm_medium=twitter&utm_campaign=CodeClimber

Tra le novità più interessanti di questa preview:

  • il nuovo View Engine Razor;
  • proprietà View e ViewModel dinamiche;
  • supporto per View Engine multipli durante l'"Add View" in Visual Studio;
  • i Global Filters;
  • supporto ai validation attributes di .NET Framework 4.0;
  • nuovi tipi per le Action Result;
  • supporto alla Dependency Injection.

 

Technorati Tags: ,,

Evitare che Visual Studio copi/tagli le righe vuote

Lavorando con Visual Studio (2008 o 2010) ed utilizzando la tastiera in maniera rapida (e maldestra), mi capita spesso di fare CTRL+X due volte di seguito con il risultato di ottenere il cut di ciò che voglio la prima volta e il cut di un bel niente la seconda.

Per evitare che Visual Studio non copi/tagli le selezioni vuote, si può andare nel menù Tools->Options:

Opzioni

 

lunedì 26 luglio 2010

System.Numerics.BigInteger + Parallel.For …… ed il fattoriale è servito!!

Uno dei sogni dei matematici di tutti i tempi è quello di calcolare il fattoriale di un qualsiasi numero intero. Ora, con l’introduzione della structure BigInteger del namespace System.Numerics il sogno diventa realtà.

La structure BigInteger consente di memorizzare un numero intero di qualsiasi dimensione:

Structure BigIntegerLa struttura memorizza il numero intero utilizzando un array di UInt32 e il segno con un Int32.

La struttura mette a disposizione una serie di metodi e di operatori che consentono di eseguire le usuali operazioni matematiche tra interi (anche utilizzando Int16, Int32 o Int64).

Un esempio classico di utilizzo della BigInteger è il calcolo del fattoriale.

Per chi non lo sapesse, il fattoriale si definisce nel seguente modo:

In matematica, se n è un intero positivo, si definisce n fattoriale e si indica con n! il prodotto dei primi n numeri interi positivi. In formule,

 n! := \prod_{k=1}^n k = 1\cdot2\cdot3\cdots(n-1)\cdot n

per definizione si chiede poi che 0!=1.

La funzione fattoriale può anche essere definita in modo ricorsivo:

 n! := \left\{ \begin{matrix}1 \quad&&\mbox{se } n=0;
                      \\
                      n(n-1)! &&\mbox{se } n\ge1~.\end{matrix} \right.

Questa definizione ci viene utile per poter eseguire il calcolo effettivo del fattoriale con un ciclo iterativo.

Se proviamo ad implementare una funzione per il calcolo del fattoriale con il massimo intero messo a disposizione dal framework prima dell’introduzione del BigInteger (cioè UInt64), possiamo arrivare al calcolo di :

20! = 2432902008176640000

in quanto 21! sarebbe pari a 51090942171709440000 che è maggiore del massimo intero contenuto in un UInt64 (18446744073709551615).

Una soluzione è memorizzare l’intero in un array di UInt64 e mettere in piedi tutta l’aritmetica che si occupa di “shiftare” i valori contenuti nell’array a seguito delle comuni operazioni matematiche e di “allargare” l’array in maniera opportuna.

L’alternativa offerta dal framework 4.0 è utilizzare la struttura BigInteger.

Utilizzando BigInteger non c’è virtualmente limite al numero n di cui calcolare il fattoriale.

La soluzione riportata in allegato contiene una semplice applicazione WPF 4.0 che permette di calcolare il fattoriale (utilizzando anche algoritmo parallelo).

L’applicazione utilizza un pattern MVVM il cui diagramma delle classi è il seguente:

Diagramma delle classi

Il fulcro dell’applicazione è la classe FactorialModel che contiene l’algoritmo di calcolo vero e proprio:

  1. Imports System.Numerics
  2. Imports System.Threading.Tasks
  3.  
  4. Namespace Model
  5.     Public Class FactorialModel
  6.         Public Property Argument As Int64
  7.  
  8.         Private _Factorial As BigInteger?
  9.         Public Property Factorial As BigInteger?
  10.             Get
  11.                 Return Me._Factorial
  12.             End Get
  13.             Protected Set(ByVal value As BigInteger?)
  14.                 Me._Factorial = value
  15.             End Set
  16.         End Property
  17.  
  18.         Public Property UseParallelAlgorithm As Boolean = True
  19.  
  20.         Public Function Calculate() As Boolean
  21.             Dim retval = False
  22.             Dim fatt As BigInteger = 1
  23.             If Argument < 0 Then
  24.                 Factorial = Nothing
  25.             Else
  26.                 Try
  27.                     If UseParallelAlgorithm Then
  28.                         Parallel.For(2, Argument + 1,
  29.                            Sub(i)
  30.                                fatt *= i
  31.                            End Sub)
  32.                     Else
  33.                         For i = 2 To Argument
  34.                             fatt *= i
  35.                         Next
  36.                     End If
  37.                     Factorial = fatt
  38.                     retval = True
  39.                 Catch ex As Exception
  40.                     Factorial = Nothing
  41.                 End Try
  42.             End If
  43.             Return retval
  44.         End Function
  45.     End Class
  46. End Namespace

La proprietà Argument definisce il valore di cui calcolare il fattoriale, la proprietà UseParallelAlgorithm definisce se utilizzare un For Each parallelo (disponibile nel framework 4.0) o uno classico e il metodo Calculate() esegue l’effetivo calcolo valorizzando opportunamente la proprietà Factorial:

 

  1. Public Function Calculate() As Boolean
  2.     Dim retval = False
  3.     Dim fatt As BigInteger = 1
  4.     If Argument < 0 Then
  5.         Factorial = Nothing
  6.     Else
  7.         Try
  8.             If UseParallelAlgorithm Then
  9.                 Parallel.For(2, Argument + 1,
  10.                              Sub(i)
  11.                                  fatt *= i
  12.                              End Sub)
  13.             Else
  14.                 For i = 2 To Argument
  15.                     fatt *= i
  16.                 Next
  17.             End If
  18.             Factorial = fatt
  19.             retval = True
  20.         Catch ex As Exception
  21.             Factorial = Nothing
  22.         End Try
  23.     End If
  24.     Return retval
  25. End Function

 

Da notare l’utilizzo del costrutto Parallel.For che diminuisce il tempo di calcolo nel caso di valori Argument molto alti.

Con l’utilizzo del BigInteger, quindi si può pensare di calcolare 1.000.000!:

1000000!

1.000.000! è un intero con 792.366 cifre!

Ora possiamo sognare anche altro!!!


 

P.S.: Vorrei ringraziare Alessandro Del Sole la classe RelayCommand che ho “meschinamente” utilizzato nella mia soluzione. Grazie Ale!!!

martedì 20 luglio 2010

System.Numerics.Complex, finalmente risolviamo le equazioni di secondo grado!!!

Vorrei segnalarvi che nella versione 4.0 del framework è stato introdotto un nuovo namespace, chiamato System.Numerics, contenente dei tipi numerici che fino ad ora mancavano all’interno del framework: i numeri complessi e gli interi di dimensione non definita.

In questo post ci occupiamo dei numeri complessi.

Prima di vedere come sono implementati nel framework, vorrei richiamare alcuni concetti matematici.

I numeri complessi sono un'estensione dei numeri reali nata inizialmente per consentire di trovare tutte le soluzioni delle equazioni polinomiali. Ad esempio, l'equazione

x^2=-1\,

non ha soluzioni reali, perché in questo insieme non esistono numeri il cui quadrato sia negativo.

Si definisce allora il valore i, chiamato anche unità immaginaria, che gode della seguente proprietà:

i^2=-1\,

e dunque:

i=\sqrt{-1}\,

I numeri complessi sono formati da due parti, una parte reale ed una parte immaginaria, e sono rappresentati dalla seguente espressione:

a + ib\,

dove a e b sono numeri reali, mentre i è l'unità immaginaria.

Per maggiori info di carattere matematico http://it.wikipedia.org/wiki/Numero_complesso

Il framework implementa i numeri complessi tramite la  struttura Complex.

Struttura ComplexLa struttura mette a disposizione 4 proprietà:

  • Imaginary : è un double che contiene la parte immaginaria del numero complesso;
  • Magnitude : è il raggio del numero complesso rappresentato in forma polare;
  • Phase : è l’angolo del numero complesso rappresentato in forma polare;
  • Real : è un double che contiene la parte reale del numero complesso.

Abbiamo, inoltre, a disposizione tutta una serie di operazioni matematiche che accettano, oltre che argomenti di tipo Complex, anche argomenti numerici preesistenti come Double, Integer, etc., etc.

La struttura ci mette, infine, a disposizione tre attributi statici che forniscono il prototipo dell’unità, dell’unità immaginaria e dello zero.

Un esempio pratico di utilizzo della struttura Complex è il calcolo delle soluzioni di un’equazione di secondo grado nella forma:

image

Il progetto allegato al post è formato da una semplice windows WPF, un model che si occupa del calcolo delle soluzioni dell’equazione di secondo grado e un viewmodel che si occupa di collegare il model alla window.

Non analizzeremo il viewmodel concentrandoci sulla classe EquationModel che contiene la logica di calcolo.

 

  1. Imports System.Numerics
  2. Namespace Model
  3.     Public Enum EquationType
  4.         Undefined
  5.         FirstDegree
  6.         SecondDegree
  7.     End Enum
  8.  
  9.     Public Class EquationModel
  10.         Public Property A As Double
  11.         Public Property B As Double
  12.         Public Property C As Double
  13.  
  14.         Public ReadOnly Property Delta As Double
  15.             Get
  16.                 Return (Math.Pow(B, 2) - 4 * A * C)
  17.             End Get
  18.         End Property
  19.  
  20.         Public ReadOnly Property Type As EquationType
  21.             Get
  22.                 If A = 0 Then
  23.                     If B = 0 Then
  24.                         Return EquationType.Undefined
  25.                     Else
  26.                         Return EquationType.FirstDegree
  27.                     End If
  28.                 Else
  29.                     Return EquationType.SecondDegree
  30.                 End If
  31.             End Get
  32.         End Property
  33.  
  34.         Public ReadOnly Property X1 As Complex?
  35.             Get
  36.                 Dim x As Complex?
  37.                 Dim y As Complex?
  38.                 CalculateSolutions(x, y)
  39.                 Return x
  40.             End Get
  41.         End Property
  42.  
  43.         Public ReadOnly Property X2 As Complex?
  44.             Get
  45.                 Dim x As Complex?
  46.                 Dim y As Complex?
  47.                 CalculateSolutions(x, y)
  48.                 Return y
  49.             End Get
  50.         End Property
  51.  
  52.         Private Sub CalculateSolutions(ByRef x1 As Complex?, ByRef x2 As Complex?)
  53.             x1 = Nothing
  54.             x2 = Nothing
  55.             If A = 0 Then
  56.                 If B <> 0 Then
  57.                     x1 = -C / B
  58.                     x2 = x1
  59.                 End If
  60.             Else
  61.                 x1 = (-B + Complex.Sqrt(Delta)) / (2 * A)
  62.                 x2 = (-B - Complex.Sqrt(Delta)) / (2 * A)
  63.             End If
  64.         End Sub
  65.     End Class
  66. End Namespace


La classe espone i tre coefficienti dell’equazione (A, B e C) e alcune proprietà calcolate:
  • Delta : la quantità delta che viene utilizzata nel calcolo delle soluzioni;
  • Type : tipo effettivo dell’equazione (non definita, di primo grado, di secondo grado);
  • X1, X2 : soluzioni dell’equazione. Queste proprietà sono di tipo Complex? poichè non è detto che l’equazione abbia soluzioni (ad esempio A=0, B=0 e C=1 non ha soluzioni).

Il metodo privato CalculateSolutions() è il metodo utilizzato per il calcolo effettivo delle soluzioni. All’interno di questo metodo possiamo osservare l’utilizzo del metodo Sqrt() della struttura Complex per il calcolo della radice quadrata.

Il diagramma delle classi complessivo è il seguente:

Diagramma delle classi

L’applicazione WPF riportata in allegato ha la semplice interfaccia:

EquationSolver

Da notare che la visualizzazione delle soluzioni (di fatto dei Complex?) è eseguita grazie al metodo di estensione:

  1. <Extension()>
  2. Public Function Format(ByVal c As Complex?) As String
  3.     Dim retStrBuild = New StringBuilder
  4.     If c.HasValue Then
  5.         If c.Value.Real = 0 Then
  6.             If c.Value.Imaginary = 0 Then
  7.                 retStrBuild.Append("0")
  8.             Else
  9.                 retStrBuild.AppendFormat("{0:F4} i", c.Value.Imaginary)
  10.             End If
  11.         Else
  12.             retStrBuild.AppendFormat("{0:F4}", c.Value.Real)
  13.             If c.Value.Imaginary > 0 Then
  14.                 retStrBuild.AppendFormat(" + {0:F4} i", c.Value.Imaginary)
  15.             ElseIf c.Value.Imaginary < 0 Then
  16.                 retStrBuild.AppendFormat(" - {0:F4} i", Math.Abs(c.Value.Imaginary))
  17.             End If
  18.         End If
  19.     Else
  20.         retStrBuild.Append("-")
  21.     End If
  22.     Return retStrBuild.ToString()
  23. End Function

Il codice completo della solution è scaricabile dal seguente link:

 

domenica 18 luglio 2010

Entiry Framework CTP4: Code First

Vi segnalo il seguente post del Team di ADO.NET riguardante una delle nuove feature introdotte nella CTP 4 di Entity Framework:

http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4codefirstwalkthrough.aspx

Per chi vuole vedere come funziona l’esempio riportato nel blog, conosce VB.NET e non conosce C#, allego la versione dell’esempio C# da me convertita.

 

Attenzione perchè per farlo funzionare è necessario avere installata un istanza di SQL Server Express (o SQLServer).


giovedì 15 luglio 2010

Entity Framework CTP4: Miglioramenti per la produttività

Vi segnalo il seguente post del Team di ADO.NET riguardante una delle nuove feature introdotte nella CTP 4 di Entity Framework:

http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4piwalkthrough.aspx

Per chi vuole vedere come funziona l’esempio riportato nel blog, conosce VB.NET e non conosce C#, allego la versione dell’esempio C# da me convertita.

Attenzione perchè per farlo funzionare è necessario avere installata un istanza di SQL Server Express (o SQLServer).

Rilasciato Entity Framework CTP4

Il blog di ADO.NET ha annunciato il rilascio della Feature CTP di Entity Framework 4.
Due le grosse novità introdotte:

  • Incremento della produttività
  • Supporto alla modalità Code First, cioè la gestione di un database senza il file di mapping.

L'elenco completo delle funzionalità è disponibile su http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4announcement.aspx.

Il download della CTP è disponibile all'indirizzo http://www.microsoft.com/downloads/details.aspx?FamilyID=4e094902-aeff-4ee2-a12d-5881d4b0dd3e&displaylang=en

 

Technorati Tags:

mercoledì 14 luglio 2010

DomusDotNet: 2 mesi di vita!!

DomusDotNet compie 2 mesi di vita proprio oggi!!!

Sono onorato di poter far parte di un gruppo di persone che si sono rimboccate le maniche e, nonostante, il lavoro, I problemi familiari e le rotture quotidiane, stanno cercando di fare community con uno spirito costruttivo e propositivo.

Dobbiamo ancora crescere ma le prospettive sono buone e, soprattutto, la voglia di fare si è moltiplicata con il passare del tempo.

Non nego che ci siano problemi, ma ciò che ci spinge è assolutamente positivo e potrà portare a molte soddisfazioni in un prossimo futuro.

Continuate a seguirci numerosi perchè con l’avvento dell’autunno, assieme alla foglie caduche, arriveranno anche delle novità e tante iniziative che stiamo mettendo in cantiere. Winking smile

Venghino, signori, venghino!!! Open-mouthed smile

 

Technorati Tags:

Visual Studio 2010 – Cycle Clipboard Ring

Una funzionalità molto interessante introdotta con Visual Studio 2010 è quella del Cycle Clipboard Ring.
Come si può facilmente capire dal nome si tratta di una funzionalità legata alla clipboard che permette di recuperare, in maniera ciclica, I valori contenuti nella stessa.

Visual Studio 2010 memorizza gli ultimi 20 elementi copiati (CTRL+C o tasto destro copia) che possiamo recuperare utilizzando questa funzione (il cui shortcut è CTRL+SHIFT+X).

Ad ogni pressione dello shortcut, Visual Studio ci propone uno degli elementi memorizzati tra I 20 in maniera ciclica: la prima pressione l’ultimo elemento memorizzato, la seconda il penultimo e così via.

Se non avete il comando nel menù di Visual Studio potete inserirlo nel seguente modo:

1) Premere il tasto destro sulla barra dei menù e selezionare “Customize”

image

2) selezionare la barra dei menù Edit

image

3) Premere Add Command

image

4) Selezionare la categoria “Edit” e il comando “Cycle Clipboard Ring” e premere Ok

image

5) Posizionare il comando all’interno del menù utilizzando I tasti Move Up e Move Down.

In questo modo possiamo richiamare il comando dal menù Edit oltre che con lo shortcut.

martedì 13 luglio 2010

domenica 4 luglio 2010

VB.NET: Scrivere un elemento nei preferiti di IE

Prendendo spunto da un post apparso sul forum Microsoft dedicato a VB.NET, vorrei riportare un piccolo tip che riguarda scrittura di un elemento nei preferiti del browser.

Prima di scrivere il codice che effettivamente si occupa di creare il file .url nella cartella dei preferiti, vediamo quale è il formato di tale file (limitatamente ad IE). Prima di tutto vorrei ringraziare Edward L. Blake ed il suo post da cui ho tratto le informazioni che vi riporto.

Un file .url è un file di testo con il seguente formato base:

[InternetShortcut]
URL=http://www.miosito.com/
WorkingDirectory=C:\WINDOWS\
ShowCommand=7
IconIndex=1
IconFile=C:\WINDOWS\SYSTEM\url.dll
Modified=20F06BA06D07BD014D
HotKey=1601



La sezione [InternetShortcut] definisce le informazioni relative all’url internet ed i valori hanno il seguente significato:


  • URL : contiene l’indirizzo del web site preferito;


  • WorkingDirectory : indica la directory di lavoro relativa al preferito. IE non sembra utilizzare questo valore;


  • ShowCommand : modalità con cui eseguire il preferito. Se non viene messoil campo o è vuoto, il preferito viene visualizzato in modalità normale. Se viene messo il valore 7 viene visualizzato con la finestra massimizzata. Se viene messo il valore 3 con la finestra minimizzata;


  • IconFile : Nome del file contenente l’icona del preferito. Può essere un file ico o, addirittura, un file dll o exe da cui viene ricavata l’icona;


  • IconIndex : Indice dell’icona da utilizzare. Se non inserito viene utilizzata la prima icona del file indicato nel campo precedente;


  • Modified : Campo in cui è indicata la data di modifica. Il valore contenuto in questo campo è ricavato dalla data di modifica con un particolare algoritmo;


  • HotKey: Eventuale tasto di scelta rapida. L’elenco dei valori possibili è contenuto nella seguente tabella:


Hot Key Reference 1hot key reference 2


Nelle tabelle precedenti, le sigle hanno il seguente significato:


  • C+S : CTRL + SHIFT


  • C+A : CTRL + ALT


  • C+S+A : CTRL + SHIFT + ALT



I parametri che possiamo trovare all’interno di un file .url sono altri, ma ci limiteremo, in questo post a quelli base. La funzione che ci permette di salvare un preferito di IE da codice è la seguente:








  1. Public Function AddFavorite(ByVal name As String, _

  2.                             ByVal url As String, _

  3.                             Optional ByVal subFolder As String = Nothing) As Boolean

  4.     Dim folder = Environment.GetFolderPath(Environment.SpecialFolder.Favorites)

  5.     Dim shortcut As New System.Text.StringBuilder

  6.     With shortcut

  7.         .AppendLine("[InternetShortcut]")

  8.         .AppendFormat("URL={0}", url)

  9.     End With

  10.     Dim filename As String

  11.     If String.IsNullOrWhiteSpace(subFolder) Then

  12.         filename = String.Concat(name, ".url")

  13.     Else

  14.         filename = System.IO.Path.Combine(subFolder, String.Concat(name, ".url"))

  15.     End If

  16.     filename = System.IO.Path.Combine(folder, filename)

  17.     Try

  18.         My.Computer.FileSystem.WriteAllText(filename, shortcut.ToString, True)

  19.         Return System.IO.File.Exists(filename)

  20.     Catch ex As Exception

  21.         Return False

  22.     End Try

  23. End Function







Sono stati tralasciati i parametri riguardanti il file di icona, lo showcommand e l’hotkey perchè non sono pienamente supportati.



giovedì 1 luglio 2010

SQL Server CE 4.0 vicino alla meta!!

Non è un vero annuncio in pompa magna ma se lo cita Scott Guthrie  inchino nel suo blog può essere considerato tale.

Prossimamente verrà rilasciato SQL Server CE 4.0 con parecchie migliorie rispetto al suo predecessore.

Per maggiori info ecco il link al post originale:

New Embedded Database Support with ASP.NET - ScottGu's Blog

Technorati Tag: