Archive for the ‘Programming’ Category

Zend Framework and Session Cookies across Subdomains

Wednesday, September 24th, 2008

Session support in PHP consists of a way to preserve certain data across subsequent accesses. Each visitor accessing the web site is assigned a unique id, the session id. This session id is either stored in a cookie or propagated in the url. The best solution is to store it in a cookie.

The cookie used to store the session id sets, by default, the cookie domain to the current domain. This means that if you are visiting www.domain.com, the session id will be stored in a cookie bounded to the domain www.domain.com. This behavior leads to a problem: if your site uses multiple subdomains, the session won’t be shared between the site’s subdomains.

To solve this problem you have to share the cookie between all subdomains, setting its domain it to “.domain.com”. The following code shows how to change the session cookie domain with Zend Framework:

Zend_Session::start(array('cookie_domain' => '.domain.com'));

Browers compatibility

The prefix dot in “.domain.com” is not always necessary, but it’s highly recommended to support all browsers.

References

Watermarks with PHP and IMagick

Saturday, August 30th, 2008

There are a lot of web sites, online communities and social networks that apply a watermark over photos uploaded from users. This watermark, usually a logo or a text with the service name, should be applied in a region of the image where there are no important things, because no one likes to see a text over his face.

This simple feature requires an algorithm to automatically select the best corner where apply the watermark.

The algorithm

The watermark should be placed in the corner with the lowest number of graphic details, in order to be as less invasive as possible. To select the best corner, the proposed algorithm counts the number of different colours inside each corner and applies the watermark to the corner with the lowest number of different colours.

This algorithm is very simple but effective, and can be described with the following steps:

  1. For each candidate image region (corners) calculate the number of different colours
  2. Select the image region with the lowest number of different colours
  3. Apply the watermark to the selected region

The code

Here is the code the PHP code of a function that selects the best corner of an image and then apply the watermark.

/**
 * Draw a watermark over an image (the watermark position is
 * selected automatically) and returns true. If the watermark
 * is bigger than the image, this method returns false.
 *
 * @param IMagick $image
 * @param IMagick $watermark
 * @param int $padding
 * @return bool
 */
private function drawWatermark($image, $watermark, $padding = 0)
{
	// Check if the watermark is bigger than the image
	$image_width 		= $image->getImageWidth();
	$image_height 		= $image->getImageHeight();
	$watermark_width 	= $watermark->getImageWidth();
	$watermark_height 	= $watermark->getImageHeight();

	if ($image_width < $watermark_width + $padding || $image_height < $watermark_height + $padding) {
		return false;
	}

	// Calculate each position
	$positions = array();
	$positions[] = array(0 + $padding, 0 + $padding);
	$positions[] = array($image_width - $watermark_width - $padding, 0 + $padding);
	$positions[] = array($image_width - $watermark_width - $padding, $image_height - $watermark_height - $padding);
	$positions[] = array(0 + $padding, $image_height - $watermark_height - $padding);

	// Initialization
	$min 		= null;
	$min_colors = 0;

	// Calculate the number of colors inside each region
	// and retrieve the minimum
	foreach($positions as $position)
	{
		$colors = $image->getImageRegion(
			$watermark_width,
			$watermark_height,
			$position[0],
			$position[1])->getImageColors();

		if ($min === null || $colors <= $min_colors)
		{
			$min 		= $position;
			$min_colors = $colors;
		}
	}

	// Draw the watermark
	$image->compositeImage(
		$watermark,
		Imagick::COMPOSITE_OVER,
		$min[0],
		$min[1]);

	return true;
}

(more…)

Programming languages context-switch

Wednesday, April 16th, 2008

Lavorando a mobitouch cube, mi capita spesso di passare da un linguaggio di programmazione ad un altro. E così scrivo codice Java in PHP, C in Java, Java in Javascript… con il risultato che non ci capisco più niente!

Maybe, I just need an holiday…

Programming languages caricatures

Archive_Tar 1.3.2 – Gzip/bzip2 bug fix

Tuesday, March 25th, 2008

Ho trovato un bug nella classe Archive_Tar che si verifica quando si prova ad aggiungere ad un archivio compresso (gzip o bzip2) un file che, al suo interno, contiene il blocco utilizzato per delimitare la fine dell’archivio tar stesso (null padding di 1024 byte).

Questa patch, applicata alla versione 1.3.2 di Archive_Tar, dovrebbe risolvere il problema.

Riferimenti

Mamma, fix my bug

Monday, February 4th, 2008

L’utopia di un programmatore è quella di credere che un giorno riuscirà a scrivere codice perfetto, senza la presenza di un singolo bug. Ma questo non sarà mai possibile, almeno non su questo pianeta, e voi lo sapete bene. E sembra che non sia nemmeno una questione economica, altrimenti non mi spiego com’è possibile che Microsoft sia riuscita a partorire alcuni dei suoi prodotti (vedi Windows Vista).

Nonostante questa consapevolezza, ogni volta che viene trovato un mio bug su un software in produzione (o, come in questo caso, in beta) è come se il mio orgoglio venisse ferito. Ritengo di scrivere del buon codice, sono abbastanza metodico nei miei test, eppure c’è sempre un errore (più o meno banale) del quale non mi accorgo prima di rilasciare una versione.

Ma non ho scritto questo post per annoiarvi con i miei sensi di colpa, quindi veniamo al dunque!

Fix my bug

Fix my bug

Sabato pomeriggio.

Sono lontano un’ora e mezza di auto da casa, non ho il portattile con me e ricevo una chiamata da Bask, il mio capo: “Ho installato youPeople al <locale> di <città>, ma non riesco ad inviare messaggi dal mio Sony Ericsson”.

Lasciamo da parte il mio sconforto. Ho un problema che devo risolvere, ma non ho il portattile e nemmeno tanta voglia di farmi 3 ore di auto per “passare” da casa a lavorarci. Ho bisogno di una soluzione.

Ho la possibilità di accedere ad Internet da dove mi trovo, ma non posso accedere al server in ufficio perchè (in realtà, non so bene perchè) chi ha configurato il firewall non ha lasciato l’accesso SSH dall’esterno. Fortunatamente ho l’accesso HTTPS a Trac, il software di gestione dei progetti che usiamo, il quale ha una vista (in lettura) sul repository subversion.

Dopo aver downlodato alcuni sorgenti e trovato il bug, resta il problema di come correggerlo. Avrei bisogno di collegarmi alla VPN aziendale, ma non ho le chiavi di accesso con me. Chiamo un collega, ma nemmeno lui ha il portattile al seguito, quindi rimane una sola soluzione: chiamare la mamma!

Avete capito bene. La brillante idea che ho avuto è stata quella di chiamare mia mamma a casa, farle accendere il mio computer, aprire l’IDE, correggere il bug (per fortuna, ha dovuto modificare una singola linea di codice) e committare nel repository.

Tempo impiegato: 40 minuti. Non male.

Fortunatamente, diversi mesi fa ho creato uno script cron che ad ogni ora crea una build del nostro progetto, a partire dal repository subversion. In questo modo, nel server di sviluppo (utilizzato anche per la beta) il progetto viene aggiornato ogni ora. Questo significa che è bastato committare la modifica ed attendere lo scoccare dell’ora successiva affinchè venisse aggiornato il nostro beta-server.

The end

P.S. Sono fiero del logo in stile “Pimp My Ride” che sono riuscito a creare in pochi minuti. Nonostante io non sia un grafico e non abbia nessuna intenzione di diventarlo.

ShellExec – Java System.exec() on PocketPC

Tuesday, November 27th, 2007

JavaPiù di due anni fa, mentre lavoravo su Blues per l’Università di Bologna, ho avuto l’esigenza di eseguire una serie di comandi shell, da un’applicazione Java (J2ME/CDC) per palmari HP iPaq (IBM J9 VM). Questa funzionalità, prevista dalle API Java, in realtà non era implementata sulla maggior parte delle virtual machine CDC/PersonalProfile, a causa del fatto che non era possibile rispettare pienamente le specifiche.

ShellExec

Dopo essermi documentato in rete, ho deciso di sviluppare una piccola libreria nativa, da interfacciare attraverso JNI alla mia applicazione Java, per implementare una versione ridotta della System.exec() e sopperire così alle carenze della JVM che stavo utilizzando. La libreria, chiamata ShellExec, la rilasciai pubblicamente con licenza GPL (repository).

A distanza di più di due anni, continuo a ricevere mail che mi chiedono informazioni e/o aiuti sull’utilizzo di questa libreria, segnale del fatto che la libreria continua a svolgere abbastanza degnamente il suo sporco lavoro. L’ultima mail è arrivata oggi:

Oh, and by the way ShellExec works on my device like a champion. I’m using a Symbol (Motorola) MC70 running Windows Mobile 5.0, using the IBM J9 VM, version 2.3 (CDC 1.0/PP 1.0)

Maggiori informazioni:

Blues – Bluetooth Context-Aware System

Monday, March 26th, 2007

Blues è un’infrastruttura che permette di fornire servizi context-aware a dispositivi mobili, quali cellulari, smartphone e palmari, utilizzando la tecnologia Bluetooth. Il sistema è stato progettato e sviluppato da Marco Pracucci, in collaborazione con il Dr. Stefano Cacciaguerra ed il Prof. Giorgio Casadei, e finanziato dal Sistema Museale d’Ateneo dell’Università di Bologna e da Ser.In.Ar. (Cesena).

Obiettivo

L’obiettivo di Blues è quello di fornire una piattaforma che faciliti la realizzazione di servizi context-aware, ai quali un utente puo’ accedere utilizzando un telefono cellulare o un palmare dotati di tecnologia Bluetooth.
(more…)

ezXML – Indentazione di un documento XML

Wednesday, November 22nd, 2006

ezXML è una libreria opensource, sviluppata in C, per il parsing di documenti XML. La sua semplicità di utilizzo, le buone performance e le sue ridotte dimensioni (compilata in meno di 20K) la rendono particolarmente adatta nello sviluppo di applicazioni per dispositivi embedded (utilizzo questa libreria su un dispositivo basato su processore ARM).

Una delle funzionalità mancanti nella versione corrente è il supporto per l’indentazione, durante la scrittura di un documento XML. Dopo aver contattato l’autore della libreria (Aaron Voisine) ed avergli suggerito l’introduzione di questa funzionalità, ha rilasciato una patch che aggiunge la funzione ezxml_pretty(), inclusa nella prossima versione della libreria. Nel frattempo potete scaricarla da: