Je suis un peu triste parce que je voulais m'atteler à cette tâche, mais bon il faut croire que j'ai trop lambiné :)
A propos
- About me: Geoffrey Bachelet
- Profile LinkedIn
To content | To menu | To search
Thursday 12 April 2007
By Geoffrey on Thursday 12 April 2007, 00:31 - Coding
Je suis un peu triste parce que je voulais m'atteler à cette tâche, mais bon il faut croire que j'ai trop lambiné :)
Friday 2 March 2007
By Geoffrey on Friday 2 March 2007, 12:11 - Geekeries
Pour installer le serveur PEAR, c'est simple:
pear channel-discover pear.chiaraquartet.net pear install chiara/Chiara_PEAR_Server pear run-scripts Chiara_PEAR_Server
Ensuite on répond aux question, et c'est automagique.
Après, pour créer des packages, ça se corse. Tout d'abord, on a besoin de PEAR_PackageFileManager:
pear install PEAR_PackageFileManager
Ensuite, le but est de générer les package.xml qui vont bien. Voilà comment j'ai procédé pour le package Zend:
mkdir -p ~/pear/zend/src && cd ~/pear/zend wget http://framework.zend.com/download/tgz -O - | tar xzC ~ mv ~/ZendFramework-0.8.0/library/Zend* src/ php ./mkpkg.php make cd src && pear package
Ceux qui ont bien suivi auront noté que mkpkg.php est sorti un peu de l'espace :-) Vous trouverez son contenu à la fin du billet.
Pour résumer, on créé un répertoire de travail (~/pear/zend/), dans lequel on créé un répertoire src, qui contiendra tous les fichiers du package, puis le script mkpkg.php se charge 1) d'analyser le contenu de src, et 2) de créer le package.xml qui va bien, selon les instructions qui lui sont fournies.
Nous disposons désormais d'un package Zend-0.8.0.tgz dans ~/pear/zend/src, que nous n'avons plus qu'a uploader via l'interface d'administration du serveur PEAR précédemment installé :-)
Le fichier mkpkg.php:
<?php
require_once('PEAR/PackageFileManager2.php');
PEAR::setErrorHandling(PEAR_ERROR_DIE);
$packagexml = new PEAR_PackageFileManager2;
$e = $packagexml->setOptions(array(
'baseinstalldir' => '/',
'packagedirectory' => dirname(__FILE__).'/src',
));
$packagexml->setPackage('Zend');
$packagexml->setSummary('Zend Framework');
$packagexml->setDescription('The Zend\'s PHP Framework');
$packagexml->setChannel('pear.phpmafia.net');
$packagexml->setAPIVersion('0.8.0');
$packagexml->setReleaseVersion('0.8.0');
$packagexml->setReleaseStability('devel');
$packagexml->setAPIStability('devel');
$packagexml->setNotes("Still a preview release");
$packagexml->setPackageType('php'); // this is a PEAR-style php script package
$packagexml->addRelease(); // set up a release section
$packagexml->setPhpDep('5.1.2');
$packagexml->setPearinstallerDep('1.4.0a12');
$packagexml->addMaintainer('lead', 'ash', 'Geoffrey Bachelet', 'geoffrey+pear@zubrowka.org');
$packagexml->setLicense('New BSD License', 'http://framework.zend.com/license/new-bsd');
$packagexml->generateContents(); // create the <contents> tag
$pkg = &$packagexml->exportCompatiblePackageFile1(); // get a PEAR_PackageFile object
if (isset($_GET['make']) || (isset($_SERVER['argv']) && @$_SERVER['argv'][1] == 'make')) {
$pkg->writePackageFile();
$packagexml->writePackageFile();
} else {
$pkg->debugPackageFile();
$packagexml->debugPackageFile();
}
?>
Wednesday 3 January 2007
By Geoffrey on Wednesday 3 January 2007, 11:04 - Geekeries
Par exemple, imaginons qu'on récupère une query string, et qu'on veuille l'exploser sur plusieurs lignes, on peut faire:
:s/&/\="\<CR>"/g
le \="" annonce à VIM que la chaine de
substitution sera une chaine a interpréter avant utilisation, et le
\<CR> représente tout simplement le Carriage
Return.
Sunday 17 December 2006
By Geoffrey on Sunday 17 December 2006, 16:43 - Coding
Méthode bourrin, je ne sais pas si il en existe une meilleure. Disons qu'on veut annuler la révision 329 (et que c'est la dernière en date):
$ svn update $ svn merge -r 329:328 . $ svn commit -m "cancel 329"
En tout cas chez moi ça a marché.
Friday 24 November 2006
By Geoffrey on Friday 24 November 2006, 20:27 - Coding
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.
Sunday 19 November 2006
By Geoffrey on Sunday 19 November 2006, 21:30 - Coding
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()).
Thursday 9 November 2006
By Geoffrey on Thursday 9 November 2006, 17:25 - Geekeries
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:
Tuesday 31 October 2006
By Geoffrey on Tuesday 31 October 2006, 20:26 - Coding
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.
Wednesday 25 October 2006
By Geoffrey on Wednesday 25 October 2006, 23:02 - Coding
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.
Friday 20 October 2006
By Geoffrey on Friday 20 October 2006, 22:05 - Geekeries
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 :-)
By Geoffrey on Friday 20 October 2006, 20:06 - Geekeries
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 tournestartpoint possède un client SSH capable de créer un tunnel (ssh, par exemple)relay est accessible depuis startpoint et peut se connecter à endpointBien, 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 13 October 2006
By Geoffrey on Friday 13 October 2006, 18:31 - Coding
Nous avons parcouru dernièrement la création du bootstrap HTTP qui sert de socle à une application utilisant le Zend Framework. Le même principe peut s'appliquer aux scripts CLI, mais comme les besoins sont fondamentalements différents, l'implémentation sera elle aussi complètement différente. Nous viserons les objectifs suivants:
Thursday 12 October 2006
By Geoffrey on Thursday 12 October 2006, 21:51 - Coding
Voilà un article que j'avais déjà proposé sur un site a caractère privé, un peu remis au gout du jour et étoffé de quelques informations et ressources non négligeables. Nous verrons ici comment mettre en place un environement d'execution standard du Zend Framework, également appelé bootstrap de l'autre coté de l'atlantique.
Tuesday 3 October 2006
By Geoffrey on Tuesday 3 October 2006, 17:08 - Geekeries
Bon voilà, je viens de suivre ce howto, et ça marche très bien. Passé le stade mais où sont mes efferalgans ?, on arrive rapidement au stade mais où mon smecta ?, tellement c'est gerbant de fluidité. Bref, le desktop mappé sur un cube, c'est sympa, mais on lui preferrera de loin les effets moins psychédéliques tels que la vraie transparence et les animations des fenetres (et encore).
Sunday 24 September 2006
By Geoffrey on Sunday 24 September 2006, 22:22 - Coding
Le titre n'est pas très explicite, malheureusement, j'ai du mal a réfléchir ce soir. Nous parlons ici de la sauvegarde d'un mot de passe par Firefox quand on valide un formulaire contenant un champs password. Je ne connais pas exactement les règles qui régissent ce comportement, mais quand on à un formulaire d'enregistrement, en général, cette fonctionnalitée est plus une gène qu'autre chose. Pour la désactiver, il suffit donc d'affecter un attribut autocomplete de valeur off à votre champs:
<input type="password" name="password" id="password" autocomplete="off" />
Je sais, ça fait beaucoup de password.
Wednesday 30 August 2006
By Geoffrey on Wednesday 30 August 2006, 13:17 - Coding
Le rebutement principal que j'ai eu au début avec le Zend Framework était l'impossibilité (a priori) d'automatiser le rendu des vues en fonction du controlleur et de l'action appelés. Mes pérénigrations webesques m'ont finalement fait entrevoir la solution.
EDIT: mes nouvelles pérégrinations dans les sources du Zend Framework m'ont fait entrevoir une meilleure solution :-)
Tout se passe dans le destructeur du controlleur, et nous allons voir ici une version édulcorée de celle disponible dans le lien sus-cité. L'astuce qui sauve, c'est de savoir que l'objet Controller possède un membre _action, qui lui même propose (entre autres) deux méthodes bien utiles: getControllerName et getActionName. Il suffit donc de récupérer ces informations pour construire dynamiquement le chemin de la vue à utiliser pour un controlleur donné:
abstract class My_Controller_Action extends Zend_Controller_Action {
public function __destruct() {
$view = Zend::registry('view');
$controller = $this->_action->getControllerName();
$action = $this->_action->getActionName();
$viewPath = sprintf('%s/%s.php', $controller, $action);
try {
echo $view->render($viewPath);
} catch (Exception $e) {
trigger_error('Unable to render view: ' . $e->getMessage(), E_USER_ERROR);
}
}
}
Ce controlleur requiert que vous ayez instancié, configuré et enregistré Zend_View au préalable. Il ira, lors de sa destruction, chercher la vue dont le nom correspond à controller/action.php, c'est à dire:
http://example.com/foo/bar/, foo/bar.php,http://example.com/, index/index.php,http://example.com/foo/, foo/index.php.Pour une raison obscure, on ne peut pas laisser trainer l'éventuelle exception générée par Zend_View dans le cas d'une vue inexistante. Cela entre en conflit avec une autre Exception qui traine, j'essayerai de tirer ça au clair :-)
Saturday 12 August 2006
By Geoffrey on Saturday 12 August 2006, 20:31 - Coding
Bon voilà, j'ai commencé le développement d'un projet, et j'ai décidé d'utiliser le Zend Framework (pour des raisons que je détaillerais dans un autre billet si ça vous interresse). Après mise en application du tutoriel de Chris, Un premier problème s'est posé à moi: l'intégration des sessions. Après quelques recherches, on peut trouver un blog développé avec ZF. Me ruant sur la partie d'admin, je découvre a ma grande stupeur des session_start() incrustés a chaque méthode du controlleur, un peu comme ça:
class AdminController extends Zend_Controller_Action {
function indexAction() {
session_start();
}
function postAction() {
session_start();
}
}
Ce n'est évidemment pas une solution acceptable. J'ai opté pour ma part pour une surcharge de la classe Zend_Controller_Action, avec un appel à session_start() dans le constructeur:
abstract class My_Controller_Action extends Zend_Controller_Action {
public function __construct() {
session_start();
}
}
class AdminController extends My_Controller_Action {
function indexAction() {
// code
}
}
Bon là, la problèmatique de base est déjà résolue, mais on peut aller plus loin, et ajouter un destructeur:
abstract class My_Controller_Action extends Zend_Controller_Action {
public function __construct() {
session_start();
}
public function __destruct() {
$session_id = session_id();
if (!empty($session_id)) {
session_write_close();
}
}
}
Voilà c'est tout pour aujourd'hui, la prochaine fois, on parlera de l'utilisation des Views, et nottament, comment éviter un appel rébarbatif à Zend::registry() dans chaque controlleur.
Saturday 5 March 2005
By Geoffrey on Saturday 5 March 2005, 13:02 - Geekeries
Souvent les gens ne voient PHP que comme un langage de script orienté web. Même si il est vrai que c'est son but premier, ce n'est pas la seule chose que PHP peut faire. Penchons nous un peu sur l'utilisation de PHP en CLI, qui permet d'utiliser PHP comme un langage de script classique. Nous utiliserons pour se faire un système linux (ubuntu pour être précis) avec un binaire php-cli déjà installé.
Saturday 8 May 2004
By Geoffrey on Saturday 8 May 2004, 23:20 - Ego
Encore une traduction d'un article de Jonathan McPherson ! Cette fois l'article porte sur vim, l'éditeur de texte des décideurs pressés. Les remerciements vont cette fois à Grégoire Gilbert qui m'a traduit plus de la moitié de l'article quand même :)
Thursday 1 April 2004
By Geoffrey on Thursday 1 April 2004, 20:40 - Ego
Ce billet est une traduction d'un article que j'ai trouvé sur kuro5hin. Ayant trouvé l'article très interressant, et me disant que putain faudrait que je mette du stuff utile sur digital fashion un jour, j'ai contacté l'auteur qui s'est empressé de me donner l'autorisation de traduire et publier son article sur mon blog, ainsi qu'une version plus actuelle de l'article sur son site. C'est cette version que je vous livre ici traduite. C'est ma première vraie traduction, donc soyez indulgent merci :) si vous rencontrez des fautes d'orthographe, de style, ou de tournure n'hésitez pas à le signaler dans les commentaires, je corrigerais en conséquence.
Je tiens à remercier l'auteur, Jonathan McPherson, pour avoir publié un si bon article et pour m'avoir autorisé à le traduire et à le publier, ainsi que Renaud Littolff, pour la relecture.
Voilà, bonne lecture.
« previous entries - page 1 of 2