Archivi categoria: guide

Firmware con root e senza cloud dell’aspirapolvere robot Xiaomi

Per saltare alle istruzioni, senza leggere l’interessantissimo e utile preambolo, clicca qui.

Il Mi Robot, anche conosciuto come Xiaomi Vacuum Robot, o Mijia Robot, è un aspirapolvere che vale ben più del suo prezzo (attualmente lo si trova a 210€ spedito con offerte che vengono periodicamente ripetute), con la mappatura della casa, il percorso intelligente di pulizia, e il ritorno automatico alla base per ricaricarsi e poi continuare, se il primo passaggio non può essere completato con la capacità di carica residua.

Sono usciti numerosi modelli successivi, quello direttamente a lui superiore è il Mijia 1S, che aggiunge 200MPa di potenza massima di aspirazione, dei percorsi “ancora più intelligenti”, una telecamerina sul dorso per spiare riconoscere ancora meglio casa nostra, e la possibilità di definire stanze, e impostare nmuri virtuali, direttamente dal programma. Quest’ultima funzione in particolare è quella secondo me più interessante, perché evita di dover acquistare i costosissimi, e francamente brutti. cordoli di plastica nera per delimitare le aree di casa.

Come tutti i prodotti Xiaomi però ha un difettaccio brutto: si collega al cloud della casa madre per caricare una pletora di dati ignoti (in quanto crittografati), che in particolare per questo modello saranno i dati del WiFi e la piantina di casa… non so voi, ma a me scoccia assai.

Il metodo più semplice per bloccare evitare questo comportamento, è evitare del tutto di collegarlo all’applicazione, lasciandolo quindi orfano di rete; questo però significa che il robot manterrà aperto il suo AP hotspot WiFi senza password, al quale chiunque potrà collegarsi, anche il vicino di casa dall’altra parte del muro. Inoltre questo non permette di visualizzare la piantina di casa, comandarlo da remoto, ecc ecc.

Potete inoltre associarlo all’applicazione Mi Home, avendo però l’accortezza di bloccare tramite router le connessioni esterne originate dal MAC address del robot, in modo che non possa inviare dati rimanendo comunque accessibile dall’applicazione; però a quel punto potrebbe essere Mi Home a inviare dati al posto del robot… AHHHH che dilemma.

A proposito, se avete problemi di connessione tra Mi Robot e Mi Home, accertatevi di aver attivato il GPS e aver concesso all’applicazione il permesso di accedere ai dati di geolocalizzazione, altrimenti non si collegherà mai… ahi questi cinesi.

Insomma, ci vorrebbe un modo per farlo funzionare senza collegarlo al cloud, ma mantenendo piantina, controllo remoto, e magari aggiungendo altre funzioni interessanti.

Quello che segue è un tutorial pane e salame:

  1. Scaricare l’applicazione XVacuum, disponibile per Android e iPhone/iOS
  2. Scaricare un firmware con root e Valedudo precompilato al suo interno, potete usare questo servizio, che è configurabile, oppure scaricare le versioni pronte da questo archivio (Gen1 corrisponde al primo Mi Robot, Gen2 al roborock S50 e atri, Gen3 al Mijia 1S ed altri, che attualmente non sono rootabili)
  3. Resettare il wifi del robot (nel Gen1 basta tenere premuti i due pulsanti principali fino a ricevere la notifica vocale)
  4. Collegare il proprio smartphone alla rete wifi del robot (disattivando la linea dati che altrimenti verrebbe usata di default causa assenza di connessione internet)
  5. Aprire l’applicazione XVacuum, e verificare che la connessione al robot sia stata effettuata
  6. Premere il pulsante per eseguire il flash del firmware, e selezionare il file .pkg che avrete ottenuto al punto 2
  7. Attendere che il firmware sia prima scaricato dal robot, e quindi installato
  8. Ri-collegarsi alla rete wifi del robot, con la linea dati disattivata, e aprire sul browser del telefono l’indirizzo 192.168.8.1
  9. Andare nella sezione impostazioni, aprire la sezione WiFi, e impostare i dati di connessione alla propria WiFi di casa/ufficio (dovrete poi ricollegarvi al WiFi di casa, e cercare l’IP che avrà assunto il robot, questo è compito vostro)
  10. Potete scaricare da questo archivio il file .pkg delle voci del robot, e dalla sezione Impostazioni/Voci dell’interfaccia web di Valetudo, caricare il pkg che verrà immediatamente installato

Buon divertimento!

Lettura di una fattura elettronica firmata xml p7m con PHP

Se il file di fattura elettronica che bisogna aprire è firmato digitalmente, e cioè ha una seconda estensione p7m, come avete notato il contenuto è tutto sommato leggibile ad occhio perché non viene oscurato, ma semplicemente “inquinato” dai blocchi della firma digitale.

Diventa però inutilizzabile da qualunque parser PHP, e richiede la estrazione del file XML dall’involucro firmato p7m.

Lista della spesa:

  • il programma openssl.exe scaricabile da questa pagina (vi serve lo zip dei file binari)
  • il file .xml.p7m

La sintassi del comando openssl è come segue:

openssl.exe smime -verify -noverify -in fattura.xml.p7m -inform DER -out fattura.xml

Quindi nel vostro bel codice PHP lancerete qualcosa tipo:

exec("percorso\openssl.exe smime -verify -noverify -in $fatturap7m -inform DER -out percorso\\".basename($fatturap7m,".p7m").".xml",$output);

Avrete quindi disponibile il file XML in chiaro, col quale potrete seguire quanto illustrato in questo articolo.

Lettura della fattura elettronica XML con PHP

Visualizzare e formattare in HTML una fattura elettronica con del codice PHP concettualmente è semplice, ma scrivere un apposito programma che fa un parsing del codice XML, e quindi disegnare un layout HTML in cui inserire i dati ottenuti, è uno spreco di tempo, se lo si fa solo per “guardare” la fattura senza doverla ulteriormente processare in modo automatizzato.

Per questo ringraziamo AssoSoftware che fornisce liberamente il suo foglio di stile XSL (in realtà ne esiste anche uno ufficiale rilasciato da Sogei, ma… vabè non devo aggiungere niente su Sogei e quindi se volete provatelo, e mi saprete dire nei commenti quale vi piace di più), il quale applicato all’XML originale seguendo questa guida restituisce una gradevole formattazione tabellare completa di annotazioni.

D’accordo lo ammetto questo articolo dai risultati di ricerca sembra essere fuorviante, perché io stesso cercando una routine che leggesse l’XML per restituire delle variabili in PHP, ho trovato il mio articolo pensando “vuoi vedere che l’ho già scritta io questa routine e me ne sono dimenticato?” ed invece no… quindi non essendoci altre risorse realmente utilizzabili per il PHP, credo proprio che ora mi ci metterò io a scrivere la routine…

Ho rimediato e l’ho appena scritta.

Questo è uno snippet del mio reale codice, per chi bazzica di PHP è comprensibile. E’ incompleto siccome mi serviva solo a recepire i dati che vanno inseriti nel registro acquisti, ma la logica dietro è abbastanza chiara per poterlo estendere a vostro piacimento.

$xml = simplexml_load_string($source);

$supplier = $xml->FatturaElettronicaHeader->CedentePrestatore->DatiAnagrafici->Anagrafica->Denominazione;
if (!$supplier) {
	$supplier = $xml->FatturaElettronicaHeader->CedentePrestatore->DatiAnagrafici->Anagrafica->Nome . " " . $xml->FatturaElettronicaHeader->CedentePrestatore->DatiAnagrafici->Anagrafica->Cognome;
}
$supplierpiva = $xml->FatturaElettronicaHeader->CedentePrestatore->DatiAnagrafici->IdFiscaleIVA->IdCodice;
$suppliervia = $xml->FatturaElettronicaHeader->CedentePrestatore->Sede->Indirizzo;
$suppliercivico = $xml->FatturaElettronicaHeader->CedentePrestatore->Sede->NumeroCivico;
$suppliercap = $xml->FatturaElettronicaHeader->CedentePrestatore->Sede->CAP;
$suppliercomune = $xml->FatturaElettronicaHeader->CedentePrestatore->Sede->Comune;
$supplierprovincia = $xml->FatturaElettronicaHeader->CedentePrestatore->Sede->Provincia;

$invoicedate = $xml->FatturaElettronicaBody->DatiGenerali->DatiGeneraliDocumento->Data;
$invoiceno = $xml->FatturaElettronicaBody->DatiGenerali->DatiGeneraliDocumento->Numero;
$invoicewhat = $xml->FatturaElettronicaBody->DatiGenerali->DatiGeneraliDocumento->Causale[0];
if (!$invoicewhat) $invoicewhat=$xml->FatturaElettronicaBody->DatiBeniServizi->DettaglioLinee[0]->Descrizione;


foreach ($xml->FatturaElettronicaBody->DatiBeniServizi->DatiRiepilogo as $riepilogo) {
	switch ($riepilogo->AliquotaIVA) {
		case "22.00":
			$imponibileord = $riepilogo->ImponibileImporto;
			$impostaord = $riepilogo->Imposta;
			break;
		case "10.00":
			$imponibilerid = $riepilogo->ImponibileImporto;
			$impostarid = $riepilogo->Imposta;
			break;
		case "4.00":
			$imponibilemin = $riepilogo->ImponibileImporto;
			$impostamin = $riepilogo->Imposta;
			break;
		case "0.00":
			$esente = $riepilogo->ImponibileImporto;
			break;
	}
}

Importare dati per creazione e invio file spesometro all’agenzia delle entrate

Dopo una terribile esperienza con l’inserimento manuale di tutti i dati delle fatture degli scorsi anni, ho programmato nel mio gestionale la fatturazione automatica, e così con i dati grezzi a disposizione mi sono deciso a studiare il formato del file dello spesometro, e sono quindi riuscito a crearlo in modo corretto, pronto per essere inviato con estensione ccf all’agenzia delle entrate.

Il file non è in formato XML, ma in formato testuale con una codifica ben precisa e stringente, scomoda da utilizzare, e ancor prima da capire.

Ad ogni modo, il software che ho scritto è in grado di leggere i dati (a partire da Excel o da un file CSV) di fatture emesse (modulo FE, SOLO per contribuenti operanti in regime di esezione IVA… come il sottoscritto; ho deciso di non spendere tempo a prevedere anche le fatture con IVA non producendole) e fatture ricevute (modulo FR), sia con imposta che esenti IVA, e compilare l’intero file dello spesometro.

Offro quindi la possibilità a chi sia interessato di creare tale file, a partire dai vostri dati fiscali e elenchi di fatture; è sufficiente scrivermi in privato o sui commenti per ottenere una quotazione.

Collegare in parallelo pannelli fotovoltaici di potenza diversa

Questo articolo è scritto in linguaggio “terra terra”, e non è indirizzato al perito elettrotecnico di turno, che sicuramente non avrà bisogno di leggere questa breve guida per sapere cosa fare; non aggreditemi quindi per i toni estremamente semplicistici.

Se siete finiti qui, è perché vi state chiedendo se è possibile collegare in parallelo due o più pannelli solari differenti, ebbene la risposta è: dipende!

Partiamo da due premesse:

  1. Se volete collegare più pannelli fotovoltaici assieme, significa che dovete alimentare uno o più dispositivi assetati di energia
  2. Se vi ponete il problema del “si può fare?“, significa che immaginate perlomeno che i pannelli, se non identici, devono essere comunque di caratteristiche simili

Essendo valide queste premesse, la risposta è sì, si possono collegare più pannelli solari in parallelo purché simili, ed entrambi con un diodo di protezione.

La caratteristica più importante è che abbiano lo stesso voltaggio, o un voltaggio molto vicino tra loro: ad esempio due pannelli da 5V, oppure un pannello da 18V e uno da 20V; è meno importante invece che abbiano anche la stessa potenza, cioè la stessa corrente in uscita.

Il voltaggio, collegando i pannelli ad un carico, si abbassa necessariamente ai capi di entrambi i pannelli, quindi anche se il pannello da 18V entrerà in azione “dopo” quello da 20V, entrambi comunque parteciperanno alla produzione della corrente (il pannello più debole non entra in azione “dopo” in realtà, ma semplicemente copre una parte inferiore del carico, in proporzione alla sua capacità di produrre potenza); i diodi di protezione, utili soprattutto sul pannello con voltaggio o amperaggio inferiore, servono a evitare che ci sia un flusso contrario di corrente dal pannello più potente a quello più debole, con un “furto” energetico di cui risentirebbe il dispositivo da caricare.

Come va montato il diodo? Prima di tutto è preferibile usare un diodo tipo Schottky (praticamente quelli che potete smontare dalle lampadine a risparmio energetico esaurite), e lo si può collegare al polo positivo del pannello, con la righetta bianca del diodo sul lato più lontano dal polo positivo stesso.

L’esempio pratico della fattibilità della cosa l’ho ottenuto collegando una lampadina led usb ad un pannello da 5V/5W, e successivamente aggiungendo in parallelo a quest’ultimo un altro pannello da 5V/3.5W: la luce della lampadina aumenta istantaneamente, questo perché la lampadina costituisce un carico rilevante per il primo pannello, al punto che aggiungendo il secondo, meno performante, comunque anche questo è in grado di fornire potenza sfruttata dalla lampadina.

Convertire una micro-SIM in una scheda SIM normale, senza adattatore

Vi può capitare di avere tra le mani una microSIM per una qualche promozione (ad esempio, guardacaso, la super smartphone di Wind), ma dovete metterla in un telefono che accetta SIM di dimensioni normali.

Potete farlo senza attendere che vi arrivi per posta un costoso adattatore (perché dite quello che vi pare, ma pagare qualunque cifra sopra i 50cent per un francobollo di plastica ritagliato, secondo me è troppo costoso).

L’importante è NON rimuovere la microsim dalla sua matrice formato carta di credito!

microsim convertita all'interno della matrice
Questo è quello che faremo, ritagliare una cornice attorno alla micro-SIM dandole la forma di una normale SIM
confronto larghezza sim microsim
Confronto della larghezza della microsim nella sua scheda formato carta di credito, con una SIM normale, notare l’allineamento dei bordi delle piazzole
riferimento larghezza sim sulla matrice
Avendo perfettamente allineato i contatti della SIM con quelli della microSIM (dovete naturalmente guardare le piazzole che hanno i segnetti dei contatti, cioè quelle effettivamente usate) marcate i bordi laterali con del nastro isolante
sagoma sim sulla matrice della microsim
Fate lo stesso con i bordi superiore e inferiore, allineando stavolta le due schede in modo che i chip siano alla stessa altezza
adattamento microsim quasi finito
Il risultato grezzo dopo aver inciso lungo i bordi con un taglierino ed un righello a tenere la retta, le dimensioni sono leggermente eccessive ma basta poco per aggiustarle
microsim convertita e sagomata
Dopo aver tagliato via l’angolo e aver arrotondato i bordi l’aspetto è quello di una normale SIM

La scheda SIM così ottenuta funziona perfettamente nel mio Galaxy Note, anche se è un po’ più complicata da far entrare siccome è meno rigida lungo i bordi e la pista di inserimento è stretta..

Installare deluge bittorrent su Ubuntu con controllo remoto via interfaccia web

Caso tipico: avete, o volete impostare, un server domestico con Ubuntu Linux, che agisca anche da server sempre attivo per il download e upload via bittorrent.
La richiesta di risorse è molto limitata e potete resuscitare un sistema molto vecchio, ad esempio persino un vecchio laptop su cui non volete nemmeno installare l’interfaccia grafica (a patto che abbia un disco sufficientemente capiente per i file che volete scaricare).

L’idea di partenza è avere quindi un server che faccia tutto dietro le quinte, e che sia sicuro.

Questa guida è ispirata ad altre due guide: questa e quest’altra.

Se volete la spiegazione dei vari passaggi, la trovate in fondo all’articolo.

Installato Ubuntu (l’ultima versione, al momento di scrivere, è la 12.04 Precise Pangolin) eseguite i seguenti comandi:

sudo adduser --disabled-password --system --home /home/deluge --gecos "BitTorrent Service" --group deluge
sudo mkdir /home/deluge/Incoming
sudo chown deluge:deluge /home/deluge/Incoming
sudo mkdir /home/deluge/Completed
sudo chown deluge:deluge /home/deluge/Completed
sudo add-apt-repository ppa:deluge-team/ppa
sudo apt-get update
sudo apt-get install deluged deluge-webui

Quindi create il file /etc/init/deluge.conf:

sudo nano /etc/init/deluge.conf

e incollate all’interno il seguente testo:

start on (filesystem and networking) or runlevel [2345]
stop on runlevel [016]
env uid=deluge
env gid=deluge
env umask=000
exec start-stop-daemon -S -c $uid:$gid -k $umask -x /usr/bin/deluged -- -d

per salvare premete Ctrl-X e date l’ok premendo Y o S a seconda che Ubuntu sia in inglese o italiano.

Poi create il file /etc/init/deluge-web.conf:

sudo nano /etc/init/deluge-web.conf

e incollate all’interno il seguente testo:

start on started deluge
stop on stopping deluge
env uid=deluge
env gid=deluge
env umask=027
exec start-stop-daemon -S -c $uid:$gid -k $umask -x /usr/bin/deluge-web

Per avviare deluge è necessario il comando:

sudo start deluge

e per terminarlo:

sudo stop deluge

mentre per riavviarlo (ad esempio dopo modifiche alla configurazione, perché queste ultime abbiano effetto):

sudo restart deluge

L’interfaccia web di deluge si avvia e chiude contemporaneamente al demone, quindi non è necessario intervenire su quest’ultima; raggiungerla è piuttosto banale: se avete un’interfaccia grafica installata sullo stesso server, aprite un browser e dirigetevi all’indirizzo http://localhost:8112 (la password di default è deluge), altrimenti se vi collegate da un altro PC della rete, allora usate http://:8112.

Una volta ottenuto l’accesso all’interfaccia web è consigliabile effettuare alcuni cabiamenti: innanzitutto se vi compare la finestra di connessione al demone, premete il pulsante Connect, quindi dal pannello in alto premete Preferences e passate in rassegna le varie sezioni.

Vorrete probabilmente ridimensionare il numero di connessioni totali (400-500), attivare la crittografia (mettete “Enabled” e “Full stream” nelle varie opzioni e attivate la casellina), impostare correttamente le cartelle di salvataggio dei file (mettete /home/deluge/Incoming per i file in arrivo, e /home/deluge/Completed per i file che sono stati scaricati completamente), nella sezione Interface cambiate la porta di default ad una diversa, e attivate la casella SSL, cambiate la password premendo il pulsante Change sotto alle caselle di testo, e quindi riavviate deluge per attivare i cambiamenti. Se avete attivato SSL e cambiato porta, ad esempio 1234, vi dovrete collegare all’indirizzo https://localhost:1234 (oppure https://:1234), fate attenzione al protocollo, che diventa https con la “s” finale che sta per secure. Il vostro browser vi farà presente che il sito richiede dei certificati, se siete su Firefox cliccate su “Aggiungi eccezione” e salvate il certificato, oppure seguite gli opportuni passaggi sugli altri browser.

Cosa fa questa guida esattamente?

I vari comandi all’inizio servono a creare un utente riservato a deluge (invisibile dalla schermata di login, si potrebbe dire che è un account “di servizio”), in modo che una eventuale compromissione dell’account da remoto tramite una falla di sicurezza del demone deluge non metta a rischio l’intero server; viene creato un account chiamato deluge appartenente al gruppo deluge con cartella home uguale indovinate un po’ a /home/deluge nella quale verranno poi create le cartelle Incoming e Completed destinate rispettivamente ai file in fase di download ed allo spostamento di questi ultimi una volta completati. Il comando chown serve a attribuire all’utente deluge la proprietà delle suddette cartelle, siccome le creiamo come utente root.
Nella creazione dello script di avvio delige.conf il valore 000 assegnato al parametro umask serve a permettere l’accesso in lettura e scrittura alle cartelle di scaricamento di deluge da parte degli altri account del server, in modo che ad esempio non sia necessario impostare mirabolanti configurazioni multiutente per accedere via Samba alle cartelle del server da un pc Windows.
Se avete installato Samba, piuttosto, potete molto più facilmente accedere al server deluge usando, tramite rete locale, il nome del server. Se ad esempio l’hostname della macchina Ubuntu è pincopallo, una volta che avete impostato il WORKGROUP in /etc/samba/smb.conf ad un nome uguale al workgroup del vostro PC Windows, dal vostro browser preferito potete digitare semplicemente https://pincopallo:1234 (se vogliamo seguire l’esempio precedente).

Android suonerie notifiche sveglia perse o cambiate dopo il reboot

Avete appena aggiunto qualche suoneria personalizzata sul vostro telefono Android, ma dopo ogni riavvio le perdete e sono reimpostate a qualche suoneria diversa, o non suonano affatto? Come se qualcosa le reimpostasse ogni volta, o non venissero salvate correttamente?

Molto probabilmente avete copiato gli MP3 sulla scheda SD, in

  • /ringtones
  • /alarms
  • /notifications

o magari in

  • /media/audio/ringtones
  • /media/audio/alarms
  • /media/audio/notifications

(funzionano tutti allo stesso modo).

Dopo un reboot, potrebbe accadere che per qualche ragione la vostra scheda SD impkiega troppo per essere montata o scansionata, quindi Android non riesce a trovare nulla nelle cartelle specificate, perché non si sono ancora rese disponibili.

Non so se ci sono soluzione per far montare la SD più rapidamente da Android, comunque una soluzione alternativa per aggirare il problema consiste nel copiare direttamente i file nella memoria interna del telefono. Brutta scorciatoia, perché ruba spazio alle applicazioni, comunque funziona.

Quindi, prendete i vostri MP3, e copiateli (usando un file explorer root, come ES File Explorer) nella memoria interna, rispettivamente in

  • /system/media/audio/ringtones
  • /system/media/audio/alarms
  • /system/media/audio/notifications

in questo modo verranno trattati come suonerie di sistema (vedrete le altre suonerie di default in quelle cartelle, ed anzi potete cancellarle siccome sono comunque inutili, per aumenare lo spazio libero).

Redirect degli utenti mobili e desktop al corretto file CSS tramite .htaccess

La soluzione vincente per un sito compatibile con i dispositivi mobili è avere una singola struttura HTML per qualunque visitatore, e scegliere semplicemente quale foglio di stile far caricare al browser per visualizzare la pagina nel modo migliore; non sto quindi parlando di usare una sottocartella /mobile/ nella struttura del sito, né di parametri nella stringa query come ?mobile, ma mi riferisco all’utilizzare lo stesso medesimo URL per tutti, che visualizzerà ricami e fiocchetti ai browser da desktop, mentre caricherà la versione compatta e rapida per i browser degli smartphone.

Come si fa?

Prima di tutto, scrivete due differenti fogli di stile per i browser desktop e mobili, o piuttosto, come faccio io, preparate un set di CSS, dove c’è un file “common.css” che viene sempre caricato, e poi dei file “desktop.csss” e “mobile.css” che sono caricati quando opportuno. Inoltre, scaricate e installate minify per comprimere i fogli di stile e definire un gruppo “desk” e uno “mobi” da caricare con un semplice URL (la procedura che uso in un altro sito).

Quindi aggiungete nel vostro file .htaccess, abbastanza presto dopo le righe che avviano il RewriteEngine:

RewriteCond %{HTTP_USER_AGENT} !^.*(2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800).* [NC]
RewriteCond %{HTTP_user_agent} !^(w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-).* [NC]
RewriteRule ^stylesheets\.css$ /min/index.php?g=cssdesk [L]
RewriteRule ^stylesheets\.css$ /min/index.php?g=cssmobi [L]

Prima cosa, queste righe non considerano l’iPad un dispositivo mobile, perché secondo me ha abbastanza spazio su schermo per visualizzare la normale versione desktop; se la pensate diversamente, basta aggiungere la stringa “ipad” in mezzo alle varie definizioni.

Ed ora qualche spiegazione: prima di tutto i riconoscimenti per le direttive RewriteCond vanno agli sviluppatori di WP Supercache, che è un modello che sto usando per scrivere il mio sistema di caching privato (il prossimo articolo infatti parlerà proprio di questo).

Quelle righe RewriteCond fanno eseguire la direttiva RewriteRule subito successiva solo se il visitatore usa un pc (perché escludono tutti gli user agent associati a dispositivi mobili), per cui la prima RewriteRule che leggete redirige a /min/index.php?g=cssdesk cioè il gruppo dei CSS compresso per i desktop (cambiate questo URL in base alle vostre necessità). La [L] alla fine della riga dice a .htaccess di ignorare qualunque cosa venga dopo. Quando le condizioni delle RewriteCond non sono verificate, e cioè se il browser è un dispositivo mobile, la prima regola RewriteRule è ignorata, e viene usata la successiva, che invece redirige ai fogli di stile mobile.

Come vedete, reindirizzo le richieste che arrivano al file “stylesheets.css”. Sorpresa delle sorprese, questo file non esiste da nessuna parte sul sito, ed è semplicemente un riferimento posto all’interno del template HTML, mentre è .htaccess che si occupa di intercettare queste richieste e fornire i dati corretti. In questo caso, nel vostro codice HTML dovrete richiamare i fogli di stile in questo modo:

<link rel="stylesheet" href="/stylesheets.css" type="text/css" media="screen" />

I vantaggi? Il sistema è più veloce. Una operazione simile fatta da PHP (esiste un codice apposito anche via PHP) vi costerebbe sicuramente l’esecuzione di codice più lento (l’interpretazione delle direttive .htaccess è più rapida della compilazione del PHP) ed eventualmente l’inclusione di un file PHP esterno che a sua volta brucia del tempo. Inoltre questo approccio è indispensabile se volete implementare un sistema di caching che salta del tutto il PHP, perché in quel caso appunto non potreste avvalervi di codice PHP per indirizzare le richieste ai fogli di stile.