domenica 9 novembre 2008

Hordit - online storage e non solo

Se come me affogate nel disordine informatico (dov'è quel documento, dove ho scritto il numero di serie?, ah è sul PC del lavoro...) ecco uno strumento online che potrebbe portare ordine:
Hordit è sostanzialmente un desktop online su cui caricare e condividere un po' tutto. Ovviamente non manca l'utilizzo "sociale" degli strumenti, ovvero la possibilità di creare amici e gruppi e di condividere "roba" tra questi.Hordit aiuta anche nella gestione della conoscenza e il lavoro di tutti i giorni con strumenti come le letture quotidiane e il "da leggere".
Hordit è per ora in beta e l'accesso è solo ad inviti. Ho qualche invito, se siete interessati lasciate un commento.

sabato 28 giugno 2008

WPF TreeView

Mi è capitato più volte di leggere su altri Blog della problematica di sapere su quale elemento l'utente ha aperto il menu contestuale. C'è chi sostiene che in questi casi non si può usare il HierarchicalDataTemplate

<TreeViewItem Header="Categories" ItemsSource="{Binding Categories}" >
</TreeViewItem>
In pratica, uno dei miei TreeViewItem è "databindato" ad una gerarchia di categorie.
Da qualche altra parte (tra le risorse dell'applicativo) definisco un
HierarchicalDataTemplate per il tipo "Category":


<HierarchicalDataTemplate DataType="{x:Type my:Category}"
ItemsSource
="{Binding Path=Categories}" >
<TextBlock Text="{Binding Path=Name}" >
<TextBlock.ContextMenu>
<ContextMenu Name="MyMenu">
<MenuItem Header="New Category... "
Click
="NewCategory_Click"
CommandParameter
="{Binding Path=.}"/>
<MenuItem Header="Delete Category"
Click="DeleteItem_Click"
CommandParameter
="{Binding Path=.}"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>

L'elemento ContextMenu specifica un semplice menu contestuale che permette l'aggiunta di una categoria. E la sua cancellazione. Per fare ciò è necessario che al metodo gestore dell'evento arrivi l'oggetto che corrisponde all'elemento dell'albero. Intendo cioè l'oggetto Category su cui è "bindato" il TreeViewItem su cui l'utente ha fatto click col tasto destro del mouse.
Uno stratagemma semplice è usare il CommandParameter con un espressione di binding come Path=.
In questa maniera il CommandParameter prenderà il valore dell'oggetto stesso e sarà inviato all'event handler:
private void DeleteItem_Click(object sender, RoutedEventArgs e)
{
Category cat = (Category)((MenuItem)sender).CommandParameter;
//Cancella la categoria...
}

Ovviamente questo trucco non si può utilizzare nel caso che si abbia effetivamente bisogno di valorizzare CommandParameter con qualcos'altro, ma in molti casi questo non è necessario.

venerdì 20 giugno 2008

Windows Vista SP1 Cleanup Tool

Tra le (varie) cose che odio di Windows Vista (su cui non mancherò di riferire) c'è sicuramente la crescita smisurata dell'occupazione sello spazio disco.
Tra i colpevoli c'è l'odiosa directory WinSxS. Questa cartella speciale serve a mantenere diverse versioni delle varie dll in modo da permettere il funzionamento "side by side" di applicazioni che altrimenti avrebbero problemi di compatibilità. Non è raro vedere questa cartella arrivare ad occupare 7 GB. Purtroppo non è consigliabile avventurarsi a cercare di eliminare il superfluo, essendo che la cartella è gestita dal sistema, in particolare dal simpaticissimo processo TrustedInstaller (quello che ogni tanto si sveglia e decide di occupare il 100% della vostra CPU, per intenderci).
Se poi siete così fortunati di avere 7 GB di spazio libero e decidete di installare la Service Pack 1 di Vista, allora tale cartella potrebbe anche arrivare a 10-11 GB.
Per "fortuna" (vorrei anche vedere...) allegato alla SP1 c'è un tool che si impegna a ripulire la cartella WinSxS dalle versioni delle DLL rese obsolete dalla service pack.
Per lanciarlo basta aprire un prompt dei comandi e digitare:

VSP1CLN.EXE

Eseguendolo, potreste arrivare a liberare anche 2GB.

In sintesi, a chi sostiene ancora che Vista non sia un "grande" sistema operativo: guardate le dimensioni di c:\windows!!!

domenica 8 giugno 2008

Extension Methods (e molto altro) con il Framework 2.0

Conosciamo tutti le aggiunte al recente C# 3.0 presenti nel Framework 3.5. Però non tutti si trovano nella situazione di potere allegramente aggiornare i propri progetti al nuovo framework (dannato Windows 2000).

Ma non tutto è perso, vale comunque la pena di passare a Visual Studio 2008 dato che questi compila anche per .Net 2.0 e che, come mi ha fatto notare un mio collega, molte delle nuove caratteristiche di C# 3.0 non sono altro che zucchero sintattico gestito dal compilatore e non richiedono un runtime diverso da quello usato dal .net framework 2.0.
Quindi la seguente linea è perfettamente valida in .Net 2.0 (con VS 2008):
var o = new List<string> { "One", "Two", "Three" };
Notate la tipizzazione implicita delle variabili locali e l'inizializzazione della collection.
Altro zucchero sintattico è la definizione semplificata delle proprietà:
class Person
{
public string Nome { get; set; }
public string Cognome { get; set; }
}

Un oggetto Person si può quindi creare ed inizializzare con questa sintassi ultra comoda:

var p = new Person { Nome = "Mario", Cognome = "Rossi" };

Viene naturale a questo punto utilizzare una delle caratteristiche più simpatiche di C# 3.0: gli extension methods.
Per chi non lo sapesse, gli extension methods permettono di estendere classi esistenti aggiungendo metodi non definiti all'interno delle stesse. In breve, è zucchero sintattico per nascondere l'utilizzo di un metodo statico definito altrove. Si distinguono da metodi statici "normali" mediante l'utilizzo della keyword this nel primo parametro, che dev'essere del tipo a cui si vuole "aggiungere" il metodo.

Per esempio potremmo voler implementare ciò che manca nella vita di ogni smanettone, ovvero un ToString() che non generi eccezioni se l'oggetto su cui si invoca è nullo:

public static class TextHelpers
{
public static string ToStringSafe(this object ob)
{
if (null != ob) return ob.ToString();
else return string.Empty;
}

}

In breve, la chiamata a
o.ToStringSafe();
è tradotta dal compilatore in:
TextHelpers.ToStringSafe(o);

Trattandosi quindi di un metodo statico, possiamo gestire anche lo sventurato casso di riferimenti nulli.
Ma quando ho provato a compilare il precedente esempio, il compilatore si è burocraticamente rifiutato di fare il suo lavoro lamentandosi della mancanza di un attributo presente nel framework 3.5 (e quindi assente nel 2.0):

error CS1110: Cannot define a new extension method because the compiler required type 'System.Runtime.CompilerServices.ExtensionAttribute' cannot be found. Are you missing a reference to System.Core.dll?

Il problema è questo: il compilatore è in gradi di gestire gli extension methods, non è in grado di decorarne la definizione con l'attributo ExtensionAttribute che è ciò che in fondo lo distingue da un metodo statico qualunque. Possibile che un cavillo legale così stupido ci impedisca di usufruire di una feature così trendy? E se provassimo ad "ingannare" il compilatore? In che modo? Beh, vuole un ExtensionAttribute? Eccolo:

namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}

Basta aggiungere il precedente codice al nostro progetto per accontentare il compilatore e noi possiamo scrivere finalmente:

Console.WriteLine(o.ToStringSafe());

Bello, eh?

Prendiamo ad esempio un altro extension method (simile alle pletore di quelli disponibili nel framework 3.5) che applica una procedura ad ogni elemento di una collection:

public delegate void Func<T>(T t);

public static class CollectionsHelpers
{
public static void Apply<T>(this ICollection<T> col,
Func<T> func)
{
foreach (T item in col)
{
func(item);
}
}
}

Ecco come possiamo utilizzarlo nel framework 2.0 utilizzando Visual Studio 2008:

o.Apply((string x) => { Console.WriteLine(x); });

Ebbene sì, ovunque potremmo usare delegate o metodi anonimi, ora possiamo usare le lambda expression. Anche col framework 2.0!

sabato 7 giugno 2008

Omea Pro è Opensource

Per chi non lo conoscesse, Omea è (stato) uno dei migliori aggregatori di RSS per Windows. In realtà è molto di più:
  • Gestisce e cataloga email, feed RSS, newsgroup, file locali, link
  • Indicizza i contenuti e ne permette la ricerca
  • E' estendibile tramite (numerose) plugin.

Insomma è un vero e proprio gestore di conoscenza personale (PKM). La notizia migliore è che recentemente è stato rilasciato come opensource sotto la licenza GNU GPL v2 ed è quindi disponibile (ovviamente gratis) al seguente repository SVN:

http://svn.jetbrains.org/omeaopen/trunk/Omea/

Per l'occasione, gli sviluppatori della Jetbrains, hanno provveduto a ripulire il codice, riorganizzarlo e aggiornarlo alle più recenti versioni della piattaforma di sviluppo microsoft:
  • Visual Studio 2008
  • .Net framework 3.0
  • MSBuild 3.5
  • WIX 3.0
Sto scaricando il codice sorgente in questo momento, chissà che non trovi il tempo per forgiare questo (già ottimo) software...

martedì 3 giugno 2008

Ancora un altro RSS Reader

Questo però è un po' diverso: Newzie sembra distinguersi soprattutto per la capacità di sottoscriversi a pagine Web (quindi non solo a feed RSS) e ricevere notifiche per ogni cambiamento.

E' anche molto configurabile ed ha una bella grafica.
Sono ancora in cerca di uno strumento PKM (Personal Knowledge Management) completo. Per ora Newzie e Google Notebook suppliscono abbastanza bene.