lunedì 29 gennaio 2007
Hamachi is a program that allows you to arrange multiple computers into their own secure network just as if they were connected by a physical network cable... Hamachi gives you LAN over the Internet. Virtually any application that works over local/home networks can also be used over Hamachi networks. Think - Windows File Sharing, iTunes, Remote Desktop, Remote Assistance or even gaming - all fully encrypted, authenticated and peer-to-peer.
Hamachi installa una scheda di rete virtuale che consente di collegare tra loro i computer connessi ad Internet, facendo in modo che possano comunicare come se facessero parte della medesima LAN.
Il programma è disponibile per Windows (al momento sono supporte le versioni 2000, XP e 2003), Linux e OS X.
Per esigenze di lavoro ho dovuto approfondire l'utilizzo di Assembly .NET all'interno di database realizzati con SQL Server 2005. Dopo una breve ricerca, ho acquistato il libro Pro SQL Server 2005 Assemblies. Il volume, poco più di 250 pagine divise in 11 capitoli, affronta tutti gli aspetti legati alla realizzazione di Assembly .NET per SQL Server 2005, dalla fase di creazione a quella di deploy.
Fin dalle prime pagine l'accento è posto sul fatto che, sebbene sia possibile utilizzare codice .NET all'interno del DBMS, è opportuno non abusare di questa funzionalità: just because .NET assemblies are available as an alternative to T-SQL for
processing and validation logic, this does not mean that all (or even most) development will now take place inside a .NET assembly running in the database. T-SQL is still very much a valid method for solving database problems, and where the processing is set-based, T-SQL is by far the most effective solution... [CUT]... if you already have a stored procedure or
trigger working perfectly well in T-SQL, you need to think very hard about moving it to .NET. The advent of .NET programming within the database is certainly no reason to stop improving and refining your T-SQL knowledge.
I capitoli possono essere divisi in gruppi. I primi 3 forniscono un'introduzione all'argomento, mostrando i concetti principali che saranno approfonditi nel seguito. Fin dall'inizio, le spiegazioni sono accompagnate da esempi pratici. Un aspetto molto importante è che il libro illustra tutti i passaggi necessari per creare e utilizzare Assembly .NET con SQL Server 2005 anche se non si dispone di Visual Studio: in questo modo, gli esempi posso essere seguiti anche da chi dispone delle versioni Express di VS, che non supportano la creazione di progetti per SQL Server.
I capitoli 4-8 spiegano come creare ciascuno degli oggetti .NET supportati dal SQL Server, ovvero Stored procedure (capitolo 4), User-Defined function (capitolo 5), User-Defined types (capitolo 6), User-Defined aggregates (capitolo 7) e Trigger (capitolo 8). Anche questi capitoli sono ricchi di esempi, di cui alcuni molto interessanti, come la stored procedure che crea automaticamente un feed RSS a partire dal contenuto di un database e quella per salvare e recupare immagini all'interno di una tabella. Inoltre, segnalo la completezza degli esempi relativi alla creazione di una funzione utente che restituisce una tabella: personalmente questo per me è sempre stato uno degli argomenti più ostici, ma seguendo passo-passo il libro sono riuscito a sviscerarlo in poco tempo...
Passando all'ultimo gruppo di capitoli, il numero 9 si occupa della gestione degli errori e delle strategie di debug. Il libro spiega come eseguire il debug da Visual Studio oppure utilizzando la riga di comando. La teoria, inoltre, va sempre di pari passo con la pratica: in particolare, viene illustrato come definire stored procedure che scrivono il risultato dell'operazione nel registro di sistema e, in caso di eccezioni, inviano una mail di notifica al DBA. Il capitolo successivo, secondo me uno dei più importanti, è dedicato alla sicurezza. Viene spiegato con dovizia di particolari come utilizzare le funzionalità di sicurezza basate su ruoli e il sistema dei permessi per l'esecuzione di specifiche porzioni di codice. Gli esempi forniti mostrano come creare permessi per accedere a file su disco e a risorse di rete via HTTP. Infine, l'ultimo capitolo parla dell'integrazione degli Assembly per SQL Server con sistemi esterni, in particolare Web service e il Service Broker, il sistema di comunicazione basato su messaggi che è integrato nel DBMS.
In conclusione, Pro SQL Server 2005 Assemblies è un libro molto interessante, in cui gli argomenti sono affrontati con il giusto livello di dettaglio, ed è ricco di esempi che consentono di prendere immediatamente dimestichezza con la tematica trattata. Per quanto mi riguarda, vale tutti i 50$ del suo prezzo. Lo consiglio a chiunque sia interessato ad approfondire l'argomento.
Mi sento chiamato in causa... Alessio non ha fatto nomi, ma credo che si stesse riferendo a me... E in effetti basta guardare il numero di post sul mio blog, per vedere l'impennata degli ultimi due mesi... Vorrei provare a spiegare perché è successo, per far capire che neanch'io bloggo per Community Credit.
I post sul mio blog ultimamente sono così aumentati perché in questo periodo, dopo la laurea che ho preso il 15 dicembre, ho molto più tempo libero, e mi piace spenderlo condividendo con gli altri la mia passione per l'informatica. In questo momento, infatti, ho la fortuna di lavorare su un progetto che non mi porta via molto tempo (anche perché i professori con cui devo collaborare sono fuori sede da un paio di settimane
), quindi posso dedicarmi ad approfondire le tematiche che più mi piacciono. Se su questo blog c'è qualcuno che proviene da Visual Basic, si ricorderà sicuramente che io sono sempre stato una persona molto attiva... Prima sul newsgroup it.comp.lang.visual-basic, dove facevo anche qualche decina di post al giorno, poi con il mio sito Internet, L'angolo del programmatore VB, che ho dovuto abbandonare proprio per gli impegni universitari. Adesso che gli i miei impegni sono diminuiti, sto cercando di ripropormi, ed ho scelto la strada del blog perché mi sembrava uno dei sistemi più rapidi ed efficaci per far sentire la mia voce. A conferma di questo, posso far notare che ho aperto il mio blog nel Giugno 2006, il giorno dopo aver dato il mio ultimo esame universitario...
In conclusione, i miei post sono aumentati a partire dal mese di dicembre non perché mi sono iscritto a Community Credit, ma perché, non dovendo più studiare per gli esami e per la laurea, ho più tempo da dedicare ai miei hobby...
Tutti sappiamo che la documentazione delle classi è una delle attività più noiose... Per fortuna GhostDoc consente di velocizzare enormemente questo lavoro. Si tratta di un add-in freeware per Visual Studio che aggiunge il comando Document this al menu contestuale delle finestre dell'editor: facendo clic su di esso, viene generato automaticamente lo stub della documentazione per il metodo, la proprietà, ..., su cui si è fatto clic. Lo schema prodotto comprende il campo summary e le eventuali entry di tipo param e returns, già precompilate, nel caso in cui il metodo prenda dei parametri in ingresso e restituisca un valore.
Ma GhostDoc fa molto più di questo: esso, infatti, è in grado di inferire la descrizione del metodo, nel caso in cui il suo nome rispetti un certo formato. Ad esempio, il metodo
public string GetUserName(int userID)
Viene automaticamente commentato nel modo seguente:
/// <summary>
/// Gets the name of the user.
/// </summary>
/// <param name="userID">The user ID.</param>
/// <returns></returns>
public string GetUserName(int userID)
Certo, questo sistema non è infallibile, ma spesso riesce a generare buoni commenti. Inoltre, utilizzando il comando GhostDoc che viene aggiunto al menu Tools di Visual Studio, è possibile configurare tutti le impostazioni e le regole su cui il programma si basa per creare i commenti.
La potenzialità di GhostDoc non si fermano qui: esso comprende anche lo schema completo della documentazione per i metodi "standard" del .NET, come ad esempio Dispose: in questo caso, facendo clic destro su di esso e selezionando Document this, viene inserito un commento completo di tutte le sue parti, che quindi non richiede ulteriori modifiche. Inoltre, se si creano metodi override, qualora sia disponibile viene automaticamente inserita la documentazione del metodo che si sta ridefinendo. Un'altra caratteristica interessante è che, se si aggiunge un commento con Document this, quindi lo si modifica, eseguendo una seconda volta il comando Document this il testo inserito non viene perso, anzi, se necessario, viene riformattato ed indentato correttamente.
Sul sito dell'autore sono disponibili sia la versione per Visual Studio 2003 sia quella per Visual Studio 2005. Quest'ultima supporta anche Visual Basic .NET (seppure in modo definito sperimentale). Nella sezione delle news della stessa pagina è riportato un avviso secondo cui l'installazione di GhostDoc ha alcuni problemi con Windows Vista. Io l'ho installato su due diversi PC (uno con Vista Business, l'altro con Vista Ultimate) e non ho riscontrato inconvenienti. Ad ogni modo, in caso di necessità è possibile fare riferimento a questo post.
Nel complesso, si tratta di un buon prodotto, tanto che fa parte dei 10 Must-Have Add-Ins suggeriti da Microsoft. C'è però una mancanza abbastanza evidente: il comando Document this non è disponibile per le classi, gli eventi, i delegate e gli elementi di una enumerazione. Non so per quale motivo ci sia questa limitazione, dal momento che il sistema di generazione dei commenti dovrebbe essere uguale a quello che viene applicato per i metodi e le proprietà.
Qualche mese fa avevo parlato dell'add-in per Visual Studio 2005 che consente di avviare Esplora risorse facendolo puntare direttamente alla cartella che contiene la soluzione o il progetto selezionato. In realtà una funzionalità simile è disponibile anche in Visual Studio: dopo aver aperto il file di un progetto, facendo clic destro sul tab corrispondente, tra i comandi visualizzati c'è anche Open Containing Folder:

A partire da Windows 95, tutti i programmi installati hanno la possibilità di aggiungere una voce al comando Nuovo del menu contestuale per creare rapidamente file nel loro formato. Con l'aumentare dei programmi installati, aumenta anche la lunghezza di questo menu, che perde così la sua funzionalià...
Per Windows XP e 2003 è disponibile il programma Tweak UI di Microsoft, appartenente alla famiglia dei PowerToys, che consente di specificare quali voci includere in questo menu. Tale software non è compatibile con Windows Vista. Tuttavia, per eliminare i template non desiderati, è sufficiente una piccola modifica al Registro di configurazione (dunque l'oprazione richiede i diritti di amministratore). Bisogna cercare l'estensione corrispondente al template all'interno di HKEY_CLASSES_ROOT, quindi espandere il sottoalbero ed eliminare o rinominare la chiave ShellNew.
Durante l'utilizzo di Visual Studio, è normale aprire numerose finestre, per visualizzare il codice sorgente, il designer, per accedere a TFS, ecc. Per chiuderle tutte velocemente, quando l'area di lavoro diventa troppo "affollata", può essere comodo aggiungere il comando Close All Documents alla barra degli strumenti:
In questo modo, un semplice clic e ritorna l'ordine 
Il .NET Compact Framework non offre un supporto nativo per la lettura/scrittura del file app.config, rendendo necessario l'utlizzo esplicito dell'oggetto XmlDocument per lavorare con esso. La seguente classe si prende carico di svolgere in automatico le operazioni necessarie:
using System;
using System.Xml;
using System.Windows.Forms;
using System.Configuration;
using System.IO;
using System.Reflection;
namespace System.Configuration
{
public class ConfigurationSettings
{
private static string configFileName;
private const string DEFAULT_SECTION = "appSettings";
static ConfigurationSettings()
{
string AppPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
string EXEName = Assembly.GetExecutingAssembly().GetName().Name;
configFileName = Path.Combine(AppPath, EXEName) + ".exe.config";
}
public static string Get(string Key)
{
return Get(Key, DEFAULT_SECTION);
}
public static string Get(string Key, string Section)
{
string str = string.Empty;
XmlDocument doc = new XmlDocument();
doc.Load(configFileName);
string nodeKey = "//" + Section + "/add[@key='" + Key + "']/@value";
if (doc.DocumentElement.SelectSingleNode(nodeKey) != null)
str = doc.DocumentElement.SelectSingleNode(nodeKey).Value;
return str;
}
public static void Set(string Key, string Value)
{
Set(Key, DEFAULT_SECTION, Value);
}
public static void Set(string Key, string Section, string Value)
{
XmlDocument doc = new XmlDocument();
doc.Load(configFileName);
string nodeKey = "//" + Section + "/add[@key='" + Key + "']/@value";
if (doc.DocumentElement.SelectSingleNode(nodeKey) != null)
{
doc.DocumentElement.SelectSingleNode(nodeKey).Value = Value;
}
else
{
XmlElement add = doc.CreateElement("add");
XmlAttribute attrkey = doc.CreateAttribute("key");
attrkey.Value = Key;
XmlAttribute val = doc.CreateAttribute("value");
val.Value = Value;
add.Attributes.Append(attrkey);
add.Attributes.Append(val);
doc.DocumentElement.SelectSingleNode("//" + Section).AppendChild(add);
}
doc.Save(configFileName);
}
}
}
Questo codice consente di gestire file di configurazione con il seguente formato:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="SettingName" value="SettingValue" />
</appSettings>
</configuration>
L'utilizzo è immediato:
//Legge un valore.
string value = ConfigurationSettings.Get("SettingName");
//Scrive un valore.
ConfigurationSettings.Set("SettingName", "NewValue");
E' stata finalmente rilasciata anche in italiano la versione 8 di Adobe Reader. Il file del download occupa circa 21 MB, una dimensione secondo me eccessiva... Specie se paragonato a Foxit Reader, il cui pacchetto di installazione è più piccolo di 2 MB!
Terminato il download, la procedura di setup propone di installare il programma nella cartella C:\Program Files\Adobe\Reader 8.0, quindi non si accorge dell'esistenza di una versione precedente, che va perciò eliminata manualmente.
Al primo avvio viene visualizzato Oltre Adobe Reader, una sorta di tutorial che illustra le nuove funzionalità del prodotto. L'interfaccia del programma ha subito qualche ritocco ed è stata semplificata, ma rimane sostanzialmente la stessa della versione precedente.
Il principale difetto di Adobe Reader, invece, è sempre lo stesso: la pesantezza del programma. Adesso addirittura all'avvio vengono eseguiti DUE programmi: Adobe Reader Synchronizer e, come avveniva nelle vecchia versioni, Adobe Acrobat SpeedLauncher, che ha lo scopo di velocizzare la successiva apertura di file PDF. Ho subito provveduto a disabilitarlo e, onestamente, non mi sembra che senza di esso il caricamento sia tanto più lento...
In conclusione, Adobe Reader fa il suo dovere, ovvero visualizzare file PDF, ma secondo me potrebbe farlo in modo di gran lunga migliore... Ad esempio, potrebbe non eseguire quei programmi all'avvio del sistema, o perlomeno potrebbe prima chiedere conferma all'utente. E poi, potrebbe avere un'occupazione minore: la sola cartella Reader occupa 74 MB! Mi viene spontaneo paragonare questo valore ai 2 MB di Foxit Reader...
Non è un errore di ortografia... Nella CTP di Gennaio di Orcas è inclusa la prima release pubblica del .NET Compact Framework 3.5:
This release of NETCF does not include the complete list of features but is a step toward the final feature set. New builds of NETCF will be included in each new public drop of Orcas with the majority of features being included by Orcas Beta1.
Le principali novità di questa release, rispetto al .NET Compact Framework 2.0 SP1, sono le seguenti:
- System.IO.Compression support, including support for HTTP compression.
- Support for a subset of Linq’s Standard Query Operators.
- SoundPlayer support using WaveOut allowing for multiple sounds to play at once.
- New API in Microsoft.WindowsCE.Forms for easily distinguishing Smartphone and Pocket PC.
- Allow Nested FuncEval's.
- Enhanced logging for interop functionality with native code.
- Stack Trace Enhancements.
- GAC Improvements.
- Allow for StrongName keys greater than 1024 long.
- To improved logging of finalizer activities to enhance product supportability.
- Allow log files to be read at runtime.
Maggiori informazioni sono disponibili sul blog del .NET Compact Framework Team.
Il .NET Compact Framework non contiene l'oggetto BinaryFormatter. Se si ha la necessità di serializzare un oggetto in formato binario, ci viene in aiuto il CompactFormatter:
The CompactFormatter is a generic formatter for the .NET Compact Framework. It is fully realized in .NET managed code and this means that it is able to work on every device able to support the .NET Compact Framework or every other standard-compliant CLI implementation... The interface that the CompactFormatter class expose to the user is very similar to the BinaryFormatter ( or SOAPFormatter ) one and so using it ( or, to some extents, porting applications from .NET to it ) should be very simple for people who knows how to use standard .NET Full Formatters.
Il download comprende una class library compilata con il .NET Compact Framework 1.0, la versione per Mono e il codice sorgente sotto forma di progetto per Visual Studio 2005.
Nelle mie applicazioni mi capita spesso di serializzare gli oggetti in formato binario per salvarli su disco, per inviarli sulla rete, ecc... Mi sono così definito una semplice classe helper per velocizzare questo procedimento:
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace SerializationHelper
{
public static class Serializator
{
public static void Serialize(object obj, Stream serializationStream)
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(serializationStream, obj);
}
catch (SerializationException ex)
{
throw new SerializationException(ex.Message + Environment.NewLine +
"To make a class serializable, add the 'Serializable' attribute before the declaration of the class.",
ex.InnerException);
}
}
public static void Serialize(object obj, string path)
{
using(Stream fileStream = File.Open(path, FileMode.Create))
Serialize(obj, fileStream);
}
public static object Deserialize(Stream serializationStream)
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(serializationStream);
}
catch (SerializationException ex)
{
throw new SerializationException(ex.Message + Environment.NewLine +
"To make a class serializable, add the 'Serializable' attribute before the declaration of the class.",
ex.InnerException);
}
}
public static object Deserialize(string path)
{
using(Stream fileStream = File.Open(path, FileMode.Open))
return Deserialize(fileStream);
}
}
}
Non è niente di eccezionale, ma avere questo codice sempre a disposizione quando serve è molto comodo
.
Chi utilizza FireFox dice di non poterne più fare a meno: se anche voi volete aggiungere le mouse gestures alle vostre applicazioni .NET, date un'occhiata a questo articolo. Il codice sorgente è disponibile sia per C# sia per Visual Basic .NET.
Ormai siamo tutti abituati a programmi che in realtà sono suite di applicazioni... Per fare un esempio su tutti, Nero 7 Reloaded comprende ben 19 applicazioni: Nero Home, Nero Mobile, Nero Scout, Nero StartSmart, Nero Burning ROM 7, Nero Express 7, Nero WaveEditor 3, Nero SoundTrax 2, Nero Vision 4, Nero ShowTime 3, Nero Recode 2, Nero MediaHome, Nero PhotoSnap, Nero CoverDesigner, Nero Toolkit, Nero BackItUp 2, InCD 5, Nero SoundBox e Nero ImageDrive
.
Di fronte a pacchetti di questa mole, mi viene spontanea una domanda: ma l'utente medio sa quello che installa sul suo PC? La maggior parte delle persone, infatti, quando deve installare un programma (ho preso Nero solo come esempio), spesso opta per l'installazione completa o al massimo quella tipica, trovandosi nel sistema una serie di programmi che probabilmente non utilizzerà mai. Se il problema fosse solo questo, di per sé non sarebbe eccessivamente grave (ormai lo spazio su disco è sovrabbondante). Il problema vero si ha quando i programmi installano moduli che vengono eseguiti all'avvio, quindi rallentano la fase di caricamento e, rimanenendo costantemente in esecuzione, appesantiscono il sistema. Anche se tali programmi hanno il diritto di essere eseguiti all'avvio e rimanere in esecuzione, quello che secondo me non va è che lo facciano all'insaputa dell'utente, il quale, dopo aver installato un nuovo software, si ritrova con il computer improvvisamente più lento e non riesce a capirne il motivo...
Come ho già avuto modo di dire in questo blog, negli ultimi tempi mi sto occupando di riconoscimento vocale utilizzando il .NET Framework 3.0. Certo che vedere questo video:
non mi dà proprio una ventata di ottimismo
... Per foruna questa prova si basa su una beta di Windows Vista; il motore di Automatic Speech Recogniton integrato nella versione definitiva del sistema operativo è migliorato un pochetto
Anche per PocketPC esistono programmi che consentono di registrare quello che compare sul display, ad esempio per realizzare demo di applicazioni. In particolare, uno dei più semplici da utilizzare è VH PocketPC Capture. Questo programma è composto da un'applicazione che deve essere caricata sul PocketPC di cui si vuole catturare lo schermo e un filtro che si installa sul desktop ed aggiunge al sistema una scheda di cattura virtuale: grazie ad essa è possibile registrare ciò che appare sullo schermo utilizzando programmi come VirtualDub oppure l'applicazione di esempio disponibile nel pacchetto del download:
Perché il sistema funzioni, il palmare e il desktop devono essere collegati tramite ActiveSync. Il prodotto attualmente è in versione 0.91 beta e supporta sia PocketPC sia Smartphone con sistema operativo Windows Mobile 5.0. In entrambi i casi, l'applicazione da caricare sul dispositivo palmare occupa meno di 150 KB; attraverso la connessione con ActiveSync, il filmato viene salvato direttamente sul computer desktop, quindi il palmare non ha bisogno di memoria aggiuntiva per la registrazione. E' gratutito per l'utilizzo personale. Per maggiori informazioni e per procedere con il download, fare clic qui.
Quando si lavora con il multithreading, una delle prime cose da valutare è la possibilità di utilizzo della classe ThreadPool. Su MSDN Magazine sono disponibili due articoli che spiegano come estendere questo oggetto per aggiungere alcune funzionalità secondo me molto importanti: attendere la terminazione di un pool di thread (ThreadPoolWait) ed annullare l'esecuzione di uno specifico thread inserito nella coda di esecuzione (AbortableThreadPool). Entrambi questi articoli sono accompagni dal codice sorgente in linguaggio C#.
Il firewall integrato in Windows Vista ha compiuto un netto passo avanti rispetto a quello presente in XP. Esso finalmente può bloccare anche le connessioni non autorizzate in uscita. Inoltre non è per nulla invasivo, soprattutto se paragonato a prodotti come ZoneAlarm: quest'ultimo, specie durante la fase iniziale di utilizzo, visualizza un gran numero di richieste di accesso alla rete da parte dei programmi installati, scoragggiando l'utente meno esperto... Spesso ho sentito dire dai miei amici: ZoneAlarm sarà potente quanto vuoi, ma ogni 30 secondi mi chiede se il programma XXX può collegarsi ad Internet... Alla fine l'ho disinstallato perché mi dava fastidio.
Per mantenere questa facilità d'uso, Microsoft ha dotato Windows Firewall di due interfacce di gestione. La prima, quella accessibile facendo doppio clic sull'icona Windows Firewall all'interno del Pannello di controllo, è lo strumento di configurazione di base, che sostanzialmente ricalca quello già presente in Windows XP, e consente di attivare/disattivare il firewall e specificare quali programmi e quali porte possono essere utilizzati per comunicare in rete. Per avere un controllo completo sul firewall, invece, è necessario eseguire il programma Windows Firewall con protezione avanzata (il modo più veloce per trovarlo è usare la funzione di ricerca del menu Start). Esso mostra le regole per le connessioni in entrata e in uscita di tutti i programmi configurati, e per ognuno consente di specificare i protocolli di rete e le porte consentite, quali utenti hanno la possibilità di accedere alla rete utilizzando tale applicazione, e molto altro ancora. Si tratta, in sostanza, delle stesse funzionalità che sono presenti nei firewall commerciali.
In conclusione, mentre con Windows XP l'utilizzo di un firewall di terze parti era quasi d'obbligo, il firewall di Windows Vista svolge egregiamente il suo compito, riducendo, se non eliminando, la necessità di installare un prodotto aggiuntivo.