Une Semaine Sur Le Web n°3

Bonjour à tous! Cette semaine on parle encore de Google avec Health, de la bataille PHP versus le monde qui fait rage (encore plus que d'habitude) puis les liens en vrac. Google Health De manière générale, la conclusion est que c'est un bien petit pas de la part de Google sur le marché de la santé 2.0. Le service n'est pas vraiment innovant comparé à ce qui se fait déjà. Il consiste principalement en un moteur de recherche. L'utilisateur complète lui même son dossier médicale en ligne. Il peut ensuite rechercher des informations à partir de son dossier ou sur n'importe quel symptôme. Il y a aussi quelques partenariats ce qui permet d'importer directement son dossier. Le point qui fait le plus parler c'est évidemment la sécurité. L'inscription au service demande l'acceptation d'un Terms of Service très long. Pour le moment la politique de sécurité semble correcte. Je pense que ce genre de service c'est vraiment le futur. Tous les débats autour des problèmes de vie privée m'énerve la plus part du temps. Si le contrat liant le service et l'utilisateur est solide et que le service provient d'un acteur aussi important que Google, les risques de voir ses informations éparpillés sont faibles. Je pense que pour que ces services explosent vraiment il faudrait créer un comité d'observation qui délivre une certification. On pourrait ainsi découvrir facilement des services de confiance. Google Health: A Quick Hands-On Look, Google Health beta launches with security issues looming, Google Health Launches - Cautious, Non-Innovative Entry into Health 2.0 PHP versus le Monde J'ai eu l'impression qu'elle a redoublé ces derniers temps. Je n'ai jamais bien compris cette haine qu'on un certain nombre de développeurs envers ce langage. Je suis néanmoins d'accord sur certains points. Par exemple, l'interpréteur devient un peu le foutoir (l'un de vous a-t-il déjà regarder son code ? ou essayer de développer une extension ?). Il y a un paquet de petits hacks pour chaque nouveautés ajoutés qui font que ce n'est pas jolie jolie. OK. Le modèle objet est récent mais manque des dernières innovations dans le domaine. OK. C'est le bordel dans le nommage des fonctions et l'ordre de leurs arguments. OK. etc, etc... Ces points sont justifiés. Ça ne fait pas de PHP un mauvais langage à mes yeux. Que l'interpréteur soit mal codé est un fait, mais ce n'est que rarement que j'ai l'occasion de le constater. Un interpréteur ça peut toujours se changer! Qu'il manque des fonctionnalités dans le modèle objet, tout développeur en est conscient et on fait avec. Ce n'est pas parce je n'ai pas de sièges chauffants dans ma voiture qu'elle est mauvaise! Et le nommage des fonctions, eh bien on fait avec aussi. Pour le reste, cela dépend de la partie entre la chaise et l'écran. Un développeur professionnel (qui ne fait pas que du PHP) à peu de chance d'écrire du code spaghetti, etc... Il existe maintenant des outils qui permettent de faire du PHP dans le monde de l'entreprise et je pense que le langage a un grand avenir devant lui! PHP is the new VB6 in a C dress, Ruby is a Playground, PHP is a Factory, The future is PHP, PHP Sucks, But It Doesn't Matter, An Argument for PHP En vrac Webmonkey is back!, Understanding HBase and BigTable, OLPC 2.0: A Striking eBook and a Step In the Right Direction, Which CSS Grid Framework Should You Use for Web Design?, JavaScript Super Mario Kart, DimP - A Direct Manipulation Video Player, Software Development AntiPatterns, Zend Framework Tutorials

Zend Certified Engineer

Je suis heureux d'annoncer que j'ai obtenu avec succès ma certification PHP 5. Je trouve que cela donne un réel poids à mes nombreuses années d'expériences! Vous pouvez me retrouver sur les pages jaunes PHP en cliquant ici. Je préviens tout de suite aussi qu'Une Semaine Sur Le Web aura encore un jour de retard! Je pars à Madrid tout le weekend, donc pas d'Internet! Bon weekend à tous

Une Semaine sur le Web N°2

Bonjour à tous! C'est parti pour le deuxième premier vrai numéro d'Une Semaine sur le Web. Avec une journée de retard vous l'aurez remarqué...mais je n'étais pas disponible hier. Cette semaine on va parler de la portabilité des données évidemment avec tout le bruit autour de Google Friend Connect mais aussi du projet Stealth de Mozilla, d'Open Search de Yahoo!, de Google Doctype et d'un article très intéressant sur la génération Y. Finalement, Une semaine sur le Web sera terminé (et cela deviendra récurrent) par la rubrique four-tout! Google Friend Connect La semaine dernière a commencé avec la sortie de Google Fiend Connect. Celle-ci suit l'initiative Data Availability de MySpace et Facebook Connect. Tout ça ressemble plus sur le moment à une gueguerre de communication. Tous les services sont très critiqués. En effet, chacun sort de son côté son initiative sans vraiment consulter les autres. Comme le souligne l'article Too Many Choices, Too Much Content, les grands perdant sont les utilisateurs, perdu entre les différents services. Seul les personnes faisant partie du milieu, accro à leur lecteur RSS et essayant tous les nouveaux services, garde la tête hors de l'eau - mais ceci demande beaucoup de temps. Parallèlement à tous ça, le groupe Data Portability essaye de trouver une solution et aucun des acteurs majeurs ne semble réellement s'y intéresser. Pourtant l'expérience a montrée au fil du temps qu'il vaux mieux s'unir derrière un standard que de proposer une multitude de solutions. Pour revenir a Google Friend Connect, son principe réside dans le fait d'ajouter à n'importe qu'elle page un widget social. Il existe deux widgets pour le moment: le premier pour afficher sa liste d'amis et le deuxième pour chatter entre ces derniers. L'initiative peut paraitre sympa mais ces widgets sont en réalité des iFrames!!! Mais pourquoi Google a-t-il choisi une telle voie ? On nous parle de sécurité mais je ne vois pas vraiment où est l'argument. En plus, ces widgets sont plus moche qu'autre chose. Proposer une API simple, permettant simplement de lister les amis (en ne récupérant que leur nom et un identifiant) aurait été, à mon avis, beaucoup plus apprécié. Un point intéressant cependant est le support d'OpenId, oAuth et Open Social pour l'authentification. C'est surtout le support d'OpenId qui me fait plaisir mais a quand son support dans les comptes Google??? Lors de son annonce, Google a annoncé le support de tous les principaux réseaux dont Facebook. Ce dernier ne fait cependant pas partie d'Open Social et Google a précisé qu'il utilisé l'API pour récupérer les amis. Deux jours plus tard, Facebook a répondu... Et la réponse été: "comme si on allait autoriser un service concurrent de Facebook Connect a utiliser nos données"! Facebook a donc bloqué l'accès de son API à Google. Les raisons invoquées sont une violation des Terms of Service. M'enfin bon, tout le monde sait ce qu'il en est... The Social Network Wars Begin in Earnest: Facebook Bans Google Friend Connect et He Said, She Said in Google v Facebook. La portabilité des données c'est donc LE sujet du moment et on risque d'en entendre parler pendant un moment: Data Portability its the New Walled Garden. L'idéal à mon avis serait que tout le monde se réunisse derrière le Data Portability Working Group et que celui-ci soit mergé avec l'OpenId pour avoir un seul système d'authentification et de gestion de profil. La vie de tout le monde en serait simplifiée. Ce n'est pas près de voir le jour cependant! Mozilla Stealth Data Project Cette semaine, Mozilla a fait parler d'elle en présentant le Stealth Data Project. La Fondation part du constat que l'analyse des données est très aléatoire et difficile. Le projet aurait pour but d'obtenir des statistiques détaillés et représentatifs de l'utilisation d'Internet. Pour ce faire, l'outil de tracking serait directement intégré au sein de Firefox. Il serait évidemment désactivable mais même une toute petite proportion des 170 millions d'utilisateurs de Firefox les résultats obtenus seraient significatifs selon le PDG John Lilly. Stealth mettrait à disposition toutes les données recueillies gratuitement. Ceci permettra à n'importe qui d'analyser, de créer des mashups, etc...Le projet en est a son tout début (il n'a même pas de nom officiel au sein de Mozilla) mais je pense qu'on n'en entendra surement reparler. L'article sur Techcrunch. Yahoo! Open Search Cette semaine c'est aussi l'ouverture de Yahoo! Open Search Developer Platform. Celle-ci permet aux développeurs de modifier l'apparence et les informations affichées pour leur site dans la liste des résultats d'une recherche Yahoo! Une excellente initiative! Google va-t-il suivre ??? L'article sur Read Write Web. Google Doctype Après Friend Connect, Google a aussi lancé Doctype. Le but est de fournir une documentation, des exemples, des tips et une plateforme de tests autour du développement Web (html/css/javascript). Le tout ouvert, avec licence CC. Très bonne initiative de Google mais qui n'est pas ce qu'on pouvait espérer. Comme le montre le créateur de jQuery, John Resig (http://ejohn.org/blog/google-doctype), les références sur ces langages existent déjà, la partie javascript tourne principalement autour de la Google Javascript Library et la suite de tests (appelée Open Web Tests) ne sert pas a tester son code pour leur conformité avec les standards mais simplement a voir s'ils sont compatibles avec un navigateur (ce qui est déjà pas mal mais ne va pas dans le sens des standards). La génération Y Finalement un article très intéressant sur la génération Y. Celle-ci est constituée des jeunes nés dans l'ère du numérique (entre 83 et 97). L'article souligne les changements de comportement et la façon dont cette génération aborde la technologie, notamment avec des habitudes très différentes que leurs parents. Il souligne le fait que les jeunes ont une vision très différente de l'entreprise, l'Entreprise 2.0 comme certain l'appelle. L'article sur Read Write Web. Four-tout C'est fini pour cette semaine. Que pensez vous de cet article ? Plus court, plus détaillés, moins détaillés ??

Bootstrap ZF, le retour

Il y a quelque temps j'avais présenté ma classe de bootstrap. Après avoir lu pas mal d'articles sur le sujet, je l'ai quelque peu améliorée et je vais vous présenter cette nouvelle version. En fin de billet, un zip avec la classe et une arborescence Zend Framework toute faite, prêt à l'emploi! J'étais plutôt content de ma première classe de bootstrap et j'en ai évidemment repris l'idée. J'ai cependant tout recoder! La méthode conventionnelle (à priori, c'est du zf, on ne sait jamais!) consiste à créer une classe Bootstrap (Bootstrap.php) dans le dossier application. Dans celle-ci on ajoute une méthode statique run() qui lance plusieurs méthodes statiques, chacune dédiée à une tâche. Cela donne quelque chose comme:
 1 class Bootstrap
 2 {
 3   public static function run()
 4   {
 5     self::setupFrontController();
 6     self::setupDatabase();
 7   }
 8 
 9   public static function setupFrontController() { ... }
10 
11   public static function setupDatabase() { ... }
12 }
C'est simple et on ne se prend pas la tête. C'est là où je me suis dit que ma classe App était peut-être trop compliquée! Néanmoins j'aime bien le fait de pouvoir réutiliser des actions de bootstrap à travers plusieurs projets (front controller, config, base de données - c'est pratiquement tout le temps la même chose).

Read the rest of this post »

Une semaine sur le Web N°1

Dans la suite de mon précédent billet: voilà l'idée qui va m'aider à poster régulièrement! Une semaine sur le Web ce sera un billet tous les dimanches, une compilation de tout ce que j'ai lu dans la semaine. Pourquoi? Parce que je suis un accro de Google Reader! J'ai une moyenne de 200 articles/jour ce qui fait beaucoup de lecture! Et parmi ce que je lis, beaucoup de choses méritent d'être partagées. Il y a encore quelques mois, je n'utilisai pas de lecteur RSS du tout. Je me rendais tous les jours sur les quelques sites que je suivais. Suffisamment quand même pour me tenir plus que bien informé. Je ne trouvai pas chaussure à mon pied côté lecteur mais la nécessité d'en utiliser un devenait de plus en plus importante. Puis j'ai découvert Google Reader! Le meilleur incontestablement! Depuis nous sommes inséparable et je lui consacre minimum une heure par jour. J'ai lu récemment qu'il valait mieux ajouter un maximum de flux dans son lecteur pour ne rien rater (quitte à ne pas tout lire) plutôt que pas assez et de passer à côté de quelque chose. Je suis totalement d'accord! A tous les sceptiques du lecteur de flux RSS, direction www.google.com/reader. Ce premier numéro ne sera pas comme les suivants. Il sera consacré à mes sources d'informations. Je présenterai néanmoins uniquement les plus importantes.

Read the rest of this post »

Nouveau look!

Le printemps nous gratifiant de tout plein de soleil (du moins, a Paris!) il était temps de faire un bon ménage! Voici donc un tout nouveau look pour pimp my code. Le nouveau thème est ubminim de www.upstartblogger.com. J'ai réalisé la traduction en français que vous pouvez télécharger ici. J'ai aussi essayer d'enrichir le blog avec la barre latérale qui peut présenter plus d'informations (et qui en présentera probablement plus dans le futur). Ce petit lifting réalisé, il est temps pour moi de vraiment me mettre a blogger! Je note souvent des idées de billets mais prend rarement le temps de les écrire et il temps que ça change (non mais oh!). J'espère donc garder ma motivation assez longtemps pour commencer a prendre l'habitude de poster. A très bientôt!

Un framework pour Linux

On entend souvent dire que Linux manque d'homogénéité. Je trouve cette idée tout à fait exacte. Ne vous m'éprenez pas, je suis fan, j'adore cette diversité justement. Cependant, je trouve que celle-ci est mal gérée et que diversité ne rime pas forcément avec foutoir! Il existe en effet un très grand nombre d'API dont les conventions sont toutes différentes, la documentation plus ou moins complète, etc...Je trouve pour une fois que Microsoft à parfaitement compris la chose en proposant son Framework .NET. Un ensemble parfaitement homogène et très bien documenté. Alors pourquoi pas un tel framework pour Linux? Microsoft réussit a proposer une telle chose pour un ensemble de langages puisqu'il transforme ces derniers en les rendant compatible CLR. Une adaptation de ceux-ci est donc nécessaire. Cela ne colle évidemment pas à la philosophie et à la façon de faire linuxienne. En revanche, on peut créer des bindings. Un binding est un pont entre deux langages et plus généralement entre le C et un langage de plus haut niveau. L'idée que j'expose ici est une homogénéisation de ces bindings à travers tous les langages pour fournir une API commune et facilité l'accès à une documentation. Le résultat serait un framework orienté objet utilisant des namespaces (ou une convention de nommage pour les langages non "namespacisé"). Bien-sûr on est loin du Framework .NET mais c'est un premier pas vers une façon de faire que je considère bien plus moderne.

Read the rest of this post »

Nouveau CV

Je viens de mettre à jour mon CV, qui en avait bien besoin! Vous le trouverez ci-contre dans la page CV. Cela fait un petit moment que je n'ai pas posté, le temps me manque quelque peu. Je compte néanmoins bientôt écrire plusieurs billets dont un sur la renaissance de beehind (!!). A suivre...

Zend Framework et les modèles

On continue dans la série Zend Framework (je suis à fond dessus en ce moment, donc il y aura surement d'autres articles) avec les modèles de données. Beaucoup d'articles parle déjà de la mise en place de Zend_Db_Table, je passerais donc rapidement dessus. Ce billet sera plus focalisé sur la création d'un helper (pour action) pour faciliter l'accès aux modèles. Dans le fichier de bootstrap (ou dans un module si vous utilisez la classe App du billet précédent) commençons par initialiser la connexion.
1 require_once 'Zend/Db.php';
2 $db = Zend_Db::factory('pdo_mysql', array(
3     'host' => 'localhost',
4     'username' => 'root',
5     'password' => '',
6     'dbname' => 'db'
7 ));
Il est évidemment conseiller de transférer les paramètres de connexion dans un fichier de configuration... Il nous faut à présent configurer Zend_Db_Table pour utiliser cette connexion
1 require_once 'Zend/Db/Table.php';
2 Zend_Db_Table::setDefaultAdapter($db);
On peut maintenant créer nos classes. Dans le dossier /application/models créez par exemple le fichier MaTable.php avec:
1 <?php
2 class MaTable extends Zend_Db_Table
3 {
4 }
Je vous laisse lire la doc très complète de ZF pour plus d'info. Créons à présent le helper. Le but de ce dernier est de faciliter l'accès aux modèles. Il permettra depuis le contrôleur de faire quelque chose comme:
1 $this->models->MaTable;
Pour créer ce helper, nous devons créer une classe héritant de Zend_Controller_Action_Helper_Abstract
1 <?php
2 require_once 'Zend/Controller/Action/Helper/Abstract.php';
3 class App_Helper_Models extends Zend_Controller_Action_Helper_Abstract
4 {
5 }
Le constructeur va être en charge de trouver le dossier où sont stockés les modèles.
 1 <?php
 2 require_once 'Zend/Controller/Action/Helper/Abstract.php';
 3 class App_Helper_Models extends Zend_Controller_Action_Helper_Abstract
 4 {
 5     protected $_modelDirectory = null;
 6 
 7     protected $_loadedModels = null;
 8 
 9     public function __construct()
10     {
11          $module  = $this->getRequest()->getModuleName();
12          $dirs    = $this->getFrontController()->getControllerDirectory();
13          if (empty($module) || !isset($dirs[$module])) {
14              $module = $this->getFrontController()->getDispatcher()->getDefaultModule();
15          }
16          $baseDir = dirname($dirs[$module]) . DIRECTORY_SEPARATOR . 'models';
17 
18          if (!file_exists($baseDir) || !is_dir($baseDir)) {
19              throw new Zend_Controller_Exception('Missing model directory ("' . $baseDir . '")');
20          }
21 
22          $this->_modelDirectory = $baseDir;
23          $this->_loadedModels = array();
24     }
25 }
Ici, on récupère d'abord le module courant ainsi que les dossiers où sont stockés les contrôleurs. Remarquez qu'il faut gérer le cas où c'est le module par défaut. A partir de cela on détermine le chemin du dossier de stockage des modèles. Finalement, ont utilise la méthode magique __get() pour charger un modèle:
 1 public function __get($name)
 2     {
 3          if (!array_key_exists($name, $this->_loadedModels)) {
 4             if (!class_exists($name)) {
 5                 require_once 'Zend/Loader.php';
 6                 Zend_Loader::loadClass($name, $this->_modelDirectory);
 7             }
 8 
 9             $this->_loadedModels[$name] = new $name();
10         }
11 
12         return $this->_loadedModels[$name];
13     }
14 }
Dans cette méthode, on vérifie d'abord que le modèle n'est pas déjà chargé. Si ce n'est pas le cas, on charge éventuellement la classe à l'aide de Zend_Loader puis on créer une instance. Finalement, il ne nous reste plus qu'a charger le helper dans le broker. Pour cela, la meilleure méthode consiste probablement à créer une classe App_Controller. Tous les contrôleurs devront hériter de celle-ci.
 1 <?php
 2 require_once 'Zend/Controller/Action.php';
 3 abstract class App_Controller extends Zend_Controller_Action
 4 {
 5     protected $models = null;
 6 
 7     public function init()
 8     {
 9         require_once 'App/Helper/Models.php';
10         Zend_Controller_Action_HelperBroker::addHelper(new App_Helper_Models());
11 
12         $this->models = $this->_helper->getHelper('Models');
13     }
14 }
Dans notre contrôleur:
 1 <?php
 2 require_once 'App/Controller.php';
 3 class IndexController extends App_Controller
 4 {
 5     public function indexAction()
 6     {
 7         $this->view->data = $this->models->MaTable->fetchAll();
 8     }
 9 }
Vous pouvez aussi améliorer la classe pour ajouter le support de dossier de modèles multiples par exemple... Voili voilou