lundi 10 mars 2008

Symfony 1.1 beta, tour du propriétaire - Installation

Il y a quelques jours, Fabien a annoncé la disponibilité de Symfony 1.1 beta 1 dans le dépôt du projet. Symfony 1.1 est un changement majeur au niveau architecture, et la compatibilité ascendante est rompue en de nombreux points. Pour un outil éminemment basé sur les conventions, cela implique une réappropriation de ces dernières quand elles ont changé - mais c'est là le prix à payer pour bénéficier des nouvelles fonctionnalités. Et elles valent le coup !

Ce billet sera donc le premier d'une série destinée à explorer les fonctionnalités phares de cette preversion. On commence par le commencement avec la procédure d'installation.

Remarques préliminaires

Nous ne verrons pas la procédure de mise à jour d'un projet en symfony 1.0 vers la version 1.1[1]. On verra ça plus en détail sur ce blog si les CNTP le permettent. Pour l'heure, on partira donc d'un projet vierge en 1.1.

Installation de Symfony 1.1

Il faut pour l'heure installer Symfony 1.1 à partir des sources subversion ; voici une démarche possible, en admettant que vous disposez d'un environnement Unix/Linux[2] :

$ mkdir vendor && cd vendor
$ svn co http://svn.symfony-project.com/branches/1.1/ symfony11
$ sudo ln -s `pwd`/symfony11/data/bin/symfony /usr/bin/symfony11

Je crée ici un lien symbolique symfony11 accessible depuis /usr/bin, ce qui permettra de gérer aussi bien des projets en 1.0 qu'en 1.1[3].

Pour vérifier que tout s'est bien déroulé, vous pouvez lancer cette commande :

$ symfony11 -V
symfony version 1.1.0-DEV (/Users/niko/www/vendor/symfony11/lib)

Création d'un nouveau projet

Grâce à notre nouvelle installation isolée de Symfony 1.1, on peut créer un projet et une nouvelle application main via cette série de commandes :

$ cd /path/to/workspace
$ mkdir sf11test && cd sf11test
$ symfony11 generate:project sf11test
$ ./symfony generate:app main

Vous noterez que toutes les commandes ont été renommées par rapport à la version 1.0 et qu'elles utilisent désormais des espaces de noms spécifiques à certains domaines : generate:, propel:, plugins:, log:, etc. Pour lister l'ensemble des tâches en lignes de commande disponibles, vous pouvez lancer la commande symfony11 telle quelle, ou utiliser l'executable symfony disponible à la racine de votre projet :

$ ./symfony

Notez que l'emploi de symfony11 ou ./symfony a la racine de votre projet ont ici strictement le même effet, puisque les deux exécutables référencent la même installation de Symfony.

Il nous reste à créer un VHost Apache[4] minimaliste pour accéder à notre projet au travers de notre navigateur :

<VirtualHost *>
  ServerName   local.sf11test.org
  DocumentRoot %PROJECT_ROOT%/web
  <Directory "%PROJECT_ROOT%/web">
    AllowOverride All 
    Allow from All 
  </Directory>
  Alias /sf    %VENDOR_ROOT%/symfony11/data/web/sf
  ErrorLog     %PROJECT_ROOT%/log/error.log
  CustomLog    %PROJECT_ROOT%/log/access.log common
</VirtualHost>

N'oubliez pas de remplacer les chaînes %PROJECT_ROOT% et %VENDOR_ROOT% par les chemins système correspondant (respectivement la racine du projet et la racine de votre répertoire vendor créé précédemment).

On ajoutera également une entrée dans le fichier /etc/hosts pour avoir la résolution du nom local.sf11test.org localement :

127.0.0.1       local.sf11test.org

Si toutes les étapes ont été correctement suivies et après avoir rechargé la configuration d'Apache, en lançant notre navigateur préféré sur l'adresse local.sf11test.org, nous obtenons :

Symfony 1.1 default homepage

Ça vous rappelle quelque chose ? ;-)

La suite au prochain épisode, avec les formulaires dont la gestion a été entièrement revue en Symfony 1.1.

Edit : J'ai modifié l'url du dépôt pour faire pointer vers la branche 1.1, qui évolue constamment, comme suggéré par Fabien en commentaire :)

Pour ceux qui veulent mettre à jour du tag vers la branche, il faut lancer cette commande à la racine de votre répertoire vendor :

$ svn switch http://svn.symfony-project.com/branches/1.1/ symfony11

Un petit ./symfony cc s'imposera dans vos projets utilisant le dépôt.

Notes

[1] La procédure est pour le moment documenté dans ce fichier sur le dépôt.

[2] Enfin je veux dire, je ne m'occuperai pas de Windows ;)

[3] En admettant bien sûr que vous disposiez déjà d'une installation fonctionnelle de la 1.0 ;)

[4] Comme toujours, mod_rewrite doit être activé.

mardi 4 mars 2008

Hihihi PC

L'EEE PC 700, avec son minuscule écran et ses capacités limitées ne m'a pas vraiment emballé, malgré un prix très agressif pour un ultra portable. Par contre, la prochaine mouture me fait de l'oeil comme c'est pas permis, surtout si le surcoût n'est que d'une centaine d'euros !

Donc si vous ne savez pas quoi m'offrir cet été, voila une piste.

Ben quoi, on peut toujours essayer, non ?

mardi 26 février 2008

CleverSvg, librairie SVG pour PHP5

Il y a quelques temps sur un projet professionnel arrêté prématurément, j'avais développé un jeu de classes PHP5 destinées à produire des graphiques au format SVG.

Et bien le code source vient d'être mis à disposition sur le nouveau site dédié open source de Clever Age sous licence LGPL et a pris le doux nom de CleverSvg.

Voici un rapide exemple d'utilisation du joujou :

<?php
require_once('cleversvg.php');
$doc = new csDocument(550, 400, 'SVG test document');
 
$gradient = new csLinearGradient(0, 0, '100%', '100%');
$gradient->addStop('0%', 'yellow');
$gradient->addStop('100%', 'red');
$doc->addAsDefinition($gradient, 'gradient');
 
$star = new csPolygon();
$star->setPointsArray(array(array(350,75),  array(379,161),
                            array(469,161), array(397,215),
                            array(423,301), array(350,250),
                            array(277,301), array(303,215),
                            array(231,161), array(321,161)));
$star->setStroke('blue');
$star->setFill('url(#gradient)');
$star->setStrokeWidth(4);
$linkedstar = new csLink();
$linkedstar->setHref('http://prendreuncafe.com/blog/');
$linkedstar->addElement($star);
$doc->addElement($linkedstar);
 
header("Content-type: image/svg+xml");
echo $doc->toXML();

Ce qui donne quelque chose approchant ceci. Si vous surfez avec un navigateur vieillissant insensible aux avancées technologiques de son temps, ça donne à peu près ça :

Démo CleverSVG

Je suis pour l'instant le développeur principal et mainteneur du projet, et il y a de fortes chances que ce soit le cas pour un petit bout de temps [1]. Une documentation, une liste d'information et support utilisateurs et un bugtracker sont disponibles.

D'autres choses viendront en suivant, dont une librairie destinée à produire des graphes SVG (camemberts, histogrammes, etc.)

J'en profite aussi pour vous faire part de la sortie du projet libre cleverbox, qui permet de déployer et administrer des instances Trac+Subversion en trois coups de cuiller à pot et sans se faire mal.

Notes

[1] Je veux dire, y compris après avoir quitté Clever Age à la mi-mars.

lundi 18 février 2008

Rendre les extensions Firefox disponibles pour la version 3 beta

Clairement, Firefox 3 beta 3 est une énorme tuerie. Le programme, à charge d'extensions comparable, est beaucoup plus véloce et moins gourmand en mémoire que son ainé Firefox 2.

J'utilise depuis quelques temps la version 3 beta comme navigateur principal avec bonheur, à une exception près : l'absence cruelle de disponibilité d'extensions incontournables pour tout développeur web qui se respecte, comme la Web Developer Toolbar par exemple.

Pour contourner le problème et forcer l'installation de ces extensions officiellement déclarées non compatibles avec Firefox 3, voici une petite astuce (via) qui désactivera la vérification de compatibilité à l'installation de ces dernières :

  • Ouvrir le panneau de configuration en tapant about:config dans la barre d'adresse du navigateur
  • Créer une nouvelle entrée booléenne nommée extensions.checkCompatibility et positionner sa valeur à false
  • C'est tout, vous pouvez installer ce que bon vous semble.

Attention : La désactivation la vérification de compatibilité des extensions peut engendrer une instabilité de ces dernières et du navigateur. À manier avec la plus grande précaution.

samedi 16 février 2008

C'est le mercato !

Nicolas Steinmetz - aka NiCoS -, ami et collègue chez Clever Age, se met lui aussi à l'écoute du marché.

Pour reprendre ses propres termes :

J'aime les projets qui se passent bien (planning respecté, client et équipe satisfaits, code propre et maintenable, etc.). Je suis adepte des bonnes pratiques, de la qualité et du travail en équipe.

Pour avoir travaillé avec lui et être accessoirement son voisin de bureau au quotidien, je ne peux que vanter ses qualités humaines et son sérieux quand il s'agit de mener à bien un projet dans les meilleures conditions possibles.

Et puis un consultant fonctionnel/chef de projet/développeur Django travaillant sous Linux et accro à la ligne de commande, c'est assez rare pour être signalé, croyez-moi.

mardi 5 février 2008

C'est quoi, le rock, en fait ?

[Via le bistrot]

Le mardi, c'est pas super tuesday, c'est philosophie.

Hélas, il vous faut Flash player pour visionner cette vidéo. Sinon le lien direct, c'est par là.

mardi 29 janvier 2008

Un client de geolocalisation en cinq lignes de PHP avec l'API Google Maps

Google propose des choses vraiment intéressantes au travers de ses API, comme par exemple son méconnu (car planqué dans la doc) webservice HTTP de géolocalisation. L'idée ici est de récupérer la lattitude et la longitude d'un endroit géographique à partir de sa description, par exemple Paris, France ou encore 3 allée des allouettes, 35000 Rennes, France.

Il vous faut posséder au préalable une clé d'API Google, que vous pouvez obtenir gratuitement par là.

<?php
define('GOOGLE_API_KEY', 'your_google_api_key_here');
$wsurl = 'http://maps.google.com/maps/geo?q=%s&output=csv&key=%s';
$location = 'Paris, France';
$data = explode(',', file_get_contents(sprintf($wsurl, urlencode($location), GOOGLE_API_KEY)));
$coord = 200 === (int)$data[0] ? array((float)$data[2], (float)$data[3]) : null;
var_dump($coord);

Ce qui nous donne :

array(2) {
  [0]=>
  float(48.856667)
  [1]=>
  float(2.350987)
}

On prendra soin de cacher autant que faire se peut les résultats renvoyés par le webservice, afin de soulager les serveurs de Google et accessoirement de pas fusiller le crédit-requête associé à sa clé d'API.

Disclaimer : Ce billet n'est pas un appel au troll, je me doute qu'on peut faire la même chose en 3 lignes de Ruby, 2 lignes de Python et -10 lignes de Fotran77. C'est juste pour dire que les services Google, ça déchire quand même un petit peu.

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!

- page 3 de 66 -