Technology Experience
.NET World

Qualche info in più sul file WMAppManifest.xml

Ogni applicazione per Windows Phone 7 è corredata dal file WMAppManifest.xml, contenuto nel folder Properties della solution di Visual Studio 2010. Questo file è un normalissimo file XML, che contiene un po’ di informazioni inerenti la nostra applicazione.

Il nodo IconPath (all’incirca a riga 5) contiene il path dell’icona piccola della nostra applicazione – l’icona che viene utilizzata nel menù di Windows Phone 7.

Il nodo BackgroundImageURI (suppergiù riga 18) contiene il path dell’icona grande della nostra applicazione – l’icona che viene utilizzata nel menù Start. Questa icona viene utilizzata solamente nel momento in cui l’utente decide di voler metter la nostra applicazione sulla schermata principale di Windows Phone 7 – il menù Start appunto.

Il nodo App (riga 4) contiene diversi informazioni utili:

  • attributo Title (esempio: “Bank Finder”)
  • attributo Author (esempio: “Damiani Liborio Igor”)
  • attributo Description (esempio: “bla bla bla”, e non ho capito dove viene mostrato)
  • attributo Publisher (esempio: “VivendoByte.net”)
  • attributo Genre (esempio: “apps.normal”)

Quest’ultimo riveste un’importanza particolare quando sviluppate giochi – sia Silverlight che XNA. Secondo il documento delle specifiche Microsoft, i giochi devono apparire all’interno dell’hub XBOX Live. Se lasciate “apps.normal” – che è il valore di default, questo non accade.

E’ necessario impostare l’attributo Genre a “apps.games”.

Ho preferito dare un po’ di enfasi, perchè se googlate fate un po’ di difficoltà a trovare questa cosa. Troverete post che dicono di mettere “app.game”, “App.Games”, insomma, una variante infinita di maiuscole/minuscole/plulari/singolari, mentre l’icona della vostra applicazione rimane inchiodata lì dov’è. Fidatevi, mettete “apps.games” e siete a posto. Smile

L’ultimo appunto riguarda il tag Capabilities: all’interno di questo nodo dovete specificare quali funzionalità del telefono WP7 sono richieste dalla vostra applicazione. Quindi, aggiungete un nodo Capability con Name impostato a dovere. Avete bisogno del GPS? Aggiungete ID_CAP_LOCATION. Avete bisogno del microfono? Aggiungete ID_CAP_MICROPHONE. Accelerometro? ID_CAP_SENSORS. E così via. Maggiori informazioni direttamente su MSDN a questo indirizzo.

Questa cosa è importante, perchè una volta sul Marketplace, e prima di acquistare/scaricare l’applicazione, l’utente dovrà essere informato su cosa è richiesto dall’app per funzionare (c’è traffico dati per la rete? mi accende il gps e mi localizza? etc. etc.), e questa cosa – presumo – arriva direttamente dai metadati contenuti nel file WMAppManifest.xml.

Send to Kindle
Community

Partecipazione all’evento di lancio Windows Phone 7

Giovedì 23 settembre ho partecipato, grazie all’invito del buon Lorenzo, all’evento che si è tenuto a Roma, per il lancio della piattaforma Windows Phone 7. Sugli scaffali dei negozi i telefoni non li trovate ancora, però manca davvero poco. Quello che potete fare sin da subito è scaricare i developer tools, installarveli sul PC e cominciare e scrivere le vostre app da distribuire in futuro attraverso il Marketplace.

E’ stata una bella esperienza, seduto fra il pubblico, in uno studio di registrazione vero, con telecamere, operatori, regista, assistenti di studio e la splendida presenza di Mapi – di cui avevo già sentito parlare in passato. Mapi? Come chi è Mapi??? Per maggiori informazioni cliccare qua! Open-mouthed smile La diretta via streaming è durata circa tre ore, durante le quali ce ne siamo stati buoni e tranquilli seduti al nostro posto, ad applaudire al momento giusto e ovviamente ad assistere alle sessioni della trasmissione, che si sono sussegguite veloci veloci. Personalmente conoscevo già parecchie delle cose che sono state spiegate, ma alcune chicche invece no: ad esempio, lo sapevate che switchare il tema light/dark di Expression Blend for Windows Phone serve a simulare il cambiamento del tema sul cellulare? In questo modo è più facile avere un’anteprima diretta mentre si programma. Ed altre cosucce interessanti.

La giornata insomma è stata molto divertente, emozionante e stancante allo stesso tempo. D’altronde un viaggio a Roma in giornata in aereo richiede un certo impegno, soprattutto per chi come me non ci è tanto abituato. Ma ne è valsa la pena. Sinceramente ho molta fiducia in questa nuova mission di Microsoft, e non me ne frega proprio un acca se iPhone o Android oggi hanno più applicazioni o rappresentano lo stato dell’arte. Mi piace WP7, perchè per la prima volta posso sviluppare applicazioni belle ed accattivanti per uno smartphone. Microsoft mette nelle nostre mani una potenzialità incredibile, perchè nessun altro può permettersi di dare nelle mani degli sviluppatori gli stessi strumenti usati per programmare applicazioni desktop & web. Insomma, praticamente aggratis possiamo creare piccole e grandi apps con lo stesso know-how ben consolidato che abbiamo già in tasca. Volete mettere? Smile

Allora, adesso per concludere vediamo un po’ di ringraziare un po’ di persone:

  1. grazie a Gabriele, il mio capo, che mi ha concesso di poter partecipare
  2. grazie a Lorenzo per l’invito e per la possibilità di avere un WP7
  3. grazie al vulcano islandese per non aver eruttato, e a tutti gli altri eventi, che mi hanno permesso di tornare a casa senza troppi sbattimenti – rispetto all’ultima volta
  4. grazie a chiunque abbia scelto Mapi per giornate così: per lei, per il vestito e per i capelli sciolti lunghi sulle spalle
  5. grazie al catering di pizzette, focaccine e sfogliatelle: super-slurp
  6. grazie alla compagnia di tutti gli amici nuovi & vecchi che ho trovato: sono stato contento di aver conosciuto Dovellonsky, così anche a lui posso dare un volto vero Smile
  7. grazie al taxi per il viaggio di ritorno: guadagnato un sacco di tempo e un po’ di stress in meno

Insomma, che dire, una giornata indimenticabile!

Send to Kindle
.NET World

Silverlight ed il download di file

Allora, questo è un problema che mi attanaglia. Considerate la seguente schermata:

IeDownloadFile

E’ una applicazione Silverlight brutta e orribile, con 4 pulsanti. Non c’è uso di M-V-VM, ma il caro e buon vecchio code-behind. Tutti questi pulsanti effettuano il download di un normalissimo file pdf raggiungibile via http.

Cliccando sul pulsante PDF con code behind il codice eseguito è un semplice:

private void button1_Click(object sender, RoutedEventArgs e)
{
    HtmlPage.Window.Navigate(new Uri(URL, UriKind.Absolute));
}

 

Cliccando sul pulsante PDF con timer il codice è il seguente:

private void button2_Click(object sender, RoutedEventArgs e)
{
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(3);
    timer.Tick += (s2, e2) =>
        {
            timer.Stop();
            HtmlPage.Window.Navigate(new Uri(URL, UriKind.Absolute));
        };
    timer.Start();
}

 

Cliccando sul terzo pulsante PDF con javascript il codice è il seguente:

private void button3_Click(object sender, RoutedEventArgs e)
{
    object[] param = new object[1];
    param[0] = URL;
    System.Windows.Browser.HtmlPage.Window.Invoke("openPDF", param);
}

 

Con javascript, viene invocata una funzione ‘openDF’ definita nella pagina .aspx che hosta il plug-in di Silverlight.

Comunque sia, in tutti questi casi elencati sopra, il download del file PDF da parte di Internet Explorer viene inizialmente bloccato per motivi di sicurezza. IE fa apparire una toolbar gialla:

IeDownloadBlocked

Per effettuare il download, dovete dare l’autorizzazione e ripetere l’operazione. Nella mia applicazione scema di oggi non ci sono troppi problemi Smile, ma in un’applicazione reale viene effettuato il refresh della pagina .aspx, e quindi l’utente deve rifare tutto daccapo. Sad smile

L’unica soluzione che ho trovato è stata quella di usare un HyperlinkButton, “templizzato” in modo tale che sulla pagina della nostra applicazione possa apparire (quasi) come un normale Button. Cliccando sul bottone PDF con HyperlinkButton IE non blocca un bel nulla, e fa apparire il classico dialog Apri/Salva.

Ora, però, fate un passettino in avanti: supponiamo che l’url venga generato dinamicamente. Voi cliccate, richiamato un qualcosa-lato-server che genera il PDF, e restituisce al client l’indirizzo http completo. Il controllo HyperlinkButton diventa (quasi) inutile: nello XAML non impostate la proprietà NavigateUri – perchè non la conoscete – voi cliccate ed ovviamente non succede un bel nulla. Nemmeno l’evento Click serve a qualcosa, perchè semplicemente non viene invocato.

E quindi? Se avete consigli, aiuti o qualche dritta, sono tutt’orecchi.

Send to Kindle
.NET World

Video appena registrato della mia app “Prova del Cuoco” per Windows Phone 7

Qualche minuto fa ho registrato un piccolo video della mia applicazione per Windows Phone 7, “La Prova del Cuoco”, pubblicato ovviamente su YouTube.

Video su YouTube

 

E’ una piccola applicazione, sviluppata in un paio di serate, che è stata implementata con:

  1. emulatore Windows Phone 7 (all’inizio) ed un telefono Windows Phone 7 (alla fine)
  2. Visual Studio 2010 Professional + WP7 Developer Tools in RTM
  3. Un servizio WCF hostato sul mio hosting che viene consumato sul device e che mi dice giorno per giorno chi ha vinto
  4. Un backend sviluppato in 15 minuti con ASP.Net Dynamic Data Entities Web Application
  5. Il backend è stato tradotto in italiano per permettere a chi deve usarlo (in breve: mio padre) di inserire velocemente i dati, ogni giorno (in breve: l’ho schiavizzato Smile with tongue out)
Send to Kindle
Community

Windows Phone 7: da aprile ad oggi, come è andata?

La prima volta che ho sentito parlare di Windows Phone 7 (WP7) è stato ad Aprile 2010, durante il Basta! Italia. In quel frangente si disse, lo ricordo come fosse ieri, che chiunque sapesse sviluppare applicazioni con Silverlight, era già automaticamente in grado di sviluppare applicazioni per WP7. Appena sono uscite le beta dei Developer Tools, quindi, non ho resistito.

Ed effettivamente è proprio così. Se volete sviluppare apps per WP7, è sufficiente che conosciate Silverlight per produrre qualcosa di simpatico sui cellulari Microsoft che presto vedremo nei negozi. E questa – lasciatemelo dire – è una cosa eccezionale per tutti noi sviluppatori che arrivano dal mondo Microsoft, perchè per la prima volta possiamo produrre software per telefoni cellulari, tra l’altro di una qualità leggermente superiore a ciò a cui siamo abituati (almeno io parlo per me, possessore da praticamente sempre di telefoni Nokia).

L’altra cosa importante da tener presente è che tutti i software verranno venduti attraverso il MarketPlace di Microsoft. Tutti, tutti i software. Anche i nostri software. Per maggiori informazioni consultate il sito ufficiale. Questo vuol dire – in soldoni – che quando avete lo .xap della vostra applicazione bello pronto, lo inviate al MarketPlace; questo deve essere validato e se viene accettato, il vostro software viene pubblicato. Attivare un account sul MarketPlace costa 75 dollari all’anno (ci sono delle eccezioni, però), e vi dà diritto a pubblicare 5 applicazioni freeware, ed un numero infinito di applicazioni a pagamento.

Per questo motivo, mi sono dato subito da fare. Certo, magari non si diventerà ricchi, ma l’idea di poter scrivere e diffondere piccole applicazioni per WP7 mi ha interessato fin da subito. Lo devo ammettere, però: sono abbastanza fortunato, perchè da quest’anno ho cominciato a sviluppare con Silverlight, conoscevo già WPF, negli anni scorsi avevo già sviluppato per il mondo mobile, e quindi avevo tutti i presupposti per buttarmi subito in modo indolore nel mondo WP7.

Giovedì scorso ho partecipato ai lab in Microsoft dedicati a WP7, un piccolo evento durante il quale ho potuto testare su veri device le applicazioni che avevo preparato per l’occasione. Le applicazioni sono fondamentalmente due:

  • Keyzard, un porting del buon vecchio Keyzard che avevo sviluppato nel 2004 per il mondo desktop. Sono passati circa 6 anni da quei giorni, ma so per certo che Keyzard è scaricato ed utilizzato ancora oggi: ma sto andando OT, magari ne parlerò in un altro post
  • Prova del Cuoco, una simpatica applicazione – davvero molto semplice – che permette di consultare giorno per giorno i risultati della gara dell’omonima trasmissione su Rai Uno. Dal punto di vista tecnico, mi sono divertito a creare questa app, perchè lato server ho un piccolo db auto-gestito che contiene i risultati ed un servizio WCF che espone queste informazioni. Sul telefono sfrutto questo servizio WCF per visualizzare le informazioni. L’utente può usare gesture sul telefono per scorrere i giorni, semplicemente facendo scorrere il dito da sinistra a destra o viceversa per spostarsi di data

Se mi seguite su Twitter o Facebook, sapete bene che Keyzard è stata la ‘best app’ del giorno! Smile

Se cercate su Internet, troverete un sacco di informazioni su come sviluppare apps per WP7, dalle più semplici alle più complesse. Da quelle composte da una sola schermata, e quelle che utilizzano il tombstoning per memorizzare il proprio stato interno, per essere in grado di auto-ripristinarsi, etc. etc. Un piccolo consiglio? Scrivete app semplici semplici. La piattaforma WP7 è studiata per essere user-centrica, per essere utilizzata per utenti evoluti, per essere forse in concorrenza con iPhone. Insomma, per farla breve, niente applicazioni aziendali, di inserimento dati, etc. etc. Piuttosto applicazioni graficamente accattivanti, divertenti, di entertainment. Fate un giro sull’app store di iPhone per vedere il tipo di applicazioni più scaricate e vendute. Sfruttare il GPS interno, sfruttare l’accelerometro per fare qualcosa di divertente.

Questo fondamentalmente per due motivi: i progetti di cui ho parlato prima sono due piccoli progetti che ho realizzato a tempo perso, nel mio tempo libero. Quindi secondo me è fondamentalmente evitare in imbarcarsi in progetti di-chissà-quale-durata e complessità. Per questo, lo dico francamente, in un ambiente come WP7 aborro anche pattern complessi come MVVM, pattern che invece adotto da mesi nel progetto di cui mi occupo nel mio ruolo di programmatore di Brain-Sys. Perchè aborro? Aborro perchè MVVM è solo una complicazione, perchè quando si crea un’applicazione nell’arco di una serata, qualsiasi pattern è una complicazione. Smile Ricordiamoci che le “Windows Phone 7 Application Certification Requirements” dicono che la prima schermata della nostra app deve apparire entro 5 secondi da quando l’utente la “tappa” sullo schermo touch del WP7. Quindi, siate snelli e veloci e – se può valere un qualcosa quello che vi dico – scrivete applicazioni anche old-style, senza tirare in ballo framework & pattern che aggiungono solo sovra-ingegenerizzazione. Questa è la mia piccola opinione, tutto qua.

Datevi da fare, ragazzi, perchè Windows Phone 7 prima o poi arriverà. Fatevi trovare pronti!

Send to Kindle
My personal life

Tutte le strade portano a casa

Abito a Sant’Angelo Lodigiano, un paese di poco più di 10.000 abitanti in provincia di Lodi. Mi capita spesso di andare in giro – o per lavoro o per altri affari – e al 99% per andare dove devo andare prendo l’autostrada. Il casello dista circa 5 km da casa mia, lo si raggiunge attraverso la statale, ed è molto comodo. La A1 mi permette in pochi minuti di prendere le tangenziali milanesi, e posso arrivare praticamente ovunque.

E’ sulla strada del ritorno che le cose si fanno più interessanti. Esco dal casello di prima, arrivo ad un rondò, prendo la prima uscita a destra e dopo 5 km arrivo. Ci sono due modi per arrivare proprio davanti a casa: uno è più comodo e veloce, ci si mantiene sulla statale, si arriva ad un altro rondò, si torna indietro e finisce qua.

L’altra strada è più interessante perchè quando si arriva a Sant’Angelo, si può passare attraverso il paese. Ed è interessante perchè – ad esempio – passo davanti al negozio di informatica dove cominciai a lavorare tanti anni fa (correva l’anno 1995, o giù di lì). Adesso quel negozio non c’è più: alle saracinesche c’è appeso un bel cartello Vendesi, con un bel numero di cellulare. Ma il locale è ancora sfitto. Qualche anno fa avevo pensato di prendermelo io, ma poi il mio lavoro è diventato prevalentemente il consulente, e di un ufficio non ne ho bisogno. In quel locale d’estate fa un caldo boia, perchè le vetrine scaldano molto.

La strada è interessante perchè passo davanti all’azienda in cui appena 18enne ho lavorato per un’estate come esperto di Autocad. In realtà cercavo di cavarmela, con le mie conoscenze di informatica dell’epoca da una parte, ed il manuale di Autocad dall’altra. Passo davanti al luogo dove una volta i miei zii avevano un negozio di arredamenti. Passo davanti al mio ex-barbiere (ex perchè adesso è in pensione, e ho dovuto trovarmene un altro). Passo davanti a Cremonesi, la cartoleria dove da ragazzino compravo biro, quaderni e fogli di protocollo per la scuola. Passo davanti all’acquedotto. E non vi sto parlando di chilometri e chilometri di strade: il tutto è condensato in 1 chilometri, o poco di più. E’ questo il bello di vivere in un paese piccolo, lo stesso paese che ti ha visto nascere e crescere. Ci sono volte in cui ricordi persino…qua ha beccato Alessia, qua mi sono schiantato in bicicletta, qua ho fatto a botte con Antonello, qua questo & qua quello.

La strada è interessante anche perchè attraversa Viale Montegrappa, il viale delle scuole elementari e medie. Ed è il viale degli extracomunitari che se ne stanno sempre davanti ai due bar (uno di fronte all’altro). Quando ci arrivo con la mia Opel Astra, spesso abbasso i finestrini, rallento, e loro mi fissano sempre. Mi fissano strano perchè si staranno chiedendo chi sono, come se il fatto che non lo sappiano non mi dà il diritto di transitare da lì. E’ lo stesso viale dove una volta c’era una sala-giochi, dove una volta mi sono riparato – da ragazzino, parlo – durante un terrificante acquazzone. Ma l’acquazzone non finiva mai, e alla fine son dovuto comunque uscire perchè la sala-giochi stava chiudendo. Bei tempi.

Sono appena tornato dal cinema e in Viale Montegrappa ho persino un bimbo – avrà avuto 3-4, forse – che pedalava sul suo triciclo, da solo. Forse da qualche parte i genitori c’erano, ma io non li ho visti. Insomma, un bambino molto piccolo in giro da solo dopo la mezzanotte del venerdì. A Sant’Angelo Lodigiano succede anche questo, insomma.

Tutte le strade prima o poi portano a casa. ‘Notte a tutti!

Send to Kindle
Software

Togliere la conferma del download file da Internet Explorer

Per impostazione predefinita, le ultime versioni di Internet Explorer bloccano il download di un file, facendo apparire all’utente una barra di avviso proprio sotto la barra degli indirizzi, e sotto la barra dei tab. Ho sempre odiato questa cosa, essenzialmente per due motivi diversi:

  1. sono un utente che so quello che sta facendo, per cui sono sul sito xyz e clicco un pulsante Download, probabilmente quello che voglio fare ed ottenere è proprio il download di un file
  2. confermando il download, IE refresha la pagina: spesso è un semplice refresh, altre volte (come su MSDN Download) la cosa è più fastidiosa, perchè bisogna rifare daccapo tutta la navigazione che si era fatta per raggiungere il link del download

Se volete togliere questa barra di avviso, potete fare come segue:

  1. Aprite Internet Explorer, poi andate sul menù Tools e poi su internet Options
  2. Andate sotto il tab Security e cliccate sul pulsante Custom level…
  3. Cercate la voce Automatic prompting for file downloads ed attivate l’opzione Enable (in italiano appare come Richiesta di conferma automatica per download di file)
  4. Chiudete e confermate il tutto

DownloadAutomaticoIE

Adesso IE non vi chiede più nulla, scaricate e basta!

Send to Kindle
.NET World

Entity Framework 4, campi NULL/NOT NULL e chiamate ai RIA Services

Questa sera voglio parlarvi di un “dietro le quinte” di Entity Framework, ovvero una particolare situazione che mi è capitata durante le settimane scorse. Per la lettura di questo post assumo che sappiate:

  • cosa sia un database
  • cosa sia Entity Framework
  • cosa sia un’applicazione Silverlight o giù di lì
  • cosa siano i RIA Services

Dunque, cerco di arrivare al sodo in poche linee. Supponiamo di aver disegnato il seguente db:

db_diagram

Questa immagine arriva così com’è dal database diagram di SQL Server Management Studio. Forse è un database di cui avevo già parlato in passato in altri post. Abbiamo una tabella “Teams” contenente un po’ di squadre di calcio, ed abbiamo una tabella “Players” che mantiene l’elenco dei giocatori squadra per squadra. Il campo “IdTeam” della tabella “Players” serve proprio per mantenere questa relazione.

Ora, immaginiamo due scenari perseguibili:

  • la tabella “Players” contiene solo giocatori che effettivamente appartengono ad una squadra
  • la tabella “Players” contiene anche giocatori che NON appartengono ad alcuna squadra

Voi come realizzereste questa cosa? Il modo più semplice è quello di sfruttare in modo opportuno il campo “IdTeam” citato prima. Se “IdTeam” contiene NULL, quel record contiene un giocatore libero (non appartenente a nessuno), altrimenti contiene un ID che fa riferimento ad un Team esistente. Dal punto di vista del database, non ci sono particolari accrocchi da fare: è sufficiente impostare NULL / NOT NULL sul campo “IdTeam” ed il gioco è fatto (ed eventualmente rimuovere il valore predefinito dal campo stesso).

Come si comporta invece Entity Framework in questi due scenari?
Beh, devo dire che si comporta piuttosto bene. Ecco come appare il designer in entrambi i casi:

idTeam_NOT_NULL In questo primo caso, la relazione che lega le due entity è uno a molti.

Se nel designer selezioniamo IdTeam, vediamo che la proprietà Nullable è False.

idTeam_NULL In questo secondo caso, la relazione è 0..1.

Se nel designer selezioniamo IdTeam, vediamo che la proprietà Nullable è (None).

 

Una piccola precisazione. Ci sono almeno due piccole imperfezioni nella funzionalità di Update model from Database del designer di EF:

  1. non si accorge se cancellate un campo da una tabella (per adesso non ci riguarda)
  2. non si accorge se un certo campo diventa NULL / NOT NULL (questo invece ci riguarda eccome!)

Morale: se andate nel Management Studio e cambiate la proprietà Allow Nulls del campo “IdTeam” della tabella “Players”, e poi andate in VS2010 per refreshare il data model di EF, questi rimarrà invariato. Avete due possibilità: o cancellate la tabella e la riaggiungete (fattibile se le cose sono davvero semplici), oppure cambiate semplicemente la proprietà Nullable del campo (quest’ultima strada non l’ho provata).

Comunque sia, alla fine vi ritrovate il data model che rispecchia esattamente la struttura del vostro database.

E con le classi POCO, come siamo messi?
Da quando ho cominciato a lavorare con Silverlight 4 & EF4, ho subito utilizzato la possibilità di persistere oggetti generati tramite il template di classi POCO. Come si comporta questo template nei due casi esaminati sopra? Beh, anche qui la cosa è abbastanza intelligente!

Se il campo “IdTeam” non ammette NULL, allora è la proprietà è un semplice int.
Se il campo “IdTeam” ammette NULL, allora la proprietà IdTeam della nostra classe è una Nullable<int>, ed appare come segue:

public virtual Nullable<int> IdTeam
{
    get { return _idTeam; }
    set
    {
        try
        {
            _settingFK = true;
            if (_idTeam != value)
            {
                if (Team != null && Team.Id != value)
                {
                    Team = null;
                }
                _idTeam = value;
            }
        }
        finally
        {
            _settingFK = false;
        }
    }
}
private Nullable<int> _idTeam;

 

Il codice qui sopra proviene dalla definizione della classe Player.

Caricare dati attraverso i RIA Services

Altro balzo in avanti. Supponiamo adesso di aver chiuso tutto il giro, e di aver implementato una piccola applicazione Silverlight che da qualche parte mostri una ListBox con l’elenco delle squadre: quando l’utente clicca su una squadra, viene eseguito un command che carica i giocatori di quella squadra, e li mostra in un’altra ListBox. Ora – non ci interessa sapere che il tutto è stato fatto con M-V-VM e tutto il resto.

Quello che conta è che da qualche parte il nostro codice sarà una cosa tipo questa:

void loadPlayersCommandExecute(object value)
{
    if (value == null) return;
 
    Team t = value as Team;
 
    TeamsDomainContext dc = new TeamsDomainContext();
    var query = dc.GetPlayersQuery().Where(pl => pl.IdTeam.Equals(t.Id));
    dc.Load<Player>(query, callbackPlayers, null);
}

 

Questo è l’execute del command che carica i giocatori. Arriva in input un object, che è il SelectedItem della ListBox delle squadre.

Domanda per voi: se abbiamo impostato che “IdTeam” ammette NULL (che alla fin fine è lo scenario che ho applicato), questa riga di codice a runtime funziona? Per compilare compila, ma in esecuzione si schianta. E si schianta sull’ultima linea, al momento della chiamata a Load().

Perchè? Notare la clausola Where: la proprietà IdTeam di pl è Nullable<int>, mentre t.Id ritorna int.

In questo caso ho chiamato il metodo Equals su un reference type (Nullable<int>, o int? che dir si voglia), passando come parametro un value type (int). E tutto ciò non va affatto bene. L’exception contiene il seguente messaggio:

Expression of type ‘System.Int32’ cannot be used for parameter of type ‘System.Object’ of method ‘Boolean Equals(System.Object)’

Come risolvere la cosa. Basta sostituire la chiamata a Equals con il più banale ==. Ecco come diventa la query:

var query = dc.GetPlayersQuery().Where(pl => (pl.IdTeam == t.Id));

Ed il gioco è fatto!

Send to Kindle
Community

WP7 Pizza!

La notizia è rimbalzata su Twitter, Facebook ed ovviamente sui canali ufficiali, ma voglio comunque parlarne pure io qua sul mio blog. Mercoledì 4 Agosto a Milano e Giovedì 5 Agosto a Roma, Microsoft ha organizzato due giornate in cui tutti noi sviluppatori su Windows Phone 7 potremo testare e provare le nostre applicazioni, non tanto sull’emulatore (altrimenti lo faccio anche a casa mia :-P), ma su veri smartphone WP7.

Ma ho anche una brutta notizia per voi: se non ne sapevate nulla e lo state leggendo adesso sul mio blog, siete fregati, perchè questi due eventi erano a numero chiuso ed era necessario iscriversi entro il 30 Luglio per poter partecipare. Pazienza!

Ma non tutto è perduto, però: c’è anche una bellissima cena, denominata WP7 Pizza, organizzata tramite Facebook. Unitevi e partecipate con noi, sarà sempre un’occasione per trovare amici di community, e magari vedere dal vivo qualche bel device WP7!

Che ne dite, si può fare?

Send to Kindle
.NET World

Windows Phone 7 ed il mono-tasking

C’è molto rumore attorno a Windows Phone 7, il sistema operativo che Microsoft sta lustrando e sta promuovendo in lungo e in largo per – credo – il prossimo Natale. Dal punto di vista di noi developer, le cose sono molto interessanti, perchè cellulari con su WP7 possono essere tranquillamente programmati usando il nostro amato .NET Framework.

Scendendo più nel dettaglio, è sufficiente saper sviluppare applicazioni con Silverlight ed il gioco è fatto. Certo, ci sono dei piccoli dettagli da prendere in considerazione, perchè la nostra futura app non gira dentro un browser. Le applicazioni Windows Phone 7 sono applicazioni Silverlight 3 che girano in modalità out-of-browser. Poi bisogna pensare al fatto che – trattandosi di un device mobile – non ci sono tastiere, nè mouse, ma si interagisce con lo screen touch e così via. Le solite cose che per chi ho lavorato con dispositivi mobile non sono una novità.

Se volete scendere ancora più nel dettaglio, invece, vi consiglio di leggere questo post di Corrado, che evidenzia tra le altre cose un aspetto piuttosto importante di WP7: ovvero, questo sistema operativo non è multi-tasking.

Cosa comporta questo per un utente normale? Significa che può aprire una sola applicazione alla volta. Se apriamo l’applicazione “Pippo”, poi premiamo Home per tornare alla schermata iniziale, la nostra applicazione viene chiusa a tutti gli effetti (pare che tombstoned sia il termine ufficiale di Microsoft). Se l’utente riclicca sull’icona della nostra applicazione, dobbiamo fargli credere che in realtà non si sia mai chiusa, ripristinando lo stato esattamente com’era. lo spiega bene Corrado nel post linkato sopra.

Mi fa un po’ storcere il naso questo meccanismo. Ecco un po’ di punti deboli:

  1. bisogna prestare attenzione ad un eventuale splash screen della nostra applicazione: se è davvero un avvio a tutti gli effetti, questi deve apparire. Se l’avvio avviene dopo un tombstone, allora questi NON deve apparire
  2. impossibilità di scrivere applicazioni che girano davvero in background. Ad esempio: su Symbian posso tranquillamente lanciare l’esecuzione di un GPS tracking, che se ne sta lì buono buono a tracciare la posizione e a scrivere il suo file di log, e contemporanemente posso ricevere telefonate, navigare, scrivere un sms: tutto quello che il cellulare può fare
  3. questa decisione è stata presa per risparmiare batteria e limitare i consumi, per salvaguardare il punto di vista dell’utente. Avrei preferito – però – che dicessero che un’app in background può usare solo l’1% del processore, oppure solo 16Mb di RAM, oppure non può accedere allo storage SD, ad esempio. Così si possono scrivere un sacco di belle applicazioni, ma se ne taglia comunque una bella fetta.

Anche durante l’evento DotNetLombardia della settimana scorsa è saltata fuori questa questione. Si ragionava che evidentemente sarà un po’ più scomodo usare Tom Tom Navigator su WP7, perchè se mentre sto guidando arriva una telefonata o un sms, beh, ecco, insomma, Tom Tom si chiude. Certo, si può riaprire, ma non è così rapido come può sembrare. Almeno credo.

Forse però parlo da utente skillato. Magari il target per WP7 studiato da Microsoft non è così esperto. Però vi dico solo una cosa: mio padre, che ha anche lui un Nokia piuttosto evoluto, ha imparato a riconoscere quando un’app è in esecuzione/aperta, perchè accanto alla sua icona ne appare un’altra … una specie di “ingranaggio” (che però dipende dal tema in uso sul cellulare), che indica appunto che quell’applicazione sta girando in background.

Vedremo, io non ho mica la verità in mano!

Send to Kindle