Di .NET e di altre amenita'

June 2006 Blog Posts

ASP.NET 2.0: Immagini con immagine di background

Lo sapevate che un'immagine può avere un'immagine di background? La cosa può sembrare assurda ma si rivela di una certa utilità quando si deve referenziare un'immagine in uno skin di ASP.NET. Avevo già accennato a questa tecnica in un mio precedente post, riguardo l'utilizzo di un div con immagine di background per poter spostare l'url di un'immagine nel css o nella skin. Tuttavia il div ha qualche limitazione dovuta al fatto che non ha una "consistenza solida" che invece un'immagine ha. Talvolta succede quindi che il div venga schiacciato oppure che non lo si riesca a linkare (così come è successo stamattina all'amico Andrea Dottor). La soluzione è proprio quella di adottare una immagine trasparente con un css analogo a quello del div che specifica un background.

<img src="images/spacer.gif" id="myImage" border="0" />

img#myImage
{
    background: url(images/my_image.gif);
    display: block;
    width: 20px;
    height: 20px;
}

Naturalmente l'immagine spacer.gif deve essere rigorosamente trasparente...

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: ASP.NET 2.0: Immagini con immagine di background

ASP.NET 2.0: Resource not found

Chi avesse provato ad utilizzare le risorse localizzate, spostandone lo storage nel database come ho spiegato tempo fa, si sarà reso conto che spesso Visual Studio 2005 restituisce un errore di compilazione che in buona sostanza informa che l'IDE non è in grado di trovare la risorsa specificata.

Questo succede perchè le risorse localizzate vengono caricate già dall'ide di Visual Studio. In realtà quando inserite un ExpressionBuilder questo viene immediatamente convertito nel codice relativo ed eseguito, talvolta anche troppo rapidamente. Ora, nel mio esempio, ma anche in molti altri che si trovano in rete, il codice dell'ResourceProvider si appoggia alla istanza singleton di HttpContext, esposta dalla proprietà Current per determinare in base all'url chiamato il corretto set di risorse. Quando siamo a DesignTime in Visual Studio 2005, non esiste un context HTTP per cui il codice eseguito genererà nella maggioranza dei casi un'eccezione per cui l'ide mostrerà l'errore suddetto.

La soluzione a questo punto è banale: occorre testare il valore di HttpContext.Current per verificare che non sia null prima di interrogare il database. Nel mio caso, qualora il contesto http sia nullo mi premuro di fornire al ResourceProvider dei parametri di default che si occupano addirittura di creare la risorsa mancante riempiendola con un valore fittizio che rende semplice la sua ricerca e popolazione durante la fase di labeling dell'applicazione.

Il codice è semplice:

if (HttpContext.Current == null)
    MakeDefaultResourceContext();

Buone risorse a tutti...

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: ASP.NET 2.0: Resource not found

Persistence & Framework: Tutto esaurito!

A 15 giorni dalla data del meeting, posso comunicare che abbiamo fatto il "TUTTO ESAURITO". In realtà ho deciso di fare un po' di overbooking dato che poi c'è una percentuale fisiologica di assenteismo (per inciso l'ultima volta questa percentale è stata bassissima) perciò ancora per qualche giorno accetteremo iscrizioni, tuttavia da oggi formalmente rimangono solo posti in piedi... ma se vi accontentate...

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: Persistence & Framework: Tutto esaurito!

Accordo Pipeline - XE.NET

Stamane, dopo lunga attività, siamo rusciti a concludere un accordo con Pipeline, una azienda leader nel settore della formazione, che garantirà ai soci XE.NET alcuni benefit sull'acquisto dei prodotti Pipeline. La società che ha sedi a Milano, Bologna e Padova garantirà ai soci XE.NET sconti rilevanti sui propri corsi, sugli esami di certificazione, sull'acquisto di libri Mondadori e di simulazioni Trascender. Quest'ultima in particolare è un'offerta molto interessante e vantaggiosa che consiglio a tutti di prendere in considerazione, senza peraltro trascurare le altre.

Unico obbligo per avere accesso agli sconti di Pipeline, l'essere iscritti allo usergroup, semplicemente registrandosi sul sito web all'indirizzo http://www.xedotnet.org e visto che l'accordo non ha limiti geografici...  approfittatene tutti!!!

Tutti i dettagli al seguente indirizzo: http://www.xedotnet.org/pipeline.aspx

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: Accordo Pipeline - XE.NET

VSTS Customization Toolkit - Process Template Editor

durante la ricerca di tool per Team Foundation Server ho trovato questo interessante kit per la customizzazione dei processi. Si tratta del Process Template Editor, che mi ha permeso di sistemare un po' di cose nel processo MSF Agile che usiamo in ufficio. Provatelo, mi sembra stabile e ben fatto oltre che utile. Peccato che nella versione dello scorso marzo sia riportata la seguente frase:

Here is our latest release. No new features - simply bug fixes.

Speriamo cambino idea!

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: VSTS Customization Toolkit - Process Template Editor

Back from stone age... 3G enabled!


per leggere il post originale o inviare un commento visita il seguente indirizzo: Back from stone age... 3G enabled!

Microsoft Product Feedback Center trasloca

Stamane per pura curiosità sono andato a vedere lo stato di una segnalazione su Microsoft Product Feedback Center e ho scoperto che è in fase di trasloco. Prossimamente sarà ospitato su http://connect.microsoft.com. Meglio così, almeno quando vado a vedere le beta cui partecipo trovo tutto assieme.

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: Microsoft Product Feedback Center trasloca

Persistence & Framework: I posti vanno a ruba

E' giusto che si sappia, dato che qualcuno ne ha anche fatto richiesta in un commento. A due giorni dalla pubblicazione i posti disponibili per l'evento del 7 Luglio 2006 sono dimezzati. In due giorni, la metà dei posti della sala sono andati letteralmente a ruba, a testimonianza dell'interesse suscitato dall'argomento e lasciatemelo dire con una punta di orgoglio anche del buon lavoro che stiamo facendo.

Domani sera inoltre come ben sapete si terrà la cena organizzativa che ormai ha raccolto circa 15 preavvisi di partecipazione, un numero davvero importante che va ben oltre qualsiasi nostra aspettativa. Il significato di questo appuntamento l'ho già ribadito, ma lasciatemi ricordare che con l'occasione dovremo anche fare il punto dei primi sei mesi di attività del gruppo... perchè già sei mesi son passati!!!

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: Persistence & Framework: I posti vanno a ruba

Persistence & Framework: 3° Meeting per XE.NET - reloaded

A causa dei soliti problemi sistemistici la pagina di iscrizione non è stata disponibile per tutta la notte. Ora il problema è risolto:

Link: http://www.xedotnet.org/subscriptions.aspx

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: Persistence & Framework: 3° Meeting per XE.NET - reloaded

Persistence & Framework: 3° Meeting per XE.NET

La persistenza delle informazioni è un argomento da sempre considerato cruciale nello sviluppo. Negli ultimi anni con l'avanzare della programmazione ad oggetti, i metodi di persistenza che un tempo erano considerati all'avanguardia hanno subito il peso degli anni e cominciano a far sentire i propri limiti.

In questo meeting daremo uno sguardo alle nuove proposte che promettono di far risparmiare molto tempo. Il meeting sarà suddiviso in tre sessioni, nelle quali saranno toccati tutti gli aspetti di questa problematica, centrando soprattutto il tema degli ORM mappers, con particolare rilievo per NHibernate, cui sarà dedicata una sessione di Giancarlo Sudano, alias Janky. Janky ci guiderà alla scoperta di quello che è a tutti gli effetti il più famoso engine di persistenza ad oggetti non solo nel mondo .NET.

Da questa sessione prenderemo il largo affrontando altri ORM, e i metodi tradizionali di persistenza in compagnia dapprima di Davide Senatore ed in seguito di Marco Trova che concluderà il meeting dimostrando qualche esempio pratico all'interno di alcuni software opensource che fanno uso dei Mapper. Come vedete quindi anche un grande contributo a XE.NET da parte dei suoi membri. Davide e Marco, per la prima volta si cimentano nello speech, mettendo la loro professionalità e competenza al servizio della community.

Vi aspettiamo, i posti sono limitati e stavolta l'iscrizione è obbligatoria

Agenda & Iscrizioni: http://www.xedotnet.org/subscriptions.aspx

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: Persistence & Framework: 3° Meeting per XE.NET

Virtual Server: Cambiare il tipo di bus ad un Virtual Hard Disk IDE

Mi azzardo a postare un piccolo tip su virtual Server, non sapendo se qualcuno ha già postato qualcosa in merito, in attesa di essere avallato o mazzuolato da Lorenzo. Mi è capitato di installare una macchina Windows 2003 su un vhd impostato erroneamente con bus IDE ed accorgermene solo a cose fatte. Il tentativo di portare il bus a SCSI semplicemente causa una schermata blu durante il riavvio del pc virtuale per cui mi sono inventato un modo per portare una macchina preinstallata su un nuovo disco SCSI. Il tip è il seguente:

  1. Creare un nuovo SCSI Adapter e un secondo Virtual HD con bus SCSI
  2. Instare sulla macchina virtual la versione trial di Acronis True Image 9.1
  3. Scegliere Clone Disk e copiare pari pari il disco C:\ sul nuovo disco
  4. Al termine fare shutdown e rimuovere il disco IDE
  5. Riavviando il sistema farà uno scandisk e poi dopo un riavvio ripartirà normalmente
  6. A questo punto, se sono già installate le VM Addidions io ho scelto di disinstallarle, riavviare e reinstallarle. Le VM Additions infatti pare contengano delle patch per i driver SCSI tali che migliorano notevolmente le prestazioni della macchina virtuale che invece al primo avvio sarà molto più lenta di una corrispondente IDE

L'ho detto, non so se sia il metodo giusto, ma così facendo sono riuscito ad ottenere il risultato. Tanto più che non serve nemmeno acquistare TrueImage (peraltro un software eccellente che varrebbe la pena di avere).

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: Virtual Server: Cambiare il tipo di bus ad un Virtual Hard Disk IDE

XE.NET: Cena organizzativa e prossimo meeting

Il prossimo venerdì, 9 Giugno 2006 si terrà a Castelfranco Veneto una cena organizzativa dello usergroup XE.NET. Ci sarà molta carne al fuoco da discutere e spero di avere un'ampia adesione alla cena perchè ci sono argomenti molto cruciali da affrontare per garantire un futuro al nostro gruppo. Ecco in breve alcuni degli argomenti più importanti che vorrei trattare:

  1. Formalizzazione legale dello user group
  2. Organizzazione del primo WorkShop di XE.NET
  3. Potenziamento ed ampliamento delle attività editoriale sul sito web

Questi tre punti servono solo a dare la misura dell'attività che stiamo compiendo e del perchè è importante che la partecipazione sia il più possibile ampia e consistente. Chi desiderasse partecipare è invitato a comunicarmi, anche a mezzo form contatti sul weblog, la sua intenzione così da darmi la possibilità di prenotare un tavolo sufficientemente grande.

Detto questo, rimane solo una anticipazione che esce ora dal novero delle top-secret. La data probabile per il prossimo meeting è quella del 7 Luglio 2006 e a quanto pare avremmo una guest-star che da buon veneto d.o.p. terrà la sua sessione in perfetto dialetto venexian  indovinate un po' di chi si tratta?

Ah, l'argomento direte voi... ma se vi dico l'argomento scoprite all'istante di chi sto parlando, facciamo così... diciamo che si parlerà di accesso ai dati. A giorni pubblico la scaletta e il mistero sarà svelato.

Comunque, il pubblico femminile è invitato a partecipare in massa dato che l'oratore gradisce molto...

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: XE.NET: Cena organizzativa e prossimo meeting

ASP.NET 2.0: Il workaround su ladybug

Per conoscenza vi informo che ho postato il workaround al bug che ho scoperto negli ultimi giorni su Microsoft Feedback Center al seguente indirizzo:

http://lab.msdn.microsoft.com/ProductFeedback/ViewWorkaround.aspx?FeedbackID=FDBK38510#1

Nel post è presente una sommaria descrizione in inglese che rimanda all'esempio che ho postato stamattina.

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: ASP.NET 2.0: Il workaround su ladybug

ASP.NET 2.0: ObjectDataSource CultureInfo Bug Workaround

Click here for English Translation

Come promesso ecco il codice di esempio relativo il Workaround del bug segnalato nei giorni scorsi. Innanzitutto occorre dire che, nonostante Microsoft sul Product Feedback Center continui a segnalare che non riesce riprodurre il comportamento, il bug è presente. Il problema probabilmente deriva dal fatto che la formattazione InvariantCulture è sostanzialmente analoga a quella es-US perciò il codice postato va in errore nelle culture diverse ma funziona perfettamente negli U.S.A.

Veniamo ora brevemente a descrivere il metodo utilizzato per aggirare il problema: il concetto si basa sull'utilizzo dell'evento updating della datasource e sull'osservazione che il bug segnalato si presenta esclusivamente quando nella datasource viene specificato l'attributo DataObjectTypeName. In questo caso solamente infatti la datasource tenta di creare una istanza del tipo specificato e di mappare i dati ricevuti dal controllo su questo oggetto, causando così il verificarsi dell'errore. Non specificando questo parametro però sostanzialmente si vanfica l'uso della ObjectDataSource perchè il metodo utilizzato per l'update riceverà tutti i campi separatamente anzichè una istanza dell'oggetto. E' del tutto evidente che è sicuramente possibile effettuare manualmente la mappatura di tutti i parametri ricevuti dal metodo sulla classe richiesta, tuttavia è altrettanto evidente che così facendo ci si espone ad un degrado della manutenibilità del codice in quanto ad esempio aggiungendo una proprietà alla classe target saremmo costretti ad intervenire nei metodi che effettuano la mappatura.

La mia tecnica invece si propone di ripristinare per quanto possibile il normale flusso di lavoro della datasource, intervenendo subito prima della chiamata del metodo update per effettuare la mappatura in modo generalizzato per ogni tipo di oggetto di destinazione. La tecnica comporta che si debbano prelevare i dati provenienti dal runtime nella proprietà InputParameters, mapparli sulla classe richiesta ed in seguito rimuovere tutti i parametri da questa collection ed aggiungervi invece l'oggetto mappato; ecco uno spezzone di codice:

/// 


/// Handle Updating event of ObjectDataSource
/// 

/// ObjectDataSource
/// 
event arguments
protected void Source_Updating(object sender, ObjectDataSourceMethodEventArgs e)
{
    
// instantiate utility class for property mapping
    
DictionaryMapper mapper = new DictionaryMapper();
    
// create target object running mapper
    
Employee employee = mapper.MapDictionary(e.InputParameters);
    
// clear input parameters
    
e.InputParameters.Clear();
    
// add the result object
    
e.InputParameters.Add("item", employee);
}

A questo scopo ho creato una classe, la DictionaryMapper che essendo appunto generica consente di mappare qualunque le proprietà su qualunque tipo di destinazione. La classe DictionaryMapper i buona sostanza utilizza la reflection per settare le proprietà dell'oggetto destinazione ed applica qualora serva un metodo di conversione corretto, basato su CultureInfo.CurrentUICulture:

/// 


/// Perform conversion of the given string to the required type
/// 

/// value to convert
/// 
typer to convert to
/// 
converted value
private object ConvertFromString(string value, Type targetType)
{
    
if (!(value is string))
        
return value;

    
// create the converter
    
TypeConverter converter = 
        TypeDescriptor.GetConverter(targetType);

    
// if value contains something
    
if (value != null)
        
// convert string to target type using not InvariantCulture
        
return converter.ConvertFromString(
            
null
            CultureInfo.CurrentUICulture, 
            (
string)value);

    
// create an empty instance of target type
    
return converter.CreateInstance(null);
}

Il processo di conversione utilizzato è analogo a quello che utilizza la ObjectDataSource, ma invece che invocare il metodo convertFromInvariantString() si fa uso di ConvertFromString() passando appunto il valore della Cultura corrente. Nel web.config del progetto che fa da Proof-of-concept ho forzato la cultura italiana in modo tale che l'errore si presenti ovunque.

Download: CultureBug_workaround.zip (4427 Bytes)

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: ASP.NET 2.0: ObjectDataSource CultureInfo Bug Workaround

Ho vinto qualche cosa?

Beh, lo sapete già grazie al post di questo pomeriggio di Simone ma non potevo esimermi dal bloggarci su, altrimenti che blogorroico sarei... Oramai era un po' di tempo che mi trovavo nelle prime posizioni avendo toccato per qualche giorno anche le prime posizioni. Alla fine mi sono classificato terzo, portando a casa un bel puntatore laser che naturalmente sarà la gioia di mia figlia, anche se naturalmente dovrò tenerla d'occhio mentre lo prova e nasconderlo quando non ci sono. Devo dire che il concorso, pur se estenuante è stato davvero bello, ma soprattutto mi è piaciuta una frase che ho trovato nella mail che quest'oggi mi ha comunicato la vittoria.

When folks ask you how you won, you can tell them that it was by helping out other geeks. Be proud and brag.

In effetti è vero, o almeno spero che lo sia. Ogni singolo punto ce lo siamo guadagnati aiutando qualcuno, vuoi con i post nel blog, vuoi con le sessioni ai meeting, con le partecipazioni ai webcast condivise con gli altri, scrivendo ben 4 articoli in un mese, gli screencast, i tip, e... e...e... Penso proprio che seguirò il consiglio e prossimamente sfoggero con orgoglio il mio stupido premio.

Sarà pure stupido, ma per me significa molto. Provateci, ve lo consiglio e magari pure voi con un po' di sforzo potrete sfoggiare un puntatore laser e un simpatico bannerino.

powered by IMHO 1.3

 


per leggere il post originale o inviare un commento visita il seguente indirizzo: Ho vinto qualche cosa?

ASP.NET 2.0: Ancora sulla ObjectDataSource

A proposito del bug che ho segnalato ieri sera, vorrei rispondere pubblicamente alla domanda che mi ha posto Michele con un commento. In effetti, la prima cosa che ho fatto, subito dopo aver segnalato il palese errore è stato di rivolgermi al Product Feedback Center dove ho trovato naturalmente che il bug era già stato segnalato. Ho provveduto così a informare che anche io ho validato il bug e speriamo che la prossima service pack del framework risolva la cosa. Per il momento però ho trovato un workaround, che però è parecchio laborioso. Portate pazienza, preparo un progettino e poi vi faccio sapere.

powered by IMHO 1.3


per leggere il post originale o inviare un commento visita il seguente indirizzo: ASP.NET 2.0: Ancora sulla ObjectDataSource