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

tags: - categories:

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

tags: - categories: News

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#


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


Se avete provato ad usare i nuovi strumenti per la gestione della configurazione in .NET 2.0, sicuramente ne sarete rimasti affascinati come è successo a me, che oramai cerco di usarli ovunque possibile. Vi sarà forse capitato anche di dover gestire delle configurazioni dinamiche sul tipo di quelle che adottano i vari provider di ASP.NET. Il MembershipProvider ad esempio - ma anche tutti gli altri in realtà - tipicamente espongono una serie di parametri di configurazione che si possono suddividere in parametri "generali", cioè che si applicano indistintamente a tutti i MembershipProvider e in parametri "specifici" che invece variano in base a che tipo di provider dobbiamo configurare. Il SqlMembershipProvider ad esempio richiede una serie di parametri aggiuntivi - uno per tutti, il nome della stringa di connessione - che non necessariamente si applicano ad altri tipi di provider. In effetti qualunque provider deve derivare da ProviderBase che espone un metodo Initialize() tra i cui argomenti troviamo una NameValueCollection che contiene i parametri "sconosciuti" che verranno gestiti direttamente dall'implementazione che stiamo realizzando.

Se vi trovare perciò a dover creare un vostro sistema di provider, ma anche nel caso in cui vogliate scrivere un sistema pluggabile, in cui i moduli aggiuntivi possano godere di parametri di configurazione propri espressi all'interno dell'xml nel web.config dovrete gestire tali parametri in nel ConfigurationElement che li prevede. Ecco un esempio di come realizzare questo meccanismo:

public class ApplicationInfo : ConfigurationElement
{
    
private NameValueCollection attributes = new NameValueCollection();

    [ConfigurationProperty("name")]
    
public string Name
    {
        
get return (string)this["name"]; }
        
set this["name"] = value; }
    }

    
//
    // TODO: definire le altre proprietà di default
    //

    
public NameValueCollection Attributes
    {
        
get return attributes; }
    }

    
protected override bool OnDeserializeUnrecognizedAttribute(string name, string value)
    {
        attributes.Add(name, 
value);
        
return true;
    }
}

OnDeserializeUnrecognizedAttribute e il complementare OnDeserializeUnrecognizedElement sono una coppia di metodi virtuali che verranno chiamati dal runtime durante la fase di deserializzazione della configurazione e consentono di gestire eventuali attributi o elementi imprevisti. Nel caso concreto il metodo non fa altro che aggiungere i valori ad una NameValueCollection e ritornare "true" per ogni attributo sconosciuto, informando il runtime che non se ne deve ulteriormente occupare. Se invece volessimo gestire una serie specifica di attributi potremmo ritornare "false" qualora quello trovato non ci competa e in questo caso il runtime solleverà una eccezione che informa dell'errore di configurazione.

powered by IMHO 1.3


Beh, non è mia abitudine razionale come sono, raccontare ad altri i miei sogni, ma in questo caso lo voglio proprio fare. Tanto più che non è da tutti bloggare su un sogno proprio nel bel mezzo del sogno stesso. Vi sembrerà incredibile, ma sto sognando che un Radicale è diventato ministro. Anzi vi dirò, non un Radicale qualunque (anche se il qualunquismo proprio non è Radicale), ma proprio lei, nientemeno che Emma Bonino. Per carità, non vi mettete a ridere, so che è pazzesco che un Radicale entri in un Governo italiano, tanto è vero che dall'ultima volta che è successo sono passati 50 anni, e in questo periodo ci sono passati e ripassati tutta una serie di ladruncoli, malfattori, aguzzini e bugiardi che ormai la speranza si era talmente diluita da richiedere misurazioni quantistiche per rilevarla. So di avere stimolato la vostra curiosità, di certo vi starete chiedendo almeno una cosa; starete certamente frugando nella vostra memoria per cercare di ricordare chi fosse quel Radicale che cinquant'anni fa entrò al governo. Lasciate perdere, non c'è speranza dato che quel periodo storico non è incluso nei libri di testo, forse non vi avete mai dato il giusto peso, ma pare che per la scuola la storia italiana si fermi al '45. La persona di cui stiamo parlando è Ernesto Rossi e credetemi l'ho scoperto da poco anche io. Ernesto Rossi non fu ministro ma sottosegretario nel governo Parri e nonostante tale governo rimase in carica per solo cinque mesi egli riusci a condurre mirabilmente lo smaltimento dei residuati bellici sui quali vi erano parecchi interessi economici di industriali senza scrupoli. In seguito mantenne fino al 58 la carica di presidente dell'Azienda Rilievo Alienazione Residuati. Ora capirete che pensare che dopo cinquant'anni di totale assenza ora Emma Bonino sia diventata Ministro, è davvero un sogno. E vi dirò di più. In questo mio sogno sto vedendo Emma che parla, durante una commemorazione svoltasi a Ventotene (ah, a Ventotene Ernesto Rossi ci fu imprigionato per venti anni) dopo il Presidente della Repubblica e sottolinea che forse sarebbe una buona idea tradurre in Arabo il manifesto europeista che vi fu redatto da Altiero Spinelli e guardacaso Ernesto Rossi. Lo so, vi sto rivelando dei risvolti del vostro paese che probabilmente solo pochi di voi conoscono. Io ci sono arrivato leggendo e ascoltando quello che di solito non è il comune sentire. Sarà per questo che sto facendo questo sogno e nonostante più volte mi sia schiaffeggiato non riesco a risvegliarmi. Vi prego, se questo è un sogno non svegliatemi. In questo povero paese probabilmente non sono rimasti che i sogni, quindi perchè buttare via anche questi?

E se non stessi sognando? Naaa.... impossibile!!!


Sono certo che, più di qualcuno si sarà accorto che nonstante la flessibilità della GridView, questa soffre di qualche problema. In particolare mi riferisco alla impossibilità di recuperare il numero totale di righe presenti sulla fonte dati quando si utilizza una ObjectDataSource. Per intenderci quello che nella vecchia DataGrid si chiamava il VirtualItemCount. Vediamo di chiarire i motivi per cui questo accade. Ci sono sostanzialmente due modi di collaborazione tra una GridView e una ObjectDataSource. Nel primo caso la DataSource fornisce tutti gli oggetti presenti nel repository e la GridView si incarica di mostrare solo quelli richiesti dai parametri di paginazione. Nel secondo caso invece la DataSource fornisce solo i record necessari e la GridView è obbligata a chiamare il metodo SelectCountMethod della DataSource per sapere quanti record sono presenti.

Ora, parrà strano, ma la GridView - a meno che io non abbia preso un forte abbaglio - non espone alcuna proprietà che fornisca il numero totale di righe presenti. Questa proprietà, credetemi sulla parola, sarebbe di utilità estrema dato che il più delle volte al cliente non interessa sapere a che pagina è arrivato sul totale di pagine, ma vuole avere una indicazione precisa di quanti elementi sono presenti nel resultset che sta scorrendo. Pare impossibile, ma a fare le moltiplicazioni evidentemente si fa fatica...

In definitiva il dato che cerchiamo deve essere presente da qualche parte. Se ci si pensa bene, il calcolo del paginatore richiede che si conosca quante righe contiene la datasource. Armato del solito reflector mi sono perciò messo alla ricerca di esso e ho scoperto che è talmente facile arrivarvi da poter considerare una vera svista non averlo esposto. Ecco la classe che estende la GridView che pubblica una proprietà VirtualItemCount:

public class XGridView : GridView
{
    
public int VirtualItemCount
    {
        
get return (int)ViewState["VirtualItemCount"]; }
    }

    
protected override void PerformDataBinding(IEnumerable data)
    {
        
base.PerformDataBinding(data);
        
        
this.ViewState["VirtualItemCount"] = 
            
this.ViewState["_!ItemCount"];
    }
}

Davvero banale! In sostanza il metodo PerformDataBinding() è quello che viene chiamato subito dopo che la DataSource, qualunque essa sia ha restituito sotto forma di IEnumerable il suo risultato. Nel controllo System.Web.UI.WebControls.CompositeDataBoundControl - base anche della GridView - si può trovare il seguente codice:

// extracted with Reflector

protected internal override void PerformDataBinding(IEnumerable data)
{
      
base.PerformDataBinding(data);
      
this.Controls.Clear();
      
base.ClearChildViewState();
      
this.TrackViewState();
      
int num1 = this.CreateChildControls(data, true);
      
base.ChildControlsCreated = true;
      
this.ViewState["_!ItemCount"] = num1;
}

Ecco svelato l'arcano. un controllo che abbia come Base il CompositeDataBoundControl deve implementare un metodo CreateChildControls() che restituisca come parametro di ritorno un intero che è appunto il totale di righe presenti nel repository, in seguito utilizzato per calcolare eventualmente il paginatore. Che cosa costasse aggiungere questa proprietà alla GridView proprio non mi è dato sapere.

Giusto per non lasciare l'argomento a metà, vale la pena di spiegare come fa la GridView a paginare il resultset. Nell'implementazione di CreateChildControls() della GridView vine utilizzata una PagedDataSource che si comporta diversamente nei due casi che prima ho prospettato. Nel caso di utilizzo del SelectCountMethod non c'è alcun rilevo da fare, ci si affida semplicemente a questo risultato, ma nel caso opposto invece il resultset viene scorso __tutto__ una riga alla volta è una variabile viene incrementata di una unità ad ogni ciclo. Tutto ciò per il semplice motivo che una DataSource rende un IEnumerable e non una ICollection... quindi niente Count.

Morale? Pensateci bene quando dovete decidere che tipo di paginazione volete usare...

powered by IMHO 1.3


Ho scritto una articoletto su come ottenere dalla GridView un dato di cui è gelosa custode. Si tratta di VirtualItemCount che chi ha utilizzato la vecchia DataGrid conosce bene. L'articolo, che esplora mediante Reflector il meccanismo di paging della GridView è molto interessante anche per capire le limitazioni del controllo in alcuni casi.

link: ASP.NET 2.0: Ottenere il VirtualItemCount dalla GridView


License & Disclaimer

I contenuti disponibili in questo weblog sono resi disponibili sotto la licenza di tipo "Creative Commons License".
Questo blog non rappresenta una testata giornalistica in quanto viene aggiornato senza alcuna periodicità.
Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62 del 7.03.2001