Technology Experience
.NET World

WinRT, Xaml, TextBox e selezione del testo

Ho cercato di riassumere lo scopo del post nel titolo, ma lo riassumo qui per maggiore chiarezza. Lo scopo è quello di scatenare il ‘seleziona tutto il testo’ quando una TextBox prende il focus. Chiaramente in ottica MVVM, quindi senza sporcare il code-behind della pagina. E’ uno dei comportamenti di default che più mi mancano, anche perchè sarebbe bastato aggiungere una proprietà AutoSelectAll nella TextBox e parecchi developer sarebbero stati più contenti.

Fortunatamente è piuttosto semplice scrivere una classe che raggiungere lo stesso risultato.

public static class TextBoxHelper
{
    public static bool GetAutoSelectAll(DependencyObject obj)
    {
        return (bool)obj.GetValue(AutoSelectAllProperty);
    }

    public static void SetAutoSelectAll(DependencyObject obj,
        bool value)
    {
        obj.SetValue(AutoSelectAllProperty, value);
    }

    public static readonly DependencyProperty AutoSelectAllProperty =
        DependencyProperty.RegisterAttached("AutoSelectAll",
        typeof(bool),
        typeof(TextBoxHelper),
        new PropertyMetadata(null,
        new PropertyChangedCallback(Setup)));

    private static void Setup(DependencyObject obj,
        DependencyPropertyChangedEventArgs e)
    {
        TextBox tb = obj as TextBox;

        if (tb != null)
        {
            bool oldValue = (bool)e.OldValue;
            bool newValue = (bool)e.NewValue;

            if (oldValue == false && newValue == true)
            {
                tb.GotFocus += tb_GotFocus;
            }
            else if (oldValue == true && newValue == false)
            {
                tb.GotFocus -= tb_GotFocus;
            }
        }
    }

    static void tb_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox tb = sender as TextBox;

        if (tb != null)
        {
            tb.SelectAll();
        }
    }
}

Questa classe va ovviamente utilizzata nello XAML:

<TextBox common:TextBoxHelper.AutoSelectAll="True" />

Quando questa TextBox prende il focus, il testo in esso contenuto viene automaticamente selezionato grazie al behavior che gli abbiamo agganciato. Tutto questo direttamente nello XAML, senza code-behind, in perfetta sintonia con MVVM.

Send to Kindle
.NET World

Windows App Cert Kit, rapporto tra colore di sfondo e colore del testo

Prima di poter tentare il submit di un’app Windows 8 per lo Store, è necessario far girare localmente sul vostro PC il tool in oggetto, il Windows App Cert Kit. Non ve ne potete scordare, perchè vi viene automaticamente proposto da Visual Studio appena terminate di creare il package da uploadare nella dashboard. Questo tool fa un sacco di controlli in locale, e vi segnala eventuali problemi che causerebbero la bocciatura dell’app stessa, senza però farvi perdere tempo (qualche giorno) prima di avere un feedback da parte di Microsoft.

Ieri sera, facendolo girare a seguito della creazione di un nuovo package, mi ha bocciato l’app con la seguente unica motivazione:

Il rapporto del contrasto tra colore di sfondo e colore del testo in primo piano è 1,16. Questo rapporto deve essere maggiore o uguale a 1,5.

La morale, ben spiegata dal testo, è che non c’è abbastanza contrasto tra il colore di sfondo ed il colore del testo. Un valore 1 significa che in pratica avete lo stesso colore, il che è assurdo. Prima che vi mettiate a ripensare un altro colore di sfondo, a rifare i loghi, a ridisegnare le icone, etc. etc., aprite il file di manifest dell’app (Package.appxmanifest) e date un’occhiata alle seguenti impostazioni:

  • Foreground text
  • Background color

Il Windows App Cert Kit non misura quel rapporto guardando veramente i colori delle vostre Page, ma guarda questi due parametri. Nel mio caso, avevo impostato un colore di sfondo #F2EEDC, mentre il colore del testo era impostato a Light. In pratica, un colore molto simile al bianco, con il testo bianco. Direi poco contrasto, come riportato dal tool! La realtà quindi è che la mia app era perfettamente visibile ed usabile, perchè nei vari elementi della UI non usavo quel valore, ma avevo io impostato “Black” tramite una mia risorsa, senza usare le risorse di sistema.

E’ bastato mettere il ‘Foreground text’ a Dark e l’app ha passato il test con successo.

Send to Kindle
.NET World

L’AdControl contiene una WebView che si ruba il focus

Ok ok, il titolo di questo post è un po’ assurdo. Se siete sviluppatori di app Windows 8, probabilmente vi è già capitato. Oppure no. Nel qual caso, prendete appunti. Immaginate una pagina di un’app Windows 8 strutturata – in soldoni – da una Grid con tre righe, il cui contenuto è:

  • prima riga: intestazione, logo, quello che volete, nulla di importante
  • seconda riga: ScrollViewer a scorrimento orizzontale, che contiene UI più complessa, che rappresenta il contenuto vero e proprio dell’app
  • terza riga: controllo AdControl per mostrare un po’ di pubblicità

Ora, ieri sera mi è accaduta una cosa strana. Dal punto di vista utente, voglio che i miei utenti possano utilizzare la rotella del mouse per scorrere lo ScrollViewer indicato prima. Ricordiamocelo: le app Windows 8 non sono solamente touch, ma devono funzionare anche con tastiera & mouse. Appena l’app viene avviata, l’utente deve fin da subito poter rotellare usare la rotella del mouse per scorrere avanti ed indietro i contenuti. A me questo meccanismo non funzionava, sebbene avessi impostato nello XAML le proprietà IsTabStop=”true” e TabIndex=”"0” sullo ScrollViewer. Se invece andavo cliccare manualmente all’interno dello ScrollViewer, ecco che la rotella aveva effetto.

Vi riassumo in due righe circa 2 ore di litigate col codice per capire il problema. Sgrunt.

In pratica ho scoperto che il controllo AdControl per l’advertising contiene al suo interno un controllo WebView che – guarda caso – si appropriava del focus. Quindi all’avvio dell’app lo ScrollViewer perdeva automaticamente il focus, e la rotella smetteva di funzionare.

Come ho risolto? Così:

<adv:AdControl IsEnabled="False"
ApplicationId="xyz"
AdUnitId="xyz" />

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Impostando la proprietà IsEnabled a false, l’AdControl, e la WebView al suo interno, non si prendono più il focus e tutto funziona egregiamente. Sulla UI non c’è alcuna differenza: il banner appare come deve apparire, è cliccabile, per cui non cambia nulla: ma essendo disabilitato non può prendersi il focus.

Ultima nota: non so se questo comportamento accade sempre o magari nel mio caso avevo una situazione più complessa o fuorviante. Ho risolto nel modo descritto: se dovesse capitare anche a voi, sapete quale potrebbe essere una possibile causa.

Send to Kindle
.NET World

Layout generale di un’app Windows 8

Sebbene condividano lo stesso approccio, c’è una enorme grande differenza tra costruire un’app per Windows Phone 7 ed un’app per Windows 8. Quest’ultima deve adattarsi alla risoluzione del device su cui sta girando (notebook, ultrabook, tablet, etc.) e soprattutto deve essere in grado di adattarsi a tre modalità di visualizzazione, ovvero:

  • landscape (quando tenete il pc in orizzontale)
  • portrait (quando tenete il pc in verticale)
  • snapped (quando andate ad agganciare l’app sul bordo sinistro o destro dello schermo)

Sappiamo tutti che il modo migliore è lasciare che il runtime .NET o WinRT faccia tutto il lavoro di intercettazione del cambiamento della vista: tramite il Visual State Manager possiamo andare a modificare qualsiasi proprietà della UI per fare in modo che la vista si adatti. In pratica, possiamo, possiamo per esempio rendere visibili/invisibili dei controlli, possiamo stringere/allargare colonne e via dicendo. Questo implica una cosa piuttosto importante: ad ogni controllo su cui vogliamo interagire tramite Visual State Manager dobbiamo assegnare un nome.

Io dal canto mio ho trovato un modo che mi piace di più, riassunto del codice XAML qui sotto.

<Page>
    <Page.Resources>
    </Page.Resources>
    <Grid>
        <”Panel” x:Name="FullScreenMainGrid">
        </”Panel”>
        <Panel x:Name="PortraitMainGrid">
        </”Panel”>
        <Panel x:Name="SnappedMainGrid">
        </”Panel”>
    </Grid>
</Page>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

In pratica avete una Grid esterna che non fa altro che contenere altri tre Panel al suo interno (tali Panel possono essere Canvas, altre Grid, StackPanel, qualsiasi pannello previsto da WinRT – io ho messo Panel giusto per rendere l’idea). In modo alla visualizzazione corrente, solo uno di questi Panel sarà visibile in un dato momento. C’è il Panel che contiene il layout specifico per il landscape, poi c’è quello per il portrait, ed infine c’è quello dedicato alla visualizzazione snapped. Può sembrare una cosa prolissa, eppure io mi trovo bene così. So che toccando una certa porzione di XAML non vado a modificare le altre viste. E se lavorate con MVVM, basta fare binding e siete a posto: il codice del viewmodel che governa la view è sempre lo stesso.

Lo parte di XAML relativa al Visual State Manager è la seguente:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="ApplicationViewStates">

        <VisualState x:Name="FullScreenLandscape">
            <Storyboard>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="FullScreenMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                </ObjectAnimationUsingKeyFrames>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="SnappedMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                </ObjectAnimationUsingKeyFrames>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="PortraitMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>

        <VisualState x:Name="Filled">

        </VisualState>

        <VisualState x:Name="FullScreenPortrait">
            <Storyboard>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="FullScreenMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                </ObjectAnimationUsingKeyFrames>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="SnappedMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                </ObjectAnimationUsingKeyFrames>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="PortraitMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>

        <VisualState x:Name="Snapped">
            <Storyboard>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="FullScreenMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                </ObjectAnimationUsingKeyFrames>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="SnappedMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                </ObjectAnimationUsingKeyFrames>
                <ObjectAnimationUsingKeyFrames
                    Storyboard.TargetName="PortraitMainGrid"
                    Storyboard.TargetProperty="Visibility">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Il concetto è molto semplice: per ogni stato (FullScreenLandscape, FullScreenPortrait, Snapped) rendete invisibili due Panel e rendete visibile quello previsto per quello stato.

In questo modo evitate di impazzire assegnando nomi ai controlli qua e là, e siete assolutamente sicuri di come viene renderizzata una vista in un certo stato. Ogni vista è indipendente dalle altre. Prima cercavo di stringere/allargare colonne e righe di una Grid, oppure di rimpicciolire il FontSize delle TextBlock e degli altri controlli, ma finivo sempre per impazzire. Alla fine penso che la strada più lineare, semplice e comoda da gestire sia questa.

Che ne dite?

Send to Kindle
My personal life

Un bel lunedì

Oggi è il 29 Ottobre, è un lunedì, il primo lunedì con l’ora solare. Mi sento energico, con mille cose da fare, e con la netta sensazione di riuscire a farla tutte quante entro sera. E fra le mille cose fare, c’è anche la scrittura di questo breve post. Ho diversi motivi per essere un po’ più sorridente, oggi:

  1. La squadra Icos Crema, neo-promossa in Serie A1 (parliamo di volley) ha vinto contro Chateau d’Ax Urbino, con un secco 3-0. Bravissime ragazze!!!
  2. Sempre parlando di pallavolo, Il Volley Bergamo ha battuato al tie-break la Yamamay Volley, acerrima rivale, campionesse in praticamente tutto (campionato, coppa CEV, champions league)
  3. Estreme soddisfazioni dalla mia app Diretta Volley per Windows Phone (di cui magari parlerò in un post dedicato), recensita proprio oggi su Plaffo
  4. Anche il Milan è tornato a vincere una partitella, ma questo nella mia scala dei valori conta pochino pochino
  5. Meteo adorabile: pioggia, freddo, camino acceso, piumione. L’autunno e l’inverno è bello
  6. Domenica notte mi sono svegliato alle 4:20 senza riuscire più a dormire. Ho preso il mio Kindle ed ho cominciato a leggere fino alle 6. Alle 6 ho dormito fino alle 9 circa. E per tutto il giorno non ho sofferto di sonno o di stanchezza, anzi!

Se sabato avessi trovato anche il mio nuovo ultrabook Windows 8, sarebbe stato un weekend perfetto.

Send to Kindle
Hardware

iPad ed iPad Mini

Qualche giorno fa ho letto una statistica secondo la quale più del 50% degli acquirenti del “Nuovo iPad”, quello con il display retina, è piuttosto arrabbiata per il fatto che circa 7 mesi dopo Apple ha messo sul mercato una nuova versione di iPad, ovvero l’iPad Mini da 7 pollici. Sette mesi sono troppo pochi, dicono quei clienti arrabbiati

Lasciate che vi spieghi una cosa semplice semplice.

Innanzitutto non è assolutamente obbligatorio inseguire per forza l’ultimo modello, di qualunque prodotto Apple si tratti.

Seconda cosa, voi vi eravate abituati bene. Solitamente Apple faceva uscire UN prodotto, al massimo si poteva lasciare il taglio della memoria (8, 16, 32 GB e così via), ma non c’era molta varietà: iPhone è iPhone, iPod è iPod, iPad è iPad. Questo è il bello ed il brutto di Apple: se ti piace il loro prodotto – cosa molto probabile – allora lo acquisti senza pensarci due volte, e senza nemmeno metterci troppa testa, proprio perchè non c’è nulla da scegliere. Entri in negozio, chiedi un iPhone e te lo danno. Se invece il prodotto non ti piace, ancora meglio: te ne stai alla larga, non lo compri ed il gioco è finito.

Con la scomparsa di Steve Jobs, Apple non è più una forza innovatrice come lo è sempre stata. E da questo punto di vista – e per molti altri – si è adagiata ad essere una delle tante case produttrici di hardware/software del mondo. La più ricca, la più prestigiosa, la più cool: ma pur sempre una produttrice di hardware/software. Ma non innova più come faceva un tempo. Senza Steve Jobs, e mi dispiace dirlo, è tutta un’altra cosa.

Una delle dirette conseguenze di questa nuova posizione di Apple sul mercato è che sta introducendo tutta una serie di prodotti hardware che prima evitava con cura. Per farla breve: Steve Jobs non avrebbe mai permesso la produzione di iPad Mini. E per la prima volta gli utenti Apple se vogliono un iPad sono di fronte ad una scelta: mi conviene l’iPad classico oppure il Mini? Prima andavano a botta sicura: quando esce una nuova versione di iPad, buttavano/vendevano il vecchio e prendevano il nuovo. Adesso non è più assolutamente la stessa cosa. A seconda delle proprie esigenze, uno può preferire il 10 pollici ed il 7 pollici. Ognuno ha pro e contro.

C’è da scegliere, da valutare, pensare se magari te lo devi portare in giro, e se sì con quale frequenza. C’è da capire se la risoluzione per te conta (uno è retina, l’altro no), c’è da capire se ci sta nella tua borsa o zaino. Devi capire cos’è importante per te, cosa intendi tu per “tablet”. Prima era Apple che decideva per te, ed in primis Steve Jobs. C’è da metterci la testa, insomma.

E gli utenti Apple a tutto questo non sono per nulla abituati.

E si lamentano. Spiacenti, ma questo è il mondo vero.

Questa è la nuova Apple. E per fortuna che è così.

Send to Kindle
.NET World

Advertising delle app Windows Phone

Mi sono scontrato con due problemi, secondo me piuttosto oscuri, mentre lavoravo sull’advertising di una mia app per Windows Phone. Piuttosto oscuri perchè su Internet ho trovato ben poco.

Parto dal presupposto che sappiate già di cosa parlo: controllo AdControl, registrazione su PubCenter, qualche concetto di XAML, capabilities di un’app Windows Phone, etc.

Il primo problema è il seguente: nonostante voi mettiate il controllo AdControl sulla vostra pagina XAML, quando mandate in esecuzione l’app esso improvvisamente scompare. Questo vale sia all’interno del simulatore, sia su un device vero e proprio. E continua a valere anche se impostate i valori delle seguenti proprietà:

  • proprietà ApplicationId a “test_client”
  • proprietà AdUnitId a “Image480_80”

Questo due valori permettono di testare il motore di advertising, senza realmente accedere ai banner pubblicitari veri e propri. A design-time vedete il vostro bel controllo, ma se mandate in esecuzione sparisce tutto nel giro di un decimo di secondo. Attenzione: non sto dicendo che non vedete alcun banner: è proprio il controllo che sparisce dalla Page. Beh, se questa cosa capita anche a voi, fate una bella cosa: sottoscrivete l’evento ErrorOccured nello XAML e nel code-behind della pagina potete semplicemente scrivere (vado a memoria):

MessageBox.Show(e.Error.ToString())

Nel mio caso, mancavano alcune capabilities necessarie per far funzionare l’advertising, ovvero:

  • ID_CAP_PHONEDIALER
  • ID_CAP_IDENTITY_USER
  • ID_CAP_MEDIALIB
  • ID_CAP_WEBBROWSERCOMPONENT

Se non mettete queste capabilities nella vostra app, l’advertising non andrà mai.

L’altro problema, invece, è ancora più oscuro, almeno fintantochè non trovate e capite la soluzione. Sempre grazie all’evento ErrorOccured citato prima, potreste ottenere una AdException con pressapoco un errore simile a “An unexpected error occured during response processing (Name: ECN)”. Non state a sbatterci la testa: impostate la lingua del telefono su inglese e riprovate. Se funziona, significa che le categorie impostate sulla unità di annunci non hanno banner per la lingua italiana. Quindi o tornare su PubCenter e provate a cambiare categorie, oppure boh! L’importante è che avete capito è che non avete un errore nel codice o nello XAML della vostra app, ma è semplicemente qualcosa che riguarda la configurazione del vostro advertising server-side. A meno che, chiaramente, non dobbiate cambiare ApplicationId o AdUnitId nello XAML.

Send to Kindle
Software

Generare il QRCode di un link

Lo sapevate che con un semplice blocco HTML come questo:

<img src="http://chart.apis.google.com/chart?cht=qr&chs=100x100&chl=<URL>" />

si genera automaticamente il QRCode relativo all’url stesso? Io non lo conoscevo, ed è banalmente la tecnica che ho utilizzato all’interno del mio nuovo blog WordPress per generare il QRCode di ogni post. Ho evitato l’utilizzo di plug-in di terze parti, ma ho semplicemente modificato qualche file .PHP.

Send to Kindle
My personal life

Ci sono sere nelle quali

Ci sono sere nelle quali hai mille pensieri per la testa, ma non riesci a focalizzarne nessuno. E quindi ti ritrovi a battere velocemente i tasti sulla tastiera del tuo desktop, così, tanto per passare il tempo. Perchè ho sempre creduto che i post migliori siano quelli nati di getto, con mille pensieri per la testa.

Sto leggendo questo libro, La stella Nera di New York. Adoro i libri scritti dalle donne, soprattutto questo (che comunque devo ancora terminare), perchè sono più ricchi di ironia, di storia. Mai ho trovato un giallo scritto da un uomo mi ha fatto nascere un sorriso perchè c’è una battuta ironica, oppure una particolare disavventura, una situazione particolare.

Una volta, quando lavoravo a Milano, per assurdo avevo più tempo per leggere. Quando devi affrontare ogni giorno un viaggio di A/R sulla metropolitana, verde o gialla che sia, devi trovare il modo di occupare il tempo. Ho trovato il tempo di leggere i primi cinque libri di Harry Potter, più qualcuno di Stephen King, più tanti altri ancora. Non avevo ancora un Kindle, andava ancora il cartaceo, per cui nello zaino avevo qualche peso in più. Ma era bello. E dopo un po’ il tuo corpo si abitua alle accelerazioni ed al rollìo del treno della metropolitana, addirittura senza mani, perchè a volte i libri erano corpulenti e bisognava tenerli con due mani. Oggi sarebbe diverso. Ed oggi, seppur lavori da casa per la stragrande maggior parte del tempo, ho meno tempo di leggere. Perchè alla fine, finito il lavoro, si rimane davanti al pc a portare avanti progetti personali, idee, cazzeggiando qua e là.

Quando trovo il tempo di leggere? La sera, a letto, prima di addormentarmi. A volte la domenica mattina. Uno, due capitoli per volta. Sono lontane le sessioni di lettura di ore ed ore che facevo una volta, quando forse i libri mi prendevano di più. Ma mi va bene così, sinceramente. Il fatto che non io non legga più come una volta non significa affatto che abbia meno tempo libero.

Ci sono sere nelle quali l’unico modo che ho per tenermi compagnia è battere tasti. Mi chiedo, per esempio, se riuscirò mai nella “grande” impresa – che ogni tanto mi frulla nella testa, spesso – di scrivere un racconto serio, magari di 50-60 pagine. Perchè di idee non ne ho tante. Ma quelle che ho mi piacciono, e penso che possano portare da qualche parte. Qualche parte dove? Non parlo di soldi e chissà quale successo: parlo di soddisfazione personale, per gridare a me stesso “ce l’ho fatta”. Nulla di più di questo. Forse la causa principale per cui non riesco è il non essere in grado di switchare da una mentalità tecnica (data dal mio lavoro) ad una mentalità invece più adatta a scrivere un romanzo breve. Senza considerare che quando stai al pc per tutta la giornata, non è proprio il massimo entrare nell’ottica di dover continuare per scrivere, scrivere, scrivere. E quindi ogni volta cedo.

Ci sono sere nelle quali ascolto musica, oltre allo scrivere, come stasera. E’ cambiato anche il mondo della musica, porca miseria. Adesso pago una subscription mensile, e posso ascoltare/scaricare tutta la musica che voglio. E qui i generi spaziano: si va dal rock al jazz, alla musica leggera italiana a qualche altro successo così…estemporaneo…la tipica canzone che ha successo in quel momento.

Ci sono sere nelle quali, finalmente, il tempo è passato. Ed è giunta l’ora di cliccare su Pubblica, per inviare questo nuovo post al mondo.

Grazie, blog, per avermi tenuto compagnia.

Grazie, lettori, per essere con me!

Send to Kindle
Software

Deployare applicazioni Lightswitch

Uno dei diretti vantaggi acquisiti con la migrazione del mio blog da Subtext a WordPress, come dicevo qualche giorno fa, è che adesso ho potuto switchare il mio hosting da .NET 3.5 a .NET 4.x.

E con questo, quindi, anche la possibilità di deployare applicazioni Lightswitch.

In tal senso, ho trovato molto utile seguire questo articolo: sebbene sia del 15 Settembre 2011, poco più di un anno fa, fornisce tutte le informazioni di cui si ha bisogno. Aggiungo solo una piccola cosa per chi sta già usando Windows 8.

Il modo più comodo per amministrare l’hosting è utilizzare la console IIS installata in locale sul proprio PC che, oltre ovviamente a poter gestire l’istanza locale, si connette in modo remoto ad un IIS esposto su Internet. Questa funzionalità non è attiva by default, ma è necessario installare un piccolo add-on per l’IIS Console, scaricabile da questo indirizzo. In fondo alla pagina trovate i vari download disponibili, nelle varie lingue e nei due formati x86 e x64. L’installer è un semplice file inetmgr_amd64.msi da eseguire ed installare sul proprio PC: se usate Windows 8, riceverete un errore in fase di setup, dicendo che tale installer è supportato solo su Windows Server e su Windows 7. Nessuna paura: basta raggiungere il file, entrare nelle proprietà, spostarsi sotto il tab Compatibilità e selezionare l’unica voce disponibile, ovvero “Previous version of Windows” o “Versione precedente di Windows”, in italiano. In questo modo l’installer parte e la vostra console IIS locale, a questo punto, ha la possibilità di connettersi ad un sito remoto.

Send to Kindle