marzo 2007 Entries
Programming Top 10 Lists....

Stavo leggendo questo interessante post su Coding Horror riguardo le 6 migliori "Top Ten della programmazione"....

Qual'è secondo voi la voce piu importante tra tutte queste?  Io punto su You are not your code:

My ego is not tied to my "perfect" or "imperfect" work product. My ego is only tied to my attempts to do the best job I know how, and to learn from my mistakes, not the initial result of my work.

Secondo me questo è _sacro_, troppo spesso vedo sviluppatori tanto attaccati al proprio codice da non riuscire non solo a fare un banale refactoring, ma neanche ad ammettere l'evidenza dei fatti, e cioè che quello che è stato scritto è incapace di risolvere il problema!

Add Comment Filed Under [ Other .NET ]
[Daily Issue] Controllare il rendering degli asp:Controls - Parte 2

Ecco il seguito della prima parte, in cui svelo effettivamente l'implementazione :)

Come discusso nei commenti con Adrian, ho preferito ereditare la DataGrid (si, era un progetto 1.1) e implementare nell'override del metodo Render un modo per levare spazi e caratteri non voluti, piuttosto che scrivere un HttpModule che facesse lo sporco lavoro, perchè:

1: Questa cosa mi interessava solo in certi punti con veramente tanti movimenti. In altri, preferisco comunque avere un output Html "leggibile"
2: Comunque, il benefit di eliminare gli a-capo nelle altre parti non era preponderante (ballavano 50/100k massimo)
3: Piu importante: molti script JavaScript di terze parti smettono di funzionare se messi su una riga (sigh....)

Quindi, quello che ho fatto su due piedi è appunto eseguire l'override del Render, renderizzare il controllo in un mio StringBuilder da cui poi levo gli spazi e i tab, per ripassarlo indietro nell'HtmlTextWriter originale.

Tradotto in codice: ho creato un mio oggetto che eredita da DataGrid

public class LightDataGrid : DataGrid

Quindi ho reimplementato il render perchè facesse quello che volevo:

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
StringWriter swr = new StringWriter(sb);
HtmlTextWriter hwr = new HtmlTextWriter(swr);
base.Render (hwr); 

sb.Replace(Environment.NewLine,string.Empty);
sb.Replace("\t",string.Empty);

string html = sb.ToString();
writer.Write (html);
}

L'unica pecca è che non conosco un equivalente di Environment.NewLine per evidenziare i Tab ed ho dovuto mettere un \t.... quando ho tempo cerco se c'è qualcosa....

Add Comment Filed Under [ Weekly Issues ]
Mi tocca spostare il Daily Issue... alla mattina :)

Come si dice, man mano che si fa una cosa, si impara a migliorarla...

Ho iniziato da poco l'avventura del Daily Issue ma già mi accorgo che la sera non è il momento migliore per scriverlo. Può succedere (come oggi) che il lavoro mi trascini fino a tardi, perchè uscito dal cliente devo fare delle cose per un altro cliente, e senza che te ne accorgi si fanno le 9.. .ma tu avevi un appuntamento alle 9 e 45 e devi ancora andare a casa a farti la doccia...

Insomma, la sera si è spesso troppo di fretta, oppure (come ieri) il codice che vorresti mostrare è troppo acerbo, oppure è troppo tardi per avere capacità dialettiche appropiate, oppure... insomma, da oggi sposterò il mio Daily Issue di mattina, momento in cui ho più calma, e soprattutto o ripensato a quello che ho fatto il giorno prima durante la serata e l'ho messo a posto/approvato.

A domani :)

Add Comment Filed Under [ Weekly Issues ]
Using LINQ to solve puzzles...

Beh che dire... è bello il reale utilizzo pratico... tipo il sapientino... impara divertendoti ;)

http://weblogs.asp.net/fmarguerie/archive/2007/03/28/using-linq-to-solve-puzzles.aspx

Add Comment Filed Under [ Other .NET ]
[Daily Issue] Controllare il rendering degli asp:Controls - Parte 1

Il cliente ha sempre ragione...

Anche quando vuole visualizzare 10.000 righe di dati senza paginazione... e poi si lamenta che il browser si incarta....

Questi ed altri problemi ci possono far girare le scatole.. perchè far sottostare l'applicativo a delle logiche palesemente "sbagliate" è molto poco agile... e molto poco intelligente ( IM(very)HO, se devi fare inquiry su 10.000 movimenti, usi i reporting services... se devi fare operatività su 10.000 movimenti.. metti un pulsante massivo, e fai vedere il dettaglio solo se _veramente_ ti serve, perchè non ci credo che tu nella maggior parte dei casi ti andrai a passare tutti i 10.000 movimenti per autorizzarne 9999 e escluderne uno.....)

Il problema di base è che non tutti i clienti possono essere agili... anzi ce ne saranno sempre molti (soprattutto i pregressi, soprattutto se i pregressi sono banche o assicurazioni o grosse case automobilistiche....) che oltre che non essere per niente Agili sono legati a doppia mandata a schemi mentali vecchi e piuttosto che accettare un cambiamento si fanno tagliare le gambe... o le tagliano a noi....

Però, noi (voi? :P) siamo sviluppatori coscienziosi, ed uno sviluppatore coscienzioso tenta anche l'impossibile, o meglio il "poco utile", nel mio caso mi sono accorto che la richiesta era senza senso, ma effettivamente l'output della DataGrid era troppo verbose, nel senso che andava a capo un pò troppo spesso e metteva un pò troppi tab. questo, su 10.000 movimenti, generava 10 mega (10.000 Kb circa, 10.000.000 bytes circa) di spazi .... risultando in una pagina di 12Mega....

Senza stare li a fare voli pindarici, in quando scardinare un progetto pregresso di queste dimensioni può risultare un suicidio, la soluzione piu semplice che ho trovato è stata ereditare la DataGrid in un mio controllo e intervenire nel rendering per levare i caratteri che non mi servono.... Risultato: da 12 mega a 2 mega.... circa, rimane il viewstate, ma quello è un'altro discorso :)

L'implementazione del tutto ... a domani! :) Il codice oggi funziona ma è un pò raffazzonato ed io devo correre da Leroy Merlin a prendere la finta pietra per la casa e un nuovo rullo per finire di vernicare :)

6 Comments Filed Under [ Weekly Issues ]
Classi statiche: non fatevi tentare....

Volevo scrivere un mio post sul perchè le classi statiche sono spesso piu una fatica che un guadagno, ma non riesce a venirmi fuori come vorrei... quindi beh, mi appoggio a chi è più autorevole di me ... :)

http://www.thoughtshapes.com/Blog/?p=13

Edit: mi hanno fatto notare che "post apposta" fa schifo... lo cambio ;)

Add Comment Filed Under [ Other .NET ]
[Daily Issue] La Sindrome Del Coniglio Bianco.... ma è vera... ??

Sono in ritardo, sono in ritardo, sono sempre in ritardo....
Tutti o quasi i gruppi di lavoro delle società con cui sto collaborando in questo periodo hanno sempre lo stesso cronico problema... ed anche io l'ho avuto certe volte....

.... e mi chiedo, ma il ritardo c'è veramente, o ce lo creiamo noi? O ce lo crea il "management"? Oppure tutte e due le cose, gli screzi col management sono tali che "esso" (non so se personificarlo o meno) ci impone dei tempi impossibili e noi, per tutta ripicca, non evidenziamo che sono impossibili e ce la prendiamo ancora piu comoda, forti del fatto che poi tanto potremo evidenziare la loro obiettiva impossibilità a chi sta sopra il management....

Mi sento molto Luka, ma sono solo io a pensare che non possono esistere gli sviluppatori senza il management così come non può esistere il management senza gli sviluppatori? Sono l'unico a pensare che il concetto di "gruppo" va oltre l'idea della setta di sviluppatori, fino a comprendere l'architetto, il project manager, il CIO... se sei parecchio Agile anche il cliente finale diventa quasi parte del gruppo....

A quel punto tutto smette di essere una continua corsa a scaricare il barile e diventa quello che dovrebbe essere: la costruzione di qualcosa di bello, utile, che funzioni, che faccia felice il cliente e che renda orgoglioso chi ci ha lavorato.... e sicuro che quando qualcosa viene creato così, c'è anche il ritorno economico che si aspetta chi dall'alto "caccia i soldi"!

Sorry, niente tecnicismi oggi, ma per l'ennesima volta mi sono dovuto scontrare contro all'idea del prodotto software come cosa da finire subito e poi andare su YouTube a vedere se c'è qualche video nuovo, il tutto possibilmente con il minimo di responsabilità sia per lo sviluppatore sia per il management (del tipo che il cliente chiama con un problema e tutti a dire "no non è colpa mia"....)

L'amarezza che traspare deriva dal fatto che come ogni giorno sento con l'orecchio-radar gli altri gruppi avere queste "idee" e, una volta ogni tanto, quando proprio la situazione si fa insostenibile, vengono da me e mi chiedono consigli... in quel caso, non mandarli a donne di facili costumi è probabilmente il mio piu grande Daily Issue ... :)

One Comment Filed Under [ Weekly Issues ]
[Daily Issue] GetPostBackClientEvent per simulare una postback

Molto spesso in ASP.NET capita di dover simulare il click di un Button/LinkButton/ImageButton/Etc per tutta una serie di motivi.
Troppo spesso, negli esempi che vedo su internet vedo che si scrive a manina un richiamo alla funzione __doPostBack (JavaScript) forzando l'id del controllo e gli eventuali argomenti.
Questa cosa non mi piace per nulla ed oltretutto è passibile di errori: qualsiasi service pack del framework _potrebbe_ cambiare il metodo e quindi vanificare i nostri progetti. Per avere sempre la referenza corretta, consiglio di utilizzare GetPostBackClientEvent, che viene esposto dalla classe Page, ed accetta un oggetto di tipo Control (quindi il Button, LinkButton, ImageButton di cui dovete simulare il click) ed eventuali parametri.

Attenzione che accetta un oggetto generico, che non deve per forza essere presente nella pagina! Se per esempio (come mi è successo) dovete da un PopUp prendere l'opener e simulare la PostBack (nel mio caso per fare ricaricare i dati), potete istanziare un nuovo bottone nel codebehind del popup, dagli come ID quello del LinkButton/Button etc dell'opener che volete simulare, e passarlo al metodo GetPostBackClientEvent: questo non farà una piega e vi restituirà il javascript corretto!

Una variante è GetPostBackClientHyperLink: non fa nient'altro che aggiungere "javascript:" prima della chiamata al metodo Javascript __doPostBack, in modo che se volete integrarlo all'interno di un hyperlink potete farlo senza problemi!

 

2 Comments Filed Under [ ASP.NET Weekly Issues ]
[Daily Issue] Inizio di una serie....

Ho sempre avuto problemi di "costanza".... nel senso che in tutto ciò che non sia lavoro, dopo un pò mi faccio prendere (dal lavoro appunto :( ) e metto da parte il resto... questo vale tendenzialmente per tutto tranne che per i miei esercizi (che faccio di prima mattina) e per la mia vita sociale post-lavoro (che parte da quando finisco, di solito non prima delle 8/9, e va ad oltranza ... ;) )
Purtroppo, ho questi problemi di costanza anche col Blog... ora è un buon periodo, e riesco a seguirlo, ho paura che, visti anche alcuni nuovi clienti che sto avendo, pian piano perda costanza....

Quindi, tutta sta manfrina iniziale è per introdurre una mia idea(ona? :P): per cercare di annullare questo effetto, cercherò di far diventare il blog un "lavoro"! Quindi, parte oggi la serie "Daily Issue", ossia "il problema della giornata": un report giorno per giorno (praticamente, magari qualche giorno salto se sono in giro o se non ho lavorato :))  di un problema che ho avuto nell'odierna giornata lavorativa, può essere una cavolata che mi ha fatto perdere un'ora perchè ero distratto, o può essere un effettivo problema che mi lascia perplesso... oppure bachi del framework, bachi nella testa del cliente, bachi nella mia o del management dell'azienda per cui lavoro.... .insomma, un modo per condividere con la community giorno per giorno le mie esperienza...

... ed anche per sfidare me stesso! Vedremo come andrà a finire :)

Fatemi in bocca al lupo :P

2 Comments Filed Under [ Weekly Issues ]
Forzare il "save as" anche con i tipi di file conosciuti

Molto spesso mi è capitato di forzare la dialog del "save as" per esempio con i PDF, per evitare che mi aprisse il reader embedded all'interno del browser.
Volevo scrivere la mia soluzione, ma visto che è praticamente uguale a questa, vi posto direttamente il link :)

Link: Forcing an "Open, Save" dialog on know file types

Update: il link alla pagina diretta ogni tanto si incastra, credo che sia un problema di un plugin all'interno del sito...
L'ho cambiato con il link al riassunto del giorno!

One Comment Filed Under [ ASP.NET ]
ASP.NET Quick Tips

Segnalo dal blog di Scott Water(etc) una serie di tips sull'utilizzo di ASP.NET con problematiche quali caching, web.config, stato e altro...

http://scottwater.com/blog/archive/tags/asp.net+tips/

Non è molto recente, ma se non l'avete fatto sempre meglio dargli una letta: io ho scoperto un paio di cavolate cui proprio non pensavo :)

Add Comment Filed Under [ ASP.NET ]
HttpCookieCollection una collezione di... stringhe??

Ieri sera stavamo facendo dei test e mi sono imbattuto in un simpatico errore

"Unable to cast object of type 'System.String' to type 'System.Web.HttpCookie'"

L'errore era dato su una riga che per me era assolutamente innocua:

foreach (HttpCookie cookie in cookies)

(dove "cookies" è di tipo HttpCookieCollection).

Preso dallo sconforto, ho iniziato a guardare in giro, mi sono ricordato che l'implementazione del foreach non è una scienza esatta e mi sono lanciato su un for:

for (int i=0; i<=cookies.Count;i++)
{
      HttpCookie cookie = cookies[i];
      ......

Ed ovviamente tutto funzionava.....

Testa che ti ritesta (e che ti rigira) viene fuori che HttpCookieCollection nel foreach restituisce un'array ... di stringhe! Praticamente ti serve il GetAllKeys con cui poi ti devi andare a recuperare il cookie....
Quindi, visto che nel progetto ho sempre usato il foreach dove possibile, ho cambiato il tutto in:

foreach (string cookieName in cookies)
{
      HttpCookie cookie = cookies[cookieName];
      ......

Ora però l'unico dubbio che mi rimane è.... ma perchè mai non esporre direttamente oggetti HttpCookie? C'è qualche limite logico che mi sfugge??

Yet Another Thread On Leaked Connections....

Eh si, capita ancora... siamo nel 2007,  esiste IDisposable, esiste il Finally... eppure ci sono ancora problemi di Leaked Connection... soprattutto in 2003... caso vuole che in questi ultimi due giorni ne abbia avuti due, quindi posto qui un interessante articolo vecchio e stravecchio (sempre il caso vuole che un post sul NG mi riportasse a leggerlo proprio oggi, dopo anni che non lo vedevo :)) che spiega un pò le varie possibilità di connection leak... e soprattutto i vari casi in cui può succedere NON per problemi di close ....

Qui il link:
http://blogs.msdn.com/angelsb/archive/2004/08/25/220333.aspx

Beh... Se qualcuno ha problemi di Memory Leak con ASP.NET 1.1... ci faccia un giro :)

Add Comment Filed Under [ ASP.NET ]
[OT] Tales of Controsoffitting.... ossia dove sono stato negli ultimi tre mesi :)

Ok, per rispondere alla saga di Mrkino riguardo la sua casa, finalmente posso svelare dove sono sparito da gennaio fino ad oggi: a costriuirmi il controsoffitto!!!!  :)
Si lo so me lo sarei potuto far fare da qualcuno spendendo qualche migliaio di euro, ma vuoi mettere la soddisfazione di farlo da solo? :P

Questa lunga saga è partita il 7 gennaio, data della prima foto, e si è conclusa ieri con l'ultimo capitolo, ossia la pittura.
Per scaramanzia, non ho postato le varie fasi sul blog, ma ho tenuto un reportage fotografico che ho messo in un'apposita gallery.
Le gallery sono strutturate un pò a muzzo.. cmq l'ordine cronologico è "per colonne" (e cmq ci sono i tooltip :))

Tutti i lavori (tranne un pezzo della fase 3 e la fase 4) sono stati eseguiti rigorosamente da solo e rigorosamente in ogni week end/serata libera da gennaio ad oggi.
Da notare che nelle foto ci sono in giro letti/scrivanie/abiti etc... questo perchè per tutta la durata dei lavori io _già abitavo_ nell'appartamento... vi lascio immaginare le mie serate tristi a pulire tutto quello che avevo sporcato durante il giorno... sigh... :(

Sono illustrate:

Fase 1: inserimento dei fisher (tasselli) a soffitto (non immaginate il trapano a percussione quanto poco aiuti se il soffitto è di calcestruzzo... sighh)
Fase 2: Montaggio dei profili di metallo (la parte peggiore da fare da soli, i profili sono lunghi tre metri! Ci ho messo un sacco...)
Fase 3: Montaggio del cartongesso ed impianto elettrico (nessun problema per l'impianto, il montaggio è impossibile da fare da soli. le lastre sono troppo pesanti! Mi sono fatto aiutare :)
Fase 4: Stuccatura (eh si, qui ho pagato lo stuccatore :P)
Fase 5: Pittura (con tutti quei movimenti, due palle!!)

Ora che il controsoffitto è finalmente finito, e devo dire che ne sono soddisfatto, partirà la seconda parte: Parquet e pareti!! Aprirò una galleria apposta :P

5 Comments Filed Under [ House ]
Are you making a difference?

Vedo che ci sono ancora molti dei miei contatti che non lo fanno...
Io lo posto qui, nella speranza di vederne sempre di piu :)

http://im.live.com/Messenger/IM/Home/

3 Comments Filed Under [ UGIdotNET ]
[OT?] Inc**ator Pattern

Segnalo un ottimo pattern (behavioural??) che ho avuto modo di apprezzare a cena con Daniele, Ricky, Andrea, Raf, Massimiliano e Ugo....
Vi rimando direttamente al blog di quest'ultimo per l'implementazione :)
http://blogs.aspitalia.com/imperugo/post1938/Inculetor-Pattern.aspx

... Spero che a Seattle lo stiano utilizzando a profusione :P

 

5 Comments Filed Under [ Conferenze ]
Controllare i figli di un qualsiasi oggetto del DOM tramite JavaScript

Mi è capitato per differenti motivi di avere dei rapporti di amore/odio con il DOM, in quanto la documentazione non sempre è completa e a volte frammentaria, soprattutto quando devo tramite javascript andare a scavare negli oggetti complessi come può essere una datagrid.

Ho trovato questa funzioncina che, passato un oggetto, permette di stamparne in una nuova finestra tutte le proprietà e gli eventuali oggetti figli. In questo modo, quando sono di fretta, posso avere sotto mano le possibilità dell'oggetto che mi interessa e man mano navigarne i figli fino ad arrivare a quello che mi serve. Lo so, molto "sbaglia e impara"... ma ogni tanto funziona :P

function popUpProperties(inobj) { op = window.open(); op.document.open('text/plain'); for (objprop in inobj) { op.document.write(objprop + ' => ' + inobj[objprop] + '\n'); } op.document.close(); }
Poste italiane: dico la mia (ma dal lato informatico...)

Pur non avendo partecipato molto al blog in questi ultimi mesi, ho sempre letto il muro (alla faccia delle critiche :P) e ho visto un sacco di post che parlano dei problemi delle poste italiane....
Oggi, ho avuto un bello scontro con le poste del mio ex-paese (Bollate), che sfocia nel ridicolo: ho presentato domanda per il servizio Seguimi, che praticamente ti permette di girare la posta ad un nuovo indirizzo nel caso di trasferimenti o spostamenti. Ho compilato un bel modulo fatto apposta (di quelli che si vede lontano un chilometro che sono stampati per essere dati in pasto ad un elaboratore elettronico), e giustamente dopo due mesi dalla richiesta... la posta continua ad arrivare al vecchio indirizzo....

Mi informo, e scopro una bellissima chicca: il problema è che l'indirizzo vecchio ha la portineria, quindi la posta veniva trappata dalla portineria e li rimaneva... cosa vuol dire? Vuol dire che io credevo (nella mia ignoranza) che il modulo elettronico servisse a avvisare il sistema informatico centrale delle poste di recapitare le mie lettere invece che a bollate direttamente all'ufficio di competenza... invece NO! La richiesta serve per avvisare LA PORTALETTERE che se tra le sue buste ce n'è una per me, la deve reinviare all'ufficio di competenza. Peggio, se tra le sue BUSTE RIMASTE, cioè quelle di cui non ha trovato la casella, ce n'è una per me, allora la reindirizza.... sono scemo io o mi sembra uno dei sistemi piu stupidi per gestire questo genere di problemi??

Oggi comunque ho risolto la cosa in maniera assolutamente tecnologica ed avanzata... un APPUNTO scritto a PENNA sulla tasklist della portalettere ed una discussione con la stessa ("guarda questo è il signor ghizzardi la sua posta non la devi dare in portineria ma spedire qui").... ma ora mi chiedo.. e se la postina si ammala??? sigh....

[OT] Forse la luce...
Ebbene si, dopo eoni torno a scrivere! Giusto per dire che oggi se tutto va bene dovrebbe concludersi la serie di lavori pesanti nella mia nuova casina (sic...) e che quindi spero di riuscire da oggi ad organizzarla per bene... tipo mettere il parquet ed un letto serio :P Un saluto a tutti... e vista l'aria che tira ultimamente... beh, scusate l'OT ... :P
One Comment Filed Under [ UGIdotNET ]