2006-05-31T14:11:00+01:00
Abbiate
pazienza, non è mia abitudine lamentarmi, ma
stavolta lo sbottare ci sta davvero tutto. Ma prima del fatto è bene che vi racconti
l'antefatto. Stasera, io e il collega Andrea Dottor ci siamo scontrati con un
comportamento apparentemente inspiegabile. Un pezzo di codice apparentemente
perfetto falliva miseramente e inspiegabilmente. In buona sostanza quello che
stavamo facendo era tutto sommato semplice; Un campo di tipo Textbox riceveva
una stringa in che rappresentava una valuta, per la precisione "0,5" in seguito
tale stringa arrivava al validatore serverside che utilizzando
decimal.TryParse() verificava che si trattasse effettivamente di un decimal.
Questo controllo, applicato sia con la CultureInfo che senza veniva eseguito
perfettamente restituendo un chiaro e lampante "true". Tuttavia, pochi
millisecondi dopo, quando la datasource tentava di mappare i campi su un oggetto
di business, l'operazione miseramente scoppiava, con il seguente errore: "0,5"
is not a valid value for Decimal.
Alla fine, solo analizzanto il codice del
framework linea per linea con Reflector siamo giunti a capire il motivo per cui
questa banale operazione scoppiava:
private static object ConvertType(object value, Type type, string paramName)
{
string text1 = value as string;
if (text1 != null)
{
TypeConverter converter1 = TypeDescriptor.GetConverter(type);
if (converter1 == null)
{
return value;
}
try
{
value = converter1.ConvertFromInvariantString(text1);
}
catch (NotSupportedException)
{
throw new InvalidOperationException(
SR.GetString("ObjectDataSourceView_CannotConvertType",
new object[] { paramName, typeof(string).FullName, type.FullName }));
}
catch (FormatException)
{
throw new InvalidOperationException(
SR.GetString("ObjectDataSourceView_CannotConvertType",
new object[] { paramName, typeof(string).FullName, type.FullName }));
}
}
return value;
}
Questo codice, estratto dalla classe ObjectDataSourceView è la
causa del misfatto e precisamente la riga che chiama il metodo
ConvertFromInvariantString() del TypeConverter. La ObjectDataSourceView, per
inciso, è l'oggetto che all'interno della ObjectDataSource si incarica di
effettuare le operazioni incapsulando al suo interno una rappresentazine dello
storage. La chiamata a ConvertFromInvariantString() scritta in questo modo
impone che un dato decimal, ma con tutta probabilità anche una data o un double,
debba essere formattato con cultura neutra, e cioè nel nostro caso con il punto
al posto della virgola. Una chiamata corretta sarebbe stata la
seguente:
value = converter1.ConvertFromString(null, CultureInfo.CurrentCulture, text);
In questo modo la datasource avrebbe tenuto conto della cultura
corrente e quindi si sarebbe adeguata al contesto del thread,
consentendo alla conversione di avvenire correttamente. Ora, purtroppo i
metodi in questione sono privati e perciò non è possibile porre rimedio a questo
problema cercando di sostituire la ObjectDataSourceView con un oggetto che sia
stato patchato. In realtà credo di avere un'idea per una soluzione, che però
tenterò domattina, ma lasciatemi dire che un errore del genere non me lo sarei
mai aspettato.
powered by IMHO 1.3
2006-05-30T16:49:00+01:00
L'uso di WebControls di tipo Template può dare al nostro codice
una flessibilità molto marcata. In questo articolo, cogliendol'occasione di
aggiungere una nuova feature alla GridView, si esplora con dovizia di
particolari il meccanismo di funzionamento dei Template. Ora è tardi e me ne
vado a dormire... (2:49)
Link: http://www.xedotnet.org/blogs/articoli/archive/2006/05/30/gridview_header.aspx
powered by IMHO 1.3
2006-05-30T11:58:00+01:00
Beh, alla fine ci sono riuscito e dopo una giornata densa di
attività, partendo da una macchina pulita pulita ho installato nell'ordine
Windows 2003, patch varie, Sql Server 2005, altre patch, Sharepoint services, e
infine l'agognato Team Foundation Server. Ora tocca configurarlo, ma lasciatemi
dire una cosa: bella li, mica la si poteva fare un po' più
semplice?
Ora, dopo questo sfogo permettetemi un consiglio. Se intendete
ripetere l'epica impresa, prendetevi la guida di installazione, e seguitela
passo passo, nel preciso ordine, senza trascurare nemmeno una virgola. Non
azzardatevi ad improvvisare nulla, e allenatevi prima su una virtual machine se
ne avete la possibilità. E' l'unica speranza che tutto fili liscio e che alla
fine, il setup vi saluti con un bonario: "che culo, ti è andata bene!" 
Scherzi a parte, prima che qualcuno mi salti alla gola per
tentato sacrilegio mi affretterò a dirvi che tutto sommato sono stato
favorevolmente impressionato da quello che ho trovato non appena ho aperto il
team explorer. A parte il fatto che, qualora non abbiate installato Visual
Studio 2005 il setup provvede ad installarne una versione light giusto per
potervi mostrare il team explorer, a prima vista l'ambiente è appare veramente
semplice e familiare. Voci di menu chiare, una struttura intuitiva e delle
schermate davvero semplici ed autoesplicative. Il passo successivo è stato
quello di installare il Team Explorer sul mio pc client, e vederlo integrato
perfettamente all'interno del mio amato IDE. Le difficoltà si sono presentate
quando è venuto il momento di collegarsi al server, semplicemente perchè, quando
ho completato l'installazione mi sono illuso di poter chiudere la documentazione
e potermela cavare da solo. Invece c'è voluto un po' a capire che TFS usa dei
gruppi di sicurezza interni uno dei quali, quello dei licensed users, è quello
che consente l'accesso agli utenti al sistema. Coloro che non fanno parte di
questo gruppo non possono accedere a TFS e, per inciso, se come me avete la
Workgroup Edition dentro questo gruppo non potrete metterci più di 5 utenti,
ottenendo così a tutti gli effetti una limitazione nell'uso del server. Dato che
la propria identità all'interno di un progetto è a dir poco vitale è evidente
che non sarà proprio possibile aggirare in alcun modo il limite.
Per concludere, permettetemi di lasciarvi con un ulteriore
consiglio. Lo so che quello che dirò apparirà del tutto ovvio ma credetemi,
quando questa cosa mi è successa non era esattamente lampante. Nel gruppo degli
utenti con licenza è presente anche l'utente con cui effettuate il setup. Quello
che nella documentazione vi viene consigliato di chiamare TFSSETUP e al quale
dovrete dare i diritti di amministratore. Ovviamente se il vostro team è
composto da esattamente cinque persone vorrete come me garantire l'accesso ai
loro utenti di rete, e come me probabilmente vorrete rimuovere l'utente di
installazione dal gruppo in questione. Vi dirò, quando ho fatto questo ho
sentito per un attimo quel sottile brivido che bene o male tutti conoscete e che
viene quando si ha la netta impressione di averla combinata grossa. L'effetto
immediato, quando premente OK è quello di essere disconnessi istantaneamente,
senza nemmeno darvi la possibilità di tornare sui vostri passi. Ed è proprio la
che il brivido acquisirà la consistenza di una terribile certezza. Soprattutto
se, prima di compiere l'incauta azione vi sarete dimenticati di concedere al
vostro utente di rete i diritti di amministratore su tfs. Ascoltatemi, io ve
l'avevo detto di allenarvi su una virtual machine... non prendetevela con me, ma
dopo questa furbata vi sarete persi il controllo del server...
aaarrrggghhh!!!!!
powered by IMHO 1.3
2006-05-30T00:19:00+01:00
Questo è proprio divertente:
http://inkblots.markwoodman.com/2006/04/28/top-5-worst-uses-of-rss-and-atom/
Chissa se riesco a convincere mia nonna ad installarsi un Pacemaker
Feed. 
powered by IMHO 1.3
2006-05-29T07:20:00+01:00
Someone is preparing his parachute. This person went to the beach to open his yellow parachute probably preparing it for next activities - Nikon D70s - 70/300mm
next | previous
2006-05-28T17:34:00+01:00
2006-05-28T15:57:00+01:00
Così ha avuto il coraggio di esclamare quest'oggi papa
Ratzinger. Ma con quale coraggio può pronunciare tale quesito che suppongo agli
orecchi di molti cattolici deve essere suonato alla stregua di una
bestemmia. Forse nessuno si è reso conto dell'arroganza di tale posizione: è
stata forse colpa del Signore se il nazismo ha fatto quello che ha fatto?
E' stata forse colpa del silenzio del Signore se milioni di persone sono state
sterminate?
No, mi permetta papa Ratzinger di ricordargli che sono stati
altri i silenzi, codardi, che hanno fatto in modo che il Nazismo potesse
crescere, e esplodesse nel disastro che poi si è rivelato. I silenzi
dell'uomo innanzitutto, quegli stessi silenzi che hanno coperto per anni
personaggi del calibro di Saddam Hussein e che oggi ci riprovano con il tiranno
dell'Iran. I silenzi colpevoli, della chiesa, nella persona dell'allora papa Pio
XII, che durante tutta la guerra si è ben guardato dal denunciare quanto stava
succedendo.
E' colpa del Signore? Mi spiace, io non sono cattolico per mia
fortuna, ma le bestemmie mi infastidiscono lo stesso. Soprattutto se proferite
da chi vorrebbe fregiarsi della rappresentanza di Dio in terra.
powered by IMHO 1.3
2006-05-28T12:40:00+01:00
Mi sono appena iscritto a questo sito che promette
bene. Si tratta, di un idea di Amnesty International che con il supporto di The
Observer intende portare l'attenzione sulla censura in rete. Ecco come si
descrive il sito in home page:
Chat rooms monitored. Blogs deleted. Websites blocked. Search engines
restricted. People imprisoned for simply posting and sharing information.
The Internet is a new frontier in the struggle for human rights.
Governments – with the help of some of the biggest IT companies in the world –
are cracking down on freedom of expression. Amnesty International, with the support of The Observer, is launching a
campaign to show that online or offline the human voice and human rights are
impossible to repress.
Sapete bene quanto mi stiano a cuore questi
argomenti e capirete bene perchè ho deciso di aggiungere nella barra
laterale del mio weblog l'interessante gadget che fornisce irrepressible . Si tratta
di un roller che mostra a rotazione le frasi censurate in varie occasioni
da paesi totalitari e non totalitari. La fanno da padrone naturalmente
i paesi arabi come Siria, Iran e naturalmente non possono mancare Cina e
Cuba.
powered by IMHO 1.3
2006-05-28T06:53:00+01:00
2006-05-28T06:46:00+01:00
Su xe.net è apparso il mio secondo articolo che questa volta porta con se un componente riutilizzabile da non perdere. Si tratta di un SiteMapProvider che semplifica enormemente la creazione di provider custom che attingano i dati della mappa da una qualsiasi sorgente. Nell'esempio allegato all'articolo oltre al codice di questo StaticSiteMapProvider che risolve i problemi di concorrenza che affliggono queste implementazioni, anche un semplice provider alimentato da database SqlServer
Link: Uno StaticSiteMapProvider molto flessibile
Con l'occasione ho anche postato il secondo screencast dedicato al pattern singleton
SCREENCAST: Implementare un Sigleton in C#
2006-05-26T23:42:00+01:00
Sono lieto di comunicare che sono appena stato inserito nella classifica delle 15 più attive di tutti i tempi all'interno di community credit. Precisamente mi trovo attualmente al 14“ posto in questa classifica, mentre nella classifica mensile mi qualifico secondo (per ora!)
Andrea Boschin (136525)
http://www.community-credit.com
2006-05-26T04:03:00+01:00
Continuo sull'argomento
System.Configuration, proponendovi un esempio di come creare una collection di
ConfigurationElement custom. Per capire l'applicazione dell'esempiuo che sto per
introdurre bisogna una ttimo soffermarsi su una particolare tipologia di
elementi di configurazione. Mi riferisco ad esempio al nodo
<providers> all'interno di una sezione di configurazione di
MembershipProvider piuttosto che magari la sezione dedicata
ad httpHandler e httpModules. All'interno di questo tipo di sezioni è
possibile aggiungere elementi, ma anche rimuoverne con le seguenti
sintatti:
<add />
<remove />
<clear />
Nel framework 2.0 questo tipo
di sezioni sono perfettamente definibili da parte dell'utente implementando una
ConfigurationElementCollection. Si tratta in breve di estendere una classe del
framework, implementando un certo numero di metodi: nell'esempio che riporto qui
di seguito ecco come realizzare la versione base che accetterà l'aggiunta di
nuovi elementi con <add />
public class ApplicationInfoCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new ApplicationInfo();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((ApplicationInfo)element).Name;
}
}
Con queste poche righe di codice avremo definito una sezione di
configurazione che accetta tutte le chiavi che abbiamo elencato poco fa,
attribuendo loro la funzionalità che ci aspetteremo. In particolare i due metodi
si occupano di creare una nuova istanza di elemento per la collection e di
restituire il valore della proprietà considerata chiave all'interno di esso.
Questo consente oltre che creare gli elementi con <add /> anche di
rimuoverli specificando a quale di essis ci si riferisce. Non rimane ora che
esporre una proprietà in una classe:
/// <summary>
/// Applicazioni registrate
/// </summary>
[ConfigurationProperty("applications", IsDefaultCollection = false)]
[ConfigurationCollection(typeof(ApplicationInfo))]
public ApplicationInfoCollection Applications
{
get { return (ApplicationInfoCollection)this["applications"]; }
set { this["applications"] = value; }
}
Il primo attributo informa che ci stiamo riferendo ad una
proprietà di configurazione che quindi avrà un corrispondente elemento nel file
di configurazione. L'elemento in questo caso si chiamerà <applications>.
Il secondo attributo invece consente di dire quale tipo di di elemento contiene
la collection; Questo in effetti può sembrare ridondante... ma di questo non
prendetevela con me.
powered by IMHO 1.3