jeudi 24 janvier 2008

Symfonians, three days after launch

Looks like people seems to appreciate the service provided by Symfonians.net. At least, they use it ! Here's some stats, three days after the site has been launched :

I've just added some more cumulative filtering features on people, applications and jobs lists, so now you can :

  • filter people available for hire, from a given country
  • filter applications from a given country, filter only opensource ones [3]
  • filter job offers proposed by a company, in a country and eventually accepting teleworking [4]

I've also slighly microformatted some detailled views like company and person pages, using hCard.

By the way, I want to mention that if your cocain is Django, you might use the DjangoPeople service, very nicely done and proven useful. Makes me think I must push on some geolocalization features on Symfonians... Stay tuned.

Edit: We got (roughly alpha) maps.

Notes

[1] Too bad I had some mail blacklist problem :/ Stay tuned for a blog post on this issue.

[2] I had two, one of them is about the fact I play the guitar :D

[3] Four opensource applications on five are french \o/

[4] Play, say Hi!

dimanche 20 janvier 2008

The Symfonians Project

It's been a long time that I and some people I know were looking after a place on the web to publish a Symfony developer profile, post a job offer, share contacts and/or project opportunities. There's been some initiatives here and here, but nothing has really convinced me so far. So I've decided to write something on my own.

The name of the project is Symfonians. It's available in a beta state and only in english language for now.

There must exist a lot of bugs, so feel free to report them if you use the service :)

Ah, last but not least, I imagine that the site won't display nice on IE6 (maybe on IE7 too), but for now I don't care as I don't have much time to loose on this kind of fascinating CSS hacking challenges :p

samedi 12 janvier 2008

Symfony, une redirection 302 et une exception sont dans un bateau

Ah la la. C'est assez rare pour être souligné, mais je viens de me battre avec Symfony pendant près de deux heures avec un problème assez déroutant de prime abord : lorsque dans une action vous faites quelque chose d'aussi anodin que ceci :

public function executeBar()
  {
    try
    {
      // Some stuff here, if successful redirect user to somewhere else
      $this->setFlash('notice', 'Action was successful');
      $this->redirect('@whatever_route');
    }
    catch (Exception $e)
    {
       $this->getRequest()->setError('errors', 'Something has failed somewhere, sorry dude');
       $this->logMessage('Big boo boo occured: '.$e->getMessage(), 'err');
       return sfView::SUCCESS;
    }
  }

Et bien dans ce cas là, la redirection s'opère MAIS l'ensemble du rendu sera tout de même produit et envoyé au navigateur [1] - ce qui peut s'avérer très couteux sur un site internet au final [2]. La raison en est très simple, la méthode redirect() de la classe sfActions met fin à l'execution par ce moyen que l'on peut qualifier de hardi :

public function redirect($url, $statusCode = 302)
  {
    $url = $this->getController()->genUrl($url, true);
    if (sfConfig::get('sf_logging_enabled'))
    {
      $this->getContext()->getLogger()->info('{sfAction} redirect to "'.$url.'"');
    }
    $this->getController()->redirect($url, 0, $statusCode);
    throw new sfStopException();
  }

Oui, vous avez bien lu, on interrompt le script en levant une exception, ici de type sfStopException. Le problème, c'est que dans mon exemple précédent, la méthode redirect() est appellée dans un bloc try { } catch { }, et donc l'exception levée est interceptée et l'action n'est au final pas stoppée. Vicieux, hein ?

Pour régler le problème, on peut par exemple toujours effectuer ses appels à la méthode redirect() en dehors d'un block try { } catch { } [3], ou encore tester le type de l'exception levée. Dans notre exemple, cette dernière solution ressemblerait à ça :

public function executeFoo()
  {
    try
    {
      // Some stuff here, if successful redirect user to somewhere else
      /// ...
      $this->setFlash('notice', 'Action was successful');
      $this->redirect('@whatever_route');
    }
    catch (sfStopException $e)
    {
      return sfView::HEADER_ONLY;
    }
    catch (Exception $e)
    {
      $this->getRequest()->setError('errors', 'Something has failed somewhere, sorry dude');
      $this->logMessage('Big boo boo occured: '.$e->getMessage(), 'err');
      return sfView::SUCCESS;
    }
  }

C'est pas super sexy, mais ça fonctionne, et ça a le mérite de m'inspirer deux morales à cette histoire :

  1. tester le type des exceptions que l'on catche, c'est bien
  2. lever une exception pour arrêter un script, c'est super cracra et mériterait éventuellement d'être patché ;)

Edit: Je m'exprime mal, c'est pas super cracra, c'est juste que ça introduit une petite complexité supplémentaire. Mais l'utilité de la chose est bien entendu totalement avérée si on a besoin d'effectuer des opérations particulières avant la fin du script ( ce qui est rarement le cas, enfin chez moi).

Notes

[1] Avec tout ce que ça comporte de requête SQL et de templates calculés pour rien

[2] Et oui bien sûr, faire un redirect() dans un bloc try catch c'est pas forcément le meilleur endroit, mais c'est teeeellement pratique :p

[3] Qui sera donc exécuté de toute façon si aucune exception n'est levée.

samedi 29 décembre 2007

Amazon SimpleDB plugin for Symfony

Hey, this is a post written in english. Handle with care ;)

I've just released an alpha version of a new plugin for the Symfony framework to use the brand new Amazon SimpleDB service : sfAmazonSimpleDBPlugin. This plugin is in an alpha state but provide a clean and Symfony-compliant API to handle and query your SimpleDB database, if you have the luck to have an account.

The purpose of SimpleDB is to provide simple and efficient data storage through a webservice. You can find billing policy on their website.

I've mainly used the PHP5 library provided by Amazon (API documentation available), but I thought some operations were a bit complicated.

For example, with the official client, to insert a row in a table you have to do something like this :

<?php
require_once ('Amazon/SimpleDB/Model/ReplaceableAttribute.php');
$domainName = 'MyStore';
$itemName = 'Item_01';
$attribute1 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attribute1->withName('Category')->withValue('Clothes');
$attribute2 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attribute2->withName('Subcategory')->withValue('Sweater');
$attribute3 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attribute3->withName('Name')->withValue('Cathair Sweater');
$attribute4 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attribute4->withName('Color')->withValue('Siamese');
$attribute5 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attribute5->withName('Size')->withValue('Small');
$attribute6 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attribute6->withName('Size')->withValue('Medium');
$attribute7 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attribute7->withName('Size')->withValue('Large');
$attributeList = array($attribute1, $attribute2, $attribute3, $attribute4, $attribute5, $attribute6, $attribute7);
$action = new Amazon_SimpleDB_Model_PutAttributes();
$action->withDomainName($domainName)->withItemName($itemName)->setAttribute($attributeList);
invokePutAttributes($service, $action);

With the Symfony plugin, you can do the same with :

<?php
$data = array('Category'    => 'Clothes',
              'Subcategory' => 'Sweater',
              'Name'        => 'Cathair Sweater',
              'Color'       => 'Siamese',
              'Size'        => array('Small', 'Medium', 'Large'));
sfAmazonSimpleDBClient::getInstance()->selectDomain('MyStore')->putAttributes('Item_01', $data);

Personnaly I prefer the shorter syntax but it's mainly matter of taste here. In a future release, I'll try to also provide a backend module to handle the databases.

Last but not least, the plugin API is entirely unit tested. You can find the test suite here.

I hope you'll find this plugin somewhat useful for your Symfony projects :)

Edit : The author of the official Amazon PHP library sent me a mail to clarify a point : there's an alternative syntax available, array based, to put attributes:

$action = array ( "DomainName" =>  $domainName,
            "ItemName" =>    $itemName,
            "Attribute" = >  array(
                        array ("Name" => "Category", "Value" => "Clothes"),
                        array ("Name" => "Subcategory", "Value" => "Sweater"),
                        array ("Name" => "Name", "Value" => "Cathair Sweater"),
                        array ("Name" => "Color", "Value" => "Siamese"),           
                        array ("Name" => "Size", "Value" => "Small"),   
                        array ("Name" => "Size", "Value" => "Medium"),
                        array ("Name" => "Size", "Value" => "Large"))
            );
$service->putAttributes($action);

So next step for me, I'd like to ORMize all this to be able to do some pretty things like:

$product = new Product();
$product->setCategory('Clothes');
$product->setSubcategory('Sweater');
$product->setName('Cathair Sweater');
$product->setColor('Siamese');
$product->setSize(array('Small', 'Medium', 'Large'));
$product->save();

Not very hard to do but I wonder if I will be able to avoid code generation (yurk)...

jeudi 6 décembre 2007

Yet Another En Vrac

Tiens, ça faisait longtemps...

mardi 6 novembre 2007

Changement de fourrage, tout ça

Comme on dit dans le jargon, je suis officiellement à l'écoute du marché. Le traditionnel CV est par là, ou encore ici.

Je me débrouille en PHP et avec le framework Symfony, j'aime bien concevoir de chouettes applis qui fonctionnent et qui sont maintenables, j'aime beaucoup les petites équipes agiles, j'adore appliquer les bonnes pratiques de conception et respecter les standards du web. Je place au centre de tout le respect du client et les processus de conception collaborative.

Si vous êtes intéressé,vous pouvez me joindre en passant par la case contact :)

Edit : J'ai une extinction de voix carabinée, merci d'éviter le téléphone ou la visioconférence le temps que je me remette d'ici quelques jours ;)

jeudi 1 novembre 2007

Utiliser Symfony pour vos projets

Suite à l'émergence des frameworks web, beaucoup d'équipes de développement ont décidé de leur utilisation sans toujours bien réaliser les tenants et aboutissants liés la démarche, croyant souvent avoir enfin trouvé une méthode miracle pour produire vite et bien. Il peut en résulter de sévères déconvenues, quel que soit le framework, le langage ou la plateforme retenus.

Concernant Symfony, il en va de même ; et si on peut bien entendu trouver énormément d'avantages à son utilisation sur un projet, il faut également bien avoir conscience des contraintes qu'un développement sur sa base implique, sous peine de se retrouver dans le mur assez rapidement.

Symfony n'est pas un CMS

Il est immédiatement tentant de retenir Symfony pour tout type de projet tellement il est agréable de développer sur sa base. Cependant, pourquoi systématiquement réinventer une roue qui tourne peut-être déjà fort bien ailleurs ? L'idée ici est de s'interroger sur la réelle nécessité de recourir à un développement spécifique ; en effet, même si coder en Symfony est très encadré, il n'empêche que la logique métier est entièrement à définir par l'équipe de développement [1]. Plus particulièrement concernant les problématique de gestion de contenus, le besoin métier sur le projet est-il suffisamment conséquent, ou un CMS comme Drupal, SPIP, ezPublish ou Joomla couvre t-il nativement l'ensemble du périmètre fonctionnel cible ? [2]

Un développement spécifique introduira le plus souvent beaucoup plus d'exigences, de compétences et de compléxité qu'une intégration basée sur un outil de gestion de contenus autonome existant (et digne de ce nom). L'idée est bel et bien de renoncer à se faire plaisir à tout prix pour se situer au plus près de la réalité du besoin.

Bien entendu, je me fais aussi ici l'avocat du diable. Pour avoir joué avec les principaux CMS PHP open source du marché et connaissant la propension naturelle d'un client à enrichir au gré de l'avancement projet le périmètre fonctionnel souhaité [3], je préfère allègrement à titre personnel me baser sur un framework comme Symfony afin de rester agile et parer à toute éventualité. Mais je sais aussi quelles sont mes compétences réelles sur le sujet, et dès qu'une équipe dont je ne cerne pas le niveau entre en ligne de compte, généralement les problèmes commencent. Ça tombe bien, c'est justement l'objet du prochain chapitre ;)

Symfony est exigeant

Non, Symfony ne transformera pas magiquement un mauvais développeur en bon développeur... même s'il peut y contribuer à terme ;)

Plus sérieusement, le but réel de l'utilisation d'un framework est bel est bien de vous rendre plus efficace et productif, certainement pas de vous compliquer la vie ou de vous faire perdre du temps.

Il faut bien prendre conscience que le temps de montée en compétence sur l'utilisation du framework - déjà naturellement exigeante - requière également pour certains une montée en compétence en programmation tout court. Et cette dernière, si elle peut se faire sur un projet, peut également allègrement le plomber. Un développeur débutant bidouilleur PHP mettra fatalement plus de temps qu'un codeur expérimenté à appréhender l'ensemble des possibilités introduites par PHP5, la programmation orientée objet, les motifs de conception, mais aussi le respect des bonnes pratiques notamment liées au travail collaboratif ou que sais-je encore.

Le risque à court terme est de voir le code du projet grevé dans sa qualité et sa maintenabilité. À moins bien entendu de prendre en compte en amont cette charge inhérente à la formation, mais on connait tous la réalité professionnelle et commerciale du milieu qui est le notre ;)

Symfony ne vous dispense pas d'organiser votre projet

Oui, Symfony fait la part belle aux conventions et prémâche énormément le travail redondant à tout projet de type web. La vie des (bons) développeurs est grandement facilitée, et on peut vraiment gagner rapidement beaucoup de temps. Mais une grave erreur serait de sous-estimer la charge liée à l'organisation et la gestion de la vie du projet.

Par exemple, ce n'est pas en mettant plus de développeurs sur un projet Symfony (ou autre d'ailleurs) que celui-ci sera développé plus vite. Au contraire, même ; tout codeur avec un tant soit peu d'expérience professionnelle a déjà rencontré ce type de cas de figure : on vend un projet de 100 jours de développement, on se fixe un retroplanning ambitieux avec une mise en ligne à 20 jours ouvrés, et on staffe donc arithmétiquement cinq développeurs à plein temps en pensant que le résultat sera totalement équivalent au travail qu'aurait fourni un unique développeur en 100 jours de développement pour concevoir l'intégralité du code de l'application résultante.

Bien entendu, c'est illusoire et généralement, le projet se termine sur des dépassements conséquents et le mécontentement du client [4]. Et pour cause, la déperdition d'énergie utilisée à la communication sur le projet est fonction du nombre d'acteurs présents sur ce dernier. Et on peut staffer trois chefs de projet à plein temps pour canaliser tout ça, c'est d'une part économiquement peu viable et d'autre part totalement inefficace, ces derniers devant perdre également beaucoup de temps à se synchroniser entre eux, puis avec les membres de l'équipe.

Moralité

Non, Symfony n'est pas le remède miracle aux lacunes organisationnelles des structures en charge de la réalisation d'un projet, mais bien un outil exigeant qu'il faut savoir appréhender de la bonne façon en prenant en compte le plus en amont possible ces problématiques. Le gain réel et indiscutable d'efficacité apporté par l'utilisation d'un framework comme Symfony est à ce prix ;)

Notes

[1] Je n'ose pas évoquer ici la notion d'architecte logiciel connaissant la réalité moyenne du monde PHP.

[2] Pour nuancer ce propos, de plus en plus de plugins Symfony tendent à apparaitre pour couvrir ce type de besoins fonctionnels.

[3] Le premier qui me parle du sacrosaint cahier des charges contractuel, je le mords.

[4] Sans parler de la charge de stress portée sur l'équipe, qui du coup va saloper le boulot pour livrer au plus vite.

mercredi 31 octobre 2007

Forum PHP 2007

Juste un petit mot pour vous informer que le Forum PHP 2007 se tiendra les 21 et 22 novembre prochains à Paris dans le 7ème arrondissement.

Au programme, quelques invités prestigieux comme Rasmus Lerdorf et Andrei Zmievski mais aussi un programme de conférences alléchant :

  • Clients riches avec PHP : L'exemple de Flex
  • Optimistations, méthodes, sécurité : retours d'expérience dans les grands comptes
  • Les nouveautés de PHP6
  • Comment Facebook tient la charge avec APC
  • Sécurité : MySQL et PHP sous surveillance

Côté Symfony, Fabien Potencier animera une session sur la simplification du développement des interfaces aux bases de données.

Bref, un événement d'importance dans le petit monde de PHP, venez nombreux :)

- page 2 de 5 -