Archivi categoria: internet

Conversione automatica valuta estera PayPal su eBay… guardacaso

Ok, è da ieri che anche impostando manualmente la conversione della valuta estera su paypal alla mia carta di pagamento, questo dal sito paypal nel percorso astruso delle impostazioni, comunque il pannello di pagamento di ebay non mi permette di far valere questa opzione e di default usa il cambio valuta di paypal, che naturalmente applica commissioni più care di quelle della mia banca.

Cerco su internet diverse guide, e sembra che qualcun altro stia avendo lo stesso problema, anche fuori dall’italia (vedi qui), nonostante abbia impostato tale parametro correttamente su sito paypal.

Chiamo il numero verde, diversi minuti di attesa, e l’operatrice mi dice:

Lo sappiamo, è un problema tecnico che ci è noto e al momento non esistono soluzioni né ci hanno comunicato i tempi previsti per il rientro della questione

MA GUARDA CHE STRANO CASO. NEANCHE FOSSE UN PALESE CONFLITTO DI INTERESSI PER PAYPAL RISOLVERE LA QUESTIONE.

PERCHE’ SE LA RISOLVESSERO NON PRENDEREBBERO PIU’ LE LATROCINANTI COMMISSSIONI SUL CAMBIO.

E SE INVECE IL PROBLEMA PERSISTE LORO GUADAGNANO ALLEGRAMENTE GRAZIE A QUESTO DISGUIDO.

Ops sto scrivendo tutto maiuscolo.

Aggiornamento
Anche pagando col metodo “carta di credito” dal pannello paypal, e inserendo manualmente i dati della carta, COMUNQUE la valuta viene cambiata in automatico da paypal, e questo senza che appaia una preview del prezzo convertito in euro prima di cliccare su “Conferma e paga”, come invece accade se ci si appoggia al conto paypal.

VER-GO-GNO-SO.

A giuochi conclusi (se mai si concluderanno questi giochi, secondo me sono solo prove tecniche di appropriazione indebita forzata) dovrebbero quantomeno riconoscere un rimborso sul conto paypal di ciascuna delle persone coinvolte, pari alla cifra spesa in più per colpa di questo “disguido”.

Ma che sia un disguido non ci credo proprio.

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).

Le “subitate” (i contatti più pazzi ricevuti su Subito.it e eBay annunci)

Dopo l’ennesima offerta folle ricevuta per un oggetto in vendita, ho deciso di aprire questo post per riportare tutti i contatti assurdi ricevuti, come venditore, tramite Subito.it ed eBay annunci, i due siti di compravendita gratuiti più usati in Italia.

La più gettonata in assoluto, per qualunque oggetto:

ancora disponibile?

dopodiché nel 95% dei casi non si fanno più vivi (a questo punto penso sia un modo come un altro per fare phishing di indirizzi email)

Segue breve sezione con tutti i messaggi chiaramente di phishing di indirizzi email:

  • è la vostra voce ancora in vendita? quanto vuoi per la vendita? Vorrei conoscere la condizione di questo oggetto ora ..
  • sella salut est ce point encore disponibles à la vente
  • ciao buon giorno sono interessato a questo tuo bene, se è disponibile
  • hallo Verkäufer sind d Versandbereitschaft 4 sale wenn ja freundlicherweise mailen Sie mir jetzt ……
  • Hi is this item still available??? holla back asap Sent From My virgin Mobile®
  • Voglio comprare questo articolo da voi e sono pronto a pagare
  • Ciao,
    Il mio nome è Samuel Ezechiele.
    Il tuo tuo oggetto ancora disponibili per vendita??
    Sono molto interessato ad acquistare immediatamente.
    Mi ha gentilmente risposto nel più breve tempo possibile.
    Grazie.
    Il capitano Richard.
  • ditemi se questa voce è ancora disponibile per la vendita
  • è la vostra voce ancora in vendita e in buone condizioni.
  • ww45149 , Ciao! Sembra un buon affare, posso contattarti?
  • vorrei comparare

Di tutto un po’ (le voci più recenti saranno aggiunte mano a mano in cima a questa lista):

  • si ma nuovi le vendono a 200 accetti 100 euro? (condizionatore proposto a 400€, mai utilizzato ed imballato da qualche anno, e che vendevo al 70% del costo più basso trovato su internet per lo stesso modello)
  • 200 in contrassegno (vedi sopra)
  • facciamo 200 euro e lo passo a prendere anche domaniii (desktop completo a 250€, scritto chiaro e tondo “non mi chiedete sconti”)
  • ciao, il telefono con il problema auricolare è difficilmente vendibile, 40€ mi sembra un po troppo se per te va bene per liberartene posso offrirti 20€ fammi sapere (cellulare Android  a 40€, con l’auricolare interno difettoso, ma perfettamente funzionante con auricolare a filo o bluetooth)
  • 20 euro ritiro ad albano (vedi sopra)
  • Salve, a me potrebbe interessarmi il tubo, sa dirmi forse il prezzo per il trasporto a siracusa??? Grazie (quantità considerevole di tubature da irrigazione, ad un ottimo prezzo, ma assolutamente non spedibili per il volume occupato)
  • salve il prezzo e per tuto ? e puoi spedire ? sempre a mio carico perche abbito a milano si puoi fammi sapere quanto costa spedizione (vedi sopra)
  • 20 euro (telegrafico; era una stufa a gas svenduta a 30€)
  • interessatro acquisto prezzo 50 euro compreso trasporto pagamento postapay saluti (PC a 60€)
  • fa schifo buttala è meglio (sedia a rotelle)
  • Ma si può mettere l’annuncio di una sedia a rotelle ( e che sedia…) nella categoria delle bici? Ignorante!!! (il represso di turno… e non c’erano categorie più appropriate tra cui scegliere, incredibile ma vero)
  • Salve..8 comprese spese? GRAZIE (scheda audio a 10€)
  • ti pago il passaggio di proprietà (vecchia auto funzionante a 200€)
  • ciao mi chiamo Paolo non ho lavoro da offrirti, sono sincero, però ho visto la foto del tuo annuncio e sono rimasto colpito sei davvero molto bella, mi farebbe piacere conoscerti se me lo permetti, ti lascio la mia mail (risposta ad un annuncio per ripetizioni di matematica inserito per conto della mia ragazza)
  • salve con 30 euro + spedizione me lo vende (portatile funzionante da 50€)
  • BUTTALOOOOOOO!!!!! (portatile di cui sopra)
  • 270 euro e vengo a ritirarlo io…di piu nn interessa (pc superaccessoriato a 350€)
  • me ne serve uno….che ci faccio con tre computer ? (3 pc venduti “in blocco”)
  • buona sera se facciamo 15 euro me la vengo a prendere puoi farmi sapere (lavatrice funzionante svenduta a 30€)
  • ciao sono stefano!!15 euro e me lo vengo a prendere (disco esterno 2.5″ da 60GB a 25€)
  • Salve, posso offrire 10€ massimo, capisco che l’offerta sia al di sotto della richiesta ma l’hd è un pò piccolino come capienza (vedi sopra)
  • CIAO SENTI D OVE ABITI
  • senti se tela seti chiamami queste è il mio numero
  • Ciao e BUON ANNO. La macchina è molto vecchia e considerando l’età da un giorno all’altro potrebbe non funzionare più. Ciò premesso al max potrei arrivare a 50 Euro con spedizone in contrassegno. So già che dirai che è una cifra ridicola e piuttosto lo regali o lo butti. Al posto Tuo farei anche io così. Concludo suggerendo che se non lo vendi, NON REGALARLO, piuttosto buttalo, perché sia amici, sia parenti, se qualcosa va storto il meno che Ti può capitare è … bella macchina che mi hai regalato, ho perso tutti i dati che avevo caricato … della serie “CURNUTO e MAZZIATO” … ciao e SCUSA per mio suggerimento Roby (portatile datato ma perfettamente funzionante, a 70€)
  • offro 30 euro. (cellulare con TV da 60€)
  • salve, le mie finanze non mi permettono di spendere più di 40 euro (come sopra)
  • *Conclusioni* Forse è meglio se lo tieni per te. Gli utenti come te purtroppo stanno rovinando il retrocomputing ;-( Buona serata (pc storico IBM… lo voleva regalato per preservare la gloria del retrocomputing?)
  • ti offro 20 euro ok? (scheda madre integrata Atom, venduta a 50€)
  • buona sera,se soni ancora disponibili ,posso offrire non piu’ di € 200,00.grazie. (due poltrone capitonné d’epoca a 500€)
  • senti sono interessato alcquisto di entrambi a 50 euro, non intendo chiederti sconti solo di regalarmi la spedizione (due dischi esterni da 500GB, 70€)
  • Ciao, volevo poporti di vendercelo a 50euro più le sp dato che ho gia’ la maggior parte del corso (corso completo originale Fabbri, 100€)
  • compro tutto prezzo foufee

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.

Fare il backup compresso del database MySQL con PHP e inviarlo come allegato email

Ero un felice utente di MySQLDumper fino a quando Tophost non ha aggiornato i server all’architettura cloud e all’ultima versione di PHP, cosa che ha comportato la scomparsa di un paio di moduli PERL necessari e mi ha lasciato a terra (la routine PHP di MySQLDumper è molto lenta ed usa javascript per ricaricare le pagine, il che la rende incompatibile sia con wget che cronjob remoti come SetCronJob.com).

Così ho cercato e trovato due guide su internet (questa, e questa), le ho mischiate assieme potenziando soprattutto il codice di David Walsh, ho aggiunto un pizzico di compressione bzip2, e ho messo il tutto sul mio spazio web.

Ho rimosso la parte in cui è possibile selezionare quali tabelle salvare: ho pensato che un backup degno di questo nome è “all-inclusive”, e in fondo chiunque avesse il bisogno particolare di salvare solo alcune tabelle dovrebbe essere anche piuttosto navigato da poter modificare il codice in proprio.

AGGIORNAMENTO 9/9/11: siccome ne avevo bisogno (lo script andava incontro ad un errore di memoria insufficiente) ho aggiunto qualche riga per riattivare la lista delle tabelle da ignorare, basta riempire l’array con i nomi che vi servono.

Questo è il risultato:

<?php
$creationstart=strtok(microtime()," ")+strtok(" ");

$dbhost="indirizzo.server.mysql";
$dbname="nomedatabase";
$dbuser="usernamemysql";
$dbpass="passwordmysql";

$mailto="scrivimi@lamiacasella.it";
$subject="Backup DB";
$from_name="Il tuo caro sito web";
$from_mail="noreply@ilmiosito.it";

mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname);

$tablesblocklist=array(
    "tablename1"=>1,
    "tablename2"=>1,
    "tablename3"=>1,
);
$tables = array();
$result = mysql_query("SHOW TABLES");
while($row = mysql_fetch_row($result))
$tables[] = $row[0];
foreach($tables as $table) {
if (!isset($tablesblocklist[$table])) {
$result = mysql_query("SELECT * FROM $table");
$return.= "DROP TABLE IF EXISTS $table;";
$row2 = mysql_fetch_row(mysql_query("SHOW CREATE TABLE $table"));
$return.= "\n\n".$row2[1].";\n\n";
while($row = mysql_fetch_row($result)) {
$return.= "INSERT INTO $table VALUES(";
$fields=array();
foreach ($row as $field)
$fields[]="'".mysql_real_escape_string($field)."'";
$return.= implode(",",$fields).");\n";
}
$return.="\n\n\n";
}
}
$filename='db-backup-'.date("Y-m-d H.m.i").'.sql.bz2';

$content=chunk_split(base64_encode(bzcompress($return,9)));
$uid=md5(uniqid(time()));
$header=
"From: ".$from_name." <".$from_mail.">\r\n".
"Reply-To: ".$replyto."\r\n".
"MIME-Version: 1.0\r\n".
"Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n".
"This is a multi-part message in MIME format.\r\n".
"--".$uid."\r\n".
"Content-type:text/plain; charset=iso-8859-1\r\n".
"Content-Transfer-Encoding: 7bit\r\n\r\n".
$message."\r\n\r\n".
"--".$uid."\r\n".
"Content-Type: application/octet-stream; name=\"".$filename."\"\r\n".
"Content-Transfer-Encoding: base64\r\n".
"Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n".
$content."\r\n\r\n".
"--".$uid."--";
mail($mailto,$subject,"",$header);

$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "Backup del database completato, compresso a bz2 e spedito per posta elettronica in $creationtime secondi";
?>

(WordPress ha rimosso l’indent e non ho voglia di aggiustarlo a mano)

L’intera routine viene completata in circa 7secondi sul mio non tanto sveglio server Tophost, inclusi la compressione bzip2 e l’invio per posta elettronica, mentre il salvataggio del file in formato solo testo nel codice originale di David impiegava sullo stesso server 17secondi; probabilmente la differenza è dovuta alla rimozione di diversi cicli ridondanti, e all’uso delle funzioni native mysql_real_escape_string() e implode().

Sinceri ringraziamenti vanno ai rispettivi autori delle guide, senza le quali non stare scrivendo questa paginetta oggi 😉

reCAPTCHA manca lo scopo, che sia un bypass o un crack lo spam passa

Mi piace(va) l’idea dietro reCAPTCHA, bloccare lo spam mentre si aiuta la digitalizzazione dei libri, e diciamocelo, le immagini di reCAPTCHA sono più leggibili all’occhio umano rispetto ai codici alfanumerici deformati prodotti dai normali codici antispam.

Tuttavia, anche se ho il plugin Akismet attivo, siccome i commenti sono dietro captcha immaginavo che non avrei ricevuto alcuno spam, di certo non da bot, ed invece ne è sempre arrivato, soprattutto nell’ultimo periodo in grande quantità e per messaggi tutti uguali tra loro; stava succedendo anche sul forum punbb del mio sito professionale, dove era in azione un plugin recaptcha, e capite come trovarsi a sorpresa un post pieno di link a siti a luci rosse, con tanto di immaginette oscene, sia controproducente per la mia immagine.

Come mai succede tutto questo? Forse un inquinamento del database di reCAPTCHA con tecniche particolari di spamming per cui alcune parole chiave vengono sempre riconosciute come corrette, oppure tecniche di OCR avanzate, o infine il disoccupato della porta accanto pagato qualche millicent per ogni captcha risolto. Non me ne importa poi tanto, quello che conta è che lo spam continua a passare.

Indiragionpercui ho deciso di abbandonare del tutto reCAPTCHA e passare ai cari vecchi captcha generati tramite PHP, vedremo cosa succederà, su questo sito ora è in azione il plugin SI Captcha (immagino derivi da Secure Image, riconosco lo stile).

This article has been Digiproved

Template in PHP, il più veloce tra preg_match, file_get_contents e strpos

Lavorando al sito di reecycle.it, il frecycling italiano per il riciclo degli oggetti, sto dedicando molta attenzione alla gestione del carico sul server Apache di Tophost, e quindi ho deciso di eseguire dei test per verificare quale fosse il metodo più veloce per caricare i template delle varie sezioni del sito (un template è un “modello” di pagina -o parte di pagina- in codice HTML, nel quale vengono inseriti i dati dinamici prodotti dall’engine del sito).

Tutti i template di reecycle.it sono stati inizialmente creati sottoforma di tanti file .html (uno per ogni template) con dei %tag% rimpiazzati tramite la funzione str_replace() prima dell’output, ma ho pensato che forse c’erano modi diversi e più rapidi per ottenere lo stesso risultato; infatti ogni pagina può contenere anche fino a 5 o più template diversi (il layout generale, quello del pannello di login e del modulo di ricerca semplice, il layout della tabella dei risultati di ricerca, e quello delle singole righe della tabella), e cioè richiedere ben 5 operazioni di accesso e lettura su altrettanti file diversi sull’hard disk (trascurando per ora la cache del disco); probabilmente è più rapido leggere una sola volta un unico file grande contenente tutti i template e caricarlo in memoria, e quindi estrarre di volta in volta le sezioni che ci interessano; questo ultimo passaggio può esser fatto in due modi diversi, ovvero con un paio di righe di codice “pulite” tramite la funzione preg_match() ed una espressione regolare, oppure con un “accrocco” meno elegante ma più grezzamente rapido come strpos() e substr() che richiede invece diverse righe di codice.

In pratica, dovevo scoprire quale fosse, tra i tre metodi (template in file separati, template su file unico con estrazione tramite regular expression, e template su file unico con estrazione tramite strpos/substr) quello più veloce. Ero già sicuro che strpos/substr avessero una performance migliore di preg_match, ma ho incluso tutti i metodi per completezza.

Questa è la routine che ho usato:

<?php
$creationstart=strtok(microtime()," ")+strtok(" ");

for ($i=0;$i<1000;$i++) {
 $text=file_get_contents("full.html");
 for ($n=1;$n<=8;$n++) {
 preg_match("/<!--{$n}\(-->(.*)<!--\){$n}-->/s",$text,$matches);
 $html[$n]=$matches[1];
 }
}

$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "preg_match: ".$creationtime."<br />";

/////////////////
$creationstart=strtok(microtime()," ")+strtok(" ");

for ($i=0;$i<1000;$i++) {
 $text=file_get_contents("full.html");
 for ($n=1;$n<=8;$n++) {
 $start=strpos($text,"<!--$n(-->")+strlen("<!--$n(-->");
 $ending=strpos($text,"<!--)$n-->");
 $html[$n]=substr($text,$start,($ending-$start));
 }
}

$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "strpos/substr: ".$creationtime."<br />";

////////////////////
$creationstart=strtok(microtime()," ")+strtok(" ");

for ($i=0;$i<1000;$i++) {
 for ($n=1;$n<=8;$n++) {
 $html[$n]=file_get_contents($n.".html");
 }
}

$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "file_get_contents: ".$creationtime."<br />";

dove full.html è il singolo file HTML contenente tutti i template (8 in tutto, consistenti in paragrafi del tipo lorem ipsum di varia lunghezza), identificati tramite <!--numerotemplate(--> e <!--)numerotemplate--> tra i quali era presente il codice da estrarre di ogni template, mentre i singoli template erano salvati come file nominati da 1.html a 8.html.

Quello che fa il codice è, per ogni metodo, ripetere 1000 iterazioni in cui vengono caricati tutti i singoli template, dall’1 all’8, e misurare il tempo impiegato. L’utilizzo non è del tutto realistico, siccome il codice del template è in realtà costituito da HTML su più linee, e non poche ma lunghe righe di testo, e i template non vengono mai caricati tutti assieme, ma ne servono solo alcuni per ogni pagina, nondimeno prestazioni migliori in questo test indicano anche prestazioni migliori con un utilizzo reale (SBAGLIATO! controllate in fondo per maggiori dettagli).

Ebbene, il risultato del test è stato il seguente:

preg_match: 1.8984
strpos/substr: 0.0681
file_get_contents: 0.1352

I tempi finali variavano ovviamente ad ogni refresh, da un minimo (per preg_match) di 1.4s fino ad un massimo di 3s, ma i rapporti tra i valori rimanevano sostanzialmente costanti, cioè la combinazione di strpos/strsub su singolo grande file è più veloce del doppio rispetto al metodo file_get_contents chiamato per ogni singolo file, ma quello che mi sorprende è come il metodo preg_match sia nientemeno che quasi 30 volte  più lento di strpos/strsub, e di rimando 15 volte più lento che costringere il server a leggere più volte singoli file (ma penso che qui ci sia lo zampino della cache del disco).

Menomale che il supporto tecnico di tophost mi aveva suggerito invece proprio di usare preg_match su un unico file piuttosto che file_get_contents su più file.

AGGIORNAMENTO:

Ho appena testato questo benchmark con i template reali di reecycle.it… quanto mi sbagliavo.

Ho creato una funzione su reecycle.it per recuperare i template, in modo che se il template richiesto non si trova nell’archivio a singolo file, viene caricato dal singolo file html, e in modo trasparente aggiunto in fondo all’archivio unico in modo da poter essere caricato da lì per le occorrenze future; alla fine ho ottenuto un file supertemplate.tpl di 37kb contenente (quasi) tutti i template di reecycle.it. Ho modificato la routine presentata sopra in modo che usasse i template reali (sia l’archivio a singolo file, sia i file separati per ogni template) escludento però il metodo con preg_match per ovvi motivi, ed i risultati si sono invertiti! Usare file_get_contents sui singoli template era veloce il doppio rispetto ad usare strpos/substr sull’archivio unico.

Do la colpa a due cose: il file è effettivamente grande, quindi le funzioni devono gestire un pacchetto dati molto più ampio, e specialmente i tag sono nel formato dei commenti HTML, quindi strpos viene confuso dai numerosi tag simili presenti nella stringa.

In effetti, dopo aver modificato l’archivio dei template in modo che i tag di delimitazione fossero tipo {tag(} and {)tag} invece che <!–…–>, i risultati sono tornati come quelli attesi, e la combinazione di strpos/substr era più performante di file_get_contents chiamato più volte, e maggiore era il numero di template richiesto, più aumentava la differenza di velocità tra i due metodi; riguardo a questo potete controllare i risultati del mio post successivo.

This article has been Digiproved

Proteggere i propri contenuti digitali su WordPress da copia e plagio con una marca temporale

E’ già da un po’ che ho deciso di rilasciare tutto quello che scrivo sui miei siti sotto licenza Creative Commons. Perché vi chiederete? Ogni volta che pubblico qualcosa online, chiunque abbia accesso ad internet può leggerlo; se lo trova interessante e vuole diffonderlo, con una licenza più stringente dovrebbe chiedermi il permesso ecc ecc; se i miei contenuti piacciono, e ci sono persone che vogliono copiarli altrove per renderli più accessibili, a me fa piacere, basta che sia chiaro che l’autore sono io e non ci sia nessuno che prova a prendersi il merito per il mio lavoro (cosa che ovviamente mi farebbe imbestialire). La licenza CC che ho scelto è la NC-SA, che impedisce l’uso commerciale dei miei contenuti (chiaramente se qualcuno è in grado di ricavare soldi dal mio lavoro, voglio la mia buona parte di guadagno), e permette il riutilizzo degli stessi solo se vengono rilasciati con la stessa licenza (non accetterei l’idea che qualcuno riarrangi il mio lavoro a suo piacimento per poi chiuderlo in cassaforte, anche se non è suo).

Bene, fin qui ci siamo. Ma cosa succede se qualcuno vi vuole “rubare” i contenuti? Tutto ciò che scrivete (disegnate, componete, e così via) è legalmente vostro non appena lo scrivete (purché sia originale, è ovvio), ma dovete comunque provarlo qualora ci sia un contenzioso. Se qualcuno che copia uno o più articoli dal vostro sito decidesse di andare in giro a dire che quegli articoli sono in realtà suoi, e siete voi ad averglieli copiati, cosa succede? La sua parola contro la vostra.

L’unico modo per provare legalmente che un testo è di vostra proprietà, è provare che il testo era in vostro possesso da prima che ce lo avesse chiunque altro; la parola chiave è “marcatura temporale” (timestamp in inglese); un timestamp deve essere valido (cioè non deve essere possibile dimostrare che è falso, ed esistono accorgimenti appositi che vanno oltre gli scopi di questo articolo), e deve essere associato alla vostra identità; è sempre meglio ottenere una marca temporale prima di pubblicare gli scritti, infatti se un “avversario” fosse in grado di scaricare immediatamente dal vostro sito quello che avete scritto, e certificarlo prima che possiate farlo voi, diventerebbe tecnicamente il proprietario del vostro lavoro.

Ci sono diversi modi per ottenere una marcatura temporale, gratuiti ed a pagamento, più o meno affidabili. Un servizio gratuito di marcatura digitale è Timemarker, ma è interamente “a mano”, cioè dovete collegarvi al sito, fornire i vostri contenuti, e scaricare la risultante firma PGP con la marca temporale; io lo uso per archivi ed immagini.

D’altro canto (ed è proprio questo l’argomento del sito) se i contenuti che volete proteggere sono articoli scritti nel vostro blog WordPress, l’unico buon servizio gratuito a disposizione dei blogger occasionali come me (cioè quelli che non vivono col loro sito web) è il plugin Copyright Proof per WordPress (l’archivo plugin di wordpress.org ha sempre la versione più aggiornata), che offre il servizio migliore in assoluto per il suo prezzo (zero). Appena registrato un account sul sito Digiprove (offrono anche marcature temporali a pagamento per gli utenti professionali e/o che non usano WordPress), otterrete un codice personale da inserire nella pagina di impostazioni del plugin, che quindi si occuperà automaticamente del resto: appena premete il pulsante “Pubblica” nell’editor di WordPress, prima di pubblicare l’articolo il plugin invia l’intero contenuto ai server di Digiprove e ottiene le informazioni relative alla marca temporale, quindi l’articolo verrà messo online assieme al link che punta al timestamp (potete modificare l’aspetto sia del link sul vostro sito, che delle informazioni visualizzate sui server di Digiprove; un esempio di link si trova in fondo a questo post). Allo stesso modo, se modificate il vostro post, il plugin otterrà una marca temporale aggiornata, e i vecchi timestamp, anche se non più riportati nel post, saranno ancora validi e presenti sui server Digiprove.

Uso questo servizio da un paio di mesi (cioè sin da subito, dopo esser passato a WordPress). Cian Kinsella, il presidente di Digiprove, mi ha informato che stanno aggiornando il modo in cui il plugin funziona, per creare “al volo”, dinamicamente, il codice HTML del certificato all’interno del post (attualmente l’HTML viene aggiunto al testo dell’articolo, e lo stile CSS è applicato direttamente all’interno dei tag), e che molto probabilmente aggiungeranno una funzione da me richiesta, una specie di “archivio dei vecchi certificati”, grazie al quale i visitatori potranno accedere ad una serie di link che puntano a tutti i certificati rilasciati per quel post nel corso del tempo (alla prima pubblicazione, e per ogni modifica successiva), siccome attualmente i link ai certificati più vecchi vengono persi e viene mantenuto solo l’ultimo rilasciato (ma i timestamp veri e propri rimangono sempre sui server di Digiprove). Questa funzione tornerà utile a chi, come me, preferisce aggiornare un post già esistente con delle nuove informazioni sullo stesso articolo, piuttosto che aprire nuovi post.

Per concludere, anche se Cian è presidente di due società, e non conosco la sua agenda quotidiana ma immagino sia piuttosto pregna, è comunque riuscito a rispondere personalmente tutte le volte che ho scritto al supporto, e questa è una buona cosa!

  This article has been Digiproved

Progetto tessera sanitaria, certificati medici online, ma per favore.

In famiglia sono il più “tech-savvy”, e questo significa che ogniqualvolta ci siano difficoltà, più o meno banali, con tutto ciò che riguarda la “tecnologia”, io sia coercitivamente chiamato in causa.

…e chi chiamerai? Ghooostbusters ephestione!

Ebbene, stavolta è stato il turno di un parente medico, alle prese con il sistema di certificazione online per l’INPS, e per certificati di malattia di vario tipo; arrivo senza sapere quale sia il problema reale, ma sapendo comunque che, da qualche parte, l’inghippo si troverà. Cominciamo dall’inizio.

L’indirizzo del sito è www.sistemats.it, e prima di realizzare che si legge “sistema T-S”, l’istinto è di pronunciarlo “sistemaz”. Un altro nome potevano trovarlo. Il conforto però giunge quando, inserito l’URL nella barra degli indirizzi del browser, si viene ridiretti al seguente URL:

http://sistemats1.sanita.finanze.it/wps/portal/

Che senso ha? Anche se il sito è ospitato sui server del ministero delle finanze, avrebbero potuto mantenere sistemats.it come dominio root, per coerenza.

Cliccando sul link home, l’URL diventa magicamente qualcosa tipo (tenetevi forte):

http://sistemats1.sanita.finanze.it/wps/portal/!ut/p/c1/04_SB8K8xLLM9MSSzPy8xBz9CP0os_gwL2dLZwODYAP_UG9jA6MAf3Mvk6AQAwMPM30_j_zcVP2CbEdFAGkQrCE!/dl2/d1/L2dJQSEvUUt3QS9ZQnB3LzZfVkpDOUMwMFMwT1VLMzAyUE83SjRSVDAwSDY!/

I cookie di sessione dove li abbiamo dimenticati?

Fin qui, il problema non si pone molto, in fondo una volta arrivati sul sito X, chi è che torna a guardare cosa si trova nella barra degli indirizzi? (e questo è un motivo per cui molte persone rimangono vittima di scam e spoof di vario tipo.)

Una prima considerazione è d’uopo: molti medici, soprattutto i più “grandi”, a meno di non possedere uno spiccato interesse personale verso l’informatica, una volta messi davanti ad un pc sono delle vere e proprie capre (in senso buono, s’intende). L’obbligarli a rilasciare certificazioni unicamente per via non solo digitale, ma per giunta telematica, ha imposto su di essi un onere umano immenso; inoltre, lasciati a sé stessi, con in mano degli sterili fogli arrivati per posta, che pretenderebbero di spiegare in modo chiaro il funzionamento del sistema, fornendo allo stesso tempo i dati di accesso composti da codici alfanumerici, significa averli persi per sempre nei meandri di un universo sconosciuto e spaventoso.

home sistemats
La home del sito sistemats.it

Ora, questa è la pagina home del sito. Non so voi, ma io ho dovuto impiegare una buona manciata di secondi per trovare la sezione per autenticarsi. Mi sarei atteso un modulo di login con i campi per nome utente e password in alto a destra, oppure un link “Login/Entra/Accedi” ben visibile nel menu, ma non riuscivo a trovare nulla del genere. La mia banner-blindness mi ha impedito di far caso all’icona nell’angolo in alto a destra, con il link apposito. Risolto, penserete? Macché.

certificato non riconosciuto
Finanze e sicurezza, un dicotomio

Subito dopo aver cliccato sul link per “accedere con credenziali” ci si trova di fronte a questo. Nessun problema per me, immagino sia privo di rischi l’accettare un certificato proveniente dal ministero delle finanze, ma ricordate che stiamo parlando di qualcosa rivolto ai medici di famiglia, capre davanti ad un computer. Cosa fa il medico in questo caso? Giustamente, perso nell’universo parallelo del digitale, usa un mezzo a lui ben noto, il telefono, per mettersi in contatto col servizio di assistenza. Risposta?

Deve avere qualche problema di sicurezza con l’antivirus

Tralasciamo, dopotutto alla fine ha fatto una cosa sensata, ed invece di disattivare AVG (ammesso che sarebbe riuscito) ha deciso di chiamar me.

Quindi accetto il certificato e proseguo, mi trovo ora davanti a quello che dev’essere il form di login più userfriendly della storia:

login sistemats
Il form di login

Il livello di zoom della pagina nel browser non è stato modificato in alcun modo, anzi, per sicurezza, in Firefox ho anche cliccato su Visualizza>Zoom>Reimposta. Mentre io sfruttavo la mia vista ancora buona, il medico accanto a me si ciecava strizzando gli occhi a 15cm di distanza dal monitor cercando di capire cosa ci fosse scritto a schermo.  Se non altro, siamo rassicurati dal fatto che

Per qualunque chiarimento rivolgersi al proprio Amministratore di Sicurezza

Chi sarebbe costui?

Premo CONFERMA (perché non “Entra”?) contemplando il pulsante RIPULISCI (perché non “Cancella”?). E soprattutto, perché entrambi i pulsanti sono ombreggiati in modo da sembrare già premuti?

Mi autentico, cambio la password standard fornita dalla società che, per conto del ministero, gestisce il sistema, ed il medico comincia a prendere confidenza col pannello utente. Ma non prima di aver dovuto scegliere le domande di sicurezza. Sì, perché se yahoo e google ti permettono di scegliere tra “Come si chiama il tuo gatto” e “Qual era il nome della tua prima fidanzatina”, per tutelarti qualora dovessi dimenticare la password, il sito in questione ti chiede di scrivere a mano sia la domanda che la risposta, per due volte. Altri 5 minuti persi così aspettando che la fantasia ormai scossa del medico partorisse una coppia di domande di autenticazione.

Troviamo il link per “Inviare un certificato (medico)”, finalmente. Ci si clicca sopra, e ricompare un secondo errore da Firefox per un certificato di sicurezza non riconosciuto, ma ormai siamo preparati all’imprevedibile e superiamo l’ostacolo. Un paio di giri di prova con logout seguito da login autonomo del medico, per accertarsi che avesse acquisito il metodo, e via verso nuovi orizzonti.

Tornato a casa, mi sono voluto divertire anche ad esaminare il sito dal lato tecnico. Per prima cosa, i badge di XHTML e CSS del W3C (quanti siti li mettono in mostra senza usare codice validato). Il sito è in XHTML 1.0 valido (persino strict), mentre il badge del CSS punta alla pagina del validator vuota, senza specificare di validare automaticamente il link referer; quindi non mi sono dato la pena di inserire a mano l’URL, mi fido.

Veniamo al sorgente, vero aspetto in cui il sito si distingue. Non bene, ma l’importante è che si distingua.

La prima riga di codice è la specifica del DOCTYPE, e si trova alla quindicesima riga, le 14 righe precedenti sono vuote, le ultime due di queste contengono alcuni spazi randagi prima del carriage return.

La riga successiva, il tag di apertura <html>, si trova alla riga 34.

Il codice prosegue così, tra fulgidi biancori di righe desertificate, ed un numero straordinariamente elevato di <!--commenti html--> lasciati dovunque, alcuni con abbondante markup html inutilizzato, altri con commenti veri e propri riguardo al codice.

Il più caratteristico comincia così:

<!-- Modifiche Anto 2007-11-14 R1.1 [...]

Passando il codice HTML della homepage nel servizio HTML minifier (che rimuove tutto ciò che non viene visualizzato, quindi non solo spazi tabulazioni e carriage return, ma anche, appunto, i commenti) i bytes da scaricare si riducono nientemeno che del 43%. Per confronto, ho eseguito lo stesso test con alcune pagine di un sito il cui codice è stato interamente scritto da me, e la compressione si aggira attorno al 10%.

Che altro dire?

  This article has been Digiproved

Ridimensionare, espandere o ridurre una image map HTML con uno script PHP

Sto creando un portale per un sito che avrà una simpatica cartina dell’Italia con le regioni cliccabili, messe in evidenza da un overlay in javascript. Ho trovato a questo scopo una imagemap già pronta e gratuita con relativa immagine di accompagnamento, ma era troppo piccola per essere utilizzabile, e quindi avevo bisogno di ingrandirla; allargare l’immagine è un compito elementare, ma modificare le coordinate della imagemap non era qualcosa che avevo intenzione di fare a mano!

Dopo aver cercato soluzioni già pronte, ma senza frutto alcuno, ho elaborato uno scriptino PHP che assolve esattamente questo compito. Questo script inserisce il codice HTML della image map in una stringa, e quindi elabora questa variabile di testo con una regular expression (se non conoscete le espressioni regolari non spaventatevi, all’inizio non ci capivo nulla neanch’io) che cerca e sostituisce i valori numerici al bisogno. A me serviva semplicemente di raddoppiare le dimensioni della cartina, lasciando ovviamente le proporzioni intatte, ma siccome sto pubblicando questa guida, ho deciso di modificare lo script (testato come funzionante) in modo che possa ridimensionare le coordinate in modo diverso per gli assi orizzontale e verticale, in modo che ad esempio possiate raddoppiare la larghezza di un’immagine, e dimezzare l’altezza.

Questo è uno script di esempio (la stringa $html è associata alle sole coordinate della regione lazio, per motivi di spazio, comunque potete copiare all’interno della variabile tutto il codice HTML della imagemap, compresi i tag <map>, i ritorni a capo e l’indentazione. Prestate attenzione a fare un ESCAPE delle doppie virgolette all’interno del codice HTML prima di inserirlo nella stringa, in altre parole dovete mettere un backslash (cioè il carattere \) davanti a tutte doppie virgolette (il carattere ) per non corrompere la definizione della stringa; per questo io ho usato la funzione cerca e sostituisci di Notepad++.

<?php
$html="<area  href=\"#\" alt=\"state\" title=\"lazio\" shape=\"poly\"  coords=\"74.513,86.938,75.667,87.365,75.667,88.007,74.744,89.077,75.436,90.467,76.359,90.039,77.857,90.039,78.319,90.039,79.127,90.788,79.588,91.857,79.588,92.606,80.049,93.034,80.51,93.034,81.317,94.103,81.779,94.852,82.24,94.959,83.74,94.852,84.201,94.959,85.123,94.959,86.392,94.103,87.43,93.141,88.122,93.141,89.39,93.141,89.967,92.713,91.351,90.895,91.813,90.895,92.274,91.216,93.196,90.895,94.349,90.788,94.926,90.467,96.31,89.825,96.886,90.467,96.656,90.895,95.849,91.323,95.387,92.072,94.234,92.072,92.965,92.713,92.505,93.676,92.505,94.317,92.734,94.959,91.928,95.28,91.813,95.922,91.467,96.778,92.505,98.382,92.505,99.023,92.505,99.986,91.928,101.804,91.928,103.194,92.734,103.837,94.234,103.623,96.31,104.264,97.579,105.013,99.309,106.51,102.191,108.543,103.229,108.543,104.728,109.077,106.113,110.361,106.574,111.965,106.804,113.035,106.574,113.783,106.574,114.425,105.882,114.853,105.305,115.067,104.844,115.067,104.728,116.029,104.728,117.099,104.152,118.061,103.46,118.703,102.999,119.345,102.999,120.093,101.961,120.308,100.23,120.735,99.539,120.308,98.271,119.345,96.656,118.489,95.156,118.275,92.965,118.489,91.005,118.703,89.39,116.885,89.506,116.029,88.122,114.639,85.931,113.997,83.97,112.607,81.548,110.574,78.55,107.687,77.627,105.869,76.128,104.692,74.975,102.874,73.706,101.056,71.745,99.023,70.131,97.098,67.594,94.959,69.093,93.676,70.131,92.606,70.592,91.216,70.592,90.039,71.745,89.611,72.553,88.649,73.014,88.221,72.553,86.938,73.245,86.189,74.513,86.938\"  />";
echo preg_replace("/([0-9.]{2,}),([0-9.]{2,})/e","round(\\1*2,3).','.round(\\2*1.5,3)",htmlentities($html));
?>

Tutto quello che dovete fare è cambiare i parametri di ridimensionamento evidenziati in rosso, nell’esempio la mappa immagine viene raddoppiata orizzontalmente, e moltiplicata di una volta e mezzo verticalmente. Se volete aumentare le dimensioni di tre volte, usate questa riga:

echo preg_replace("/([0-9.]{2,}),([0-9.]{2,})/e","round(\\1*3,3).','.round(\\2*3,3)",htmlentities($html));

Una volta fatto, copiate lo script PHP sul vostro server, apritelo con un browser, e fate copia/incolla. Fate attenzione ad un particolare: nel mio esempio la image map conteneva solo le coordinate separate da virgole e nient’altro, quindi ho dovuto usare questa espressione regolare… se nel vostro caso tra le coordinate sono presenti spazi, tabulazioni o altre cose, avrete quasi sicuramente bisogno di modificare l’espressione per farla funzionare. Se siete persi, scrivete nei commenti con un estratto dal codice HTML della imagemap e vedrò di darvi una mano.

This article has been Digiproved