Latest Posts
Visto che, ultimamente, la maggior parte dei miei Weekly (Daily? Hourly?) Issue sono dovuti principalmente a questo CMS, ho deciso di creare una sezione apposta :)
Iniziamo con uno degli errori più comuni che mi sono capitati in questi ultimi giorni: non si sa per quale motivo, l’applicativo in produzione ha iniziato a crashare prima ancora di avviarsi, tirandosi dietro tutto il W3WP.exe. L’errore, abbastnza criptico, era:
Type 'umbraco.DataLayer.SqlHelperException' in Assembly 'umbraco.DataLayer, Version=0.3.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
Dopo parecchi giri, discussioni via MSN con alcune persone del core team, e ricerche dovunque, si è scoperto che questo problema è dovuto ad una stringa di connessione sbagliata.
Lo so, è abbastanza ridicolo, e non ho ancora controllato i meccanismi di base per cui una stringa di connessione possa far crashare tutto l’applicativo invece di notificare l’errore. Ma vi assicuro che è assolutamente quello il problema: controllate bene il server, la password, qualsiasi problema di spelling o di mancanze (nel mio caso, lo script nant si era “mangiato” la keyword “Data Source”….).
Expression Blend usa il namespace d per assegnare comportamenti a design time, ad esempio in uno UserControl SilverLight:
<UserControl ...
xmlns:vm="clr-namespace:DocumentViewer.ViewModel"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
d:DesignWidth="640" d:DesignHeight="480">
<UserControl.Resources>
<vm:DocumentVM x:Key="viewmodel" />
</UserControl.Resources>
possiamo sfruttare la proprietà d:DesignInstance insieme a d:DataContext per istruire Blend a creare una istanza della classe indicata:
<Grid x:Name="LayoutRoot" DataContext="{StaticResource viewmodel}" d:DataContext="{d:DesignInstance vm:DocumentVMMock, IsDesignTimeCreatable=True}">
l’aspetto interessante è che a run time il data context è assegnato alla view model DocumentVM, mentre a design time è assegnata a DocumentVMMock, che dai nomi potete immaginare cosa fanno :D, senza necessita di if(IsDesignTime) nel code behind!
la figu da Expresion Blend:
l’esempio l’ho preso qui che parla di SilverLight 4.0, ma questo funziona anche col 3.0
Mi capita spessissimo di lavorare con i Build Events sulle solution, soprattutto usando Umbraco (seguiranno infatti una serie di post su questo CMS. Che è il motivo principale per cui sono sparito in questi mesi :)).
Il problema principale che ho avuto è trovare una vera reference della sintassi. Le macro ci sono quasi tutte, ma spesso non si sa bene che cosa si può fare e che cosa no. Girando un pò, sul sito msdn si spiega che la sintassi dei Pre/Post build event in realtà è la medesima dei “vecchi” comandi MS-DOS. Quindi, potete agilmente trovare la reference sul sito technet. Probabilmente molti lo sapevano già, ma a me ha salvato un pò di ricerche inutili :)
Avevo postato qualche tempo fa qui su degli esempi di user interface diversi dal solito.
Il buon Karl Shifflett, ispirato anche lui da Billy Hollis e dal video che ho segnalato nel post, ha realizzato BBQ Shack, un'applicazione basata sul suo framework Ocean e che riproduce quanto fatto da Billy Hollis, lo trovate qui.
Al momento solo per gli abbonati MSDN, ma tutti gli altri devono semplicemente attendere domani (o forse di più se le richieste intaseranno i server…):
http://blogs.msdn.com/jasonz/archive/2010/02/09/announcing-vs2010-net-framework-4-release-candidate-rc.aspx
Per chi come me ha cominciato ad usarlo in produzione (fortunatamente interna…) è sicuramente una splendida notizia!
Dopo aver superato i piccoli problemi tecnici che mi impedivano di "postare" (grazie al buon
Andrea) eccomi nuovamente operativo

.
Ecco una casistica che abbiamo affrontato ultimamente all'interno del team di sviluppo, ovvero l'utilizzo di cache di 2° livello e connessione manuale con NHibernate (purtroppo utilizziamo ancora la 1.2.1).
Come da post del buon
Ayende, nel momento in cui si utilizza una connesione manuale la cache di 2° livello non funziona più correttamente. Dopo le prime ricerche siamo giunti alla soluzione che utilizziamo attualmente, ovvero realizzare un
ConnectionProvider personalizzato.
Nel nostro caso abbiamo bisogno di utilizzare la connessione ad un DB A o un DB B in base a delle particolari condizioni (ovviamente sono strutture identitche) e quindi abbiamo realizzato una soluzione di questo tipo (prendete con le molle lo "pseudocodice") :
public class CustomConnectionDriver : NHibernate.Connection.ConnectionProvider
{
public override IDbConnection GetConnection()
{
IDbConnection currentConnection;
//Selezione della connessione in base ai criteri
if (....)
{
currentConnection = ConnessioneA;
}
else
{
currentConnection = ConnessioneB;
}
currentConnection.Open();
return currentConnection;
}
}
Successivamente andrà configurato nel file di NHibernate il nostro nuovo connection provider:
<property name="connection.provider">CustomConnectionDriver </property>
Ora basta avviare il progetto e provare a verificare il corretto funzionamento della cache di 2° livello.
In VB.NET 10 sono stati introdotti le property ed event template.
Qui viene spiegato il funzionamento.
Eravamo rimasti con l’avere un qualcosa di semplice ma funzionante ed in questa parte vedremo piu’ in dettaglio come utilizzare gli Export e gli Import, a cosa serve la classe Lazy<T> e l’attributo PartCreationPolicy.
Exports
Finora abbiamo visto che una ComposablePart puo’ esportare properties, fields oppure se stessa (come nel caso del MainViewModel).
Se invece avessimo l’esigenza di esportare un metodo, MEF lo vedrebbe come un delegate per cui è necessario specificare il delegate che stiamo esportando (in questo caso un Action<string>)

e di conseguenza l’import dovrà avere lo stesso contratto

Imports
Se volessimo passare le dipendenze tramite costruttore come fa un IoC container? Niente di piu’ facile :) MEF ci offre l’attributo ImportingConstructor

NB: per discussioni riguardo all'uso di MEF come IoC container date un’occhiata a questi post di Glenn Block
http://codebetter.com/blogs/glenn.block/archive/2009/08/16/should-i-use-mef-for-my-general-ioc-needs.aspx
http://codebetter.com/blogs/glenn.block/archive/2009/10/31/should-i-use-mef-with-an-ioc-container.aspx
Una chicca offerta da MEF è l’attributo ImportMany che ci permette di importare piu’ plugin (nel nostro caso) con lo stesso contratto

modificando leggermente la view ed aggiungendo qualche plugin all’interno del progetto otteniamo un risultato di questo tipo

Ma come facciamo a sapere se gli imports di una nostra classe sono stati eseguiti correttamente? In questo caso ci viene incontro l’interfaccia IPartImportsSatisfiedNotification con il suo unico metodo OnImportsSatisfied che verrà chiamato quando tutti gli imports che possono essere soddisfatti verranno eseguiti.
Lazy:
Quando il container inizia a fare il suo sporco lavoro (cioè comporre le varie parti) e trova un Import, questo Import comporterà la creazione di una o piu’ istanze della parte che lo soddisfa. Questo potrebbe essere un fattore da considerare nel caso della creazione di grossi grafi di oggetti. Proprio per questo all’interno di MEF è presente la classe Lazy<T> che si occuperà di creare l’istanza della classe specificata al primo utilizzo.

La prima volta che si andrà ad utilizzare la proprietà Plugin MEF creerà l’istanza del relativo export e potremo accedervi semplicemente scrivendo Plugin.Value (la proprietà Value ritornerà sempre la stessa istanza).
Quando il container cerca di comporre tutto “l’ambaradan” e non trova un export che per ogni import definito lancerà un’eccezione, ma per evitare tutto ciò è possibile settare la proprietà AllowDefault della classe ImportAttribute a true. In tal modo il container darà all’import non soddisfatto il valore di default.
Ora mettiamo il caso che scriviamo un qualcosa del genere…o meglio creiamo due o piu’ proprietà che hanno lo stesso contratto. La domanda che sorge spontanea è: il container come reagirà? Creerà due istanze diverse oppure Plugin e Plugin2 punteranno alla stessa istanza?

Debuggando il tutto si puo’ notare che entrambe le proprietà puntano alla stessa istanza (hanno Object ID uguale). E se volessimo avere istanze diverse?
E’ sufficiente decorare l’export con l’attributo PartCreationPolicy e passargli CreationPolicy.NonShared

Nel prossimo post vedremo i Catalog messi a disposizione da MEF (Preview 8) e l’implementazione di un catalogo personalizzato.
Stay tuned…
Un'altra di quelle cose che mi ha sconcertato...
Nel Contratto del Commercio (e parlo di quello nazionale) la malattia viene retribuita in maniera davvero singolare:
Per i primi 3 giorni viene corrisposto il 100% dello stipendio (periodo di carenza) ed è carico del datore di lavoro.
Dal 4° al 20° giorno è previsto il 75% (!) della paga: 50% a carico dell'INPS e 25% a carico del datore di lavoro.
Dal 21° giorno in poi (fino al limite di 180 giorni) è previsto nuovamente il 100% ma suddiviso tra: 66,66% INPS, 33,34% a carico del datore di lavoro.
Rinvio a un secondo post il calcolo perchè è davvero complicato.
Premessa: forse questo post sarebbe più da “forum” che da “muro” ma lo posto qui sperando che il problema non sia solo mio. Sempre pronto, comunque a toglierlo dal muro se lo ritenete necessario. 
Problema: sono l’unico sviluppatore nella mia azienda (che ovviamente non produce SW). Come in molte altre situazioni come la mia non solo programmo ma faccio diversi altri lavori “informatici” (acquisto del nuovo HW, query e report vari, seguire progetti legati a connettività, telecomunicazioni, ecc.). Oltre a questo ho sulla scrivania tutti i famosi capelli (analista, sviluppatore, tester, ecc.) e probabilmente non vesto perfettamente nessuno di questi. 
Con il crescere dei progetti (in numerosità e quantità) mi trovo sempre più spesso a lavorare tutta la gionata e a fine giornata chiedermi, mentre torno a casa: “ma oggi non dovevo fare…, ma cosa ho fatto tutto il giorno?” 
Domanda: Al momento ho scovato solo una tecnica che mi possa aiutare nella soluzione del problema (quella del pomodoro di cui ho disquisito “poco tempo fa” con Nicolò). Avete delle best practice per “portar fuori la pellaccia”?
E’ nato il primo User Group d’Europa dedicato all’ALM! Si tratta dello UK ALM User Group :) Se vi capita, giovedì hanno il loro primo meeting, in piena Greater London (sede Microsoft a Cardinal Place, Victoria Station Tube stop).
Dai che una birra, in un pub a Londra, non può non starci se siete in zona…ve lo dice uno che è INNAMORATO della City :D
Buono a sapersi...
In caso di trasferta al dipendente è dovuto il rimborso delle spese che ha sostenuto in base alle tabella ACI. Ma attenzione ne esistono di due tipi:
1. Costi chilometrici (Per calcolare i rimborsi al dipendente (o al professionista) che faccia uso del proprio veicolo svolgendo attività a favore del datore di lavoro.)
http://www.aci.it/index.php?id=1850
2. Fringe benefit (Per calcolare la retribuzione in natura derivante dalla concessione di veicoli aziendali in uso ai dipendenti, per esigenze di lavoro e per esigenze private.)
http://www.aci.it/index.php?id=93
I servizi sono accessibili direttamente dal sito dell'ACI (dove viene spiegata chiaramente la differenza):
http://www.aci.it/index.php?id=86
Attenzione che i secondi sono più bassi nei primi (almeno nei casi che ho verificato). Per la mia auto addirittura si dimezzano!
* Visa: ^4[0-9]{12}(?:[0-9]{3})?$ All Visa card numbers start with a 4. New cards have 16 digits. Old cards have 13.
* MasterCard: ^5[1-5][0-9]{14}$ All MasterCard numbers start with the numbers 51 through 55. All have 16 digits.
* American Express: ^3[47][0-9]{13}$ American Express card numbers start with 34 or 37 and have 15 digits.
* Diners Club: ^3(?:0[0-5]|[68][0-9])[0-9]{11}$ Diners Club card numbers begin with 300 through 305, 36 or 38. All have 14 digits. There are Diners Club cards that begin with 5 and have 16 digits. These are a joint venture between Diners Club and MasterCard, and should be processed like a MasterCard.
* Discover: ^6(?:011|5[0-9]{2})[0-9]{12}$ Discover card numbers begin with 6011 or 65. All have 16 digits.
* JCB: ^(?:2131|1800|35\d{3})\d{11}$ JCB cards beginning with 2131 or 1800 have 15 digits. JCB cards beginning with 35 have 16 digits.
Abbiamo pubblicato il materiale del workshop "Tra presente e futuro delle interfacce utente con WPF e MVVM", e questa volta oltre a codice e slide siamo riusciti a fare anche i video!
Probabilmente a livello di qualità delle riprese si può fare di meglio… ma direi non male come prima volta da cameraman :)!
Trovate tutto il materiale qui!
PS: anche se in futuro cercheremo di fare le riprese, purtroppo non possiamo garantire di avere sempre a disposizione gli strumenti, come tra l’altro già successo per il workshop precedente :(, per cui se potete vi consigliamo sempre di partecipare di persona per non rischiare di perdervi i contenuti… e soprattutto per avere delle possibilità di “fare networking” che con i video sicuramente vi perdereste (vedi il ragazzo che durante l’ultima sessione è stato sempre a parlare con Mauro per chiedergli approfondimenti)!
PS2: purtroppo non ci sono i video della “cena”… che come ha detto qualcuno, più che una cena è stata “un’esperienza”, con un personaggio unico a fare da cuoco/intrattenitore!
Quando si usa la funzionalità Edit Template->Edit a Copy di Blend
Blend in realtà crea uno style che applica il template appena estratto.
Personalmente mi piace organizzare le risorse all’interno di resource dictionaries (styles.xaml, templates.xaml…) e, sebbene Blend permetta di specificare dove posizionare lo style il risultato è che style e template sono tutt’uno e spesso finisco per spostare il template nel relativo resource dictionary e linkarlo nello style via {StaticResource} manualmente.
Oggi, Laurent, mi ha indicato come fare il tutto direttamente da Blend: Mentre si è in modalità di editing del template, selezionate il simbolo dello style nell’elenco superiore:
dopodichè selezionate il property peg della proprietà Template e selezionate Convert to new resource
e decidete dove memorizzare il template. 
Technorati Tags:
Expression Blend
Segnalo questi tre video sul come creare una applicazione Silverlight di tipo enteprise.
se avete installato RIA Services, quando create un nuovo progetto tra le varie opzioni c’ anche WCF RIA Services Class Library, se qualcuno di voi, come me, avete provato a creare tale progetto, e l’avete quindi cancellato perchè non avete capito come utilizzarlo, ebbene in questi tre video ci sono i passaggi:
Part One: http://www.screencast.com/t/NGNiZjg3ZjY
Part Two: http://www.screencast.com/t/NGJkYTEw
Part Three: http://www.screencast.com/t/MWQ2MjdiYTct
Presi dal blog : http://www.riaservicesblog.net/Blog/
Segnalo a questo link una bella applicazione silverlight d’esempio per quanto riguarda lo stile.
Applicazione silverlight
Guardate anche la gestione dei PDF e del calendario, bellissimo!!!!
Per chi avesse ancora dubbi su silverlight…
http://www.timdown.co.uk/jshashtable/#setup
1: <script type="text/javascript" src="jshashtable.js"></script>
2: <script type="text/javascript">
3: var typesHash = new Hashtable();
4:
5: typesHash.put("A string", "string");
6: typesHash.put(1, "number");
7:
8: var o = new Object();
9: typesHash.put(o, "object");
10:
11: alert( typesHash.get(o) ); // "object"
12: </script>
Il .NET Framework fornisce un semplicissimo metodo per recuperare l’icona associata ad un file eseguibile, System.Drawing.Icon.ExtractAssociatedIcon. E’ possibile utilizzarlo, ad esempio, per impostare automaticamente l’icona della form principale della nostra applicazione sull’immagine specificata nelle proprietà del progetto:
Me.Icon = Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath)
Semplice e veloce :-)