29/01/2007 à 22h31 : 20Q pas cher

Avis aux amateurs, les 20Q sont à 1€ à Carrefour Portet !

5 commentaire(s)...

28/01/2007 à 14h50 : Warwalking

Après 10 heures de voyage (et oui ça se traine un bus, et il y a eu des pauses), nous arrivions finalement à destination (Tignes les Brévières).
Il y a le Wifi dans l'hotel (cool) mais le tarif est prohibitif (5€ pour 30 minutes) !
Alors vu qu'il y a d'autres hotels aux alentours, et que de plus en plus d'établissements offrent l'accès internet gratuitement, j'ai tenté un peu de warwalking.
C'est comme le wardriving, mais à pied ;-)
Et ça marche, à 50 mètres de l'hotel, il y a plein de Livebox (pas très intéressant) et il y a un point d'accès ouvert (sûrement un des hotels alentours).
Vive le Wifi et l'internet gratuit !

PS : Je faisais le malin en croyant avoir "inventé" un nouveau mot, mais en fait ça existe déjà : warwalking.
PPS : J'ai fait quelques photos donc j'ai rajouté une petite image d'illustration pour l'en-tête de mon site, soyez patients.

0 commentaire(s)...

19/01/2007 à 03h29 : LAMP optimization

*** Disclaimer: this is not a howto, this is just my personal experience ***

I host several websites on a web server at home on a DSL line: zeRezo.com.
Since the beginning, I have been careful about bandwidth saturation, since even today I only have 1Mbits of upload.
So I try to keep my websites "light", or at least I avoid hosting big files such as videos, big software packages, etc.
When I need big files, I use external hosting. It is not a big issue, since I still have all my standard web pages hosted at home, so I keep a good idea of how many visitors I have.

After some years of such hosting, even if there have been some hardware updates (CPU, RAM, disks), my server starts to be overloaded.
The number of visitors is not so important, but it is still higher than before (great news), some websites have improved their features, and due to historical data the databases are bigger and bigger...
So anyway the fact is that today, sometimes, my server is very slow, almost not responding to local requests, so it was really time to investigate!
After some googling, I found this nice post which gives basic steps to identify the "weak" point on your installation.
The article focuses on the 3 main points of congestion for an overloaded server: I was again amazed to see how SpamAssassin was consuming memory on my system.
I had 5 process of SpamAssassin running on my system (default option) and it looks like they do not share their database in memory!
Since my system does not handle so much email, I changed default Debian option in /etc/default/spamassassin to have only one process:
# NOTE: version 3.0.x has switched to a "preforking" model, so you
# need to make sure --max-children is not set to anything higher than
# 5, unless you know what you're doing.

OPTIONS="--create-prefs --max-children 1 --helper-home-dir"
Except this small detail, both RAM and disk usage are ok on my server.
So the problem is CPU, and it is not so difficult to see, the top command at some times of the day can show very high load (>>10) with 100% CPU usage of course.

So now we know what to do: optimize dynamic web pages, doing faster PHP code and nicer MySQL queries.
The other issue is how to identify which pages are responsible for the CPU usage.
There are nice options in Apache logging option, the %T and %D options allow to track "the time taken to serve the request".
I still run the old 1.3 version at home, so I only have the %T option (in seconds), and the result was not so helpful in my case: I sometime have very high times for static pages, which is strange...
But I know which are the bad pages on my server, since on many websites I include a little footer with the computation time of the page. Something like this:
function getmicrotime()
{ 
	list($usec,$sec)=explode(" ",microtime());
	return ((float)$usec+(float)$sec);
} 
$time_start=getmicrotime();

/* the ugly code here */

$time_end=getmicrotime();
$time=$time_end-$time_start;
printf('Page generated in %f seconds',$time);
So I often see in my footers that I host ugly slow code :)

To begin, I focused on MySQL queries, since it seemed to be the longer part of my slow web pages.
Here again, MySQL has got nice logging option.
In my configuration file, I switched on the log-slow-queries option:
# Here you can see queries with especially long duration
log-slow-queries = /var/log/mysql/mysql-slow.log
When this option is present, all queries that take more than X seconds to complete are stored in the log file.
It is then easy to locate the slower queries.

Also, in order to profile SQL queries on a specific page, I use the quick & dirty following technique. I replace all calls to mysql_query() by a custom _mysql_query().
It would be nicer to just override the mysql_query() builtin function, but I don't think I can do this with my PHP version.
So here is what it looks like:
function _mysql_query($string)
{
	global $REMOTE_HOST;

	/* global timer to store total time spent in SQL queries */
	global $time_mysql;

	/* start te timer */
	$t1=getmicrotime();

	/* do the query and save the result to return it to the caller */
	$r=mysql_query($string); 

	/* stop the timer */
	$t2=getmicrotime();

	/* only show the trace for the developer */
	if ($REMOTE_HOST=='my_computer_name')
		print '<div class="mysql" title="'.$string.'">'.round(1000*($t2-$t1)).'</div>';

	/* increase total SQL time */
	$time_mysql+=$t2-$t1;

	/* return the results to caller just like mysql_query would */
	return $r;
}

/* ... */

$query = 'SELECT * FROM foo';
$result = mysql_query($query);
The time I am talking about here is "real" time, not CPU time spent on this specific process, so it is not very accurate, but still helpful.

I use a style for these trace <div> so they look like small boxes. The "title" on them allows to view the SQL query just by moving the mouse over it:


On this basic website, since the boxes are written when the query is done, it is easy to understand when and why a specific query was done, just looking where it is visually located on the website layout.

The grey boxes are another trace I use, to check for time spent in PHP.
To compute this time, I also use timers, but I remove the SQL time to really focus on PHP code time:
function _trace($string)
{
	global $REMOTE_HOST;

	/* global timer started at the beginning of the page */
	global $time_start;

	/* total time spent in SQL queries */
	global $time_mysql;

	/* only show the trace for the developer */
	if ($REMOTE_HOST=='my_computer_name')
		print '<div class="php" title="'.$string.'">'.
			round(1000*(getmicrotime()-$time_start-$time_mysql)).'</div>';
}

/* ... */

_trace('start big command');
very_slow_procedure();
_trace('stop big command');
Again, this allowed me to find very nasty things in my website.
For example, instead of using a static array of smilies, I used a PHP loop to parse the local smiley filenames (so if I had a smiley I don't have to update the code).
Ok this is not very nice, but I did not suppose it would be so slow ;-)
Now this is fixed!

One last tool which can be useful: ab. This is Apache HTTP server benchmarking tool, which allows to do many requests at a time on your server.
ab -c 10 -n 100 http://google.com/
For example this command will do 100 requests on http://google.com/, witch 10 requests in parallel.
Be careful with this command, it can stuck your server if you use too big number!
I used it in combination with a custom script to monitor LAMP activity: I still have CPU issues...
The next step could be another hardware upgrade... or to switch to a smarter solution like professional hosting.

6 commentaire(s)...

10/01/2007 à 22h40 : Second Life (sous Linux bien sûr)

Bon comme on en entend beaucoup parler en ce moment, je n'ai pas pu m'empêcher de tester Second Life.
Le code source du client a été libéré récemment, mais il existe déjà un client officiel Linux donc c'est celui que j'ai testé.
Première bonne surprise : les binaires sont tout petits, le "jeu" ne pèse que 39 Mo.

<passage technique>
J'ai d'abord tenté de le faire tourner dans mon chroot 32bits (je rappelle que j'ai un AMD64 donc je suis en x86_64). Ca ramait et le son était très mauvais...
Donc après lecture des forums officiels, il est possible de le faire tourner en 64bits avec juste quelques bibliothèques 32bits : apt-get install ia32-libs ia32-libs-gtk.
Ensuite il faut aussi la bibliothèque libuuid1 en 32bits. Donc on télécharge un paquet i386, par exemple "libuuid1_1.38-2ubuntu2_i386.deb", puis on le décompresse avec un dpgk --extract, puis on copie à l'arrache les bibliothèques dans le répertoire lib/ du jeu... et ça marche mieux :-)
</passage technique>

Après avoir créé un compte sur le site officiel où l'on réfléchi bêtement à quel nom choisir pour son personnage, on peut enfin se connecter sur le jeu.


On arrive dans un monde "tutorial", qui va nous expliquer comment se déplacer et agir avec l'environnement.


On vous explique ensuite comment changer l'apparence du personnage.


On a un "inventaire" de tous les objets collectés.


Le déplacement se fait au clavier (un peu pénible quand même quand on est habitué aux bons FPS), et l'interaction avec le monde se fait simplement à la souris (un bouton droit permet d'afficher un menu pour interagir).


Le réglage de l'apparence du personnage est assez poussé, je pense qu'ils sont allés plus que dans Sims par exemple (que je ne connais pas plus que ça donc je me trompe peut-être). On peut tout régler : taille, poids, couleur de peau, cheveux, barbe (on peut même dessiner une texture pour le visage), couleurs des yeux, vêtements, etc.


On peut ensuite se téléporter pour aller dans d'autres endroits.


Les décors se chargent au fur et à mesure, comme une page web...


On peut aussi voler pour se déplacer plus vite :-)


Un peu de pub pour Dell...


Encore un peu de pub ;-)


Bon je voulais acheter une moto mais je n'ai pas le droit visiblement :-p


Des gens parlent un dialecte bizarre.


Beaucoup de gens parlent...


Un aperçu de la carte, il reste encore des endroits à visiter !


Un labyrinthe ?


Un intérieur un peu chargé.


Un dernier...

Bon c'est avant tout un logiciel de chat, on peut donc rencontrer des gens mais je n'ai pas eu trop le temps de tester cet partie... Hey ! je suis pas un geek pour rien !
Mais je trouve l'idée assez sympa et même si les graphismes ne sont pas extraordinaires, les univers et les décors sont assez variés... et ça a l'air vaste.
Contrairement à d'autres jeux "massivement online" ils incitent à faire du commerce. On peut donc dépenser de vrais dollars pour avoir des dollars virtuels dans le jeu et acheter des objets avec.
De la même façon si on veut avoir sa propre parcelle de terrain, il faut payer un loyer mensuel !
Mais rien n'empêche (pour l'instant) comme je l'ai fait moi de se balader dans cet univers juste pour tester, sans rien dépenser :-)

1 commentaire(s)...

10/01/2007 à 17h28 : (Reponses.net + Zerezo.com) 5 - 48329483 Spam

On continue dans la série des solutions anti-spam.
J'avais déjà présenté LinkSleeve que j'utilisais jusqu'à récemment, mais j'ai finalement désactivé ce service car leur API était lente à répondre (ou ne répondait plus du tout) ce qui faisait un peu ramer mes sites lorsqu'on postait des messages/commentaires.
Et puis il y a quelques jours j'ai entendu parler de Akismet.
C'est à nouveau un "web service" que l'ont peu intérroger depuis son blog, son forum, son wiki, etc. grâce à leur API ouverte.
Du coup on trouve de nouveau des implémentations toutes prêtes, par exemple une classe PHP (que j'utilise).
Il faut juste ce procurer un clef gratuite en ouvrant un compte Wordpress.
L'API est plus complète que celle de LinkSleeve car on peut préciser les informations par catégories (auteur, commentaire, lien, email, etc).
On peut également signaler les spams manqués et les faux positifs, afin d'en faire profiter la communauté.
De mon côté j'ai juste fait évoluer ma précédente solution "quick & dirty (tm)" en ajoutant :
(même début...)

	# try akismet database
	include('akismet.php');
	$akismet=new Akismet('http://zerezo.com/', 'ma_jolie_clef');
	$akismet->setContent($spam_input);
	if ($akismet->isSpam()) spam_log('akismet');
Et ça marche plutôt bien... depuis hier par exemple où j'ai mis à zéro mes statistiques de commentaires spam, j'ai filtré : Les 627 messages filtrés sur les critères de base ne sont pas soumis à Akismet, ce qui m'évite de faire trop de requêtes...

1 commentaire(s)...

09/01/2007 à 21h58 : Les lions dans South Park

Je continue dans les petits messages, mais j'ai une excuse : j'ai une petite forme...



1 commentaire(s)...

09/01/2007 à 20h12 : iPhone

Mon prochain téléphone ?


Source : http://keynote.mac4ever.org/
Update : http://www.apple.com/iphone/

1 commentaire(s)...

07/01/2007 à 00h24 : C'est encore Noël !



10 commentaire(s)...

01/01/2007 à 22h20 : Bilan 2006 et résolutions 2007

Avant tout, je vous souhaite une bonne année !
Donc pour ceux qui n'auraient pas suivi, un petit résumé des évènements me concernant en 2006 : Quelques idées (ou "résolutions") pour 2007 : Sinon j'ai été très gâté pour Noël, merci !

8 commentaire(s)...

Archives...

07/2007 ] [ 04/2007 ] [ 03/2007 ] [ 02/2007 ] [ 01/2007 ] [ 12/2006 ] [ 11/2006 ] [ 10/2006 ] [ 09/2006 ] [ 08/2006 ] [ 07/2006 ] [ 06/2006 ] [ 05/2006 ] [ 04/2006 ] [ 03/2006 ] [ 02/2006 ] [ 01/2006 ] [ 12/2005 ] [ 11/2005 ] [ 10/2005 ] [ 09/2005 ] [ 08/2005 ] [ 07/2005 ] [ 06/2005 ] [ 05/2005 ] [ 04/2005 ] [ 03/2005 ] [ 02/2005 ] [ 01/2005 ] [ 12/2004 ] [ 11/2004 ] [ 10/2004 ] [ 09/2004 ] [ 08/2004 ] [ 07/2004 ] [ 06/2004 ] [ 05/2004 ] [ 04/2004 ] [ 03/2004 ] [ 02/2004 ] [ 01/2004 ] [ 12/2003 ] [ 11/2003 ] [ 10/2003 ] [ 09/2003 ] [ 08/2003 ] [ RSS ] [ RSS commentaires ]