Technology Experience
.NET World

[Flickr.2] Startup dell’applicazione in WPF

Per questo primo esperimento, non ho grandi pretese. Voglio un’applicazione Windows che si connetta a Flickr e che permetta di sfogliare i sets di un certo utente, con tutte le sue foto. Il tutto in WPF, ovviamente. I concetti base li abbiamo visti ieri nel precedente post.

Il progetto che ho costruito fino ad adesso comprende due sole Window: MainWindow (la window principale dell’applicazione) e WaitingWindow (la window che appare all’avvio per autenticare l’applicazione). Il file app.xaml è definito nel modo seguente:

<Application x:Class="FlickrBrowser.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> </Application>

Non ci sono risorse a livello applicazione, ed inoltre si deduce che la window che parte è proprio la MainWindow.
Il costruttore di tale classe è molto semplice:

public MainWindow() { InitializeComponent(); authenticate(); }

Il metodo privato authenticate() apre una seconda Window, che esamineremo adesso. Lo scopo di questa window è quello di fare tutto quello che abbiamo detto la volta scorsa, ovvero: connettersi a Flickr, richiedere un frob, apre il browser per autenticare l’applicazione e dare il consenso. Roba già dette, insomma.

La window WaitingWindow
Questa window appare all’avvio e ci mostra due Button: il primo apre un browser ad un certo url, il secondo accede a Flickr con le credenziali che sono state autorizzate. Lo XAML che definisce la window è:

<Window x:Class="FlickrBrowser.WaitingWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:b="clr-namespace:FlickrBrowser" Title="Permission" Width="260" Height="138" WindowStartupLocation="CenterScreen" ResizeMode="NoResize"> <StackPanel Orientation="Vertical"> <b:FlickrButton Width="240" Margin="6" x:Name="openBrowserButton" Height="40"> <Button.Content> <TextBlock HorizontalAlignment="Center" Text="Open the browser!"> </TextBlock> </Button.Content> </b:FlickrButton> <b:FlickrButton Width="240" Margin="6" x:Name="closeWindowButton" Height="40" IsEnabled="False"> <Button.Content> <TextBlock HorizontalAlignment="Center" Text="Ok, I've authenticated this application!"> </TextBlock> </Button.Content> </b:FlickrButton> </StackPanel> </Window>

C’è uno StackPanel verticale e due Button. I Button non sono quelli classici di WPF, ma sono FlickrButton: una classe che eredita da Button ma ne specifica alcuni comportamenti. Non ci interessa in questo momento capire il perchè ed il percome: ci basti sapere che funzionano esattamente come due normalissimi Button. Per inserirli nello XAML, ho dovuto inserire un riferimento all’assembly FlickrBrowser, identificandolo con il prefisso b. Il costruttore della WaitingWindow è il seguente:

public WaitingWindow() { InitializeComponent(); conn = new Flickr(apiKey, secretKey); openBrowserButton.Click += new RoutedEventHandler(openBrowserButton_Click); closeWindowButton.Click += new RoutedEventHandler(closeWindowButton_Click); }

Ovvero: si connette a Flickr usando api key e secret key ed associa due event-handler ai due pulsanti (avrei potuto ovviamente farlo nello XAML – non so perchè mi è uscito così). Il primo event-handler è il seguente:

void openBrowserButton_Click(object sender, RoutedEventArgs e) { frob = conn.AuthGetFrob(); // Richiesta di autenticazione a flickr.com string loginLink = conn.AuthCalcUrl(frob, AuthLevel.Write); System.Diagnostics.Process.Start(loginLink); openBrowserButton.IsEnabled = false; closeWindowButton.IsEnabled = true; }

Ovvero: dalla connessione ottengo il frob, apro il browser e disabilito opportunamente il bottone, in modo tale che l’utente possa cliccare sull’altro. Il secondo event-handler è il seguente:

void closeWindowButton_Click(object sender, RoutedEventArgs e) { // Dopo aver autenticato l'applicazione Auth auth = conn.AuthGetToken(frob); token = auth.Token; // Mi loggo a flickr.com con l'account conn = new Flickr(apiKey, sharedKey, token); this.Close(); }

Ovvero: mi connetto a Flickr con il token che consente autorizzazioni più elevate rispetto a prima e poi, molto semplicemente, la window viene chiusa.

L’esecuzione continua sull’altra window, MainWindow: ne parleremo più nel dettaglio la prossima volta.

Send to Kindle
My personal life

Marlene, mi porti ancora una Weiss?

E’ la prima volta che bloggo da ubriaco. La parola ubriaco sta per tre birre Weiss medie ingerite durante la cena di stasera. Chissà se blogherrei comunque se sapessi di finire sul Muro di UGIdotNET. Dove lavoravo prima, ho sempre cercato di organizzare cene fra colleghi, più che altro per conoscerci anche al di fuori dell’ambito lavorativo. E più che altro per chiaccherare un po’ con le bellissime colleghe – nessuna esclusa – con le quali condividevo l’open-space prima. E’ un esperimento che in due anni di lavoro è riuscito soltanto 1 volta sola: vuoi per ritmi diversi, vuoi per chissà quale motivo, abbiamo sempre fatto fatica a ritrovarci tutti.

Ho cambiato lavoro il 2 Aprile, e poco più di un mese dopo, tutti noi colleghi ci siamo ritrovati a mangiare assieme in un locale bavarese a Milano. Per motivi di alcool in corpo, non ricordo il nome: I’m sorry. Ho mangiato un GrillTeller (o qualcosa del genere): vale a dire braciola, salsicce varie, peperoni, patate ed altre roba. Da bere, lo dicevo prima, tre birre medie. La Marlene del titolo di questo post è la ragazza che è impazzita per soddisfarci tutti. Non capite male, por favor, correva avanti ed indietro per rifornirci di roba da mangiare e da bere. Davvero, sebbene conosca tutti da poco tempo, ho riso fino a piangere. Troppo bello uscire fra programmatori.

Il locale era in zona Porta Romana a Milano. Alle 22:30 ho salutato tutti e con la testa ciondolante ho preso la linea gialla e tranquillo tranquillo ho raggiunto la mia automobile. Ho infilato il palmare nel supporto, ho acceso Windows Media Player, ho preso l’ultimo album di Avril Lavigne e me ne sono tornato a casa ad una media di 70 km/h circa. In tempo per bloggare. Perchè, si sa, bloggare da ubriachi fa uno strano effetto. Potrei persino scrivere davvero cosa penso di un certo Lorenzo. Scherzo, non potrei mai dirlo veramente, nemmeno sotto tortura. Nemmeno dopo aver mandato giù un bicchiere di acqua MVP.

Mi gira la testa. Sono le 23:30 circa. Vado a dormire, così domani mattina mi alzo, mi faccio la barba ed una doccia e sono come nuovo. Altrimenti domani, davanti al PC, lavoro una giornata e alle 18:00 eviterò di fare il commit. 🙂

P.S. : non mi assumo alcuna responsabilità su quello che ho scritto sopra.

Send to Kindle
.NET World

[Flickr.1] Creare una nostra applicazione per accedere a Flickr

Introduzione
In un mio post precedente ho accennato al fatto che possiamo scrivere codice .NET capace di sfruttare le API esposte da Flickr per fare tutto quello che possiamo attraverso il sito Web stesso. Vale a dire un sacco di cose: ricercare foto ed utenti secondo diversi criteri (tag, nome, data, etc.), uploadare nuove foto, creare nuovi set, geotaggare le foto già uploadate, ottenere la lista dei blog hostati da flickr.com, ottenere le informazioni EXIF di ciascuna foto e così via. Davvero tanta bella roba, che apre le porte a tutti gli sviluppatori che possono creare applicazioni alternative.

Questa pagina elenca le third party apps più diffuse. Quella che ho ritenuto obbligatoria è quella che permette l’upload delle foto in modo molto più efficace rispetto a quanto è possibile fare attraverso il sito Web. Con il sito infatti appare un modulo molto scarno, che permette di uploadare fino ad un massimo di 8 foto alla volta, taggandole ed assegnando un certo livello di protezione (privato o pubblico). Non potete creare nuovi set, dovete prima farlo a mano e poi assegnare le foto. Un incubo. Ed in più, c’è limite delle 8 fotografie. Con questo tool (esiste sia per Windows che per Mac OS X) invece tutti questi limiti vengono spazzati via: trascinate da una vostra cartella tutte le foto che volete, dite di creare un nuovo set e date tutti i tag che volete. E’ sufficiente cliccare su Finish per cominciare il processo di upload.

Come sviluppare un’app tutta vostra
La stessa cosa potete farla voi. Potete sviluppare utility che si interfacciano con Flickr per fare tutto quello che volete. Se siete sviluppatori seri e volete sviluppare una desktop application, leggete questa pagina per avere un’infarinatura su quello che dovete fare. La morale è che per fare qualsiasi cosa, dovete innanzitutto autenticarvi nei confronti di Flickr: la vostra applicazione deve avere il consenso per poter accedere alle API. Questo implica che vi dovete registrare qua per ottenere una api key, che vi serve nel codice che vedremo dopo. A questa api key è associata una secret key.

Vediamo in breve come utilizzare tutte queste informazioni per buttar giù due linee di codice.

1 // Prima dell'autenticazione 2 Flickr conn = new Flickr(apiKey, secretKey); 3 string frob = conn.AuthGetFrob(); 4 string loginLink = conn.AuthCalcUrl(frob, AuthLevel.Write); 5 System.Diagnostics.Process.Start(loginLink); 6 MessageBox.Show("Autentica l'applicazione"); 7 8 // Dopo l'autenticazione 9 Auth auth = conn.AuthGetToken(frob); 10 token = auth.Token; 11 conn = new Flickr(apiKey, sharedKey, token);

Riga per riga, step by step
Guardiamo una ed una le linee di codice. La linea (1) si connette a Flickr usando la api key e la secret key. Entrambi i parametri sono due normalissime stringhe, e ci vengono date da Flickr: nessun problema. La linea (2) chiede a Flickr un frob – sono ignorante: non chiedetemi da dove arrivare questo nome. Tramite il frob, possiamo richiedere a Flickr i permessi di scrittura: alla linea (4), inizializziamo una stringa che contiene un url per richiedere l’autenticazione. Il metodo AuthCalcUrl richiede il frob e il livello di permessi richiesti.

La linea (5) apre il browser predefinito per farlo navigare all’url indicato. Evidentemente, Flickr registra il frob e consente l’accesso alla nostra applicazione. La linea (6) aspetta che l’utente prema Ok, cosa che deve essere fatta solo dopo che il browser ha raggiunto l’url. Questo processo viene effettuato da tutte le applicazioni di terze parti, comprese quelle che ho indicato sopra. Il frob cambia ad ogni compilazione, per cui mentre stiamo sviluppando dobbiamo richiedere l’autenticazione ad ogni esecuzione del progetto: quando il progetto è terminato e l’eseguibile è sempre lo stesso, l’autenticazione la si fa la prima volta e poi basta.

Una volta che la richiesta di autenticazione è stata accettata, possiamo riconnetterci a Flickr alla linea (11), che passa attraverso il costruttore dell’oggetto Flickr. Notare la differenza tra la linea (1) e la linea (11): in quest’ultima usiamo api key, secret key e token. Il token viene ottenuto dal nuovo livello di autorizzazioni richiesto alla linea (9).

Concludo: la classe Flickr, la cui istanza conn è ben visibile alla linea (11) è il succo del discorso. Se avete un IDE degno di tal nome e non sviluppate in .NET usando UltraEdit, TextPad o il blocco note, provate a digitare “.” dopo l’oggetto conn: vedrete un gran numero di metodi che permettono di accedere a tutto quello che volete.

Ma magari ne parlerò la prossima volta, adesso ho una riunione!

Send to Kindle
Community

Ho chiuso i commenti sul mio ‘vecchio’ blog

Ci sono stati dei giorni in cui mi dicevo…cavolo, voglio che il mio blog su UGIdotNET viva per sempre. Però, insomma, i matrimoni finiscono, le persone nascono e muoiono, l’acqua sta finendo, il sole si spegnerà e…i blog si chiudono. 🙂

Tutto questo per dirvi che i commenti sul mio blog di UGIdotNET sono stati chiusi. Probabilmente di là non scriverò più, e quindi è inutile lasciarli aperti, tanto più che continuano ad arrivare ondate di spam che sporcano tutti i post, cosa che trovo davvero insopportabile. Ogni tanto mi loggo e mi metto a cancellare a mano tutto lo spam…quando sarà arrivato a livello zero (probabilmente quando avrò 50 anni circa), allora magari li riaprirò. Fino ad allora…

Send to Kindle
My daily work

Se tutte le giornate cominciassero così…

Ore 6:30, sveglia e doccia.
Ore 6:50, mi vesto.
Ore 7:00, seduto in auto e mi metto in marcia
Ore 7:15, tradizionale coda in autostrada causa camion ribaltato
Ore 7:30, arrivo al parcheggio di San Donato Milanese
Ore 7:45, arrivo in Piazzale Lodi tramite linea gialla della metropolitana
Ore 7:55, entro nel bar di Piazzale Lodi per fare colazione
Ore 8:10, fine della colazione
Ore 8:25, arrivo in ufficio bello rilassato e soprattutto con lo stomaco pieno
Ore 8:30, inizio dei lavori (ehm…)

E pensare che ci sono colleghi che arrivano alle 10, e pensare che una volta facevo 50 minuti solo di metropolitana (e d’estate era – ed è – un inferno), e pensare che una volta se andava bene arrivavo alle 9 spaccate (e per farlo dovevo sbattermi un sacco, tipo correre come un pazzo sulle strade).

Beh, insomma…ci sono giornate storte e giornate meravigliose come oggi. Ragazzi, buon lavoro!

Send to Kindle
My personal life

Prima di credere alla magia, dovreste prima credere a OmarShow!

Vi capita mai di credere che qualcuno complotti contro di voi per impedirvi anche la più semplice delle azioni?

Per esempio…vi state infilando tranquilli su un vagone del treno – o della metropolitana – ed arriva uno più veloce della luce che vi soffia via il posto? Oppure, siete accostati lungo una viuzza deserta a consultare una mappa e, nel momento in cui vi rimettete in marcia, arrivano moto ed auto ad ostacolarvi il cammino? Dialoghi al telefono o via e-mail progettati appositamente per farvi perdere tempo? Casse al supermercato che si riempiono nel momento stesso in cui vi muovete per andare a pagare? Caselli Telepass che si bloccano improvvisamente? Trovare traffico nel giorno stesso in cui siete in anticipo di 20 minuti?

Coincidenze strane, più uniche che rare, che vi fanno perdere la pazienza, o semplicemente vi fanno innervosire. Fatti talmente precisi nel tempo e nello spazio che vi fanno sospettare che ci sia qualcuno che vi controlla e che fa di tutto per complicarvi la vita quotidiana. Accadimenti talmente strani che vi fanno strabuzzare gli occhi e vi fanno gridare…”Ma…ma che è…davvero…non è possibile!!!“, fino a farvi credere che la magia esista sul serio o che in qualche recesso lontano esista veramente un onnipotente Grande Fratello che con i suoi occhi vi sorveglia, vi cura da vicino e vi sfida tutti i giorni per vedere fino a che punto arriva la vostra pazienza.

Mio fratello sta raccogliendo su un blog dedicato un’infinità di piccoli fatti che gli capitano quotidianamente che hanno davvero dell’incredibile. Per voi che non li vivete in prima persona come lui, possono sembrare cose strane, ma vi posso assicurare che certe cose che gli capitano sono surreali e troppo, troppo divertenti.

Perciò, prima di chiedervi se è magia, dovreste prima chiedervi se non si tratta di OmarShow.

P.S. : l’ultimo episodio, di questo pomeriggio, che coinvolge Alitalia…ha davvero dell’incredibile.

Send to Kindle
Software

Ho sempre usato Messenger, fino a quando…

Da quando navigo su Internet, ho sempre chattato con uno dei software IM disponibili. Da ICQ a PowWow, ne ho provati davvero parecchi. Poi mi sono innamorato di Messenger, nel quale ho davvero molti contatti reali, nel senso che ci sono persone che vedo quasi sempre on-line. Ho amici reali, amici d’infanzia, tutti voi di UGIdotNET, ex-colleghi e via dicendo. Non abbandonerò mai Messenger.

MA MI SPIEGATE PERCHE’ DA IERI MI CRASHA?
MI SPIEGATE PERCHE’ TUTTO AD UN TRATTO MI OCCUPA 100Mb di RAM?

Non è che è colpa del portatile aziendale sul quale è installato??? Ieri è stato Alessandro, qualche minuto fa Marco. Avanti, chi è il prossimo che vuole impedirmi di lavorare?? Dai, su, fatevi sotto… :-/

Send to Kindle
Community

Iscritto all’evento XeDotNet dedicato a Workflow Foundation

Pochi minuti fa mi sono iscritto all’evento dedicato interamente a Workflow Foundation, organizzato dai ragazzi di XeDotNet per il prossimo 11 Maggio (praticamente, venerdì di questa settimana). Mi farebbe piacere unirmi a Raffaele e a Janky per il viaggio: partiremo da Milano, per cui presumo che il ritrovo sarà a qualche ora in stazione Centrale. Anche questa volta non è tutta farina del mio sacco, dal momento che è stato mio fratello a segnalarmi questo appuntamento, ma, si sa, lui è un po’ più interessato di me alla questione, dal momento che conosce i retroscena di Sharepoint che poggiano proprio sulle features di WF.

Ovviamente le iscrizioni sono ancora aperte, perciò se avete voglia di respirare un po’ d’aria di community e soprattutto se avete voglia di ascoltare Raffaele, unitevi e registratevi anche voi. La scaletta fissa l’ora di inizio alle 20:00, perciò c’è tutto il tempo di raggiungere Mestre (le ultime parole famose…).

Send to Kindle
Community

Astoria non è solo un codename Microsoft, ma…

Astoria è una cittadina di 10.000 abitanti in Oregon (USA), affacciata sull’Oceano Pacifico.

Dal punto di vista cinematografico, Astoria è importante perchè qui sono stati girati diversi film più o meno noti. Tutti voi, che siete gente in gamba, ma non abbastanza! :-), avreste dovuto rispondere dicendomi che qui è stato girato The Goonies, uno dei primi film di Richard Donner. Non storcete il naso dicendo “Chi diavolo è questo qui???”! Se avete visto Superman II, uno qualsiasi dei film Arma Letale, Maverick e via dicendo, avete visto un suo film. La sua filmografia è a dir poco devastante. Uno degli sceneggiatori di The Goonies è Steven Spielberg, un nome che non ha bisogno di presentazioni.

Quindi…Astoria non è solo un codename Microsoft, ma anche il posto dove è stato girato “I Goonies”. Se volete arrivare al vostro prossimo compleanno, per favore, guardate questo film perchè è davvero un’avventura. 🙂

Send to Kindle
.NET World

"Prose is dead. PowerPoint has won." – spero di no!

Ho letto con estremo interesse i vari post che commentavano il libro di Charles Petzold su WPF. Mi ha colpito molto il suo post intitolato “The Future of Writing”, dal quale ho tratto il titolo di questo post. La faccenda mi ha interessato, perchè io stesso sto finendo di leggere il libro di Petzold (30 pagine alla fine) e non ne sono rimasto particolarmente impressionato, come ho detto qualche tempo fa. Tutto è partito da una discussione su CodingHorror che mi sono letto, leggendo critiche, impressioni e commenti inseriti nel post; non ho seguito gli ultimi sviluppi perchè non ho molto tempo.

Partendo dal presupposto che ognuno può preferire l’uno o l’altro libro, una cosa è sicura. Indipendentemente da quello che può pensare Petzold, la prosa non è morta e PowerPoint non ha vinto un bel nulla. Tutto dipende da che tipo di libro si sta scrivendo e dal tema che si desidera trattare. Un libro su WPF, con molto XML/XAML/C#, e soprattutto con esempi così lunghi (a volte anche 3-4 facciate) dovrebbe evidenziare meglio il codice colorandolo e commentandolo adeguatamente. Questo non significa far vincere i colori a dispetto del contenuto o della forma, significa semplicemente far entrare le cose un po’ meglio nella testa di chi legge. Questo non sono io a dirlo, ma lo dice chiunque programmi in modo serio: rendere il codice leggibile è un tema fondamentale. Petzold questo deve saperlo molto bene. Poi, sia chiaro, penso che il fatto che non ci siano colori nel testo non dipenda direttamente da lui, ma non dovrebbe comunque offendersi se gli viene mossa questa critica, ecco. Mi rifiuto di credere che PowerPoint abbia vinto sulla prosa e sulla forma scritta più pura. Credo che sia importante aiutare la lettura con immagini, diagrammi e grafici (viene detto anche in uno dei numerosi commenti: “Professional technical writers use a combination of active-voice writing and visual layout to facilitate the efficient identification and transfer of information“), quando è il caso, soprattutto quando è una cosa che il lettore fa comunque, dovendosi immaginare nella testa il visual tree di un certo blocco XAML. Se Petzold mi riporta 50 linee di XAML, e io mi devo immaginare cosa ottengo, posso sbagliare: perchè farmi fare uno sforzo mentale per ottenere magari un risultato non corretto?

E’ stato fatto un confronto tra il libro di Petzold e Code Complete di Steve McConnell. Quest’ultimo è un libro che ben si presta ad essere scritto in prosa, perchè il codice ha scarsa rilevanza ed in molte pagine è molto più discorsivo che tecnico. Ritengo che il confronto non possa sussistere, sono troppo diversi ed hanno scopi davvero troppo diversi. Altro discorso se lo si paragona con Chris Sells, che invece è molto più conciso e soprattutto affrontano argomenti simili, nel senso che entrambi sono libri dedicati ad una particolare tecnologia. Tra i due modi di scrivere, forse la spunta Petzold, perchè scende molto, molto, molto più in profondità nelle cose, e questa non è una cosa da sottovalutare. Se correggesse i problemi che non solo io ho segnalato, allora Petzold diventerebbe davvero il top.

Petzold ha anche scritto un altro post un po’ più lungo e dove esplica altri concetti. Se Petzold crede davvero che la prosa sia stata sconfitta, forse dovrebbe leggere qualcuno dei miei racconti sui bytes o divertirsi a scriverne uno. 🙂

Send to Kindle