martedì 31 gennaio 2012
L’applicazione per .NET Gadgeteer che ho realizzato insieme a Micheal Dodaro, .NET Gadgeteer Servo Camera & Windows Phone Client, è stata inserita nel sito ufficiale di .NET Gadgeteer. In questo momento compare direttamente nella Home Page come Featured Project.
Anche queste sono soddisfazioni, e un chiaro stimolo a continuare sulla strada che ho intrapreso.
lunedì 23 gennaio 2012
AutoMapper è una libreria indispensabile in tutti quei casi in cui è necessario mappare un oggetto su un altro. Esempio tipico è quando abbiamo un oggetto che rappresenta un’entità del database e lo vogliamo utilizzare per impostare le proprietà di un nostro oggetto di business. Questa attività, estremamente noiosa e ripetitiva, grazie ad AutoMapper si realizza con una semplice riga di codice.
AutoMapper è un progetto open source disponibile su GitHub. Può anche essere scaricato direttamente tramite NuGet. Su CodeProject, inoltre, si può trovare un articolo che mostra come muovere i primi passi con la libreria.
sabato 21 gennaio 2012
Ho completato il porting della mia libreria per il Text-To-Speech sulla piattaforma .NET Micro Framework. Come sempre, l’ho pubblicata su MSDN Code Gallery, dove è possibile trovare anche gli esempi del suo semplicissimo utilizzo.
La libreria è anche disponibile su NuGet. E’ sufficiente effettuare una ricerca per TranslatorService.Speech. All’interno di questo package si trovano sia la nuova versione per il .NET Micro Framework, sia quella per il “Full”. In base al tipo di progetto, Visual Studio referenzierà la libreria corretta.
martedì 17 gennaio 2012
Una della novità di C# 4.0 è il supporto ai memory-mapped files. Le nuove classi contenute nel namespace System.IO.MemoryMappedFiles consentono di creare file mappati in memoria che possono essere letti e scritti da processi diversi.
Guardiamo ad esempio una Console Application che apre un memory mapped file e scrive un messaggio al suo interno:
1: static void Main(string[] args)
2: {
3: Console.WriteLine("Scrittura di un messaggio su un memory mapped file...");
4:
5: using (var file = MemoryMappedFile.CreateNew("share", 4096))
6: {
7: using (var writer = file.CreateViewStream())
8: {
9: string str = "Hello World!";
10: Console.WriteLine("Invio del messaggio '{0}' in corso...", str);
11: var data = System.Text.Encoding.Default.GetBytes(str);
12: writer.Write(data, 0, data.Length);
13: }
14:
15: Console.WriteLine("Messaggio inviato.\n");
16: Console.Write("Avvia il reader prima di chiudere.");
17: Console.ReadLine();
18: }
19: }
Alla riga 5 creiamo un nuovo memory mapped file con nome share e dimensione 4096 byte. Successivamente, recuperiamo lo stream associato (riga 7) e vi scriviamo un messaggio (riga 12), come se si trattasse di un normale file.
L'applicazione che legge questo file è speculare:
1: static void Main(string[] args)
2: {
3: Console.WriteLine("Lettura di un messaggio da un memory mapped file...");
4:
5: using (var file = MemoryMappedFile.OpenExisting("share"))
6: {
7: using (var reader = file.CreateViewStream())
8: {
9: var bytes = new byte[32768];
10: int read = reader.Read(bytes, 0, bytes.Length);
11:
12: Console.Write("Messaggio ricevuto: ");
13: string str = System.Text.Encoding.UTF8.GetString(bytes, 0, read).Trim('\0');
14: Console.WriteLine(str);
15: Console.WriteLine();
16: }
17: }
18:
19: Console.Write("Premere un tasto per chiudere.");
20: Console.ReadLine();
21: }
La 5° riga apre il memory mapped file di nome share (quindi lo stesso nome creato nell'altro processo) e ne recupera lo stream associato (riga 7), su cui poi viene effettuata una lettura, alla riga 10.
Come si vede, il tutto è molto semplice ed è coerente con quanto siamo già abituati a fare con tutti gli altri Stream di .NET.
Per approfondire l'argomento, rimando direttamente alla documentazione di MSDN.
Tag di Technorati:
.NET,
Programming,
C#
sabato 14 gennaio 2012
Pochi minuti fa ho caricato su MSDN Code Gallery la nuova versione della mia libreria per il Text-To-Speech basato sul servizio Microsoft Translator Service.
La novità più significativa è l’aggiunta delle versioni asincrone dei metodi. Ad esempio, la controparte asincrona di GetSpeakStream è il nuovo metodo GetSpeakStreamAsync, che ritorna immediatamente e, una volta recuperato lo stream contenente il parlato, genera l’evento GetSpeakStreamCompleted. Ci sono poi i metodi Speak e SpeakAsync, che si occupano di ottenere lo stream tramite il servizio Microsoft e di riprodurlo automaticamente, semplificando quindi l’utilizzo della libreria:
// Per ottenere un Application ID, visita la pagina http://msdn.microsoft.com/en-us/library/ff512420.aspx
SpeechSynthesizer speech = new SpeechSynthesizer(APP_ID);
speech.SpeakCompleted += new EventHandler<SpeechEventArgs>(speech_SpeakCompleted);
string text = "Ti auguro una buona giornata!";
string language = "it";
speech.SpeakAsync(text, language); // Questo metodo ritorna immeditamente
private static void speech_SpeakCompleted(object sender, SpeechEventArgs e)
{
Console.WriteLine("Operation completed.");
}
Ma c’è dell’altro: ho pubblicato la mia libreria anche su NuGet, dove è disponibile con il nome di Text-To-Speech Library:

Questa è la mia prima pubblicazione. Al momento la libreria è disponibile solo per .NET 4.0, ma nei prossimi giorni realizzerò il porting per Silverlight e .NET Micro Framework.
Per maggiori informazioni, potete fare riferimento alla pagina del progetto su MSDN Code Gallery.
martedì 10 gennaio 2012
Ho pubblicato su MSDN Code Gallery un servizio WCF REST che permette di inviare e scaricare file da un server remoto. L'esempio include anche una piccola applicazione WPF, senza fronzoli o pattern particolari, che mostra l'utilizzo di tale servizio da parte di un client.
Attualmente, il servizio e l'applicazione sono disponibili unicamente in C#, ma a breve aggiungerò anche la versione VB .NET del codice.
domenica 8 gennaio 2012
Da pochi giorni è stata rilasciata la nuova versione dell’SDK di .NET Gadgeteer fornito da GHI Electronics. E’ compatibile con le schede FEZ Spider e Hydra e include anche il supporto ai moduli realizzati da Seeed Studios.
Può essere scaricato dal sito TinyCLR.
Seguendo le numerose richieste ricevete via mail, ho aggiornato il mio esempio di Text-To-Speech tramite il servizio Microsoft Translator, Speech Synthesis with Microsoft Translator service, aggiungendo anche la versione Visual Basic della libreria.
Come sempre, è possibile scaricarla dall'indirizzo http://code.msdn.microsoft.com/Speech-Synthesis-with-7658fa03.
sabato 7 gennaio 2012
Quest'oggi ho cercato di fare una cosa all'apparenza banale: creare una finestra di WPF senza l'icona sulla sinistra (ovvero lo stesso risultato che si ottiene impostando la proprietà ShowIcon di una Windows Form su false).
Ebbene, NON è possibile: WPF non espone una proprietà che permette di nascondere tale icona. Per ottenere il risultato voluto, l'unica soluzione è ricorrere alle funzioni dell'API di Windows, come descritto nel post A WPF Window Without a Window Icon (the thing you click to get the system menu).
In sintesi, si deve eseguire l'override del metodo OnSourceInitialized ed utilizzare il Platform Invoke per modificare lo stile della finestra.
Tag di Technorati:
.NET,
Programming,
C#,
WPF
martedì 3 gennaio 2012
Quest'oggi avevo la necessità di convertire un orario in formato UTC, prelevato da un database, nell'orario locale. Il tipo DateTime mette a disposizione un metodo, ToLocalTime, che sembra perfetto per questo scopo. Tuttavia, il suo utilizzo "diretto" non porta il risultato sperato.
Il motivo è semplice: se leggo un campo datetime da un database e lo salvo in una variabile DateTime, .NET suppone che tale orario sia espresso nel formato locale, quindi se su tale variabile invoco il metodo ToLocalTime, ottengo di nuovo l'orario originale.
Per ottenere il risultato voluto, è necessario utilizzare un'istruzione come la seguente:
var localDatetime = new DateTime(utcDateTimeFromDB.Ticks, DateTimeKind.Utc).ToLocalTime();
Con essa, creiamo un nuovo oggetto DateTime, ma, tramite il parametro DateTimeKind.Utc, indichiamo che l'orario è in formato UTC. Così facendo, il metodo ToLocalTime è in grado di applicare il fuso orario e l'eventuale ora legale, per ottenere l'orario locale corretto.