Latest Posts
E’ stata da poco rilasciata la versione 4.3 di Entity Framework, già disponibile anche su NuGet. Sul blog del team di ADO .NET è possibile leggere l’annuncio ufficiale.
Ho pubblicato su MSDN Code Gallery una libreria, chiama Light Script Engine, che permette di compilare dinamicamente porzioni di codice C#. Può essere utilizzata, ad esempio, per aggiungere un motore di scripting alle proprie applicazioni. Il sistema, inoltre, fornisce automaticamente un meccanismo con cui passare argomenti al codice dinamico e ricevere valori di ritorno.
Il file ZIP disponibile contiene, oltre alla libreria vera e propria, anche un’applicazione WPF con alcuni pezzi di codice già impostati, grazie ai quali è possibile verificare immediatamente il funzionamento dell’engine:

Su DotNetToscana è disponibile un articolo che illustra più nel dettaglio le sue caratteristiche e fornisce alcuni esempi delle sue potenzialità.
Light Script Engine, inoltre, è può essere scaricato anche da NuGet (è sufficiente cercare LightScriptEngine):

Sicuramente c'è molto da aggiungere, questa libreria si limita a fornire il nucleo di base dello script engine, ma fornisce un’idea delle potenzialità di uno strumento del genere: Light Script Engine potrebbe essere il punto di partenza su cui costruire un linguaggio di scripting per la scrittura di macro con cui l'utente può personalizzare le proprie applicazioni.
Tag di Technorati:
.NET,
Programming,
C#
Quando utilizziamo un approccio Model First, abbiamo a disposizione due differenti approcci per la gestione dell'ereditarietà delle nostre entità:
- Table-per-type: Vengono utilizzate differenti tabelle per ogni tipo nell'albero gerarchico dell'ereditarietà
- Table-per-hierarchy: Viene utilizzata una sola tabella per lo storage dei differenti tipi nell'albero gerarchico dell'ereditarietà.
Entity framework utilizza un approccio table-per-type e ovviamente la chiave primaria di una tabella che rappresenta un'entità derivata è anche foreign key nella tabella che rappresenta l'entità padre.
There are some uncertainties that cannot be avoided or reduced, while instead they can be recognized and managed
Putting more time and effort to improve estimations of the uncertainties that cannot be avoided or reduced, will not
improve the accuracy and reliability of those estimations. It is a waste. And not recognizing those uncertainties increase the possible
consequences.
Some problems are so complex that you have to be highly intelligent and well informed just to be undecided about them - Laurence J. Peter
It is not possible to estimate what
- you don't know
- has never been done before
- has more uncertainty that certainty
- you do not know that you don't know
- is not yet invented, discovered or explored
- you can learn how to do it only doing it for real
- has no definitive or agreed formulation of the problem
- is changing more frequently than the frequency you re-estimate it
- has neither an immediate nor ultimate test/validation of a solution
- has no "stopping rule" (i.e. we never know when or if the problem has been fully solved).
- has an unbound set of possible solution and you can know which work only after trying them
- has no solutions that match world views and frames for understanding for all the stakeholders
- change substantially in presence of minimum changes of the initial conditions or external perturbations
- ...
What else ?
And finally a
Quiz to check if everything is crystal clear.
Given that:
- It is possible to reduce the consequence of uncertainty and risks, i.e. buy an insurance
- It is possible to have what you want at an arbitrary deadline, i.e. get a loan
- It is possible to make good profits from diversity in opinions/forecast, i.e. betting or investing in the stock market
What if someone want an high ROI without uncertainty/risks, at a pre-fixed deadline agreed by everyone?
Solution by
Willem van den Ende : that is called a software project ;-)
See also:
-
Requirement's principles
-
The dimensions of Agile
Lo dico già da mesi, ma a questo punto, proprio perchè credo davvero in quello che sto per dirvi, lo devo anche scrivere in un posto diverso da twitter.
Eh si, perchè twitter è stupendo: si micro-blogga in pochissimi secondi, si seguono le persone senza che loro debbano “accettarti” come amico (facebook faceva così, poi si è parzialmente adeguato, ma questa è un’altra storia), e in poche settimane si può avere un grande successo (inteso come numero di follower e/o tam-tam) tra mentions e retweet.
Però…
Però pecca alla grande su una singola, piccola cosa: la Storia.
Su twitter non c’è Storia, o meglio: non c’è storico.
Si ok, qualche API ci sarà, bla bla…ma io parlo di “cognizione storica” dei vari utenti, non del fatto che *probabilmente*, con qualche strumento avanzato, da sviluppatore posso “fare tutto”.
Facciamo un esempio, un cambio di contesto, giusto per renderci conto di cosa potrebbe essere.
Il mondo “fuori” dai social: quello che abbiamo conosciuto diciamo fino agli anni 60 (così teniamo una certa “distanza di sicurezza”).
La Storia non esiste (ok, senza la Storia staremmo ancora nelle caverne, ma non è questo il punto, seguitemi).
Bene: uno nasce, vive ed a un certo punto, diciamo intorno ai 20 anni (la nascita dello spirito critico) uno comincia, in piazza o nei bar, a dire la sua.
Immaginate in quanti e quali casi si direbbero le stesse cose, e “comincerebbero” (in realtà per l’ennesima volta) le “solite” correnti di pensiero e filosofiche, per non parlare degli errori commessi e reiterati/reiterabili.
Gli scenari sarebbero semplicemente milioni, e so già che a questo punto starete tutti pensando che è aria fritta.
Bene: e allora siamo tutti d’accordo.
Su twitter (ho l’account dal 20 Dicembre 2007, non lo dico certo per vanto ma per dire che è un’esperienza “di qualche mese”) vedo sempre più spesso persone che ritweettano battute, post, blog, scrivono teorie (copiate o meno) ma il problema è sempre quello: son cose già dette? Già dette da chi? E chi certifica?
Continuando il parallelo: io non ho fatto nemmeno un’ora di filosofia in vita mia e spesso mi sono ritrovato con amici più eruditi dirmi “ma questo è come la pensa Platone”, “questo è quello che dice Kant”.
Mai rivendicata paternalità per pensieri, frasi, teorie che pur avendo “teorizzato” in autonomia ho scoperto esistere già.
E questo solo perchè è “umanamente riconosciuto” che quella tal teoria è di quel tal tizio.
E su twitter? E sul web?
Beh sul web finora ci siamo goduti che uno possa diventare “fashion blogger” o “social expert” o “travel blogger” ecc, ecc, gratuitamente, senza dover essere iscritto ad albi giornalistici (nè altre associazioni/organi) ma ora stanno saltando fuori i limiti di questo: nessuna paternalità delle informazioni scritte se non il “buon senso” di chi le diffonde (che dovrebbe citare la fonte e non prenderla ex-novo in modo che, forse, se ne accorge solo chi sa. E ovviamente non “sa” in senso oggettivo, ma fa anche preferenze, in ordine: Io, i miei follower, i miei following, altri. Storicamente inaccettabile).
E gli scenari vanno da quelli più stupidi: “c’è sto nuovo iscritto su twitter che ha scritto una battuta che io facevo a voce già nell’87, per me è vecchia e a lui l’hanno retwittata in 1234” a “questa è vecchia, l’hanno già twettata la settimana scorsa”).
Il tutto a seconda della propria memoria e conoscenze.
E occhio che non è un problema di invidia (io non sono invidioso che Kant abbia detto prima di me una certa cosa) ma di conoscenza (perchè ovviamente questo discorso non vale certo solo per le battute, ma visto che il Popolo della Rete si è “svegliato” per questo ho sfruttato questa onda).
Un po’ come nei popoli antichi, prima della nascita di un certo Erodoto di Alicarnasso (considerato il padre della Storia o della storiografia), quando le conoscenze erano trasmesse a voce dai capi-tribù (con evidenti limitazioni).
E si arriva ad accusare Crozza (io per primo eh, sono appunto mesi che dico che i comici non fanno più ridere da quando twitter è arrivato anche alla maggioranza degli italiani) di “plagio” delle battute di twitter o di fare #copiaeinCrozza.
Solo perchè lui è famoso e va in TV? Questo problema c’è sempre stato, voi forse siete su twitter da 4 mesi, o magari non twittate contenuti che possano essere copiati, o forse non avete la sensibilità per notarlo o forse ancora non ve ne può fregare de meno ma c’è sempre stato.
Solo che del vostro follower vicino vi “preoccupate” meno perchè al massimo vi ha “fregato” la battuta e ha “conquistato” così altri tre follower (ovviamente è peggio se tali follower sono anche appetibili), se invece sentite la “vostra” battuta in TV, detta da Crozza vi inalberate.
Ma pensate di poter rivendicare “vostri” i “vostri” tweet?
Dove sta scritto? Chi è lo storiografo? Dov’è documentata tutta la Storia?
Tra una settimana esatta ci saranno i community days, dove io ho il piacere di tenere una sessione su VS11 e TFS11. Quest’anno l’evento è decisamente Mastodontico, ci saranno infatti Tre track parallele, più una di Lab dove poter sperimentare Windows Phone, windows Azure e molto altro.
Windows 8 è alle porte per cui non potete mancare la track dedicata del 17 febbraio ;), ma si parlerà anche di concetti non strettamente legati al mondo .NET, come MongoDB, insomma ci sono sessioni per tutti i gusti in modo da poter veramente soddisfare tutti.
L’hastag ufficiale è #csdays12 dove verranno date tutte le notizie dell’ultima ora.
Quindi non potete mancare assolutamente, vi aspetto :)
Gian Maria.
forse lo conoscevate già, cmq in questi giorni ho avuto pesantemente a che fare con gli "immancabili/intramontabili" file cvs, per gestire in modo agile questa situazione ho cominciato ad adottare la seguente libreria:
LinqToCsv Library
che ti consente di mappare facilmente il contenuto di un file csv su di un classe
Eccomi qui a scrivere un bel post sui Commenti di SharePoint, che mi ha fatto tribolare per un pò ma che alla fine sono riuscito a svangarla (direi come al solito :P).
In un ambiente enterprise dove la security trimming è attivata potremmo avere qualche difficoltà con alcuni oggetti "social" di SharePoint, in particolare io mi sono scontrato con il metodo GetComments dell'oggetto SocialCommentManager, perchè? Perchè avevo la necessità di far visualizzare a livello pubblico i commenti inseriti su una determinata Uri dagli utenti della intranet che sto sviluppando. Il risultato era che sul mio ambiente di sviluppo, come al solito, tutto fila liscio, mentre una volta fatto il deploy dal cliente...succedeva che ogni utente vedeva i propri commenti :( azz!
Il seguente snippet riporta il modo con cui richiamavo il metodo GetComments:
SPWeb web = SPContext.Current.Web;
SPServiceContext context = SPServiceContext.Current;
Uri uri = new Uri(web.Url + pageUrl);
SocialCommentManager cm = new SocialCommentManager(context);
SocialComment[] commenti = cm.GetComments(uri);
Ma non finisce qui, dopo che ho certificato che il codice era giusto ma il risultato atteso non era esatto, provo con il web service di SharePoint e quindi altro snippet:
SocialDataService sds = new SocialDataService();
Microsoft.Office.Server.SocialData.SocialDataService.SocialCommentDetail[] comments = sds.GetCommentsOnUrl(string.Concat(SPContext.Current.Site.Url, pageUrl), null, null, null);
Niente, sempre lo stesso risultato :(
Bene, disassembliamo e vediamo che cosa fanno i metodi e faccio una scoperta che mi lascia stupefatto. C'è un bel metodo INTERNAL ..... GetComments che accetta un parametro bool needSecurityTrim e ora?

Sia lodata la Reflection, con l'ultimo snippet potrete avere la soluzione ai vostri problemi, senza dover ricorrere a disabilitare il Security Trimming via PowerShell:
var type = typeof(SocialCommentManager);
var methods = type.GetMethods(System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var method = methods.FirstOrDefault(m => m.ToString() == "Microsoft.Office.Server.SocialData.SocialComment[] GetComments(System.Uri, Int32, Int32, System.DateTime, Boolean)");
if (method == null) throw new MissingMethodException("Social GetComment method not found.");
var comments = method.Invoke(cm, new object[] { uri, 10000, 0, DateTime.MinValue, false }) as SocialComment[];
In ambito XAML per mostrare una lista di elementi occorre impostare il datacontext di un ItemsControl ad una IEnumerable. L’ItemsControl poi rendererizza la lista in base al DataTemplate specificato nella proprietà ItemTemplate. Per aggiungere oggetti nuovi ho sempre usato ItemTemplateSelector e/o CompositeCollection, ma la presenza di un container l’ho sempre considerata obbligatoria (correggetemi se sbaglio).
Ho considerato l’assioma valido anche in Knockout, ma non è così. Con knockout è possibile scrivere un “contenitore fittizio” tramite commenti:
<!-- ko ... -->
<!-- /ko -->
Tramite questa feature è possibile (come nel mio caso particolare) creare una tabella con un numero di colonne variabili:
<table id="classificationTable">
<thead>
<tr>
<td>Rank</td>
<td>Country</td>
<td>Full Name</td>
<!-- ko foreach: batteries -->
<td>R<span data-bind="text: $data"></span></td>
<!-- /ko -->
<td>TOT</td>
</tr>
</thead>
<tbody data-bind="foreach: positions">
<tr>
<td data-bind="text: rank"></td>
<td data-bind="text: country"></td>
<td data-bind="text: fullname"></td>
<!-- ko foreach: regularShots -->
<td data-bind="text: $data"></td>
<!-- /ko -->
<td data-bind="text: totalRegularPoints"></td>
</tr>
</tbody>
</table>
Comodo, utile, veloce.
Ps: gli elementi <td> chiudeteli sempre con un tag </td>, non scriveteli con un tags self-closing <td data-bind="" /> altrimenti KnockoutJs potrebbe dare qualche problemino (e non solo lui)
The proliferation of modern programming languages (all of which seem to have stolen countless features from one another) sometimes makes it difficult to remember what language you’re currently using. This guide is offered as a public service to help programmers who find themselves in such dilemmas.
C
You shoot yourself in the foot.
C++
You accidentally create a dozen clones of yourself and shoot them all in the foot. Providing emergency medical assistance is impossible since you can’t tell which are bitwise copies and which are just pointing at others and saying, “That’s me, over there.”
JAVA
After importing java.awt.right.foot.* and java.awt.gun.right.hand.*, and writing the classes and methods of those classes needed, you’ve forgotten what the hell you’re doing.
Ruby
Your foot is ready to be shot in roughly five minutes, but you just can’t find anywhere to shoot it.
PHP
You shoot yourself in the foot with a gun made with pieces from 300 other guns.
ASP.NET
Find a gun, it falls apart. Put it back together, it falls apart again. You try using the .GUN Framework, it falls apart. You stab yourself in the foot instead.
SQL
SELECT @ammo:=bullet FROM gun WHERE trigger = ‘PULLED’;
INSERT INTO leg (foot) VALUES (@ammo);
Perl
You shoot yourself in the foot, but nobody can understand how you did it. Six months later, neither can you.
Javascript
You’ve perfected a robust, rich user experience for shooting yourself in the foot. You then find that bullets are disabled on your gun.
CSS
You shoot your right foot with one hand, then switch hands to shoot your left foot but you realize that the gun has turned into a banana.
FORTRAN
You shoot yourself in each toe, iteratively, until you run out of toes, then you read in the next foot and repeat. If you run out of bullets, you continue anyway because you have no exception-handling ability.
Modula2
After realizing that you can’t actually accomplish anything in this language, you shoot yourself in the head.
COBOL
Using a COLT 45 HANDGUN, AIM gun at LEG.FOOT, THEN place ARM.HAND.FINGER. on HANDGUN.TRIGGER and SQUEEZE. THEN return HANDGUN to HOLSTER. CHECK whether shoelace needs to be retied.
LISP
You shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds ….
BASIC
Shoot yourself in the foot with a water pistol. On big systems, continue until entire lower body is waterlogged.
FORTH
Foot in yourself shoot.
APL
You shoot yourself in the foot, then spend all day figuring out how to do it in fewer characters.
Pascal
The compiler won’t let you shoot yourself in the foot.
SNOBOL
If you succeed, shoot yourself in the left foot.
If you fail, shoot yourself in the right foot.
Concurrent Euclid
You shoot yourself in somebody else’s foot.
HyperTalk
Put the first bullet of the gun into the foot of the left leg of you.
Answer the result.
Motif
You spend days writing a UIL description of your foot, the trajectory, the bullet, and the intricate scrollwork on the ivory handles of the gun. When you finally get around to pulling the trigger, the gun jams.
Unix
% ls
foot.c foot.h foot.o toe.c toe.o
% rm * .o
rm: .o: No such file or directory
% ls
%
Paradox
Not only can you shoot yourself in the foot, your users can too.
Revelation
You’ll be able to shoot yourself in the foot just as soon as you figure out what all these bullets are for.
Visual Basic
You’ll shoot yourself in the foot, but you’ll have so much fun doing it that you won’t care.
Prolog
You tell your program you want to be shot in the foot. The program figures out how to do it, but the syntax doesn’t allow it to explain.
Ada
After correctly packaging your foot, you attempt to concurrently load the gun, pull the trigger, scream and shoot yourself in the foot. When you try, however, you discover that your foot is of the wrong type.
Assembly
You try to shoot yourself in the foot only to discover you must first reinvent the gun, the bullet, and your foot. After that’s done, you pull the trigger, the gun beeps several times, then crashes.
370 JCL
You send your foot down to MIS with a 4000-page document explaining how you want it to be shot. Three years later, your foot comes back deep-fried.
Python
You try to shoot yourself in the foot but you just keep hitting the whitespace between your toes.
MVC è un pattern dalle ottime potenzialità. Una pillola su come costruire applicazioni con Microsoft MVC3
Clicca qui per andare all'articolo
Utilizzando i metodi per la copia e lo spostamento dei file messi a disposizione dalla classe System.IO.File, se si lavora con percorsi troppo lunghi, si ottiene una PathTooLongException, secondo cui i path devono essere minori di 248 caratteri e i nomi dei file non possono avere più di 260 caratteri.
Per aggirare il problema, si possono utilizzare le funzioni delle API di Windows, avendo l'accortezza di specificare il prefisso \\?\ davanti al nome del file. Nel post Getting around PathTooLongException on file move with Windows Native API di Gal Ratner è descritta una semplice classe che mostra l'utilizzo di questo sistema.
Tag di Technorati:
.NET,
Programming,
C#
E anche la Mappa delle segnalazioni di Decoro Urbano è completata.

Prima di tutto devo dire che l’emulatore di Windows Phone è una grande comodità, perché consente di simulare lo spostamento del telefono in giro per il mondo senza muoversi di un metro, risparmiandoci la “fatica” di dover mockare il servizio di posizionamento.
Ma veniamo alla gestione della mappa delle segnalazioni di Decoro Urbano, per la quale è necessario:
1. Aggiornare l’area visualizzata al variare della posizione dell’utente;
2. Recuperare dal servizio web di Decoro Urbano le segnalazioni relative all’area geografica visualizzata nella mappa e mostrare i relativi “pushpin”.
Il primo punto è facilmente realizzabile usufruendo del metodo SetView(GeoCoordinate center, double zoomLevel) del “Bing Map Control” (Microsoft.Phone.Controls.Maps.Map), dove lo ZoomLevel è il livello di dettaglio richiesto e center è la posizione ottenuta del servizio di localizzazione di cui ho già parlato in un mio precedente post.
Per il secondo punto occorre fare una breve premessa.
Colacolare l’area geografica a partire dalle dimensioni del controllo (in termini di pixel, intendo) non è una cosa facile, tutt’altro. Poiché la terra non è piatta e il Sole non gira intorno alla Terra, rappresentare la geometria sferica su di un piano comporta l’uso di una proiezione. Nella cartografia vi sono svariati metodi, ciascuno adatto ad un particolare scopo. A noi serve ottenere la latitudine e la longitudine minima e massima visibili nella mappa, e per tale scopo il Bing Map control offre un paio di metodi.
Inizialmente ho usato una proprietà che mi sembrava calzasse a pennello: LocationRect BoundingRectangle dove Microsoft.Phone.Controls.Maps.LocationRect è una classe che ha le seguenti proprietà:
GeoCoordinate Center { get; }
double East { get; set; }
double Height { get; }
double North { get; set; }
GeoCoordinate Northeast { get; set; }
GeoCoordinate Northwest { get; set; }
double South { get; set; }
GeoCoordinate Southeast { get; set; }
GeoCoordinate Southwest { get; set; }
double West { get; set; }
double Width { get; }
Ma dato che la mappa è asincrona nel recuperare le immagini dal sito per spostarsi con fluidità, dall’istante in cui impostiamo il centro e lo zoom level della mappa al momento in cui la proprietà BoundingRectangle restituisce i dati che ci interessano passa ovviamente del tempo, ovvero quello necessario per spostarsi nella nuova posizione.
Per fortuna esiste un’altra proprietà, la TargetBoundingRectangle che restituisce immediatamente i dati a noi necessari. In questo modo è stato facile usare le proprietà North e South per ricavare la minima e massima latitudine, West ed East per la minima e massima longitudine, infine passare la richiesta al web service di Decoro Urbano e ottenere le segnalazioni comprese nell’area visualizzata in mappa.
Nel prossimo post vedremo come bindare l’elenco delle segnalazioni ai pushpins della mappa e personalizzarne l’aspetto.
Premetto che non avrei mai scritto un post sull'argomento, però dato che mi piace fare delle considerazioni, ne sfrutto l'occasione.
Partiamo subito dalle considerazioni. LightSwitch è un prodotto Microsoft che permette di realizzare applicazioni 3-Tier in modo molto semplice e veloce.
Dall'uscita del prodotto, subito sono sorte domande la cui risposta (imho) è negativa ovvero:
- Lightswitch è/tenta di sostituire Access? No. Access è Access, ha un altro target. Può sembrare simile, ma solo in lontananza.
- E' possibile creare applicazioni 1-Tier? No. O meglio, LightSwitch non è pensato per questo.
- E' possibile utilizzare strumenti/tecniche che l'ide non permette velocemente di utilizzare? Ni. Si può fare ma a vostro rischio e pericolo. Questo significa che si può fare con difficoltà, con difficoltà si manterrà nelle prossime versioni, con difficoltà si potrà deployare ecc ecc
Detto questo veniamo al punto. Imho, LS + SQLite = No. No perchè SQLite non è pensato per avere multiutenza (i lock vengono messi sul file intero==è come avere un lock su tutto il db), si può usare sqlserver express senza problemi, è 'complicato' da deployare.
Avendo premesso tutto questo (la parte secondo me importante), ecco come usare SQLite:
- Utilizzare il provider ADO.NET scaricabile all'indirizzo http://system.data.sqlite.org.
Attualmente non è incluso l'addin per visual studio. Se servisse, installare il pacchetto (non più mantenuto) da http://sqlite.phxsoftware.com
- Sviluppare aggiungendo un nuovo datasource e selezionando il provider SQLite.
- Deployare l'applicazione normalmente.
- Una volta effettuato il deploy, LS funziona correttamente ma è necessario configurare SQLite:
- aggiungere nella cartella di bin su IIS gli assembly dei provider: System.Data.Sqlite.dll e System.Data.Sqlite.Linq.dll. (attenzione alla versione x86 o x64)
- modificare il web.config per aggiungere il provider:
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
- copiare il database di SQLite in una cartella nuova (che chiamerò dbfolder).
- occorre dare i permessi di modifica/scrittura alla cartella dbfolder all'application pool (quindi IIS AppPool/DefaultAppPool o altro)
- modificare la connection string nel web.config con il percorso del database SQLit
Come si può notare, non è tanto un problema di LightSwitch, quanto di SQLite, dei provider ADO ecc.
E' vero che LS non è perfetto e migliorabile (cosa non lo è) però a volte la strada più semplice è la migliore.
Here’s a simple tutorial about using Expression Blend for HTML5 and some little Javascript to create a simple transition effect.
Fire up Expression Blend 5 and by double clicking the elements on Assets library add a button and a div, let’s rename it by double clicking them in LiveDOM pane.
Here’s live DOM contents and it’s HTML counterpart (I’ve manually added button Go! content)
 | <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>WinJSTransitions</title> <!-- WinJS references --> <link rel="stylesheet" href="/winjs/css/ui-dark.css" /> <script src="/winjs/js/base.js"></script> <script src="/winjs/js/wwaapp.js"></script> <!-- WinJSTransitions references --> <link rel="stylesheet" href="/css/default.css" /> <script src="/js/default.js"></script> </head> <body> <button id="btn">Go!</button> <div id="box"></div> </body> </html>
|
It’s time to make the box div look like a rectangle by applying a style: Select box element inside Live DOM and click on the little down arrow inside CSS Properties tab and by using CSS Properties tab let’s add some style properties.
On right you see the Css that Blend generated while playing with properties (approach is very similar to Blend for XAML BTW…)
 |
#box { border-radius: 20px; width: 200px; height: 200px; background-color: #4292B0; margin-top: 20px; }
|
Actual preview output
|
Since I want to use transition for margin-left and opacity properties let’s use Blend capability for this:
 |
#box { border-radius: 20px; width: 200px; height: 200px; background-color: #4292B0; margin-top: 20px; -ms-transition-property: margin-left, opacity; -ms-transition-duration: 0.7s, 1.26s; -ms-transition-timing-function: linear, linear; }
|
As you see I’ve added the two properties inside Transition pane, set it’s duration by dragging the slider on right and set both to use linear easing, on right you can see how the css looks like now.
To trigger the transitions I’m going to dynamically add a class to box div, so let’s define them using Blend by first selecting the default.css file inside Styles tab then clicking on “+” button to create two class definition named “in” and “out” (see below)

Now, with “in” class selected let change the value of opacity and margin-left to 1 and 0px respectively then select “out” class and change same properties to 0 and 300px, the related css entries should now look:
.in {
opacity: 1;
margin-left: 0px;
}
.out {
margin-left: 300px;
opacity: 0;
}
Let’s add the “in” class to our div by selecting it and typing “in” inside Attributes pane (manually editing the HTML is probably easier in this case…)

It’s now time to write to code (or should I say script?
) right click the project inside Blend and select “Edit in Visual Studio” to open the project in Visual Studio 2011

Code should look very straightforward: we’re going to subscribe to click event to add and remove “in” and “out” classes to the div element.
Before typing any code is necessary to add a reference to ui.js file from our HTML page because is there that addClass and removeClass methods live.
(function () {
'use strict';
// Uncomment the following line to enable first chance exceptions.
// Debug.enableFirstChanceException(true);
var isVisible=true;
WinJS.Application.onmainwindowactivated = function (e) {
if (e.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
document.getElementById("btn").addEventListener("click", function (e)
{
var box = document.getElementById("box");
var toAdd = isVisible ? "out" : "in";
var toRemove = isVisible ? "in" : "out";
WinJS.Utilities.removeClass(box, toRemove);
WinJS.Utilities.addClass(box, toAdd);
isVisible = !isVisible;
}, false);
}
}
WinJS.Application.start();
})();
Press F5 and you’ll see the rectangle moving and fading to the right and viceversa each time you click the button.
No rocket science here, but it works… 
Technorati Tags:
WinRT,
WinJS
Tra le varie utility dei TFS Power Tools vi segnalo la tfpt connections, lanciabile da riga di comando, ma che apre una comoda User Interface che permette di visualizzare tutte le varie connessioni ai server TFS effettuate dalla macchina attuale. Tra le varie informazioni che trovate vi è la possibilità di decidere se volete effettuare una riconnessione automatica al server

Questa funzionalità è utile se ad esempio lavorate spesso disconnessi e quindi volete evitare che ad ogni avvio di VS venga effettuata una riconnessione automatica all’ultimo TFS Server utilizzato. Nella figura sopra ho infatti disabilitato la connessinoe automatica al TFS PREVIEW.
Tra le altre opzioni trovate la possibilità di abilitare o disabilitare la compressione, di bypassare il proxy e di limitare il numero di connessioni concorrenti.
Un grazie a Matteo che mi ha rinfrescato la memoria, dato che non mi ricordavo più dove stava questa finestra :), le feature di TFS sono cosi tante che è veramente difficile ricordarle tutte :P
Gian Maria
After hands-on experience with Agile practices, working in Agile environments and attending conferences with Agile experts, I have annotated what I think could be
the dimensions of Agile that detail and expand
the original motto Embrace Change:
- dealing with uncertainty
- managing the unexpected
- recognizing the unknowns
- exploring through discovery & invention
- balancing anticipation & adaptation
- combining instinct & thought & experience (as learning from action)
- making sense in complex contexts
- amplify the emergence of beneficial behaviors and outcomes
- continuing the quest for craftsmanship
Dimensions are intended here in the sense that the values and principles in the Agile Manifesto, the values and principles and practices of XP, the 3 legs the 3 artifacts the 3 roles and the 3 meetings of Scrum as well as the foundations the roles and the activities and artifacts of OpenAgile and the values and the principles of Lean can all be directly related and derilved from one or more dimensions.
Can you suggest other dimensions?
Premessa:
Oggi mi sono trovato a dover risolvere una questione relativa alla “pulizia” di dati “quasi XML”, che all’interno dei tag XML possono eventualmente contenere il carattere “proibito” & (ampersand).
Com’è noto, tale carattere è un metacarattere che serve a rappresentare i caratteri non consentiti all’interno dei tags XML, secondo la nota tabella:

La cosa è complicata per il fatto che i dati suddetti possono contenere sia ampersand errate (un ampersand solo soletto) e sia corretti (&), com’è possibile vedere nell’esempio dove il valore contenuto nel <tag> è Mario scrive: "You & Me, forever!"
<tag>Mario scrive: "You & Me, forever!"</tag>
che dobbiamo trasformare in
<tag>Mario scrive: "You & Me, forever!"</tag>
E’ evidente che non possiamo semplicemente sostituire ogni ampersand con & perchè altrimenti otterremmo:
<tag>Mario scrive: &quot;You & Me, forever!&quot;</tag>
Veniamo quindi all’oggetto di questo post:
Nelle espressioni regolari è possibile utilizzare il “Negative Lookup” per NON riconoscere un costrutto SE DOPO ce n’è un’altro.
Nel nostro caso in esempio, l’espressione regolare è
&(?!quot;)
che troverà tutti gli & non seguiti da quot;
e più in generale:
&(?!lt;|gt;|amp;|apos;|quot;)
That’s all folks!
Uno dei punti cardine di un buon processo di sviluppo è stabilire chiaramente cosa significhi che un qualcosa sia completato.
La cosiddetta Definition of Done [DoD] nasce in Scrum, ma è evidente che può, anzi deve, essere adattata a qualunque processo per raggiungere dei risultati accettabili
Sostanzialmente si tratta di una lista di attività, che vanno dallo scrivere codice, al testing, arrivando fino alle release note che aggiungono valore al prodotto. In Scrum è estremamente enfatizzata, cosiccome dalla Continuous Delivery, che quindi pretende che done corrisponda a shippable.
Naturalmente non esiste una DoD universale: va adattata in base allo scenario, al processo utilizzato e soprattutto al livello in cui la stiamo applicando: una DoD di un check-in non corrisponde alla DoD di uno sprint o di un backlog.
E’ essenziale che sia trasparente a tutti i membri del team, e tutti i criteri della DoD devono essere soddisfatti per ogni Product Backlog Item.
Modellare la DoD sul processo significa sostanzialmente utilizzare gli strumenti a disposizione per far si che il workflow di lavoro vada a configurarsi per seguire i passaggi della DoD del team.
Team Foundation Server ci aiuta in vari modi: innanzitutto con le Check-In Policy. Rispettare una serie di Check-In Policy significa dover rispettare alcune regole, quindi aderire alla DoD. Queste regole raggiungono il loro apice con un Gated Check-In, che funge da barriera netta: dentro o fuori. Ovviamente è possibile scrivere altre policy oltre a quelle presenti di default in TFS oppure utilizzare il Check-In Policy Pack for TFS, disponibile su CodePlex.
Nel caso in cui il check-in sia rigettato, è possibile eseguire uno shelve (che purtroppo vedo ancora poco utilizzato in molti casi). Con lo shelve, oltre a poter accantonare quel determinato task e quindi essere pronti per eseguirne un altro in attesa di nuovi sviluppi, si hanno molti piacevoli side effects.
Il primo è sempre in ombra ma in realtà estremamente importante: il backup. Infatti tutti gli shelveset sono coperti dal backup di Team Foundation Server.
Inoltre uno shelveset può essere oggetto di Code Review (in vari modi, a breve dedicherò un post alla nuova funzionalità in Visual Studio 11) da parte di altri membri del team, a tutto vantaggio della qualità.
Senza contare poi che gli shelveset rimangono proprietà intellettuale del proprietario, non essendo solamente un pezzo di codice che rimane lato client ma comunque qualcosa che rimane lato server e quindi all’interno dell’organizzazione.
L’applicazione per .NET Gadgeteer che ho realizzato insieme a Micheal Dodaro, .NET Gadgeteer Servo Camera & Windows Phone Client, è stata inserita nel sito ufficiale di .NET Gadgeteer. In questo momento compare direttamente nella Home Page come Featured Project.
Anche queste sono soddisfazioni, e un chiaro stimolo a continuare sulla strada che ho intrapreso.