Claudio Brotto

aprile 2007 - Posts

Per favore distanziate i button :-(

O forse è meglio che torni dall'oculista per una controllatina.

Stavo facendo debug su una macchina (fisica) Win2K3, attach al processo w3wp.exe ... non c'è ... ah già, check "show processes from all users" e un bel refresh ... oops ... mi è scappato un attach.

Lo so che non sono proprio adiacenti, che devo dire ...

Solo che il primo processo nella lista era csrss.exe

del Linq2Entities.*

Così si dice ...

TheEntityFramework® non sarà riasciato con Orcas.

Il titolo di questo post è volutamente ambiguo. Due le interpretazioni:

  • del = delay. Dall'annuncio by The Microsoft Data Blog ciò che traspare (per meglio dire, il tono del post) è semplicemente un posticipo della release, che seguirà comunque Orcas con update immediatamente successivi (e che continueremo a trovare nelle CTP da qui al 2008)
  • del = delete. E' forse l'auspicio di molti :)))

Dura la vita per gli early-adopters, neh ?

[OT] Sottofondo

Si lavora. Pensavo sarebbe stato solo un sottofondo. Per una volta, però, è andato in sottofondo tutto il resto.

Damien Rice - Eskimo: I find myself disposed

Franco Battiato - La Cura: Ti salverò dalle tue malinconie

Cocteau Twins - Seekers who are Lovers: Love on the tip of it

Noir Désir - Bouquet de Nerfs: T'oublies or not t'oublies

Moody Blues - QuestionTo learn as we grow old the secrets of our souls

I link sono a YouTube, la frase è tratta dalla canzone.

Posted: apr 28 2007, 12.10 by devlizard | with no comments
Filed under:
Per chi si dimentica di levare debug=true in produzione

Vita dura per il povero (!) sviluppatore che si dimentica (più o meno apposta) di fare il deploy di una web application con l'attributo <compilation debug="false" />.

Nel machine.config (e non sotto, quindi niente override, sorry :-)) è possibile utilizzare la configuration section deployment ed impostare l'attributo retail a true (vale solo per ASP.NET 2.0):

<system.web>
  <deployment retail="true" />
</system.web>

Così facendo vengono disabilitati, ad esempio, il trace output a livello di pagina e spazzati via (diciamo ignorati) tutti i debug=true delle varie web application attive sul server.

Qui c'è il link ad un'esaustiva documentazione :-(

 

Update:

Googlando un po', ecco i post di ScottGu e DinoEs

Posted: apr 27 2007, 10.27 by devlizard | with no comments
Filed under:
SharePoint for Hosters

Ho appena finito di scaricare (e mi appresto ad installare) il WSS Solution Kit, disponibile su CodePlex (come msi e ovviamente anche con i sorgenti).

Cos'è ?

<quote mode="on">

The Solution Kit is composed of two integrated applications. The first is the Solution Configurator which is a tool that Hosters can use to configure solutions based on WSS templates. The second is the StarterKit which your customers can use to build a site based on solutions that were created using the Solution Configurator.

</quote>

Sul sito del progetto trovate una descrizione poco più dettagliata di questa. La guida di installazione, invece, entra un pochino più nel dettaglio.

Posted: apr 27 2007, 09.58 by devlizard | with no comments
Filed under:
LINQ to SharePoint

Chi ha seguito "The IQueryable Tales" ?

Sottotitolo: come scrivere un query provider per LINQ, e già che ci siamo facciamolo pure verso qualcosa di abbastanza usato :-) ... che so ... LDAP !

Girovagavo un po' sul blog di Bart De Smeth e guarda un po' ora cosa ti sforna ?

Un bel LINQ to CAML, no ? (Qui il progetto su CodePlex).

Caspiterina.

Ma che 'sto LINQ quindi non sia solo una maniera di scrivere SQL in C# ????

MCT, ha senso ? (2 anni dopo)

Oggi mi è arrivata la conferma del rinnovo MCT (e tre :)).

Con il solito ritardo che mi contraddistingue (applicazione avviata ieri, sigh sob).

Un po' di tempo fa mi chiedevo se avesse senso conseguire questa certificazione.

Ora mi sento di poter esprimere anche la mia opinione sulla base dell'esperienza di questi anni. E, in fondo, di dare la mia risposta a quelle domande.

E' un discorso un po' articolato perchè tocca diversi punti, anche piuttosto eterogenei.

Ecco come la penso.

Il lavoro.

Non puoi dirti un bravo docente solo perchè hai il diritto legale di mettere un logo sul biglietto da visita. Banale, se volete, ma vale la pena rimarcarlo.

Premessa conclusa.

Ma quel "logo" serve a qualcosa, quindi ?

C'è una risposta tecnica ed una di opportunità.

Tecnicamente parlando, i percorsi didattici che Microsoft ha sviluppato tendenzialmente richiedono questa certificazione. I corsi MOC, col materiale MOC, il bollino MOC e il cappellino MOC, possono essere erogati solo da un MOC ... oops, sorry, da un docente certificato. MCT, appunto.

Peraltro (e badate che non è così da molto) un trainer è abilitato ad erogare solamente corsi sui quali ha competenze, comprovate dai rispettivi esami di certificazione.

Il che è un bene.

Io non mi sognerei mai di andare a tenere un corso su Active Directory. Conosco l'argomento, quel tanto che mi basta per districarmi nel *mio* mestiere. Ma non sono un esperto di AD. Fidatevi, meglio per voi se non mi vedete in aula a parlare di organizational unit, foreste o quant'altro :-)

Il corollario è che, ovviamente, avendo una qualifica adeguata le opportunità di lavoro aumentano, semplicemente per il fatto che alcune di queste non sono accessibili a chi quella qualifica non l'ha conseguita.

Ocho, però. Mi rifaccio alla premessa di alcune righe fa. Personalmente conosco persone che potrebbero spiegarmi nei dettagli i meandri di Active Directory, pur non essendo trainer e non avendo MCSE da scrivere sul curriculum. Come sempre, un conto è la forma, un conto è la sostanza. E come sempre, ricordiamoci che qualsiasi contenuto appreso per bocca di una persona deve prima passare, in qualche modo, dal suo cervello !

Parlando di opportunità ... Sì, beh, le opportunità ci sono. Per lo meno, io ho avuto la fortuna di averle. Ma sono e rimangono opportunità, che poi ti devi "giocare" con le tue carte. E il bigliettino MCT non è l'asso pigliatutto. Diciamo che ti consente l'apertura.

E qui termina il capitolo lavoro. Perchè, appunto, il fatto che tu sia un docente è tutto da dimostrare. Non c'è certificazione che tenga. E non credo neanche che sia una cosa che puoi considerare definitivamente acquisita dopo un po' di pratica.

I benefit.

Ce ne sono diversi.

Sconti su esami, materiale scaricabile, virtual machine già confezionate, offerte di acquisto su software di vario genere.

Onestamente credo che basterebbero questi a giustificare il costo di una certificazione MCT.

Ah, sì, a proposito. Si paga. Annualmente, per il rinnovo. Lo scrivo piccolo piccolo come fosse una clausola rescissoria nascosta nel politichese.

Un piccolo pensiero sulle licenze gratuite a disposizione dei trainer.

Credo che sia un valore aggiunto importante, ma ... pericoloso.

Perchè è facile fare la somma e sentirsi dire: "ti danno una licenza gratis così parli bene del prodotto durante i corsi opportuni e la gente compra".

Per carità, non dico che questo non accada mai.

Però dipende dalle persone, dalla loro correttezza e dalla loro onestà. E questo credo abbia un peso *piuttosto elevato* nella faccenda, no ?

La community.

Ho in mente un post di Lorenzo Barbieri a tal proposito.

Due considerazioni.

Da due anni a questa parte ho conosciuto diversi MCT realmente in gamba.

Oggettivamente, non li ho conosciuti a nessun meeting. Ma forse perchè non ho partecipato ? Mmmhhh ... in effetti potrebbe anche essere una ragione sufficiente :-))

Semplicemente, però, ci siamo magari trovati a lavorare nello stesso posto. Condividendo non solo il luogo (o il cliente), ma gli obiettivi, le difficoltà, le idee. Concordi o discordi che queste fossero. Non importa, la discussione e il confronto fanno crescere indipendentemente dal risultato.

Sarebbe bello avere una community MCT più attiva ?

Certamente. Qui lo dico e *NON* lo nego. Poi però so che tra 10 minuti, finito di scrivere questo post, torno a lavorare e di nuovo i problemi contingenti ti fanno dimenticare quelli più ad ampio respiro :-(

And the winner is ...

uinner de che ?

Ah, già. Ha senso ? Prendere (o mantentere) questa diavolo di sigla ? Insomma, lo rifarei ?

Sì. Mille volte.

Per le opportunità ? Sicuramente, sarei ipocrita a negarlo. Ma ripeto (per la terza volta, sarà che mi sento particolarmente sensibile su questo punto): si cammina con le proprie gambe ! Liberi di non crederci, ma non è questa la ragione principale della mia risposta.

Per i benefit ? Beh, non fanno mica male ! Ma no, non lo rifarei solo per questo.

The winner is: per le persone.

Tutte le persone ?

Ma dai, non siamo iporciti nemmeno qui !

Per quelle persone che non hanno una maglia. O se volete hanno maglie tutte diverse (non è la stessa cosa ?).

Persone per le quali condividere la conoscenza è il lato bello del loro lavoro.

Anche a costo di rinunciare ai benefit o alle opportunità.

Non sempre il linguaggio migliore è quello giusto

Ammetto di essere in pieno hype da linguaggio.

Cosa che è ulteriormente condita dal fatto che le mie esplorazioni degli ultimi tempi non vanno verso nuovi linguaggi, ma verso nuovi approcci (vedi post di ieri sera).

Trovo che il percorso sia poi sempre lo stesso, o almeno così è stato per me nell'apprendimento di nuove nozioni.

Inizii con i "rudimenti", con la tranquillità di essere ancora in fase primordiale di assimilazione, ed è facile farsi coinvolgere da visioni mistico-allucinogene: il confronto con la pratica non c'è ancora stato, volutamente lo tieni nascosto perchè in fondo è anche bello imparare senza porsi vincoli di applicabilità.

Il gioco ti può prendere di più o di meno (dipende anche dal tempo che puoi dedicare ad un'attività non esattamente produttiva come lo studio-per-gioco, appunto).

Inevitabilmente però il confronto delle "massime teorie" con un contesto pratico (che vada almeno oltre il codice-demo-3-righe-incomprensibili) prima o poi ti tocca affrontarlo.

Uscire dall'accademia ed entrare nel mondo reale è un passo gigantesco.

Necessario ? Magari non lo fosse !

Difficile ? Di sicuro ! Aumentano i fattori di cui tenere conto (tra cui il vil denaro non è esattamente ininfluente). E se cambiano le condizioni, beh, evidentemente può cambiare il risultato, no ?

Scrivo tutto questo perchè, parlando di "distruggere per ricostruire", la cosa si fa un po' complessa in un contesto non solamente accademico.

Distruggere (virtualmente) il mio modo di pensare ... sì, lo posso fare.

Distruggere (virtualmente) il modo di pensare dei 40 sviluppatori che sono dietro ad un progetto in scadenza ... mmmhh ...

Detto così è scontato.

Mettetela in questo modo: quali sono i parametri sulla base dei quali valutate l'efficacia di una linguaggio di programmazione o, più in generale, di una piattaforma di sviluppo ?

Prendete un linguaggio, una tecnologia, una piattaforma, insomma, qualcosa di nuovo, rivoluzionario e soprattutto estremamente "diverso" nella filosofia e nell'approccio.

Magari è perfetto. Magari è efficiente. Magari è *la* soluzione che mi fa fare le cose in 1 giorno invece che in una settimana.

Ma io sono il Teorico.

Per me questioni tipo investimento, prospettiva, concretezza, costi, ROI ... passano tutti in secondo piano di fronte all'innovazione, all'espressività, perfino all'eleganza di un blocco di codice.

E non è detto che le cose coincidano.

Siiigggghhhhh :-(

Dialogo fra il Teorico e il Pratico

T. Hei guarda cosa ho fatto stanotte !

mostra 10 righe di codice incomprensibile perfino all'autore del linguaggio, tutto fiero

P. Eeehhhh ?!!! Cos'è ?

T. Una soluzione per quel problema del calcolo dell'approssimazione della deviazione della radice della media del sistema X.

P. Ah, il sistema X. Ma dai ! Tutto qui ? Ma non avevamo scritto quelle 10 classi per risolvere la cosa ?

T. Sì sì, ma sai, così ... mi sono messo lì a sperimentare un po'.  Guarda ...

spiega in 10 minuti ciò che è così chiaro nella sua testa ma così poco semplice da illustrare

P. Senti, mi fido, non ci ho capito molto ma ... Ma questa cosa è gratis ?

T. Sì. E' ancora una beta, anzi, in realtà non è ancora neanche una beta, ma dicono che dovrebbe uscire una CTP più completa fra 2 giorni.

P. Ma quindi non è supportata.

T. Ci stanno lavorando.

P. Ma secondo te quanta gente è in grado di utilizzare questa tecnologia ?

T. Beh ora è ancora presto. Ho avuto il compilatore per vie ufficiose, fai un po' tu ?

P. Ci possiamo pensare come investimento, forse ... Ma senti un po', però, ma ... cosa vuol dire questa virgola qui ?

T. Beh dunque, messa lì dà al token un significato particolare, perchè se l'avessi messa prima invece succedeva che l'espressione [cut. continua per 5 minuti]

P. Ho capito. Cioè, non ho capito niente. Ho capito che ci capisci solo tu qui in mezzo.

T. Ma no dai, sembra complesso, ma alla fine basta prenderci un po' la mano.

P. Sarà, ma io sono 20 anni che programmo, tu è un'ora che mi spieghi una riga di codice e ancora non vedo il nesso tra le istruzioni.

T. Ma perchè devi cambiare mentalità. Non pensare alla classica istruzione, pensa all'essenza dello ying e dello yang.

P. Eeeehhh ? Fammi un po' vedere quel pacchetto di sigarette, che non me la racconti giusta ...

T. Fidati, basta aprire la mente.

P. Appunto.

Posted: apr 18 2007, 11.41 by devlizard | with 1 comment(s)
Filed under:
Thinking Functionally

Scrivo qui una cosa trita e ritrita, di cui ho già parlato in altri post e che è, obiettivamente, un argomento piuttosto caldo in questo momento.

Lato A della cassetta: C# 3.0, introduzione di paradigmi funzionali ad un linguaggio imperativo.

Lato B: F#, un linguaggio funzionale estremamente "spurio" che abbraccia la tecnologia .NET (vi si fonda, più che altro).

Due mondi estremamente distanti, due vie opposte per colmare il divario, dai due estremi.

Osservare l'evoluzione di questi linguaggi è affascinante. Il pane quotidiano di uno è l'obiettivo dell'altro. Ciò che da una parte è nativo diventa, a volte, un'artefizio di sintassi e giochi del compilatore dall'altra.

Così succede anche al modo di "pensare" la programmazione.

Io (come molti, credo) vengo dall'esperienza di linguaggi imperativi.

Il paradigma funzionale è per me oggetto di studio e di interesse (molto). Ma mi rendo conto che l'aver ormai assorbito un modo di pensare mi limita pesantemente quando devo assimilarne un altro. Diverso. Radicalmente.

Il concetto è vecchio come il mondo.

Se mi consentite una divagazione OT nel mondo della letteratura, penso ad un romanzo forse poco noto, che mi ha lasciato un paio di segni profondi: Marabou Stork Nightmares (tradotto in Tolleranza Zero) di Irvine Welsh (quello di Trainspotting).

Andare a fondo per poter poi risalire. Traslato nel contesto, qui è disimparare per apprendere meglio.

N.B. Questo post è stato influenzato da due fattori. Uno di essi, il lato tecnico della cosa, parte da un giro sulla rete con questo punto di arrivo (da cui il titolo, peraltro).

TechSmith Camtasia Studio for Windows Vista

Camtasia è un noto applicativo di screen recording, spesso utilizzato nella registrazione di screencast, webcast, lezioni in formato multimediale, ecc...

Se avete presente quell'iconcina tonda rossa che appare nella tray area del presentatore in molti video online ... beh ... ecco il responsabile.

TechSmith ha recentemente rilasciato un aggiornamento (v4.0.1) che risolve un probema di compatibilità noto su sistemi Windows Vista.

Qui un po' di informazioni.

L'aggiornamento è ovviamente gratuito per chi ha acquistato la major version 4.

Posted: apr 15 2007, 08.10 by devlizard | with no comments
Filed under: ,
GC Deep Summary

Segnale un post, a mio giudizio davvero eccellente, di Vineet Gupta sul Garbage Collector del CLR.

Da prendere, stampare, leggere e memorizzare bene ... ovviamente in seguito ad operazione di pinning al fine di prevenire eventuali rilocazioni dovute alla deframmentazione della (nostra) memoria ;-)

Posted: apr 13 2007, 10.54 by devlizard | with no comments
Filed under:
Optimization.Workshop@UgiDotNet.today

Di rientro dal workshop di oggi, qualche considerazione a semi-caldo.

Innanzitutto un ringraziamento allo staff di Ugi e, più in generale, a chi ha reso possibile l'evento. Che tra parentesi (anzi, niente parentesi !) è stato *gratuito*, e non per questo di bassa qualità, nè di taglio commerciale.

Cosa rimane dalla giornata di oggi ?

Beh, inutile negare che ho scoperto un bel modo per accelerare lo startup di un'applicazione winform ... (chi non c'era capirà da quache prossimo post o dalle registrazioni dell'evento :-)

Poi molti contenuti. A partire dai tool di profiling e code analisys (forse l'argomento che ho trovato più interessante, anche perchè di certo è quello di cui ho meno conoscenza).

Lo scontro titanico tutto sommato non ha visto grosso spargimento di sangue (a meno di emorragie interne di qualche ORM o di qualche DB).

Ecco la mia opinione su un problema piuttosto generale, di sicuro evidenziato molto bene in questa sessione.

Mantenere centralizzate le logiche applicative (termine molto generico, ma ripeto, la considerazione è generale) è estremamente importante. Perciò la scelta della locazione in cui definire tali logiche è fondamentale.

Mi viene da dire che questa scelta ... "dipende" (la risposta più gettonata a qualsiasi domanda). Ma in ogni caso la locazione deve essere condivisa (sennò che centralizzazione è ?)

Dico "dipende" perchè ci sono scenari in cui l'unico punto di condivisione possibile è di fatto lo storage (il database, sì sì).

In questo senso quello che diceva Davide oggi è sacrosanto: i vincoli, l'integrità, anche le regole, se mantenuti in DB, consentono di gestire quelle simpatiche situazioni in cui applicazioni eterogenee (l'una non conosce l'esistenza dell'altra) devono condividere, appunto, i dati. E l'unico punto di contatto che hanno è SQL, con tutte le funzionalità che questo espone. Persistenza. Interrogazione. Lo stesso storage, applicazioni diverse.

Discorso diverso, invece, quando un'applicazione si deve adattare a sistemi di memorizzazione eterogenei (non vuol dire solo SQL vs Oracle, ma anche SQL vs SAP ... giusto per fugare eventuali dubbi del tipo "basta cambiare la connection string"). La stessa applicazione, storage diversi.

Ecco che la parola "dipende" inizia a assumere un senso. L'ennesima banale (ma importante) frase sull'importanza della contestualizzazione.

Chapeau, infine, a Raffaele, che ha sforato di quasi un'ora ma probabilmente poteva rimanere a parlare per qualche mese (e solo di GC, badate bene).

Thnx to All.

COM, AddRef, Release e non fidarsi mai

Leggevo (appena sveglio ... fate voi) questo interessante post che mette a confronto l'utilizzo di CComPtr<> e CComQIPtr<>.

Chi ha lavorato un po' con COM (e non è stato bandito per aver utilizzato gli smart pointers) credo se li ricordi.

Per chi non ha avuto occasione, in breve sono due classi che mascherano al client le semantiche di rilascio degli oggetti (cosa che in COM è esplicita, AddRef e Release sono due metodi di interfaccia esposti da *ogni* oggetto COM, per definizione, e che devono essere richiamati per garantire il corretto life-time dell'oggetto stesso). Il distruttore richiama il metodo Release rendendo, almeno in parte, il meccanismo di gestione della memoria automatico, in quanto il reference counter viene decrementato all'uscita di scope.

Fin qui la mia giornata era normale.

Seguendo un po' di link, però, vado a finire qui e scopro una cosa che realmente non sapevo e che, ripensando ad alcuni pezzi di codice che ho visto (e scritto) in passato mi fa un po ... diciamo pensare, ecco.

Mi riferisco a questa frase delle specifiche di COM (l'articolo è un overview, badate che è del 1995 !).

The return values of AddRef and Release should not be relied upon, and should be used only for debugging purposes.

In altre parole: non è detto che AddRef e Release ritornino il valore corrente del reference counter dell'interfaccia sulla quale sono richiamati. Cosa che invece davo per assodata, e sulla quale temo anche di aver basato qualche logica in qualche applicazione di qualche anno fa.

Mmmhhh ... chissa se qugli strani bug classificati come "ignoti" ...

Posted: apr 11 2007, 07.31 by devlizard | with no comments
Filed under:
Generazione PDB via round-tripping: IL debug made easy

Indubbiamente se abbiamo a disposizione i sorgenti di un'applicazione (magari la nostra :-)) ci sono tecniche più ... comode per effettuare debugging.

Di fatto, non sempre questo è possibile (magari perchè l'applicazione non è la nostra :-)).

Possiamo però semplificarci un minimo la vita. Più di un minimo, a dire il vero, dato che una conoscenza di base di IL non è poi così impossibile da acquisire. E dato anche che il tutto si riassume in uno script da due righe.

Fondamentalmente, si fa un round-tripping 1:1 (senza modifiche tra le due fasi), sfruttando un paio di switch di ildasm e ilasm: si ottiene il codice IL e lo si riassembla facendo generare a ilasm il file PDB contenente i simboli di debug.

Attach to Process et voila.

Tecnica molto interessante, via Jason Haley.

Posted: apr 08 2007, 09.53 by devlizard | with no comments
Filed under:
More Posts Next page »