mercoledì 1 settembre 2010
Per impostazione predefinita, le ultime versioni di Internet Explorer bloccano il download di un file, facendo apparire all’utente una barra di avviso proprio sotto la barra degli indirizzi, e sotto la barra dei tab. Ho sempre odiato questa cosa, essenzialmente per due motivi diversi:
- sono un utente che so quello che sta facendo, per cui sono sul sito xyz e clicco un pulsante Download, probabilmente quello che voglio fare ed ottenere è proprio il download di un file
- confermando il download, IE refresha la pagina: spesso è un semplice refresh, altre volte (come su MSDN Download) la cosa è più fastidiosa, perchè bisogna rifare daccapo tutta la navigazione che si era fatta per raggiungere il link del download
Se volete togliere questa barra di avviso, potete fare come segue:
- Aprite Internet Explorer, poi andate sul menù Tools e poi su internet Options
- Andate sotto il tab Security e cliccate sul pulsante Custom level…
- Cercate la voce Automatic prompting for file downloads ed attivate l’opzione Enable (in italiano appare come Richiesta di conferma automatica per download di file)
- Chiudete e confermate il tutto

Adesso IE non vi chiede più nulla, scaricate e basta!
domenica 1 agosto 2010
Questa sera voglio parlarvi di un “dietro le quinte” di Entity Framework, ovvero una particolare situazione che mi è capitata durante le settimane scorse. Per la lettura di questo post assumo che sappiate:
- cosa sia un database
- cosa sia Entity Framework
- cosa sia un’applicazione Silverlight o giù di lì
- cosa siano i RIA Services
Dunque, cerco di arrivare al sodo in poche linee. Supponiamo di aver disegnato il seguente db:

Questa immagine arriva così com’è dal database diagram di SQL Server Management Studio. Forse è un database di cui avevo già parlato in passato in altri post. Abbiamo una tabella “Teams” contenente un po’ di squadre di calcio, ed abbiamo una tabella “Players” che mantiene l’elenco dei giocatori squadra per squadra. Il campo “IdTeam” della tabella “Players” serve proprio per mantenere questa relazione.
Ora, immaginiamo due scenari perseguibili:
- la tabella “Players” contiene solo giocatori che effettivamente appartengono ad una squadra
- la tabella “Players” contiene anche giocatori che NON appartengono ad alcuna squadra
Voi come realizzereste questa cosa? Il modo più semplice è quello di sfruttare in modo opportuno il campo “IdTeam” citato prima. Se “IdTeam” contiene NULL, quel record contiene un giocatore libero (non appartenente a nessuno), altrimenti contiene un ID che fa riferimento ad un Team esistente. Dal punto di vista del database, non ci sono particolari accrocchi da fare: è sufficiente impostare NULL / NOT NULL sul campo “IdTeam” ed il gioco è fatto (ed eventualmente rimuovere il valore predefinito dal campo stesso).
Come si comporta invece Entity Framework in questi due scenari?
Beh, devo dire che si comporta piuttosto bene. Ecco come appare il designer in entrambi i casi:
 | In questo primo caso, la relazione che lega le due entity è uno a molti. Se nel designer selezioniamo IdTeam, vediamo che la proprietà Nullable è False. |
 | In questo secondo caso, la relazione è 0..1. Se nel designer selezioniamo IdTeam, vediamo che la proprietà Nullable è (None). |
Una piccola precisazione. Ci sono almeno due piccole imperfezioni nella funzionalità di Update model from Database del designer di EF:
- non si accorge se cancellate un campo da una tabella (per adesso non ci riguarda)
- non si accorge se un certo campo diventa NULL / NOT NULL (questo invece ci riguarda eccome!)
Morale: se andate nel Management Studio e cambiate la proprietà Allow Nulls del campo “IdTeam” della tabella “Players”, e poi andate in VS2010 per refreshare il data model di EF, questi rimarrà invariato. Avete due possibilità: o cancellate la tabella e la riaggiungete (fattibile se le cose sono davvero semplici), oppure cambiate semplicemente la proprietà Nullable del campo (quest’ultima strada non l’ho provata).
Comunque sia, alla fine vi ritrovate il data model che rispecchia esattamente la struttura del vostro database.
E con le classi POCO, come siamo messi?
Da quando ho cominciato a lavorare con Silverlight 4 & EF4, ho subito utilizzato la possibilità di persistere oggetti generati tramite il template di classi POCO. Come si comporta questo template nei due casi esaminati sopra? Beh, anche qui la cosa è abbastanza intelligente!
Se il campo “IdTeam” non ammette NULL, allora è la proprietà è un semplice int.
Se il campo “IdTeam” ammette NULL, allora la proprietà IdTeam della nostra classe è una Nullable<int>, ed appare come segue:
public virtual Nullable<int> IdTeam
{
get { return _idTeam; }
set
{
try
{
_settingFK = true;
if (_idTeam != value)
{
if (Team != null && Team.Id != value)
{
Team = null;
}
_idTeam = value;
}
}
finally
{
_settingFK = false;
}
}
}
private Nullable<int> _idTeam;
Il codice qui sopra proviene dalla definizione della classe Player.
Caricare dati attraverso i RIA Services
Altro balzo in avanti. Supponiamo adesso di aver chiuso tutto il giro, e di aver implementato una piccola applicazione Silverlight che da qualche parte mostri una ListBox con l’elenco delle squadre: quando l’utente clicca su una squadra, viene eseguito un command che carica i giocatori di quella squadra, e li mostra in un’altra ListBox. Ora – non ci interessa sapere che il tutto è stato fatto con M-V-VM e tutto il resto.
Quello che conta è che da qualche parte il nostro codice sarà una cosa tipo questa:
void loadPlayersCommandExecute(object value)
{
if (value == null) return;
Team t = value as Team;
TeamsDomainContext dc = new TeamsDomainContext();
var query = dc.GetPlayersQuery().Where(pl => pl.IdTeam.Equals(t.Id));
dc.Load<Player>(query, callbackPlayers, null);
}
Questo è l’execute del command che carica i giocatori. Arriva in input un object, che è il SelectedItem della ListBox delle squadre.
Domanda per voi: se abbiamo impostato che “IdTeam” ammette NULL (che alla fin fine è lo scenario che ho applicato), questa riga di codice a runtime funziona? Per compilare compila, ma in esecuzione si schianta. E si schianta sull’ultima linea, al momento della chiamata a Load().
Perchè? Notare la clausola Where: la proprietà IdTeam di pl è Nullable<int>, mentre t.Id ritorna int.
In questo caso ho chiamato il metodo Equals su un reference type (Nullable<int>, o int? che dir si voglia), passando come parametro un value type (int). E tutto ciò non va affatto bene. L’exception contiene il seguente messaggio:
Expression of type 'System.Int32' cannot be used for parameter of type 'System.Object' of method 'Boolean Equals(System.Object)'
Come risolvere la cosa. Basta sostituire la chiamata a Equals con il più banale ==. Ecco come diventa la query:
var query = dc.GetPlayersQuery().Where(pl => (pl.IdTeam == t.Id));
Ed il gioco è fatto!
La notizia è rimbalzata su Twitter, Facebook ed ovviamente sui canali ufficiali, ma voglio comunque parlarne pure io qua sul mio blog. Mercoledì 4 Agosto a Milano e Giovedì 5 Agosto a Roma, Microsoft ha organizzato due giornate in cui tutti noi sviluppatori su Windows Phone 7 potremo testare e provare le nostre applicazioni, non tanto sull’emulatore (altrimenti lo faccio anche a casa mia :-P), ma su veri smartphone WP7.
Ma ho anche una brutta notizia per voi: se non ne sapevate nulla e lo state leggendo adesso sul mio blog, siete fregati, perchè questi due eventi erano a numero chiuso ed era necessario iscriversi entro il 30 Luglio per poter partecipare. Pazienza!
Ma non tutto è perduto, però: c’è anche una bellissima cena, denominata WP7 Pizza, organizzata tramite Facebook. Unitevi e partecipate con noi, sarà sempre un’occasione per trovare amici di community, e magari vedere dal vivo qualche bel device WP7!
Che ne dite, si può fare?

giovedì 29 luglio 2010
C’è molto rumore attorno a Windows Phone 7, il sistema operativo che Microsoft sta lustrando e sta promuovendo in lungo e in largo per – credo – il prossimo Natale. Dal punto di vista di noi developer, le cose sono molto interessanti, perchè cellulari con su WP7 possono essere tranquillamente programmati usando il nostro amato .NET Framework.
Scendendo più nel dettaglio, è sufficiente saper sviluppare applicazioni con Silverlight ed il gioco è fatto. Certo, ci sono dei piccoli dettagli da prendere in considerazione, perchè la nostra futura app non gira dentro un browser. Le applicazioni Windows Phone 7 sono applicazioni Silverlight 3 che girano in modalità out-of-browser. Poi bisogna pensare al fatto che – trattandosi di un device mobile – non ci sono tastiere, nè mouse, ma si interagisce con lo screen touch e così via. Le solite cose che per chi ho lavorato con dispositivi mobile non sono una novità.
Se volete scendere ancora più nel dettaglio, invece, vi consiglio di leggere questo post di Corrado, che evidenzia tra le altre cose un aspetto piuttosto importante di WP7: ovvero, questo sistema operativo non è multi-tasking.
Cosa comporta questo per un utente normale? Significa che può aprire una sola applicazione alla volta. Se apriamo l’applicazione “Pippo”, poi premiamo Home per tornare alla schermata iniziale, la nostra applicazione viene chiusa a tutti gli effetti (pare che tombstoned sia il termine ufficiale di Microsoft). Se l’utente riclicca sull’icona della nostra applicazione, dobbiamo fargli credere che in realtà non si sia mai chiusa, ripristinando lo stato esattamente com’era. lo spiega bene Corrado nel post linkato sopra.
Mi fa un po’ storcere il naso questo meccanismo. Ecco un po’ di punti deboli:
- bisogna prestare attenzione ad un eventuale splash screen della nostra applicazione: se è davvero un avvio a tutti gli effetti, questi deve apparire. Se l’avvio avviene dopo un tombstone, allora questi NON deve apparire
- impossibilità di scrivere applicazioni che girano davvero in background. Ad esempio: su Symbian posso tranquillamente lanciare l’esecuzione di un GPS tracking, che se ne sta lì buono buono a tracciare la posizione e a scrivere il suo file di log, e contemporanemente posso ricevere telefonate, navigare, scrivere un sms: tutto quello che il cellulare può fare
- questa decisione è stata presa per risparmiare batteria e limitare i consumi, per salvaguardare il punto di vista dell’utente. Avrei preferito – però – che dicessero che un’app in background può usare solo l’1% del processore, oppure solo 16Mb di RAM, oppure non può accedere allo storage SD, ad esempio. Così si possono scrivere un sacco di belle applicazioni, ma se ne taglia comunque una bella fetta.
Anche durante l’evento DotNetLombardia della settimana scorsa è saltata fuori questa questione. Si ragionava che evidentemente sarà un po’ più scomodo usare Tom Tom Navigator su WP7, perchè se mentre sto guidando arriva una telefonata o un sms, beh, ecco, insomma, Tom Tom si chiude. Certo, si può riaprire, ma non è così rapido come può sembrare. Almeno credo.
Forse però parlo da utente skillato. Magari il target per WP7 studiato da Microsoft non è così esperto. Però vi dico solo una cosa: mio padre, che ha anche lui un Nokia piuttosto evoluto, ha imparato a riconoscere quando un’app è in esecuzione/aperta, perchè accanto alla sua icona ne appare un’altra … una specie di “ingranaggio” (che però dipende dal tema in uso sul cellulare), che indica appunto che quell’applicazione sta girando in background.
Vedremo, io non ho mica la verità in mano!
venerdì 23 luglio 2010
Grazie al buon Ale forse ho raggiunto una soluzione intelligente e che mi piace. Lo scopo era quello di gestire il doppio-click all’interno di un’applicazione Silverlight 4 senza troppi fronzoli, e potendo sfruttare il tutto in un’ottica Model-View-ViewModel, quindi senza alcun codice nel code-behind delle Page.
Il tutto parte da questo post, segnalatomi questa mattina da Alessandro, appunto. :-)
Il codice del post implementa un DoubleClickTrigger, da inserire poi come child di un qualsiasi componente grafico della nostra pagina, come StackPanel, TextBlock e così via. Voglio solo riproporre qui solo una parte del codice di quell’articolo, ovvero il gestore dell’evento OnMouseButtonDown:
private void OnMouseButtonDown(object sender, MouseButtonEventArgs e)
{
if (!timer.IsEnabled)
{
timer.Start();
return;
}
timer.Stop();
// Qui si scatena il doppio-click, eseguo quello che devo eseguire
}
E’ piuttosto semplice: al primo MouseDown parte un piccolo Timer da 200ms. Se l’utente clicca nuovamente entro questo tempo, significa che è avvenuto un DoubleClick, e quindi raggiungiamo la riga di codice che qui sopra vedete commentata. Se mettessimo una MessageBox.Show(“”);, a tutti gli effetti sul doppio-click appare il vostro messaggio.
In un’ottica M-V-VM, però, sappiamo benissimo che tutto ciò che deve essere eseguito deve essere contenuto nella nostra classe ViewModel. La soluzione in questo caso è usare una attached-property, che permette di attaccare ad un componente grafico una qualsiasi istanza di ICommand, anche dove solitamente non sarebbe possibile. Ed ecco quindi poche righe di codice che lo rendono possibile:
public static class ControlsCommandHelper
{
public static DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command",
typeof(ICommand),
typeof(ControlsCommandHelper),
new PropertyMetadata(null));
public static void SetCommand(DependencyObject target, ICommand value)
{
target.SetValue(ControlsCommandHelper.CommandProperty, value);
}
public static ICommand GetCommand(DependencyObject target)
{
return (ICommand)target.GetValue(CommandProperty);
}
}
A questo punto l’event handler sopra diventa:
private void OnMouseButtonDown(object sender, MouseButtonEventArgs e)
{
if (!timer.IsEnabled)
{
timer.Start();
return;
}
timer.Stop();
UIElement element = sender as UIElement;
if (element != null)
{
ICommand command = element.GetValue(ControlsCommandHelper.CommandProperty) as ICommand;
if (command != null)
{
command.Execute(null);
}
}
}
Morale: quando avviene un DoubleClick, prendo lo UIElement che ha scatenato l’evento, recupero la sua attached property Command e – se tutto va a buon fine – semplicemente eseguo il comando. In questo caso passo null all’Execute(), altrimenti dovrei gestire anche il CommandParameter.
Quindi, niente code-behind. Il tutto può essere inserito, come dicevo all’inizio, anche all’interno di un DataTemplate di una ListBox, quindi questa tecnica può essere benissimo utilizzata per reagire al doppio-click, lavorando sul SelectedItem della ListBox stessa.

Rimane solo il problema dei 200ms, che non mi piacciono perchè dovrebbe essere l’OS che si prende cura di dirmi quando è avvenuto un doppio-click. Anche perchè un utente può andare nel pannello di controllo e allungare/diminuire il tempo considerato per il doppio-click, e così facendo lo ignoro e basta.
Ecco comunque un piccolo codice sorgente che può essere utile.
E’ da qualche giorno che ho in testa questo post, e lo sto scrivendo nella mia testa, ponderando bene le parole ed i termini da utilizzare. Probabilmente martedì mattina è stata la mia peggior giornata lavorativa da un bel pezzo a questa parte, e vi posso assicurare che ce ne vuole.
Ritengo la mancanza del doppio-click in Silverlight 4 una vera e propria cazzata.
Gli esperti non me ne vogliano, ma dire che SL4 è un framework pensato per il Web e quindi il doppio-click è male, è semplicemente assurdo, vuol dire negare la realtà e vuol dire adeguarsi passivamente a ciò che ci è stato imposto, senza pensare con un po’ di creatività e senza un minimo stimolo a migliorare le cose per il futuro.
Silverlight 4 non è un framework pensato per il Web: SL4 è un framework per la realizzazione di applicazioni distribuite sul Web. Ne usufruite per la maggior parte all’interno del vostro browser, ma girano sul vostro PC e dal punto di vista tecnico sono più vicine ad un’applicazione desktop che ad altro. SL4 è anche il framework che usiamo/useremo in futuro per scrivere applicazioni su Windows Phone 7, e non è affatto detto che siano Web. Con SL4 posso scrivere videogiochi, software per la contabilità personale, per ricordarmi le medicine da prendere, per prendere appunti: applicazioni di qualsiasi tipo. E un’applicazione degna di questo nome deve poter permettere all’utente di interagire con il doppio-click. Punto.
Windows consente l’utilizzo del doppio-click: perchè una mia applicazione SL4 out of browser non dovrebbe permetterlo?
E poi, lasciate che vi dica una cosa: dire che sul Web non si dovrebbe usare il doppio-click a me sembra una regola di usability, e non una questione tecnica o simili. Una regola di usability non dovrebbe essere cablata nel framework che sto utilizzando. Altrimenti di questo passo non dovrebbe permettere di scrivere del testo verde su background verde. Non dovrebbe permettere di inserire più di 5000 elementi in una ListBox. Insomma, certe cose sono e devono essere a carico del developer, e non stupide limitazioni inserite nello strumento tecnologico che si sta utilizzando per il proprio lavoro. Un framework dovrebbe permettere ad un dev di raggiungere il suo scopo, nel bene e nel male: se la mia app è scritta bene e funziona bene, ne venderò 1.000.000 di copie, altrimenti nessuna. E sinceramente decidere di voler usare il doppio-click non mi sembra così male.
Seguendo questo ragionamento, non avrebbero dovuto inserire nemmeno l’evento MouseWheel: avete mai visto un sito Web che gestisce la rotellina del mouse? Se lo avete visto, non era un sito Web: era un’applicazione. Tutti i sw gestiscono la rotellina, per zoomare avanti e indietro. In giochi come Call Of Duty posso cambiare arma, con la rotellina. Posso scrivere app in SL4 che con la rotellina scorrono gli elementi di una ListBox, e poi su quest’ultima non posso gestire un banale e semplice doppio-click?
Lasciate che vi dica un’altra cosa: negli ultimi decenni (2 o 3, non esageriamo) è il modello di programmazione Web che pian piano si è concettualmente spostato verso il modello di programmazione Desktop. Probabilmente sono la persona meno indicata per dirvelo, ma dal punto di vista utente ho visto comparire sul Web modalità di interazione tipiche del desktop: finestre di dialogo modali, drag’n’drop, etc. etc. Anche per noi sviluppatori la cosa è fin troppo evidente: cosa sono le Web Forms se non la trasposizione sul Web delle Windows Forms? Anche nel loro comportamento, intendo dire, copiano in tutto e per tutto una tipica applicazione desktop. E’ giusto che sia così, perchè i due mondi si sono e si stanno avvicinando sempre di più, a volte toccandosi nel caso di Silverlight che – lo ripeto – è a tutti gli effetti un sw locale, che gira sul vostro PC e sfrutta le risorse locali del vostro PC.
Altra questione: ma Silverlight non doveva sin dalla prima release essere allineato al 100% con la sua controparte WPF? Ora, mi rendo conto che non è dal tutto possibile, perchè sono stupido ma non fino a questo punto. Però un conto sono limitazioni tecniche oggettive, un conto è aver stabilito a tavolino che un developer Silverlight non può gestire mai, in nessun caso, un semplice doppio-click. La cosa secondo me divertente è che in WPF posso farlo su qualsiasi controllo, anche dove dal punto di vista della usability sarebbe assurdo: perchè? Perchè è compito del developer fare ciò che è più giusto: nessuno si sognerebbe mai di fare doppio-click su un Button, semplicemente perchè con un Button non si interagisce così. E così via, gli esempi si sprecano.
E poi, teniamo presente che in WPF/Silverlight possono customizzare l’aspetto di ogni controllo. Posso far apparire un Button come una ListBox e viceversa. Posso customizzare ogni cosa. Microsoft mi dà una potenza ed una libertà mai avuta prima, e poi non mi permette per definizione la gestione del doppio-click. Cavolo, ce l’avevo in Visual Basic 4.0 quasi 20 anni fa!!
E non venitemi a dire che – sì, certo – puoi comunque gestirlo: basta contare il tempo in ms tra un click e l’altro. Stiamo scherzando? Con tre click posso creare un’applicazione con i RIA Services, e poi devo passare un giorno intero a gestire due eventi MouseDown contando il tempo per vedere quando e come si scatena un doppio-click. Avendo cura, sia chiaro, di confrontarlo con il tempo impostato nel sistema operativo, altrimenti…
E’ apparsa ieri una scritta in una slide nel’evento GroundZero di DotNetLombardia: “Let brighest developers builds business application”. Sul fatto che io sia un brightest developer è tutto da vedere, ma il focus è che noi developer di applicazioni finali dobbiamo preoccuparci di costruire le applicazioni per far guadagnare le nostre aziende, e non litigare per l’ennesima volta per trovare un workaround ad una evidenza mancanza dello strumento di sviluppo che si sta utilizzando.
La mia paura, tra l’altro, non è tanto ‘sto bendetto doppio-click (che è solo la goccia che ha fatto traboccare il vaso), ma è l’idea che qualcuno là a Redmond, o dove diavolo sta il palazzo dove si sviluppa il .NET Framework, decida a tavolino di togliere questo o quello in base a strane regole che fino al giorno prima non c’erano. Regole di usability, regole dettate dalla moda del momento, senza alcuna certezza che varranno così anche nel futuro.
Insomma, se qualcuno di voi ha voglia di tradurre in inglese questo mio post, lasci pure trasparire un po’ di rabbia e di frustrazione, perchè è esattamente quella che ho provato martedì mattina, e continuerò a provarla ancora per un po’.
Sapete qual’è l’ultima cosa davvero divertente? Non vedo l’ora di leggere le features di SL5, perchè non posso davvero credere che non venga presa in considerazione questa cosa.
Un Igor molto, molto deluso, e che ora può tornare a dormire un pochino.
giovedì 22 luglio 2010
Sono davvero molto stanco, perchè non mi capitava da mesi di rimanere imbottigliato nel traffico milanese – motivo per cui sono arrivato alle 9:20 all’evento, pur partendo alle 7:40 da casa (ed il mio TomTom mi pronosticava l’arrivo alle 8:25). Complimenti al traffico milanese e ai lavori dell’ATM in Via Porpora. Ma torniamo a noi!
Oggi ho partecipato all’evento Ground Zero della neonata community DotNetLombardia. Come avevo anticipato ed intuito ieri sera, non conoscevo quasi nessuno, al contrario di quanto accade invece in workshop come quelli UGIdotNET oppure negli altri delle varie community locali.
Non sto qui a fare un riassunto di questa sessione o di quell’altra. Voglio però fare i complimenti a Matteo Pagani per la sua sessione su Windows Phone 7. E’ un tipo brillante, molto bravo, e si vede/sente lontano 10 miglia che c’è passione in quello che dice e fa. Miglior sessione del giorno, per me.
Complimenti anche a Ugo, perchè per farmi piacere qualcosa che StartsWith(“ASP.NET”), ce ne vuole. E lui ci è riuscito!

E complimenti anche a tutti gli altri: la mia memoria – o forse la stanchezza – non mi permettono di ricordare i loro nomi. In primis la sessione su Sharepoint 2010.
Complimenti in generale poi a tutta DotNetLombardia per l’organizzazione, perchè posso immaginare che ci sia dietro un bello “sbattimento”, un po’ lo stesso che devono affrontare le altre community in contesti simili. Però per essere il primo evento, direi che non c’è male!
Purtroppo – e questo è davvero un peccato – non ho potuto partecipare alla cena. Sarà per la prossima volta!
mercoledì 21 luglio 2010
Con le community .NET che spuntano ormai come funghi un po’ ovunque, è sempre più facile trovare eventi e workshop nelle vicinanze. Domani è il turno dell’evento Ground Zero di DotNetLombardia.
Brain-Sys mi permette di partecipare per l’intera giornata, e quindi ci sarò. Sarà un evento per certi versi strano, perchè gli speakers non saranno i soliti amici a cui ormai sono abituato :-), ma saranno volti nuovi. Meglio così, sarà l’occasione per fare nuovi incontri ed amicizie.
La scaletta del workshop mi interessa per la keynote sul cloud computing, per Windows Phone 7 e soprattutto per la sessione intitolata RIA Services in a real Silverlight business application, tecnologie su cui sono praticamente impegnato quotidianamente. Vediamo se salta fuori qualcosa di interessante. Dal canto mio allo speaker di questa sessione una piccola richiesta l’ho già fatto, vediamo cosa salta fuori di buono.
Insomma, ragazzi, domani ci si vede là!!!
Da qualche settimana dalla mia installazione di Visual Studio 2010 erano spariti un po’ di templates dalle finestre di dialogo New Project e Add New Item. Non so bene quali di preciso, ma ve ne dico due che di sicuro mi mancavano: il progetto Silverlight Application e l’oggetto Class.
Davvero scomodo. :-) La mancanza di Class tra l’altro mi costringeva ad aggiungere al progetto un semplice Code File, per scrivere a mano ogni volta namespace + public partial class, etc. etc.
Stamattina mi sono deciso a risolvere la questione, trovando questo post che risolve il problema. Il post si riferisce a Visual Studio 2008, ma si adatta anche a Visual Studio 2010.
E’ sufficiente eseguire il comando devenv /InstallVSTemplates, ovviamente dalla directory dove avete installato l’IDE di Visual Studio. Il tutto in modalità Administrator.
Adesso finalmente tutto è tornato alla normalità!
domenica 18 luglio 2010
Durante la mattinata di venerdì scorso mi sono connesso allo streaming pubblicizzato nei giorni precedenti dallo staff di DotNetMarche per seguire il workshop “Applicazioni SOA con Silverlight: dal design al deploy”. Prima di continuare, voglio fare i sinceri complimenti per questa iniziativa, perchè permette davvero a tutti di esserci in qualche modo, e di essere al corrente di tutte le tecnologie allo stato dell’arte anche se ci si trova lontani.
La qualità del video e dell’audio erano davvero eccezionali. Complimenti a chi “ciclava” le inquadrature, permettendo di fare le slides, la sala e gli speakers. Davvero ben fatto. Oddio, ogni tanto qualche rumore molesto arrivava (interferenza da cellulare, qualche “bum” nelle casse, etc.), ma il tutto ovviamente è assolutamente ben accettabile, ci mancherebbe! Mi rendo conto che non tutte le community non possono permettersi questo tipo di attrezzatura, ma quella di DotNetMarche è stata davvero un’ottima cosa.
Seguire un evento in streaming ha però anche dei difetti – almeno, io li ho vissuti come tale. Non esserci fisicamente, ma essere al lavoro, o a casa propria, comporta il non potersi dedicare al 100% al workshop. Direi ovviamente. Questo – almeno dal canto mio – ha fatto sembrare più complesse del solito le sessioni, soprattutto l’ultima di Gian Maria Ricci sul LabManagement. Però – ripeto – dico questo viziato dal fatto che per me era una giornata lavorativa: ho dovuto rispondere a telefonate, ho dovuto programmare, sistemare questo o quello. Per dirla tutti, mi sono accorto di aver perso minuti interi anche della intro della sessione di Mauro, sempre per gli stessi motivi: stavo programmando, e quindi l’attenzione era più rivolta al mio lavoro che a chi stava parlando!
Insomma, colpa mia!

A parte queste considerazioni da prendere con le pinze quindi, mi sono proprio davvero divertito. Ho tenuto Media Player aperto tutto il giorno, e sembrava di essere lì con voi!
Stasera mi stavo chiedendo se quello streaming fosse visibile anche attraverso Windows Media Center. Perchè? Perchè Media Center fa la cache del video, quindi potete metterlo in pausa, tornare indietro, balzare in avanti, etc: quindi, chessò, se sto seguendo un workshop e mi arriva una telefonata, potrei mettere in pausa e riprendere solo a telefonata conclusa. Mi chiedo se sia fattibile…