La fin d’une ère

J’ai décidé aujourd’hui de fermer définitivement mon site www.overnetcity.com pour me consacrer exclusivement à ce blog hébergé sur le même domaine.

Autrefois site d’échange autour du Peer2Peer et plus particulièrement du logiciel Overnet, OvernetCity a regroupé au plus haut de sa forme environ 20.000 membres au sein de son forum. Fermé en 2004, je me suis ensuite servis du domaine pour héberger un petit site développé en symfony (tiens donc !) et qui me permettait de publier mon CV sur Internet.

Face au design vieillissant (peut-être était-il déjà moche à la base…) j’ai longtemps voulu le reconstruire entièrement. Mais finalement, pourquoi refaire ce que WordPress sait déjà très bien accomplir tout seul.

Mon site de CV et mon blog ne font donc désormais plus qu’un.

Je vous invite ainsi à consulter mon CV ou mes réalisations grâce au menu en haut de cette page.

Et surtout, n’hésitez pas à me contacter pour toute proposition professionnelle ou pour toute question relative au contenu de ce blog.

Warning: URL file-access is disabled in the server configuration…

En voulant me servir de la fonction PHP getimagesize('http://un_serveur/une_image.jpg'), je suis tombé sur une erreur après la mise en ligne du code sur un hébergement mutualisé de 1and1 :

Warning: getimagesize() [function.getimagesize]: URL file-access is disabled in the server configuration

L’erreur vient tout simplement du fait que, par défaut, dans la version 5 de PHP, la variable allow_url_fopen du php.ini est à false. Cette option active les versions étendues des fonctions d’accès aux fichiers, qui savent exploiter les URL.

Je me suis dit dans un premier temps que j’allais devoir basculer le site sur un serveur dédié mais, après quelques recherches, j’ai découvert que 1and1 autorise la modifications des valeurs du php.ini, même sur un hébergement mutualisé.

Pour ce faire, rien de plus simple ! Il suffit de créer un fichier php.ini avec les couples variables / valeurs souhaités et de le placer dans l’ensemble des répertoires contenant des scripts PHP sur le serveur.

Exemple de fichier php.ini :

upload_max_filesize = 10M
post_max_size = 10M

En ce qui nous concerne, il faut créer le fichier suivant :

allow_url_fopen = 1

Si vous travaillez sur un projet symfony, il suffit de mettre le php.ini à la racine du dossier web, puisque toutes les actions s’exécutent à partir du contrôleur frontal.

Si vous n’êtes pas chez 1and1, vérifiez si votre hébergeur vous propose la personnalisation du php.ini. De plus en plus le font afin de laisser un peu de souplesse aux développeurs. Et on ne va pas s’en plaindre…

Comment créer un sprite pour optimiser le chargement de ses images ?

Je m’occupe actuellement du développement du site myBonjour.fr qui permet le recensement et l’affichage de tous les blogs du type Bonjour Madame et Bonjour Poney.

Pour optimiser la vitesse de chargement des pages, je me suis intéressé à la technique aujourd’hui très populaire des Sprites CSS.

Un Sprite, qu’est-ce que c’est ? C’est une grande image qui contient plusieurs petites images utilisées au sein de votre application web, via les feuilles de style. En utilisant la propriété background CSS, il est assez facile de dire quelle partie du sprite doit être affichée en image de fond.
L’avantage de regrouper plusieurs petites images au sein d’un sprite est double. D’une part, l’image ainsi formée est souvent moins lourde que l’ensemble des petites images additionnées et, d’autre part, le nombre de requête HTTP pour charger les images est réduit à un. C’est ce dernier point qui est le plus important et le plus significatif en terme de gain de performances.

Voici un exemple de sprite :

Sprite de boutons

De nombreuses applications Web apportent une aide intéressante pour la création de Sprite à partir d’un site existant non optimisé.
J’ai retenu tout particulièrement le site http://spriteme.org qui offre un bouton à glisser dans sa barre de favoris et qui ouvre une popup en Javascript qui permet de créer un sprite à la volée et même de générer le CSS correspondant à partir du CSS existant.

Exemple avec SpriteMe

Maintenant, comment générer un Sprite soit même, directement dans son code symfony ? Vous allez voir ci-dessous le code que j’ai utilisé pour myBonjour.fr.

Pour cela, j’ai ajouté dans un premier temps une méthode privée dans mon modèle, s’occupant de générer le Sprite en question :

  private function makeSpriteForFavicons()
  {  
    $items = Doctrine_Core::getTable('MyBonjourItem')->getAllActiveItems();
    
    $width = 25;
    $height = 16;
    $space = 14;
    
    // On crée l'image vide
    $image = imagecreatetruecolor($width, ($height+$space) * count($items));
    $background = imagecolorallocatealpha($image, 255, 255, 255, 127);
    imagefill($image, 0, 0, $background);
    imagealphablending($image, false);
    imagesavealpha($image, true);
    
    // Ajout de tous les favicons à l'image
    $pos = 7;
    foreach($items as $item)
    {
      $tmp = imagecreatefrompng($item->getItemFilePath());
      imagecopy($image, $tmp, 0, $pos, 0, 0, $width, $height);
      $pos += $height + $space;
      imagedestroy($tmp);
    }

    imagepng($image, sfConfig::get('sf_web_dir').'/images/items_icons.png');
  }

Il suffit ensuite d’appeler cette méthode, quand la colonne correspondant à l’image est modifiée. Pour cela, on implémente la méthode save du modèle :

  public function save(Doctrine_Connection $conn = null)
  {   
    if(in_array('favicon_url', array_keys($this->getModified())))
    { 
      $return = parent::save($conn);
      $this->makeSpriteForFavicons();
    }
    else
      $return = parent::save($conn);
    
    return $return;
  }

Et enfin, on génère la partie correspondante dans le fichier CSS, à la volée :

// makeCSSSuccess.php
<?php $pos = 0; foreach($items as $item): ?>
div#<?php echo $item->getSlug() ?> > h3{
  background: url("/images/items_icons.png") no-repeat scroll 5px -<?php echo $pos*$width ?>px;
}
<?php $pos++; endforeach; ?>

Le fichier CSS généré par une action symfony doit être mis en cache pour éviter toute chute des performances. Il suffit de déclencher ensuite une regénération du cache lorsqu’un item est ajouté en base.
Sur myBonjour, j’ai ainsi supprimé le chargement de 60 requêtes HTTP, correspondant aux différents bonjours présents dans la liste.

Obtention du label HF Manager

A l’INSA de Lyon, j’ai eu l’occasion de suivre deux formations qui sortent du cadre classique des études d’un ingénieur en informatique. La première, en 4ème année s’intitulait Label Handi-manager et était destinée à sensibiliser les étudiants à l’intégration des personnes handicapées au sein des entreprises. Cette expérience m’avait particulièrement intéressé et je l’ai renouvelé cette année, avec une nouvelle formation, intitulée cette fois Label HF Manager. L’objectif de cette deuxième formation était de me sensibiliser aux inégalités Hommes / Femmes dans les entreprises.

Label Handi-Manager

Label HF Manager

Je viens tout juste de recevoir le mail me confirmant que j’ai bien obtenu ce Label HF Manager :

Cher(e) étudiant(e),

Tu t’es porté(e) candidat(e) au Label HF Manager sur le campus de ton école. J’ai le plaisir, au nom de Companieros et de ton école, de te délivrer ce certificat qui atteste que tu as obtenu le Label HF Manager 2010.

Bravo ! Ce Label est la preuve que tu as acquis un certain niveau de connaissances sur la mixité Homme-Femme, que tu as une certaine capacité à prendre du recul et à questionner tes propres préjugés, et que tu as su faire preuve d’ouverture, en comprenant l’importance du dialogue au travers de rencontres fortes.

Ces savoirs, savoir-faire et savoir-être que tu as développé par cette expérience sont fortement recherchés par les entreprises : n’hésite pas à en parler lors de tes entretiens !

A très bientôt donc, et encore bravo

Je conseille vivement à tous les étudiants en ayant l’occasion, de participer aux formations proposées par l’organisme Companieros. Elles représentent un véritable plus pour l’élève ingénieur sur le plan personnel et plus tard, vraisemblablement, sur le plan professionnel.