Après plusieurs mois de développement, la version 1.1 du framework PHP Symfony est désormais officiellement disponible.
Parmi les nouveautés et évolutions nous trouvons entre autres :
A noter également des améliorations de l'internalisation, des outils de test et une refonte totale de l'utilitaire en ligne de commande.
Pour en savoir plus :
The wait is over: symfony 1.1 released
Documentation d'installation
Petite découverte aujourd'hui en cherchant un peu par hasard mysql_num_rows dans Google, puisqu'on peut y voir un petit extrait de code PHP d'une application nommée eNdonesia (d'ailleurs le fait d'avoir des mysql_query() et mysql_num_rows() perdus au milieu de HTML ne donne pas très envie mais c'est une autre histoire...).
Je savais que la recherche universelle était en place depuis un moment, mais c'est la première fois que je vois des morceaux de Google Code Search au milieu des résultats et pourtant des recherches portant sur du code j'en fais régulièrement. En regardant les autres moteurs sur la même recherche, il est amusant de constater que Yahoo! remonte en dixième place une page avec le célèbre warning "Warning: mysql_num_rows(): supplied argument is not a valid MySQL result" qui est certes répèter un bon nombre de fois. Les résultats sur Live sont encore plus surprenants, puisque ce dernier sort une page du même genre en neuvième position mais chose étonnante, il faut aller en troisième page pour trouver une page de PHP.net et encore ce n'est pas la bonne ! Google a semble t il encore un bonne longueur d'avance !
Après la sortie récente de Symfony 1.1, Fabien Potencier décrit la feuille de route pour Symfony 1.2, dont la sortie est prévue en octobre 2008.
Les nouvelles fonctionnalités prévues sont les suivantes :
Il annonce un nouveau management des sorties de Symfony dont la date de sortie sera désormais fixée à l'avance. Notamment celle de la version 1.2 est d'ores et déjà prévue pour octobre 2008, quatre mois selon après la version 1.1. Pour permettre ce type de management, le développement de chaque nouvel élément sera rendu indépendant des autres et attribué à un membre spécifique de l'équipe.
Il est à noter que seul l'ajout du point sur l'admin generator est considéré comme "must-have" pour la version 1.2, les autres seront ajoutés s'ils sont prêts à la date échue.
Pour en savoir plus :
Lors du traitement de photos avec Lightroom l'une des étapes essentielles est de supprimer des photos du catalogue lors du tri. Il arrive que la photo soit retirée du catalogue mais se trouve toujours sur le disque. La place disque ainsi perdue devient non-négligeable.
N'ayant pas trouvé de solution sur la toile j'ai écrit un script [PHP][php] qui parcourt récursivement un répertoire et regarde si les fichiers photos existe dans le catalogue de lightroom.
[php]: http://www.php.net Attention : je ne prends aucune responsabilité quand à l'utilisation que vous pourrez en faire, une mauvaise utilisation peut détruire votre catalogue, faites une sauvegarde au préalable.
Limitations : ce script n'interagi qu'avec un catalogue à la fois, si vous avez plusieurs catalogues référençant les mêmes photos sur le disque ce script ne vous sera pas d'une grande aide
Lightroom utilise une base de données SQLite il est donc possible de faire des requêtes sur cette base. Le schéma n'est pas publié par Adobe, si votre catalogue est corrompu ne venez pas vous plaindre ![]()
Le script est non destructif, il affiche les informations sur les fichiers et les commandes que vous pouvez executer pour les supprimer.
Exemple d'utilisation (sur OS X):
php find_deleted_photos_lr.php ~/Pictures ~/Pictures/Lightroom/Lightroom\ Catalog.lrcat
Le script : http://www.limbourg.com/arnaud/code/find_deleted_photos_lr.php.txt
Les extensions considérées comme des photos se trouvent en début de script, modifiez les à votre guise.
ps: le script n'est pas spécialement beau. Denombreux bouts de code des examples de SPL (la librairie standard PHP) sont utilisés
Lors du traitement de photos avec Lightroom l'une des étapes essentielles est de supprimer des photos du catalogue lors du tri. Il arrive que la photo soit retirée du catalogue mais se trouve toujours sur le disque. La place disque ainsi perdue devient non-négligeable.
N'ayant pas trouvé de solution sur la toile j'ai écrit un script [PHP][php] qui parcourt récursivement un répertoire et regarde si les fichiers photos existe dans le catalogue de lightroom.
[php]: http://www.php.net Attention : je ne prends aucune responsabilité quand à l'utilisation que vous pourrez en faire, une mauvaise utilisation peut détruire votre catalogue, faites une sauvegarde au préalable.
Limitations : ce script n'interagi qu'avec un catalogue à la fois, si vous avez plusieurs catalogues référençant les mêmes photos sur le disque ce script ne vous sera pas d'une grande aide
Lightroom utilise une base de données SQLite il est donc possible de faire des requêtes sur cette base. Le schéma n'est pas publié par Adobe, si votre catalogue est corrompu ne venez pas vous plaindre ![]()
Le script est non destructif, il affiche les informations sur les fichiers et les commandes que vous pouvez executer pour les supprimer.
Exemple d'utilisation (sur OS X):
php find_deleted_photos_lr.php ~/Pictures ~/Pictures/Lightroom/Lightroom\ Catalog.lrcat
Le script : http://www.limbourg.com/arnaud/code/find_deleted_photos_lr.php.txt
Les extensions considérées comme des photos se trouvent en début de script, modifiez les à votre guise.
ps: le script n'est pas spécialement beau. Denombreux bouts de code des examples de SPL (la librairie standard PHP) sont utilisés
Sur son blog, Alex Shapovalov propose deux séries de tests comparatifs des CMS Typo3, Joomla!, and Drupal.
En mai 2008, une première série de tests lui avait permis de conclure que Drupal était notablement plus rapide que les autres CMS testés.
De nombreuses personnes lui avaient alors reproché de ne pas avoir fait le nécessaire pour optimiser le résultat de chacun des CMS testé (cache, environnement, ...). Aujourd'hui il propose les résultats d'une nouvelle série de tests en ayant fait les optimisations demandées. Il en conclut que Drupal tire encore une fois son épingle du jeu.
Affaire à suivre. Il ne serait guère étonnant que d'autres séries de tests voient le jour dans les prochains mois.
Pour en savoir plus :
Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences.
N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.
|
Des interfaces PHP plus conviviales
(1914 hits) |
|
30 Classes et Composants PHP utiles
(1659 hits) |
|
Plus de 1000 scripts PHP
(1499 hits) |
|
introduction au PHP/Java Bridge
(1222 hits) |
|
Outils pour le suivi des performances MySQL
(1198 hits) |
|
|
addslashes : toujours la protection numéro 1?
(1110 hits) |
|
PHruts : Portage de Struts en PHP5 en version bêta
(1097 hits) |
PHP et MySQL ne font l'objet d'aucune alerte de sécurité dans leurs versions courantes :
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communauté) , 5.1.24-rc et 6.0.4.
Les mises à jour sont recommandées vers ces versions.
3 alertes de sécurité ont été émises cette semaine, concernant des applications suivantes :
Drupal, Joomla et phpMyAdmin
Après quelques années d'absence, la 5ème édition de la VIP aura lieu du 11 au 13 juillet 2008 aux alentours de Lyon.
Cette rencontre sera le lieu de prédilection de la création numérique. La demoparty ou aussi appelé coding party comporte différents concours informatiques dans lesquels les créateurs peuvent s'affronter, s'évaluer, en laissant une grande part de liberté dans la création et l'imagination.
Les principaux sponsors de ce rendez-vous sont :
Cette année verra apparaitre une série de conférences accessible pour les visiteurs et les participants, dont une des conférences sera sous le thème de "Qu'est ce PHP ?" le Samedi 12 juillet a 14h00, présente par moi même (christophe Villeneuve)
Pour plus d'informations sur la VIP : cliquez ici
backup database employees to 'emp2.bkp'; restore from 'emp2.bkp';
Une stratégie de backup complète d’un site web est efficace tant que la taille de ce site web reste raisonnable. Avec un site de plusieurs dizaines de gigaoctets, il devient en effet plus compliqué de rapatrier chez soi la backup du site.
Je ne parle ici que de backup des fichiers propres au site (images uploadées par exemple), pas de sa base de donnée qui doit faire l’objet d’une stratégie de sauvegarde plus poussée.
Jusqu’à présent, en faisant “avec les moyens du bord”, je procédais de la façon suivante pour posséder une sauvegarde perso d’un site web:
Mais voilà, maintenant que le site en question pèse dans sa totalité une vingtaine de giga, même avec une connexion symétrique à 100Mb/s, c’est laborieux. Il faut donc trouver un autre moyen. Ici, la solution s’appelle rsync et permet de posséder une copie du site identique à l’instant de la synchronisation.
Maintenant pour posséder une sauvegarde perso d’un site, je n’ai plus qu’à lancer manuellement ma commande rsync sur mon PC quand celui-ci est allumé afin de rapatrier les nouveaux fichiers crées ou supprimés sur le serveur, et sans devoir télécharger tout le reste qui n’a pas changé. Mon PC étant sous Windows, il serait dommage de se priver de rsync.
1. #useradd -g www -s /bin/bash rsync
2. #passwd rsync
Sous Windows, dans le dossier \bin de cwRsync
3. rsync –verbose –progress –stats –compress –recursive –delete -e “ssh.exe -p 8000″ rsync@monserver.fr:/home/server/htdocs/mondossier “/cygdrive/f/Backup/rsync”
Note : il s’agit de double tiret et non de tiret simple
Etape 1 :
On crée un utilisateur sur le serveur possédant un vrai shell (pas de /bin/false car rsync doit pouvoir exécuter des commandes shell). Cet utilisateur doit posséder le droit de lecture sur votre répertoire à backuper (par exemple htdocs/), ainsi que ses sous-répertoires. Ici je le place dans les users de mon groupe www qui possèdent le droit de parcourir mon répertoire htdocs et ses enfants.
Etape 2 :
Un password fort à mettre en place pour l’utilisateur. Cet utilisateur aura le pouvoir de se connecter en SSH sur votre serveur et de parcourir vos fichiers. Ici pas de mis en place d’une authentification par clés SSH, nous utiliserons une connexion manuelle avec un mot de passe à entrer manuellement, car ici c’est à vous de lancer le processus de synchronisation quand vous le souhaitez. Pour un tutorial complet sur comment mettre en place un rsync automatique avec utilisations de clés SSH, rendez-vous sur cet excellent tutotial publié sur Howtoforge
Etape 3 :
cwRsync est une version packagée pour windows de rsync et ssh grâce à cygwin. Il vous fournit une fois installé les binaires rsync.exe et ssh.exe dans son dossier \bin.
Voici les arguments utilisés (rsync –help pour toutes les options) :
–verbose
Détails de l’exécution du programme
–progress
Voir l’avancement du téléchargement pendant les transferts
–stats
Des stats sur les transferts (vitesse de transfert)
–compress
Compression des fichiers transférés
–recursive
Parcourir les sous répertoires du dossier à backuper
–delete
Supprimer aussi les fichiers sauvegardés si ils n’existent plus sur le serveur
-e “ssh.exe -p 8000″ ou -e “ssh -p 8000″ ou -e “ssh”
Commande du shell distant à utiliser (ici ssh.exe dans le même répertoire que rsync.exe), suivi des arguments optionnels à lui passer, ici connexion sur le port distant 8000 et pas le traditionnel 22 (le serveur cible n’acceptant pas les connexions SSH sur le port 22 mais sur le 8000)
rsync@monserver.fr:/home/server/htdocs/mondossier
L’utilisateur ssh est ici rsync, on se connecte au server cible server.fr (ou une IP) et on demande de commencer la sauvegarde en démarrant depuis le dossier /home/server/htdocs/mondossier. Extrait du manpage :
“Le transport par shell distant est utilisé à chaque fois que le chemin source ou destination contient un séparateur «:» après la spécification de l’hôte. Le contact direct avec un démon rsync est utilisé lorsque le chemin source ou destination contient un séparateur «::» après la spécification de l’hôte, OU lorsqu’une URL rsync:// est spécifiée”
“/cygdrive/f/Backup/rsync”
C’est la synthaxe à utiliser pour copier les fichiers sur le disque dur F: et dans le dossier Backup/rsync. On ne peut pas indiquer un chemin windows directement comme ‘F:/Backup …’, il faut passer par l’abstraction des disque cygwin (/cygdrive/LETTRE_LECTEUR/VOTRE/DOSSIER)
Dans un article paru sur le site IBM, Vikram Vaswani propose un tutoriel permettant d'associer l'API Google calendar et l'extension SimpleXML de PHP et/ou la librairie GData de Zend.
Ce tutoriel commence par donner quelques explications sur le format de sortie de l'API Google Calendar et comment récupérer les événements en usant de SimpleXML ou des librairies Zend. Il aborde ensuite les fonctionnalités de gestion et de recherche des événements.
Pour en savoir plus :
Zend Technologies a annoncé aujourd'hui l'ouverture des inscriptions pour la quatrième conférence annuelle Zend/PHP.
Celle-ci se tiendra du 15 au 18 septembre, à Santa Clara, en Californie. Cette année sera axée sur les améliorations importantes que PHP peut apporter aux nouvelles applications web, à l'avantage de leurs utilisateurs.
Pour plus d'informations :
<?php $numbers = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); $result = from('$number')->in($numbers) ->where('$number => $number > 5') ->select('$number'); ?>
Je découvre la nouvelle version de PHPTeam. Pour l’instant, le fork de Symfonians est encore un peu brutal, comme, par exemple, le bloc “a propos” mais il y a déjà quelques articles, un super logo et deux offres d’emploi !
Une bonne initiative si elle est suivie d’inscriptions et de contenus.
Bon courage aux développeurs de ce site.
Article original publié sur Glagla Dot Org. Tous droits réservés.
Sur le site Developper Shed, Alejandro Gervasio propose aujourd'hui un tutoriel pour réaliser une classe d'envoi de emails MIME avec PHP5.
Ce tutoriel est composé de quatres parties :
(encore un post un peu pense bête pour moi)
Les helpers sont pratiques pour afficher des images ou créer des liens htmls. Parfois, on désire lier des documents que l’on a uploadé dans un répertoire spécifique ou autre bizarrerie. La classe sfWebRequest de Symfony fourni une méthode bien pratique pour faire ça. Par exemple pour accéder au fichier raoul.pdf dans le répertoire web/uploads/pdf :
echo '<a href="'.$sf_request->getRelativeUrlRoot().'/'. sfConfig::get('sf_upload_dir_name').'/pdf/raoul.pdf' .'raoul.pdf</a>';
Cet objet est automatiquement accessible depuis vos vues via la variable $sf_request.
Article original publié sur Glagla Dot Org. Tous droits réservés.
Web Form Design Patterns: Sign-Up Forms, Part 2 | How-To | Smashing Magazine
Last week we have presented first findings of our web forms survey. The main objective of the survey was to provide designers and developers with some intuition of how effective web forms are designed; we also presented some guidelines of how an effective and user-friendly web form can be achieved.
A semi-automated, largely passive web application security audit tool, optimized for an accurate and sensitive detection, and automatic annotation, of potential problems and security-relevant design patterns based on the observation of existing, user-initiated traffic in complex web 2.0 environments.
(categories: security 2.0 code design google web)
Recherchez vos documents Google Documents sur votre Mac avec Spotlight
Vous possédez un Mac et vous utilisez Google Document. Voici une application qui vous permettra de rechercher des documents et signets présents sur votre compte Google en utilisant Spotlight. Cette utilitaire se nomme Precipitate, il a été développé par Stuart Morgan de chez Google.
(categories: spotlight google docs google mac)
Go!Explore est hyper facile à utiliser, et que vous soyez piéton ou automobiliste, il fait de votre PSP un système GPS idéal.
(categories: psp gps)
Article original publié sur Glagla Dot Org. Tous droits réservés.
Les version 6.3 et 5.8 de DRUPAL sont disponibles. Ce sont des versions de maintenance pour corriger des failles de sécurités ainsi que des problèmes signalés par l'outil de suivi des bugs.
La version 6.3 inclue également :
Il est a noter que Views pour Drupal 6 nécessite la version 6.3 pour fonctionner correctement.
La mise à jour des versions existantes de DRUPAL 5 et 6 est vivement recommandée. Pour plus d'information, vous pouvez consulter l'annonce sur le site du projet DRUPAL
Ce livre a été écrit par Marc Delisle [ISBN 1904811035]. D'après Cal Evans, ce livre s'adresse aussi bien aux utilisateurs finaux (développeurs et administrateurs de bases de données) qu'aux administrateurs systèmes. Il considère que ce livre est particulièrement intéressant pour :
Pour plus d'informations :
Joomla! 1.5.4 [Naiki] est disponible depuis quelques jours. Il s'agit d'une version de maintenance incluant quelques correctifs de vulnérabilités modérées, des corrections de bugs et quelques améliorations.
La version 1.1.1 de wamp MSS (Mobil Storage Server) est enfin disponible !
La version 1.1.1 de wampMSS (Mobile Storage Server) qui est une version modifiée de wamp permet de faire fonctionner un serveur apache, php, mysql sur un périphérique USB
Cette version comprend :
- Apache 2.2.9
- PHP 5.2.6
- MySQL 5.0.51b
- PhPMyAdmin 2.11.7
- SQLiteManager 1.2.0 RC2
rendez-vous sur http://www.uni-d.net
Proposé par UNi
Ce qui est sympa à trois ans, c’est qu’un rien t’amuse !
Article original publié sur Glagla Dot Org. Tous droits réservés.
PHP et MySQL ne font l'objet d'aucune alerte de sécurité dans leurs versions courantes :
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communauté) , 5.1.24-rc et 6.0.4.
Les mises à jour sont recommandées vers ces versions.
10 alertes de sécurité ont été émises cette semaine, concernant des applications suivantes :
Drupal, Gallery, Joomla, MyBB, PHP Nuke, V-webmail, Zen Cart, phpMyAdmin, vBulletin et wordpress
Dans le magazine PHP solution (4/2008) qui vient de sortir, un article sur le PDO et plus précisemment : L'approche d'un projet en PDO
Dans ce numéro les autres concernent :
While setting up a test server for some software I wrote at the office, I eventually noticed the following notice:
Notice: Use of undefined constant self - assumed 'self'
That surprised me, because 1) I though self were some kind of "superglobal" constant or a special token of the parser, always automatically available in a static method and 2) the code works. So what's up in there ? Let's make a simple test:
<?php
class foo {
static public function bar() {
var_dump(is_callable(array('self', 'foobar')));
var_dump(is_callable(array(self, 'foobar')));
var_dump(class_exists('self'));
var_dump(class_exists(self));
self::foobar();
}
static public function foobar() {
}
}
foo::bar();
Executing the above code will yeld the following result:
bool(true) Notice: Use of undefined constant self - assumed 'self' in /home/geoffreyb/test.php on line 6 bool(true) bool(false) Notice: Use of undefined constant self - assumed 'self' in /home/geoffreyb/test.php on line 9 bool(false)
What do we learn here ? Not much actually. It seems like self as a constant is only available when used with the scope resolution operator, aka double-colon or paamayim nekudotayim. When you want to use it in, for example, a callback definition, use a string representation of self:
<?php
is_callable(array('self', 'bar'));
call_user_func(array('self', 'bar'));
Which, while making absolutely no sense at all, works. Another way to get around this is to use the get_class() function that, without any argument, will return the name of the class you're currently in (foo in my example).
After a bit more investiging, I found out that there is nothing special about the self token, which is actually a string token. You can check this very easily with the following code:
<?php
class foo {
static public function bar() {
self::foobar();
}
}
var_dump(token_get_all(file_get_contents(__FILE__)));
Somewhere inside the output, you'll find the following piece of text:
array(2) {
[0]=>
int(307)
[1]=>
string(4) "self"
}
And the token id 307 is resolved by token_name to string.
While setting up a test server for some software I wrote at the office, I eventually noticed the following notice:
Notice: Use of undefined constant self - assumed 'self'
That surprised me, because 1) I though self were some kind of "superglobal" constant or a special token of the parser, always automatically available in a static method and 2) the code works. So what's up in there ? Let's make a simple test:
<?php
class foo {
static public function bar() {
var_dump(is_callable(array('self', 'foobar')));
var_dump(is_callable(array(self, 'foobar')));
var_dump(class_exists('self'));
var_dump(class_exists(self));
self::foobar();
}
static public function foobar() {
}
}
foo::bar();
Executing the above code will yeld the following result:
bool(true) Notice: Use of undefined constant self - assumed 'self' in /home/geoffreyb/test.php on line 6 bool(true) bool(false) Notice: Use of undefined constant self - assumed 'self' in /home/geoffreyb/test.php on line 9 bool(false)
What do we learn here ? Not much actually. It seems like self as a constant is only available when used with the scope resolution operator, aka double-colon or paamayim nekudotayim. When you want to use it in, for example, a callback definition, use a string representation of self:
<?php
is_callable(array('self', 'bar'));
call_user_func(array('self', 'bar'));
Which, while making absolutely no sense at all, works. Another way to get around this is to use the get_class() function that, without any argument, will return the name of the class you're currently in (foo in my example).
After a bit more investiging, I found out that there is nothing special about the self token, which is actually a string token. You can check this very easily with the following code:
<?php
class foo {
static public function bar() {
self::foobar();
}
}
var_dump(token_get_all(file_get_contents(__FILE__)));
Somewhere inside the output, you'll find the following piece of text:
array(2) {
[0]=>
int(307)
[1]=>
string(4) "self"
}
And the token id 307 is resolved by token_name to string.

Vendredi aura lieu le prochain apérophp à "la lunette" place de la monnaie à Bruxelles. 19h le 18 du 7 espérons être au moins 6 ....
Signalez votre participation pour cette rencontre informelle
Au mois d'Août aura lieu le 2ème phpBelgium Meeting.
Plus conventionnel, il y aura des présentations/discussions au sujet de diverses matières connexes par PHP, telles que la certification de Zend PHP5, le Zend framework et davantage.
Envoyez vos idées l'adresse pour les intéressés c'est http://upcoming.yahoo.com/event/805818.
et suivez le twit de phpBelgium

D’après le blog de mon collègue et ami Julien PAULI, PHP 5.3 devrait bientôt être disponible.
Reprise des infos de son post :
PHP 5.3 :
* Features freeze le 24 Juillet
* Bétas à partir du mois prochain (courant Aout 2008)
* Sortie prévue fin octobre 2008
Points actuellement sous l’attention :
* namespaces
* late static binding
* re2c
* windows support
* minimizing BC support/documentation
* intl extension
* phar extension
* E_DEPRECATED
* __callStatic
* Garbage Collection
* MySQLnd
Sa source : http://marc.info/?l=php-internals&m=121577053504295&w=2
La version 2.6 de Worpress est disponible, presque un mois avant la date prévue.
Cette version comporte quelques nouvelles caractéristiques pour augmenter la performance de Wordpress en tant que CMS, notamment un système de suivi des révisions. Une vidéo est disponible sur wordpress.org pour faire le tour des améliorations apportés par Wordpress 2.6.
D'après l'auteur du communiqué sur wordpress.org, la compatibilité des plugins et thèmes entre les versions 2.5 et 2.6 ne devrait pas poser de problèmes majeurs. Il est à noter que la branche 2.5 ne sera désormais plus maintenue, que tous les utilisateurs sont encouragés à passer à la version 2.6.
Pas possible de prendre son petit dej tranquille !!!!
Article original publié sur Glagla Dot Org. Tous droits réservés.
Dans le but d’accélérer le back office, WordPress 2.6 intègre maintenant Google Gears !
Pour l’instant le bouton turbo ne sert qu’a mettre en local certaines CSS, javascripts et autres données générales de votre blog, mais on peut espérer une utilisation plus intensive dans le futur comme la contribution hors-ligne.

Sur mon hébergement, le back office est sensiblement plus rapide.
Chapeau WordPress !
Article original publié sur Glagla Dot Org. Tous droits réservés.
Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences.
N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.
Automator est un logiciel fourni par apple permettant au premier utilisateur venu de créer visuellement des applications enchainant des actions simples. Automator est à mon avis assez méconnu et mériterait plus de publicités.
Mon site hébergé par Gandi avait besoin d’un petit système de sauvegarde. En bon informaticien j’ai cherché le moyen le plus rapide et simple pour le réaliser.
Il se trouve que mon ordinateur personnel est largement sauvegardé via un disque dur externe + Time Machine ainsi que par Mozy. Rapatrier les sauvegardes sur cet ordinateur n’est donc pas idiot. Certes, il n’est pas tout le temps allumé, par exemple quand je part en vacances, mais dans ce cas là je ne mets pas à jour ce blog non plus … ce système me parait donc pas mal.
J’ai donc réaliser un script shell qui dump les données de mes bases SQL, qui copie les données de mes sites et qui compresse tout ça. J’obtiens une belle archive que je place dans un répertoire publié sur le web. (avec une protection htaccess bien suffisante).
Exemple de code :
/usr/bin/mysqldump -u reader blog > /tmp/dump.sql
/bin/tar zcf /tmp/backup_sql.tgz /tmp/dump.sql
/bin/tar zcf /tmp/backup_olivier.tgz /srv/d_glagla/olivier
mv …
zip …
A partir de là j’assemble un script automator sauvegardé comme une application qui :
Et voila. Le tout sans taper une ligne de code.
Vous pouvez télécharger cet exemple enregistré sous forme de workflow : exemple de processus.
Afin de lancer ce script tous les jours, j’ajoute simplement une alerte iCal ouvrant le fichier correspondant à mon appli automator.

Article original publié sur Glagla Dot Org. Tous droits réservés.
Le mois dernier a été lancé la première émission de la "chaine" PHPTV.
En partenariat avec l'AFUP, PHPTV est un projet communautaire ayant pour but de proposer un magazine TV orienté sur la technologie PHP.
Au programme de l'émission de juin vous retrouverez :
Comme d'habitude, pour plus d'informations rendez-vous directement à la source (qui dispose d'un flux RSS et/ou d'une newsletter pour vous tenir au courant de nouvelles émissions).
Souhaitons bonne chance à cette initiative !
Royal Pingdom » Forget about hacking - your servers might get stolen
When it comes to security, there is often a focus on the software side, thwarting hackers and other virtual threats such as viruses and worms. When it comes to uptime and availability, focus often rests on redundant power, clustering, and other similar strategies. We often forget about something that can put a stop to any operation: good, old-fashioned, real-life robbery.
(categories: software Robbery security)
Le spam représente 81,6% des emails au niveau monde par Neteco.com
Malgré bien des tentatives pour essayer de l’éradiquer et de le minimiser, le spam ou courrier électronique non sollicité reste plus que jamais d’actualité. Dans une récente étude publiée par MessageLabs, 81,5% des emails reçus au travers des fournisseurs d’accès seraient du spam.
(categories: spam)
La première télévision sur le web entièrement consacrée à PHP vient d’être officiellement lancée. PHPTV est une initiative de l’AFUP produite par la société OpenStates. Cette web TV publiera une émission chaque mois.
(categories: php web phptv afup)
Zend, la PHP compagnie, lève 7 millions de dollars par Neteco.com
Zend, « The PHP Company », lève 7 millions de dollars auprès de TriplePoint Capital. Cette nouvelle levée de fonds doit lui permettre de monter en puissance sur un marché en croissance.
Après tout, ce n’est qu’un petit million de moins que seesmic :-p
Comment localiser sa copine grâce à Orange !
Orange vient tout juste de mettre en ligne son API de localisation de téléphone mobile sur son portail Orange Partner :
http://www.orangepartner.com/
Cette API REST fonctionne pour tous les clients Orange France quel que soit leur modèle de téléphone (GPS ou non) à condition bien sûr qu’ils aient accepté préalablement le SMS de demande de localisation envoyée par le service.
(categories: blog api france portail organce geolocalisation)
Integrate your PHP application with Google Calendar
Google Calendar allows Web application developers to access user-generated content and event information through its REST-based Developer API. PHP’s SimpleXML extension and Zend’s GData Library are ideal for processing the XML feeds generated by this API and using them to build customized PHP applications. This article introduces the Google Calendar Data API, demonstrates how you can use it to browse user-generated calendars; add and update calendar events; and perform keyword searches.
(categories: php web google library xml api extension)
Google devrait numériser des documents de la bibliothèque de Lyon
Le groupe internet Google devrait être choisi demain par la municipalité de Lyon pour numériser 500.000 documents du fonds ancien de la bibliothèque municipale.
Cela ferait de Lyon la première ville française à procéder à la numérisation de ses ouvrages patrimoniaux, antérieurs au XXe siècle.
Article original publié sur Glagla Dot Org. Tous droits réservés.
PHP et MySQL ne font l'objet d'aucune alerte de sécurité dans leurs versions courantes :
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communauté) , 5.1.26-rc et 6.0.5.
Les mises à jour sont recommandées vers ces versions.
7 alertes de sécurité ont été émises cette semaine, concernant des applications suivantes :
Claroline, Gallery, Joomla, MyBB, WordPress, ez et phpMyAdmin
Tous ceux qui ont déjà eux à batailler avec du code javascript connaissent certainement la fabuleuse extension Firebug pour Firefox. L'outil propose une console permettant d'examiner l'environnement d'exécution javascript mais aussi HTML et CSS de n'importe quelle page web.
FirePHP est une autre extension qui a pour but de proposer le même service mais pour le langage PHP. L'extension repose elle-même sur Firebug et propose, une fois installée, l'affichage dans la console des messages de debug émis depuis vos scripts PHP :

Une fois l'extension Firefox installée, pour pouvoir envoyer un message de log dans la console depuis vos scripts, il faut utiliser une librairie spécifique PHP fournie téléchargeable depuis la page d'accueil du projet FirePHP. Cette librairie très simple est d'ailleurs documentée ici. Une fois l'archive récupérée, décompressez-la et appelez FirePHP de cette façon depuis un script PHP standard :
require_once '/path/to/firephp/lib/FirePHPCore/FirePHP.class.php'; $f = FirePHP::getInstance(true); $f->fb('Hello FirePHP console', FirePHP::INFO); $f->fb(array('hello' => 'how are you?')); $f->fb(array('hello' => array('how', 'are', 'you'))); $f->fb(array('foo', 'bar'), 'Results', FirePHP::WARN); $o = new stdClass(); $o->foo = 'foofoo'; $o->bar = 'barbar'; $f->fb($o);
Pour envoyer les informations de debug à la console, la librairie PHP envoie les données sérialisées au format JSON dans un entête HTTP personnalisé dédié (X-FirePHP-Data). Ainsi, aucune interférence n'est possible avec vos scripts existants, la seule condition étant bien entendu de ne pas lancer la sortie standard PHP avant que ces entêtes aient été envoyés.

En bref, un outil génialement simple et efficace.
Ce billet intitulé Debug PHP facile avec Firefox, Firebug et FirePHP a été rédigé par Nicolas Perriault et publié sur le blog Prendre un Café sous licence Creative Commons BY-NC-SA.
C'est officiel depuis l'anniversaire des sept ans de SPIP (début juillet), la prochaine version de celui-ci adoptera une licence GNU/GPL 3.
Cette version de la licence GPL remplacera pour SPIP la version 2 écrite par la Free Software Foundation il y a déjà plus de 15ans !
Le principal intérêt qui a plébiscité le changement de la licence est la meilleure protection des droits d'auteurs pour les pays autres que les Etats-Unis.
Il faut tout de même savoir que la GPL2 et sa petite sœur la GPL3 sont incompatibles entre elle. Incompatible dans le sens où la version 2, comme la 3, interdit de combiner du code sous une autre licence. Plus concrètement les licences nous disent : "si vous incorporez du code sous cette licence dans un plus grand programme, ce dernier doit aussi être sous cette licence".
Mais bien sûr rien n'empêche a deux applications sous chacune de ces licences de fonctionner dans un même environnement. Comme nous le dit Richard Stallman en personne : "Par exemple, la licence TEX et la licence Apache sont incompatibles avec la GPLv2, mais cela ne nous empêche pas d'avoir TEX et Apache dans le même système avec Linux, Bash et GCC car ce sont tous des programmes séparés. Ainsi, si Bash et GCC évoluent vers la GPLv3, tandis que Linux reste sous la GPLv2, il n'y a pas de conflit."
Pas trop d'inquiétude avoir donc, mais pour plus d'informations :
... sont celles des projets sur lesquels je me greffe. C'est en effet pour moi une forme de respect que d'appliquer les standards de codage partagés par une communauté (ou une équipe) de développeurs : ainsi, on maximise les chances de se comprendre et on minimise les coûteuses phases de communication entre geeks introvertis[1] 
En effet, rien de plus pénible que de reprendre le code de quelqu'un qui a pris des libertés avec des conventions établies à ce niveau, l'apothéose étant obtenue avec ce genre de code :
<?php class Ma_superClasse { function dire_coucou ( $popol) { echo 'coucou ' . $popol . ' !' ; } function DireAuRevoir($Popol ) { print "Au revoir $Popol !"; } }
Je force bien évidemment ici le trait, mais tout le monde est déjà tombé sur ce genre de code illisible, qui multiplie par 10 votre temps d'intervention sur ce dernier et divise par 1000 votre passion pour la TMA.
Bien entendu, il peut arriver de produire du code sur un projet ne nécessitant l'utilisation d'aucune brique logicielle existante. Auquel cas vous pouvez librement appliquer vos propres standards de codage, l'important étant ici qu'ils soient cohérents et constamment appliqués. S'il peuvent être ceux d'un projet open source existant reconnu, cela augmentera la sympathie potentielle à votre égard de futurs intervenants sur votre code 
Je noterai quand même en vrac quelques bonnes pratiques générales globalement reconnues et appréciées :
Personnellement, j'ai mes petites préférences et tout comme Oncle Tom - qui m'a gentiment refilé cette chaîne[2] - j'ai tendance à appliquer les standards de codage de symfony, que je trouve homogènes et cohérents. Mais ce sont là bien évidemment essentiellement des questions de goûts et de couleurs.
[1] Voire les trolls genre les tabulations ça pue, vive l'indentation à trois espaces...
[2] Salopard, ça va se payer ! 
Ce billet intitulé Mes conventions de codage... a été rédigé par Nicolas Perriault et publié sur le blog Prendre un Café sous licence Creative Commons BY-NC-SA.
Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences.
N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.
C’est beau la technologie !
Article original publié sur Glagla Dot Org. Tous droits réservés.
La version 1.6 de Zend Framework est disponible au téléchargement.
Parmi les principales évolutions, on trouve par exemple :
Pour plus d'information, vous pouvez consulter l'annonce sur le site Zend.
Un important travail réalisé pour la sortie de Symfony 1.1 a été le retrait du pattern singleton du framework. On peut maintenant instancier plusieurs objet sfContext par exemple. Cela permet notamment de faire des liens inter-application a peu près proprement. Voici l’avancée de mon travail sur la question :
fichier lib/helper/crossAppLinkHelper.php
<?php /** * @author Olivier Mansour */ /** * return an url for a given symfony application and an internal url * work with symfony 1.1 * freely inspired from sfWebControlleur code * * @author Olivier Mansour * * @param string $appname * @param string $url * @param boolean $absolute * @param string $env * @param boolean $debug * @return string */ function cross_app_url_for($appname, $url, $absolute = 'false', $env = null, $debug = 'false') { if (sfConfig::get('sf_no_script_name')) { // wont work throw new sfException(__FUNCTION__.' : the cross app link helper will not work with sf_no_script_name to true'); } // get the environment if (is_null($env)) { $env = sfContext::getInstance()->getConfiguration()->getEnvironment(); } // context creation if (!sfContext::hasInstance($appname)) { $c = ProjectConfiguration::getApplicationConfiguration($appname, $env, $debug); sfContext::createInstance($c, $appname); } list($route_name, $parameters) = sfContext::getInstance($appname)->getController()->convertUrlStringToParameters($url); $request = sfContext::getInstance($appname)->getRequest(); $url_root = $request->getRelativeUrlRoot(); if ($absolute) { $url_root = 'http'.($request->isSecure() ? 's' : '').'://'.$request->getHost().$url_root; } //scriptname $scriptname = ''; if (($env != 'prod') and ($env)) { $env_suf = '_'.$env; } else { $env_suf = ''; } if (!file_exists(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$appname.$env_suf.'.php')) { //test with index ? if (file_exists(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.'index'.$env_suf.'.php')) $scriptname = 'index'.$env_suf.'.php'; else throw new sfException(__FUNCTION__.' : can\'t find a script name for appname : '.$appname.' and env : '.$env); } else { $scriptname = $appname.$env_suf.'.php'; } $fragment = ''; // strip fragment if (false !== ($pos = strpos($url, '#'))) { $fragment = substr($url, $pos + 1); $url = substr($url, 0, $pos); } // generate url list($route_name, $parameters) = sfContext::getInstance($appname)->getController()->convertUrlStringToParameters($url); if (sfConfig::get('sf_url_format') == 'PATH') { // use PATH format $divider = '/'; $equals = '/'; $querydiv = '/'; } else { // use GET format $divider = ini_get('arg_separator.output'); $equals = '='; $querydiv = '?'; } $web_url = $url_root.$querydiv.$scriptname.sfContext::getInstance($appname)->getRouting()->generate($route_name, $parameters, $querydiv, $divider, $equals); if ($fragment) { $web_url .= '#'.$fragment; } return $web_url; }
Pour l’utiliser (par exemple, depuis une application nommée back) :
<?php echo cross_app_url_for('front' , '/module/action?id=5&tmp=ok#raoul'); ?>
Je ne l’ai pas beaucoup testé et a vrai dire je ne sais pas si on peut faire plus efficace. Le point particulier qui m’a poussé à écrire autant de code est que, si il est facile d’extraire les routes pour un contexte donnée, la méthode genUrl de sfWebController utilise un objet sfRequest pour obtenir l’url du contrôleur (back_dev.php par exemple) ce qui est bloquant dans mon cas.
Si vous avez des retours n’hésitez pas.
Vous pouvez télécharger le code cité plus haut : crossAppLinkHelper.php.zip
Article original publié sur Glagla Dot Org. Tous droits réservés.
Sur le site de Zend, Richard Bates a récemment publié un tutoriel sur l'utilisation conjointe de AMFPHP et de dompdf pour créer des formulaires PDF sur une application Flex.
Ayant pu observé que la génération de fichier PDF à partir d'une application est considérée comme un standard par les utilisateurs alors que ce n'est pas forcément si simple pour les développeurs d'application web, il propose un tutoriel très complet pour répondre simplement à ce genre de problématique.
Pour les besoins d'un projet récent, j'ai eu besoin de valider la possibilité de gérer l'authentification et l'accès à la session symfony (côté serveur) depuis une interface générée par Adobe Flex (en Flash, donc côté client).
Pour cela, j'ai utilisé la librairie AmfPHP en version 1.9beta2, certes pas très récente mais suffisament fonctionnelle pour satisfaire à ce besoin précis. Voyons comment ça se passe concrètement. L'avantage de la démonstration ci-dessous est qu'elle ne nécessite pas d'installer Flex puisque AmfPHP fournit un navigateur de services (browser) qui nous suffira pour valider notre concept.
Je pars du principe que tout le monde a une installation de symfony 1.1 nanti d'une application main, ainsi qu'un projet et un virtual host apache fonctionnels pointant sur local.mademo.org. Si ce n'est pas le cas, voila de quoi vous mettre à jour.
On commence par installer le plugin sfGuard, qui se chargera de la persistance des droits et permissions utilisateurs en base de données, et fournira les utilitaires d'authentification et de manipulation de la session côté serveur :
$ ./symfony plugin:install sfGuardPlugin $ ./symfony propel-build-all $ ./symfony cc
On charge quelques données de test dans notre base de données nouvellement mise à jour :
$ mkdir data/fixtures $ cp plugins/sfGuardPlugin/data/fixtures.yml.sample data/fixtures/fixtures.yml $ ./symfony propel:data-load main
Ce jeu de données de test nous fournit par défaut un compte admin (mot de passe admin) qui nous servira à tester notre service d'authentification.
Ensuite, il nous faut modifier notre classe apps/main/lib/myUser.php gérant la session utilisateur afin qu'elle étende désormais la classe sfGuardSecurityUser, fournie par le plugin sfGuard :
<?php // Fichier apps/main/lib/myUser.php class myUser extends sfGuardSecurityUser { }
Nous allons installer la librairie AmfPHP dans le sous-répertoire web/ de notre projet[1], et aménager quelque peu notre arborescence pour accueillir les services AmfPHP :
$ cd /path/to/project $ svn export https://amfphp.svn.sourceforge.net/svnroot/amfphp/tags/1.9beta2 web/amfphp $ mkdir lib/amfphp-services $ mv web/amfphp/services/amfphp lib/amfphp-services/
Ceci fait, nous allons éditer plusieurs fichiers d'amfphp afin de l'adapter à notre environnement symfony. Tout d'abord, commençons par éditer la valeur de la variable $servicesPath dans le fichier web/amfphp/globals.php :
<?php // ... $servicesPath = dirname(__FILE__).'/../../lib/amfphp-services/';
Enfin, il nous faut "patcher"[2] le fichier web/amfphp/core/amf/app/Filters.php, qui initialise la session PHP sans définir le nom de la session. Ici, nous utiliserons le nom de la session symfony par défaut, "symfony" (ligne 105 du fichier) :
102 //Fix for godaddy not allowing ini_get 103 $sessionName = "PHPSESSID"; 104 } 105 session_name('symfony'); 106 session_start(); 107 $session_id = session_id();
Voila, nous pouvons maintenant créer un service de gestion de l'authentification, que nous nommerons pompeusement UserSessionService et que nous enregistrerons dans le fichier lib/amfphp-services/UserSessionService.php :
<?php require_once dirname(__FILE__).'/../../config/ProjectConfiguration.class.php'; /** * This class tests the symfony session within an AmfPHP context * */ class UserSessionService { /** * Symfony context * @var sfContext */ protected $context = null; /** * Symfony session * @var sfGuardSecurityUser */ protected $user = null; /** * Public constructor * */ public function __construct() { $configuration = ProjectConfiguration::getApplicationConfiguration('main', 'dev', true); $this->context = sfContext::createInstance($configuration); $this->user = $this->context->getUser(); } /** * Checks wheter user is authenticated or not * * @return boolean */ public function isAuthenticated() { return $this->getUser()->isAuthenticated(); } /** * Authenticates user * * @param string $username * @param string $password * @return boolean True if user has been successfully authenticated */ public function login($username, $password) { if ($this->isAuthenticated()) { return true; } $user = sfGuardUserPeer::retrieveByUsername($username); if (!is_null($user) && $user->checkPassword($password)) { $this->getUser()->signIn($user); return true; } return false; } /** * Signs out a user * */ public function logout() { return $this->getUser()->signOut(); } /** * Retrieves the current symfony context * * @return sfContext */ protected function getContext() { return $this->context; } /** * Retrieves the current symfony user session * * @return sfGuardSecurityUser */ protected function getUser() { return $this->user; } }
Pour tester notre service, utilisons le navigateur de service proposé par AmfPHP. Pour cela, il faut lancer un navigateur sur http://local.mademo.org/amfphp/browser/index.html :
Via cette interface, elle même réalisée en Flex, on peut tester les méthodes publiques définies dans notre service, manipuler les arguments, et constater que nous arrivons à nous authentifier et que nous accédons bien à la même session utilisateur que dans symfony : login, logout et test du statut d'authentification.
On pourrait aller beaucoup plus loin dans cet exemple, en proposant par exemple une classe proxy en ActionScript 3 représentant un utilisateur du système (dans notre cas, une instance de la classe sfGuardUser), cette dernière reproduisant tout ou partie de ses méthodes et propriétés, et donc d'utiliser l'ORM Propel directement depuis Flash... Je vous laisse faire vos tests si le coeur vous en dit.
D'autre part, même si la librairie AmfPHP semble un peu passée au niveau architecture, elle reste néanmoins très efficace pour publier des services PHP dans Flash au travers du protocole AMF. J'ai eu vent d'autres librairies comme WebORB ou SabreAMF, mais je ne sais pas vraiment ce qu'elles valent... Des avis dans l'assistance ?
[1] Du coup, on expose certains scripts AmfPHP, mais la librairie n'est malheureusement que prévue pour fonctionner en ce sens...
[2] Oui, c'est terriblement crade, je ne comprend d'ailleurs pas qu'AmfPHP n'aie pas prévu ce cas de figure...
Ce billet intitulé Partager la session utilisateur entre Flash/Flex et symfony avec AmfPHP a été rédigé par Nicolas Perriault et publié sur le blog Prendre un Café sous licence Creative Commons BY-NC-SA.
PHP et MySQL ne font l'objet d'aucune alerte de sécurité dans leurs versions courantes :
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communauté) , 5.1.24-rc et 6.0.4.
Les mises à jour sont recommandées vers ces versions.
3 alertes de sécurité ont été émises cette semaine, concernant des applications suivantes :
Claroline, Drupal et WordPress
Microsoft warns Web site owners to prep for IE 8
Although Beta 2 of Internet Explorer (IE) 8 isn’t due out until some time in August, Microsoft is cautioning Web site owners now that they need to be prepping now for possible problems the new, more standards-compliant browser may cause.
As part of this week’s IE June Security Update for IE8 Beta 1, Microsoft introduced a new tag, “IE EmulateIE7″ — which it is counting on to head off some of the incompatibilities the company is anticipating could occur, based on feedback it received from IE 8 Beta 1 testers.
Bon courage à tous les développeurs web !
(categories: web microsoft internet 2.0 site security ie8)
Liens inter-applications avec Symfony 1.1
Un important travail réalisé pour la sortie de Symfony 1.1 a été le retrait du pattern singleton du framework. On peut maintenant instancier plusieurs objet sfContext par exemple. Cela permet notamment de faire des liens inter-application a peu près proprement. Voici l’avancée de mon travail sur la question :
(categories: blog symfony helper glagla)
Google Maps guide aussi les piétons
Google a ouvert à tous les internautes une fonctionnalité qu’il testait en bêta privée depuis plusieurs mois. Lorsqu’un utilisateur de Google Maps fait une recherche d’itinéraire inférieure à 10 kilomètres, le service de cartographie propose désormais un itinéraire pour les piétons, en plus du trajet pour les voitures.
(categories: google recherche a pied)
Conventions de programmation : la nécessaire maturité - La Case de l’Oncle Tom
Tout développeur, que ce soit à l’école ou en apprenant sur le tas, écrit du code. J’espère n’avoir perdu personne à ce stade de l’explication ;-)
Inconsciemment on cherchera à utiliser un style d’écriture avec lequel on se sent à l’aise, qu’on pourra et saura relire facilement et dans le meilleur des cas, qui pourra être relu par une autre personne sans avoir à engager d’interprète.
Tout développeur tend donc à utiliser des conventions de programmation (coding standards), que ce soit en HTML, PHP, CSS, JavaScript ou même en Cobol. Et utiliser des conventions, c’est bien !
(categories: javascript php conventions)
La réalité augmentée sur iPhone
Ce petit iPhone m’a pas fini de nous impressionner et de donner des idées aux développeurs. La prochaine révolution de son utilisation pourrait bien concerner la réalité augmentée
(categories: iphone realite augmentée)
Royal Pingdom » Data center stories that will make you laugh or cry
The admin robot – reboot via CD-ROM eject
When an important server used for credit card transactions started crashing on a regular basis, and there was no budget in place to replace it, one tech jokingly suggested that they build a robot that could reboot the machine day and night. They ended up doing exactly that. A perfectly aligned piece of machinery ejected a CD-ROM sled exactly on the reset button of the problematic server as soon as it stopped responding to ping. (You have to wonder if MacGyver was involved…)
(categories: )
Commerce en ligne: eBay contraint de réviser son modèle | Rue89
eBay traverse une crise d’identité. La société qui a aidé à façonner le commerce en ligne 1.0 est confrontée actuellement à une dure réalité: le commerce sur le web ne ressemble plus à ce qu’il était il y a une décennie. Les enchères -le cœur de la société- ont perdu l’essentiel de leur pouvoir d’attraction. Et eBay doit se recomposer une image de marque pour préserver ses revenus et ses bénéfices.
Article original publié sur Glagla Dot Org. Tous droits réservés.
et moi également !
Déjà qu’il n’était pas d’une folle activité ! Reprise des hostilités en août après du bateau, des bbq, des la plage et un petit tour à l’hôpital (pour la plomberie trimestrielle).
wé \o/

Article original publié sur Glagla Dot Org. Tous droits réservés.
Hello,
If you would like to confirm the "Manager Change" request for channel '#phpfrance', thus giving it PERMANENTLY to user 'dinesh' who is a level 499 on #phpfrance, then click on the following link to confirm (say YES) within SIX HOURS, after that it will be too late : http://cservice.undernet.org/live/forms/confirm_mgrchange.php?ID=xxxxx if you dont want this request to be processed, just IGNORE this mail and DO NOT click on the above URL. The Undernet Channel Service.
Successfull Confirmation! You have confirmed your 'Manager Change Request' for channel Your request will be reviewed by CService Admins, Please allow 3-5 days for your request to be processed.
Je n'étais plus réellement présent depuis plus d'un an,dans un premier temps, fatigué des disputes prépubères des membres, puis d'avoir décroché et consacré mon temps à d'autres choses, je ne suis jamais réellement revenu.
10 d'irc sur ce channel qui m'aura accompagné dans mes débuts en PHP. Du temps où il existait une communauté php. Du temps où phpFrance était avant tout un site (Aujourd'hui c'est surtout un excellent et gros forum). Je retriendrais surtout mes discussion avec Damien, Ganf, Didou, Cyruss, flyingcow, ... et d'autres encores
Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences.
N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.