Sahid Ferdjaoui Blog - Funraill Foundation Bienvenue, Log in - thème 2007 RC1

Powered by OpenSource Softwares

Outil de déboggage colaborative
reduire

Prechargement d’images en Javascript

le 19 août 2008 par sahid

Javascript, prechargement d’images (images loader)

Une fonction Javascript toute bete pour faire patienter vos visiteurs durant le chargement d’images un peu lourdes.

Exemple:

Source:

  1. preload = function (o, img_src, w, h) {
  2.   var img = new Image ();
  3.   img.onload = function () {
  4.     o.onload = null;
  5.     if (w) o.width  = w;
  6.     if (h) o.height = h;
  7.     o.src = img.src
  8.   };
  9.   img.src = img_src;
  10. }

Usage:

  1. <!– sans redimensionnement –>
  2. <img src=“images/ajax-loader.gif” onload=“preload (this, ‘images/larges/big.jpg’)”/>
  3.  
  4. <!– avec redimensionnement homothetique sur la largeur –>
  5. <img src=“images/ajax-loader.gif” onload=“preload (this, ‘images/larges/big.jpg, 300′)”/>
  6.  
  7. <!– avec redimensionnement homothetique sur la hauteur –>
  8. <img src=“images/ajax-loader.gif” onload=“preload (this, ‘images/larges/big.jpg, null, 300′)”/>
  9.  
  10. <!– avec redimensionnement –>
  11. <img src=“images/ajax-loader.gif” onload=“preload (this, ‘images/larges/big.jpg, null, 300, 400′)”/>
reduire

Mettre en cache ses objets Javascript

le 22 juin 2008 par sahid

myStorage.js …ses requêtes Ajax en cache

Cette classe JS permet de mettre en cache les résultats de ses requêtes Ajax.
l’intérêt est d’éviter les requêtes inutiles au serveur d’application (et/ou de données). elle utilise le framework prototype.js

Dans une application full Ajax, ou un simple widget Ajax, il peut être intéressant de mettre le résultat de ses requêtes en cache. si on prend l’exemple de données extraites d’une base de données, l’intérêt est encore plus important, car cela évite de re taper la base de données à chaque évènement de l’utilisateur.
Le seul problème est qu’il est important de bien gérer la validité des informations mises en cache.

Mise en route

  1. <script type=“text/javascript” src=“prototype.js”></script>
  2. <script type=“text/javascript” src=“myStorage.js”></script>
  3. <script type=“text/javascript”>
  4.         window.onload = function () {
  5.           storage = new myStorage ();
  6.         }
  7. </script>

Un exemple rapide d’utilisateur avec Ajax.Request

  1. function loadData (id) {
  2.         var key = ‘item-’ + id;
  3.         var item;
  4.  
  5.         /** get data if exists */
  6.         if ((item = storage.get (key)) !== false) {
  7.           return item;
  8.         }
  9.  
  10.         new Ajax.Request (‘data.php?id=’ + id, {
  11.           onSuccess: function (xhr) {
  12.             var json = xhr.responseText.evalJSON ();
  13.             if (json.response && json.response == ‘OK’) {
  14.  
  15.               /** add data for 1 hour */
  16.               storage.set (key, json.data, 3600);
  17.               return json.data;
  18.             }
  19.           }
  20.         });
  21.       }

details sur la lib et téléchargement

reduire

Offre d’emploi : Postes de développeurs PHP5

le 7 juin 2008 par sahid

Recherche développeurs PHP confirmés

Dans la société ou je travaille on recherche des développeurs PHP 5 expérimentés
pour la maintenance et l’évolution de plusieurs projets de sites communautaire et de commerce à forte audience

La plateforme de développement est basée sur des serveurs Apache 2 sous GNU/Linux Debian, PHP5 ainsi que MySQL 5 couplé à des serveurs Memcached.

Au niveau des compétences requis

  • La maitrise de PHP 5 est indispensable (Sécurité, Orienté Objet), la connaissance des motifs de conception du GOF sont des plus non négligables.
  • La société porte un très grand intérêt à la base de données MySQL 5, une connaissance approfondie de celles-ci est un plus (administration InnoDB, réplication, triggers, procédures stockées …)
  • La gestion de projet via SVN, SHH et les outils GNU
  • Une vraie passion pour un code bien écrit, documenté (un minimum), optimisé

L’offre s’adresse vraiment à des personnes passionnées, entreprenantes et autonomes qui ont envie de voir leurs codes, concepts, et idées tourner sur des serveurs en production et à forte charge.

Sinon au niveau des plus, il y a un bon salaire (30/40 K€ à négocier), la mutuelle, les tickets resto et surtout le baby foot :)
L’ambiance générale de la société est jeune et détendue.



Les postes sont à pourvoir à Levallois-Perret (92300),
vous pouvez me contacter, ou directement passer par : Kais AHMED kais(arobase)neteck-fr(point)com

reduire

Script Python svn_commit

le 19 avril 2008 par sahid

Simple script pour commit une liste de fichiers

Je me suis fait un petit script en Python permettant de commit une suite de fichiers inscrits dans un fichier texte. ca me permet de mieux gerer les fichiers que j’edite et ceux qui doivent etre envoyés sur le serveur svn.

Le plus simple est de placer le script dans ~/bin/svn_commit.

Le script python

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import sys
  5. import os
  6.  
  7. for rfile in sys.argv:
  8.    if rfile == sys.argv[0]:
  9.        continue
  10.    try:
  11.        cmd = “”.join (open (rfile, ‘r’)\
  12.                       .readlines ())\
  13.                       .replace (\n, ” “)
  14.        os.system (“svn commit “ + cmd)
  15.    except IOError:
  16.        print “le fichier ‘”+rfile+“‘ n’existe pas.”

Exemple d’utilisation

# malist_1
src/fichier.c
cfg/general.conf
img/image.png

~$svn_commit malist_1 malist_2

reduire

ACPI: PCI Root Bridge

le 19 janvier 2008 par sahid

Corriger le bug ACPI: PCI Root Bridge [PCI0]

Je tiens simplement à faire passer le message pour ceux qui ont eu le meme probleme que moi au demarrage de leur PC, le boot se met en pause et affiche le message ACPI: PCI Root Bridge [PCI0] …
J’ai donc reporté le bug sur bugzilla.kernel.org, celui-ci a été corrigé en passant l’option “pci=nommconf” à grub.

Le rapport de bug

reduire

Récuperer ses contacts MSN, Gmail, Yahoo avec PHP

le 4 décembre 2007 par sahid

Classe PHP pour vos contacts MSN, Gmail Yahoo…

Pour les besoins d’un projet au boulot, j’ai du faire quelques recherches afin de trouver comment récupérer les contacts des boites msn, yahoo, gmail, et autres… le problème est que sur le net on trouve de nombreux Web service proposant ces fonctionnalités mais tres peu de librairies libres …

Apres de multiples recherches je suis tombé sur plusieurs classes intéressantes, et j’ai donc pensé les rassembler pour en faire un petit paquetage simple d’emploi

Présentation de la classe Contacts

En utilisant le pattern decorator et une petite factory je suis arrivé à faire en sorte de simplifier un maximum son utilisation

Un exemple du decorator avec Gmail

  1. class GmailDecorator
  2. {
  3.   private $_instance;
  4.   private $_user;
  5.   private $_pass;
  6.  
  7.   public function __construct ($user, $pass)
  8.   {
  9.     require (‘libs/importGmail.class.php’);
  10.     $this->_instance = new GMailer;
  11.     $this->_user = $user;
  12.     $this->_pass = $pass;
  13.   }
  14.  
  15.   public function getContacts ()
  16.   {
  17.     $result = array ();
  18.     if (!is_object ($this->_instance))
  19.       throw new Exception (“Aucune instance GMailer”);
  20.     $this->_instance->setLoginInfo ($this->_user, $this->_pass, “+1GMT”);
  21.     if ($this->_instance->connect ())
  22.       {
  23.         $this->_instance->fetchBox (GM_CONTACT, ‘all’, );
  24.         $snapshot = $this->_instance->getSnapshot (GM_CONTACT);
  25.         $this->_instance->disconnect ();
  26.         $i = 0;
  27.         if (isset ($snapshot->contacts))
  28.           foreach ($snapshot->contacts as $contact)
  29.             {
  30.               $result[$i][‘name’] = $contact[‘name’];
  31.               $result[$i][‘email’] = $contact[‘email’];
  32.               $i++;
  33.             }
  34.         return $result;
  35.       }
  36.     else
  37.       throw new Exception (‘Impossible de se connecter’);
  38.   }
  39. }
  40.  
  41. class YahooDecorator {}
  42. class MSNDecorator {}
  43. # etc …
  44.  

Ensuite la Factory s’occupe de nous retourner l’objet en fonction du type qu’on lui passe en paramètre

  1. class Contacts
  2. {
  3.   public static $arr_type = array (‘Gmail’, ‘MSN’, ‘Yahoo’, ‘Lycos’, ‘AOL’);
  4.  
  5.   public static function factory ($user, $pass, $type)
  6.   {
  7.     if (in_array ($type, self::$arr_type))
  8.       {
  9.         $class = “{$type}Decorator”;
  10.         return new $class ($user, $pass);
  11.       }
  12.     else throw new Exception (‘Invalide type, utilisez : ‘.implode (“, “, self::$arr_type));
  13.   }
  14. }

Etat du paquetage Contacts (MAJ : 04/02/08)

   Gmail Teste réussi avec @gmail.com et sans le host
   Yahoo! Teste réussi avec @yahoo.fr
   AOL Teste réussi avec @aol.com
   Lycos Teste réussi avec @lycos.com
   MSN Teste réussi avec @hotmail.fr @hotmail.com

NOTE : Gmail, AOL, Yahoo, et Lycos, n’ont pas besoin du suffixe @host.com

Un petit exemple

reduire

Support des espaces de noms en PHP

le 27 novembre 2007 par sahid

PHP 5.3, NameSpaces

Voila une très bonne chose, j’en avais déjà entendu parlé mais il me semblait que c’était pour la version 6 de PHP, toujours est il que c’était véritablement un manque pour les développeurs PHP.

Donc à partir de la version 5.3 on devrait retrouver le support des espaces de noms pour les fonctions, les classes, ainsi que les constantes. l’interet est assez important pour un langage comme le PHP et son nombre incroyable de bibliothèques.

Vous pouvez jeter un oeil sur la partie de la doc qui traite de se sujet
http://fr.php.net/manual/fr/language.namespaces.php

Via l’utilisation d’accesseurs

  1. <?php
  2.     require ‘MyProject/Db/Connection.php’;
  3.     use MyProject::DB;
  4.     use MyProject::DB::Connection as DbConnection;
  5.    
  6.     $x = new MyProject::DB::Connection();
  7.     $y = new DB::connection();
  8.     $z = new DbConnection();
  9.     DB::connect();
  10. ?>

Définition dans tout le script

  1. <?php
  2.     namespace A::B::C;
  3.  
  4.  /* This function is A::B::C::fopen */
  5.     function fopen() {
  6.          /* … */
  7.          $f = ::fopen(); // call global fopen
  8.          return $f;
  9.     }
  10. ?>
reduire

Hebergement pour développeurs

le 24 novembre 2007 par sahid

HostingRails.com, le meilleur hebergeur GNU/Linux

En debut d’apres-midi le blog était légèrement indisponible, j’etais en train de le migrer sur mon nouvel hebergeur, j’en ai profité pour passer à la version 2.3 de wordpress.

Un billet publicitaire …mais il le faut !

En pleine recherche pour trouver un nouvel hebergeur, ayant un peu trop de problemes avec 1and1 et leur “jemenfoustisme” envers leurs clients, je suis tombé sur HostingRails.com, et vraiment ils offrent le meilleur rapport qualité/prix que je n’ai jamais vu.

J’avais envie de trouver un hebergement qui offre accès à une base de données PostgreSQL ainsi que SSH sans avoir à passer par un serveur dedié ou semi-dedié, un peu trop couteux pour mes besoins.

La petite histoire …

Si j’ai bien compris cette offre d’hebergement est issue de deux developpeurs passionnés de Ruby qui ont eu envie d’offrir un hebergement mutualisé de haute qualité afin de promouvoir Ruby On Rails

Les developpeurs d’autres languages de programmation ne seront pas en reste car l’offre propose Python, PHP, Perl, en plus de Ruby, ainsi que les serveurs Apache2 et LightHTTP (plus d’infos…), ainsi qu’un accès SVN…

Merci à l’Euro fort … :)

Le truc pas mal si vous decidez d’opter pour cette offre, est le taux de change de l’euro qui est bien plus fort que celui du dollar… et mon hebergement de 2 années pour un peu moins de 70$ m’est revenu à environ 47euros !.

reduire

Patcher le noyau Linux

le 10 novembre 2007 par sahid

Utiliser une version de Linux en développement

Depuis l’achat de mon nouveau portable, j’ai quelques problemes avec la gestion de l’ACPI, une des solutions qui m’a été proposée dans le bugzilla de kernel.org est d’utiliser une version du noyau Linux encore en développement.

Je n’avais encore jamais resenti le besoin de patcher mon noyau Linux à part pour utiliser bootsplash, m’enfin ma période geek et deco en tout genre est belle et bien finie maintenant ( ; …rien ne vaut un demarrage en mode texte ( ;…”

Bref, voila rapidement la méthode que j’ai utilisé.

Telecharger le patch ainsi que le bon noyau

Sur le site kernel.org vous pouvez telecharger le patch qui vous permettra de passer de la version stable actuelle du noyau Linux, a la prochaine version en développement.

  • Donc, on télécharge le patch ainsi que la version base-line fournie avec [B]
  • On decompresse le noyau ainsi que le patch
  • On copie le patch dans la racine des sources décompressées
  • On applique le patch avec la commande patch -p1 < lepatch
  • Pour finir il ne reste plus qu’a configurer et compiler le noyau, vous pouvez suivre un de mes precedents articles

Le tour est joué !!

Pour info, ca n’a pas résolu mon probleme );

reduire

Un Singleton multi instances…

le 22 septembre 2007 par sahid

Modifier le fonctionnement de son Singleton

Je reviens sur le pattern Singleton, car actuellement je travaille sur un projet perso et celui-ci m’a posé un probleme…
Dans mon cas précis, je me sers du Singleton pour gerer une classe de Log. On pourrait penser que le Singleton se prete parfaitement a ce type de fonctionnalité, seulement je me suis retrouvé face à un probleme qui est en fait une des grandes forces du Singleton, l’initialisation unique …

Je m’explique, dans mon cas j’ai besoin de pouvoir travailler avec de multiples fichiers log, si le nom du fichier est passé en parametre du constructeur, je ne pourrais travailler qu’avec celui-ci, et pour ecrire sur un nouveau fichier je devrais passer par un accesseur qui modifierait l’attribut…, ou encore je devrais passer à ma methode permettant l’ecriture du log, le nom du fichier…

  1. <?php
  2. // via le constructeur
  3. $o = Log::singleton (‘file.log’);
  4. $o->log (“Une chaine inscrite dans le fichier ‘file.log’”);
  5. $o->setFileLog (‘file2.log’);
  6. $o->log (“Une chaine inscrite dans le fichier ‘file2.log’”);
  7.  
  8. // via la methode log
  9. $o = Log::singleton ();
  10. $o->log (‘file.log’, “Une chaine inscrite dans le fichier ‘file.log’”);
  11. ?>

Ces deux methodes ne me plaisent pas particulierement, pour résoudre le probleme l’idée est de modifier le Singleton pour qu’il enregistre non pas une, mais de multiples instances de notre classe.

  1. $o = Log::singleton (‘key_file’, ‘file.log’);
  2. $o->log (“une chaine… dans ‘file.log’”);
  3.  
  4. $o = Log::singleton (‘key_file2′, ‘file2.log’);
  5. $o->log (“une chaine… dans ‘file2.log’”);

Donc si l’instance de la classe n’est pas déjà créée, il en crée une nouvelle,l’enregistre dans un tableau et la retourne, si celle-ci est dejà créée il la retourne simplement.

  1. class SingletonMulti
  2. {
  3.   /**
  4.    * array with all instances
  5.    */
  6.   private static $_instances = array ();
  7.  
  8.   /**
  9.    * all arguments …
  10.    */
  11.   private $args;
  12.  
  13.   public static singleton ($key, $args = “null”)
  14.   {
  15.     if (!array_key_exists ($key, self::$_instances))
  16.       self::$_instances[$key] = new SinletonMulti ($args);
  17.     return self::$_instances[$key];
  18.   }
  19.  
  20.   private __construct ($args)
  21.   {
  22.     $this->args = $args;
  23.   }   
  24. }

On sort peut être un peu du principe du Singleton, néanmoins l’esprit et les avantages y sont toujours (;

reduire

Les selecteurs d’attribut en CSS3

le 16 septembre 2007 par sahid

Utiliser les sélecteurs en CSS pour embellir vos liens

Les sélecteurs de sous-chaine dans la valeur d’un attribut en CSS est une fonctionnalité particuliÚrement intéressant pour donner à vos liens ou autres éléments des styles particuliers sans pour autant avoir à utiliser une classe.

Syntaxe

  • element[att^=”chaine”] La valeur de l’attribut att commence par chaine
  • element[att$=”chaine”] La valeur de l’attribut att termine par chaine
  • element[att*=”chaine”] La valeur de l’attribut att contient au moins une fois chaine

Exemple d’utilisation

Voyons comment les sélecteurs peuvent être utiles pour vos liens

  1. a {
  2.         color:#444;
  3.         font-size:16px;
  4.         padding: 6px 0px  6px 36px;
  5. }
  6. /* liens vers … */
  7. a[href*=“php.net”] {
  8.         background:url(‘php.png’) no-repeat 0 50%;
  9. }
  10. a[href*=“wikipedia.org”] {
  11.         background:url(‘wikipedia.png’) no-repeat 0 50%;
  12. }
  13. /* images, videos etc…*/
  14. a[href$=“avi”], a[href$=“mpg”] {
  15.         background:url(‘video.png’) no-repeat 0 50%;
  16. }
  17. a[href$=“png”], a[href$=“jpg”] {
  18.         background:url(‘image.png’) no-repeat 0 50%;
  19. }
  20. /* mail */
  21. a[href^=“mailto:”]{
  22.         background:url(‘mail.png’) no-repeat 0 50%;
  23. }
  1. <a href=“http://fr.php.net/”>php.net</a> <!– etc … –>

CSS selectors

Bien sûr vous pouvez utiliser tous types d’attribut, src, alt, rel, title etc…
Pour une utilisation avancée des sélecteurs, vous pouvez vous réferer
au site de la W3C

les icones sont tirées du projet Freedesktop Tango

reduire

Free Software Sticker Book

le 21 août 2007 par sahid

Des stickers (autocollants) libres de la FSF pour décorer son portable ( :