Il mio codice è un’opera d’arte

Posted 14. luglio 2011 22.07 in Informatica

No…non sono stato preso da una botta di megalomania o di super-narcisismo; purtroppo non ritengo di aver mai scritto algoritmi geniali o routine così ben strutturate da essere definite in quel modo.

Semplicemente un mio piccolo software è diventato parte integrante di un’installazione artistica di videoarte del famoso artista Fabrizio Plessi.

E’ successo infatti che l’amico Walter (che rammento essere –per chi dice che sono un buon fotografo- il mio mentore e la persona che mi ha insegnato piú di tutte, anche solo guardando le sue opere) mi ha coinvolto nello sviluppo di questo progetto consistente in un’altalena di acciaio che muovendosi fa scorrere l'acqua da un serbatoio (virtuale) all'altro. L’opera originale era del 1981 ed i video proiettati da due dvd player avevano ovviamente un forte problema di perdita di sincronismo dopo poche oscillazioni.

image

Il commitment di Altalena 2.0 era quindi di migliorare questo aspetto di sincronismo e, dopo varie elucubrazioni, la strada più semplice (ed economica) ci è sembrata quella di usare un pc con una scheda grafica con due uscite video e un programma che proiettasse sui due monitor due filmati in fullscreen in SINCRO tra di loro e soprattutto con i comandi dati al motore/PLC che fa  muovere la struttura di acciaio arruginito.

Alla fine nulla di fantascientifico, se uno avesse un po’ di esperienza nel mondo Win32 (cosa che a me manca). Mi sono dovuto quindi, con piacere, studiare un po’ di concurrent programming per gestire un po’ di multithreading e risolvere un paio di tricks per il dual display, il full screen, ecc. Inizialmente sono partito con un progetto WPF ma mi sono scontrato con le performance dell’oggetto mediaelement che con due video FullHD non era sufficiente (dopo un po’ uno dei due “driftava” troppo rispetto all’altro). Sicuramente avendo più tempo (e budget!) la cosa presumo fosse risolvibile (magari cambiando solo il controllo da usare), ma per tagliare velocemente la testa al toro ho preferito passare alle care e vecchie WinForms e soprattutto alle librerie DirectShow che andando forse più a basso livello si sono rilevate molto più veloci e stabili (ripeto, è per mia ignoranza, non vuole essere una critica a WPF).

La parte di controllo del motore è stata molto semplificata da un wrapper C# (gentilmente fornito da Manuel, altro bravissimo fotografo) di una libreria che controlla un fieldbus controller (ethernet) a sua volta responsabile dei comandi di start/stop/pause/reset da dare al motore.

Il risultato finale lo vedete nel video e foto gentilmente “scippati” dal sito della capocommessa pixxelfactory:

 

DSCF0013

DSCF0053

 

Insomma una bella esperienza della quale ringrazio Walter per aver pensato (e creduto!) in me.

PS magari la prossima volta le specifiche del progetto dammele tutte all’inizio, non a metà Smile

Leggere con ADO.NET colonne Excel miste numeri e testo

Posted 2. giugno 2009 11.45 in Informatica

Fin dai tempi dei primi DTS (Sql Server 7.0) ho sempre avuto rogne quando dovevo importare in Sql Server dati da Excel in cui nella stessa colonna ci fossero dati numerici e alfanumerici. L'esempio classico è quello del CAP in cui ci sono numeri (39100) ma anche informazioni testuali ("00100"). Se Excel pensa che la colonna sia di tipo numerico, tutti i dati di tipo stringa che poi lui incontrerà saranno considerati come "vuoti".

La stessa cosa succede se aprite un file excel in Ado.Net tramite un OleDb Provider per riempire una datatable e scorrerla (il problema non ho capito se sia di ado.net o di Jet). In questi giorni dovevo fare un programmino ad un amico importando una colonna "Taglia" che aveva la maggior parte delle informazioni numeriche (38, 39, 40, ecc) ma ogni tanto un "S", "XL", ecc. Ebbene quelle taglie di tipo stringa non c'era verso di fargliele leggere.

Il comportamento (non ho capito se di Jet o del provider ado.net) è infatti quello di scorrere le prime (per default 8) righe del foglio excel e cercare di desumere da quelle il tipo del campo. Uno penserà "metto in cima le taglie alfanumeriche e sono a posto..." nossignori, perchè viene fatta comunque una statistica sulla maggioranza dei dati, e quindi se la maggior parte dei dati sono numeri, lui si impunta a considerare la colonna come numerica.

Il primo workaround che si trova googlando è di aggiungere un IMEX=1 alle Extended Proprieties della stringa di connessione quando creiamo la OleDbConnection. Innanzittutto occhio a mettere tra apici (singoli o doppi) tutte la parte di extended properties, perchè altrimenti vi beccate una bella eccezione "Could not find installable ISAM" (e già capire la causa di questo ti fa perdere il paradiso)

Quindi:
string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Pippo.xls;Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'";
oppure
string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Pippo.xls;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";

Purtroppo però molto spesso questo non basta. Per aumentare le possibilità di avere il comportamento che ci aspettiamo (nel mio caso considerare la colonna di tipo stringa), dobbiamo cambiare due chiavi di registro e più precisamente:

Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/ImportMixedTypes 

che può avere i valori "Majority Type" (che è il default e desume il tipo dalla maggioranza dei dati) o "Text" che è quello da settare se si vuole forzare il tipo.

Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows

invece è un numero da 0 a 16 che indica quante righe all'inizio scansionare per determinare il tipo (quel 8 di cui parlavo all'inizio); mettendo 0 si indica di considerare le prime 16384 righe dove si spera che troveremo il primo dato testuale. Se per sfiga la prima taglia "XL" la trovassimo dopo 16385 righe sarei stato fregato.

Riassumendo; con queste impostazioni ho risolto i miei problemi
IMEX=1
ImportMixedTypes = Text
TypeGuessRows=0

Se peró volessi mettere la mia pagina che importa i dati su uno shared host ?? Non penso che Aruba (tanto per fare un nome) sia molto propensa a cambiare delle chiavi di registro solo per me...

(fonte: Joe Morrison ; potevo solo linkare il post ma non si sa mai che scompaia...)

Visual Studio 2008 e .NET 3.5 RTM disponibili...

Posted 19. novembre 2007 20.15 in Informatica

E' arrivato il grande giorno... devo dire che erano parecchi anni che non mi succedeva di essere cosí impaziente e ansioso per l'uscita di una RTM. Sarà che l'aspettavo per iniziarci un progetto a cui tengo molto, sarà per quel Linq che mi intriga, ma più che altro mi rallegra il fatto che ancora a 40 anni riesco ancora ad avere la stessa passione di una volta e fare un lavoro che mi piace.

Dettagli su dove scaricarla e quali versioni ad oggi siano disponibili sul blog di ScottGu.

I Poster sopra al letto

Posted 18. novembre 2007 12.36 in Misc | Informatica

Chi di noi nel suo passato non ha attaccato un poster sopra il letto o sulle pareti della propria camera ? Io ho iniziato a 9, 10 anni col grande John McEnroe del quale ero un fan accanito: l'estro, la fantasia, l'imprevidibilità, i gesti e le urla da isterico contro l'aplomb, la calma e la "noia" del pallettaro Borg (idolo del mio amico vicino di casa con il quale abbiamo incrociato migliaia di set nel nostro cortile finchè faceva buio... altro che Wii e Playstation).

Poi è iniziata la passione musicale e vari artisti si sono succeduti sui miei muri mano a mano che cambiavano i gusti musicali... uno è rimasto sempre al suo posto: il grande Vasco ! (la passione per i Queen sarebbe arrivata molto piú tardi).

Insieme a personaggi sportivi e musicali ricordo anche qualche foto di "gnoccone galattiche", meteore che si spacciavano come cantanti, ma che erano sui muri di molti adolescenti non certo per la loro ugola (es. qualcuno ricorda Tracy Spencer ? a me faceva impazzire...).

Ed oggi se potessi attaccarne qualcuno, (fatto che provocherebbe l'immediata richiesta di divorzio), cosa appenderei ? Probabilmente i namespace del .Net 3.5 oppure gli shortcuts per C# di VS2008 ...
il che mi fa pensare "...che tristezza..." :-)

I sorgenti del .Net Framework 3.5

Posted 5. ottobre 2007 10.54 in Informatica

Lo hanno scritto cani e porci su 8523 blog (primo fra tutti ScottGu), perchè non dovrei farlo anche io ? :-)

La notizia mi rallegra. Di avere i sorgenti del sistema operativo non me ne è mai fregato niente (non sono così geek da guardarmi milioni di righe di codice di Windows), ma del framework invece è molto piú interessante per vedere come loro hanno scritto/risolto una tal cosa (ok, c'era Reflector), ma soprattutto per andare in debug step by step da Visual Studio.

Non entro nel merito di cosa permetta o non permetta la Microsoft Reference License rispetto al classico OpenSource di Linux e soci, resta comunque un'ottima notizia per i dev del mondo MS.

WCF su .NetCF e versioni multiple del CF

Posted 8. settembre 2007 12.56 in Informatica

La borsa degli attrezzi del bravo programmatore

Posted 25. agosto 2007 09.16 in Informatica

Spesso mi sento in dubbio se usare un post per segnalare solo un link (un blog forse sarebbe giusto fosse composto solo da proprie elucubrazioni) ma è vero che certe volte è più facile ritrovare un link qui che non nel marasma dei favorites.

Quando però il sito (anzi lui stesso un mega-post di un blog)  è una utilissima lista di tools (free e non) che ci possono semplificare la vita di tutti i giorni, allora ne vale la pena:

Scott Hanselman's 2007 Ultimate Developer and Power Users Tool List for Windows

Riparare il .Net framework su Vista

Posted 31. maggio 2007 13.28 in Informatica

Mattinata persa causa improvviso malfunzionamento del pc... I sintomi erano crash di varie applicazioni (dalla Sidebar, a IE, Windows Explorer stesso, Sql management studio, ecc)

Dopo un primo scan infruttuoso con vari anti Spyware e antivirus ho deciso di tentare un System Restore ad un checkpoint di qualche giorno fa e iterando il processo fino ad arrivare a una settimana fa qualcosa è migliorato. Restava come unico problema il Sql Management Studio di Sql2005 in cui funzionava perfettamente il tree pane di sinistra ma il "query analizer" continuava a far scaturire eccezioni focalizzate soprattutto su librerie di drawing (e correlate a GDI+).
(riporto per chi googla: System.Runtime.InteropServices.SEHException: External component has thrown an exception.
   at System.Drawing.SafeNativeMethods.Gdip.GdipDrawString(HandleRef graphics, String textString, Int32 length, HandleRef font, GPRECTF& layoutRect, HandleRef stringFormat, HandleRef brush)

Provo a reinstallarlo e il setup mi dice che ho il .Net Framework 2 corrotto !! Non c'è problema, penso, lo reinstallo... purtroppo su Vista nè il fw 2 nè il 3 si possono reinstallare/disinstallare in quanto sono parte del sistema operativo (non si trovano neppure sotto Programs and Feature).

Per fortuna esiste un comando (da lanciare su un command prompt con Run as Admistrator ovviamente) che verifica eventuali dll corrotte e le ripristina; il magico comando che mi ha salvato è:

sfc /scannow

la dll "sputtanata" era proprio gdiplus.dll e a un successivo reboot è stata ripristina correttamente. Resta il mistero di come abbia fatto a corrompersi !

Sandcastle e affini...

Posted 28. maggio 2007 14.29 in Informatica

Era ora che mi prendessi un po' di tempo per guardare l'applicazione in eterna fase di beta (siamo alla n-esima CTP, non è un buon segno) per generare la documentazione di un progetto... Ero pronto a imbarcarmi in un'odissea di file batch come avevo letto e sentito da Rob, ma prima ho provato a googlare Sandcastle+GUI (mi sto impigrendo) ed ho trovato questo che mi sembra ottimo prodotto freeware Sandcastle Help File Builder. Con pochi colpi di clic si genera un chm di ottima fattura.

Ora il problema sta nello sforzarsi a scrivere gli Xml Comments del proprio codice... Un buon aiuto viene da quest'altro tool free (Ghostdoc), un add-in di VS2005 che permette di generare in modo automatico gli xml comment delle proprie classi, metodi, proprietà (solo c#) deducendoli dai nomi usati... ringrazio chi (Paolo e questo libro) mi ha insegnato a usare sempre l'inglese e una nomenclatura rigorosa (es. il pascal/camelcase, le iniziali minuscole per i parametri, l'underscore per le private, ecc) in quanto il tool con questo tipo di nomenclatura non fa miracoli ma riesce a fare bene il lavoro iniziale sporco e noioso.

Visual Studio .NET 2005 Keyboard Shortcuts

Posted 4. maggio 2007 09.20 in Informatica

Cercando quale sia la shortcut per il Make Lower Case (che di solito è Ctrl-Shift-L contrapposta al Ctrl-Shift-U del UpperCase, ma in VS2005 invece è un pericoloso Line Delete) ho trovato questo utile specchietto.

PS: lo shortcut giusto per il lowercase è Ctrl-U