an amazing talent….never will be anyone to come near… i miss you Janis
Author: mtammacco
Windows XP Mode, creazione collegamenti nel menù di avvio di Windows 7
Com’è noto, la modalità XP Mode di Windows 7 consente di eseguire una applicazione funzionante sotto Windows XP all’interno di una macchina virtuale XP completamente invisibile all’utente, e con il collegamento all’applicazione visibile nel menù di avvio di Windows 7. Quindi, lanciando l’applicazione dal menù di avvio di Windows 7 verrà automaticamente avviata la macchina virtuale con l’autologon impostato, senza che l’utente si accorga di questo, e dopodicchè l’applicazione in questione sarà eseguita come se apparentemente facesse parte di Windows 7.
Se l’applicazione è dotata di un pacchetto di setup durante la sua installazione nella macchina virtuale XP Mode sarà automaticamente impostato un collegamento nel menù di avvio di Windows 7, onde permetterne l’esecuzione.
Cosa succede l’applicazione non è dotata di un pacchetto di installazione ma è semplicemente copiata nella directory di destinazione ?
Succede che il predetto collegamento, necessario al lancio, non viene creato e quindi l’applicazione pur essendo presente non è di fatto lanciabile (da Windows 7), e quindi è perfettamente inutile!.
Aggiungo inoltre, solo perchè mi è già successo, che alcune applicazioni, tipo una banale applicazione scritta in Visual Basic 6, pur avendo un normale setup, quest’ultimo non crea alcun link nel menù di avvio di Windows 7.
Come ovviare allora al problema ?
Semplice, basta creare un collegamento al nostro eseguibile e copiarlo nella directory C:\Documents and Settings\All Users\Menù Avvio della macchina virtuale XP Mode, e come per magia, esso apparirà nel menù di avvio di Windows 7 sotto le la voce Windows Virtual PC\Applicazioni Windows XP Mode.
</WebHost4Life>
Come evidenziato anche da altri bloggers, ad esempio qui, qui, qui, qui e qui, mi associo anche io alle lamentele per la migrazione disastrosa di WebHost4life, mio provider da parecchio tempo su cui ospito(avo), questo blog.
Sino a prima della migrazione, WebHost4life funzionava in modo eccellente, offrendo un ottimo servizio di hosting a prezzi accettabilissimi, tant’è che lo consigliavo a tutti coloro che mi chiedevano lumi su servizi di hosting professionali.
Dopo la loro migrazione verso una nuova piattaforma, con un nuovo control panel e nuovi servizi, a detta loro molto migliori dei precedenti, qualcosa, anzi parecchio, deve essersi inceppato nel loro meccanismo.
Il mio blog risultava molto spesso irraggiungibile, e questo lo scoprivo in tempo reale grazie ad UpTimer Monitor, un ottimo servizio completamente gratuito che verifica il tempo di up-time di un sito, pingandolo ogni 5 minuti e fornendo un alert via e-mail, SMS, RSS e Twitter nel caso lo trovi offline e nel caso in cui torni on-line. Puntualmente ogni giorno in almeno 5 occasioni il mio blog risultava offline, come se, ma è solo una mia impressione, venisse lanciato un “iisreset”.
Ora il mio hosting è presso ASPNIX, che non conoscevo prima e che ho scelto sentendo un po in giro (vedi Markino). Il pannello di controllo è abbastanza funzionale e sinora il servizio impeccabile, oltre che essere abbastanza più conveniente dal punto di vista economico.
Speriamo bene!
Link utili della settimana #15
– Ninja Database
Database minimale (sotto i 100k) per Windows Phone 7, Silverlight 3 e 4, .Net 3.5 e .Net 4.0, che permette di salvare e ricaricare qualsiasi oggetto pubblico su un file usando una serializzazione binaria compatta. Da provare soprattutto se si sviluppa per dispositivi mobili
Link utili della settimana #14
– RavenDB
Prodotto Open Source con opzioni commerciali, trattasi di un database documentale (non relazionale quindi), per la piattaforma .Net. che memorizza documenti JSON schema-less. Da provare sicuramente.
– NBuilder, open source software con un obiettivo molto molto utile per tutti coloro che, come me, hanno l’abitudine di creare Unit Tests per il loro codice. Questa applicazione infatti genera rapidamente liste di oggetti da utilizzare poi nei propri tests, assegnando particolari valori a certe proprietà e permettendo l’override dei valori delle proprietà a cui si ‘è interessati mediante lambda expression. Insomma, automatizza e soprattutto velocizza quel tipo di lavoro che uno sviluppatore che scrive Unit Tests deve farsi a manina.
Italian Agile Day 2010
Venerdi’ 19 Novembre 2010 si terrà a Genova il settimo Italian Agile Day.
Si tratta di una conferenza gratuita di un giorno dedicata alle metodologie Agili per lo sviluppo e la gestione dei progetti software rivolta agli sviluppatori, project leaders, IT managers, tester, architetti e coach che hanno esperienze da condividere o che iniziano solo ora ad interessarsi a queste tematiche.
La giornata ha come obiettivo la conoscenza pratica, le esperienze sul campo e un attivo coinvolgimento di tutti i partecipanti. L’accesso è libero previa registrazione, i posti sono limitati.
L’evento, per la quarta volta consecutiva, si auto-finanzierà.
Link utili della settimana #13
– PreCode
Trattasi di un editor di Snippet Code per Windows Live Writer con il supporto per SyntaxHighlighter. Da provare, uno dei tanti tool per inserire snippets code nei propri posts.
– Hanselminutes Podcast about NHibernate 3
Interessante podcast di Scott Hanselmann in cui Scott chatta con Jason Dentler sulla nuova versione 3.0 di NHibernate. Comprende inoltre una serie di link utili su NHibernate.
– Installare Ubuntu 10.4 LTS su Windows Virtual PC su Windows 7.
Mini tutorial di Scott Hanselmann. Da tenere a portata di mouse.
– Mozy, un servizio di online backup data storage molto interessante e dai costi contenuti (esiste anche una versione gratuita). Da provare
– Akismet
Tratto da questo blog, un utile post per utilizzare questo plug-in per chi, come il sottoscritto, utilizza SubText come motore di blogging ed è afflitto dall’annoso problema dello spamming sui commenti
Sviluppatore senior chi è costui ?
– Colui che lavora sempre sullo stesso progetto da almeno 4 anni, facendo ogni giorno sempre le stesse cose;
– Colui che usa come DAL il DataSet a go-gò, vantandosi di come lo sa utilizzare bene, non sapendo che forse c’è qualcosa di meglio in giro;
– Colui che riempie il codice di cast, rendendolo perfettamente funzionante ma praticamente illeggibile ad altri sviluppatori;
– Colui che usa la tecnica di scrivere chiamate a metodi innestati tra loro, rendendo il codice illegibile;
– Colui che usa quotidianamente un linguaggio di programmazione ad oggetti come se fosse procedurale;
– Colui che pensa che lavorando sempre sullo stesso progetto è diventato ormai indispensabile;
– Colui che prende in giro gli sviluppatori junior vantandosi della sua seniority;
Scusate lo sfogo….
Link utili della settimana #12
– Microsoft – Domain Oriented N-Layered .NET 4.0 App Sample
Per gli amanti (come me) di DDD, ecco un progetto molto interessante riguardante un “DDD N-Layered Architecture Style”, ovvero una applicazione di esempio che mostra uno scenario di business molto semplice che include alcune implementazioni di DDD Design patterns (Repository, UoW, Entity, Aggregate, Value-Object, etc), facendo uso di .Net 4.0, EF 4.0, WCF 4.0, differenti client partendo da WPF e Silverlight.
– NHibernate Query Analyzer, open source project, il cui nome dice già tutto
Patch for VS 2010 Find and Replace Dialog Growing
Bello questo piccolo bug di Visual Studio 2010 . Ogni volta che si usa la finestra di dialogo Find and Replace, la stessa “cresce” di dimensioni (16px) rispetto alle dimensioni precedenti (quindi, all’infinito). Nel link è presente la patch per sistemarlo.
– Generate Data
Ogni giorno si scoprono siti web davvero inusuali. Questo sito offre il servizio gratuito di generazione di dati casuali utilissimi per il test delle proprie applicazioni. E’ possibile scegliere un range di dati possibili (id autoincrementanti, dati di testo come nomi, città, nazioni, valori float o booleani, ecc.), e generare dei dati casuali con un click di mouse.
LINQ – Variabili temporanee con la parola chiave Let
L’uso di LINQ apre davvero a scenari molto molto interessanti grazie alla sua potenza e flessibilità.
Oggi ho scoperto che in una query LINQ è possibile costruire una variabile temporanea ed utilizzarla successivamente nella esposizione del risultato della query.
Ecco un esempio:
Nella query LINQ precedente, mediante la parola chiave “let” è possibile creare una variabile temporanea (discount nell’esempio), farci delle manipolazioni, e ritrovarsi la variabile nella query.
Figo
Link utili della settimana #11
– jQuery Code Snippets for Visual Studio 2010
– Buiding iPhone and iPod Touch Applications for the .Net/C# developer with MonoTouch
– MonoTouch
Trattasi di un e-book gratuito circa l’utilizzo di MonoTouch per sviluppare in C# applicazioni funzionanti su iPhone.
L’altro link punta alla versione trial di MonoTouch, che non scade mai ma che consente di sviluppare applicazioni iPhone che girano SOLO su emulatore.
Tanto lo so che un giorno o l’altro diventerò uno sviluppatore iPhone
– Microsoft Ribbon Control for WPF, in aggiunta a Fluent Ribbon Control Suite già presente su CodePlex
– Google Map Control
Google Geocoding Web Service via HTTP .Net client
Metodo String.IsNullOrWhiteSpace, era ora!
Metodo String.IsNullOrWhiteSpace
non capisco come si sia dovuto attendere la versione 4 della BLC per introdurre un metodo la cui funzionalità è sicuramente utilizzatissima dagli svluppatori, costringendo questi ultimi a scrivere helper class oppure, ma solo a partire dal Framework 3.5, extention methods ad hoc.
Infatti, prima dell’introduzione di questo metodo, a meno ripeto di non scriversi un metodo ad hoc. erano necessari ben 2 passaggi per determinare se una stringa fosse uguale a null oppure vuota, includendo nel concetto di vuota anche lo spazio poichè esso è a tutti gli effetti un carattere.
Vale a dire che questo codice:
ritorna False perchè nel concetto di Empty non è incluso lo spazio.
Si potrebbe sottoporre preventivamente a Trim la stringa da valutare, ma sfortunatamente nel caso in cui la stringa sia null l’invocazione del metodo Trim() solleva una eccezione “Object not set to an instance of a object”.
Come detto, erano necessari 2 passaggi per determinare se una stringa non è null e non è neanche vuota, spazi compresi, ovvero qualcosa del genere:
Fortunatamente con il .Net Framework 4 ce la caviamo con una sola riga di codice:
Link utili della settimana #10
– On the Fly Zip and Attach” Windows Live Writer Plugin
Questo add-in è utile a tutti i bloggers che (come me) usano Windows Live Writer per scrivere e pubblicare i propri posts. Esso permette di selezionare files / directory dal proprio PC, zipparli al volo ed includerli come allegato al proprio post onde permettere al lettore di farne il download. Decisamente da provare.
– Dynamic LINQ Methods
Molto molto interessante. Trattasi di una serie di extensions methods per effettuare query Linq con parametri stringa (es. where, groupby, orderby, ecc), e quindi dinamici a run-time. Questa è una funzionalità parecchio utile che sarebbe stato meglio includerla come parte integrante dei vari providers Linq (a mio modesto parere).
– Visual C# 2010 samples
Parecchi esempi di codice su C# 4.0 e Linq
Coding Horror #1
Se c’è un aspetto che lo sviluppatore medio non tiene nella giusta considerazione quando scrive il codice è il cast tra tipi. Questo lo deduco solo dalla mia esperienza sul campo, ovvio.
Sto parlando del cast ridondante, cioè quel cast semplicemente inutile e che potrebbe essere tranquillamente evitato, basterebbe solo un pò di attenzione in più, e forse un pò di copia ed incolla in meno
Spesso un cast ridondante non è immediatamente percepibile.
Se si scrive una cosa del genere:
non è immediatamente visibile (ad occhio, intendo) il cast ridondante della riga 4, poichè un oggetto XmlDocument può essere tranquillamente assegnato ad un oggetto XmlNode in quanto quest’ultimo è la classe da cui deriva, e quindi per i principi basilari del polimorfismo o per il principio di sostituzione di Liskov (al secolo Barbara Liskov, è quindi una donna ) , fate voi, per cui, se B è una classe derivata da A, allora oggetti di tipo A possono essere sostituiti da oggetti di tipo B senza alterare la correttezza dei risultati.
Quindi il codice precedente può essere riscritto senza la ridondanza del cast, cosi:
Ma quando vedo cose del genere:
non riesco proprio a non rabbrividire, anche con il caldo torrido di questi giorni .
Ma come è possibile effettuare un cast del valore zero verso un tipo Byte !?!?!, quando, lo sanno pure i bambini, il tipo primitivo Byte rappresenta un valore intero senza segno compreso tra 0 e 255 ?.
Scusate lo sfogo…..
Link utili della settimana #9
– Mandare una mail verso una cartella con ASP :Net
Decisamente utile
– Microsoft Network Monitor 3.4
Tool che permette di catturare, visionare ed analizzare il traffico di rete. Utile anche agli sviluppatori
– NHibernate Mapping Generator 2.0 Beta 1
Presente il supporto per la generazione del “fluent mapping”, anche se fino ad ora limitato a Sql Server
NDepend, a “must have” tool
Questo è un tool davvero impressionante per cosa riesce a tirar fuori da un assembly .Net, adesso con tanto di add-in per Visual Studio e per Reflector.
E’ un must per qualsiasi sviluppatore/architetto degno di questo nome.
Mini rivisitazione dei progetti a cui ho partecipato
Avendo visto negli ultimi anni un bel pò di applicazioni .Net di ogni tipo, avendo partecipato ad un bel pò di progetti e conseguentemente visto una quantità considerevole di righe di codice, di seguito elenco (in ordine sparso) le mie considerazioni sulla qualità media del codice sorgente da me visionato e su cui spesso e volentieri sono intervenuto in prima persona per correzioni e/o nuove funzionalità (leggasi elenco di brutture e/o coding horror):
– La visibilità delle classi è una questione non tenuta nella giusta considerazione. Quando si crea una classe la si marca come “public”, e tale resta per sempre, anche se la classe potrebbe essere “internal”;
– il paradigma “Object Oriented Programming” è scarsamente applicato, ed anche scarsamente conosciuto, e cosi si finisce spesso per avere, solo a titolò di esempio, codice duplicato, scarsamente coeso e altamente accoppiato;
– Boxing e unboxing: concetto non conosciuto dai più, e cosi accade che il tipo “object” è usato a sproposito, e la tipizzazione dei dati diventa una rarità;
– Concatenazioni di stringhe a go-gò, anche se è arcinoto che questa operazione non è performante a causa dell’immutabilità dell’oggetto stringa che “stressa” parecchio il garbage collector;
– Utilizzo delle eccezioni nella logica di business dell’applicazione per notificare situazioni particolari;
– Utilizzo indiscriminato di Dataset/Datatable in ogni layer applicativo (front-end compreso), al posto di oggetti di dominio non anemici, cioè dotati di attributi e di comportamento (sì lo so, chiedo forse troppo, questo è Domain Driven Design…), con conseguente profilerazione di classi per la gestione delle entità trattate dalla applicazione, es. CustomerManager, OrderManager, ecc.
Su questo argomento potrei aprire una lunga discussione, circa colui che io definisco “il programmatore del dataset”;
– La modularità di una applicazione e il concetto di “Separation of Concern” (Soc) non attira l’interesse della maggior parte degli addetti ai lavori. Come già discusso qui, è più importante rispettare i termini di consegna puttosto che creare software di qualità, ed ecco che si finiisce per scrivere software quasi monolitici, dove le responsabilità si “accavallano” in modo netto ed evidente tra i vari moduli. In applicazioni ASP .Net il code-behind si è spesso rivelato una trappola, nel senso che la classe “pagina” contiene una quantità spropositata di codice, ad esempio negli event handlers, alla faccia del concetto di basso accoppiamento;
– Assenza di Unit Test, non nel senso che nessuno li scrive ma nel senso che il Test Driven Development per molti è una sigla non pienamente compresa; in quei pochi scenari in cui ho visto scrivere Unit Tests questi non erano mai strutturati nel modo corretto secondo lo schema arrange-act-assert ma erano per lo più invocazioni di metodi a scopo di debugging. In pratica, più che “Sviluppo guidato dal test” ho visto l’esatto opposto.
Fortunatamente ho anche visto codice scritto benissimo, bene, o almeno in modo decente
Link utili della settimana #8
– Super cool MSBuild Debugging in Visual Studio IDE
Questa è una feature eccezionale non ufficialmente supportata. Seguendo il link è possibile scoprire i passi necessari per abilitarla in Visual Studio 2010.
– Tool di migrazione VB6 –> VB .NET / C# gratuito
Considerato che è gratuito e che promette bene vale sicuramente la pena provarlo.
– Visual Studio 2010 Dark background
Add-in per VS 2010 per impostare dei temi personalizzati circa i colori, tra cui un fantastico Dark
– Microsoft ADO .NET Entity Framework Feature CTP4
– Domain Driven Design di Alberto Brandolini Part 1; Part 2; Part 3
– Domain Model Pattern (Martin Fowler)
– ASP.NET Multi-Level Drop Down Menu – JQuery
– NUnit Result Manager
Web application per tener traccia dei risultati degli unit tests (per project manager & developer)
Uso delle parentesi graffe
Sono sempre stato piuttosto “maniacale” nella scrittura di codice, circa il rispetto delle guidelines e circa uno stile di codifica che aiuti a migliorare la leggibilità dello stesso, e la sua manutenibilità.
Ho sempre sostenuto che il pezzo di codice scritto stilisticamente bene è quello che si “autodocumenta” semplicemente solo leggendolo.
La leggibilità aumenta, a mio parere, anche con opportuni accorgimenti o tecniche, non sempre utilizzati da tutti, anzi spesso ci sono pareri discordanti sull’effettiva utilità di alcune modalità di scrittura.
Mi riferisco, ad esempio, all’utilizzo delle parentesi graffe in alcuni casi particolari dove possono essere evitate (ovviamente il contesto è quello di applicazione scritta in C#, linguaggio principe nel mondo .Net).
A mio avviso, la leggibilità beneficia del fatto di scrivere qualcosa del genere:
if (condizione) a = 1;
rispetto a questo codice:
if (condizione) { a = 1; }
Quando mi ritrovo a svolgere code review oppure solo a guardare codice scritto da altri, la tentazione di eliminare le graffe è troppo forte, e, quando posso, finisco per toglierle.
La stessa tecnica la applico al ciclo for, ovviamente anche in questo caso l’istruzione da eseguire deve essere una sola.
Circa le if, sarebbe addirittura più valida l’idea di toglierle proprio, in perfetta aderenza ai principi della campagna anti-if, a cui ho aderito con entusiasmo, anche se qui il contesto è differente poichè le “if” andrebbero usate con parsimonia o evitate del tutto quando particolarmente annidate e ripeture (così come l’istruzione “switch”), sostituendole con una applicazione più rigorosa dei principi della programmazione ad oggetti, polimorfismo ed ereditarietà in primis.
Settore ingegneristico o artigianale ?
Poichè mi piace tenere insieme i miei pensieri su questo blog, riporto la mia risposta all’amico Andrea Saltarello sullo spinoso tema da lui sollevato in un thread sul forum di GUISA, ovvero “ma siamo solo artigiani ?”
“Hai perfettamente ragione quando affermi che “siamo un settore artigianale”, e ciò dipende a mio avviso
dal fatto che non tutti sono disposti a migliorarsi professionalmente per comprendere “il perchè” piuttosto del “come”.
Molti sanno come impiantare un sito Web MVC; pochi conoscono però il pattern, ancora meno sanno che quel pattern si chiama “Model 2” e non MVC; qualcuno addirittura non conosce nemmeno il significato dell’acronimo, ma tutti però ci spacciamo come architetti poichè, come affermi giustamente, “architetto” è una buzzworld figa da mettere sul bigliettino da visita o nella firma elettronica della mail.
Questo è solo un esempio, ma ne potrei citare molti altri.
Come sicuramente ben sai, esistono realtà IT dove ad una applicazione è richiesto solo che funzioni; non è minimamente richiesto e non si ha nemmeno la consapevolezza dell’importanza di avere software modulare che evolve nel tempo con il minimo impatto sulle funzionalità esistenti.
La qualità del prodotto software è una caratteristica scarsamente apprezzata, anche dagli stessi addetti ai lavori; ciò che conta è consegnare la versione 1 funzionante, per poter fatturare, non importa come viene sviluppata.
Qesto è un settore dove “i fiorellini” non sono richiesti.
Quindi, altro che TDD e sviluppo incrementale… “