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

Powered by OpenSource Softwares

Outil de déboggage colaborative
reduire

Synchroniser deux copies locale avec Subversion

le 24 octobre 2008 par sahid

Script utile pour synchroniser deux copies locale

Ce script peut être utile si comme moi, vous avez eu un problème pour synchroniser plusieurs machines toutes connectées à un repository qui lui est à une version trop élevée pour être mise en production, ou si vous ajoutez simplement une nouvelle machine dans votre cluster.

app01 est une machine en production et app02 est une nouvelle machine à installer, en faisant le checkout du projet sur app02, celui-ci sera automatiquement mis à la dernière révision, hors les machines en productions sont à une révision inférieur car les nouveautés n’ont pas encore été publiées.

Usage

  1. # création de la copie locale sur la nouvelle machine app02
  2. sahid@app02:~/my-project$ svn co http://svn01/trunk .
  3. sahid@app02:~/my-project$ svn info
  4. Path: .
  5. URL: http://svn01/trunk
  6. Repository Root: http://svn01
  7. Repository UUID: 586607cd-4b0d-0410-991d-ebafab6a8aee
  8. Revision: 8560
  9. Node Kind: directory
  10. Schedule: normal
  11. Last Changed Author: sahid
  12. Last Changed Rev: 8560
  13. Last Changed Date: 2008-10-23 17:27:27 +0200 (Thu, 23 Oct 2008)
  14.  
  15. # Vérifie à qu’elle version est app01
  16. sahid@app01:~/my-project$ svn info
  17. Path: .
  18. URL: http://svn01/trunk
  19. Repository Root: http://svn01
  20. Repository UUID: 586607cd-4b0d-0410-991d-ebafab6a8aee
  21. Revision: 7309
  22. Node Kind: directory
  23. Schedule: normal
  24. Last Changed Author: sahid
  25. Last Changed Rev: 7309
  26. Last Changed Date: 2008-08-15 17:55:17 +0200 (Thu, 15 Oct 2008)
  27.  
  28. # Pour synchroniser app02 avec app01
  29.  
  30. sahid@app01:~/my-project$ ./svn_sync.py -d > mydiffs
  31. sahid@app02:~/my-project$ sh mydiffs
  32. sahid@app02:~/my-project$ svn info
  33. Path: .
  34. URL: http://svn01/trunk
  35. Repository Root: http://svn01
  36. Repository UUID: 586607cd-4b0d-0410-991d-ebafab6a8aee
  37. Revision: 7309
  38. Node Kind: directory
  39. Schedule: normal
  40. Last Changed Author: sahid
  41. Last Changed Rev: 7309
  42. Last Changed Date: 2008-08-15 17:55:17 +0200 (Thu, 15 Oct 2008)

Les sources

Je met à dispos les sources de svn_sync.py si cela peut servir.
svn_sync.py

reduire

Google Chrome

le 2 septembre 2008 par sahid

google chrome

Un nouveau navigateur dans la course !

Google se lance dans le développement de son propre navigateur web Google Chrome, apres tous ses partenariats avec Firefox, je me demande bien pourquoi ne pas avoir simplement fait un fork de FF en lui ajoutant toutes les fonctionnalités désirées… je suis tombé sur l’info sur le site www.theglobeandmail.com

reduire

Fade-In/Fade-Out avec Javascript et Prototype.js

le 25 août 2008 par sahid

Fade-In/Fade-Out with Javascript and Prototype.js

Faire apparaître et disparaître des éléments HTML

Bon…, apres avoir recherché deux, trois minutes sur google afin de trouver une methode de fade in/out en Javascript utilisant prototype et surtout n’étant pas une usine à gaz, je me suis mis à en coder une rapide.

Exemple:

Les methodes de fade-In et fade-Out

Les deux fonctionnes de la même manière, elles étendent la classe Element avec la methode addMethodes de prototype.

methods Parameters Events
fadeIn ([options]) delay (in millisecond), begin (start opacity, min 0.0), end (end opacity, max 1.0) onCreate, onComplete
fadeOut ([options]) delay (in millisecond), begin (start opacity, min 0.0), end (end opacity, max 1.0) onCreate, onComplete

Usage:

  1. $ (‘myElement’).fadeIn (); // fait apparaître
  2. $ (‘myElement’).fadeOut ()// fait disparaître
  3.  
  4. /** options avancées */
  5. $ (‘myElement’).observe (‘fadeIn:onComplete’, callback).fadeIn ();
  6. $ (‘myElement’).fadeIn ({delay:30}); /// default 8
  7. $ (‘myElement’).fadeIn ({delay:30, begin:0.3}); // default 0.0
  8. $ (‘myElement’).fadeIn ({delay:30, begin:0.3, end:0.8}); // default 1.0
  9.  

Source:

http://sahid.funraill.org/wp-content/uploads/2008/08/fadeinout.js

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. }

preload.js

Ajout d’un effet de fade-in à la fonction (utilisé ici)

Exemple:

Source:

http://sahid.funraill.org/wp-content/uploads/2008/09/preload-with-fadein.html

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/48 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

POO Bonne pratique, Retour de methode

le 5 juin 2008 par sahid

Retour de méthode en POO

Dans une classe, je pense qu’il est bon de donner en valeur de retour aux méthodes qui modifies les propriétés de la celle-ci, leur propre instance, prenons l’exemple de la bonne vielle classe Point :)

Exemple en C++

  1. class Point {
  2.  private:
  3.   int _x;
  4.   int _y;
  5.  public:
  6.   Point (int x, int y) {
  7.     _x = x;
  8.     _y = y;
  9.   }
  10.   Point * updateX (int new_x) {
  11.     _x = new_x;
  12.     return this;
  13.   }
  14.   Point * updateY (int new_y) {
  15.     _y = new_y;
  16.     return this;
  17.   }
  18. };
  19.  
  20. int
  21. main (int argc, char * argv[])
  22. {
  23.   Point * p_obj;
  24.  
  25.   p_obj = new Point (3, 5);
  26.   p_obj
  27.     ->updateX (10)
  28.     ->updateY (8);
  29. }

Exemple en PHP5

  1. class Point {
  2.   private _x;
  3.   private _y;
  4.   public function __construct ($x, $y) {
  5.     $this->_x = $x;
  6.     $this->_y = $y;
  7.   }
  8.   public function updateX ($new_x) {
  9.     $this->_x = $new_x;
  10.     return $this;
  11.   }
  12.   public function updateY ($new_y) {
  13.     $this->_y = $new_y;
  14.     return $this;
  15.   }
  16. }
  17.  
  18. $point = new Point (3, 5);
  19. $point->updateX (8)->updateY(10);

Rien de bien extraordinaire dans tous cela, je vous l’accorde !, mais j’aimerais bien publier le plus souvent possible des retours d’expériences en programmation objet, des plus simples aux plus complexes (en gros ce qui me passe par la tête), les exemples seront sous PHP5 la plupart du temps mais ils peuvent très bien fonctionner sur tout autre langages et surtout, il peut être intéressant d’échanger sur nos techniques de programmation orienté objet.

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… - get 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

  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 : 07/09/08)

   Gmail Le probleme libg110 est corrigé
   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 !.