reCAPTCHA fails to deliver, bypassed or cracked, spam still comes through

I like(d)  the idea behind reCAPTCHA, blocking spam while helping scanning books is cool, and let’s be honest, reCAPCHA images are more readable to the human eye than the random deformed alphanumeric combinations the usual antispam codes produce.

Anyway, even if I have Akismet plugin installed, being the comments captcha’ed I expected almost no spam at all, not certainly from bots, yet it’s been a constant for me; lately, a huge wave of spam messages, almost identical, hitted the website; this also happened on the punbb forum of my professional website, where reCAPTCHA plugin was in action, and you understand that finding a spam post containing plenty of links with obscene thumbnails attached is not good for my image.

What’s the reason behind all this? Possibly reCAPTCHA pollution by special kind of keyword spamming to make certain known words always check positive, or advanced OCR techniques, or your average next door guy payed some millicent each captcha he decyphers. I don’t really care, what I know is that spam is passing through.

So I decided to drop reCAPTCHA altogether and switch to good old onsite captcha generation, let’s see what happens, there is now SI Captcha plugin installed (suppose SI stands for SecureImage, I recognize the pattern).

  This article has been Digiproved

La calibrazione delle batterie agli ioni di litio, punti di vista

Sono un frequentatore abituale dei forum di XDA da quando ho felicemente iniziato ad usare il mio HTC HD2 Leo (in realtà, l’ho appena portato in un centro di raccolta per farlo riparare in garanzia… touchscreen morto, sigh). Da allora, ho iniziato a leggere di “strane” pratiche riguardanti le batterie Li-Ion e l’uso che bisognerebbe farne per prolungarne la durata. Sin da prima di tutto ciò, quando ancora usavo pocketpc più anziani (tutti iPaq) avevo l’abitudine di usare la batteria fino a circa il 30% per poi ricaricarla, e evitavo per quanto possibile di ricaricarla prima che “fosse ora”; dall’altra parte, si trovano dovunque guide che sostengono che le batterie LiIon migliorano tanto di più quanto più frequentemente vengono caricate, e peggiorano con cariche infrequenti e più “piene” (sicuro, infatti tutti i possessori di portatili sono in grado di confermare come le batterie migliorano col tempo usandoli sempre attaccati all’alimentatore… come no).

Quello che segue è un estratto di una guida tratta da un sito a caso (in realtà i passaggi sono piuttosto costanti dovunque leggete, anche sui thread di XDA):

  1. Consumate la batteria fino a quando il telefono non si spegne da solo
  2. Riaccendetelo e aspettate che si spenga da solo di nuovo
  3. Rimuovete la batteria per 10 secondi
  4. Reinserite la batteria ma lasciate il telefono spento
  5. Ricaricate il telefono fino a quando non arriva al massimo, e poi ancora per un’altra ora
  6. **Solo per chi ha eseguito il root** Da un terminale, inviate il comando su, e successivamente “rm /data/system/batterystats.bin”
  7. Consumate la batteria fino a quando non si spegne il telefono
  8. Accendete il telefono e caricatelo per almeno 8 ore
  9. Scollegato il cavo dal telefono, spegnetelo, e poi ricaricatelo per un’altra ora
  10. Scollegate il telefono, accendetelo, aspettate due minuti
  11. Spegnete nuovamente il telefono, e caricatelo per un’altra ora
  12. Riprendere l’uso normale

Ora, l’ultima delle mie intenzioni è criticare il lavoro svolto da queste persone (davvero), tuttavia, personalmente (molto personalmente), penso che in qualunque punto di quell’elenco si protebbe inserire la seguente istruzione:

  • Vestitevi con un kilt a strisce bianche e verdognole, e, mentre indossate SOLO quello, durante una notte di luna piena, saltate attorno al telefono in carica urlando “LIIIITIIIOOOOOOO”

e si intonerebbe perfettamente con il tenore generale della lista.

Per precisare inoltre, quando il telefono vi dice che è completamente carico, significa che ha smesso di inviare corrente elettrica alla batteria; in altre parole, una volta che la lucetta è diventata verde, potete lasciarlo attaccato al caricabatterie un giorno intero, dal punto di vista pratico non farà alcuna differenza.

Io so di essere un caso estremo, tuttavia posso in tutta sincerità portare la mia esperienza: possiedo la batteria standard originale, ed ho comprato da venditori cinesi su ebay altri 3 cloni (1230mAh, perfettamente identiche all’originale se non fosse per un codice a barre un po’ più piccolo), assieme ad un caricabatterie da tavolo.

Uso il telefono fino a quando non scende circa al 20% di carica (ultimamente arrivo al 10%, o anche al 5% se sto facendo qualcosa che non mi va di interrompere, come guardare telefilm), quindi tiro fuori la batteria, e inserisco la successiva, carica (sono numerate da 1 a 4). La batteria esaurita finisce direttamente nel caricatore da tavolo (o in tasca, fino a quando non torno a casa).

Uso raramente il caricabatterie da accendisigari in auto, ma regolarmente uso il telefono in macchina come lettore MP3 o navigatore.

Sono arrivato, con un uso leggero, fino a 4 giorni di durata. Si, ho scritto bene, QUATTRO giorni di vita della batteria, ovviamente senza ricariche intermedie; avrò usato poco il telefono, ma si tratta pur sempre di 96 ore, e non succedeva neppure con i Nokia di 10 anni fa che la batteria durasse così tanto. Mi volete dire che con quei trucchetti la durata sarebbe ancora maggiore?

Li-Ion battery calibration, funny myth? Personal thoughts

I regularly lurk over at XDA since I started -happily- using my HTC HD2 Leo (actually, I just brought it to a collection center for warranty servicing… dead touchscreen, sigh). Since then, I began reading about “funny” practices regarding lithium ion battery usage to prolong their life. Even before that, when I still used older pocketpc’s (namely, iPaq’s) I would always run down the battery to about 30% and then recharge to full, and I avoided at most to recharge before it was “time”; on the other hand, you can often read guides saying that LiIon batteries get better the more often you recharge them, and get worse the bigger and less frequent the charges (sure, now tell me your laptop battery improves by always using it attached to the mains charger…).

Following is an excerpt taken from here (I suppose these are pretty standard steps, I’ve read similar ones on some XDA threads):

  1. Run the device down until it turns itself off.
  2. Turn it back on and wait for it to turn itself off again.
  3. Remove the battery for 10 seconds.
  4. Replace the battery, but leave the device off.
  5. Charge the device until full and then for another hour.
  6. **Root users only** Using a Terminal Emulator, type “su” enter, followed by “rm /data/system/batterystats.bin”
  7. Run the device’s battery down until it turns itself off.
  8. Turn the device on and charge for at least 8 hours.
  9. Unplug the device, turn off, then charge for another hour.
  10. Unplug the device, turn on, wait 2 minutes.
  11. Turn off again and charge for another hour.
  12. Restart and use as normal.

Now, the least of my intentions is to criticize their work in any way (believe me), yet, personally (very personally) I think you could insert in any place in that list the following statement:

  • Dress in a striped white and greenish scottish skirt, and, while wearing ONLY that, during a full moon, jump yelling “IIIOOOONNNN” around your charging phone

and it would perfectly fit in the overall mood of said list.

On a side note, when the charging device says it’s full, it stops sending energy to the battery, so for any kind of purpose you could leave the charger attached for a whole day after the led got green, it won’t really make any difference.

I am an extreme case, and I know it, but I can very honestly report my experience: I have the standard original battery, and I bought off chinese eBay other 3 clones (1230mAh, perfectly identical to the original except a slightly tinier barcode), together with a desktop charger.

I use the phone until it runs down to ~20% (lately down to 10% or even 5% if I’m doing something I don’t want to interrupt, like reading manga) at which point I take out the battery, and put inside the next charged one (I have them numbered, from 1 to 4). The drained battery goes straight inside the desktop charger (or in my pocket, until I get back home).

I rarely use the car charger, but I kind of regularly use the phone inside the car as MP3 player/navigator.

I have gotten, on very light use, up to 4 days uptime. Yes, you read it well, FOUR days uptime; I may have used it very little, yet it’s still 96 hours. Are you going to tell me that with those tricks you read about it could’ve lasted even longer?

La velocità delle funzioni PHP di ricerca su stringhe dipende dall'”ago”

Stavo giocando con alcuni test di prestazioni su dei templates nel mio post precedente, e sono incappato in una scoperta interessante riguardante il modo in cui funziona strpos, e conseguentemente tutte le altre funzioni di tipo “cerca (e sostituisci)” come str_replace, strrpos, stripos, str_ireplace, substr_replace, persino preg_match and preg_replace (ho testato solo str_replace e preg_match, ma suppongo ci siano gli stessi risultati per tutte le altre).

  1. Userò in questo articolo la convenzione di php.net, e chiamerò “ago” la stringa che state cercando, e “pagliaio” la stringa all’interno della quale effettuate la ricerca
  2. Conoscere questi risultati è utile in pratica solo se potete scegliere quali aghi inserire nel pagliaio, per poterli poi cercare successivamente, cioè se state costruendo un template
  3. Ho già cercato per controllare se questa “trovata” era già stata documentata da qualcun altro, ma così non sembra, quindi se mi fossi perso qualcosa evitate di aggredirmi

Mettiamo che stiate creando lo schema per un template, dove inserirete dei tag che dovranno essere sostituiti dai contenuti generati dinamicamente dal vostro sito. Potete chiamarli come volete purché siano stringhe uniche all’interno del modello, quindi per esempio %tag% o {tag} o <!–tag–> o ~tag~ (o come vi pare). Magari pensate che scegliere quale tipo di carattere di delimitazione usare per il nome del tag dipenda solo dai vostri gusti personali, e lo pensavo pure io prima di scoprire questa cosa per puro caso, comunque vi dico subito che se il template consiste in codice HTML ben formato, allora usare per esempio ~tag~ sarà molto più veloce che usare <!–tag–>.

Il principio generale è che cercare un ago che inizia con un carattere “raro” è molto più veloce che cercare un ago che inizia con un carattere molto comune all’interno del pagliaio.

Per esempio, se il vostro pagliaio è un estratto di un ebook, cercare “%ciao” (se presente) sarà molto più rapido che cercare “ciao”.  La giustificazione di questo? Evidentemente la funzione in C che cerca la stringa, inizia col cercare il primo carattere, e una volta trovato vede se quello successivo corrisponde, e così via; quindi cercando “ciao” la funzione incapperà in tutte le “c” per controllare se sono seguite da una “i”, se sì poi verificherà se c’è una “a”, ma se ad esempio la parola è “ciarpame”, la funzione verificando l’assenza della “o” finale dovrà scartare il lavoro ed il tempo impiegato, e proseguire. Invece il carattere “%” è raro, se non unico, all’interno di un testo “normale”, quindi la funzione dovrà “fermarsi” molte meno volte a controllare prima di trovare una corrispondenza piena.

Mettiamo questa teoria alla prova, ecco il codice:

$creationstart=strtok(microtime()," ")+strtok(" ");
for ($i=0;$i<100000;$i++) $testpos=strpos($test,"malesuarda");
$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "malesuarda $testpos: ".$creationtime."<br />";

$creationstart=strtok(microtime()," ")+strtok(" ");
for ($i=0;$i<100000;$i++) $testpos=strpos($test,"%malesuada");
$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "%malesuada $testpos: ".$creationtime."<br />";

Spieghiamo un po’ di cose: $test è una stringa relativamente lunga, definita precedentemente nel codice (è composta da un testo lorem ipsum con diversi paragrafi, per 13kb totali), all’interno della quale ho scelto una parola a caso, “malesuada“, che viene ripetuta diverse volte, e ho cambiato due occorrenze di questa parola, entrambe verso la fine della stringa, per renderle uniche, una è diventata malesuarda, cioè ho aggiunto una “r”, e l’altra (più avanti nella stringa) invece è stata modificata in %malesuada, quindi alla fine ho caricato lo script PHP; ho aggiunto un echo per $testpos in modo da confermare che le stringhe fossero state realmente trovate da strpos.

Come atteso, ecco i risultati:

malesuarda 10970: 3.5609
%malesuada 11514: 0.7632

Sostituendo strpos con qualunque altra funzione elencata all’inizio dell’articolo otterrete valori simili.

PHP search string functions performance is “needle” dependent

I was playing with some templating benchmarks in my post before this one, and bumped into an interesting find regarding the way strpos works, and consequently all similar “search (and replace)” functions like str_replace, strrpos, stripos, str_ireplace, substr_replace, even preg_match and preg_replace (I tested only str_replace and preg_match out of these, but I assume they will all bear the same results).

  1. From here on  am using the php.net convention, and will call “needle” the string you’re searching for, and “haystack” the string inside of which you’re executing the search.
  2. Knowing these results will only be useful if you can choose which “needles” to put in the “haystack” to be searched for in a later time, hence only if you’re building a template.
  3. I serched if someone else found this already, but this doesn’t appear to be the case, so if I am selling for new already known things just don’t bash me.

So let’s say you’re creating a template scheme, where you insert several tags that need to be replaced by the dynamically generated content of your website. You can call them whatever you want as long as they are unique strings inside the template, so for example %tag% or {tag} or <!–tag–> or ~tag~ (or just whatever). Maybe you think that choosing which delimiting chars to use for the tag name is only up to your personal tastes, and I did too before discovering this by accident, but I am going to guess that if the template contains well formed HTML code, then using ~tag~ is going to be much faster than using <!–tag–>.

The general principle is, searching for a needle beginning with a “rare” character is much faster than searching for a needle starting with a commonly used character inside the haystack.

For example, if your haystack is an excerpt from an ebook, searching for “%hello” (if present) will be way faster than searching for “hello”. The reason for this? The function in C that searches for the string, starts by searching for its first character, if found checks if the following one matches, and so on; so if you’re searching for “hello” the function will pause at every “h” to see if after that there’s an “e”, and if yes then checks if there’s and “l” and then another “l”, yet if the word is “hellish”, the function will not find the ending “o”, and will have to discard the work and time spent and go on with the search. The “%” character on the other hand is pretty rare inside of a “normal text”, if not unique, so the function will have to “pause” way less times before hitting a full match.

Let’s put it to the test, this is the routine:

$creationstart=strtok(microtime()," ")+strtok(" ");
for ($i=0;$i<100000;$i++) $testpos=strpos($test,"malesuarda");
$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "malesuarda $testpos: ".$creationtime."<br />";

$creationstart=strtok(microtime()," ")+strtok(" ");
for ($i=0;$i<100000;$i++) $testpos=strpos($test,"%malesuada");
$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "%malesuada $testpos: ".$creationtime."<br />";

Let’s do some explaining: $test is a fairly long string that I previously defined inside the code (it is made of a lorem ipsum kind of text, several paragraphs amounting to almost 13kb), inside of which I took a random word, “malesuada“, which is repeated several times, and I made two occurrences of this word slightly different, to render them unique; they were both towards the end of the string, I changed one into malesuarda adding a”r”, and another one (further away in the string) into %malesuada, then just loaded the PHP script; I echoed the value of $testpos as well, to confirm that the strings were actually found.

As expected, here are the results:

malesuarda 10970: 3.5609
%malesuada 11514: 0.7632

Replacing strpos with any other functions listed at the beginning of this article will deal similar results.

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

PHP templating, preg_match, file_get_contents and strpos, the fastest

While working on the website of reecycle.it, il frecycling italiano per il riciclo degli oggetti, I am spending my resources also on reducing at most the load on the Apache server of my italian shared hosting, Tophost, so i decided to make some benchmarks to see which was the best speed I could load the templates at, using different methods (a template is a “model” of a page -or part of-  written in HTML code, inside which the dynamic values loaded by the website engine are inserted).

All the templates used by reecycle.it were initially created as several .html files (one per each template) with several %tags% substituted by the str_replace() function before the output, but I thought that maybe there were different, faster ways to obtain the same result; a page can contain up to 5 or more different templates (general layout, login panel, simple search widget, search results table, and single row of the search results table), so each page could tell the server to access and load 5 different files on the hard disk (we are ignoring the disk cache for simplicity); maybe reading a single, bigger file containing all of the templates, loading it into memory, and later extracting the needed parts, is faster? This path can be taken in two ways, either by writing two “clean” lines of code using preg_match() and a regular expression, or by using a rather less “elegant” but strictly more performant combo of strpos() and substr() which instead needs several more lines of code.

In other words, I needed to know which one of the three (separate template files, single big template with regexp extraction, and single big template with strpos/substr extraction) was faster. I already knew preg_match was heaps slower than strpos/substr, yet I included it in the test for the sake of completeness.

This is the routine I used:

<?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 />";

where full.html is the single HTML file containing all the templates (a total of 8, consisting in paragraphs in lorem ipsum style, of different length), identified by <!--templatenumber(--> and <!--)templatenumber--> between which was the code to extract, while the single template files were named from 1.html to 8.html.

What the code does is, for each method it repeats 1000 iterations in which every single template is loaded, from 1 to 8, and measures the needed time to complete. This usage is not very realistic, as the template code is actually several lines of HTML code instead of few long lines of text, and templates are never loaded all together, but only those which are actually needed to draw the page; anyway, better performance in this test means better performance in real-life use (WRONG! check bottom for more details).

So, this was the result:

preg_match: 1.8984
strpos/substr: 0.0681
file_get_contents: 0.1352

Final times were obviously different at each page refresh, from a minimum (for preg_match) of 1.4s up to a maximum of 3s, anyway the relationship between them remained the same, that is the strpos/substr combination was two times faster than file_get_contents called for each file, yet what surprised me is how preg_match method is almost 30 times slower than strpos/substr, and hence 15 times slower than asking the server to read several different files together (I suppose this was due to the disk cache in action).

On a side note, the tech support of my hosting, inquired about this, suggested me to drop reading separate files in favour of reading a single file and using preg_match… go figure.

UPDATE:

I just went and tested this benchmark with real templates off reecycle.it… oh how much I was wrong.
I made a function on reecycle.it to fetch the requested template, that when the template inside the big file is missing, loads the single file template, returns it, and adds the missing template to the big single file, so after a while I got a 37kb supertemplate.tpl containing all of the templates of the website. I just changed the routines in the example above, to use the real files of the templates… and behold, the results were inverted! Using file_get_contents() on several files was two times faster than using strpos/substr on a single big file. No matter how I changed it, several, separate small files were still much faster than a single big file.

I blame it on two things: the file is actually big, so string functions have to deal with a big chunk of data to process, and especially the tag formats, since the template delimiters, practically in HTML comment format, begin with the “less than” symbol which is bound to be repeated lots of times inside HTML code, maybe confusing the strpos function.

In fact, in the templates archive file I modified the delimiting tags so they were like {tag(} and {)tag} instead of using the html comment tags <!–…–>, and the results of the benchmark went back to normal, being faster for the strpos/substr combo on the single file archive than with file_get_contents on several separate files, and the more the template requests, the faster the strpos/strsub method if compared to file_get_contents… see results of my next post.

Se vuoi cambiare la tua password, o non la ricordi, inserisci qui l’indirizzo di posta elettronica con cui ti sei registrato<br />
<form method=”post” action=”index.php”>
<table>
<tr>
<td class=”dida”>
email
</td>
<td class=”dati”>
<input type=”text” name=”resetmail” />
</td>
</tr>
<tr>
<td colspan=”2″>
<input type=”hidden” value=”resetpassword” name=”action” />
<input type=”submit” value=”Invia mail di reset” name=”sendresetpassword” />
</td>
</tr>
</table>
</form>

  This article has been Digiproved

Tophost e variabile di sessione “user” riservata in PHP

Stavo allegramente imprecando stamattina contro il server FTP del nodo8 di tophost su cui è ospitato un progetto a cui lavoro, siccome non era utilizzabile a causa di impressionante lentezza nelle risposte.

Ho colto l’occasione per rivedere alcuni aspetti del codice PHP e riordinare la gestione delle sessioni utente per renderle più funzionali, al che ho deciso di caricare in un’unica variabile di sessione, $_SESSION["user"], un array contenente tutti i dati rilevanti dell’utente per potervi accedere rapidamente senza richiedere costantemente un accesso al database.

Ebbene, non sembrava che riuscissi a far funzionare nulla, eppure è tecnicamente possibile caricare un array all’interno di una variabile di sessione. L’array veniva caricato subito dopo il login (confermato da var_dump) ma alla pagina successiva era sostituito da una stringa, corrispondente allo username MySQL del sito. Ho messo in discussione il mio codice, cercando dove fosse il problema, e modificando alcune assegnazioni (il tutto perdendo minuti ad aspettare che il server FTP accettasse gli upload), fino a quando non ho provato a cambiare il nome della variabile a $_SESSION["visitor"], e magia, ha funzionato tutto correttamente. A quanto pare, siccome non ho trovato traccia di questo in manuali “ufficiali”, i server di tophost sono impostati per accedere al nome utente MySQL tramite la variable di sessione “user”… non so cosa pensare. Qual è la variabile di sessione contenente la password MySQL?

  This article has been Digiproved

eBay e embargo verso l’Italia delle spedizioni dai venditori in Cina

Oggi sono stato per l’ennesima volta vittima della fobia italiana dei venditori ebay cinesi. Ho acquistato una custodia subacquea per il mio HD2, che però purtroppo prima non stava arrivando affatto, e quando, dopo più di 40 giorni (vicino ai 45 massimi per il reclamo paypal) è finalmente arrivata, si è dimostrata incapace di trattenere efficacemente l’acqua (test casereccio effettuato infilando nella custodia un foglio di carta igienica, e tenendola immersa sul fondo di un secchio pieno d’acqua con un peso sopra). Ho quindi contattato il venditore, inizialmente specificando il problema del ritardo nella spedizione (normalmente qui in provincia di Roma le spedizioni cinesi arrivano in un intervallo tra le tre settimane ed i 30 giorni, senza empasse doganali, ma con rare eccezioni di arrivi velocissimi in due settimane).

Ebbene, il venditore si è dimostrato molto cordiale e disposto a risolvere il problema, sia con il ritardo sulla consegna (poi rientrato), sia quando ho comunicato che l’oggetto era sì arrivato, ma inutile, siccome entrava acqua a tutto spiano. Si sono mostrati disponibili a rispedire l’oggetto, ma io ho preferito chiedere un rimborso, promettendo che appena fosse stato ricevuto avrei provveduto a un nuovo acquisto (il tutto per rinnovare il limite dei 45gg di reclamo PayPal, non si sa mai).

Quando sono andato per ricomprare l’astuccio impermeabile, mi sono visto dire da eBay che non potevo farlo, perché la spedizione verso l’Italia non era prevista (eppure lo era un mese prima quando l’ho comprato); contattando nuovamente il venditore, ho provato a farmi elargire un’eccezione, eppure mi è stato risposto che, a causa dei tempi lunghi di consegna, e dei feedback negativi ricevuti dagli utenti italiani a causa di ciò, l’embargo verso il nostro paese non era negoziabile, e quindi non potevano più vendermi l’oggetto.

Cari ragazzi, perché siete così scemi? Perché mai lasciare un feedback negativo, vi costa troppo scrivere al venditore chiedendogli di risolvere il problema? Ogni singolo venditore a grandi volumi, cinese e non, è disposto a venirvi incontro in cento modi diversi pur di avere un feedback positivo a 5 stelle, quindi contattatelo e vi rispedisce l’oggetto, oppure vi rimborsa, e subito dopo voi potete lasciargli l’agognato “full five stars positive feedback”. Così facendo invece vi incavolate voi, lasciate un feed negativo e fate incavolare il venditore cinese, rimanete a bocca asciutta, e aumentate il numero di negozi che non spediscono in Italia… proprio bravi siete! Devo ringraziare ciascuno di voi se ogni volta che trovo un oggetto ad un prezzo super, non posso comprarlo perché qualche scemo all’interno dei miei stessi confini era troppo impaziente per scrivere una letterina in inglese e chiedere di risolvere amichevolmente il problema.

Se poi il vostro problema è la dogana, cosa c’entra il venditore? So che in alcune aree il controllo doganale è stretto e antidemocratico (siccome il limite di intassabilità sono i 45 euro, eppure alcuni si vedono addebitare i fatidici 5.50euro di dazio e tasse varie, che in molti casi vanificano completamente l’affare; così mi viene detto dal mio amico Andrea che si trova nel nord-Italia), ma se ne siete a conoscenza, vuoi per forum, vuoi per esperienza diretta, evitate di comprare a prescindere, oppure acquistate da quei negozi cinesi che hanno un deposito nel Regno Unito e evitano la dogana completamente.

  This article has been Digiproved

UPS e batteria per auto, come potenziare la riserva d’emergenza

AGGIORNAMENTO: ho scritto un altro articolo che espande e potenzia questa idea, lo trovate qui.

E’ da un po’ che avevo un UPS accantonato in un angolo, perché la batteria interna non ne voleva sapere di reggere un pc neppure per un paio di secondi; ed era da un po’ che mi ero ripromesso di comprare prima o poi da ebay o altrove una batteria di ricambio, ma desistevo sempre visti i prezzi poco invitanti; intanto il mio piccolo server domestico continuava a spegnersi occasionalmente per blackout o cali di tensione.

L’altro giorno ho trovato una batteria da macchina buttata in un angolo; in casa abbiamo alcune batterie per auto ferme e inutilizzate anche se funzionanti, che teniamo come scorta in caso dovessero servire, e sono tutte di risulta, assolutamente non nuove, ma smontate da macchine vecchie e dismesse, quindi anche se non sono vergini, si trovano in condizioni di perfetta usabilità.

car battery
Quando ho visto questo macigno mi è venuto subito in mente di vedere se era carico e funzionante, e di collegarlo all'ups fermo ormai da anni

Teoricamente, la batteria per macchina è da 12V, si tratta pur sempre di un accumulatore al piombo, e quindi non dovrebbe esserci alcuna limitazione al suo uso in abbinamento ad un normale UPS per computer, ma mi sono documentato per sicurezza su diversi siti, ed ho visto che effettivamente controindicazioni non ne esistono (in realtà le batterie per auto sono fatte apposta per sostenere assorbimenti anche elevati ma occasionali e di breve durata, ed essere ricaricate molto spesso, e questo coincide quasi sempre con lo schema di uso di un UPS), ma potrebbe, in teoria, forse, esserci un minimo rischio di emissione di vapori tossici, correlato alla presenza di acido dentro la batteria; in altre parole non succede assolutamente nulla, ma sarebbe consigliabile che il sistema si trovasse in un locale non di soggiorno, e/o ben arieggiato; al massimo, si può tenere l’UPS vicino al pc, ed avere un cavo esterno abbastanza lungo per collocare la batteria in un ambiente diverso; nel mio caso il locale del server non è molto vissuto, e quindi non ci sono questi problemi.

Dopo aver rimosso i morsetti dalla batteria semimorta, ho collegato due cavi (meglio se sufficientemente spessi) ai morsetti stessi, ed isolato il tutto con una pistola per colla a caldo (la migliore amica dell'uomo)
ups battery cables outlet
Ho deciso di far uscire i cavi della batteria dal pannello frontale, siccome quello posteriore era già sovraffollato di prese a 220V, quindi ho fatto un buco con un dremel e bloccato con colla a caldo
car battery homemade contacts
Ho usato una piccola staffa metallica per ricavare due molle ad anello collegate ai cavi, isolati con colla a caldo, per essere agganciate poi sui poli della batteria, il risultato non sarà bellissimo ma è perfettamente funzionale
ups car battery setup
Questo è l'aspetto finito, la larghezza della batteria è pressappoco pari a quella dell'UPS, quindi si accoppiano abbastanza bene assieme; avrei potuto trovare dei cavi più lunghi (vanno benissimo anche quelli per l'impianto della 220V), per posizionare la batteria in un altro ambiene più sicuro, o al massimo anche fuori casa

Il sistema funziona perfettamente: laddove con la vecchia batteria, appena staccata la corrente il pc si spegneva immediatamente, con questo accrocco avviene correttamente il passaggio all’alimentazione a batteria; non ho testato l’autonomia totale, siccome francamente non mi interessa (e non voglio stressare inutilmente la batteria riducendone la vita residua), visto che i blackout sono al massimo di qualche minuto, ma stimo che dovrebbe poter durare tra i 30 ed i 60 minuti.

Un dettaglio degno di nota: appena collegata la batteria nella fase di test, anche se era completamente carica, l’UPS non voleva accendersi, e pensavo che ci fosse un problema nel sistema, ma nulla di più falso, infatti semplicemente il mio UPS non si accende “a freddo”, cioè deve essere collegato ad una tensione funzionante di 220V per avviarsi per la prima volta (una cosa piuttosto sciocca a mio parere), ma se il vostro ha lo stesso problema, semplicemente provate a collegarlo alla 220V per avviarlo, prima di darvi per vinti.

This article has been Digiproved