ottobre 2007 Entries
[Daily Issue] XmlDocument, selezionare i nodi con namespace

Mi è capitato ultimamente di avere a che fare col mondo flash.. molto a che fare...

Tralasciando le considerazioni personali, ho avuto modo di vedere che il parser XML di Flash ed i WebServices che restituiscono DataTable o DataSet non vanno molto d'accordo... (questo a detta di chi ci lavora, anzi gradirei sapere da qualcuno che conosce bene actionscript se è vera questa informazione.....)

Quindi, quello che ho dovuto fare è stato, per amore della tranquillità (e per esigenze di deploy in tempi "stretti"), cambiare l'output da DataTable a XmlDocument. Anche così, dava problemi la dichiarazione che ne consegue, che ha il primo nodo chiamato <xs:element che, a quanto pare, inchioda totalmente il parser XML di flash che non sa come andare avanti e "nasconde" i nodi successivi....

Detto fatto, sempre per il su citato "amore della tranquillità", ho eliminato il nodo selezionandolo con XPATH e cancellandolo. Peccato che un nodo di questo genere non si può selezionare da solo usando il SelectSingleNode perchè otterreste un bell'errore del tipo "Namespace Manager or XSLT Context Needed. Questo perchè giustamente il parser XML di .NET non riconosce il namespace (forse è questo che "blocca" flash? Boh....)

L'alternativa è usare l'overload di GetSingleNode che accetta un XmlNamespaceManager. Ovviamente istanziato correttamente: 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable));
nsmgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema"); 

XmlDocument doc = new XmlDocument();
//Codice per caricare il documento
XmlNode node = doc.SelectSingleNode("\\xs:element", nsmgr);

In questo modo seleziono il nodo xs:element del datatable per poterlo eliminare dall'XmlDocument risultante..e rendere felici i nostri amici di Flash!

P.S.: Seriamente, se qualcuno con esperienza in Flash e ha avuto opportunità di lavorare con DataTable e Recordset flash senza problemi.. me lo faccia sapere :D

[Daily Issue] Levare l'ultimo progetto VS2003

Allora, cosa sareste disposti a fare voi per levarvi dalle scatole lultimo progetto 2003 che avete tra le mani?

Io personalmente sarei disposto a un sacco di cose.... il problema principale è che questo applicativo è uno dei piu complessi guarda caso (un motivo se non l'abbiamo ancora migrato c'è :D)

Contiene una trentina di progetti, di cui due web, diverse console application, un servizio, ed il resto sono classi di business. ... oggi ho iniziato a fare le prove, e vediamo come andrà a finire...

L'interrogativo è: farlo per tutto e metterli di fronte al fatto compiuto? O parlarne e temere in un no (malgrado non ci siano assolutamente controindicazioni tecnologiche di alcun genere)? :)

[Daily Issue] Custom Control e MasterPage: gli eventi non vengono scatenati?

Ho avuto un insidioso problema che mi ha fatto tribolare non poco oggi.

Sto creando una gestione di immagini via web (no Matteo, niente a che vedere con te :P) che permetta di caricare un immagine e cropparla, resizarla, girarla, controllarla. Insomma: un mini photoshop, ovviamente molto molto mooooooooolto mini :D

Ovviamente mi sono guardato in giro e nno ho visto niente che facesse come volevo io, tanti begli spunti alcuni fatti anche molto bene, ma mancavano di qualcosa oppure non mi convincevano per le soluzioni "tecnologiche" adottate (soprattutto per quanto riguarda CSS e Javascript). Quindi mi sono messo di impegno e mi sono creato il mio CustomControl, partendo da una base già pronta presente nell'azienda che faceva una cosa simile (upload di foto) ed espandendola.

Tutto andava perfettamente nei test, il controllo scheggia e croppa a velocità della luce, si vede su tutti i browser che ho provato (su mac/safari ha un problemino .. sigh...) alchè lo porto nel progetto che per primo dovrà utilizzarlo.

Ovviamente, non funziona piu nulla (sorvolerò sulla magra figura che ho fatto nel fare vedere al mio "collega": hey vieni a vedere che figata.. sigh :P).
Carico la foto e niente, non la salva, non la processa, non fa nulla di nulla... L'unica differenza con il test è la master page ed infatti, levandolo dalla masterpage, funziona tutto...  Controllo che la riga

uploadButton.Click += new EventHandler(uploadButton_Click);

venga processata, ed in effetti così avviene, ma poi non entra mai nell'EventHandler.....

Non sono a conoscenza di bug noti per quanto riguarda l'interazione di EventHandler in Custom Control e le Master  Pages... quindi ho cercato l'errore altrove.
Dopo 2 ore e mezza di ricerce, mi sono accorto che il problema era ... nella base già pronta! (ovviamente:D).

Tutte le proprietà di visualizzazione del Custom Control ( tipo DefaultImageUrl, che valorizza un controllo Image, UploadButtonText, che valorizza il Text di un Button etc) andavano ad interagire direttamente con i controlli stessi, che però venivano creati ed aggiunti nel metodo CreateChildControls().
Quindi, il furbone di controllo per essere sicuro di lavorare con i controlli già istanziati, in ogni Setter chiamava l'EnsureChildControls() . Risultato: veniva chiamato il CreateChildcontrol _prima_ del caricamento della pagina web e della pagina master.

Come probabilmente sapete, il caricamento della pagina master stravolge la struttura (e gli id....) dei controlli server, e quindi mi veniva fuori che dentro un ContentPlaceHolder con ID tipo "ctl001:contentplaceholder1", dove tutti i controlli dovrebbero avere questo prefisso, mi ritrovavo il mio controllo con id "imageControl"...

Per risolvere il problema si può cambiare il setter della proprietà in modo che interagiscano con dei campi privati e non direttamente con i controlli, e valorizzare i controlli nel CreateChildControl, oppure istanziare gli oggetti visuali nel costruttore.

In entrambi i casi, conviene lasciare assolutamente che il CreateChildControls() venga chiamto dal framework, quando è veramente necessario...

[Daily Issue] HTML, MailTo e "a capo"

Siamo nel 2007, è vero, ma in certe occasioni è ancora piu comodo/semplice/intuitivo/whatever interagire con l'oggetto mailto per mandare email direttamente da pagine HTML, per esempio in gestionali o in pagine web con contenuti marketing ...

Ora, mi dimentico _sempre_ alcune cose, tipo come inserire diversi indirizzi nel TO, come andare a capo nel Body (\n o br o altro non funzionano) etc etc.

Ogni volta devo ricercarlo, e visto che immagino che come me ci siano molti "smemorati", vi link  l'RFC con le specifiche piene.

In particolare, se non volete leggervela tutta, per inserire piu di un indirizzo email nel to del mailto, si può fare:

mailto:?to=addressi@server.com%2C%20address3@server.com

Per andare a capo nel body invece:

mailto:?body=prima riga%0D%0Aseconda Riga

Comunque leggendo l'RFC si scoprono tante altre cosine che si possono fare :D


 

Add Comment Filed Under [ Weekly Issues ]
[Agile] Planning Poker

Ecco finalmente un modo "quasi" divertente per mettersi in gruppo a fare le stime!

How'd you do? If you're like the rest of us, you suck. At estimating, I mean.

Praticamente è un modo per mettersi seduto ad un tavolo e cercare di avere delle stime sensate, e non le stime che vengono "trascinate" o riviste dall'idea del primo che parla :D

Qui il post completo
Qui il sito originale dove si possono comprare i mazzi, che ne discute i benefici reali..

Che dire, quasi quasi :D

One Comment Filed Under [ Agile ]
[Daily Issue] ASP.NET Custom Control e Page.ResolveClientUrl

Mi sono trovato a sviluppare un sacco di Custom Control nella mia "carriera".

In molti casi mi sono "scontrato" con la scarsa conoscenza del team in questo campo. E' una cosa abbastanza strana, capire che un Custom Control non è niente di trascendentale e che quello che fa il framework con la sua Textbox volendo possiamo rifarlo anche noi è una cosa che tutti gli sviluppatori dovrebbero _quantomeno_ comprendere... non dico saperla fare ad occhi chiusi, ma comprenderla si :)

Comunque, a parte le filippiche, le domande che piu mi sento fare è come utilizzare dei path relativi. Ho visto brutture (roba tipo passare c:\inetpub\temp in una proprietà del custom control) causate dal fatto che non si sapeva come altro fare...

Prima di tutto, sappiate che ogni controllo può usare i path preceduti da  "~\" per indicare la root dell'applicazione. Il metodo che si occupa di "tradurre" la tilde è ResolveClientUrl() dell'oggetto Control.

Questo metodo è accessibile da qualsi oggetto che erediti da control, quindi anche CompositeControl o WebControl. Insomma, da ogni nostro custom control :)

Il problema può essere: come fare nel caso nel mio progetto Custom Control ci siano alcune "classi helper" che si occupano di gestire il path in vece del mio Custom Control e che, ovviamente, non ereditano da Control?

In questo caso non ho ResolveClientUrl subito disponibile, ma partendo dal presupposto che la classe helper verrà usata da un Custom Control il quale, ovviamente, sarà ospitato in una pagina web, posso utilizzare l'HttpContext per arrivare alla pagina chiamante e, quindi, avere un'istanza dell'oggetto Page corrente che mi possa risolvere la tilde. La sintassi è:

Page currentPage = (Page)HttpContext.Current.Handler;

In questo modo potrò poi chiamare currentPage.ResolveClientUrl(urlConLaTilde) senza probilemi!

P.S.: DEVO iniziare a vedere qualcuno di quegli aggeggi per scrivere codice sul blog :D

2 Comments Filed Under [ ASP.NET Weekly Issues ]
[OT] Fare la spesa....

Premessa: una ventina di giorni fa ho avuto una reazione allergica abbastanza importante, che mi ha fatto finire al pronto soccorso. La reazione è dovuta (dicono) allo stress accomulato, all'alimentazione sbagliata (nel senso che ero senza cucina ed avevo mangiato sushi e verdure per 6 giorni di fila), alla fioritura dell'ambrosia (cui ho un'allergia conclamata) che tutti insieme si sono messi insieme ed hanno scatenato un'allergia crociata, ossia quando per la presenza eccessiva di istamina nel sangue un'allergia respiratoria si trasforma in allergia alimentare (quindi ti gonfi come una zampogna).

A causa di questo, dovrò eseguire (a breve) i famosi patch test per capire se l'allergia crociata si è confermata oppure se era solo una reazione dovuta appunto all'incrocio dei fattori.

Prima però ho dovuto fare 20 lunghissimi giorni con cibi "a basso tenore di istamina" e eliminare qualsiasi attività fisica. Questo vuol dire aver eliminato la maggior parte delle verdure (pomodori, zucchine, spinaci, cavolfiore, peperoni... che guarda caso adoro) e pure frutte (banane, pesche etc).
Posso mangiare tranquillamente mele, pere, carne cotta, formaggi rfreschi, pane, pasta (facendo attenzione ovviamente al sugo/ripieno)...

Tutto questo per dire, che ho fatto 20 giorni di spesa all'esselunga senza passare praticamente dal banco frutta e verdura, e prendendo principalmente dal banco-schifezze in quanto ci sono un sacco di cose che normalmente non mangio ma che per variare un pò prendo...

Carne a parte, che prendevo ovviamente anche prima, una spesa media senza frutta e verdura mi costa una ventina di euro in meno rispetto ad una con frutta e verduta... e io mi chiedo.. ma porca miseria! Possibile che se riempio il carrello di Colesterolo e zuccheri spendo la metà che riempendolo con qualcosa di sano? Altro che censura dei blog, questa cosa mi preoccupa _molto_ di più....

Si lo so, sono parecchio OT.. ma mi sto gongolando dal fatto che questa domenica pomeriggio sono riuscito ad _uscire_ invece che stare a lavorare/preparare corsi.. sigh.. aria fresca :D

2 Comments Filed Under [ Off Topic ]
[OT] Il corso piu duro del mondo...

Lo so, sono ri-sparito...

Purtroppo sto avendo due giorni a settimana di corso durissimo, non per la tipologia di corso in se (ASP.NET e OOP, piu classico non ce n'è...), ma per la classe, composta interamenti da disabili uditivi, o non udenti.

Una fatica incredibile conciliare i gesti alle parole che per forza di cose il 90% delle volte devono essere scritte (non conosco purtroppo il loro linguaggio, e dubito che tutti loro lo conoscano). Questo mi ha costretto a rendere le slide molto piu "verbose" ed ha scrivere parecchio durante il corso.. praticamente passo lunedi e martedi a scrivere ininterrottamente, e la sera di lunedi e martedi a inventarmi come rendere meglio un particolare concetto _senza parlarne_ ... vi giuro che quando ho accettato non credevo che sarebbe stato così difficile... Il resto della settimana lo passo a recuperare il lavoro che sto "perdendo" per il corso e che comunque devo ultimare, e questo vuol dire fare notte spesso e volentieri :D

Però mi sembra che sto ottenendo buoni risultati, sto portando delle persone abituate a sviluppare schiantando tutto, e dico tutto, nell'aspx, a capire cosa sono i livelli, come funziona il codebehind, come si istanziano gli oggetti, come si sviluppa ad oggetti, perchè avere qualcosa senza option strict ed explicit a on è sepre male...

tutto questo in VB.NET... unica figurazzia l'uso di TypeOf che credevo ricordadrmi ed invece ho tentennato... ma dopo due tentativi al terzo ci ho preso :D la prossima volta non prenderò sottogamba VB.NET ;)

Questo comunque per dire che domani è l'ultimo giorno, devo riprendermi dal tutto e tornerl ad essere piu presente sia qui che sui NG... vedo molta brutta gente che risponde non vorrei lasciare troppe persone senza guida :D:D

7 Comments Filed Under [ Off Topic ]
[Daily Issue] .NET Performance Tips and Tricks...

Il periodo pieno non accenna a smettere.. da un certo punto di vista mi va benone, dall'altro dormo troppo poco :)

In questi giorni, comunque, sto notando che manca proprio un'infarinatura su molte tematiche di base... uno dei piu gravi purtroppo è quello delle Performance.. ValueTypes, ReferenceTypes, boxing e unboxing, eccezioni... tutte cose di cui magari si parla ma di cui si ignorano gli impatti (Anche importanti, la maggior parte delle volte) in termini di velocità di esecuzione....

Una buona introduzione potrebbe essere questo articolo su msdn, un pò vecchiotto ma ancora attuale... sarebbe il caso di darci un'occhiata giusto per vedere se ci si batte la testa dicendo "ma dai! E pensare che io questo l'ho sempre fatto"... :D

[Daily Issue] I Warning.. trattateli come errori.. ok?

Mi capita troppo spesso (sempre??) di avere a che fare con Warning presi sottogamba....

Il classico è il try/catch in cui si fa il catch dell'eccezione, ma poi non la si usa...
Questo vuol dire

1: non si conosce che il costrutto "catch" è ammesso anche se non si specifica l'eccezione, nel caso io voglia fare qualcosa senza interagire con l'eccezione stessa

2: si sta facendo debug spinto e "mi serve l'ex per capire cosa succede altrimenti non capisco"...
Ok.. perfetto..  una volta, due volte.. la terza ci attacchi un log4net.....

I warning sono l'anticamera di un problema. Si chiamano warning per un motivo, mica hanno un nome carino tipo "messaaggino di avviso" o "notifica gentile e non urgente"... c'hanno un bel punto esclamativo giallo di fianco che se non è segnale di pericolo, poco ci si discosta.

Una solution che compila con dei warning la maggior parte delle volte va bene se si è in fase di sviluppo, ma quando si è vicino al rilascio i warning devono essere trattati esattament ecome errori di compilazione: dovete eliminarli!

E' come avere dolori forti dalle parti del cuore, e non andare a farsi vedere fin quando non arriva l'infarto... solo che in questo caso è troppo tardi... nel caso dei warning.. beh.. anche :D

[Daily Issue] Le Naming Guideline....

... sono la base dello sviluppo...
Sono forse una delle cose piu importanti che voi possiate adoperare...

No, sul serio, non è uno scherzo.... non riesco a pensare a niente di piu serio di una corretta nomenclatura... tutto ciò di buono che possiamo fare o saper fare diventa inutilizzabile se non sappiamo dargli il giusto nome, corretto nel giusto contesto, e se non abbiamo il coraggio di cambiarlo (refactoring anyone?) nel caso diventi osboleto o scorretto.

Classi, variabili, metodi, proprietà, tutto il "mondo" dello sviluppo si disloca intorno a questo.. .eppure siamo nel 2007, molto è passato dai tempi della "niu economi" (new economy, per i non angolofoni :P)... eppure tutto continua uguale, ci sono ancora in giro masse di "consulenti" che convinti di poter servire a piene mani tazze di presunta conoscenza a tutti si mettono a scrivere un progetto ignorando, o peggio rigettando, le convenzioni di nomenclatura, di struttura e di qualsivoglia altro standard preso in considerazione dal Team....

Peggio, ignorano qualsiasi semplice regola di buon senso chiamando variabili con i nomi che giustamente sono sconsigliati dai tempi del Modula2: "p", "c", "l", "m", "k", "ciccio", "questo", "quello" "test", "temp".

Ho avuto un'esperienza insieme sconvolgente e divertente questo weekend cercando di rimettere in piedi un'applicativo gestito da uno di questi "tizi"... e fidatevi, quando alle 3 di notte vi trovate di fronte a (dopo 100 righe di codice in un metodo nel presentation layer, ovviamente)

if (p > l) { k = 0} else { return false; }
return true;

(testuali parole. Si, avete letto bene.. e si, esatto, _oltretutto_, k non viene mai usata... :P)
Potreste capire quanto lodare il dio dell'informatica per l'idea delle naming convention... oppure scoppiare a piangere e prendere il decimo caffè... com'è successo a me :P

Ma dai, vi immaginate se ognuno parlasse la sua lingua,  con i propri fonemi, e non ci fosse in giro niente per capire di che cosa si sta parlando? Ecco, esattamente quello che succede quando si mette mano ad un codice dove i metodi si chiamano "private void Doing()" o "private string parametro()" e dove nulla va come vorresti :(

Se leggendomi vi siete identificati o avete passato in produzione del codice con dentro almeno uno dei nomi che ho citato, per favore, PER FAVORE, fate un salto qui

http://msdn2.microsoft.com/en-us/library/xzf533w0(vs.71).aspx

Leggete TUTTO quello che c'è scritto, poi rileggetelo, poi andate a fare una passeggiata, cancellate tutti i vostri vecchi progetti, rileggete ancora una terza volta... e ricominciate una nuova vita :)

P.S.: Si,  ho passato una settimana _terrificante_ a causa di questo :P

[Daily Issue] Non avere fretta....

Lo vedo capitare sempre, ogni giorno, in tutto quello che faccio.

Gente che pur di fare un passaggio in produzione al millimetro lo fa alle 8 di sera di venerdi, e nel week end puntualmente si inchioda tutto, gente che se ne va a casa lasciando modifiche nel codice non testate senza nemmeno preoccuparsi del fatto che dovrà essere rilasciato tutto l'indomani, gente che dichiara chiuso un progetto perchè "funziona" e poi scatta alla macchinetta del caffè... ma non funziona, e non funzionerà mai ....

Capisco perfettamente la voglia di fare altro, di svago, di essere in altri posti soprattutto quando è estate fuori gli uccellini cinguettano e magari è anche pieno di ... hem.. belle signorine :D

Ma un lavoro fa controllato, fatto con calma e portato a termine. Con calma non dico che ci devo mettere tre giorni per creare una textbox, ma ogni cosa dev'essere fatta per bene, ci devo ragionare, devo avere in ogni momento il controllo dell'applicativo e non farmi trascinare da questo. Ho visto funzionalità utile rese inutilizzabili per il fatto che "eh ma questo era stato chiesto, non è specificato che l'area di testo per editare deve contenere i pulsanti per la formattazione e dev'essere piu grande di 100*200" oppure che "ma dai, che cosa ti serve evitare che la pagina si refreshi interamente? sono solo 43243433242432 dati.... ci mette 10 secondi ... vedi?"...

Vi prego... quando fate qualcosa, qualsiasi cosa.... pensate che ci siate voi dall'altra parte ad usarlo... e pensate se vi piacerebbe lavorare così... e se siete in dubbio.. chiedete, non ho mai trovato un cliente al mondo, anche tra quelli più "burocratici" che si lamenta se gli faccio delle considerazioni di usabilità su quello che ha chiesto!!

Fa sorridere però che capita in tuttii i campi, anche con le macchine.. oggi ho ritirato la macchina per la revisione e altre piccolezze e mi sono trovato la plancia che usciva fuori di mezzo dito... "Ah si sono dimenticati di fissarla".. esticaXXi... è giusto la prima cosa che si vede entrando... ma chi l'ha guidata fino al parcheggio esterno? Stevie Wonder???

Blog: Here we are...

Ok, è una prima versione, vedo ancora un pò di piccoli bug, ma sulla mia installazione privata di SubText si comporta bene da un paio di giorni, quindi mi sono deciso a rendere live il mio nuovo blog!

Esasperato da alcuni problemi delle skin di SubText, del fatto che alcune siano buggate, altre disegnate male o vecchie, altre ancora dal dubbio gusto estetico, e quelle poche belle che ci sono le usano tutti e quindi sono inflazionate (si lo so sono un rompiballe :P), mi sono deciso a crearmi il "mio" blog con la "mia" skin , che mi rappresentasse meglio ....

Così mi sono armato di pazienza e CSS ed ho deciso di fare una prova drastica: ho impostato la skin "naked" (provate a farlo se avete il coraggio :P) e mi sono messo a skinnare tutto a colpi di Custom CSS ... purtroppo era l'unico modo per avere una skin "quasi" come volevo io partendo da zero.

Dico "quasi" perchè molte cose le cambierei, ma per due giorni di lavoro per ora va piu che bene :)

4 Comments Filed Under [ UGIdotNET ]
Blog: Work in progress...

Molti di voi si saranno accorti che il mio blog risulta.. hem.. scoordinato in questo periodo :)

Questo perchè le skin a disposizione di subtext fanno schifo e/o sono buggate.

Quindi, sto ricostruendo da zero il mio blog, partendo dalla skin Naked che come magari sapete, non ha nulla, a colpi di CustomCss....

Il lavoro è lungo e come sapete sono sempre in cronica mancanza di tempo (sigh infatti sono le 21 e ancora non ho mangiato.. come al solito.. .:( )

Comunque vi prometto che il blog sarà online con la grafica migliore... per ora credo che tornerò al mio vecchio green :)

One Comment Filed Under [ UGIdotNET ]
MVP Open Days 2007....

Che dire.. grazie di cuore a tutti!

E' stata la mia "prima esperienza"... ma è stata decisamente positiva! Ottima l'organizzazione, ottima la cena, ottimo il vino della cena (mannaggia a te Ale, io che non dovevo bere :P) ... ottima la notte con l'xbox, ottima la possibilità di "far sentire la propria voce".... direi che questa, fin'ora, è stata l'esperienza migliore del "Mondo MVP". :)

Un abbraccio a tutti ed alla prossima!

 

One Comment Filed Under [ Conferenze ]