Category: webdev

  • PSA: this website honors your browser preferred color scheme (light/dark theme)

    The latest tech trend is to enable dark themes among all applications and devices: as the passionate tweaker I am, I set up every device and application I use to harness a light theme during daylight and dark mode at all other times.

    Whenever a light (or dark) theme is applied system-wide, most of the browsers read that value and communicate with the browsed website what is the preferred color scheme: light or dark. The website, if knows the two variants, can answer with CSS rules that are tweaked for light or dark via the prefers-color-scheme CSS media rule.

    Until today, this website only offered a light variant. After an evening spent with Firefox Web Developer Tools, a color picker tool and somebody that knows color theory better than me, I enabled the dark variant for this website.

    In other words: if your browser supports light and dark color schemes, you will experience this website using your preferred theme.
    In case your browser does not provide a preferred color scheme, the default (light variant) will be used.

    Dear reader, please let me know if you spot something that is not in the right place (especially in the dark variant).

    Michele Bologna dark variant theme
    Michele Bologna dark variant theme

    Under the hood

    For you techies out there, to roll out your dark variant for your website, you need:

    1. Good taste in style and colors (might be subjective)
    2. CSS and prefers-color-scheme directive

    All the CSS rules specific to the dark variant will be delimited by the prefers-color-scheme: dark selector in this way:

    @media (prefers-color-scheme: dark) {
    [...]
    a, .site-info > a {
    color: #33C9FF;
    [...]
    

    If you are using WordPress, a good starting point is Adding Dark Mode Styles (CSS) To A WordPress Theme.

    Happy tweaking!

  • Rec Room: una toolchain per lo sviluppo web creata da Mozilla

    Segnalo quest’interessante framework rilasciato da Mozilla, Rec Room, che contiene una toolchain per lo sviluppo di applicazioni web.

    Non è qualcosa di nuovo: contiene tutte le liberie opensource più diffuse come Handlebar, Ember.js and Stylus [per citarne alcune].

    L’installazione è molto semplice, via npm (npm install -g recroom).

    Dateci un’occhiata: la prossima web-application che realizzerò userò sicuramente Rec Room!

     

  • IIS e Office: come risolvere il problema COMException (0x80004005)

    Ultimamente mi è capitato un problema a runtime durante l’utilizzo di un’applicazione .NET che accedeva ad Office (più in particolare a PowerPoint).

    L’applicazione genera, server side, un file PowerPoint. Tuttavia il processo si blocca durante l’invocazione di PowerPoint con un errore poco parlante (“PowerPoint could not open the file“), nonostante il file PowerPoint da utilizzare come base di partenza sia effettivamente presente nella directory indicata nel source code:

    System.Runtime.InteropServices.COMException (0x80004005): PowerPoint could not open the file. at Microsoft.Office.Interop.PowerPoint.Presentations.Open(String FileName, MsoTriState ReadOnly, MsoTriState Untitled, MsoTriState WithWindow) at

    Dopo un po’ di ricerca, per risolvere questo problema si deve creare una directory vuota (provare per credere) in questa posizione, in base al sistema operativo su cui gira IIS:

    Windows 2008 Server x64 - C:\Windows\SysWOW64\config\systemprofile\Desktop
    Windows 2008 Server x86 - C:\Windows\System32\config\systemprofile\Desktop

    Riavviate IIS, e non otterrete più l’errore indicato.

  • HTML5 e CSS avanzato: una guida per (re)-impararli

    Nonostante HTML5 sia ancora un release candidate al momento della scrittura di questo post, molte delle peculiarità del linguaggio sono supportate dai browser più evoluti (Chrome, Safari, Firefox, Opera ed IE10).

    Ho deciso di fare un ripasso delle principali istruzioni di typesetting (e di imparare anche i nuovi tag) presenti in HTML5 e delle principali proprietà presenti in CSS. Per questo ripasso mi sono affidato a due guide ben scritte da Shay Howe:

    • Guida base HTML/CSS (comprende anche HTML5 e CSS3). Non fatevi ingannare dalla presenza della parola “base”, perché i concetti esposti sono tutt’altro che base. Per esempio, grazie a questa guida ho ripassato il box-model e il posizionamento degli elementi in CSS [vi ricordate la differenza tra static, relative, absolute e fixed?]. Segnalo anche la presenza della guida ai gradienti CSS3, un’esauriente carrellata di tutte le lists [sapete usare una definition list?], i nuovi controlli per i form in HTML5, gli onnipresenti nuovi tag per audio/video ed infine le tabelle [sapete cos’è la property border-collapse?];
    • Guida avanzata HTML/CSS. Dopo aver assimilato i concetti presenti nella guida precedente, in questa guida segnalo alcuni concetti interessanti come gli sprite CSS, i selettori CSS composti (:nth-child), i preprocessori HTML e CSS (haml e SASS).

    Entrambe le guide sono ben fatte e ricche di consigli preziosi come la minification, l’abilitazione di mod_gzip e tante altre informazioni utili. Da salvare nei bookmark!

  • Validazione dei form: jQuery o HTML5?

    Quando si realizza una form in HTML, è d’obbligo implementare una validazione dei dati inseriti (sia per verificare l’effettiva correttezza dei dati inseriti, sia per una questione di sicurezza). La validazione può essere realizzata lato client (tipicamente via JavaScript) o lato server. Nella mia esperienza, la soluzione migliore è quella di utilizzare un approccio ibrido: validazione lato client (via jQuery) e validazione lato server (tramite un linguaggio dipendente dall’applicazione realizzata); questo approccio garantisce una migliore distribuzione dell’onere di validazione, sia una maggiore robustezza del controllo (cosa succede se un browser non supporta/disabilita JavaScript?).

    Attualmente, la migliore soluzione per la validazione lato client è quella di usare jQuery in combinazione con un plugin di validazione (io ho sempre utilizzato Validation). L’utilizzo del plugin è veramente semplice: basta dichiarare le regole di validazione (eventualmente usando una regexp) e chiamare il metodo validate() sulla form che vogliamo validare. Il plugin si preoccuperà di evidenziare con un bordo rosso i campi non correttamente validati, è offrirà la possibilità di inserire un messaggio custom per guidare l’utente nella corretta compilazione del campo.

    Un approccio molto più recente, e adatto ai browser che già supportano HTML5, è quello di utilizzare la validazione nativa offerta dai componenti, ad esempio: il tag input, specificando il type implementa una validazione nativa in base al tipo passato come argomento, come ad esempio l’email.

    <input type="email" name="email" size="20" maxlength="28">
    

    In particolare segnalo l’attributo pattern che permette di specificare una regexp per la validazione (proprio come nel plugin per jQuery).
    Per l’inserimento di eventuali messaggi di errore, si sfruttano le proprietà CSS3, vi rimando a questo interessante post per l’approfondimento.
    La soluzione via HTML5 è senz’altro preferibile ma apre un problema di compatibilità: cosa succede con i browser più datati? Ancora una volta, un approccio ibrido sembra essere la soluzione ideale: jQuery per la validazione sui browser più datati e HTML5 per i browser più evoluti.

  • AJAX per applicazioni web: la mia recensione

    ajax_applicazioni_web

    Nell’epoca del Web 3.0 ho letto questo libro che tratta (a grandi linee, come vi spiegherò tra poco) di AJAX, la enabling technology del Web 2.0.

    Ma cos’è AJAX? È un insieme di tecnologie (tra cui Javascript e XML) che permettono lo scambio di dati tra client e server in modo asincrono, permettendo di realizzare le cosiddette RIA (Rich Internet Applications, come Gmail).

    Il libro è molto compatto (342 pagine) ed è composto da 12 capitoli. A mio avviso il libro è fin troppo generico e discorsivo; si dilunga infatti un po’ troppo sulla teoria tralasciando la parte pratica, a volte presentando listati di codice senza nemmeno spiegarli. Inoltre, ci sono alcuni capitoli in cui si assiste ad alcune divagazioni discorsive che non portano da nessuna parte (si introducono Python, Django, Ruby, Rails e PHP ma non vengono poi utilizzati). Solo nel capitolo introduttivo viene spiegato il funzionamento di xmlHttpRequest e come utilizzarlo: dopodiché, nel libro, non verrà quasi più menzionato.

    Il libro è utile a chi vuole ottenere una panoramica teorica delle tecnologie utilizzate per lo sviluppo web, ma non di più.

  • Online JavaScript Deminifier

    Se vi trovate a dover debuggare del codice JavaScript che è minified (per ottimizzare il trasferimento viene applicato il minifying, ovvero vengono tolti tutti gli spazi inutili nel codice), dovete passare per un deminifier/unminified (o beautifier). In ogni caso, un tool che vi permetta di leggere il codice JavaScript senza “incrociare gli occhi“.

    A tal proposito ho provato JSBeautifier e ne sono rimasto soddisfatto. Segnalo anche Javascript Deminifier (per Firefox).

  • HTML5, video in autoplay e iOS4

    Come sapete i dispositivi handheld di Apple (iPhone, iPad e iPod Touch) non permettono di visualizzare contenuti Flash (per fortuna, dico io), ma permettono di sfruttare tutte le nuove potenzialità messe a disposizione da HTML5, come la possibilità di visualizzare video e animazioni (che fino a poco tempo fa erano prerogative di Flash). In tempi molto rapidi, HTML5 è stato eletto come la soluzione alternativa a Flash, se non addirittura come soluzione definitiva a Flash.

    Un’opportunità interessante che viene offerta da HTML5 su iOS4 (l’ultima release del sistema operativo di iPhone, iPad e iPod Touch) è la possibilità di visualizzare video integrati in una pagina web tramite il tag <video>, e realizzare il cosiddetto autoplay (il play automatico di un video non appena si visualizza la pagina).

    Fino alla versione di iOS3, per realizzare l’autoplay esisteva un workaround che faceva ricorso ad un fakeclick in jQuery (simulava il click del video).

    Da iOS4 in poi, il workaround non funziona e siamo costretti a modificare il codice (semplificandolo!). Vediamo come.

    Prima di tutto dobbiamo utilizzare il nuovo tag di HTML5, ovvero il tag video, indicando il video di cui vogliamo che venga fatto il playback in automatico:

    <video id="myVideo" width="640" height="480" controls>
    <source src="video.mp4" type="video/mp4; codecs=’avc1.42E01E, mp4a.40.2′">
    </video>
    

    In secondo luogo, tramite JavaScript, indichiamo al browser che il video deve essere lanciato in autoplay:

    window.onload = function() {
        var pElement = document.getElementById("myVideo");
    
        pElement.load();
        pElement.play();
    };
    

    Come vedete, rispetto alla soluzione “workaround” per iOS, il codice è più semplice e comprensibile (non richiede nemmeno jQuery).
    E in più, la soluzione è retrocompatibile con iOS3.

    Link alla Link al post [Matthew Congrove].

  • Primi passi con CSS3: creiamo un gradiente e bottoni dagli angoli arrotondati (rounded corners)

    La versione in sviluppo di CSS, la versione 3, introduce alcune novità molto interessanti per gli sviluppatori web.

    In questo post vi parlerò di due funzionalità molto interessanti, introdotte in CSS3:

    • Un box con lo sfondo a gradiente (sfumatura da un colore all’altro);
    • Un bottone con gli angoli arrotondati (rounded corners).

    A lato vi anticipo, con uno screenshot, il risultato finale (il compito di trovare browser decenti è lasciato come esercizio al lettore).

    Il supporto a CSS3 è, comunque, ancora in fase sperimentale. Il mio consiglio è quello di testare con tutti i browser (soprattutto IE) il proprio lavoro prima di rilasciarlo.

    [A proposito: browsershots è un servizio gratuito che visualizza la pagina richiesta usando tutti i browser disponibili. Il funzionamento è molto semplice: specifichiamo una pagina e scegliamo i browser di cui vogliamo gli screenshot; una volta realizzati gli screenshot li possiamo scaricare sul nostro PC e visualizzarli.]

    Iniziamo quindi con la prima funzionalità di CSS3: i gradienti. Per realizzare un gradiente sono necessarie poche righe di CSS:

    #container {
            [...]
        border: 1px solid #FBDCAE;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#FBDCAE'); /* Gradiente: IE */
        background: -webkit-gradient(linear, center top, center bottom, from(#FFFFFF), to(#FBDCAE)); /* Gradiente: Chrome e Safari */
        background: -moz-linear-gradient(top,  #FFFFFF,  #FBDCAE); /* Gradiente: Firefox */
    }
    

    In particolare, tralasciando l’istruzione riguardante il border, abbiamo introdotto tre direttive per realizzare il gradiente. Notiamo che in tutte le istruzioni è obbligatorio specificare il colore iniziale (bianco, #FFFFFF) e il colore finale (arancio, #FBDCAE). In particolare

    • La prima riguarda il browser IE. Specifichiamo soltanto i colori iniziali e finali:
      filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#FBDCAE');

    • La seconda istruzione riguarda il browser basati su WebKit (Chrome e Safari). In questo caso abbiamo alcune possibilità di customizzazione, come ad esempio il tipo di gradiente (lineare o radiale), la direzione del gradiente (dall’alto verso il basso, da un angolo all’altro, etc.). Nel nostro caso, abbiamo realizzato un gradiente lineare partendo dall’alto verso il basso, e partendo dal bianco per arrivare all’arancio. Per avere più informazioni sui parametri che possiamo passare, vi invito a leggere Safari CSS Visual Effects Guide: Gradients.
      background: -webkit-gradient(linear, center top, center bottom, from(#FFFFFF), to(#FBDCAE));
    • Infine, l’ultima istruzione riguarda le direttive per realizzare il gradiente per il browser Firefox. Anche in questo caso specifichiamo il colore di partenza e quello di arrivo, e la direzione del gradiente (parte dall’alto con un gradiente lineare). Per avere più informazioni sull’istruzione vi invito a leggere la pagina di riferimento su Mozilla Developer Center, -moz-linear-gradient:
      background: -moz-linear-gradient(top,  #FFFFFF,  #FBDCAE)

    Passiamo ora ai pulsanti con gli angoli arrotondati (rounded corners). In questo caso, come avete visto dagli screenshot precedenti, IE non supporta la specifica per i rounded corners (e quindi presenta i “soliti” pulsanti rettangolari, a meno di usare workarounds).

    Le istruzioni CSS3 necessarie per avere bordi arrotondati sono molto semplici:

    input {
        -moz-border-radius: 10px;
        -webkit-border-radius: 10px;
        [...]
    }
    

    Andiamo con ordine:

    • Per il browser Firefox, specificando -moz-border-radius e un valore corrispondente, si introduce un bordo arrotondato con raggio di curvatura pari al valore in pixel specificato (nel nostro caso 10 pixel).
    • Per Safari e Chrome, utilizziamo la proprietà -webkit-border-radius e un valore corrispondente, come nel caso precedente.

    Fine! Ora potete utilizzare i gradienti e i rounded corners nelle vostre pagine web. Come avete visto, possiamo applicare le proprietà descritte ad ogni elemento (non solo agli input come ho descritto nel post, ma anche ai div, vedete i sorgenti allegati!).

  • La situazione della compatibilità con HTML5 dei browser più utilizzati

    HTML5 sta arrivando. Apple, Microsoft e Google stanno già sostenendo lo sviluppo e l’implementazione di questo nuovo standard; avendolo provato con mano quando lo utilizzo su YouTube HTML5 Beta per guardare i video senza il Flash Player di Adobe, ne sono già entusiasta [Nota: mi guardo bene, per ora, dal prendere posizioni a favore/a sfavore di Flash].

    Fatta questa premessa, il sito HTML5 test permette di valutare quanto è aderente alle specifiche il browser che stiamo utilizzando. Il sito è in continuo sviluppo ma è un buon mezzo per conoscere quanto il browser che utilizziamo è pronto al salto verso HTML5.

    Di conseguenza mi è venuta la curiosità di sapere quale fosse il browser (stabile) che raggiungesse il punteggio più alto in questa “competizione”, ed ho ottenuto questi risultati:

    • Windows Internet Explorer (rendering Trident) 8.0.7600.16385: 19/160
    • Mozilla Firefox (rendering Gecko) 3.6.3: 101/160
    • Apple Safari (rendering WebKit) 4.0.5 (6531.22.7): 113/160
    • Google Chrome (rendering WebKit) 4.1.249.1064 (45376): 118/160

    Conclusioni

    • Non ho testato Opera/Presto
    • Internet Explorer ottiene un punteggio molto basso rispetto ai suoi concorrenti, che tutto sommato ottengono un punteggio molto simile
    • Chrome ottiene il punteggio più alto: Google sta spingendo molto su HTML5 (una prova è YouTube in HTML5).