\_o< ~ Mirmo Dynamics

Rien de grand ne se fit jamais sans enthousiasme.

To content | To menu | To search

Friday 24 November 2006

ViewHelper de génération d'urls

Pré-requis: Zend_Controller_RewriteRouter.

Nous allons voir aujourd'hui comment générer automagiquement des URLs à partir des routes définies dans le RewriteRouter, ainsi que les avantages que cela présente. Le Helper que nous allons utiliser nécessite le stockage du routeur dans le registre:

Zend::register('router', $router);

Avant de voir le Helper lui même, un petit Use Case. Admettons que vous développiez une application de gestion de petites annonces, vous aurez à un moment ou un autre à créer un lien quelconque pour, par exemple, créer une annonce, et en voir les détails. Disons que vous ayez des routes route du genre (je zappe les defaults):

announceCreate.route = /announce/create
announceDetails.route = /announce/:id/details

L'objectif est de pouvoir créer les liens grâce au code suivant (à partir de la view):

<a href="<?php echo $this->href('announceCreate'); ?>">Créer une annonce</a>
<a href="<?php echo $this->href('announceDetails', array('id' => $announce->id)); ?>">Voir l'annonce</a>

Et comme le Zend Framework est bien fait, c'est très simple à réaliser sous forme de ViewHelper:

class Zend_View_Helper_Href {
	
	/**
	 * Returns the href to a given route
	 *
	 * @param string $routeName
	 * @param array $args
	 * @return string
	 */
	
	public function href($routeName, $args = array()) {
		try {
			return Zend::registry('router')->getRoute($routeName)->assemble($args);
		} catch (Zend_Controller_Router_Exception $e) {
			return '#404';
		}
	}
}

Tellement simple que pour combler un peu je vous offre le docblock qui va avec ;-)

Là où ça devient très pratique, c'est quand on souhaite localiser les URLs. Par exemple, imaginons que vous souhaitiez françiser les URLs pour, par exemple, améliorer votre référencement. Vous n'avez qu'a définir un jeu de routes fr_FR, par exemple ainsi:

announceCreate.route = /annonce/creer
announceDetails.route = /annonce/:id/details
 
[routes_en_UK]
announceCreate.route = /announce/create
announceDetails.route = /announce/:id/details
 
[routes:route_fr_FR]
announceCreate.defaults.controller = announce
announceCreate.defaults.action = create
 
announceDetails.defaults.controller = announce
announceDetails.defaults.action = details

L'utilisation de l'héritage géré par Zend_Config nous permet ici d'éviter la redondance des defaults.

Elle est pas belle la vie ?

Note: cette fonctionnalitée est prévue pour être builtin plus tard.

Friday 24 November 2006

Addictif.

Lasse Gjertsen.

Thursday 23 November 2006

Discussion sur l'optimisation en PHP chez NiKo

Une petite discussion sur l'optimisation en PHP à lieu en ce moment chez NiKo ! Ce n'est pas souvent que je link directement comme ça, donc dites vous que quand je le fais, c'est que ça en vaut la peine ;-)

Thursday 23 November 2006

Ma e-lettre au père noël

En espérant que le père noël ait un bon aggrégateur RSS et qu'il lise mon blog.

http://www.wishlistr.com/ubermuda

Wednesday 22 November 2006

Thème missunderstood

Pour ceux qui ne suivent que le RSS, le thème nouveau est arrivé ! Il est inspiré du design missunderstood trouvé sur oswd et il pique un peu les yeux. Ayant la flemme de trouver un endroit où caser la sidebar, je l'ai mise en display none.

Des objections ?

Sunday 19 November 2006

Zend Framework: Un plugin simple pour le Front Controller

L'implémentation du Front Controller du Zend Framework inclue un système bien pratique de plugins, qui va nous permettre de réaliser plus simplement et proprement l'automatisation des vues, initialement embarquée dans une extension de Zend_Controller_Action (ce qui pose quelques problèmes, nottament au lors de l'utilisation de __forward() et _redirect()).

Continue reading...

Tuesday 14 November 2006

MySQL, Interclassement et Recherche

Sur une colonne en interclassement utf8_bin, une recherche de type LIKE sera case sensitive (sensible à la casse) par défaut (je n'ai pas cherché / trouvé de moyen d'inverser ce comportement). Alors que sur un interclassement utf8_unicode_ci, la recherche se fait en mode case insensitive (insensible à la casse), à moins d'employer la syntaxe LIKE BIN 'needle'.

Thursday 9 November 2006

Migrer un dépot subversion

Imaginons que vous souhaitiez déplacer votre dépôt subversion myproject d'une machine old-server à une machine new-server. Vite fait, bien fait:

old-server# svnadmin dump /var/lib/subversion/myproject > ~/myproject.svndump
old-server# scp ~/myproject.svndump new-server:
new-server# svnadmin create /var/lib/subversion/myproject
new-server# svnadmin load /var/lib/subversion/myproject < ~/myproject.svndump

Attention, il vous faut par contre migrer vos éventuelles hooks à la main, ils ne sont effectivement pas gérés par svndump. Une autre méthode, incluant les hooks celle-ci, serait d'utiliser svnadmin hotcopy, mais je n'ai pas testé.

Plus d'infos:

Monday 6 November 2006

A propos du blog Zend et du planet

J'ai fermé le blog Zend que j'avais ouvert, tout simplement parcequ'il me semble de plus en plus clair que le genre de personne susceptible d'écrire sur ce genre de blog possède déjà un blog, et qu'il serait bien présomptueux de penser qu'ils preferreraient écrire sur mon blog plutôt que sur le leur. J'ai donc installé un moonmoon à la place, dont le but ultime est d'aggréger les blogs francophones (ou leurs tags / catégorie) traitant de près ou de loin de PHP, à la manière du Planet PHP originel, donc. La planet en question est donc disponible sur http://phpmafia.net/, et vous y trouverez d'ores et déjà les blogs qui figurent en bonne place dans mon lecteur RSS.

Pour faire partie du planet, il suffit de m'envoyer un mail avec l'adresse de votre blog (ou de sa partie traitant de PHP), ainsi que votre nom / pseudonyme, et c'est tout :-)

Pour en revenir au blog Zend Framework, vous trouverez désormais mes billets sur ce blog, sous le tag Zend Framework.

Friday 3 November 2006

Pensée du jour

La solitude peut prendre bien des formes

Thursday 2 November 2006

Au fait...

...hier j'étais a Score Games avec un pote, et au moment de passer à la caisse, j'ai craqué:

Bon ben vous me mettez une wii de côté hein. Avec un ptit Zelda, bien entendu.

Ma vie n'est désormais qu'une attente du wii décembre.

Thursday 2 November 2006

Citation du jour: Winston Churchill

De temps en temps, les hommes tombent sur la vérité. La plupart se relèvent comme si de rien n'était.

(courtesy of ce gros roxor)

Wednesday 1 November 2006

Incubated

Les liens interressants (ou pas) de la semaine:

Continue reading...

Tuesday 31 October 2006

Howto: Utiliser Zend_Controller_RewriteRouter avec Zend_Config

Comme je le disais plus bas, le Zend Framework Preview 0.2.0 est dans les bacs ! Cette nouvelle mouture apporte son lot de nouveautés, et nous allons nous pencher sur une des plus interressantes: le RewriteRouter. Le RewriteRouter est un routeur pour le composant MVC du Zend Framework qui va nous permettre de configurer nos URL comme dans Ruby on Rails, c'est à dire (en gros), via un fichier de configuration, et c'est là que Zend_Config entre en jeu.

Continue reading...

Tuesday 31 October 2006

Zend Framework 0.2.0

Le Zend Framework nouveau est arrivé, et il a l'air prometteur. Pour les plus courageux: le changelog, sinon vous pouvez vous contenter de l'annonce sur alex@net en attendant celle de la DevZone.

J'ai d'ores et déjà repéré quelques nouveautés qui mériteront un petit billet un peu plus tard :-)

EDIT: Extrait de la news sur le site officiel:

The Zend Framework community has released the 0.2.0 Preview Release. This release contains many important enhancements and new features:

* New MVC implementation
* New HTTP request and response objects make it easy to automate unit testing for web apps without a web server, and also make it possible to use MVC for command-line and PHP-GTK application development
* Enhanced pure PHP Lucene-compatible search engine component
* New Mysqli DB adapter
* New JSON server
* New REST client and server
* New XmlRpc client and server
* New Acl component
* New Session component
* New Web Services clients for Delicious and Audioscrobbler
* New Registry component
* Significant improvements to many other components

Sunday 29 October 2006

Bonnes pratiques PHP

Vite fait, un petit jeu pour vous, amis PHPiens.

Dans le snippet de code qui suit se cachent 6 bonnes pratiques (7 selon le degré de subjectivité que l'on inclue dans une bonne pratique), saurez vous les retrouver ?

<?php

$code_is_ugly = true;
if (9069 === $code_author) {
	$code_is_ugly = false;
}

?>

Wednesday 25 October 2006

Mettre en place un SSO avec Invision Power Board

Rien de plus simple, tout est déjà prévu. Après l'installation de votre forum IPB, nous allons enregistrer une nouvelle méthode de login. Pour se faire, dans le panneau d'administration, nous nous dirigeons vers Tools and Settings, puis dans Create New Log In du menu Log In Manager. On se retrouve devant un formulaire (assez explicite) que je vous laisse le soin de remplir. On dira juste que nous appellerons cette méthode de login Mon SSO (Log In Title) et qu'il vivra dans le répertoire mon_sso (Log In Files Folder Name). Pour que votre méthode de login soit active, vous devez cocher Log In Enabled, et il est toujours bon de passer en mode On-Fail, ainsi que d'autoriser la création d'utilisateurs (Log In Allow Member Creation), qui créera automagiquement les utilisateurs dans la base locale d'IPB.

Continue reading...

Friday 20 October 2006

Relayer un stream audio avec icecast2

Pour économiser la bande passante au boulot, j'ai décidé de relayer le stream Club ! de 1.fm sur le LAN. Après avoir vainement tenté d'utiliser streamripper (on verra plus tard pourquoi vainement), j'ai sorti l'artillerie lourde: icecast2:

sudo apt-get install icecast2

Si on sait un peu lire, le script de post-configuration nous incite à aller fourrer notre nez dans /etc/default/icecast2, où l'on apprend (vers la fin) que icecast est désactivé par défaut à cause de la directive ENABLED=false. C'est en fait une feinte pour nous pousser à configurer le bousin (de toute façon si on le configure pas, il marchera pas). Direction /etc/icecast2/icecast.xml donc, pour un brin de configuration (les explications qui suivent se basent sur le fichier par défaut d'une installation sur une ubuntu).

La première partie qui nous interresse s'intitule authentication (vers la ligne 23). Elle contient les informations d'authentification pour les clients qui se connectent en tant que source (source-password), les serveurs qui se connectent en tant que slave (relay-password, en fait je ne suis pas sur à 100%, c'est une déduction) et pour l'interface d'administration (admin-user et admin-password). Une fois ces informations modifiées, direction la directive hostname, qu'on remplira avec au choix, le nom de la machine, son ip, etc. J'ai personellement mis l'ip privée de ma machine (172.16.x.y), pour que ça correspondent à la prochaine directive qui nous interresse: listen-socket. Ici on définit le port et l'ip sur laquelle icecast va écouter. En gros, si vous spécifier 127.0.0.1, votre serveur de streaming ne sera accessible qu'en local. On y met donc en général la même chose que dans hostname (172.16.x.y par exemple), avec un port qui va bien, libre de préférence (8000 par défaut).

Maintenant on passe a la partie qui nous interresse vraiment, la section relay. Rien de bien compliqué ici. Le stream que je souhaite relayer se trouve là: http://64.62.253.223:8060/, or icecast nous demande un server, un port, un point de montage (mount) et un point de montage local (local-mount). Vous avez déjà compris qu'on arrive a cette configuration:

   <relay>
       <server>64.62.253.223</server>
       <port>8060</port>
       <mount>/</mount>
       <local-mount>/1.fm</local-mount>
       <on-demand>0</on-demand>
       <relay-shoutcast-metadata>1</relay-shoutcast-metadata>
   </relay>

Ainsi parés, il ne nous reste plus qu'a lancer modifier la directive ENABLED=false en ENABLED=true dans /etc/default/icecast2 et à lancer icecast:

sudo /etc/init.d/icecast2 start

Si vous avez bien tout fait, vous devriez pouvoir streamer depuis http://172.16.x.y:8000/1.fm, et vos collègues également ! Vous pouvez avoir une vue d'ensemble du serveur ainsi que quelques options d'administration en vous rendant sur l'interface d'admin: http://172.16.x.y:8000/ et en utilisant admin-user et admin-password pour vous authentifier.

A cela on peut ajouter un petit streamripper:

streamripper http://172.16.x.y:8000/1.fm -d ~/streamripped

Pour enregistrer. En parlant de streamripper, j'avais tenté au début de relayer avec streamripper -r, mais malgrès les apparences du netstat -pl (*:8000 LISTEN), il ne bind qu'en local, donc impossible d'en faire profiter les collègues :-)

Friday 20 October 2006

Vous prendrez bien un peu de ssh avec votre tunnel ?

Il arrive des fois où on aimerait pouvoir relier directment deux machines appartenant a deux réseaux distincts. C'est par exemple mon cas quand j'ai besoin (envie on va dire) d'accéder à ma machine du boulot depuis une machine non connectée au VPN. Dans ce genre de cas, il existe en général une machine qui possède des interfaces susceptibles d'accéder à chacune des machines (le concentrateur VPN par exemple). Nous appellerons cette machine relay, car elle servira de relai au tunnel. Pour éviter les sempiternelles appellations A et B qui embrouillent plus qu'autre chose, les machines s'appelleront startpoint pour la machine sur laquelle on a la main et endpoint pour la machine à laquelle on souhaite accéder.

Postulats de base:

  • relay possède un serveur SSH qui tourne
  • startpoint possède un client SSH capable de créer un tunnel (ssh, par exemple)
  • relay est accessible depuis startpoint et peut se connecter à endpoint

Bien, allons y franchement, la commande, à executer depuis startpoint, permettant de créer un tunnel SSH entre startpoint et endpoint est la suivante:

ssh -L 2222:endpoint:22 relay

Qu'avons nous fait là ? L'option -L de SSH sert à binder un port de la machine locale (startpoint donc), à un autre port (ou le même) de la machine distante (endpoint). Ici, on associe le port local 2222 (22 étant déjà pris par mon serveur SSH, mais on pourrait utiliser le port 22 si aucun serveur ne tournait, à la différence près qu'il faudrait lancer la commande en root pour pouvoir binder un port inférieur à 1024 (c'est comme ça)) au port 22 de endpoint, c'est à dire le serveur SSH. Il nous est dès lors possible d'ouvrir une connection SSH sur endpoint en se connectant au port 2222 de notre machine locale:

ssh -p 2222 localhost

Magique non ? Bien sur, il est possible de forwarder n'importe quel port au travers du tunnel:

ssh -L 8080:endpoint:80 relay

Faire pointer votre navigateur sur http://localhost:8080/ vous ammenera sur le serveur web de endpoint.

Mais un tunnel ne se limite pas à joindre deux machines d'un réseau différents. On peut également imaginer un tunnel entre deux machines dans l'unique but de sécuriser une transmission, par exemple, des échanges de mails. Imaginons que votre serveur mail preferré, pop.example.com, ne propose pas de connection POP sécurisée. Vous pouvez remédier à ce manque flagrant de confidentialité en créant un tunnel SSH:

ssh -L 1100:localhost:110 pop.example.com

Bien sur, ce cas de figure nécessite d'avoir un compte permettant une connexion SSH sur pop.example.com, ce qui n'est pas forcément le cas. Pour remédier a ceci, deux solutions: utiliser un relay qui possède un serveur SSH, ou installer un serveur SSH sur startpoint pour s'en servir comme relai (sudo apt-get install openssh-server sur toute distribution debian-like qui se respecte):

ssh -L 1100:pop.example.com:110 localhost

And voila, il n'y a plus qu'a indiquer à notre client mail que le pop se situe sur localhost au port 1100, et le tour est joué :-)

Friday 20 October 2006

Un forum qu'il est bien: Invision Power Board

Alors au taf on va déployer des forums sur l'ensemble des sites du groupe, et donc après un rapide tour des forums disponibles (tant libres que commerciaux), on a choisi Invision Power Board. Après une matinée de trifouillage, j'ai l'intime conviction que nous avons fait le bon choix. En effet, avec Invision Power Board, on peut mettre en place un SSO en moins d'une heure tout en

  1. buvant son café
  2. lisant ses RSS
  3. discutant avec son chef
  4. glandant sur IRC
  5. rigolant avec les collègues

Et ça, c'est pas avec des forums libres que c'est possible.

- page 7 of 37 -