Latest Posts
Ho appena finito di installare su una virtual machine Windows7 scaricato da msdn.
Considerando che era una VM, che stavo lavorando intanto che si installava ec…, sono rimasto di stucco nel vedere che ha impiegato solo 12 minuti a completare l’installazione.
Beh che dire, la tabellina che ho postato ieri sembra davvero vera.
Ora sono tentato di installare tutto sul pc di casa reale dato che ho visto che le cose che uso solitamente funzionano…. che faccio si/no/bah/forse?
Stanotte ci medito e domani vediamo…
Ho appena scaricato la nuova versione di Windows Live Writer. L'interfaccia non ha subito grandi cambiamenti, a differenza del sistema di plug-in, le cui modifiche hanno determinato l'incompatibilità con alcune delle aggiunte più vecchie. Pollice su, infine, per l'integrazione del correttore ortografico in lingua italiana
.
Sto studiando e comparando i diversi strumenti che abbiamo a disposizione per creare un database (from scratch) nella macchina target. Personalmente non ho la fortuna di poter usare VS Team System, quindi non conosco i tools che la versione Database mette a disposizione e che quindi non tratto in questo post (Lorenzo potrà ben colmare questa lacuna!).
Un modo è quello di utilizzare il wizard di pubblicazione fornitoci dal Visual Studio 2008, che ci consente di selezionare il database e creare in un unico script SQL tutte le operazioni di creazione delle tabelle, dei vincoli e di inserimento dei dati. Nello script generato manca la creazione del database, che si può facilmente aggiungere a manina.
Un secondo modo è quello di affidarsi a SQL Server Management studio, utilizzando la Generazione Guidata Script di SQL Server, un wizard che può sembrare lo stesso utilizzato da VS2008 (la grafica e l'interfaccia utente è identica) ma che mette a disposizione molte opzioni in più, tra le quali la possibilità di creare il database, di attivare il rilevamento delle modifiche e la generazione delle opzioni di compressione dei dati:
Un tutorial completo lo si può trovare nel post di Pinal Dave.
Poi ci sono i programmi di terze parti (ovviamente la lista non è esaustiva):
Infine, se vogliamo fare tutto a manina, magari in C#, c'è sempre la possibilità di usare SQL Server Management Objects (SMO), di cui vi sono vari tutarial su web, ad esempio questo post di Hayden che anche se un po' datato rende bene l'idea delle potenzialità d'uso di SMO.
All’interno dell’area downloads di MSDN è (ufficialmente) disponibile la Beta1 di Windows7.
E' una presentazione davvero bella. Da indicazioni al Product Owner su come esprimere i requisiti e ai membri del team su come raccoglierli/scomporli/ragrupparli al meglio per
- Produrre il maggior valore di business $$$
- Trovare le soluzioni/funsionalità che meglio realizzano l'obiettivo di business
- Procedere in modo da chiarire sempre meglio quello di cui si ha bisogno
- Garantire le funzionalità indispensabili al business in tempo per la release
Consigliata :) dura 58' e dal 20' iniziano i temi caldi : Presentation: Embrace Uncertainty by Jeff Patton
Tags : Team Work | Agile | Lean Agile | Leadership | Team | Cliente | Progettazione Software |
Prima di addentrarci nella realizzazione del nostro Cubo di Rubiks tridimensionale diamo uno sguardo alle basi del 3D partendo dalla creazione di triangoli nello spazio 3D con WPF.
Precedentemente abbiamo detto che i punti, nel sistema di coordinate 3D, sono rappresentati da strutture di tipo Point3D.
Per poter utilizzare le classi e le strutture relative al 3D nel nostro codice dobbiamo assicurarci di aver definito il namespace System.Windows.Media.Media3D tramite l’istruzione using:
Creare un punto e definirne le coordinate (di tipo double) è semplice grazie al costruttore della struttura Point3D:

NB: Il punto verrà solamente creato in memoria ma non sarà visualizzato
Costruiamo un Triangolo
Per poter definire un triangolo occorrono 3 punti, un insieme di punti è rappresentato dalla collezione ordinata Point3DCollection (in XNA si usano array di Vertici).
Per creare un triangolo rettangolo definiamo i punti (1,0,0), (1,1,0) e (0,0,0):
E’ possibile farlo attraverso il seguente codice C#:
o sfruttando una sintassi più compatta e meno prolissa è possibile scrivere:

E’ possibile migliorare ulteriormente tale codice indicando nel costruttore della classe Point3DCollection la capacità iniziale corrispondente al numero dei nostri punti (in questo caso 3). Eviteremo di ridimensionare la collezione mano a mano che aggiungiamo punti rendendo più efficiente il nostro codice.
NB: Questa piccola ottimizzazione è valida in generale per la maggior parte delle collezioni (anche per i Generics) ed è maggiormente “tangibile” all’interno di cicli eseguiti molte volte.
E’ anche possibile definire i punti direttamente nello XAML (nell’esempio i punti sono definiti come risorsa dalla chiave “triangle”)
WPF e Back-face Culling
L’ordine di aggiunta dei punti è particolarmente importante perché permette a WPF di determinare correttamente le superfici visibili tramite il Back-face culling. In parole povere le superfici visibili dall’osservatore (nelle immagini seguenti una telecamera) sono quelle create in senso antiorario mentre quelle create in senso orario restano nascoste.
Per chiarire questi concetto proviamo ad immaginare un triangolo con scritto davanti “Front” e dietro “Back”. Creandolo in senso antiorario otterremmo il risultato aspettato e la faccia “Back” non sarà visibile dalla telecamera perché sul retro del triangolo.
 |
| La faccia “Front” del triangolo è visibile frontalmente dalla telecamera perché creata in senso antiorario. |
 |
| La faccia “Back” del triangolo rappresenta il retro del triangolo e non è visibile dalla telecamera. |
Creando invece il triangolo in senso orario indicheremo a WPF che la faccia con la scritta “Back” è quella frontale e quella con la scritta “Front” è quella sul retro.
Vedremo nella prossima parte come visualizzare il triangolo e altri oggetti 3D nella nostra applicazione
Come riportato da prove comparative effettuate da ZDNET in questo articolo Windows 7 (build 6.1.7000.0.081212-1400) promette bene..
Non vedo l’ora di provare questa build dato che ho visto solo l’alpha precedente (cmq poco male, da domani dovrebbe essere disponibile anche su MSDN).
E’ da un sacco che sono passato a Vista (e ne sono felice), cmq le “cose nuove” mi affascinano sempre, per cui attendo con ansia fine anno!
In attesa
Oggi ho avuto la necessità di convertire un colore, di cui conoscevo la rappresentazione RGB, in formato esadecimale, per poterlo utilizzare sul Web. Con una rapida ricerca su Internet, sono giunto in questo pagina, in cui viene fornito un semplice codice Javascript che permette di effettuare la trasformazione in automatico. Lo segnalo qui, in caso dovesse tornarmi utile
.
Technorati Tags:
Programming,
Web
Mi è capitato di dover scrivere una query ESQL con un campo DateTime nella clausola where. Se per qualsiasi motivo non si possono (o non si vogliono) usare i parametri vi è un modo semplice per poter rendere compatibile una stringa contenente una data con ESQL: il seguente esempio (che estrae tutte le persone più giovani di me :) ) vale più di mille parole:
"select value p from Persone AS p where p.DataNascita > DATETIME'1984-05-28 00:00'"
In sostanza si deve usare la Keyword DATETIME seguita da una data nel formato 'yyyy-MM-dd hh:mm'. Per quanto ho capito questo è l'unico modo per iserire dei valori DateTime come stringhe all'interno di una query ESQL. Inoltre essendo "obbligato" a trasformare la data in un preciso formato, evito anche eventuali problemi dovuti alla localizzazione dei valori DateTime rappresentati come stringhe.
Matteo
Ultimamente ho avuto la necessità di estrarre tutti gli elementi distinti di una query Linq. La query in questione interroga un EntitySet e restituisce come risultato una proiezione dei dati di una Entity all'interno di una classe; si presenta all'incirca così:
var result =
(from c in dataContext.CaratteristicheChimicheSet
where codition
orderby order descending
select new Chemical()
{
Alluminio = c.Al
}
Le condizioni di uguaglianza delle istanze del risultato dipendono dalla proiezione e sono quindi definite in funzione di Chemical (ovvero della classe che uso come tipo di ritorno) e non delle Entity dell'EntitySet che sto interrogando; Chemical implementa a questo scopo i metodi Equals, GetHashCode e l'interfaccia IEquatable<Chemical>, definendo in questo modo le condizioni di uguaglianza di due istanze.
Cosa ho fatto quindi: un po' ingenuamente mi sono fidato delle apparenze, e per ottenere il set di risultati desiderato ho richiamato il metodo Distinct offerto da Linq sulla query succitata; morale della favola i risultati che ottenevo non erano quelli sperati, bensì era l'intero set di istanze con tanti "doppioni". In più i metodi di ugualianza di Chemical non venivano nemmeno lontanamente sfiorati.
Ho proseguito quindi nei miei tentativi: sono passato all'overload di Distinct che riceve in ingresso un IEqualityComparer; peggio di prima! il metodo "addirittura" non è supportato da LinqToEntities!
A questo punto ho deciso di fermarmi a ragionare e come al solito il ragionamento mi ha guidato ad una soluzione: LinqToEntities implementa il Distinct traducendolo in un Distinct sql, come si può osservare analizzando col profiler cosa succede sul DB all'invocazione del metodo Distinct senza parametri. Questa conclusione spiega perchè i metodi di uguaglianza implementati da Chemical non vengono considerati e perchè è corretto che LinqToEntities non supporti il Distinct che riceve un IEqualityComparer.
Forte di questa osservazione, è stato facile trovare la soluzione al mio problema. Eseguo la query, facendomi restituire tutti i risultati (duplicati compresi) in un array, tramite il metodo ToArray; sull'array risultante invoco il metodo Distinct. In questo scenario entra in gioco LinqToObjects che fa proprio quello che speravo: esegue i confronti di uguaglianza usando i metodi implementati da Chemical e restituendo quindi il set di istanze desiderato.
Qual è lo scopo di questo post? In sostanza volevo sottolineare due punti:
- Esemplificare il funzionamento del metodo Distinct, in relazione al contesto in cui si usa, documentando quindi le differenze "sostanziali" tra l'implentazione di LinqToEntities e quella di LinqToObjects
- Ho avuto una ulteriore conferma di come procedere "ad intuito" non aiuti a trovare le soluzioni ai problemi e men che meno a capire ciò che si sta facendo. Quando si incontra un problema "nuovo" conviene sempre soffermarsi a ragionare e capire "cosa ci sta dietro", piuttosto che buttarsi sulla prima apparente soluzione che ci viene offerta
Matteo
Visto che di tanto in tanto mi arrivano domande con questo tipo di domande, ho pensato di bloggare domande e relative risposte:
Q: L'eseguibile generato dal compilatore è win32 o sempre IL?
A: Il compilatore C++ può generare tre tipi di output:
- solo codice nativo (quando non si usa /clr nelle opzioni e quindi niente C++/CLI)
- solo codice managed (cioè solo IL, usando /clr:pure)
- codice misto nativo/managed (usando /clr)
Q: Come posso controllare quale parte del codice verrà compilato come nativo o managed?
A: Il codice scritto nel "dialetto" CLI verrà compilato come IL (vedi ref class, etc.) mentre quello tradizionale in modo nativo (x86 o altro assembler).
Se si vuole forzare quali parti compilare in modo nativo e quali in modo managed, si può usare la direttiva #pragma managed / #pragma unmanaged:
http://msdn.microsoft.com/en-us/library/0adb9zxe(VS.80).aspx
Il pregio del compilatore MS C++ è che l'assembly risultante da una compilazione "mista" contiene sia codice nativo che managed. Il "trucco" viene effettuato nella fase di linking ed è anche fattibile "a mano" tra più .netmodule di compilatori managed. Sto dicendo in pratica che link.exe è in grado di unire listati generati da C#, Vb.net, C++, etc. in un unico assembly come ho fatto vedere in uno dei workshop UGIdotNET.
Q: Per applicazioni industriali posso ottenere performance migliori utilizzando C++/CLI ? Per usare componenti COM è più performante usare C++/CLI o C#?
A: Ovviamente dipende da cosa fanno queste applicazioni. Ci sono diverse false credenze rispetto alle performance del codice managed.
In generale un algoritmo che lavora in memoria può avere performance addirittura migliori in C# rispetto a C++ nativo grazie alle ottimizzazioni che vengono fatte "gratis" dal garbage collector che tenta di mettere l'Ephemeral Segment (il segmento di circa 16MB che contiene le generazioni 0 e 1) dentro la cache L2.
Ovviamente un buon listato C++ può avere performance uguali o magari migliori, ma certamente ad un costo (in termini di impegno per lo sviluppatore) decisamente superiore.
Se l'applicazione esegue tanta interoperabilità verso codice nativo (vedi COM o PInvoke, sia se effettuato esplicitamente dallo sviluppatore o internamente dalle librerie come nel caso di Windows Forms) il peso in performance del marshalling (copia di buffer di memoria da nativo a managed o viceversa) può essere certamente importante. Il costo effettivo dipende da:
- numero di transizioni (cioè di chiamate a proprietà, metodi, eventi)
- quantità di memoria spostata (in, out, in/out)
Se questi numeri sono bassi probabilmente non inficieranno sulle performance da C#.
Se l'applicazione accede a strutture di memoria a lunghezza variabile (come nel caso di elaborazione immagini), i puntatori del C hanno performance migliori e il grandissimo torto di avere una pessima parallelizzazione.
Q: Come posso valutare le performance in pratica?
A: Come dice Rico Mariani: "measure measure measure"
Il primo strumento in assoluto è il performance monitor (perfmon.exe) di Windows che offre decine e decine di counter per capire i problemi di performance, tra i quali il numero di transizioni native/managed per l'interoperabilità.
Poi ci sono i profiler come quello di Visual Studio Developer edition, Ants (che sono prodotti commerciali a pagamento) ed altri free che non ho avuto il piacere di provare.
Spesso è bene comparare i risultati con più profiler di performance, soprattutto quando viene usata la tecnica di instrumenting che altera l'eseguibile per raccogliere dati utili alla misurazione.
Da notare che spesso vedo fare grossolani errori nel codice managed che portano a performance povere. Quindi l'uso del profiler spesso mostra l'utilizzo di "worst practices" o banali errori e non tanto limitazioni in se del linguaggio C# o del Framework.net.
Internet Explorer 8 sarà rilasciato attraverso il servizio Windows Update e sarà segnalato come importante per Windows Vista e Windows Server 2008, e ad alta priorità per Windows XP e Windows Server 2003. Nel caso in cui si voglia impedire l'installazione automatica, è possibile ricorrere ad un apposito programma messo a disposizione da Microsoft, che bloccherà lo scaricamento della nuova versione del browser.
Fonte: IE8 Blog
Il 24 Gennaio si terrà la 3a conferenza UGIALTNET a Milano. Sono rimasti ancora 5 posti. Se siete interessati, registratevi sul sito dell’evento: http://altdotnet.org/events/italy
Durante l’evento saranno estratti 4 libri della Wrox, e una licenza di NDepend, gentilmente offertaci da Patrick Smacchia.
Inoltre, per chi non lo avesse ancora fatto, ancora per pochi giorni (le votazioni chiuderanno Giovedì 8 Gennaio alle 21) ci sarà la possibilità di votare gli argomenti che verranno trattati. Per farlo è necessario essere iscritti al gruppo ugialtnet, e votare nella pagina del poll.
Al momento, le sessioni sarebbero:
- IronRuby, con Ivan Porto Carrero, autore di IronRuby in Action come relatore
- TDD e mocking in the real world (17 voti) + Advanced TDD (12 voti)
- Domain Driven Design (15 voti)
- Scrittura delle User Stories e Planning Game (14 voti)
- Test di accettazione (Fitnesse) (14 voti)
Technorati Tags:
ugialtnet
Una cosa buona dell'età è l'esperienza cioè la capacità di riconoscere una serie di situazioni per cui si conosce come muoversi per reagire bene
Nell'informatica questa esperienza ha anche bisogno di specializzazione che permette di muoversi in modo rapido ed efficace anche se ora solo dentro uno schema fisso e definito (quello di specializzazione appunto)
L'altra faccia di questa specializzazione e velocità di reazione si chiama preconcetto che prende la forma di abitudine (ho sempre fatto cosi, qui in azienda abbiamo fatto tutti sempre cosi e ha funzionato, perché cambiare?) e superstizione (convinzioni su relazioni di causa-effetto non dimostrate)
- Un buon antidoto all'abitudine è la curiosità verso cose nuove e idee altrui
"We have met the enemy and he is us." (Pogo, quoted by P.Sengein The Fifth Discipline)
- Un buon antidono alla superstizione la disponibilità ad ascoltare il feedback che contraddice le proprie attese e valutarlo seriamente alla prova dei fatti nel caso specifico e nel contesto in cui si è presentato (reality checkpoint)
- Un altro buon antidoto ad entrambi è la presenza di Junior nel team (in quanto soggetti immuni, non più del 30% altrimenti è presenza del Team tra junior
)
- E un naturale turnover anche nel management è un buon antidoto al preconcetto nella cultura aziendale (quel del "qui da noi non può funzionare" e del "noi siamo diversi")
“[…] a new scientific truth does not triumph by convincing its opponents and making them see the light, but rather because its opponents eventually die, and a new generation grows up that is familiar with it." (Max Planck, quotedin Thomas S. Kuhns«The Structure of Scientific Revolutions»)
Tags : Team Work | Agile | Leadership | Team | Creatività | Innovazione |
L'oggetto Enum di .NET non espone il metodo TryParse, per tentare il cast verso un valore dell' enumerazione senza ottenere un' eccezione in caso di valore non valido (come avviene, ad esempio, con Int.TryParse). Tale funzione, tuttavia, può essere facilmente realizzata utilizzando un opportuno extension method, come descritto in questo post.
Technorati Tags:
.NET,
Programming,
C#
Segnalo un interessante componente free ‘Flajaxian FileUploader’ per effettuare in modo “semplice” l’upload di files con progress bar.
Il componente è fatto veramente bene e anche io sono riuscito ad utilizzarlo velocemente (è da un po che non programmo in asp.net…)
Ecco le principali caratteristiche:
- upload di file multiplo
- possibilità di specificare dimensioni del file singolo e totale
- possibilità di specificare le estensioni valide
- personalizzazione del componente
- eventi client e server per personalizzare i comportamenti
- “adapters” preimpostati per effettuare il thumbnails delle immagini caricate
- funziona bene con ajax
- manuale ed esempi chiari
- semplicità di installazione (basta copiare nella bin la dll)
L’unica avvertenza che do a chi lo utilizzerà è di ricordarsi di aggiungere nel BeginRequest del “Global.asax” l’istruzione com.flajaxian.FileUploader.RegisterAspCookies(); per aggirare un bug del flash player di Firefox.
Che stupido! Per implementare nel mio programmino di data logging la definizione del periodo di tempo per il quale mostrare i dati registrati, ho utilizzato, nel caso di visualizzazione di tutti i dati registrati, come valore minimo di data il valore DateTime.MinValue .
Peccato che il suddetto valore minimo è pari a {01/01/0001 0.00.00}, cosa del tutto indigesta per SQL Server:

Peccati di gioventù, per un sempliciotto della programmazione domenicale...
E un elenco di segnali che qualcosa nella pratica di Scrum nel team ha bisogno di un miglioramento
Sono indizi e non già prove, vanno verificati - A ogni smell corrisponde una soluzione
Indicazioni per l'uso: non puntare il dito contro qualcuno, anche se a volte verrebbe voglia di farlo , meglio usarli per migliorare il proprio lavoro nel team eventualmente per suggerire una azione quando un problema emerge nella retrospective
Tags : Team Work | Agile | Pratiche | Leadership | Team |