Technology Experience
.NET World

Microsoft Lightswitch, deploy di un’applicazione con autenticazione

Una delle features più interessanti di Lightswitch è la sua possibilità di effettuare il deploy direttamente sul server Web da cui poi sarà fruibile. Una comodità che fa piacere ai developer meno skillati, e che accelera il lavoro ai developer più esperti.

Il server Web può essere locale, all’interno della vostra LAN oppure esposto su Internet. In quest’ultimo caso, è necessario che il provider abbia installato tutti i pre-requisiti di Lightswitch. Come avevo citato nel mio primo post dedicato a Lightswitch, le possibilità di deploy messe a disposizione sono due:

  1. Deploy diretto da Visual Studio 2010
  2. Generazione in locale sul proprio PC un file di package (che non è nient’altro che un file zip), da importare sul server Web tramite la console IIS installata localmente sul proprio PC

Nel mio caso specifico, con www.winhost.com, sono obbligato a seguire la procedura (2). Non sto qui a scendere nel dettaglio: vi basti sapere che da VS2010 producete un file di package (.zip), che contiene tutti i files necessari per deployare l’applicazione: files, script SQL, parametri per la creazione dell’applicazione sotto IIS, etc. etc.

L’applicazione su cui sto lavorando per Brain-Sys fa utilizzo anche dell’autenticazione offerta dal Membership Provider. In questo caso, nel momento in cui effettuate l’installazione dell’applicazione su IIS, il wizard vi chiede, tramite una dialog dedicata, anche username & password dell’utente Administrator, per fare il primo login e procedere alla creazione degli altri utenti & ruoli, etc. etc. Per motivi che onestamente non siamo riusciti a capire, a me questa dialog non compare. Risultato? L’applicazione veniva deployata senza alcun problema, e raggiungendo il suo url (esempio: http://www.dominio.it/Nomeapp) appariva la form di login, ma non essendoci utenti configurati (ripeto: nemmeno l’Administrator) … difatto l’applicazione rimaneva inutilizzabile.

Ma abbiamo trovato una soluzione, spiegata in questo thread.

In pratica, tutta la struttura del database è ok: quello che manca è un bel record all’interno della tabella aspnet_Users (e qui ovviamente stiamo parlando di Membership Provider). Escludiamo a priori di aggiungere manualmente un record: non si fa, non si fa, non si fa. E quindi, cosa si fa? Semplice.

Se avete installato Lightswitch sul vostro PC, andate nella directory:
C:Program Files (x86)Microsoft Visual Studio 10.0LightSwitch1.0Tools

All’interno di questa directory trovate il file Microsoft.LightSwitch.SecurityAdmin.exe. E’ sufficiente eseguire da command-line questo comando…
Microsoft.LightSwitch.SecurityAdmin.exe/createadmin /user:Admin /password:pwd /fullname:Administrator /config:C:Documentiweb.config

…per ottenere il vostro utente Administrator. Qualche precisazione:

  • /user:nome_utente (va specificato lo username dell’utente che volete creare)
  • /password:password_utente (va specificata la password dell’utente che volete creare)
  • /fullname:nome_completo (va specificato il nome completo dell’utente)
  • /config:filepath (va specificato il percorso completo del web.config sul vostro PC, che contiene la stringa di connessione che punta al database che vi interessa)

Se il comando non vià segnala alcun errore, significa che l’utente Administrator è stato creato con successo. Potete loggarvi all’interno della vostra applicazione Lightswitch. Se fatta a dovere, la vostra applicazione vi mette a disposizione tutti gli strumenti per creare altri utenti, altri ruoli, e per effettuare l’assegnamento di ruoli ai singoli utenti.

Et voilà, problema risolto!

Send to Kindle
.NET World

Rientro dalle ferie? Microsoft Lightswitch a tutta forza!

www.microsoft.com/visualstudio/en-us/lightswitch/overview/comparePochi giorni prima delle mie ferie, esattamente il 27 Luglio scorso, ho seguito un evento in streaming dedicato interamente a Microsoft Lightswitch 2011, organizzato dalla community italiana dedicata proprio a questo nuovo prodotto. Per chi se lo fosse perso, le registrazioni alle varie sessioni sono disponibili a questo indirizzo (attenzione, dovete essere utenti registrati per visionarli).

Fino a quel giorno avevo sentito parlare poco di Lightswitch 2011. Qualche tweet, qualche news, qualche post da parte del nostro amico Alessandro Del Sole. L’evento, molto interessante, ha messo in mostra le caratteristiche principali del software, partendo dai concetti più semplici fino alle features più avanzate. Non so perchè, deve essere stato una sorta di sesto senso, ma sentivo che Lightswitch potesse essere un cavallo su cui puntare, e sono riuscito a trasmettere questo interesse internamente a Brain-Sys. Ho seguito l’evento, sessione dopo sessione, ho twittato i contenuti che trovavo più stuzzichevoli e ne sono uscito con una determinazione che mi ha fatto dire: “Cascasse il mondo, devo provarlo e studiarlo almeno un po’!”.

Ma torniamo un po’ all’inizio. Cos’è esattamente Microsoft Lightswitch? Definirlo è forse un po’ complicato. Le caratteristiche che lo contraddistinguono sono:

  • Strumento di sviluppo RAD (Rapid Application Development)
  • Viene di fatto installato all’interno di VS2010, comparendo come nuovo tipo di progetto (nota: Lightswitch è utilizzabile anche come prodotto stand-alone, vedere in fondo al post)
  • Ideale per applicazioni data-centriche
  • Generazione automatica di tabelle ed interfaccia utente Silverlight 4 (applicazione desktop OOB oppure fruibile via browser)
  • Infrastruttura n-tier con WCF RIA Services
  • Deploying automatico su un server Web (esempio: un server Web locale, oppure remoto in hosting come winhost.com, etc.)
  • Supporto per le autenticazioni e autorizzazioni tramite Membership Provider
  • Estendibilità tramite controlli custom
  • Al 100% mi sto dimenticando di qualcosa: vi consiglio di googlare o di visitare il sito Web ufficiale per tutte le info
    Sorriso

Il fatto è che se dovete creare un’applicazione Web in breve tempo per costruire anagrafiche, un piccolo gestionale, una rubrica, un archivio di qualche tipo, qualsiasi cosa che lavori sui dati, probabilmente Lightswitch 2011 fa al caso vostro. Il database è completamente auto-generato in base alle entity che disegnate, la UI è auto-generata in base a ciò che stabilite all’interno dello Screen Designer, potete inserire regole di validazione, potete avere la UI localizzata, potete scrivere codice custom (ad esempio per aggiungere calculated property, per aggiungere alla UI Button custom, per validare entity), potete creare controlli Silverlight da incorporare in Lightswitch. Insomma, il vostro lavoro può partire considerando Lightswitch come un ambiente di sviluppo “sempliciotto” e molto RAD, ma vi posso assicurare che, spremendolo a dovere, potete ottenere degli ottimi lavori.

Parliamo di deploy. Quando la vostra applicazione è terminata, dovete ovviamente deployarla da qualche parte. La procedura di publishing di Lightswitch fa in modo di semplificare il più possibile il compito al developer (assumendo che non abbia skill a sufficienza) e può avvenire secondo due metodi:

  1. Deployare direttamente da Visual Studio 2010 sul server Web (locale o remoto)
  2. Generare in locale sul proprio PC un file di package (che non è nient’altro che un file zip), da importare sul server Web tramite la console IIS installata localmente sul proprio PC

In ambedue i casi, ovviamente, dovete avere i permessi e le credenziali adeguate. Non solo: se stiamo parlando di deployare su un vostro hosting (come nel mio caso http://winhost.com o http://discountasp.net), dovete assicurarvi che questi supporti Lightswitch, con tutta una serie di pre-requisiti. Il provider può adeguarsi in modo piuttosto semplice usando il Web Platform Installer, che fa tutto in automatico. E se invece cercate un hosting già pronto per Lightswitch, il sito Microsoft riporta qualche informazione in merito a questo indirizzo. Ultima menzione: Lightswitch supporta anche il deploy su Azure. Mica male, no?

Per concludere, in circa una settimana di lavoro ho messo in piedi un prodotto che – se fatto da zero ed a parità di complessità tecnologica – avrebbe richiesto sicuramente molto, molto, molto più tempo. Trattandosi di un progetto reale non posso in questo momento scendere nel dettaglio, ma vi posso assicurare che la produttività è stato altissima, al punto che abbiamo già deployato una versione beta da far vedere al cliente.

Ultimissime note: grazie ad Alessandro Del Sole per il suo costante impegno ad aiutare il prossimo, e grazie a tutta la community italiana www.lightswitch.it, che si dimostra attiva e di buon livello, considerando che si tratta di un prodotto appena uscito sul mercato.

Giovedì 1 Settembre 2011, 22:24 – Aggiornamento dell’ultim’ora. Giustamente, mi è stata fatta notare una cosa importante su Microsoft Lightswitch. Se già possedete Visual Studio 2010, Lightswitch si installa all’interno di questo ambiente di sviluppo – come già ho detto prima, lo avete come un nuovo tipo di progetto. Se non possedete Visual Studio 2010, niente paura: Lightswitch è anche un IDE separato, per cui potete tranquillamente utilizzarlo anche in questo modo. Qualche info in merito la trovate qui (comparazione tra Lightswitch stand-alond e Lightswitch con VS2010).

Send to Kindle
Hardware

Microsoft rilascia Mango a tutti gli sviluppatori Windows Phone 7

Ieri sera – almeno per noi italiani – è accaduta una cosa piuttosto importante, se siete sviluppatori Windows Phone 7. Con questo post viene infatti annunciata la disponibilità dell’aggiornamento 7.10.7712.60 – per gli amici Mango. La procedura spiegata è dedicata solo ed esclusivamente agli sviluppatori.

La prima cosa da dire è che non si tratta del vero Mango in versione RTM, ma una versione del sistema operativo leggermente più indietro rispetto a quella che verrà rilasciata al pubblico fra…qualche mese?.

Parliamoci francamente, i passi avanti rispetto alla versione Windows Phone 7 che trovano nei negozi in questo momento (presumibilmente aggiornati a NoDo) sono davvero moltissimi, e per certi versi trasformano il vostro telefono in un vero e proprio amico, del quale non fareste più a meno. E francamente, ci sono così tante migliorie che di fronte alla domanda: “Dimmene una…la feature che ti piace di più!” mi sono trovato in difficoltà. Perchè non c’è una vera feature che ammazza tutte le altre, ma il tutto è così ben sparso che l’unica soluzione è cominciare un elenco più o meno corto. Ad esempio:

  • Molto più fluido e responsivo
  • Possibilità di dettare gli SMS (e, credetemi, funziona davvero bene in diverse condizioni ambientali: in camera da letto o in auto, mischiando italiano/inglese/francese)
  • Integrazione con XBOX Live
  • Multi-tasking migliorato
  • Alcune funzionalità per risparmiare la batteria
  • Ricerche, gestione delle mail in forma di conversazione
  • Integrazione totale ed assoluta con Messenger, Facebook, Twitter, LinkedIn, Office 365, Exchange
  • Dal punto di cui sopra: credo fermamente che WP7 sia il telefono più social di tutti (almeno nativamente, senza app di terze parti)
  • Le tiles sulla videata principale di WP7 sono decisamente più interattive ed informative
  • Googlate per tutto il resto: ci sono già centinaia e centinaia di blog che spiegano meglio di me tutte le innovazioni
  • Ecco un url interessante ed utile: http://www.plaffo.com/2011/07/rilasciata-la-nuova-versione-beta-di.html (in italiano)

La cosa forse più interessante è lo sblocco – passatemi il termine – di una moltitudine di API, che permettono e permetteranno agli sviluppatori di creare e pubblicare applicazioni capaci di sfruttare tutte queste nuove caratteristiche, rendendo così la user-experience per l’utente finale decisamente migliore.

Il client Twitter integrato, se confrontato con app dedicate di terze parti, è limitato, nel senso che non permette uno scrolling “infinito” dei tweets, e non permette ricerche tramite hashtag (esempio: #wp7, #fear3, #shangai, etc.). Ma lo scopo essenziale è quello di permettere ad un utente di twittare, ed il tutto è calibrato per conoscenze di basso livello, e quindi è sicuramente una cosa positiva. Inoltre, come ha giustamente sottolineato Lorenzo su Twitter, questa integrazione con Twitter consente anche ad app di terze parti (come possono essere le mie, già pubblicate) di twittare in modo estremamente rapido.

Microsoft ha insomma fatto un ottimo lavoro: Mango era stato annunciato per l’autunno, mentre siamo qui a fine luglio con i nostri telefoni già aggiornati! Ok, questo non vale per tutti gli utenti, ma direi che ci siamo. Sono davvero lontani i tempi in cui anche noi devs eravamo scontenti per gli aggiornamenti ritardati intorno a febbraio/marzo di quest’anno (mi riferisco agli updates PreNoDo e NoDo stesso). Evidentemente qualcuno di mamma Microsoft si è un po’ arrabbiato, e tutti gli ingranaggi hanno cominciato a girare nel modo giusto.

Una delle noti dolenti rimane probabilmente il marketing e la pubblicità fatta nei confronti di questo splendido prodotto. Non ho le competenze necessarie per dare idee in questo senso: l’unica cosa che posso dire è che vedo troppa poca pubblicità. Raramente entro in un centro Mediaworld e vedo WP7: questo era vero qualche mese fa, ed è vero tuttora. Mettiamola così: ormai qui da noi è estate, ed a parte le vacanze stiamo tutti pensando all’autunno. Nokia entrerà presto nel mondo WP7, e vedremo i risultati.

L’ultima nota dolente è probabilmente l’autonomia della batteria: è probabilmente una cosa soggettiva, ma un telefono che sta acceso per un giorno o poco più, per me non va bene. Ma sia chiaro: basta cambiare le proprie abitudini ed attaccare il telefono ad una presa elettrica appena se ne ha una a disposizione. Il ciclo di vita di uno smartphone di questo tipo da va uno a tre anni, per cui il rischio di rovinare la capacità della batteria è molto basso. E tenete sempre presente che – a dispetto di quello che accade con iPhone – la batteria è sostituibile senza alcun problema: io stesso ho preso su ebay.it una seconda batteria per il mio HTC. Ed il gioco è fatto!

Send to Kindle
.NET World

Una classe DragService per gestire il drag’n’drop in ambito WPF & MVVM

Il titolo non potrebbe essere più esplicativo. Per lo stesso progetto che ho accennato nel mio post di ieri ho dovuto cercare una soluzione per:

  1. sfruttare il drag’n’drop nella UI dell’applicazione WPF
  2. fare in modo che tale meccanismo non sia troppo invasivo, e non mi costringa a riscrivere da zero i miew ViewModel già pronti
  3. fare in modo che tale meccanismo utilizzi i Command già predisposti nei miei ViewModel
  4. il drag’n’drop deve poter utilizzare gli stessi Command già funzionanti per la parte non drag’n’drop

Mi spiego meglio sul punto (4). Ho sempre preferito fare in modo di adattare la stessa UI, in modo tale che possa essere usabile in diversi modi, facendo in modo che l’utente possa scegliere istintivamente quello che preferisce. Quindi, supponiamo di avere questa interfaccia utente:

E’ una cosa piuttosto semplice: sulla sinistra abbiamo un elenco di nomi, a destra abbiamo una TextBox che mostrerà la persona che abbiamo scelto. In questo caso voglio dare la possibilità all’utente di scegliere una persona dall’elenco in due modi differenti:

  • selezionandola dall’elenco e poi cliccando sul bottoncino con la freccia “—>”
  • trascinandola dall’elenco sopra la TextBox

Sebbene si trattino di due interazioni diverse, vorrei poter riciclare gli stessi Command (sia per quanto riguarda la parte Execute, che la parte CanExeCute)

Sul Web, googlando, ho trovato un po’ di soluzioni, ma lo ho scartate tutte quante, un po’ perchè invasive (soprattutto per essere inserite su un progetto già avviato), un po’ perchè complesse (capire decine, decine e decine di linee di codice non tue può rivelarsi poco piacevole). Quindi mi sono messo di buona lena ed ho realizzato una classe DragService (283 linee di codice ben formattate) che soddisfa tutti i miei requisiti.

Vediamo quindi come si utilizza questa mia classe.

Come utilizzare VivendoByte.WPF.DragService
Lo screenshot qui sopra è ovviamente un’applicazione WPF, implementata secondo i soliti metodi richiesti dal pattern MVVM:

xmlns:l="clr-namespace:DragAndDropDemo"
xmlns:drag="clr-namespace:VivendoByte.WPF.DragService;assembly=VivendoByte.WPF.DragService"

 

Innanzitutto, ho dichiarato i namespace che mi servono: “l” è l’assembly locale, mentre “drag” fa riferimento all’assembly VivendoByte.WPF.DragService. Il ViewModel viene inserito fra le risorse della Window corrente; il DataContext della Grid prende questo ViewModel e fa in modo di governare la view.

<Window.Resources>
    <l:MainViewModel x:Key="vm" />
</Window.Resources>
    
<Grid DataContext="{StaticResource vm}">
...
</Grid>

 

La prima parte interessante riguarda la ListBox posizionata a sinistra sulla finestra:

<ListBox Grid.Row="0" Margin="4" ItemsSource="{Binding Persons}"
            Background="LightGoldenrodYellow"
            SelectedItem="{Binding DraggingPerson}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock
                    Text="{Binding Fullname}" FontSize="24"
                    drag:DragService.SourceCommand="{Binding
                        RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid},
                        Path=DataContext.DragCommand}"
                    drag:DragService.SourceCommandParameter="{Binding}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

 

La ListBox è bindata ad un elenco di persone (proprietà Persons del ViewModel); l’elemento selezionato è bindato sulla proprietà DraggingPerson. All’interno della ListBox ho definito un semplice DataTemplate, per permettere di mostrare ogni elemento in modo più furbo: usando la proprietà Fullname esposta da Person. E qui arriva il barbatrucco.

Sulla TextBlock ho bindato un Command, comprensivo di parametro. Siccome ci si trova all’interno di un DataTemplate, ho dovuto utilizzare RelativeSource per permettere al motore di WPF di navigare il logical tree della Window, raggiungere la Grid su cui è impostato il DataContext e – finalmente – prendere il Command interessato (nel nostro caso DragCommand). La cosa interessante è questa:

  • Nel momento in cui parte la nostra operazione di drag su un elemento della ListBox viene eseguita la CanExecute del Command associato; se la CanExecute fallisce (ritorna false) il drag non parte nemmeno
  • Se invece la CanExecute ritorna true, parte l’operazione di dragging

La stessa cosa bene o male accade per la TextBox, che è la destinazione del drag’n’drop. Invece di utilizzare SourceCommand e SourceCommandParameter, devono essere utilizzate TargetCommand e TargetCommandParameter.

<StackPanel Grid.Column="1" Margin="4">
    <TextBlock Text="Trascina una persona" FontSize="24" Height="40" />
    <DockPanel>
        <Button Content="-->" Margin="8" Width="32" Command="{Binding DropCommand}" />
        <TextBox Background="LightGoldenrodYellow" Text="{Binding SelectedPerson.Fullname,Mode=OneWay}"
                    FontSize="24" Height="40"
            drag:DragService.TargetCommand="{Binding DropCommand}" />
    </DockPanel>
    <Button Content="Rimuovi persona" Margin="8" Command="{Binding ClearPersonCommand}" FontSize="20" />
</StackPanel>

 

La TextBox è bindata al comando DropCommand. Questa volta il binding è diretto, dal momento che non ci si trova più dentro un DataTemplate, e quindi il riferimento al DataContext della Grid è diretto. Anche in questo caso:

  • Nel momento in cui passiamo sopra la TextBox durante il drag’n’drop, viene eseguita la CanExecute. Se ritorna false, l’icona del mouse diventa il classico divieto. Se ritorna true, tutto bene: sul controllo appare l’Adorner ed il drag’n’drop può concludersi
  • Se rilasciamo il tasto del mouse sopra il controllo, viene eseguito il command

Notare che il Button è bindato allo stesso comando DropCommand. Difatti, l’utente può draggare una persona dalla ListBox, o semplicemente selezionarla e poi cliccare il bottone.

Ultime piccole osservazioni

Provate a selezionare o a draggare l’elemento “Sabrina Pedretti”. E’ minorenne, e siccome la CanExecute del DragCommand impone che la persone sia maggiorenne, ecco che su questo elemento l’operazione di drag’n’drop non avviene. Davvero molto comodo: possiamo annullare il drag’n’drop nel momento in cui l’utente tenta di cominciarlo, sfruttando i Command e quindi rispettando appieno il paradigma M-V-VM. Il button “—>” anche in questo caso di spegne, per lo stesso motivo: lo stesso metodo CanExecute che impedisce il drag’n’drop fa spegnere il Button, perchè il command DragCommand non è disponibile.

I Command del ViewModel sono implementati attraverso la libreria Galasoft, di Laurent Bignon. Sono supportati sia il RelayCommand normale, che quello tipizzato. Nel progettino demo, il comando DragCommand è tipizzato sulla classe Person (nello XAML è stato specificato il SourceCommandParameter), mentre il comando DropCommand no (per capire quale elemento sto draggando utilizzo la proprietà DraggingPerson del ViewModel, impostata all’inizio del drag’n’drop).

Il Button indicato come “Rimuovi persona” svuota semplicemente la TextBox per ricominciare un’altra operazione di drag’n’drop. E lo fa agendo sulla proprietà SelectedPerson esposta dal ViewModel.

Disponibile attraverso NuGet!

Se utilizzate NuGet per la gestione degli assembly all’interno delle vostre solution VS2010, sappiate che potete trovare la libreria VivendoByte.WPF.DragService, scaricabile gratuitamennte e pronta all’uso. Ringrazio Alessandro Melchiori per la sua sessione presso l’ultimo workshop UGIdotNET, dove ha illustrato NuGet da diversi punti di vista, compreso quello del developer, ovvero come pubblicare proprie librerie sul repository pubblico.

Download del progetto demo

Se invece siete interessati al progetto demo, piccola applicazione WPF da cui è stato tratto lo screenshot sopra, è scaricabile dal mio account SkyDrive.

Send to Kindle
My daily work

Da Managed Designs a casa mia in 158 foto

Da qualche mese, ogni lunedì sono in Managed Designs per un SAL settimanale, ovviamente per conto della società per cui lavoro felicemente, Brain-Sys.
Si tratta di un progetto WPF per un grosso cliente di Gorizia, con inserti di MVVM, WCF, etc. etc.

Ma non sono qui per parlarvi di questo.

Ieri pomeriggio, all’uscita dall’ufficio di Managed Designs (alias @bottega51 su Twitter) ho preso in mano la mia fedele Canon EOS 450D e ho cominciato a scattare fotografie, dall’ufficio, fino a casa. La prima foto è stata scattata alle ore 18:17; l’ultima foto è delle ore 19:38. Si passa da una delle vie più centrali di Milano, passando dai Navigli, fino a raggiungere Sant’Angelo Lodigiano (Lodi), il paese in cui abito e vivo. 158 fotografie: non ne ho scartata nessuna, mossa, sfocata, fuori inquadratura.

Perchè? Per due motivi: testare il mio nuovo obiettivo 18-200 acquistato una settimana fa, e per cercare di rendere meno noioso il ritorno verso casa.

Insomma, Buona Visione e Buon Divertimento. L’album fotografico completo è visibile a questo indirizzo.

IMG_9462
Via Torino, 51 – dalla finestra di @bottega51

IMG_9491

IMG_9525
Navigli di Milano

IMG_9531
Sempre i Navigli di Milano, venditori ambulanti in preparazione…

IMG_9538
Ingresso della fermata M2 di Porta Genova

IMG_9596
Stazione di servizio “San Zenone al Lambro” (Lodi) dalla A1 a 130km/h circa

IMG_9619
Cancello automatico in apertura

Tutto il resto dell’album fotografico è visibile a questo indirizzo.

Send to Kindle
.NET World

MSBuild e la compilazione massiva di app Windows Phone 7

Oggi riprendo in mano Windows Live Writer per parlarvi di un’esigenza nata nei giorni scorsi, e che ho risolto (almeno tecnicamente) questa notte, anche se ho dovuto fare le ore piccole.

In questo momento, sul marketplace per Windows Phone 7 ci sono 21 applicazioni I Love Qualcosa (dove “Qualcosa” sta per Milan, Juventus, Roma, Palermo, Inter, etc. etc – il numero è disparsi perchè ho creato anche I Love Foppa, dedicata alla Foppapedretti Bergamo, squadra femminile di pallavolo). Le app sono ovviamente già disponibili da parecchio tempo (qualche mese) e nei giorni scorsi mi son posto la domanda: cosa dovrei fare se volessi ricompilarle tutte in modo massivo? Dal punto di vista tecnologico:

  1. E’ ovviamente un progetto di tipo Windows Phone 7
  2. E’ organizzata come unica solution ed unico project
  3. Esiste un file AssemblyInfo*.cs specifico per ogni squadra (quindi AssemblyInfoMilan.cs, AssemblyInfoInter.cs, e così via)
  4. Esiste un file WMAppManifest*.xml specifico per ogni squadra (quindi WMAppManifestMilan.xml, WMAppManifestInter.xml, e così via)
  5. I files dei punti (3) e (4) sono inclusi nel progetto (per maggiore facilità nella loro gestione) in folders dedicati, ed impostati come Build Action a None (in modo tale che non finiscono nel file .xap, il compilato finale)

Quindi, vi chiederete voi, come si fa ad ottenere I Love Milan piuttosto che I Love Inter?

Fino ad oggi questi passaggi li ho fatti manualmente. Supponiamo di voler generare ILoveMilan.xap.

  1. Copiavo il file AssemblyInfoAssemblyInfoMilan.cs in PropertiesAssemblyInfo.cs
  2. Copiavo il file WMAppManifestWMAppManifestMilan.xml in PropertiesWMAppManifest.xml
  3. Modificavo il file MainPage.xaml.cs per modificare una variabile stringa contenente il nome della squadra
  4. Entravo nelle proprietà del progetto per specificare il nome del file di output (in questo caso ILoveMilan.xap)

Tutto qua: poi lanciavo la compilazione e mi trovavo il file da inviare sul marketplace. Da notare che i files indicati ai punti (1) e (2) contengono una serie di importanti informazioni per l’app: titolo, descrizione, quali icone usare nelle varie dimensioni, etc. etc. Di fatto, sostituendoli, vengono sostituite informazioni essenziali dell’app stessa.

Quello che ho fatto stanotte è quindi automatizzare i quattro passaggi, inizialmente tentando di fare tutto con MSBuild.exe, poi rinunciando (causa scarsa conoscenza dello strumento) per passare ad una più “tradizionale” console application. C’è da dire questo: penso che non ci sia una soluzione unica e che vada bene per tutti, perchè ovviamente il tutto dipende da come avete strutturato la vostra solution. Vi racconto come ho fatto io.

Qualche dettaglio sulla console application
Il discorso è molto semplice. Ho creato un metodo generateTeam:

   1:  static void generateTeam(string team)
   2:  {
   3:      string path1;
   4:      string path2;
   5:   
   6:      path1 = baseDir + @"AssemblyInfoAssemblyInfo" + team + ".cs";
   7:      path2 = baseDir + @"PropertiesAssemblyInfo.cs";
   8:      File.Copy(path1, path2, true);
   9:   
  10:      path1 = baseDir + @"WMAppManifestWMAppManifest" + team + ".xml";
  11:      path2 = baseDir + @"PropertiesWMAppManifest.xml";
  12:      File.Copy(path1, path2, true);
  13:   
  14:      string mainPage = getResource("ConsoleApplication1.MainPage.xaml.cs1") + team + getResource("ConsoleApplication1.MainPage.xaml.cs2");
  15:      path1 = baseDir + "MainPage.xaml.cs";
  16:      File.WriteAllText(path1, mainPage);
  17:   
  18:      string csproj = getResource("ConsoleApplication1.ILoveFootballTeam.csproj1") + team + getResource("ConsoleApplication1.ILoveFootballTeam.csproj2");
  19:      path1 = baseDir + "ILoveFootballTeam.csproj";
  20:      File.WriteAllText(path1, csproj);
  21:   
  22:      msbuildClean();
  23:      msbuildCompile();
  24:   
  25:      path1 = baseDir + @"binReleaseILove" + team + ".xap";
  26:      if (File.Exists(path1))
  27:      {
  28:          path2 = @"X:OutputILove" + team + ".xap";
  29:          File.Copy(path1, path2, true);
  30:      }
  31:  }

 

Scusate la qualità del codice, ma alle 2 di notte non sono granchè! Sorriso

Alle righe 6-8 aggiorno e sovrascrivo il file AssemblyInfo.cs.

Alle righe 10-12 aggiorno e sovrascrivo il file WMAppManifest.xml.

Alle righe 14-16 sovrascrivo il file MainPage.xaml.cs, sfruttando un meccanismo “balordo” (ma che funziona!) con files Embedded Resource.

Alle righe 18-20 aggiorno il file .csproj, anche qui usando come template dei files inclusi come Embedded Resource.

Alla fine chiamo due metodi, msbuildClean() e msbuildCompile().

   1:  static void msbuildClean()
   2:  {
   3:      ProcessStartInfo start = new ProcessStartInfo();
   4:      start.FileName = @"C:WindowsMicrosoft.NETFrameworkv4.0.30319msbuild.exe";
   5:      start.Arguments = @" /p:Configuration=Release /t:Clean ILoveFootballTeam.csproj";
   6:      start.UseShellExecute = false;
   7:      start.WorkingDirectory = baseDir;
   8:      start.WindowStyle = ProcessWindowStyle.Normal;
   9:   
  10:      Process process = new Process();
  11:      process.StartInfo = start;
  12:      process.Start();
  13:      process.WaitForExit();
  14:  }

 

   1:  static void msbuildCompile()
   2:  {
   3:      ProcessStartInfo start = new ProcessStartInfo();
   4:      start.FileName = @"C:WindowsMicrosoft.NETFrameworkv4.0.30319msbuild.exe";
   5:      start.Arguments = @" /p:Configuration=Release ILoveFootballTeam.csproj";
   6:      start.UseShellExecute = false;
   7:      start.WorkingDirectory = baseDir;
   8:      start.WindowStyle = ProcessWindowStyle.Normal;
   9:   
  10:      Process process = new Process();
  11:      process.StartInfo = start;
  12:      process.Start();
  13:      process.WaitForExit();
  14:  }

 

IMPORTANTE: attenzione a NON usare l’msbuidl.exe contenuto in C:WindowsMicrosoft.NETFramework64v4.0.30319, perchè NON compila. Io stesso ho perso un sacco di tempo nel cercare di capire il perchè. Evidentemente, e probabilmente, il .NET Framework a 64 bit non c’entra nulla con wp7.

Eseguo msbuild.exe in due step separati: il primo fa la Clean della nostra binRelease, il secondo per effettuare la compilazione vera e propria.

Se tutto è andato a buon fine, prendo il file .xap generato e lo copio dove voglio io (righe 25-29 del primo blocco di codice).

Questo è il meccanismo che sta alla base. A questo punto è possibile chiamare generateTeam(“Milan”), generateTeam(“Cesena”), generateTeam(“Inter”), generateTeam(“Fiorentina”) per ottenere in una directory tutti gli .xap generati.

E adesso che abbiamo gli xap, come faccio ad inviarli sul marketplace?

Qui arrivano le note dolenti. E’ vero che in un battito di ciglia abbiamo le nuove versioni delle nostre app, ma per inviarle al marketplace occorre fare tutto manualmente, e qui non ci sono storie. Bisogna avere le icone nelle varie dimensioni, gli screenshots della nostra app, i testi e le descrizioni, etc. etc. E se avete 70 applicazioni (come l’amico Matteo), siete proprio fregati! Sorriso

Domande? Sono tutt’orecchi.

Send to Kindle
Software

Le mie ultime app pubblicate per Windows Phone 7

Ogni tanto mi piace scrivere qualche aggiornamento su ciò che sto portando avanti nel mondo Windows Phone 7. Ecco allora un piccolo post riassuntivo, a poche ore dalla partenza per Verona per Piloti Virtuali Italiani. Se seguite il mio Twitter, probabilmente siete già informati su quello che scriverò, però non si sa mai.

Dunque, innanzitutto, ho inaugurato la mia “I Love Series”, dedicata alle più importanti squadre di serie A. Un ringraziamento va sicuramente a Lorenzo Barbieri per l’idea che mi ha dato, e Roberto Cavallini (entrambi di Microsoft Italia) per avermi aiutato nella creazione della grafica per questa serie di app. Le app già disponibile nel momento in cui scrivo sono le seguenti:

  • I Love Milan
  • I Love Juventus
  • I Love Inter
  • I Love Roma
  • I Love Lazio
  • I Love Napoli
  • I Love Cagliari

Mentre sono in attesa di essere validate e pubblicate le seguenti:

  • I Love Udinese
  • I Love Palermo
  • I Love Fiorentina
  • I Love Sampdoria

Ognuna di queste app vi permettere di seguire l’account Twitter (più o meno ufficiale, perchè non tutte le squadre ce l’hanno), di seguire la pagina pubblica su Facebook, di avere sotto mano il palmares di vittorie, etc. etc.

L’altra app pubblicata recentemente è Etilometro, che è stata recensita qua. Come dice il nome, si tratta di un’app che vi permette di calcolare il vostro tasso alcolemico, specificando quantità e gradazione alcolica di ciò che avete bevuto.

La mia applicazione Nove Colli, infine, è pubblicizzata sul sito ufficiale dell’omonima granfondo ciclistica. La Nove Colli ciclistica ha qualcosa come 11.000 partecipanti un po’ da tutto il mondo, non so quanti di questi abbiano un Windows Phone 7, ma spero di aver fatto loro un bel regalo (dal momento che l’app è completamente gratuita).

Che dire, un bel movimento dalle parti di VivendoByte.net, no?

Smile

Send to Kindle
Community

Piloti Virtuali Italiani ed il suo account Twitter

Pochi sanno che l’associazione Piloti Virtuali Italiani, di cui faccio parte, ha anche un account Twitter, dove seguire di giorno in giorno tutte le sue attività: dai contest in corso, ai raduni dei soci, a tutte le iniziative che PVI porta avanti nel tempo.

Il Twitter può essere seguito dalla pagina ufficiale http://twitter.com/pvi_org, oppure ovviamente da qualche strumento client più comodo!

Seguiteci!

Send to Kindle
My personal life

Ma era Julianne Moore o chi altri?

Domenica scorsa, 6 Marzo 2011, durante la cena in famiglia, eravamo davanti alla TV a seguire la solita puntata del Tenente Colombo: mio padre è un appassionato della serie, ed ormai abbiamo visto praticamente più di una volta gli episodi. Ormai la gara tra di noi consiste nell’indovinare per primo la trama dell’episodio…sì sì, questa la ricordo, è quella in cui il dottore tradisce la moglie, oppure ah no aspetta, lui fa finta che lei sappia, poi elettrizza la vasca di bagno piena d’acqua e l’amante schiatta, e via dicendo.

Durante la puntata di domenica ci siamo ritrovati davanti ad un’attrice che, sul momento, sembrava Julianne Moore, seppure giovane-giovane-giovanissima. E’ bastato googlare un attimo per risolvere il dilemma:

Due piccoli ragionamenti in più: l’episodio in questione è stato trasmesso per la prima volta negli USA il 28 Aprile 1990. Se quel personaggio fosse stato interpretato da Julianne Moore, avrebbe avuto circa 30 anni. Jo Anderson ne aveva 32. Probabilmente l’episodio è stato girato qualche tempo prima, ma l’attrice sembrava comunque molto più giovane.

E anche questo dilemma è stato risolto. Thanks Internet!

Send to Kindle
My daily workSoftware

Mi dissocio totalmente da www.xxxxxx-forum.it

Ieri, nel tardo pomeriggio, l’amico Vincenzo Pucarelli (amico di UGIdotNET), mi ha segnalato una cosa davvero poco simpatica e preoccupante. Il succo è questo: iscrivendosi ad un sito http://www.xxxxxx-forum.it/, ed entrando poi in un forum ad-hoc, è possibile scaricare i files .xap delle app per Windows Phone 7. Ovviamente il nome vero del dominio ho preferito tenerlo nascosto.

Disarmante, preoccupante, senza parole!

Vincenzo tra l’altro mi ha fatto notare che tra tutte le app pubblicate su quel forum c’era anche la mia Prova Del Cuoco, app freeware che tra l’altro io stesso ho dovuto eliminare una settimana fa per problemi di copyright vari.

Mi sono registrato immediatamente, e ho scritto un post sul forum segnalando un po’ di cose. E ho “minacciato”: se entro 48 ore non avrei visto TUTTE le app di VivendoByte.net (che è il mio publisher name sul marketplace) spazzate via, mi sarei tutelato nel miglior modo possibile, con avvocati e denunciando a destra e a manca.

Risultato? L’app Prova Del Cuoco è sparita, ed il mio account è stato sospeso a tempo indefinito. Non c’è problema: se ci sarà bisogno, mi registrerò con un’altra e-mail e ricomincerò daccapo.

Piccola parentesi: magari la mia reazione può sembrare esagerata, ma mettetevi nei miei panni. La mia app Prova Del Cuoco è stata segnalata perchè – avendo usato nome + logo + musica originali – violava qualche copyright. La segnalazione è arrivata a Microsoft da parte di…ehm…potete immaginarlo. Quindi, il fatto di vedere la mia stessa app pubblicata in modo illegale da qualche altra parte, potrebbe far pensare che quel post su quel forum sia stato scritto da me, per “bypassare” il marketplace e per far circolare ugualmente l’app nonostante il divieto che mi è stato imposto. Insomma, l’ultima cosa che voglio è essere chiamato da un avvocato.

Quindi, per concludere: le app che ho scritto per Windows Phone 7 sono SOLO esclusivamente sul marketplace ufficiale di Microsoft. Mi dissocio totalmente da ciò che viene pubblicato, non solo su www.xxxxxx-forum.it, ma su altri siti che in un modo o nell’altro pubblicano ciò che non dovrebbe essere pubblicato.

Ed un consiglio a tutti voi: evitate ovviamente di scaricare files .xap dall’origine sospetta: chi vi dice che non sono stati alterati in qualche modo, e che magari servono a veicolare trojan, virus, malware, etc. etc.?

Send to Kindle