maggio 2009 Blog Posts
Nulla di tecnico stavolta solo un esempio di quello che si può fare, non tanto graficamente perchè sono una mezza-ciofeca, quanto in termini di UX; abbiamo parlato di Loading Adorner, con lo scopo di migliorare l’esperienza dell’utente durante l’uso della nostra applicazione. Naturalmente non basta, uffa…, l’utente si aspetta anche altre cose (sempre in termini di operazioni asincrone): La possibilità di annullare l’operazione in corso; Feedback sullo stato d’esecuzione/avanzamento dell’operazione; Entrambe le cose non è detto che siano di facile soluzione, analizziamole una alla volta: Annullamento dell’operazione...
…e tra gli strumenti a disposizione scegli quello che preferisce: …senza parole :-D .m
… e ci complichiamo la vita reinventando la ruota. La gestione dei settings di un’applicazione VisualStudio ci mette a disposizione un’infrastruttura eccelsa per la gestione dei settings, che va mostruosamente oltre il mero file “ini”, non foss’altro perchè, ad esempio: è fortemente tipizzata; è “a gratis” user o application scoped; offre un designer integrato nell’ambiete di sviluppo, con tutto quello che questo comporta, come ad esempio il pieno supporto per il refactoring… che è tutto tranne che poco ;-) Quello che succede però è che appena...
Da oggi per le prossime settimana, quasi fino a data da definirsi, il mio nuovo ufficio: Peccato che non potrò godermelo tutti i giorni, ma non disperiamo 2/3 gg alla settimana è già un bel passo avanti… :-D .m
Ho un vasto framework che arriva dal lontano 2002 e ogni tanto salta fuori qualche magagna… il tutto, circa 10 assembly per complessive 22k righe di codice, è solo parzialmente coperto da test, siccome mi sono rotto dei bug subdoli da ieri la policy è diventata: ,Mauro scrivi un test ogni mattina, tanto già ti alzi ad un orario assurdo e tra un piegamento e l’altro te lo puoi permettere :-) vedremo se funziona… ;-) Mi sono dimenticato un pezzo… Una delle cose che mi piacciono molto di TDD è che quando scrivi i test non sei condizionato...
Ho un vasto framework che arriva dal lontano 2002 e ogni tanto salta fuori qualche magagna… il tutto, circa 10 assembly per complessive 22k righe di codice, è solo parzialmente coperto da test, siccome mi sono rotto dei bug subdoli da ieri la policy è diventata: ,Mauro scrivi un test ogni mattina, tanto già ti alzi ad un orario assurdo e tra un piegamento e l’altro te lo puoi permettere :-) vedremo se funziona… ;-) .m
Che bel mix… sta di fatto che Wpf non ha, tra le tante cose di cui si sente la mancanza, una ForlderBrowserDialog, niente panico! Si può tranquillamente usare quella presente nell’assembly System.Windows.Forms.dll, o, con un po’ più di lavoro, quella nativa Win32; ma non è questo l’oggetto del post. Dopo avere referenziato l’assembly System.Windows.Forms.dll potete scrivere una cosa del tipo: String SelectFolderPath( String initialFolder )
{
using( var dialog = new System.Windows.Forms.FolderBrowserDialog() )
{
dialog.ShowNewFolderButton = true;
dialog.RootFolder =...
...se mai dovesse esistere la resurrezione: 3° posto: Idraulico/Elittricista clamorosamente sconosciuto al fisco… 2° posto: pescatore Maldiviano, speranza di vita media intorno ai 50 anni… ma che figata di 50 anni; 1° posto: indubbiamente gatto/a in una famiglia medio borghese… :-D e questo spiega tutto: oggi lavoro da casa e quella vigliacca di Isotta (ndr: la protagonista della foto) ha passato tutta la giornata così… a parte 2 “discese” per rompere un po’ causa fame… ma fame de che? .m
Il nuovo e fiammante Visual Studio 2010 Beta 1 ha partorito il primo progettino… e non poteva che essere un behavior per WPF. Ci sono ancora 2 cose, e probabilmente molte altre ;-), che l’utente è abituato ad avere in campi diversi ma per certi versi complementari: Interazione con l’(eco)sistema attraverso la tastiera: l’utente quando ad esempio esegue una ricerca è decisamente abituato a: inserire i criteri di ricerca, come ad esempio un elenco di keyword, all’interno di una TextBox; premere invio; e non a prendere il...
Questo è un esempio della potenza: http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx Spettacolo! .m
…è troppo nemica del compilatore e se in una giornata scrivete montagne di codice il rischio di scrivere minch*ate è alto, e in questo caso neanche gli Unit Test sono d’aiuto: namespace Topics.Runtime.ViewModel
{
using ...;
[Component( typeof( IEstimateWizardViewModel ), Lifestyle = Lifestyle.Transient )]
sealed class EstimateWizardViewModel : ViewModelBase<IEstimateWizardView>, IEstimateWizardViewModel
{
public static readonly DependencyProperty IsBusyProperty = DependencyProperty.Register(
"IsBusy",
...
http://ugialt.net/Default.aspx?Page=meetings&AspxAutoDetectCookieSupport=1 per chi ci sarà ci vediamo in quel di Bologna. Mi hanno messo in fondo… quindi tremate, gente, tremate… perchè la cena non è mica cosa certa :-D .m
Credo che una sputt*natina se la meritino: La pagina di logon è: “annegata” nella home page come frame; la home page non è su ssl; la pagina di logon è su ssl; se qualcuno prende il controllo della home page con ad esempio: phishing; dns poisoning; “sempliemente” prendendo il controllo del sito remoto; L’utente non ha mezzi evidenti per accorgersene… ma perchè sono così stolti? perchè...
Costruendo il mio CueBanner per WPF mi ero imbattuto in uno strano comportamento, mi auto quoto: Un adorner per poter essere visibile ha bisogno di un AdornerLayer in cui essere “ospitato”, ogni Window (non proprio…, ho un caso che sto cercando di debuggare in cui questo non succede…) ha implicitamente un AdornerLayer anche se non lo inseriamo noi nello xaml. Quel “caso” è la classica sindrome da “allergia al manuale delle istruzioni”, lo scenario era questo, era perchè adesso funziona: Controllo Ribbon, figosissimo, con in una Ribbontab la casella di...
Sempre in tema di UX ritengo fondamentale che un’applicazione Windows sia fortemente basata su multithreading perchè se c’è una cosa che mi da veramente fastidio è vedere l’applicazione freezata, con quel laconico (Not responding) nella barra del titolo, solo perchè l’operazione “lunga” viene eseguita nello stesso thread della UI. In effetti se dato uno sguardo al task manager scoprite cose interessanti: Un mondo multithreaded è sicuramente più difficile da dominare ma è anche vero che una segretaria incazz*ta è forse peggio di una suocera logorroica, inoltre se cerchiamo scopriamo che il framework .net ci mette...
Visual Studio 2008 SP1 on Win7RC x64… con tanto di Messenger running… :-D ma poi… dico io… che cosa vuole sapere lui… :-D .m
Abbiamo parlato della possibilità di mettere in binding i SelectedItems della ListView di WPF con una nostra collection, altra cosa a cui abbiamo accennato è la mancanza, sulla ListView, di un ICommand per gestire il doppio click su un elemento della lista. Siccome abbiamo scoperto, almeno io ;-), la potenza delle attached properties facciamocelo. ItemDoubleClickCommand Partiamo come al solito dal risultato che vogliamo ottenere: <ListView local:ListViewManager.ItemDoubleClickCommand="{Binding Path=Select}" />
Molto semplice: poter dichiarare un nuovo Command e metterlo in binding con qualcosa che implementi l’interfaccia ICommand; per arrivare li, nell’ormai vecchio e familiare ListViewManager, cominciamo...
Questa cosa è una figata!, Raff ha la sua e io mi sono fatto, come Raff da tempo immemore (dal fx 1.1, poi con rimaneggiamenti vari nel tempo per adattarla alle nuove feature), la mia implementazione che a breve upgraderò a INotifyCollectionChanged e ICollectionView per stare al passo con i tempi. Ma torniamo alle cose importanti, uno dei dettami di M-V-VM è, o meglio sarebbe, quello di non esporre mai direttamente il Model alla View; ad esempio esporre una IList<Address> direttamente dal VM non è proprio il massimo, funziona ma ha qualche magagna fastidiosa. Sempre meglio avere uno strato...
per ora è solo un’idea che mi frulla per la testa ma… una cosa che si fa con M-V-VM è la necessità di triggerare la rivalutazione dell’eseguibilità di un ICommand a fronte del fatto che una certa cosa è successa, tipicamente un’altra proprietà del VM è cambiata; un esempio: Il comando “Browse” non è attivo se la casella di testo “Criteri di Ricerca” (in binding con la proprietà QueryText del VM) è vuota, quando la proprietà QueryText cambia dobbiamo triggerare la rivalutazione dell’eseguibilità dell’ICommand. Questo in termini di codice spesso si traduce in qualcose...
Una delle cose che “pretendo” è che la UX offerta sia consistente con quella dell’ecosistema che ospita l’applicazione, questo per un’applicazione Windows si traduce in moltissime cose, e moltissimo lavoro, tra cui ad esempio: Supporto per la navigazione/gestione comandi con la tastiera; Supporto per la gestione dei comandi tramite shortcut; Comunicazione con l’utente; Async, Async, Async (more to come…); Disposizione, aspetto e layout dei controlli consistente con quello del sistema; etc.. Tra queste...
La ListView di WPF è semplicemente la manna, unita al motore di templating, che ha potenzialità infinite, nel giro di pochissimo tempo vi fa dimenticare che Microsoft si è “dimenticata” di mettere una griglia tra i controlli builtin; e non ditemi che esite quella del WPF Toolkit perchè siamo lontani anni luce da qualcosa che rasenti la decenza… lasciamo perdere poi i controlli di terze parti, io ho provato quello di Xceed, carino, stiloso, ma un chiodo spaventoso… fa pure rima :-D Ma torniamo a noi, abbiamo la nostra bella ListView e abbiamo anche deciso, che causa cattive frequentazioni...
Credo che alla lunga tutti ci siamo scontrati con la noisitàcomplessitàindigeribilità della gestione della configurazione del container per IoC. In una soluzione corposa, okkio non necessariamente complessa, basta e avanza corposa, è una vera menata. Si ci sono le fluent interfaces che ci fanno risparmare un sacco di “giornate di inferno”, che altrimenti ci guadagneremmo gestendo la configurazione su file xml, permettendoci di scrivere cose del tipo: container.Register( Component.For<IWindsorContainer, IServiceProvider>()
.Instance( container ) );
container.Register( Component.For<ModulesConfigurationSectionHandler>()
.FactoryMethod( this.container.Kernel, () =>
{
...
…perchè il Digitale Terrestre, e il relativo switch obbligatorio, è una vera fregatura che sembra tanto mirata solo a far fare soldi ai soliti furbetti… .m
Un altro intermezzo, si lo so che ho promesso un’ultima puntata ma: Non ho tempo, ogni tanto lavoro :-); La soluzione che per ora ho adottato per la gestione della navigazione, oggetto dell’ultima puntata, non mi piace, funziona, funziona bene, ma non mi piace… è rumorosa. Facciamo invece un passo indierto: tempo fa abbiamo parlato di “message broker” per sopperire all’impossibilità di usare, in un’applicazione composita, i tradizionali eventi del mondo .net. Una cosa che tipicamente si fa in un’applicazione composita è iniettare contenuti visuali, e lo si...
Ho installato la RC di Windows 7 anche sull’EeePC, il giocattolo come lo chiama Ale, e succede una cosa decisamente curiosa: La scheda video intergrata non supporta Aero, poco male; Se però mi connetto via Remote Desktop, come sto facendo adesso per finire le installazioni varie, allora Aero va che è un piacere… Misteri dei driver .m
…spettacolo :-D Io non sono un frequantatore di youtube, anzi oggi è forse la terza volta che ci vado in vita mia, quindi probabilmente è vecchio ma a me “Ackmed” fa schiattare: http://www.youtube.com/results?search_type=&search_query=achmed+the+dead+terrorist&aq=1s&oq=ackmed .m Technorati Tags: Ackmed the dead terrorist
la trepidante attesa è finita (da qualche giorno a dire il vero) e il piccolo “coso” va che è una bomba anche grazie alla RC di Windows 7 a 64bit. Ho quasi finito di installare tutto il necessario e spero di riuscire a farlo diventare operativo da già da domani, mi mancano solo una versione “segreta” di Visual Studio e lo spostamento dei database di sviluppo di Sql Server. Adesso sono molto indeciso su un coso come questo: http://www.amazon.com/500GB-eSATA-Portable-Hard-Drive/dp/B001LFHK8I, non necessariamente quello ma comunque un drive esterno eSata (possibilmente 2,5” e senza alimentazione) su cui piazzare le VM...