Ho sempre avuto l’insana convinzione che fosse meglio vivere, sempre e invariabilmente, scommettendo il possibile contro il probabile. Questo perchè in definitiva il probabile esiste e basta… è probabile, e quindi serve il minimo sforzo perchè di verifichi, ma da esso non ti puoi aspettare sorprese, niente di positivo, niente che faccia evolvere la tua situazione in meglio, niente che sia in più rispetto a quello che tutti si aspettano. Il probabile è il minimo sindacale, è l’oppressore che vince sull’oppresso, è lo stesso quotidiano tutti i giorni, è il latte consegnato all’uscio, quello che non ti fa “mandare dalla mamma”.

Il possibile invece è creativo. Lui non esiste e te lo devi costruire, pezzo per pezzo, con fantasia e immaginazione. Il possibile in realtà sono i tuoi sogni, quelli che fai mentre guidi sulla via del ritorno dall’ufficio, e che tutti il più delle volte archiviano dicendo… “ah, impossibile!”.

Alla fine il probabile è una vacanza in una comune località di mare dove il massimo che ti puoi aspettare è che un ombrellone sia un po’ fuori posto. Arriva il bagnino, lo sistema e tutto torna nell’ambito della semplice probabilità. Il possibile invece è una settimana in barca, alla scoperta di angoli del mondo che nemmeno ti aspettavi potessero esistere, pieno del colore, del profumo e delle sensazioni che mai avresti immaginato.

Il problema è che mentre il probabile non ti delude mai, dato che non ti da nulla, il possibile è armato di scimitarra ed è pronto, in ogni istante, a menarti un fendente che ti lascia tramortito. Succede, spesso, che inseguendo il possibile si rimanga trafitti, bastonati, delusi e tramortiti, ma alla fine ne vale sempre la pena. Vale la pena il sapere di aver fatto qualcosa che ti ha cambiato o che ha cambiato, sentire la soddifazione di essere riusciti a lasciare un segno, a migliorare le cose, a… a… a… … anche se il prezzo il da pagare il più delle volte è lo stare male perchè il probabile ha vinto ancora una volta.

Già, impossibile… tutti invariabilmente lo hanno detto almeno una volta, i più se lo dicono sempre con insistenza. Il risultato è l’aver dovuto archiviare con una sola parola un sogno, e aver chiuso un libro di speranze senza nemmeno provare a renderlo concreto. Anche io spesso, ma mai volentieri, cedo al probabilismo, alla tentazione della uniformità e prevedibilità. Ma spesso, soprattutto se mi fermo a pensarci, allora il possibile mi illumina e braccio a braccio al mio ottimismo mi guida alla scoperta di aspetti e possibilità che nemmeno osavo esprimere.

Lasciamo la noia a quei dannati probabilisti. La vita sta nel possibile.


mvplogoPrimo luglio, la calura, l'estate che arriva e anche quest'anno come da otto a questa parte è arrivata l'attesissima mail, regalandomi un'emozione cui non sono ancora riuscito ad abituarmi. MVP Windows Platform Development.

MVP ancora una volta, parte di questa straordinaria community di persone che condivisono la passione per la tecnologia, la condivisione della conoscenza e il lavoro, quello pratico, "sul pezzo", a risolvere problemi e a escogitare soluzioni.

Ma un ricordo particolare va a Silverlight. Ho avuto l'onore di essere il primo italiano ad entrare nella categoria MVP su questa tecnologia e sono anche l'ultimo che la lascia. Abbiamo ormai tutti digerito i motivi che hanno portato alla trasformazione di questo splendido strumento in quello che oggi vediamo in Windows 8 e in Windows Phone... è tutta farina che viene da quella splendida esperienza. E ora Windows Platform Development ne è la logica conclusione.

Grazie. Grazie a tutti, in particolare a Cristina Gonzalez Herrero e Marjorie di Clemente che si occupano del programma per l'Italia. Grazie a Microsoft Italia, Grazie al nostro "sommo" lead Alessandro Teglia :) e in definitiva grazie a Microsoft.

E naturalmente Grazie e tutti quelli che ci seguono, nei nostri eventi, e che ci scrivono e leggono ogni giorno.

tags: - categories: News

Sabato ho avuto il piacere di partecipare alla Fiera del Radioamatore, nello spazio dedicato a Windows, e presentare una sessione sulle novità in ambito Windows Phone 8.1. Oggetto della presentazione sono state in particolare le novità anticipate durante la recente BUILD in cui è stato evidenziato come la piattaforma sta convergendo verso una quasi totale sovrapposizione con il Windows Runtime di Windows 8.1.

Ne approfitto per ringraziare 1nn0va nella persona di Marco Parenzan per l’ottima organizzazione dell’evento che ha visto tre giorni di sessioni articolate e gli amici di dotnettoscana che con noi hanno lavorato per preparare il materiale e le sessioni.
Speriamo che il prossimo anno si possa migliorare ancora questo appuntamento che merita una giusta attenzione dal pubblico, che sono certo arriverà sempre più numeroso se messo a conoscenza di questi argomenti innovativi.

logo_xedotnetCi siamo, dopo lunghi preparativi è finalmente pubblico il prossimo One Day Mobile 2014, un evento di una intera giornata, con ben 7 talk a proposito dello sviluppo mobile in ambito Microsoft. Sarà una ghiotta occasione di condividere esperienze pratiche e novità, in un ambito in cui la velocità di sviluppo è la chiave del successo. Avremo quindi sessioni ad ampio spettro, sia su Windows Phone e Windows 8, ma anche su argomenti cross-platform come Xamarin e PhoneGap. 

L'evento si terrà il prossimo 15 Maggio 2014 presso il Novotel Castellana di Venezia Mestre e vedrà la seguente agenda:

Andrea Dottor: App connesse con ASP.NET Web API

Realizzare applicazioni connesse può fare la differenza in un mercato in pieno sviluppo.
Aggiornare i dati di un catalogo, caricare/leggere gli score di un gioco, interfacciarsi con applicazioni/database esistenti...tutti validi motivi per non perdervi questa sessione, dove vedremo come sviluppare servizi ASP.NET Web API che implementino l'OAuth2 authentication ed OData, e vedremo come poterli consumare da applicazioni Windows Phone, Windows Store App e Xamarin App.

Andrea Boschin: Condivisione del codice tra W8 e WP8

Lo sviluppo mobile richiede sempre più spesso di fornire applicazioni che siano disponibili su diversi device, siano essi Windows Phone o Windows 8, sfruttando le peculiarità di ciascuno. Questo pone il problema di scrivere codice che possa in qualche modo essere riutilizzato su piattaforme che pur essendo simili hanno diversità marcate. In questa sessione vedremo alcune tecniche che possono aiutare nel migliorare la condivisione del codice quando si sviluppano applicazioni per questi sistemi.

Mirco Vanini: C++ in Windows Phone Apps

In questa sessione vedremmo una panoramica degli strumenti messi a disposizione per lo sviluppo nativo su Windows Phone 8. Verrà posta particolare attenzione al suo utilizzo per lo sviluppo di applicazioni ibride (C#/C++) che hanno la necessità di riutilizzare algoritmi sviluppati su piattaforme desktop.

Davide Vernole: Xamarin do it better!

Xamarin offre un’alternativa al “Write Once, Run Anywhere Approach” permettendo agli sviluppatori di realizzare applicazioni per le principali piattaforme mobile garantendo interfacce utente native, performance native e condivisione del codice tra le diverse piattaforme utilizzando C#, il .NET Framework e Visual Studio. Lo "Xamarin Unique Approach" è il filo conduttore di questa sessione in cui impareremo a conoscerlo meglio. Sfruttate conoscenze, potenzialità e sintassi di C# per ottenere il meglio dalle vostre applicazioni cross-platform; ovviamente con Xamarin!

Lorenzo Barbieri: Architettura WP8

Davide Senatore: PhoneGap & Cordova: building cross platform mobile applications

In questa sessione parleremo di sviluppo mobile cross platform con PhoneGap (AKA Cordova).
Prenderemo in esame tool, skill richieste per iniziare e best practice per non incorrere in spiacevoli scoperte.
Scopriremo come l'investimento in "poche" tecnologie standard possa abilitarci allo sviluppo su tutte le piattaforme mobile al momento disponibili.
Non ultimo, confronteremo anche pro, contro e costi di sviluppo di una soluzione di questo tipo con una soluzione nativa ed una soluzione web-based, prendendo in esame applicazioni realmente sviluppate.

Marco Dal Pino: Sviluppare e pubblicare applicazioni Gestionali (LOB) con Windows Phone

La piattaforma Windows Phone ha raggiunto una buona diffusione di mercato e sempre più si sente la necessità di implementare funzionalità gestionali utilizzando i device WP8. Inoltre la prossima versione di Windows Embedded 8 Handheld sarà basata proprio su Windows Phone, introducendo nuovi device industriali rugged con caratteristiche di lettura barcode o Carte magnetiche; il tutto già compreso nativamente nelle API di Windows Phone. Vediamo come affrontare lo sviluppo di queste applicazioni, quali tipici problemi vanno affrontati e come distribuire il prodotto ai nostri clienti.

Inutile dire che vi aspettiamo numerosi. Non aspettate a riservare la vostra poltrona perchè i posti sono davvero limitati.

https://communitydevtool.microsoft.it/public/frmRegister.aspx?eventid=1203PSOSREGTFTMLKGCQHT


Rilasciati all'interno di Blend 3.0, nel 2009, come un mero strumento a supporto dei designer che li poteva usare per inserire sulla superficie di Blend non solo componenti di interfaccia, ma anche dei "frammenti di logica", i behavior hanno immediatamente assunto un ruolo primario nello sviluppo di applicazioni, grazie alla loro capacità di favorire la netta separazione tra logica di business e interfaccia utente. Questa capacità è rappresentata dal fatto che essi sono in grado di racchiudere e isolare porzioni di codice - con accesso diretto ai componenti di interfaccia ma pilotati dalla logica di business - inseribili facilmente direttamente nello XAML senza che sia necessaria alcuna logica accessoria.

Nati in particolare all'interno di Silverlight, essi sono immediatamente diventati parte del kit di sopravvivenza dello sviluppatore, specialmente di quello che intendeva implementare il pattern MVVM con facilità ed in seguito hanno visto il porting verso Windows Phone e finalmente anche in WinRT, con il rilascio dell'ultima versione 8.1. Conoscerli e usarli opportunamente può davvero far risparmiare un sacco di tempo. Vediamo come.

Usare i behavior esistenti

Il primo passo nell'utilizzo dei behavior è quello di inserirli nel progetto di Visual Studio e cominciare ad usare quelli esistenti. In effetti la libreria - denominata "Behaviors SDK (XAML)" porta con se una serie di classi base da cui è possibile fare ereditare i propri behavior ma anche un set abbastanza nutrito di componenti già realizzati e pronti all'uso. Essi hanno la caratteristica di essere parametrizzabili e generici così da essere fortemente riutilizzabili e quindi sono anche una buona scuola per quando dovremo realizzarne di nostri

untitledPer inserirli nel progetto con Visual Studio 2013 è sufficiente selezionarli dalla libreria delle estensioni (vedi a lato) operando come se si dovesse aggiungere una referenza al progetto.

I Behavior sono una libreria di componenti nativi e managed, e come tali possono essere usati sia in progetti C#/VB.NET sia in C++. Non richiedono particolari cautele come avviene per altri tipi di componenti perciò, una volta inserita la referenza all'SDK sarà immediatamente possibile iniziare ad usarli. Non c'è dubbio che il modo migliore è quello di usare Blend, al cui interno vengono visualizzati nella scheda degli Assets, come dei piccoli componenti che possono essere trascinati sulla superficie del designer e agganciati ai vari elementi. Una volta collegati è possibile modificarne le proprietà usando la consueta finestra di blend.

Dal punto di vista dello sviluppatore un bahavior appare ne più ne meno che come una attached property che può essere valorizzata su qualunque elemento del DOM. La proprietà è dichiarata nel namespace "Microsoft.Xaml.Interactivity" e una volta inserito nel codice xaml essa appare come una collection:

   1: <Page
   2:     x:Class="App1.MainPage" mc:Ignorable="d"
   3:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   4:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
   5:     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   6:     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   7:     xmlns:i="using:Microsoft.Xaml.Interactivity">
   8:     <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
   9:         <Rectangle x:Name="rect" Fill="Yellow" Width="100" Height="100">
  10:             <i:Interaction.Behaviors>
  11:                 <!-- aggiungere qui in behaviors -->
  12:             </i:Interaction.Behaviors>
  13:         </Rectangle>
  14:     </Grid>
  15: </Page>

A questo punto va referenziato un ulteriore namespace, chiamiamolo per brevità "core", il quale contiene i behavior predefiniti di cui parlavo poco fa. In particolare essi sono "EventTriggerBehavior" e "DataTriggerBehavior". I loro nomi dovrebbero essere autoesplicativi ma per completezza diciamo che il primo lo si può agganciare ad un singolo evento di un elemento mentre il secondo fa riferimento al un valore di una proprietà.

Poniamo ad esempio di voler fare in modo che il rettangolo giallo dell'esempio precedente debba diventare rosso quando cliccato. Potremmo semplicemente aggiungere il seguente snippet all'interno della collezione dei behaviors:

   1: <core:EventTriggerBehavior EventName="PointerPressed">
   2:     <core:ChangePropertyAction PropertyName="Fill" Value="Red" />
   3: </core:EventTriggerBehavior>

In buona sostanza, stiamo dicendo che al verificarsi di un evento PointerPressed venga eseguita una "action" che cambia il valore di una proprietà. Le action sono un secondo livello di componenti predefiniti di cui dirò tra poco. Questa action in particolare si occupa di variare la proprietà "Fill" impostandola a "Red". Mandando in esecuzione l'esempio si vedrà che l'effetto ottenuto è proprio quello desiderato, ma anche che, a differenza di quanto avviene per il VisualStateManager, il sistema non tiene traccia dello stato originario e quindi per riportarlo allo stato precedente dovremmo aggiungere l'operazione inversa:

   1: <Rectangle x:Name="rect" Fill="Yellow" Width="100" Height="100">
   2:     <i:Interaction.Behaviors>
   3:         <core:EventTriggerBehavior EventName="PointerPressed">
   4:             <core:ChangePropertyAction PropertyName="Fill" Value="Red" />
   5:         </core:EventTriggerBehavior>
   6:         <core:EventTriggerBehavior EventName="PointerReleased">
   7:             <core:ChangePropertyAction PropertyName="Fill" Value="Yellow" />
   8:         </core:EventTriggerBehavior>
   9:     </i:Interaction.Behaviors>
  10: </Rectangle>

Le action che si possono applicare sono molteplici e coprono un vasto numero di necessità:

  • CallMethodAction: L'action richiama un metodo dell'oggetto cui si riferisce. Assomiglia molto al collegamento di un EventHandler nel codebehind.

  • ControlStoryBoardAction: Consente di collegare una o più storyboard e avviarle, così come si fa con i trigger di WPF.

  • GoToStateAction: Consente di attivare uno stato del VisualStateManager.

  • InvokeCommandAction: Uno delle action più utilizzate, in ambito MVVM consente di attivare comandi in risposta a qualunque evento se usato in concomitanza con EventTriggerBehavior.

  • NavigateToPage: Attiva la navigazione verso una pagina dell'applicazione

  • PlaySoundAction: Esegue un suono,

Una nota a parte la merita sicuramente l'InvokeCommandAction, la cui esistenza è indispensabile in scenari MVVM. Esso infatti sopperisce alla mancanza dei consueti "Command" e "CommandParameter" relativi la maggioranza degli eventi dei controlli XAML. Come in Silverlight, anche nelle Windows Store apps solamente ButtonBase implementa queste proprietà. E qui viene in aiuto questa action che associata ad un opportuno EventTriggerBehavior è in grado di riportare ad un Command del ViewModel qualunque iterazione dell'utente, aprendo numerose strade.

L'uso del EventTriggerBehavior è sicuramente il più consueto ma non va dimenticata la presenza del meno intuitivo DataTriggerBehavior. Esso ha lo scopo di legare l'esecuzione di una o più action al cambiare del valore di una proprietà. Pensiamo ad esempio ad avere una proprietà che indica una soglia di pericolosità, aggiornata in tempo reale (magari via SignalR). L'utilizzo di un DataTriggerBehavior è specifico per questi casi e ci consente di attivare una action quando il valore va oltre una determinata soglia:

   1: <Rectangle Background="Green">
   2:     <Interactivity:Interaction.Behaviors>
   3:         <Core:DataTriggerBehavior Binding="{Binding Severity}" ComparisonCondition="GreaterThanOrEqual" Value="3">
   4:             <Core:ChangePropertyAction PropertyName="Background">
   5:                <Core:ChangePropertyAction.Value>
   6:                    <SolidColorBrush>Red</SolidColorBrush>
   7:                </Core:ChangePropertyAction.Value>
   8:             </Core:ChangePropertyAction>
   9:         </Core:DataTriggerBehavior>
  10:     </Interactivity:Interaction.Behaviors>
  11: </Rectangle>

Il codice qui sopra usa una condizione, indicata dalla proprietà “Comparison Condition” per definire quale sia il valore soglia che converte. il colore da Verde a Rosso.

I behavior come abbiamo visto sono uno strumento davvero insostituibile in molti casi. Ancor di più se, come vedremo nel prossimo articolo ne creiamo di nostri, con proprietà che ne parametrizzano l’azione.

tags: - categories:

Ormai più di una settimana ho tenuto il lab su Typescript su cui da tempo stavo lavorando. Vorrei ringraziare ancora una volta tutti quelli che hanno partecipato, per la solerzia con cui hanno seguito gli esempi e hanno provato ad implementare il codice che ho preparato. Ogni giorno che passa sono sempre più convinto che Typescript sia uno strumento insostituibile e ho trovato molte conferme in questo lab vedendo le persone progredire in fretta, mano a mano che prendevano confidenza con il linguaggio e si rendevano conto delle enormi potenzialità e tutela nei confronti del pure e semplice Javascript.

Ho pubblicato tutto il materiale nel repository di XeDotNet perciò potete scaricare tutto il necessario per provare voi stessi l'esempio. In particolare seguire il documento PDF - che ho cercato di rendere il più accurato ed autonomo possibile - nel quale troverete lo step-by-step e scaricate il progetto di base da cui partire. Se poi siete pigri troverete anche l'implementazione di tutti i vari passaggi.

Ecco il link al download: http://1drv.ms/1flJCDT

Al solito se avete problemi non esitate a contattarmi con la form del weblog.


Di fronte alla vostra prima applicazione con Typescript, vi sarete certamente chiesti quale sia il modo migliore per dare ad essa il primo avvio. Può sembrare una domanda banale ma, essa cela delle considerazioni che dovrebbero essere tenute nella dovuta attenzione. Prima di tutto, è certamente vero che del codice Javascript è anche del codice Typescript perfettamente valido ma, se ci lasciamo prendere la mano e iniziamo a scrivere così come eravamo abituati in precedenza rischiamo di perdere i benefici che Typescript può regalarci.

Primo fra tutti, sicuramente il fatto che Typescript accentua fortemente le caratteristiche object oriented e di conseguenza ci dovremmo attendere di rappresentare l’applicazione – intendendo con essa una singola pagina al cui interno gira il codice che le da vita – con una sola classe, che detenga i riferimenti ai vari elementi e naturalmente lo stato. Un po’ come avviene in una applicazione asp.net, in cui una sigola pagina è rappresentata dal suo “codebehind”.

Per avviare una applicazione del genere dovremmo di conseguenza creare al più presto l’istanza della classe e dare ad essa il controllo, lasciando che gestisca il ciclo di vita della pagina fino alla sua naturale conclusione. Per questo tipo di avvio sono abituato ad utilizzare un pattern ormai abbstanza consolidato. Creaimo una classe base per la pagina, in un namespace comune che i usialmente chiamo “sys”:

   1: module sys
   2: {
   3:     export class Page
   4:     {
   5:         public static run(page: Page): void
   6:         {
   7:             $(() => page.onLoad());
   8:         }
   9:  
  10:         public onLoad(): void { }
  11:     }
  12: }

Come di può vedere , la classe consta di un metodo statico “run” e di un metodo virtual “onLoad”. Attenzione che in Typescript il concetto di virtuale non esiste ma in realtà qualunque metodo pubblico è anche virtual. Diamo per assodato che sia presente jQuery e all’interno del metodo run usiamo l’evento “readystatechanged” con la classica sintatti $(…) dove all’interno delle parentesi va indicata una funzione eseguita all’occorrenza di questo evento. A questo punto possiamo ereditare il codebehind concreto della pagina da sys.Page:

   1: class DefaultPage extends sys.Page
   2: {
   3:     constructor()
   4:     {
   5:         super();
   6:  
   7:         // inizializazione della pagina
   8:     }
   9:  
  10:     public onLoad(): void
  11:     {
  12:         // iniziamo qui il ciclo di vita
  13:     }
  14: }

In particolare nella classe viene riferinito il metodo onLoad che sarà chiamato automaticamente quando viene eseguito il “readystatechanged”. Potremmo così nel costruttore inizializzare i campi della classe, i valori di default, e così via mentre nell’onLoad potremmo cercare gli elementi della pagina, ed avviare eventuali operazioni di download da un servizio rest. L’avvio della pagina avviene per mezzo di una singola riga, posta usualmente in coda alla pagina o in un file ts:

   1: sys.Page.run(new DefaultPage());

La singola riga crea l’istanza della classe DefaultPage e poi vi da avvio con il metodo statico “run”. Niente di più semplice e pulito. Per estensione, se identificate all’interno della pagina diverse aree, a ciascuna delle quali risponda una classe Typescript che ne incapsuli il funzionamento, potete tranquillamente usare la stessa tecnica e ciascuna classe sarà avviata separatamente con il medesimo ciclo.

Di questo e di altro parleremo in occasione del Community LAB che si terrà il prossimo 28/2/2014 a Mestre. Se vi unite a me con il vostro PC sarà mia cura guidarvi nello sviluppo con questo semplice ma “liberatorio” linguaggio.

Iscrizioni e dettagli: http://www.xedotnet.org/Home/Meeting/20140228



typescript-bannerGiusto quest’oggi si sono aperte le iscrizioni al LAB su Typescript che si terrà il prossimo 28 Febbraio a Mestre – Venezia. Nell’occasione avremo modo di affrontare questo interessante linguaggio che ha il non trascurabile scopo di semlificare lo sviluppo client side all’interno dei browser. Typescript infatti gode infatti di un compilatore (che curiosamente è scritto esso stesso in Typescript) che è in grado di convertire il codice in Javascript puro, capace di essere eseguito in qualunque browser, senza necessità di un plugin addizionale. Si tratta in effetti della nemesi, regalandoci un linguaggio di alto livello – anche se mantenendo degli interessanti risvolti semantici che lo rendono flessibile come Javascript – dotato di un set di tipi verificato a compile-time.

Chi desiderasse approfondire lo può fare nei seguenti post:

Chi di voi invece preferisse provare direttamente un esempio, può raggiungermi il 28/2 a Mestre, iscrivendosi al seguente link.

http://www.xedotnet.org/Home/Meeting/20140228

Durante il lab darò una infarinatura iniziale del linguaggio e in seguito potrete seguire un esercizio step-by-step, e porre le domande del caso per risolvere i vostri problemi reali.

A presto


ios_iPad-3rd-(6.0)_6.0_portrait_thumbEra un po' di tempo che ne sentivo la necessità ma, per varie ragioni - tra cui la cronica mancanza di tempo e un po' di sana pigrizia - la revisione della grafica del mio blog personale è sempre stata posposta a data da destinarsi. Oggi finalmente va online il lavoro degli ultimi giorni in cui ho rifatto completamente tutto lo stile del blog, aggiornandolo ai più innovativi concetti di responsività e alle tecnologie quali HTML5 e CSS3. Per farvi un'idea del lavoro provate a cambiare la dimensione del browser e vi renderete conto di come l'interfaccia si adegua allo spazio disponibile, rendendo di fatto frubile il sito sia su schermi di grandi dimensioni, sia su tablet e smartphone. Ora vi prego non siate troppo pignoli, non più di quanto lo sia stato io, dato che a ben vedere ho lavorato per vestire ex-novo BlogEngine il quale, vi assicuro, è tutto fuorchè predisposto alle interfacce responsive. Si tratta infatti di un engine webforms, che utilizza spesso e volentieri tabelle e, soprattutto, non consente una personalizzazione eccessiva del markup. In definitiva, fatta eccezione per la master page e gli spazi dedicati al post e al commento, il resto dell’interfaccia è rimasto sostanzialmente invariato se non per un lavoro di fino con i CSS. Alla fine Browserstack mi consola dandomi l’ok su tutti i browser ad eccezione di IE8. L’immagine qui a lato ad esempio è tratta dallo schermo di un iPhone5s. Gli utenti di IE8 sono vivamente pregati di entrare nell’era moderna e quindi aggiornare il proprio PC. A parte BlogEngine, lo strumento principale di questa rivoluzione responsiva è Boootstrap 3.0. Per chi non lo sapesse si tratta di un toolkit che consente di progettare le interfacce web basate su html5 e css3 perchè siano fruibili da tutti i dispositivi. Si basa su una struttura fatta di righe e colonne alle quali possono essere agganciate porzioni dell’interfaccia nelle varie risoluzioni. Questo meccanismo, dopo un po’ di pratica, diviene familiare e si riescono ad ottenere dei cospicui risultati in un tempo non eccessivo, anche se, lo devo proprio dire, avessi potuto farlo in XAML, avrei finito molto ma molto prima… Ma tant’è, HTML5 e CSS3 sono una vera soddisfazione, soprattutto per chi come me ha affrontato i problemi di compatibilità dalla fine degli anni ‘90 quando ancora Netscape era un agguerrito concorrente e l’idea di vedere lo stesso sito in modo simile su due browser era semplicemente una follia. I moderni strumenti in definitiva danno un aiuto veramente efficace e i risultati, pur se ancora faticosi, si raggiungono molto più agevolmente. Boostrap mi è piaciuto fin da subito, per qualche verso più che Foundation con il quale condivide gran parte della filosofia di funzionamento. Credo che non mancherà l’occasione per parlare in questa pagine di entrambe le librerie e dei problemi della responsività. Grazie fin d’ora per i commenti, i suggerimenti e spero i complimenti che mi vorrete postare.

Happy-2014-free-wallpaper1Tracciare un bilancio del 2013 è di certo difficile e si rischia di cadere nell’ovvio. Che non sia stato un anno positivo è sicuramente certo, e credetemi non solamente dal punto di vista della politica e dell’economia di questo disastrato paese. Nel mio piccolo è stato un anno di belle idee che non si sono concretizzate, di difficili momenti che poi si sono risolti di cose più o meno comuni che sono accadute, lasciando un po’ di amarezza e tentandomi nella recriminazione.

Ciascuna esperienza porta con se un insegnamento, una morale che ci dovrebbe in qualche modo guidare nel nostro futuro, e nel mio caso questa è la convinzione, sempre più radicata in me, che dovrei ascoltare di più il mio lato istintivo e accantonare per una volta quello che il “comune sentire” mi porta troppo spesso a fare. Sono una persona molto logica e razionale ma troppo spesso non sono in grado di trarre le ovvie conclusioni che l’applicazione di logica e razionalità mi suggeriscono. Per quanto esse apparissero strane e sconclusionate si è sempre dimostrato, alla fine, che erano quelle giuste.

Ma insomma, anche il 2013 ha avuto le sue belle soddisfazioni. Ho consolidato nel tempo il mio “peso forma” portandolo alla incredibile meta degli 88kg (-35kg) e, dedicando del tempo a me, alla mia famiglia credo di aver trovato una dimensione che riesce, almeno per ora, a preservare la mia salute e la mia condizione fisica.

Ho continuato a ballare, attività che molti ritengono inutile e triviale ma che non lo è più di dedicarsi a una qualunque attività che esuli la normale routine lavorativa. Grazie al ballare ho avuto modo di conoscere altre persone che hanno punti di vista diversi, uscendo dalla dannosa autoreferenzialità che c’è nel mio ambito dei lavoro.

Ora mi accingo ad entrare nel 2014, con il timore che richiede un periodo delicato come questo. Le esperienze concluse o che si stanno concludendo devono essere un monito ma non un ostacolo e in effetti, il fervore delle feste mi ha portato alla convinzione che bisognerà dedicare del tempo a qualche progetto che possa dare una chances alle aspettative che nell’anno scorso non si sono concretizzate.

Non so se questo sarà un anno positivo, ma forse qualche briciolo di energia per fare si che lo diventi ce l’ho ancora… fatemi gli auguri!

Io ricambio con tutto il calore che posso, augurandovi un immenso 2014.


In questi giorni, chi mi segue su facebook sa che mi trovo nel Cilento, e per la precisione in uno sperduto paesino nel bel mezzo del parco nazionale omonimo. Vi assicuro che, pur se carico di elementi storici che vengono dal secoli addietro, non è molto probabile che vi troviate in questo paese per caso, dato che non è compreso nelle guide turistiche del luogo. In effetti, a parte una fugace toccata di cinque anni fa, era dal 1984 che non ci venivo. Bosco in effetti è il paese che ha dato i natali al mio nonno materno e che per circa sedici anni è stato l'unica meta delle vacanze di famiglia. Poi le cose sono cambiate, i primi viaggi all'estero, le vacanze da solo, la ragazza, la moglie, una figlia e… 28 anni sono trascorsi e uno pensa che le cose lì fuori siano rimaste congelate nel tempo e che basti tornarci per rivivere quei tempi.

Non è così ovviamente, il tempo corre per tutti alla stessa velocità e, quando torni sui tuoi passi per vedere luoghi lontani nel tempo oltre che geograficamente, trovi tutto di dimensioni diverse, stranamente piccolo. Te lo ricordi il luogo, perché' la sua morfologia cambia ma non abbastanza in fretta, un particolare alla volta. Un viottolo che prima c'era ora non esiste più e viceversa nascono spazi, nuovi e strani che non ti sai spiegare da dove sono saltati fuori. A Bosco è successo così, la strada un po' più accidentata di come la ricordavo, un edificio "innaturale" che mal si accosta a quelli storici del luogo, una fermata dell'autobus e i tuoi ricordi inciampano qua e là dandoti l'impressione di una nota stonata che non combacia con quello che la mente suggerisce.

Poi però li senti, inconfondibili, palpabili. Sono gli odori del luogo che si fissano molto più profondamente. E la mente torna a momenti della tua infanzia, a quell'aroma delizioso di una cucina, a quello terso dei panni stesi ad asciugare, all'acredine di una traccia di un animale. Potenti e inarrestabili ti entrano in testa e ti scaraventano indietro nel tempo in un millesimo di secondo risvegliando sinapsi che ormai erano confinate in angoli remoti della mente. E con essi arriva, prepotente, la nostalgia di tempi che non potranno più essere, di ore trascorse nella felicità di un pomeriggio di luglio, di amici persi e ormai non più ritrovati, di un sorriso fugace che ti è rimasto impresso.

Bosco per me oggi è questo. Cammino per le sue vie, vedo luoghi che mano a mano tornano familiari, abitati da persone ormai sconosciute e perlopiù forse fugacemente incontrate lustri fa. Una passeggiata lieta ma al tempo stesso colma del dolore di questi ricordi annebbiati. E allora parlo a mia figlia. Glieli racconto come una storia, sperando che almeno lei possa in parte memorizzare queste mie sensazioni e un giorno farne tesoro. Credo ci riuscirò…