Technology Experience
My personal life

Arrivederci, Steve, e grazie di tutto

Non sono mai stato vicino ai prodotti ed all’azienda Apple, ma la perdita di oggi è una cosa che mi ha scosso molto.

Steve Jobs è stata una delle persone che ha creato l’informatica, una di quelle che se non fosse esistita probabilmente parecchi di noi non farebbero questo lavoro, o sicuramente lo faremmo in modo molto diverso. Steve Jobs è stato un grande visionario, uno di quelli che sono andati in contro-tendenza, facendo invertire la rotta al mondo intero. Ci sono società che per capire come fare a cosa inserire in un prodotto fanno indagini di mercato, e fanno sondaggi, cercando di capire cosa serve al mondo in quel momento. Steve Jobs no, aveva le sue idee e non aveva bisogno di chiedere niente a nessuno. Steve Jobs andava e credeva dritto fino in fondo alle sue idee. Mentre tutti facevano lettori mp3 di un certo tipo, Apple ha sfornato iPod. Mentre tutti facevano telefoni di un certo tipo (cercando di replicare per certi versi le funzionalità di un pc, per quanto possibile), Apple ha sfornato iPhone. Mentre tutti pensavano fino a qualche annetto fa a come migliorare notebook & simili, ecco che Apple ti tira fuori iPad. Tutti prodotti che hanno fatto tendenza.

Mi piace pensare che Steve non sia andato in giro a chiedere alla gente come voleva un telefono, un computer, un lettore mp3. Lui era un vero visionario, perchè aveva tutto in testa, credeva nelle sue idee e non ha chiesto a nessuno. Mi piace pensare che Steve litigasse pure con i suoi ingegneri, che volevano fare prodotti diversi, mentre lui era convinto, e ha cercato di convincere. Spesso mi ritrovo a dire e a pensare che la democrazia al giorno d’oggi non è più una forma di governo funzionale: è molto meglio avere un leader (dittatore?) giusto. Così mi immagino Steve Jobs: un dittatore giusto, capace di prendere le giuste decisioni. Magari non sempre, dal momento che – come sappiamo tutti – ha vissuto per lungo tempo ai margini, con la sua Apple che lo aveva mandato a casa. Ma la cosa bella è che ci è tornato da leader, senza abbandonare le sue idee, cazzo.

Sinceramente mi commuovo, e non è una frase fatta. Mi commuovo perchè il nome Steve Jobs ed Apple fanno parte della mia infanzia, di quella informatica degli anni ‘80, quando ero un bambinetto e muovevo i primi passi nell’informatica. Fa sorridere vedere che anche Steve Jobs aveva cominciato con i videogiochi, con l’Atari, con Nolan Bushnell, con l’inizio di tutto un mondo a cui sono ovviamente vicino.

Mi ricorderò sempre di oggi, mi ricorderò di questo 6 Ottobre (ora italiana, lui se ne è andato il 5) in cui ero in trasferta in Valtellina. Mi sono svegliato questa mattina ed ho letto un tweet. Credo che ricorderò questa data a lungo, come l’11 Settembre e le Torri Gemelle, come il 2 Aprile e Papa Giovanni Paolo II, e tutte le altre date importanti. Ricordo dov’ero e cosa stavo facendo. Così sarà anche per questo 6 Ottobre.

A volte mi piace ipotizzare cosa sarebbe successo se Kennedy non fosse stato assassinato; e una volta su questo stesso blog ho immaginato che saremmo andati su Marte, conoscendo l’impegno per i viaggi spaziali del presidente USA. Cosa sarebbe accaduto se uno come Steve Jobs non fosse mai nato? E se fosse scomparso cinque anni fa, invece di oggi? Pensateci voi, è uno scenario interessante. Io intanto gli dico grazie, perchè le cose che ha fatto hanno davvero cambiato il mondo. Se ho in mano un Windows Phone 7, lo devo di riflesso anche a lui.

Oggi, per la prima volta, ho avuto voglia di entrare in un Apple Store a comprare qualcosa, qualcosa con la mela morsicata su.

Grazie, Steve, per tutto quello che hai fatto per noi. Grazie per il tuo genio, la tua visione, la tua testardaggine, i tuoi prodotti.

Non ti ho mai dato retta, e mai lo farò (ma mai dire mai), ma grazie comunque di tutto!

Send to Kindle
Software

Se tifate per qualche squadra di calcio, non perdete le mie applicazioni WP7

Lo so, per certi versi non è una novità, dal momento che già dall’anno scorso sono disponibile sul marketplace ufficiale tutte mie le applicazioni per Windows Phone 7 dedicate alle squadre di calcio di Serie A. Per l’esattezza l’elenco comprende (in rigoroso ordine alfabetico):

I Love Atalanta
I Love Bologna
I Love Cagliari
I Love Catania
I Love Cesena
I Love Chievo
I Love Fiorentina
I Love Genoa
I Love Inter
I Love Juventus
I Love Lazio
I Love Lecce
I Love Milan
I Love Napoli
I Love Novara
I Love Palermo
I Love Parma
I Love Roma
I Love Siena
I Love Udinese

Qualche settimana prima dell’uscita ufficiale di Mango, ho creato altre applicazioni di questo filone, dedicate questa volta alle squadre di calcio di Serie B.

I Love Albinoleffe
I Love Ascoli
I Love Bari
I Love Brescia
I Love Cittadella
I Love Crotone
I Love Empoli
I Love Grosseto
I Love Gubbio
I Love Juvestabia
I Love Livorno
I Love Modena
I Love Nocerina
I Love Padova
I Love Pescara
I Love Reggina
I Love Sampdoria
I Love Sassuolo
I Love Torino
I Love Varese
I Love Verona
I Love Vicenza

Veramente, non sfrutto caratteristiche particolari di Mango, ma ci sono stati dei passi avanti rispetto alle versioni rilasciate l’anno scorso. Riassumo in breve.

  1. Poter consultare l’account Twitter ufficiale (ufficiale? mmhh, non sempre) della squadra; rispetto all’anno scorso, adesso è possibile aprire i links contenuti nel testo del tweet
  2. Possibilità di apertura di YouTube, per vedere direttamente i video della squadra (partite recenti, goal, interviste, tutto ciò che viene pubblicato)
  3. Possibilità di consultare il palmarés della squadra (che aggiorno ogni anno)
  4. Possibilità di consultare la pagina pubblica su Facebook

In mezzo a questa piccola marea di applicazioni dedicate al calcio, ricordo invece quella dedicata alla Norda Foppapedretti di Bergamo, squadra di pallavolo femminile di Serie A. Squadra che ho tifato durante i playoff del campionato 2010/11.

Ogni applicazione costa 0,99 euro. Questo per favorire l’acquisto di singole applicazioni, in modo tale che chiunque si possa permettere di acquistare quella della squadra che gli interessa. Sarebbe stato inutile – credo – farne una unica da 5 euro, che non avrebbe comprato nessuno. Il numero di download è piuttosto buono, anche se ovviamente il numero di trial supera abbondantemente quello delle copie pagate, ma è comunque una piccola soddisfazione. Ed ovviamente le applicazioni più scaricate sono quelle delle squadre più quotate e di maggior successo.

Cosa aspettate? Raggiungete il marketplace Windows Phone 7, trovate la squadra per cui tifate ed installate l’applicazione sul vostro smartphone WP7!!!

Send to Kindle
Flight Simulation

Il mio progetto per Piloti Virtuali Italiani: WPF, WCF, ASP.NET MVC, Google e WP7

Questo si preannuncia come un post piuttosto lungo, almeno credo.

Da qualche anno sono socio dei PVI (Piloti Virtuali Italiani). Spesso, quando parlo con altri soci (siamo diverse centinata, sparsi un po’ in tutta Italia) mi definisco la “parte informatica” di PVI. Proprio seguendo questo filone, ho contribuito in prima persona alla realizzazione di un sistema, che per gli standard PVI è piuttosto complesso.

E siccome, come potete ben immaginare, coinvolge soprattutto tecnologie Microsoft, questa sera ne voglio parlare qua sul mio blog.

Introduzione
Dunque, una premessa è d’obbligo. PVI è una community a pagamento che tratta di simulazione di volo. Questo significa che quasi tutti i soci hanno un PC a casa con installato Microsoft Flight Simulator X, più una miriade di add-on (scenari, aerei, utility) tutti inerenti il volo. I soci hanno accesso ad un server privato e dedicato che permette loro di volare in multiplayer.

Il problema che si voleva risolvere era di rendere evidente le attività di volo che ciascun socio fa per conto suo, sul suo PC, senza necessariamente collegarsi ad un server con altre persone. E’ così che il Natale scorso, in sordina, ho cominciato a farmi venire qualche idea per dare il mio contributo.

Guardate questo schema sempliciotto:

Qualche dettaglio in più
Ok, lo so, è un po’ infantile, ma mi sono divertito con la tavoletta grafica che giaceva abbandonata da un po’.
I rettangoli rappresentano le componenti principali, e cioè:

  • FSX : Flight Simulator X, il vero simulatore di volo, installato a casa dei soci PVI, prodotto da Microsoft
  • FSX Logger, software in WPF scritto da me che rappresenta una vera e propria scatola nera specifica per FSX. FSX è programmabile e gestibile da .NET grazie all’utilizzo della libreria SimConnect.dll, che viene automaticamente installata nel sistema quando si installa il simulatore
  • WCF Service, servizio WCF scritto da me che dialoga con FSX Logger, riceve ed invia informazioni (maggiori dettagli di seguito)
  • Roster PVI, sito Web scritto (da me!!!!!!) in ASP.NET MVC che permette di scaricare FSX Logger, di vedere tutti i voli completati, etc.

Quindi, la morale è: i soci utilizzano FSX per fare i loro voli, da Milano a Roma, dal Nord Africa all’Inghilterra, con piccoli Cessna al grande 747, con elicotteri da trasporto, oppure con vecchi biplani. Tali voli vengono registrati con FSX Logger. La registrazione di volo è contenuta in un file zip, che viene salvato all’interno della cartella Documenti del PC. Questo file zip contiene un po’ di cosucce interessanti:

  • il file kml del volo (file XML standard riconosciuto, tra le altre cose, da Google Maps e Google Earth, ma non solo)
  • eventuali fotografie scattate durante il volo (premendo il tasto ‘v’ mentre si vola con FSX si scatta uno screenshot della schermata – il mio software trova la foto e la include nello zip
  • file csv, che contiene DAVVERO UNA MIRIADE di informazioni, registrate ogni secondo di volo. Per maggiori informazioni, cliccate qui. L’elenco non è aggiornatissimo, altre variabili sono state aggiunte successivamente

Lo zip, come dicevo prima, viene automaticamente salvato sul proprio PC. FSX Logger, però, può inviarlo automaticamente per la pubblicazione sul sito Web, attraverso l’utilizzo di servizio WCF che espone un’interfaccia per mettere in atto determinate funzionalità. Uno di questi metodi riceve un semplice byte[], che lato server viene manipolato e pubblicato.

Preso un file zip, il file csv contenuto viene aperto e manipolato, dicevo, al fine di ottenere tutta una serie di informazioni, tra cui:

  1. Durata effettiva del volo
  2. Consumi di carburante
  3. Tipo di aeromobile utilizzato (tipo di motore, modello, etc. etc.)
  4. Andamento dell’altitudine, della velocità verticale, dell’heading e molto altro ancora
  5. Velocità al momento del decollo (rotation speed) e dell’atterraggio (touch-down speed)
  6. Varie condizioni di allarme: stallo, overspeed, angolo di virata troppo elevati, utilizzo del carrello errato, etc.
  7. Stato delle luci (beacon, landing, panel, strobe, e via dicendo)

Per ciascun volo, viene calcolato un punteggio. Nel momento in cui vi scrivo, tale punteggio viene calcolato basandosi esclusivamente sul tempo. Ogni 10 minuti di volo effettivo, il pilota guadagna 1 punto. Avevo inserito delle penalità, ma le ho rimosse perchè dopo averci ragionato su per parecchie settimane, non piacevano e non potevano essere del tutto corrette. Un volo può comunque essere invalidato e guadagnare 0 punti se:

  1. Il pilota ha messo in pausa in simulatore
  2. Il pilota ha rallentato/aumentato la velocità di simulazione
  3. Il pilota ha fatto carburante in volo (operazione che ovviamente in realtà sarebbe impossibile con i classici aerei)
  4. Il pilota non è nemmeno decollato nè atterrato (sembrerà strano, ma può succedere)
  5. Il pilota ha cambiato aeroplano in volo (nella realtà sarebbe impossibile, ma qui ovviamente sì…che simulatore sarebbe?)

Tutti i voli pubblicati finiscono quindi su quello che noi Piloti Virtuali chiamiamo Roster. Quello ufficiale di PVI lo trovate a questo indirizzo. Oltre al classico elenco di tutti i voli completati, sono disponibili altre viste:

  1. Classifica in base al tempo
  2. Classifica in base al punteggio

Girando sul sito è possibile ottenere altre viste più o meno dettagliate. C’è anche una vista dedicata alla visualizzazione delle fotografie scattate durante il volo: ovviamente quando FSX Logger invia il file zip sul server, tale file contiene anche i files jpg, e quindi realizzare tutto ciò non è un grosso problema.

Come dicevo prima, il sito Web è stato realizzato interamente da me con ASP.NET MVC. E mi sono trovato alla grande. Dietro le quinte, ovviamente, utilizzo SQL Server ed Entity Framework per la gestione delle entity e del piccolo dominio con cui ho a che fare.

Categoria del volo
Quando si avvia Fsx Logger, il pilota che si appresta ad iniziare un volo può specificare in quale categoria cade il volo stesso. VFR significa Visual Flight Rule, ed in pratica (molto in pratica) significa volo visuale. Si vola di giorno, orientadosi guardando il paesaggio sottostante: fiumi, laghi, tangenziale, paesi, tralicci della luce, mulini a vento, e tutto ciò che vi pyò aiutare a capire dove siete e in che direzione state andando. Un’altra categoria è IFR, che sta per Instrumental Flight Rule. Qui si vola con le classiche regole di radio-navigazione: NDF, VOR, radiali, SID e STAR, e via dicendo. Questa categoria è quella di tutti voli di linea, italiani ed esteri. Noi di Piloti Virtuali ci siamo “inventati” altre categorie, derivate da queste, e che si legano a particolari eventi che si sussegguono durante l’anno. Qualche esempio:

  • IVAO VFR
  • IVAO IFR
  • Crazy Horse
  • Purple Drake
  • Altre ancora

IVAO sta per International Virtual Aviation Organization. La faccio breve: è un’organizzazione internazionale di controllori di volo. Normalmente quando si vola con FSX sta a noi rispettare e simulare le vere regole di navigazione. Esempio: durante il rullaggio non si possono superare i 30 nodi, oppure sotto i 10.000 piedi di altitudine non si possono superare i 250 nodi. Oppure, in uscita da Linate devo seguire determinate rotte, e non andare dove mi pare e piace. Volare su IVAO significa collegarsi con un client, mettersi in comunicazione con i controllori di volo virtuali, che dirigono il traffico. Quando si vola su IVAO, è necessario impostare in Fsx Logger le categorie corrette.

Crazy Horse e Purple Drake sono invece due iniziative diverse: voli in multiplayer che si svolgono in determinate serate, con un particolare tema.

Ora, la cosa importante da dire è che quando si selezionano queste categorie la regola di calcolo del punteggio cambia. Mentre normalmente si guadagna 1 punto ogni 10 minuti di volo, se si vola durante il Purple Drake i punti guadagnati sono 1,5 ogni 10 minuti, e così via. Si è reso necessario quindi fare in modo che queste categorie di volo siano effettivamente disponibili in Fsx Logger solo quando quel determinato volo esiste. Altrimenti è come dire che io ho partecipato alla 5° Tappa del Giro d’Italia oggi, 1° Ottobre 2011, quando in realtà il Giro d’Italia non c’è.

Per risolvere questo problema, ho inizialmente sviluppato questa cosa sfruttando il mio database che fa girare tutto il sistema. Nella tabella che contiene tutte le categorie di volo mi sono inventato due campi: StartDate ed EndDate, facendo in modo quindi che Fsx Logger all’avvio scarichi solo le categorie effettivamente disponibili in quel momento. Però la cosa è diventata complicata da gestire, soprattutto in presenza di eventi schedulati nel tempo, perchè ogni settimana dovevo ricordarmi di spostare in avanti la data.

E’ qui che ho cominciato ad utilizzare Google Calendar!

Pianificazione degli eventi con Google Calendar
Google Calendar è un normalissimo calendario, molto accessibile e molto semplice da utilizzare. E grazie ad opportune API è anche facilmente programmabile anche da .NET.

Riassumo quindi in breve:

  • Quando Fsx Logger viene avviato, chiede al servizio WCF di fornirgli l’elenco delle categorie di volo disponibili
  • Il servizio WCF forma e restituisce questo elenco in tre modi: categorie di volo pubbliche e sempre disponibili a tutti; categorie di volo private ed associate all’utente che mi ha fatto la richiesta (esempio: esistono le categorie “Trainer” o “Flight School”, che diventano disponibili rispettivamente solo ai Trainer ed agli Allievi della Scuola di Volo PVI); categorie di volo schedulate attraverso Google Calendar
  • Quindi, riassumendo: il servizio WCF soddisfa la richiesta: “Sono l’utente Pippo, dammi per favore le categorie di volo che mi spettano”

La cosa a cui non avevo mai pensato, francamente, è di utilizzare Google Calendar come repository di dati, usufruibili da applicazioni esterne. Adesso quando PVI organizza un evento particolare, un contest, una gara, un tour da qualche parte, è sufficiente che io vada nel Google Calendar ed inserisca un appuntamento il cui titolo corrisponde alla categoria di volo che voglio attivare. Ed il gioco è fatto! Molto, molto più semplice di quanto avrei fatto continuando ad usare il mio database.

E Windows Phone 7, cosa c’entra? 
L’ultimo tassello in ordine di tempo è l’applicazione per Windows Phone 7, che riassume un po’ di strumenti ed utilità dedicate ai soci, ma non solo.

  • Visualizzazione del Roster PVI (in pratica, una vista in Silverlight di questa pagina Web)
  • Visualizzazione del report di volo di ciascun volo, e delle eventuali fotografie scattate
  • Consultazione dei codici IVAO dei soci PVI
  • Consultazione sito Web, Facebook, Twitter ufficiale
  • Poter scrivere ai contatti principali di PVI: segreteria, direttivo, etc.
  • Poter scrivere nella mailing-list privata di Piloti Virtuali Italiani
  • Poter richiedere l’attivazione di una licenza di Fsx Logger (che è nato come software a pagamento, ma come mio regalo a tutti i soci di PVI)

L’applicazione è ancora under-development. Vi terrò informati!

Tempo per la realizzazione del sistema
Ho cominciato a lavorarci intorno a Natale 2010, ed in certi 4 mesi l’intero progetto era up & running.
Ci stiamo lavorando ancora adesso, per migliorarlo e per correggere piccoli dettagli, ma ormai il grosso c’è.

E’ stata, e lo è tuttora, una bella soddisfazione, perchè era qualche anno che PVI soffriva di un sorta di immobilismo e di un distaccamento tra i soci. Come ho introdotto all’inizio, ciascun volo volava, ma lo faceva privatamente, e quindi nessuno sapeva cosa stessero facendo gli altri. Il sistema descritto in questo post, il cui sviluppo molto probabilmente proseguirà nei mesi a venire, ha portato alla luce tutta questa attività. Inutile dire che molte, molte persone di PVI continuano ancora oggi a ringraziarmi! Il loro contributo è stato fondamentale, perchè mi hanno spiegato e dettagliato regole di volo reali, che sono state applicate in lungo e in largo all’interno del sistema. Io posso averci messo del mio per quanto riguarda l’aspetto tecnico, ma senza di loro le cose non sarebbero così dettagliate al punto giusto.

Send to Kindle
Software

Siamo proprio sicuri che i videogiochi siano solo “giochini” ?

Premessa: scrivo questo post sull’onda dell’emozione provata questa sera nel finire Deus Ex Human Revolution.
Videogioco che consiglio a tutti voi.

Il titolo del post non è granchè, sembra una frase scritta su un quaderno delle elementari.
Sorriso

Comunque sia, sono qui per parlarvi di videogiochi. Non starò qui a dirvi che per quello che mi riguarda il tutto è cominciato molti, molti anni fa – prima con un 8088 (Olivetti Prodest PC1), con un 386 a 16Mhz, con un Pentium a 133Mhz, via via pian piano, fino a raggiungere l’era moderna. Tralascerò anche i miei videogame preferiti degli ultimi decenni: ora ricordo solamente UFO Enemy Unknown, Stunt Car Racer, Indiana Jones ed il Destino di Atlantide, ovviamente DooM, più una miriade di altri che sto volutamente “dimenticando”.

Parliamo dell’era moderna. Già in altre occasioni vi ho parlato di Steam. Questa sera vi pubblico la lista dei videogiochi che posseggo.

Sappiamo tutti che l’industria dei videogiochi non conosce crisi. Tutte le volte che finisco un gioco, mi godo – come spero facciate tutti voi – il finale ed i titoli di coda. La cosa non è così scontata: quando al cinema il film finisce, il 90% delle persone si alza e se ne va subito: peccato. Comunque, tutte le volte rimango veramente sorpreso nel vedere quanta gente lavora per portare a termine un prodotto che la maggior parte delle persone definisce “semplice gioco”. Ci sono ovviamente programmatori e grafici, ma anche attori, designer, architetti di esterni e interni, psicologi, truccatori, attori, doppiatori, gente del marketing, sceneggiatori. C’è veramente uno sforzo notevole, che spesso e volentieri – secondo me – supera di gran lunga l’impegno per realizzare un film per il cinema. Un film dura un paio d’ore, mentre un videogioco – se fatto bene – viene giocato quantomeno per alcuni anni, da centinaia di migliaia di giocatori, se non addirittura milioni (fino all’uscita dell’episodio successivo, se c’è). A seconda del tipo di videogioco, occorre prevedere più finali – in base a ciò che il giocatore sceglie di fare – oppure bisogna prevedere dialoghi complessi e variegati (in un gioco di ruolo, per esempio, a seconda delle caratteristiche del proprio personaggio i dialoghi possono svilupparsi in modo diverso). Da questo punto di vista ricordo con piacere Dragon Age – gioco di ruolo cominciato e mai finito – dove se il proprio personaggio è maschile si può far innamorare la bella del party, e viceversa. A seconda del proprio punteggio di carisma si possono ottenere informazioni utili, sconti durante la compravendita di oggetti e cose del genere. In un film i dialoghi sono quelli, stabiliti a priori, e buonanotte a tutti.

C’è una cosa da dire, per concludere. La cosa che in assoluto adoro e cerco in tutti i videogiochi che compro è la Trama. La trama, la storia che il nostro personaggio vive la fa da padrona, sempre. Ok, è chiaro, se gioco a Call Of Duty la storia magari è la solita trita e ritrita (USA vs Terrorismo, United Nations vs Cattivo di Turno), ma – fidatevi di questo elenco:

Questo è un breve elenco dei giochi giocati negli ultimi anni, e che mi hanno lasciato qualcosa dentro per le loro storie e trame. E la cosa impressionante è che ormai la qualità di trame, scene, dialoghi, musiche e coinvolgimento è tale che spesso – quando passano i giorni e le settimane – non ricordo più se una certa frase l’ho sentita in un film al cinema, o in un videogioco, o in una pagina di un buon libro. Ci sono finali di videogiochi davvero emozionanti, che ispirano, che ti fanno riflettere e pensare. Questa sera, circa mezz’ora fa, ho finito Deus Ex Human Revolution, gioco di ruolo/azione ambientato in un prossimo futuro, dove il cyberpunk la fa da padrone. Si parla di innesti cibernetici, di fantascienza, ma anche di discriminazione, di controllo degli innesti, di chi dovrebbe decidere e controllare la libertà di ciascuno di noi. L’uso delle immagini, durante i titoli di coda, è francamente disarmante e lascia senza parole, soprattutto considerando tutti gli avvenimenti che si vivono durante il gioco stesso.

Spesso le persone più adulte, ma non solo, sorridono quando vedono un videogioco, e lo trattano come se fosse un “giochino”. Credo che sia lo stesso discorso di quando qualcuno dei miei amici mi spiega che in Giappone i fumetti non sono prodotti per bambini, ma opere per adulti. Dietro un videogioco, al giorno d’oggi, c’è una vera e propria opera di ingegno, che è in grado di regalare ore, ore ed ore di divertimento, di soddisfazione, una sorta di gratificazione che è difficile da spiegare se non la si prova. Sono abbastanza sicuro nell’affermare che oggi, sinceramente, preferirei un videogioco ad un film al cinema, se non fosse per il fatto che il videogioco è un’attività solitaria, mentre il cinema ti fa uscire di casa e vivere nella società. Ma se fosse una mera scelta basata sulla qualità del prodotto, non avrei dubbi.

Stasera, davanti al finale di Deus Ex, ho mormorato, tra me e me: davvero un ottimo lavoro. Square Enix – publisher del gioco – è entrata di diritto tra quelle che seguo maggiormente, perchè già con Batman: Arkham Asylum mi aveva molto soddisfatto. Ora con questo Deus Ex, per quello che mi riguarda, fa l’ultimo gradino per entrare nel mio Olimpo personale.

Ed ora, giusto per chiudere e finirla qua, vi lascio alle parole tratte dal finale di Deus Ex Human Revolution. I finali sono multipli: quello che vi propongo di ascoltare e di vedere è solo uno dei quattro possibili, ed è quello che ho scelto io “ufficialmente”. Il video arriva dritto dritto da YouTube. Buona visione, godetevelo.

Send to Kindle
.NET World

Lightswitch e la mancata autenticazione in produzione

Lasciate che vi racconti questo scenario, piuttosto realistico, dato che è quello che è successo a me.

Qualche settimana fa ho deployato su un server di produzione un’applicazione Lightswitch. L’applicazione utilizza la Forms Authentication, in modo tale che l’utente possa loggarsi, farsi riconoscere, lavorare e portare a termine i compiti che deve fare. Venerdì scorso ho aggiornato l’applicazione, solo che non ho voluto utilizzare la procedura di deploy prevista da Lightswitch, ma con un banalissimo ftp ho aggiornato e sovrascritto le varie componenti manualmente.

Mi riferisco a:

  • Varie dll proprietarie di Lightswitch
  • Dll esterne che utilizzo nella solution
  • XAP principale dell’applicazione

Fatto questo, bello soddisfatto, apro il browser, vado all’indirizzo dell’applicazione, e tutto pimpante mi aspetto di fare login.

Panico. Panico. L’applicazione Lightswitch NON mi chiede l’autenticazione, entro direttamente come ‘test user’, e posso fare tutto di tutto. Gestire anagrafiche, fare fatture, modificare e cancellare questo & quello.

Ora, un piccolo preambolo. Chi sviluppa con Lightswitch sa che quando si decide di attivare la Forms Authentication e si esegue l’applicazione da Visual Studio 2010, in realtà l’applicazione non chiede mai login. L’applicazione viene eseguita con un ‘test user’, le cui autorizzazioni vengono impostate in un pannello di proprietà del progetto stesso.

Nello screenshot qui sopra vedete il pannello. Lo si raggiunge aprendo le proprietà del progetto. Nel rettangolo violetto si attiva la Forms Authentication. Nel rettangolo arancione si attivano i ruoli che vogliamo attivare al ‘test user’: nel nostro codice, risulterà che ‘test user’ abbia quei permessi, e quindi l’interfaccia della nostra applicazione Lightswitch reagirà di conseguenza.

Arriviamo al dunque. Quello che è successo alla mia applicazione in produzione è che ha cominciato a comportarsi come se fosse eseguita da Visual Studio 2010, utilizzando l’utente ‘test user’. Niente login, login automatico con questo utente, tutti i permessi attivi.

A cosa è dovuto tutto ciò? E’ semplice. Andate nella cartella WebManifests e cancellate il file Microsoft.LightSwitch.Design.Server.Manifest.dll. Questo file si trova ovviamente nella binRelease dell’applicazione, sul vostro PC, ma non va copiata sul server di produzione. La prima volta che ho deployato in produzione ho utilizzato la procedura standard di Lightswitch; l’aggiornamento invece l’ho fatto a mano, copiando le dll, ma non sapendolo, ho copiato anche quella dll incriminata, e questo ha causato quel problema.

Tutto è bene quel che finisce bene!

Send to Kindle
.NET World

Pubblicato un mio articolo sul Lightswitch Publish Wizard

Questo è un post veloce!

Da circa tre giorni è on-line sul sito www.lightswitch.it un mio articolo dedicato alla procedura di deploy & publishing di Lightswitch.

Per poterlo vedere è necessario essere utenti registrati; intanto vi lascio questo indirizzo, da dove potete raggiungere il sito della community.

Ringrazio lo staff che mi ha dato questa piccola opportunità: è un periodo in cui ho voglia di partecipare con più coinvolgimento alle varie di attività di community, e questa cosa mi ha fatto sfogare un pochino. Probabilmente scriverò altri contenuti fra poco tempo, per cui rimanete sintonizzati e vi farò sapere.

Buona lettura!

Send to Kindle
.NET World

Lightswitch: come rendere invisibile un controllo, agendo sulla UI

Questo post inizia con la fatidica frase “A due controlli è stato fatto del male durante la stesura di questo post”.
Prima vi spiego come risolvere il vostro problema, poi vi dico perchè questa cosa in fondo non mi piace poi molto.

Dunque, lo scopo è quello di rendere invisibile un controllo (TextBox, CheckBox, ComboBox, insomma…qualsiasi cosa che erediti da System.Windows.Controls.Control), in base al valore contenuto in un altro controllo. La cosa è nata in questo thread sui forum di lightswitch.it. In pratica, abbiamo due controlli: una TextBox ed una CheckBox. Entrambe sono bindate a due entity property diverse: quando la TextBox (usata per inserire il valore di uno stipendio) contiene “0”, la CheckBox (usata per inserire Contributi si/no) deve essere resa invisibile, altrimenti no. Come fare?

Io ho risolto in questo modo.

Analogamente a quanto fatto in un mio post precedente, vado a gestire l’evento Created dello screen che mi interessa:

partial void TeamsListDetail_Created() {  }

 

In questo modo, grazie ad un bel giochino di C# e lambda, scrivo poche righe di codice:

this.FindControl("CheckBox").ControlAvailable += (s, e) =>
{
checkbox = e.Control as CheckBox;
};

this.FindControl("TextBox").ControlAvailable += (s, e) =>
{
textbox = e.Control as TextBox;
textbox.TextChanged += (s2, e2) =>
{
checkbox.Visibility = textbox.Text.Equals("0") ? System.Windows.Visibility.Collapsed :
System.Windows.Visibility.Visible;
};
};

 

In breve, cerco di riassumere:

  • ottengo i riferimenti ai due controlli, rispettivamente chiamati “CheckBox” e “TextBox” – ovviamente i vari nomi vengono assegnati da Lightswitch, ma possono essere modificati
  • quando si scatena l’evento ControlAvailable della CheckBox, non faccio nulla di particolare: semplicemente mi vado a salvare il riferimento per usarlo dopo
  • quando si scatena l’evento ControlAvailable della TextBox, ne sottoscrivo l’evento TextChanged
  • ogni volta che l’utente cambia il testo contenuto nella TextBox, si scatena l’evento TextChanged – questo lo sappiamo bene, è il runtime di Silverlight. A questo punto è molto semplice, perchè faccio un banale controllo: quando la TextBox contiene “0” la CheckBox sparisce, altrimenti compare
  • notare che Lightswitch sulla UI produce anche la label della nostra proprietà (oltre al controllo per editare la proprietà stessa): la Label non è sotto il nostro controllo, per cui non potremo mai renderla invisibile/visibile (attendo correzioni se sbaglio Con la lingua fuori)

La soluzione c’è, e devo dire anche con poche righe di codice.
Sorriso

Perchè è stato fatto del male a questi due controlli? Per due motivi principali.

  • Innanzitutto è stata inserita una logica di business a livello di UI. Il fatto che la proprietà booleana Contributi debba essere false quando lo stipendio è zero mi sembra una regola del dominio (non è un’applicazione che sto sviluppando, perciò prendo per buona questa regola). Però questo non dovrebbe essere inserito nella UI, ma sulle entity vere e proprie. E’ per questo che ho consigliato di agire sulla entity, così questa regola viene “riciclata” indipendentemente dal fatto che venga utilizzato quello screen. Importantissimo!!! Quindi, per esempio, basta andare nel set della proprietà Stipendio e – se vale zero – metto a false la proprietà Contributo. Sia chiaro: questo non rende invisibile la CheckBox, si assicura solamente che i dati nelle entità di dominio siano valorizzate coerentemente con quello che il dominio vuole e si aspetta.
  • Il secondo errore è che scriviamo codice molto, molto specifico rispetto alla tecnologia del presentation layer. Come ha già osservato Alessandro Del Sole qualche giorno fa, oggi Lightswitch produce in output un’applicazione Silverlight. Ma in futuro potrebbe produrre HTML5, applicazioni Metro-style, WPF, e chissà cos’altro. Quando quel “futuro” sarà “presente”, saremo costretti a riprendere l’applicazione e a riscrivere quella parte. Uno dei vantaggi di Lightswitch è l’autogenerazione dinamica della UI, e se noi andiamo a metterci lo zampino, ne paghiamo e pagheremo le conseguenze.

Alla prossima!

Send to Kindle
.NET World

Utilizzare OpenFileDialog e SaveFileDialog con Lightswitch

Una delle cose più comuni all’interno di un’applicazione, sia Desktop che Web, è fornire all’utente la possibilità di aprire e salvare files sul proprio PC. Potrebbe trattarsi di una fattura in formato pdf, oppure di un semplice file di testo, xml, e via dicendo. Le possibilità sono innumerevoli, e dipendono ovviamente dal tipo di applicazione che state sviluppando.

Dal punto di vista developer, questa cosa si ottiene con le classi OpenFileDialog e SaveFileDialog. Queste classi sono disponibili allo stesso modo con Windows Forms, WPF ed ovviamente Silverlight. Il che tocca ovviamente anche il nuovo mondo Lightswitch. Arriviamo al dunque.

Per permettere all’utente l’apertura di un file è necessario scrivere qualche riga di codice. Apriamo lo Screen Designer relativo allo screen su cui vogliamo gestire questa cosa, e per semplicità aggiungiamo un pulsante nuovo, chiamato “PrintInvoice”.

Per editare il codice è sufficiente cliccare con il destro sul Button appena aggiunto e successivamente fare click su Edit Execute Code. In condizioni normali scriveremmo il codice seguente:

OpenFileDialog dialog = new OpenFileDialog();

partial void Print_Execute()
{
    var result = dialog.ShowDialog().GetValueOrDefault();

    if (result)
    {

    }
}

 

Ovvero: istanziamo un oggetto OpenFileDialog come membro privato della classe, e sul click del Button invochiamo la ShowDialog() per dare la scelta all’utente. Sfortunatamente con Lightswitch le cose sono un po’ diverse:

  • Innanzitutto l’istanziazione della classe OpenFileDialog deve avvenire nel thread UI (comunque facilmente accessibile attraverso Microsoft.LightSwitch.Threading.Dispatchers.Main)
  • Se anche risolvessimo il punto sopra, ci scontreremmo con un altro problema, tipico dello sviluppo Silverlight. Ovvero la chiamata a ShowDialog() deve avvenire sempre e comunque come diretta conseguenza di un’interazione fatta dall’utente. Nel nostro caso sarebbe il semplice click del mouse, ma evidentemente Lightswitch aggiunge qualche strato software che impedisce questa cosa. L’architettura che c’è dietro i Button creati e gestiti con Lightswitch – infatti – vengono gestiti attraverso il motore di binding di WPF/Silverlight, applicando il pattern MVVM. Vediamo infatti che dobbiamo gestire gli eventi Execute e CanExecute, che derivano direttamente dall’interfaccia ICommand.

Quindi, difatto siamo bloccati. Cosa dobbiamo fare per risolvere il problema? Bisogna complicarsi la vita, come sempre! Sorriso

Innanzitutto, andiamo a gestire l’evento Created dello Screen che ci interessa e scriviamo questo codice:

   1:  partial void InvoicesListDetail_Created()
   2:  {
   3:      Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
   4:      {
   5:          dialog = new SaveFileDialog();
   6:          dialog.DefaultExt = "pdf";
   7:          dialog.Filter = "Documenti Pdf (*.pdf)|*.pdf|Tutti i files (*.*)|*.*";
   8:      });
   9:   
  10:      var printInvoiceButton = this.FindControl("PrintInvoice");
  11:      printInvoiceButton.ControlAvailable += printInvoiceButton_ControlAvailable;
  12:  }

 

In fase di creazione dello Screen, utilizzo il thread UI per inizializzare l’oggetto dialog, definito – come prima – come membro della classe. Oltre a questo, utilizzo l’extension method FindControl per ottenere un riferimento al Button che ci interessa.

Una cosa importante: il metodo FindControl, come già detto, è un extension method. Assicuratevi di avere la riga using Microsoft.LightSwitch.Presentation.Extensions, altrimenti non potrete mai utilizzarlo.

Una volta ottenuto il riferimento al Button, utilizzando il suo nome che avete impostato nello Screen Designer, ne sottoscrivo l’evento ControlAvailable. Questo, finalmente, mi porta a poter gestire l’evento Click.

   1:  void printInvoiceButton_ControlAvailable(object sender, ControlAvailableEventArgs e)
   2:  {
   3:      this.FindControl("PrintInvoice").ControlAvailable -=
   4:          printInvoiceButton_ControlAvailable;
   5:      var button = (Button)e.Control;
   6:      button.Click += button_Click;
   7:  }
   8:   
   9:  void button_Click(object sender, RoutedEventArgs e)
  10:  {
  11:      dialogResult = dialog.ShowDialog().GetValueOrDefault();
  12:  }

 

Nulla di particolarmente complicato. All’interno dell’evento Click possiamo visualizzare all’utente la finestra di dialogo, chiamando semplicemente il metodo ShowDialog(). Qui si sfrutta un comportamento particolare di Lightswitch: quando cliccate su un Button gestito secondo questa tecnica, prima viene richiamato l’evento Click, e solo successivamente viene eseguito il codice contenuto nell’Execute, che a questo punto conterrà una cosa simile a questa:

partial void PrintInvoice_Execute()
{
    if (dialogResult)
    {

    }
}

 

Il fatto di aver cliccato sul Button, quindi, prima visualizza la dialog (evento Click). Quando l’utente la chiude, sia scegliendo un file, sia cliccando su Annulla, viene eseguito l’Execute del Button associato. A questo punto si testa il valore restituito dalla dialog e si agisce di conseguenza.

Conclusione

Ok, il problema è risolvibile senza grossi problemi, ma il tutto mi sembra una forzatura, e ci richiede di scrivere codice “a basso livello”, che va un po’ in direzione opposta rispetto alla filosofia di Lightswitch. Che dire, magari la cosa verrà migliorata in futuro, con qualche patch o fix. Staremo a vedere!

Send to Kindle
VivendoByte.ByteAdventure

Sono Wilco, il mondo in cui vivo è solo un falso

Wilco è il mio nome in codice. Mi è stato affibbiato anni fa, quando sono entrato nel Team. Di cosa tratto? Di tutto un po’: la gente mi chiama ed io risolvo il loro problema. Recupero crediti, vigilanza notturna, visite presso i clienti…visite…di un certo tipo. E a volte ci scappa qualche lavoro extra: qualche estorsione, rapimenti di qualche rampollo di famiglia per richiederne il riscatto, riscossione del pizzo. Lavori un po’ particolari. Sono pericoloso? Sì. Lo sono per tutti? Diavolo, no, non ce l’ho con tutti quanti, ma solo con il mio obiettivo. Di certo comunque non sono quel tipo di uomo che un padre vorrebbe far sposare alla propria figlia. Me la cavo, giorno dopo giorno, senza pensare troppo al domani, perchè uno come me potrebbe anche non averlo, un domani. E poi condurre una vita come la mia in fondo è semplice: accendo il PC la mattina, ricevo la mail con gli ordini ed eseguo. Prima faccio, prima incasso i miei soldi, e meglio è per tutti: soprattutto per il Team. Per questo sono un tipo mattiniero: la mattina ha l’oro in bocca. Mi piace sentire nelle narici l’aria frizzante, ti dà un’energia particolare, che solo in quel momento del giorno trovi.

<goto>

Adesso sto correndo. A dispetto di quello che accade tutti i giorni, oggi mi sono alzato tardi. Ebbene sì, ogni tanto capita anche a noi professionisti. La sveglia è puntata alle 5:55 AM, lo è da circa 7 anni. Stamattina ho aperto gli occhi alle 7:00 AM, non l’ho proprio sentita – e non so spiegarmi il perchè. Che cosa mi è preso?? Come diavolo è potuto accadere?? Mi sono buttato giù dal letto, poi barba e di filato sotto la doccia fredda per svegliarmi. Venticinque minuti dopo ero per strada. Sto correndo per raggiungere la mia auto, dove potrò accedere al mio notebook nascosto sotto al sedile passeggero per vedere la missione di oggi. Diavolo, mi sono appena fatto la doccia e sono già tutto sudato. Se il buongiorno si deve dal mattino, oggi sono proprio fregato.

<goto>

Sette minuti di corsa, dal mio appartamento fino al parcheggio C31, dove solitamente lascio la mia auto parcheggiata. Apro lo sportello, mi ci infilo dentro, sollevo il sedile, trovo il notebook e lo accendo. Sono le 7:33 circa. Il sistema operativo fa il boot in meno di 15 secondi, ed ho avuto la bizzarra idea di inserire il programma di posta elettronica nell’avvio automatico. Sarà anche una cosa bizzarra, ma è la cosa più comoda del mondo. In Posta in Arrivo vedo due nuove e-mail: una arrivata verso le 1:00AM, l’altra – in Priorità Alta – è arrivata alle 6:30. Leggo prima quest’ultima, è la più recente, ed inoltre mi sembra più urgente.
Oggetto : “Appuntamento urgente, coordinate K19”
Testo : “Incontra l’uomo, ti dirà lui cosa fare”

Mail corta, essenziale, meglio. Il sistema di coordinate messo in piedi dal Team evita di sbandierare ai quattro venti l’indirizzo in chiaro: so che K19 identifica un settore a nord-ovest della città, ma il punto esatto apparirà sul navigatore satellitare solo quando sarò nei paraggi. Evito di perdere altro tempo: accendo l’auto, imposto il navigatore, esco dal garage e sfreccio via verso la mia destinazione.

<goto>

Davanti c’è un distributore di benzina. Non lo conoscevo, cercherò di ricordarmelo. La locazione K19 punta ad una piccola porticina di metallo, una di quelle che ci starebbe bene in una cantina di qualche palazzo, non certo messa lì, in bella mostra direttamente sulla strada. C’è un campanello, senza alcun nome. E non c’è maniglia: come diavolo faccio ad aprire una porta senza maniglia? Provo a spingere, ma sembra bloccata. Suono il campanello, e si sente il rumore di una sorta di meccanismo, che apre la porta.
La spingo lentamente ed entro.
C’è un’unica stanza: un tavolo di metallo, due sedie di metallo, un piccolo armadietto in un angolo. Sembra la stanza per un interrogatorio in una stazione di polizia. Manca solo uno specchio, quello in cui tu ti guardi, mentre quelli che stanno dall’altra parte ti guardano prendendoti in giro. Faccio qualche passo e mi avvicino al tavolo. Sopra ci sono un taccuino, una biro ed un paio di occhiali strani. La porta alle mie spalle si chiude automaticamente. Prima che cali il buio, si accende un neon sul soffitto.

Solo allora mi accorgo della sua presenza. Su una delle due sedie c’è seduto un uomo. Giuro, prima non c’era. Prima non c’era ed adesso sì.
Il neon vibra e produce una luce irregolare, strana, azzurrina, lasciando cadere ombre sfocate e divergenti.

Indossa gli occhiali, poi parleremo…” – ordina l’uomo.
Non è la prima volta che il Team assume metodi un po’ eccentrici per comunicare ordini e compiti, per cui non mi faccio sorprendere dalla stranezza della cosa. Li prendo dal tavolo – sono un po’ pesanti, e li indosso. Sono strani: le lenti sono gialle. Vedo tutto esattamente come prima, solo un po’ più giallo. E ho come l’impressione di poter apprezzare più dettagli, come se quelle lenti donassero più nitidezza nella visione stessa. Vedo meglio, più luminoso, vedo dettagli della stanza che prima ignoravo.
E – aspetta – cosa sono quei numeri che vedi ai lati del mio campo visivo?
Se ti stai chiedendo cosa sono quei numeri che vedi, sono qui per spiegarteli. Sono i tuoi valori parametrici: in alto a sinistra hai il tuo livello di salute, più sotto ci sono gli altri indicatori di saggezza, mana, forza. Le icone rappresentano il tuo profilo, chi sono e chi non sei, cosa puoi fare e cosa no. A destra vedi tutte le armi di cui disponi, con le munizioni residue, con tutti i loro potenziamenti. C’è un’ultima voce, in basso al centro, “Menù”: se ci clicchi sopra puoi accedere ad una serie di impostazioni avanzate: puoi salvare o ricaricare una partita, ricominciare da zero, oppure modificare altre impostazioni più a basso livello, ma adesso è meglio non parlarne”.

Partita??? Salvare o ricaricare? Ma di cosa diavolo sta parlando ‘sto tizio? Non riesco a far nient’altro che stare zitto, per adesso.
E’ ovvio che deve essere un pazzo, qualcuno che non ha tutte le rotelle al posto giusto. Lascio che continui la sua spiegazione.

Ora, non pensare che io sia pazzo o che non abbia tutte le rotelle a posto. Tutto questo è possibile perchè tu non sei nient’altro che un personaggio che non esiste. Una entità inserita in un falso mondo, dal quale non puoi fuggire. Ora – ascoltami bene – quando indossi questi occhiali puoi comandare una sorta di puntatore con lo sguardo: muovi gli occhi e vedrai una freccia, che puoi spostare dove vuoi. Se non mi credi, prova: con gli occhi vai sopra l’icona della pistola 10mm che vedi, sbatti gli occhi e guarda la tua mano”.

Non sto più nella pelle, non so di cosa stia parlando. I miei sensi sono tutti all’allerta, sto cercando una possibile via di uscita da questa assurda situazione. Sto cercando di capire dove voglia andare a parare questo tizio. E’ tutto folle, non ci capisco nulla. Faccio per alzarmi, in preda ad una sorta di stato d’ansia. Mi sto chiedendo cosa accadrebbe se tirassi fuori la mia pistola e sparassi a questo tizio e lo facessi fuori. Un colpo, bang, problema risolto.

Cosa stai aspettando? Muovi gli occhi, tocca la pistola e guarda la tua mano destra” – ripete l’uomo davanti a me.

Tentar non nuoce, è talmente assurdo che potrebbe funzionare. La cosa più logica è che questo paio di occhiali siano una sorta di giocattolo hi-tech del Team. In modo del tutto naturale, muovo gli occhi, prima a sinistra e poi a destra. Effettivamente vedo una freccia, come se fosse il puntatore della trackball che uso sul mio notebook. Si muove in modo istantaneo, seguendo il mio sguardo. Appena sposto gli occhi, la freccia si sposta di conseguenza. Vado sopra l’icona della mia pistola e sbatto gli occhi.

Istantaneamente sento un oggetto metallico, nella mia mano destra. La pistola, la pistola è comparsa nella mia mano. Incredibile, funziona davvero bene.

Vedi, è come ti dicevo? Questi occhiali sono una sorta di interfaccia per controllare il tuo personaggio. Ora – ti prego di fidarti di me – tu qui non esisti. Ti sei mai chiesto perchè alcune porte di case, appartamenti, palazzi sono sempre chiuse? Non ti sei mai chiesto perchè alcune persone che incontri per strada sembrano dei robot? Ti dicono sempre le stesse cose, camminano sempre negli stessi posti, non puoi fermarli per strada, non puoi interagire in alcun modo. La tua auto non ha bisogno di benzina: perchè? Questo non è un mondo reale, è solo un mondo fittizio creato da altri, da gente come me

Sto impazzendo, non può essere vero. Alzo la pistola, e senza pensarci un attimo la punto addosso allo strano individuo ed apro il fuoco. Un solo colpo, secco e deciso.

Lo sparo fa rimbombare tutta la stanza. L’armadio vibra per l’onda d’urto che lo raggiunge. Ma l’uomo è ancora vivo. E’ come se al momento dello sparo – solo un secondo prima – si trovasse da un’altra parte. Oh diavolo, ma perchè mi sono svegliato stamattina? Perchè non ho letto prima l’altra e-mail? Perchè solo a me succedono queste cose?

Ok, capisco la tua reazione. Come vedi, la tua pistola è programmata per colpire quasi tutte le persone di questa città. Non puoi colpire le persone neutrali, i negozianti, i personaggi primari della storia che stai vivendo, altrimenti il software entrerebbe in uno stato inconsistente. Prova a buttare il tuo notebook dal 50° piano di un palazzo: lo ritroveresti per strada perfettamente intatto. E non puoi colpire me perchè io sono un add-on di questo videogame, e come tale non posso essere terminato. Lo so cosa stai pensando: come ho fatto a fare in modo che ci incontrassimo solo oggi?

Stamattina ti sei alzato tardi. Non è mai successo in 7 anni. Perchè proprio stamattina? E’ stata colpa mia: stavo aggiornando il software con qualche plug-in, e la cosa mi ha portato via più tempo del previsto. Per questo motivo ho avviato il videogame più tardi, e quando il sistema è stato reinizializzato…l’orario della tua sveglia era già trascorso. Insomma, per farla breve, nel momento in cui la tua sveglia avrebbe dovuta suonare, il videogame non era avviato. Uno di quei plug-in sono io

Cosa vuoi da me?” – sono le prime parole della mia giornata di oggi. Vorrei non ci fosse bisogno di pronunciarle.

Cosa voglio da te? Solo metterti al corrente di questa faccenda. Posso solo mostrarti la soglia, sei tu quella che deve attraversarla.” – sorride l’uomo – chissà cos’ha da ridere – “Potrei dirti che questa è una battuta che arriva da Matrix, ma non sai neppure cos’è. E neppure Star Wars, Christina Aguilera e un sacco di altre belle cose.

Effettivamente non ho mai sentito parlare di una tizia chiamata Christina Aguilera. Il dubbio mi assale, ed è una di quelle cose che ti mettono una fottuta ansia. Quando intendevo che sono un uomo che non ha un domani, non intendevo proprio questo. E adesso, cosa faccio? Come mi comporto? Se non sono in un mondo vero, posso uscirne? Se sì, come? Se no, se non posso uscirne, a cosa mi serve sapere tutto questo? Forse posso sfruttare le caratteristiche di questo mondo a mio vantaggio. Quel salvare e ricaricare per esempio.

Il mio tempo qui sta per scadere, Wilco. Pensa a quello che ti ho detto. E’ tutto vero: questo mondo è solo una pallida riproduzione di un mondo vero più esterno. Questo mondo, sebbene sia ampio e tutto sommato liberamente esplorabile, impone pur sempre regole rigide e ben determinate. Non puoi sfuggire al sistema, mi spiace

L’uomo improvvisamente scompare, e rimango da solo. In una frazione di secondo ripenso a tutto quello che mi è accaduto. Non può essere vero, dannazione.

Mi tolgo gli occhiali e la mia visione ritorna quella di sempre, senza strani numeri ed indicatori. Meglio, molto meglio.

<goto>

E’ arrivata la sera anche oggi. Ho portato a compimento entrambe le missioni. Solo adesso mi rendo conto che la prima e-mail era stata mandata dallo strano uomo che ho incontrato a K19. Solo la seconda è stata mandata dal Team. Sono sdraiato sul mio letto, le mie energie sono al massimo, non ho un filo di sonno. Effettivamente potrei guidare per 30 giorni di fila senza provare il minimo segno di stanchezza? Non credo sia strano, tutti guidano, in questa città, e nessuno dorme mai. A parte quel barbone sdraiato sulla panchina a P21: quello non si sveglia mai. Mi alzo e scendo in strada.

Persone ed auto riempono le strade. Mi avvicino ad un passante, una giovane donna vestita in modo improbabile. Tento di fermarla, ma è come se non mi vedesse. La chiamo, ma mi ignora. Me ne vado. Non ho neppure fame; ciò nonostante mi avvicino ad un venditore di hot-dog, sulla strada, ma quando tento di parlargli il tizio mi dice sempre la stessa cosa. “I migliori hot-dog della città!” – “I migliori hot-dog della città!” – “I migliori hot-dog della città!”. La frase non cambia! E mille dubbi ritornano. Cammino lungo la strada, vedo porte chiuse che non posso aprire, saracinesche abbassate che non posso alzare, strade chiuse che non si aprono mai. Che mondo è mai questo? Ho come l’impressione che l’aver parlato con l’uomo, questa mattina, mi stia facendo vedere le cose in modo differente. Un modo che non ho mai considerato prima d’ora.

Ho la tentazione di andare ancora a K19 per ritrovare l’uomo, ma so per certo che non lo troverò. Aspetterò una sua e-mail, solo così avrò la certezza di trovarlo.

Inforco di nuovo gli occhiali. Al contrario dell’uomo, che è sparito, gli occhiali sono rimasti sul tavolo della stanzetta e li ho portati con me.

La visione torna nuovamente gialla. Gli indicatori mi dicono che ho salute 100/100, che ho 7 proiettili residui sulla mia balestra furtiva, ed un sacco di altre cose.

Non puoi uscire da questo mondo” – riporto alla mente le parole che mi ha detto stamane l’uomo.

Ed allora – mi chiedo – cosa accadrebbe se cliccassi su “Menù” e poi su “Exit game” ?

Send to Kindle
Software

Steam & Steam Cloud: di meglio non c’è!

Steam, per chi non lo sapesse, è una piattaforma di Valve per permette l’acquisto di videogiochi on-line. Basta spedizioni a casa, basta cercare la scatola del nostro videogame preferito nei centri commerciali (impresa difficile soprattutto nel giorno stesso della data di uscita – anche se al giorno d’oggi le cose sono un po’ migliorate, con catene come Gamestop, per esempio), e via dicendo. Steam è decisamente la piattaforma leader: i diretti concorrenti – penso a Games for Windows Live o Origin di Electronic Arts non possono francamente tenere il passo. Le caratteristiche di Steam che ritengo fondamentali sono:

  • catalogo da lasciare a bocca aperta: si trovano praticamente tutti i generi di giochi, dal più sconosciuto al più famoso (come le serie Need For Speed, Call Of Duty, FEAR, etc.). Si trovano giochi di ruolo, d’azione, avventura, in tutte le lingue supportate (sia testo che parlato, ovviamente)
  • il catalogo comprende anche giochi indie, ovvero giochi sviluppati da case indipendenti, a basso costo. Chiaramente, non aspettatevi videogame di chissà quale livello, ma vi posso assicurare che spessissimo si trovano videogame divertenti, che non occupano interi GBytes, capaci di far divertire comunque
  • supporto alle trial: scarico un gioco, lo provo: se mi piace lo acquisto
  • i giochi rimangono costantemente aggiornati con l’ultima versione rilasciata dagli sviluppatori (paragonatelo al classico Windows Update, giusto per fare un’analogia)
  • community: esattamente come ormai accade con tutto ciò che riguarda il mondo community & social, posso farmi amicizie su Steam. Questo significa che possiamo chattare, posso sapere cosa hanno acquistato i miei amici e a cosa stanno giocando. Possiamo farci regali via Steam, possiamo vedere gli screenshots scattati dagli altri, etc.
  • Offerte, sconti & numerose iniziative: non passa weekend senza che ci sia uno sconto su un particolare videogioco o addirittura su un intero bundle (per esempio: l’intera saga di LEGO Indiana Jones ad un prezzo particolare)
  • il client Steam, e la piattaforma dietro le quinte, hanno un ritmo di innovazione davvero interessante. Qualche tempo fa è stata aggiunta la possibilità di scattare uno screenshots durante una partita (premendo il tasto F12) e di condividerli con gli altri. In questi giorni è stata creata la possibilità di scambiare fra giocatori gli oggetti di gioco, ovviamente all’interno di videogame che supportano questa feature. Esempio: io conquisto in un gioco un nuovo fucile mitragliatore (raggiungendo determinati obiettivi) e lo posso scambiare con un altro giocatore, che mi dà un altro oggetto
  • E per ultima: Steam Cloud

Che cos’è esattamente Steam Cloud? E’ una cosa davvero utilissima, ed in grado di far risparmiare tempo e risorse a chiunque voglia utilizzare un PC in modo spensierato, senza troppi sbattimenti. E l’idea di Steam Cloud è la stessa che c’è dietro altri software (in primis DropBox ed Evernote), che sfruttano Internet per mantenere sincronizzati più client.

Steam Cloud salva sul cloud di Steam il vostro stato all’interno di un particolare gioco. In pratica, quindi, il vostro salvataggio non è solo salvato da qualche parte sul vostro PC, ma finisce da qualche parte sui server Steam. A cosa serve tutto ciò: se formattate il vostro PC, e giocate su diversi PC, vi ritrovate automaticamente il vostro salvataggio automaticamente (ovviamente dovete installare il client Steam e loggarvi con il vostro utente).

Ora, può sembrare un dettaglio, ma da videogiocatore accanito, vi posso assicurare che vi libera di un sacco di problemi, soprattutto quando siete in procinto di formattare e reinstallare il vostro PC e – in mezzo a tutte le questioni che dovete risolvere – dovete anche cominciare a porvi delle domande del tipo: “Ok, ho in ballo una partita con Call Of Duty Black Ops, dove sono i salvataggi? Li devo prendere, salvarli da qualche parte e ripristinarli sul nuovo PC”. Ripetetete per tutti i videogames che avete in ballo, e le cose cominciano a complicarsi, soprattutto perchè alcuni giochi salvano le loro informazioni all’interno della vostra cartella Documenti (esempio: “X:MyDataDocumentiNomeVideogameFilesBlaBlaBla”), mentre altri (da denunciare) salvano in cartella più criptiche ed assurde. Steam Cloud vi risolve tutti questi problemi: voi avviate il gioco, vi fate una partita, quando lo chiudete Steam si occupa di sincronizzare il tutto sul cloud, impiegando una manciata di secondi. Due note veloci veloci:

  • non tutti i giochi supportano questa nuova feature (non credo che quelli già usciti vengano aggiornati in questo senso, mentre tutti quelli nuovi praticamente supportano questa cosa)
  • Steam Cloud può essere attivato/disattivato tramite un’opportuna opzione (non vedo a cosa possa servire spegnerlo, ma io l’informazione ve l’ho data)

Per concludere: davvero una comodità sbalorditiva!

Send to Kindle