Piero V.

PCRE Problems?

$text='foo foo';

$regexp='/(\s|^)foo(\s|$)/';
$text=preg_replace($regexp, 'bar ', $text);

A ragion di logica dovrebbe dare bar bar, però dà bar foo.

E il problema è la presenza dei due spazi: tirandone via uno a discrezione personale il tutto funzionerà come vorreste…

Le espressioni regolari hanno questa logica qua: se lo spazio finale è già stato usato da un’occorrenza, la successiva non lo potrà usare.

È una logica anche questa, ma come lo spiego all’utente che se mette due faccine di seguito deve mettere due spazi tra esse?

Se usasse l’editor che gli do il tutto funzionerebbe…

Utenti, dovete piegarvi alla logica delle PCRE!

Oppure bisogna passare due volte la stringa, la prima con str_replace: in quel caso sì che funzionerà, perché il singolo spazio diventerà doppio… E come performance non si perde quasi niente.

Transparents thumbs [Flatpress]

English

I’ve added some code to thumb plugin that allows the get transparent thumbs with GIFs and PNGs files.

I’ve taken this code from a comment of the imagecopyresampled PHP function.

Open fp-plugins/thumb/plugin.thumb.php with a text editor and replace:

	$scaled = imagecreatetruecolor($new_width, $new_height);
	imagecopyresampled($scaled, $image, 0, 0, 0, 0, $new_width, $new_height, $infos[0], $infos[1]);

with

	$scaled = imagecreatetruecolor($new_width, $new_height);

	/*
	 * If gif or png preserve the alpha channel
	 *
	 * Added by Piero VDFN
	 * Kudos to http://www.php.net/manual/en/function.imagecopyresampled.php#104028
	 */
	if($infos[2]==1 || $infos[2]==3) {
		imagecolortransparent($scaled, imagecolorallocatealpha($scaled, 0, 0, 0, 127));
		imagealphablending($scaled, false);
		imagesavealpha($scaled, true);
		$output=$infos[2]==3 ? 'png' : 'gif';
	} else {
		$output='jpg';
	}

	imagecopyresampled($scaled, $image, 0, 0, 0, 0, $new_width, $new_height, $infos[0], $infos[1]);

Now, replace some lines belove imagejpeg($scaled, $thumbpath); with: … [Leggi il resto]

PHP Runkit

Oggi ho scoperto un’estensione di PHP che non conoscevo prima: si chiama Runkit.

In pratica permette di modificare a piacimento funzioni, classi, metodi e addirittura ridefinire costanti.

La sua parte migliore è però quella che riguarda la Sandbox: infatti quest’estensione può creare una sandbox per PHP, ovvero un ambiente in cui eseguire codice che non può accedere all’ambiente principale, ma l’ambiente principale può accedere all’ambiente della sandbox.

Purtroppo non è sempre possibile utilizzare questa funzionalità, in quanto richiede una patch a PHP (il che implica che vi ricompiliate PHP a manina ☹️ ).

Inoltre non penso che non ci siano molti hoster che la diano, però sarebbe troppo bello averla.

L’installazione deve essere eseguita tramite PECL. Io con PHP 5.3 su Debian ho dovuto usare questi sorgenti.

Un login più sicuro?

Stavo pensando al modo di creare un login più sicuro: questa era un’idea che mi era venuta già un po’ di tempo fa ma poi ho rinunciato a compierla perché mi ero incasinato, così sono tornato al classico cookie con id e password.

Questo tipo di login però è un po’ rischioso: intanto l’hash della password (o l’hash dell’hash, come preferite 😉 ) rimane salvato in un computer e non è mai una bella cosa; inoltre rende più possibili i tentativi di attacco, per esempio tramite forza bruta: una volta scoperta la funzione dell’hash (soprattutto in assenza di un salt), si può saltare il form di login e provare direttamente con i vari cookie.

Il sistema a cui invece ho pensato si basa sempre su un cookie, ma che racchiude un id del login (generato magari con la funzione uniqid) e un codice di sicurezza diverso dalla password.

Di svantaggio ha il fatto che se a un utente viene “rubato” il cookie può fare tranquillamente il login, ma ciò avveniva anche con l’altro metodo.

Il secondo svantaggio è che il cookie che dura per la sessione viene fatto sparire dal browser, mentre applicando quest’idea bisognerebbe pensare a un tot di tempo di validità per il login breve. … [Leggi il resto]

Benchmark natsort al contrario

Sta notte, mentre non riuscivo a dormire mi sono chiesto se è più veloce natsort con array_reverse oppure usort con -strnatcmp.

La risposta più o meno me l’aspettavo già, però non pensavo la differenza fosse così tanto abissale come vi farò vedere dopo.

Come benchmark ho generato un array col ciclo for di 10^6 elementi e poi li ho messi a caso. Ho dato ad entrambe le funzioni il medesimo array, in modo da fare un test il meno influenzato possibile.

Ho eseguito il test sia per il for che incrementa i valori ($i++), sia per quello che li decrementa ($i–).

Un’ultima considerazione: secondo me non sono importanti i risultati assoluti ma quelli relativi, in quanto non volevo fare il test della macchina, che so non essere tra le migliori.

Insomma, so che si potrebbe fare senza dubbio di meglio come test, magari anche in 64bit.

Ed ecco i risultati:

VDFN Benchmark

Natsort al contrario, for crescente.

Natsort + array_reverse
Tempo: 31.985618114471s
Memoria di picco: 175.97104263306MB

usort (-strnatcmp)
Tempo: 74.302319049835s
Memoria di picco: 175.97214508057MB

Come vedete con usort e il mio callback ci mette più del doppio, mentre la RAM ha valori molto, molto vicini. … [Leggi il resto]