skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

lundi 25 février 2013

Ajouter une liste pré-construite d'options dans un webform de Drupal 7

Publié par Infinite Loop, à 20 h 41 2 commentaires

Créer un formulaire par l'interface de gestion de Drupal est facile si on utilise un des nombreux modules offerts :

  • Contact (provenant du noyau de Drupal)
  • Contact Forms
  • Webform
Webform est intéressant car il permet non seulement d'envoyer un courriel avec les résultats du formulaire mais aussi d'enregistrer les données soumises dans la base de données pour permettre à l'administrateur de les consulter et les exporter. Ma première expérience en développement Drupal (lire ici : écrire un peu de code PHP) s'est faite avec le module Webform où j'avais à créer un formulaire qui présentait la difficulté de devoir afficher une liste dynamique de choix. Pour illustrer le défi, j'ai reproduit dans le formulaire de sondage ci-dessous le cas où le visiteur doit indiquer son fureteur préféré parmi Chrome, Firefox et Internet Explorer :


Pour créer un champ présentant une liste d'options (radio buttons), il faut le définir comme étant du type "Select options". Pour chaque champ créé, un deuxième écran s'affiche permettant de le paramétrer. Dans ce cas-ci, on pourrait indiquer une liste statique d'options à raison d'une par ligne, sous la forme valeur|Libellé. Visuellement, on aurait exactement le rendu illustré plus haut, généré à partir d'une liste fixe. Pour la maintenance des choix, mon but était de rendre la liste de référence dynamique, gérée à un seul endroit pour être réutilisable dans différents contextes et qu'elle s'ajuste automatiquement selon l'ajout ou le retrait d'une entrée. C'est le défi et la solution que je présenterai en détail aujourd'hui.

Avant même de créer le webform, on devra préalablement enregistrer quelque part la liste des choix possibles. Pour se faire, on utilisera le module Taxonomy qui fait parti du noyau de Drupal.

Par le menu d'administration Structure / Taxonomy / Add vocabulary, inscrire le titre du nouveau vocabulaire. Comme on veut lister les différents fureteurs, on le nommera "Fureteurs". Ajoutez ensuite des termes au vocabulaire, dans trois entrées séparées :
  • Chrome
  • Firefox
  • Internet Explorer
Volontairement, j'omets Safari et Opera pour deux raisons :
  1. Pour tester si la liste dynamique fonctionnera lorsque j'ajouterai un nouveau terme au vocabulaire
  2. Parce que le sujet d'un prochain billet sera d'ajouter une option "autre" permettant à l'utilisateur de saisir textuellement un choix qui est absent de la liste
Maintenant, on est prêt à créer le formulaire à l'aide du module Webform (installez-le si ce n'est pas déjà fait). Lors que le module est installé et activé, un nouveau type de contenu apparaît sous le menu Content / Add content / Webform. Pour garder l'exemple simple, entrez un titre puis à l'étape suivante, sous l'onglet Webform, ajoutez trois champs et conservez les paramètres par défaut au moment de personnaliser chaque champ, sauf pour le dernier :
  • Nom (type: textfield)
  • Courriel (type: E-mail)
  • Fureteur préféré (type: Select options)
 
Une fois le champ Fureteur préféré ajouté, l'écran de paramétrage du champ apparaît et offre la possibilité d'indiquer manuellement la liste des options ou bien en chargeant une liste pré-construite (Load a pre-built option list) qui sera modifiée automatiquement si on ajoute ou retire des éléments. Dans notre cas, on voudra lier la liste de termes d'un vocabulaire mais elle ne se trouve pas dans la liste des choix. Nous devrons l'ajouter par programmation.



Pour y arriver, on écrira du code PHP qui utilisera la mécanique des hooks de Drupal. Il ne faudra en aucun temps modifier le code du module installé (exemple Webform), sans quoi on aura une mauvaise surprise lorsqu'on effectuera une mise à jour du module. C'est pourquoi on créera un petit module séparé que pour notre personnalisation.

Dans l'arborescence du projet, sous /sites/all/modules, créez un répertoire nommé webform_custom (pas très original, laissez place à votre créativité tant que le nom est unique et significatif pour vous y retrouver).

Si vous l'avez nommé webform_custom, créez à l'intérieur un fichier webform_custom.info et un autre webform_custom.module (pour plus de détails, voir Anatomie de base d'un module Drupal 7).

webform_custom.info
name = webform_custom
description = Personnalisation spécifique au projet pour le module Webform
core = 7.x
package = Code 18
files[] = webform_custom.module

webform_custom.module

Dans ce fichier, la première fonction est un hook qui permet d'ajouter un nouveau type de liste, à laquelle est associée une ou plusieurs options.
# nom du module: webform_custom 
# implémentation du hook _webform_select_options_info()
# nom de la fonction :  [nom du module] + [nom du hook]

function webform_custom_webform_select_options_info(){

    $items = array();

    # Récupérer le Field key du champ Fureteur préféré
    # (généré automatiquement et listé lorsqu'on ajoute ou modifie un champ du webform

    $items['fureteur_prefere'] = array(
        'title' => 'Browsers',
        'options callback' => 'get_browsers_list' // fonction où récupérer les options de la liste
    );

    return $items;
}

function get_browsers_list() {
 
    # Pour obtenir le VID interne du vocabulaire,
    # voir la table taxonomy_vocabulary dans mysql.
    # Dans mon cas, Fureteurs correspond au vid 3.

    $id = 3;
    $terms = taxonomy_get_tree($id);

    $options = array();

    foreach($terms as $tid => $term) {
        $options[$term->name] = $term->name;
    }

    return $options;
}

En quelques lignes de code, nous venons d'ajouter au module Webform la possibilité de sélectionner comme source de sélection la liste les fureteurs définis dynamiquement dans un vocabulaire du module Taxonomy.

Comme ce que nous venons de faire est un nouveau module, il faudra nécessairement l'activer pour que le code prenne effet. Retournez à la liste des modules, cocher-le et enregistrez la configuration. Notez que c'est possible que vous ayez à vider la cache du système (bouton Flush all caches dans Configuration / Development / Performance).

Retournez ajouter ou modifier le champ Fureteur préféré du Webform (par le menu Content) puis choisissez l'option Fureteurs sous Load a pre-built option list et enregistrez.

En retournant voir le visuel du formulaire, vous devriez voir apparaître la liste d'options sous forme de radio buttons. Dans les paramètres du champ, cochez Multiple si vous préférez offrir la possibilité au visiteur de faire plusieurs choix à l'aide de cases à cocher.


Tags: Drupal, PHP

dimanche 24 février 2013

Anatomie de base d'un module Drupal 7

Publié par Infinite Loop, à 08 h 40 0 commentaire

Dans Drupal, un module est composé de code qui permet d'enrichir le noyau en ajoutant ou en réécrivant des fonctionnalités. En général, face à un nouveau besoin, on privilégiera dans l'ordre :

  1. La recherche d'une contribution existante parmi plus de 20 000 modules
  2. L'altération d'un module existant par extension
  3. L'écriture d'un tout nouveau module

Où sont les modules ?
  • Ceux du noyau se trouvent dans /modules/
  • Les modules installés provenant des contributions se trouvent dans /sites/all/modules/
De quoi est composé un module ?

Essentiellement, de deux fichiers partageant le même nom et portant les extensions .info et .module. C'est le strict minimum pour avoir quelque chose de fonctionnel mais on trouve généralement plusieurs autres fichiers à l'intérieur du répertoire.

Fichier .info

Il s'agit d'un fichier texte qui décrit le module sous la forme clé-valeur. Son contenu est lu et interprété dans le but faire des vérifications au moment de l'installation :
name = Exemple 1
description = "Description du module"
package = Code 18
core = 7.x
files[] = code18.module
dependencies[] = block
...
Où :
  • name contient le nom textuel du module qui apparaîtra dans la liste des modules et lorsqu'il est référencé.
  • description décrit simplement ce que fait le module.
  • package représente le regroupement logique dans lequel le module doit être classé (voir à droite).
  • core indique la compatibilité avec le noyau de Drupal (ici les versions de Drupal 7).
  • files[] permet d'inclure un fichier externe nécessaire au module.
  • dependencies[] indique que le module courant possède une dépendance à un autre module qui doit aussi être installé pour qu'il fonctionne. Le nom du module dépendant à inscrire est simplement le nom de son fichier .module ou .info, sans l'extension.
  • Et plusieurs autres caractéristiques avancées (page de configuration, attachement de fichiers JavaScript et CSS).
 Aperçu des métadonnées provenant du fichier .info dans la liste des modules
Fichier .module

Avant d'écrire quoi que ce soit dans un fichier .module, il est impératif de bien comprendre le concept du hook. Les hooks permettent d'intervenir à différentes étapes dans l'exécution du code de sorte à pouvoir altérer et enrichir une fonctionnalité existante de façon à répondre à nos besoins sans avoir à réécrire le code original (ne modifiez jamais directement un module provenant d'une contribution!). Au contraire, on redéfinit uniquement ce qu'on a besoin en utilisant les hooks mis à notre disposition.

Dans la documentation, la liste des hooks disponibles indique une notation générique du type hook_init() où le préfixe hook doit être remplacé par le nom de notre module. Par exemple, si on crée un module qu'on nomme code18, on écrira des fonctions à l'intérieur de notre fichier code18.module :
  • code18_init()
  • code18_permission()
  • code18_menu()
  • code18_help()
  • code18_form_alter()
Pour qu'un module soit utile, il devra compter au moins une fonction, aussi simple soit-elle.

Fichier README.txt

Contient l'information nécessaire pour comprendre le fonctionnement et les impacts du module.

Fichier .install

Optionnellement, un module pourrait inclure un fichier .install qui contiendrait des fonctions PHP implémentant les hooks _install() et _uninstall() qui, respectivement, ajouterait des champs nécessaires au fonctionnement du module et ferait le ménage pour garder le système propre lors de sa désinstallation.

Il y a plus encore mais pour l'instant, retenez uniquement ceci, le but de ce billet étant d'offrir un aperçu de la base pour avoir un minimum de compréhension face à une première expérience. Dans le prochain billet, je ferai une démonstration plus concrète pour mettre le tout en pratique.


Tags: Drupal

mardi 19 février 2013

Deux modules Drupal pratiques pour l'interface d'administration

Publié par Infinite Loop, à 21 h 20 0 commentaire


En date d'aujourd'hui, Drupal compte au-delà de 20 000 modules provenant de contributions de la communauté. Oui, vous avez bien lu, vingt mille, avec quatre zéros. Avec ça, c'est tout un défi de s'y retrouver. Bien sûr, il y a des modules qui accomplissent sensiblement la même tâche alors mieux vaut fouiller pour en trouver qui répondent le mieux à nos besoins. Dans le cas contraire, on pourra toujours s'affairer à développer ses propres modules et les soumettre pour en faire bénéficier la communauté.

Lors de l'installation de Drupal 7, plusieurs modules sont livrés avec le noyau, qu'ils soient activés ou non : Node, Block, Field, Filter, Taxonomy, Views. Avant de s'attaquer à démêler ces concepts, j'ai installé deux modules pratiques qui s'appliquent à l'interface d'administration.

Module Filter

Comme je l'ai dit, à force d'installer des extensions pour ajouter des fonctionnalités à notre projet Drupal, la liste des modules contenue dans /admin/modules s'allonge sans cesse, rendant la lecture plus difficile lorsqu'on en cherche un en particulier. Un petit module bien simple, "Module Filter" (à ne pas confondre avec le module "Filter") sert justement à corriger ce problème en ajoutant une boîte de recherche pour filtrer la liste des modules. Malheureusement, le mot clé ne cherche pas dans le texte de description.


Pour l'installer, cliquez sur Install new module de la page Modules et copiez-y directement l'URL du fichier .tar.gz ou du .zip correspondant à votre version de Drupal (6 ou 7). Puis, sous l'entête Next steps, suivez le lien Enable newly added modules et activez-le en cochant la case dans la colonne Enabled à côté du nom du module. Cliquez Save configuration.

Module Administration menu

Drupal offre une panoplie d'options d'administration et c'est la raison pour laquelle une barre d'outil noire se trouve au haut de la page. On y trouve des accès aux sections Dashboard, Content, Structure, Appearance, People, Modules, Configuration, Reports et Help. À l'intérieur de chacune de ces sections se trouvent des sous-sections pour gérer votre projet. Très vite, vous voudrez pouvoir accéder plus rapidement à celles-ci. C'est ici que le module Administration menu entre en jeu. Il permet de créer un menu plus convivial avec des sous-menus déroulants pour un accès plus rapide sans devoir recharger la page.

Installez ce package et activez les modules Administration menu et Administration menu Toolbar style pour obtenir un menu pratique comme celui-ci :


Vous vous retrouvez avec deux barres d'outils d'administration ? C'est que le module Administration menu ne remplace pas celui existant!


Pour retirer la barre initiale, désactivez le module Toolbar dans la liste des modules.


Tags: Drupal

dimanche 17 février 2013

Initier un nouvel employé

Publié par Infinite Loop, à 10 h 19 0 commentaire

La semaine prochaine, je commence un nouvel emploi. À titre de nouvel employé, je m'attends aussi à ce que ça rime tôt ou tard avec initiation. Vous savez, le genre de truc sympathique avec lequel on embarrasse le nouveau venu pour lui souhaiter la bienvenue dans l'équipe et se foutre un peu de sa gueule... Chers lecteurs, j'attire votre attention sur la dernière phrase : assurez-vous qu'il n'y ait aucune confusion et que vous avez bien lu le verbe "embarrasser" et non pas "embrasser", surtout si vous faites partis des nouveaux collègues que j'aurai. Parce que là, ça me mettrait vraiment mal à l'aise. Autrement, je suis prêt à rire d'à peu près n'importe quoi tant que ça reste loin des marques d'affection démesurées.

En règle générale, une initiation ne se fait pas au premier jour sinon ce serait trop prévisible et le nouvel employé surveillerait les moindres signes louches. Mieux vaut être cruel et le faire patienter un peu pour que l'effet de surprise soit total.

À quoi s'attendre ? Difficile à dire. J'ai eu une discussion à ce sujet avec des amis à propos des initiations que nous avions été tour à tour victime, complice ou observateur. En voici quelque-unes.

La chaudière de steam

C'est un classique du genre. Il faut demander au nouveau d'aller récupérer une chaudière de steam à un endroit reculé de l'usine où l'attend un complice. Celui-ci le questionne à savoir s'il a besoin de la rouge ou de la bleue. L'employé retourne voir le demandeur à l'autre bout de l'usine et lui indique la couleur désirée. Lorsque l'employé revient voir le complice avec la réponse, c'est à ce moment qu'on se moque de lui car il n'a pas réalisé l'absurde d'une chaudière de vapeur de couleur.

La machine à réparer les erreurs

L'erreur est humaine et une gaffe peut être coûteuse pour l'entreprise. L'idée est de faire croire qu'on a commis une erreur qu'il faut réparer au plus vite avant que d'autres s'en rendent compte. On informe l'initié de l'existence d'un gadget qui permet de réparer ce type d'erreur et on lui demande d'aller l'emprunter au dernier qui l'a eu en sa possession. Chaque fois que l'initié demande pour le mystérieux objet, on lui dit qu'un autre est venu l'emprunter et on le redirige vers cette personne, qui le renvoie à son tour vers une autre. Le plaisir est de voir l'initié faire le tour de la place (ce qui lui permet de rencontrer le plus de gens possibles) et de le faire paniquer un peu plus à mesure qu'il diffuse la nouvelle de l'erreur, jusqu'à ce qu'il réalise que la machine n'existe tout simplement pas.

L'inventaire

Alors qu'elle travaillait dans une succursale de banque, ma mère a déjà demandé à un nouvel employé de procéder à l'inventaire des trombones et des élastiques en stock. Sa tâche consistait à ouvrir les boîtes et à compter la quantité à l'intérieur pour s'assurer que ça correspondait au nombre inscrit sur l'emballage. Si une boîte en contenait moins qu'indiqué, la banque retournerait les items inexacts à son fournisseur.

L'enseigne de l'entreprise

Plusieurs entreprises ont une enseigne lumineuse avec leur logo pour annoncer le commerce aux passants. À une époque pas si lointaine, certains supermarchés avaient même une enseigne en rotation bien visible au haut d'un poteau. Au cours de l'hiver, alors qu'il y avait eu une bonne accumulation de neige, on demande en fin de journée à l'initié d'aller pelleter la neige autour du poteau pour trouver l'interrupteur de l'enseigne qui permet de l'éteindre jusqu'au lendemain ou pour la fin de semaine. Regardez-le se démener avec vigueur pour trouver une switch qui n'existe pas...

Le sous-sol

Dans la catégorie des choses qui n'existent pas, il y a un autre classique comme celui d'envoyer l'initié au sous-sol d'un entrepôt. Pour ce faire, il doit trouver l'emplacement de la trappe mais celle-ci se cache quelque part au sol, sous la marchandise ou les palettes qu'il devra déplacer. S'il a besoin d'aide, tout le monde a une idée très approximative de l'endroit où elle peut être située...

Courriel

En informatique, avec la complicité d'un administrateur réseau, ça devient facile d'envoyer des courriels de la part de l'initié, à son insu. Idéalement, c'est de profiter d'un moment où l'entreprise accueille deux nouvelles ressources (lire ici : victimes) puis de faire en sorte qu'ils reçoivent chacun un message étrange provenant de l'autre. Seulement, il faut faire attention pour ne pas créer de conflit pour éviter que ça dégénère.

Dans la glace

Ici aussi, ça peut passer pour un mauvais coup plutôt qu'une initiation. Je me souviens d'un enseignant à l'école secondaire qui, en début de journée, avait pris les clés d'un autre à son insu, les avait plongées dans un verre d'eau qu'il avait ensuite rangé au congélateur pour la journée. Lorsque l'autre enseignant s'en est rendu compte, il était trop tard. À cause du métal, il ne pouvait pas faire dégeler la glace en mettant le verre au four à micro-ondes. Il a du attendre que ça fonde en faisant couleur de l'eau chaude dessus.

Dans le même ordre d'idées, alors qu'un ami travaillait en épicerie, il avait pris le manteau d'hiver d'un employé, l'avait glissé dans un sac de plastique hermétique puis il avait utilisé la machine à sceller sous vide pour le compresser, pour finalement le mettre dans une chaudière d'eau qu'il avait rangé au congélateur. Au moins, en brisant la glace et en coupant le sac avec un ciseau, il pouvait récupérer son manteau intact et sec.

La concurrence

Ce même ami me raconta qu'il avait envoyé un emballeur chez un concurrent, voisin et complice, pour donner un coup de main parce qu'ils étaient débordés aux caisses. Sur place, il commença à ranger dans les sacs les commandes des clients. Sur le coup, il n'avait pas réalisé qu'il était le seul emballeur car ce concurrent n'en engageait pas puisqu'il était libre-service. J'imagine la réaction des clients amusés.


Tout ça pour dire que j'ai hâte de voir la créativité de mes nouveaux collègues. Promis, je serai bon joueur. Mais méfiez-vous, j'ai beaucoup d'imagination et ma vengeance sera terrible ;-)


Tags: Le coin du geek

samedi 16 février 2013

Drupal 7 : mécanique interne de la maintenance

Publié par Infinite Loop, à 15 h 16 1 commentaire

Une fois la première installation de base de Drupal complétée, je suis allé voir du côté de la configuration pour prendre connaissance des options offertes. Comme je n'ai pas d'expérience avec ce CMS, il existe un risque que je veuille modifier quelque chose et que ça tourne à la catastrophe, principalement si j'ai la mauvaise idée de le faire directement sur l'environnement de production. Dans ce cas, mieux vaut rendre le site temporairement indisponible en le mettant en maintenance.

Pour basculer en mode maintenance, il suffit de se connecter en administrateur à partir du bloc d'identification situé sur la page d'accueil, puis de se rendre par le menu d'administration à Configuration / Development / Maintenance Mode puis de cocher la case "Put site into maintenance mode" et de personnaliser le message qui apparaîtra sur le site jusqu'à ce qu'il redevienne disponible une fois les correctifs appliqués.


Pour tester, j'ai mis le site offline et je me suis déconnecté. Le problème, c'est qu'il n'y avait plus moyen de retourner au formulaire pour remettre le site online puisque le formulaire d'authentification avait disparu. Si j'avais lu le commentaire sous la case à cocher, j'aurais su qu'il est possible d'accéder directement à l'URL à locahost/code18/user durant la maintenance pour pouvoir se reconnecter en tant qu'administrateur pour changer la configuration à nouveau.

La partie technique qui intéressera les programmeurs

Entre temps, pour trouver le moyen de retirer la maintenance, j'ai fouillé sous le capot de Drupal, ce qui m'a permis de mieux comprendre une partie de son fonctionnement interne. Je soupçonnais fortement qu'un flag ou un champ booléen soit stocké dans la base de données et je devais simplement trouver où.

J'ai commencé par faire une recherche dans le code source pour le terme "maintenance" et j'ai revu le fonctionnement comme en reverse engineering :
  • J'ai trouvé plusieurs instructions du type variable_set('maintenance_mode', TRUE), ce qui indique qu'on peut mettre le site en maintenance, par programmation.
  • Sachant l'URL de la page de configuration (admin/config/development/maintenance), j'ai trouvé que la route qui mène à cette section est définie dans un array nommé $items situé dans le fichier system.module (situé dans modules/system à la racine de Drupal). Chaque définition de module est faite à l'aide d'un fichier .info situé dans le répertoire du module, auquel correspond un fichier .module qui contient l'implémentation en PHP.
  • Lorsqu'on accède à cette URL, Drupal invoque la fonction system_site_maintenance_mode() qui se trouve dans system.admin.inc.
  • La fonction system_site_maintenance_mode() utilise un array nommé $form pour définir par programmation les champs du formulaire à afficher, comme si on le faisait dans un contrôleur MVC.
  • Dans ce formulaire, l'appel à variable_get('maintenance_mode', 0) sert à obtenir la valeur par défaut de la variable nommée maintenance_mode. Si elle n'existe pas, la valeur par défaut sera 0.
  • variable_get() et variable_set() sont définies dans bootstrap.inc qui contient plusieurs fonctions utiles qui me font penser aux helpers dans Codeigniter.
  • La fonction variable_set() utilise à l'interne db_merge() pour stocker dans la table "variable" les différentes clés/valeurs. Chaque fois que variable_set() est appelée, un appel interne à cache_clear_all() se fait pour réinitialiser la mémoire cache de Drupal. Lorsque j'examinais les options du menu Configuration, j'ai vu qu'il est possible de forcer cette manoeuvre par l'interface en cliquant sur le bouton "Clear all caches" situé sous Configuration / Development / Performance.
  • Finalement, system_settings_form() appelle system_settings_form_submit() où s'opère l'enregistrement dans la base de données à l'aide de variable_set().
Maintenant que je savais que le flag était stocké dans la table "variable" sous la clé "maintenance_mode" (tirée de $form['maintenance_mode']), je suis allé jeter un oeil aux données, pour découvrir qu'elle ne s'y trouvait pas. Du moins pas encore. C'est qu'elle n'est pas créée par défaut et que l'enregistrement sera ajouté lors de la première utilisation de l'option de maintenance. Lorsque c'est fait, les entrées "maintenance_mode" et "maintenance_mode_message" s'ajoutent à la table variable.

Dans le mode Grid View de Navicat pour MySQL, on peut voir que les valeurs de la table variable sont stockées en tant que type blob (binary large object). Il suffit de basculer en mode "Memo" pour faire apparaître la valeur : "i:1;", où 1 équivaut à une maintenance activée et 0 à un fonctionnement normal. Comme on l'a vu plus haut, si on change la valeur directement dans la base de données, il ne faut pas oublier de réinitialiser la cache pour simuler le mécanisme interne de variable_set() afin que le changement prenne effet. Allez-y par le bouton"Clear all caches" si c'est nécessaire.


Tags: Drupal

Citation no. 159 sur la politesse

Publié par Infinite Loop, à 10 h 13 0 commentaire

Je me suis fait remettre à ma place : elle ne veut plus que je l'appelle Madame ni que je la vouvoie. Alors j'utilise "Tu" et "Monsieur".

- Code 18


Tags: Citations

mardi 12 février 2013

Installation Drupal et XAMPP

Publié par Infinite Loop, à 17 h 16 0 commentaire

Pour apprendre, c'est un bon début de lire la théorie sur le sujet mais rien n'est plus concret que l'expérience acquise par la pratique. Et pour ça, il me faut installer un environnement de développement sur ma machine :

  • Serveur XAMPP (dans mon cas pour Windows, non destiné à la production)
  • Un client MySQL (optionnel mais je préfère ça à phpMyAdmin qui s'installe avec XAMPP)
Installation de XAMPP

Après avoir procédé à l'installation de XAMPP, vous aurez accès aux services suivants:
  • Serveur web Apache
  • Système de gestion de base de données MySQL
  • Les langages de programmation PHP et Perl
  • Serveur FileZilla
  • Serveur de email Mercury
  • Tomcat (pour Java)
Dès la fin de l'installation, on vous proposera d'accéder au panneau de configuration (control panel) de XAMPP. Il est nécessaire d'y accéder afin de démarrer les services requis pour exécuter le CMS Drupal sur le serveur web Apache. Au minimum, cliquez sur les boutons "Start" des modules Apache et MySQL. De la même façon, vous pourrez éteindre ou redémarrer ces modules à l'aide de ces mêmes boutons.


Une fois activés, les noms des modules apparaîtront en vert et vous pourrez entrer dans votre fureteur http://localhost ou bien http://127.0.0.1 pour afficher un mot de bienvenue à XAMPP, de même qu'un menu d'éléments utiles.

J'attire votre attention sur Status et Security, le premier indiquant les composants activés, le second qui évalue la sécurité de votre installation. Sans surprise, votre environnement n'est pas encore sécurisé mais il est facile d'y remédier en accédant à la page http://localhost/security/xamppsecurity.php. Entrez un mot de passe pour le compte root de MySQL (recommandé) puis entrez un nom d'usager et un mot de passe qui vous seront dorénavant demandés la première fois que vous accéderez à localhost à partir du fureteur. Il s'agit d'une protection de base car quiconque qui connaît votre adresse IP pourrait naviguer dans votre site sur votre environnement de développement. Si c'est le cas et que l'option est configurée, une fenêtre comme celle-ci apparaîtra et le visiteur ne pourra pas aller plus loin (à moins qu'il connaisse, comme vous, les accès) :


Création de la base de données

Si vous êtes familier avec phpMyAdmin pour faire la gestion de MySQL, accédez-y par http://localhost/phpmyadmin afin de créer la base de données qui accueillera votre installation Drupal. Comme vous avez préalablement entré un mot de passe à l'utilisateur root lors de l'étape précédente, identifiez-vous avec root et le mot de passe que vous aviez saisi.

Personnellement, je n'aime pas trop phpMyAdmin. J'ai l'habitude de travailler dans les bases de données avec un logiciel client, par exemple Navicat qui me semble plus convivial.
  1. Ouvrez une connexion avec l'utilisateur root
  2. Créez une base de donneés en entant son nom, le charset utf-8 et le collation utf8_general_ci (le suffixe ci étant pour case insensitive, utilisé lors des comparaisons de texte)
  3. Créer un nouvel utilisateur avec comme host la valeur localhost et ajoutez-lui le privilège d'accéder à votre base de données (à cocher dans la liste des bases de données disponibles). Accordez-lui tous les privilèges, sauf grant. N'accordez pas de privilèges serveur. Ainsi, si une connexion est ouverte avec cet utilisateur, elle sera limitée qu'à cette base de données plutôt qu'à la totalité du serveur.
Installation d'un premier projet Drupal

Si on suit les étapes, la procédure d'installation proposée sur le site de Drupal est assez claire. Par contre, je recommanderais de prendre une pause pour faire la lecture des deux billets suivants tirés de Friendly Machine :
  • Five Tips for the Drupal Beginner
  • How to Learn Drupal (without losing your mind)
Essentiellement, il est conseillé de choisir et d'installer une distribution appropriée plutôt que le core de Drupal, qualifié de CMS incomplet. On peut faire le parallèle avec une distribution Linux, qui rassemble des modules pré-configurés pour répondre à un certain type de besoin. On m'a recommandé de jeter un oeil à Pressflow7 qui intègre des améliorations de performance, d'évolutivité, de disponibilité et de tests.

Téléchargez les fichiers de la distribution (souvent disponibles en tarball ou en zip), décompressez-les et copiez-les dans le répertoire de votre projet. Dans mon cas, l'installation par défaut est dans C:\xampp\htdocs où j'ai créé un répertoire nommé code18 et j'y ai copié les fichiers à l'intérieur.

Une fois la copie terminée, rendez-vous à localhost/code18 (nom du répertoire de votre projet). Le script d'installation est prêt à être exécuté.


Dans la documentation, il est indiqué que le fichier settings.php doit être créé manuellement à partir du gabarit default.settings.php. Dans mon cas, cette étape s'est faite automatiquement.

Choisissez l'installation standard et cliquez sur Save and continue. Comme vous avez déjà créé votre base de données, entrez les informations de connexion. Si la connexion est valide, vous pourrez suivre l'avancement de l'installation par une barre de progression à l'écran. Moins d'une minute plus tard, nous sommes prêts à configurer le site à l'aide du dernier formulaire où on peut y entrer le nom du site, les informations de l'administrateur, etc. Bravo, vous avez complété votre première installation Drupal!

Conclusion

Il est maintenant possible de vous connecter à votre site en tant qu'administrateur pour le configurer : modules, thèmes, etc. Les possibilités sont immenses.

Pour le moment, faites surtout attention de ne pas confondre les différents accès que vous avez créé au cours de cette procédure :
  • Utilisateur root de MySQL (plein pouvoir)
  • Authentification pour accéder au répertoire de votre projet
  • Utilisateur MySQL ayant accès à la base de donneés de votre projet
  • Administateur du site (pour gérer votre projet Drupal)
Dans le doute, notez-les quelque part.


Tags: Drupal

dimanche 10 février 2013

Drupal pour débutants

Publié par Infinite Loop, à 15 h 48 2 commentaires

Un de mes objectifs fixé pour 2013 était d'apprendre, entre autre, un nouveau Content Management System (CMS). Les dés sont jetés, ce sera Drupal. Cela représente un bon défi car on dit de lui que sa courbe d'apprentissage est plus grande que celles de ses rivaux mais que Drupal serait aussi plus flexible.


Source : Twitpic

Après quelques jours à m'être documenté ici et là, je me rends compte que ce ne sera pas une tâche facile. Je regarde devant moi le sommet à atteindre et mine de rien, je revois dans ma tête la scène où Gandalf s'écriait "fuyez, pauvre fou", juste avant de se laisser tomber dans le vide.

Par le passé, j'ai appris qu'il n'y avait aucun défi impossible à relever. L'atteinte d'objectifs est souvent une question de discipline et de ténacité. C'est vrai qu'il y a des tonnes de notions à assimiler et qu'il peut être difficile de savoir par où commencer. Je dois aussi laisser le temps à mon cerveau de se reconfigurer pour être capable de trouver des solution dans un contexte drupalien. C'est pourquoi un plan d'étude était nécessaire et que j'y consacrerai au minimum une heure par jour. J'utiliserai de temps en temps ce blogue pour réécrire les notions apprises comme pense-bête pour moi-même (tant mieux si vous y trouvez aussi votre compte).

Étapes à suivre pour bien commencer
  1. Un peu de lecture pour avoir un aperçu rapide de l'environnement
    • Résumé de Drupal sur la fiche Wikipedia
    • Jeter un oeil à l'un des livres suivants en guise d'introduction pour comprendre le fonctionnement du CMS avant de se lancer dans la programmation de modules. Le public visé est clairement les webmestres plutôt que les développeurs mais c'est toujours une bonne chose d'apprendre à conduire avant de fabriquer des voitures.
      • Using Drupal publié chez O'Reilly (la 2ème édition couvre Drupal 7)
      • Drupal for Dummies (destiné au grand public mais couvre un peu de tout)
      • Drupal 7 Visual QuickStart Guide
  2. Mise en place d'un environnement de développement
    • Serveur XAMPP (Apache, MySQL, PHP & Perl)
    • Client MySQL comme MySQL Workbench (gratuit), Navicat (payant) ou EMS SQL Manager for MySQL (payant mais il existe une version Freeware avec certaines limitations)
    • IDE de développement PHP comme Netbeans (gratuit)
  3. Installation de Drupal
  4. Exploration de modules essentiels
  5. Expérimentation : on apprend en se salissant les mains
  6. Internationalisation (parce qu'au Québec et au Canada, on fait généralement dans le bilingue)
  7. Tutoriels de programmation
Quelques ressources utiles

Pro Drupal 7 Development de T.Tomlinson & J.VanDyk (Apress). La critique générale semble déçue par la 3ème édition. Néanmoins, Dries Buytaert, le créateur de Drupal, écrit dans la préface qu'il ne connaît pas un développeur Drupal qui ne possède pas une copie de ce livre.


Un critique disait que pour remédier aux défauts du livre précédent, The Definitive Guide to Drupal 7 publié chez Apress était complémentaire. Les autres livres semblent se spécialiser sur un aspect précis de Drupal ou bien sur un module, car il en existe d'assez complexes qui méritent un livre à eux seuls.

On m'a vivement recommandé les tutoriels vidéos de BuildAModule.com. Il faut payer pour avoir accès à la librairie complète mais si vous êtes un professionnel sérieux dans votre démarche, vous devriez considérer vous y abonner. Jusqu'à maintenant, c'est d'une aide précieuse.

Autres liens d'intérêt
  • Documentation de Drupal
  • Des réponses à vos questions à propos de Drupal sur StackExchange


Tags: Drupal

samedi 9 février 2013

Calicem capulus

Publié par Infinite Loop, à 13 h 00 2 commentaires

Faits :

  1. Calicem capulus : expression en latin que vous n'entendrez jamais pour parler de tasse de café.
  2. Boire du café empêche de dormir. Dormir empêche de boire du café.
  3. Je ne bois pas de café.
  4. Il me faut un récipient pour boire autre chose.
À l'image du ministre des finances canadien qui a comme tradition d'acheter des souliers neufs le jour du dépôt du budget, l'augmentation de salaire que j'obtiens grâce à mon nouvel emploi me donne suffisamment de latitude pour me payer une tasse neuve sans nuire à mon budget. Et ça m'évitera de devoir laver l'ancienne.

Bye bye Dollarama, on se gâte et y on va pour le gros luxe. Mais pas trop non plus. J'ai magasiné chez les nombreux fournisseurs canadiens qui permettent l'impression d'images sur des objets personnalisés et j'ai retenu Kulapix qui offrait le meilleur prix grâce à une promotion sur les tasses à 5$ chacune (prix régulier: 14$). Le hic, c'est que le frais d'envoi est de presque 10$ pour une simple tasse. La bonne nouvelle, c'est que la livraison ne coûte pas plus chère si on en prend deux et elles peuvent être de modèles différents. Pour un total de 20,67$, j'en ai préparé deux dont en voici un aperçu.

Sur chacune, le logo d'un côté :


Et deux modèles à l'endos.

Version 1 : avec ma biographie Twitter : Tout a déjà été dit, mais pas par tout le monde.


Version 2 : avec un commentaire de programmation qui fera sourire : Bad programming is easy. Idiots can learn it in 21 days, even if they are Dummies.


Sur les lieux de travail, ce sera une sorte de coming out de la part d'un blogueur anonyme depuis plus de 4 ans. Surveillez votre entourage, ça se peut que je sois votre nouveau collègue. Dans le doute, venez me voir, je vous ferai la poignée de main secrète.


Tags: Le coin du geek

dimanche 3 février 2013

La méthode Google : que ferait Google à votre place ?

Publié par Infinite Loop, à 09 h 39 1 commentaire

Un ami et moi avons échangé des livres. Je lui ai prêté In the Plex en échange de What Would Google Do? de Jeff Jarvis. En septembre 2012, je commençais sa lecture, pour enfin la terminer ce matin seulement.

Comme WWGD? a été publié en 2009, les concepts présentés sont de plus en plus de notoriété publique, à savoir comment Google fonctionne en valorisant la création, l'ouverture, les connexions, l'unicité, la collaboration et l'invention.

Pour Jarvis, tout commença en 2005 lors d'un élan de colère où il partagea sa mauvaise expérience avec Dell sur son blogue. L'effet d'entraînement des autres consommateurs mécontents fût immédiat. Le légendaire Dell Hell était né, de même qu'une réputation peu reluisante qui lui a collé à la peau un certain temps. Depuis, grâce à l'ouverture de l'entreprise face aux critiques de ses clients, elle se transforma pour devenir un modèle à suivre.

Comment est-ce possible ? Parce que votre pire client est votre meilleur ami, dit-il. Il vous force à vous réinventer pour corriger les failles. L'auteur énonça alors la 1ère loi de Jarvis : Donnez le contrôle aux gens et nous allons l'utiliser. En effet, à force de transparence et de données ouvertes, le client devient un partenaire et on lui donne le pouvoir de s'approprier le produit. C'est tout le modèle d'affaires du marché de masse qui est en pleine mutation. Comme Google est en partie responsable de ce bouleversement, l'auteur propose d'imiter Google pour réussir comme eux. Joignez le mouvement open-source, l'économie du don à l'intérieur du marché de niches tel qu'on l'a vu dans The Long Tail. Small is the new big.

WWGD? est construit sur trois axes :
  1. Les règles de Google : la prémice sur le nouveau modèle d'affaires qui fait son succès
  2. Si Google régnait sur le monde : des exemples fictifs et réels appliqués à différents secteurs d'activités
  3. Génération G : une courte réflexion sur l'expérience que vivront les jeunes qui resteront connectés pour le reste de leur vie
On m'avait averti que la 2ème section était moins pertinente et après lecture, je suis en partie d'accord. Dans l'ensemble, les trucs qui ont le plus retenu mon attention ont été Google U: Opening education et Middlemen are doomed.

Dans Middlemen are doomed, on nous met en garde. Si votre boulot consiste à être un intermédiaire, réfléchissez à votre avenir : vendeurs de voitures, agences de publicité, bureaucrates gouvernementaux, chasseurs de têtes, agents de voyage, agents d'immeubles, etc. Sans revoir vos façons de faire, votre métier pourrait être voué à disparaître. À lire sans faute.

Dans Google U, j'y ai retrouvé une réflexion que j'ai déjà eu, en beaucoup plus étoffée.
Qui a besoin d'une université quand nous avons Google ? Ne serait-il pas mieux que les cours soient collaboratifs et publiques, où la créativité se nourrit comme Google la nourrit, que les erreurs bien reprises soient valorisées en opposition à la similitude et la sécurité, où l'éducation se poursuit longtemps après l'âge de 21 ans, où les tests et le degré importent moins qu'un portfolio de son propre de travail, où l'économie du don peut convertir n'importe qui avec des connaissances en enseignants, où les compétences de recherche, de raisonnement et le scepticisme sont mieux évalués que les compétences de mémorisation et de calcul, et où les universités enseignent une abondance de connaissances pour ceux qui le souhaitent, plutôt que de gérer une pénurie de places dans les classes.

Il y a quand même certains liens qu'on peut faire avec l'Université populaire de Caen (Michel Onfray).

Plus loin, il cite Will Richardson dans une lettre ouverte à ses enfants :
Au lieu du morceau de papier sur le mur qui dit que vous êtes un expert, vous aurez un éventail de produits et d'expériences, de réflexions et de conversations qui montrent votre savoir-faire, qui montre ce que vous savez en le rendant transparent.

Plus loin, Jarvis renchérit avec un passage où je me suis reconnu :
Faut-il obliger les jeunes à passer par 18, 16 ou même 12 ans de l'école, en essayant de les amener tous à penser de la même façon, avant de réaliser des choses? [...] Peut-être que nous avons besoin de séparer les jeunes de l'éducation. L'éducation dure éternellement. La jeunesse est le temps de l'exploration, de la maturation, de la socialisation. Qu'est-ce que ça donnerait si on disait aux étudiants que, comme les ingénieurs de Google, ils doivent prendre une journée par semaine ou un cours par session ou encore une année à l'université pour créer quelque chose : une entreprise, un livre, une chanson, un sculpture, une invention ? L'école pourrait servir d'incubateur, de conseiller, de dynamique, pour nourrir leurs idées et leurs efforts. Qu'est-ce qui en ressortirait ? De grandes choses et des choses médiocres. Mais ça obligerait les élèves à prendre davantage de responsabilités pour ce qu'ils font et de sortir du carcan de l'uniformité. Ça leur ferait poser des questions avant qu'on leur dise des réponses. [...] Et pourquoi structurer l'éducation pour tous autour du plus petit dénominateur commun de la minorité ?


J'aurais voulu aller à une école Montessori comme Brin et Page. Le mieux que j'ai pu accomplir, c'est de faire mes études secondaires à l'École Georges-Vanier de Laval qui présente des avantages similaires. La description du programme dit qu'il s'agit d'un programme éducatif d'avant-garde basé sur une vision centrée sur l’élève et sur le respect du rythme de son apprentissage. Le développement de l'autonomie permet à l'élève d’apprendre par lui-même grâce aux modules et de se responsabiliser en étant maître de son cheminement scolaire.

Entre ses murs, on y retrouve autant d'étudiants pour qui le rythme de l'école régulière est ennuyeux que d'autres qui auraient besoin d'un peu plus de temps pour assimiler la matière. À chacune des 6 périodes d'une journée, l'étudiant choisit spontanément quelle matière il veut travailler et se rend en salle de classe sous le principe premier arrivé, premier servi. Un enseignant est présent en tant que personne-ressource mais il n'enseigne pas la matière au tableau devant la classe. Comme chacun peut progresser à son rythme, il est possible de terminer plus ou moins rapidement un cours. Ce qui rend possible d'être en mathématiques de secondaire 4 en même temps que de faire son français de secondaire 5. Dans mon cas, j'ai terminé chacune de mes trois dernières années du secondaire au mois de mars pour ainsi profiter d'étés de 6 mois. J'ai développé des habitudes et un goût d'apprendre qui me suivent encore aujourd'hui. Comme autodidacte, je n'ai pas de papier ou de certificat qui prouve mon expertise. Mais j'ai plusieurs réalisations à mon actif.

Pour en revenir à nos moutons, il ajoute que Google répond à un désir profond : les gens veulent être comme Dieu, avoir son pouvoir entre les mains. Quand on y pense, même si on le prend pour acquis, c'est tout à fait phénoménal d'être en mesure de fouiller dans l'ensemble des connaissances du monde en une fraction de seconde. Google est l'oracle à qui on pose les questions et il a réponse à tout. La recherche de Google concède l'omniscience et Google Earth, par son perchoir céleste, offre une vision du monde comme Dieu le voit. J'aime l'image.

Enfin, l'auteur conclut en nous dirigeant vers une lecture complémentaire sur son blogue BuzzMachine : Five Steps to a Googlier You. Mon 20% est ce blogue.


Tags: Livres

samedi 2 février 2013

Les craintes de mon patron suite à ma démission

Publié par Infinite Loop, à 09 h 15 3 commentaires

Mon patron a appris mon départ et m'a convoqué le lendemain à son bureau pour une petite discussion. Il ne l'avait pas vu venir et donc, n'était pas préparé à me remplacer. Mes pairs disent de moi que je suis un pilier au sein de l'entreprise et trouver un équivalent ne sera pas sans difficulté. Tout le monde est remplaçable, seulement ça prendra un certain temps pour que mon successeur atteigne le même niveau d'aisance.
Malgré toutes mes appréhensions, la rencontre s'est déroulée poliment et avec respect de part et d'autre. J'ai quand même senti que comme il me perd au profit d'un compétiteur important, la pilule a du mal à passer. Ça fait parti de la game. De toute façon, tant que je travaillerai dans le domaine, je serai en position d'être le concurrent de quelqu'un et on ne peut m'empêcher de gagner ma vie. Comme au hockey, il vient un temps où on a le privilège d'être joueur autonome et de choisir pour quelle équipe on veut jouer. On appartient à une organisation que pour le temps d'un contrat. Une fois terminé, libre à nous de le renouveler ou d'aller voir ailleurs qui a le mieux à nous offrir.

Voici un petit résumé de ses craintes.

Dévoiler les secrets corporatifs

Pour lui, la peur que je révèle comment l'entreprise fonctionne à l'interne ou que je partage des informations privilégiées est un souci important. Je l'ai rassuré que je demeurerais professionnel et j'en ai profité pour lui balancer l'analogie selon laquelle on ne raconte pas à sa nouvelle copine ce qui se passait au lit avec son ex.

Presser le citron, jusqu'à la dernière goutte

Le timing de mon départ coïncide avec la livraison d'un projet important. Pour moi, c'était parfait car je quittais avec le sentiment du devoir accompli. Or, il y avait encore beaucoup d'autres tâches au calendrier de production qui m'étaient assignées pour les semaines à venir et comme toute la production est débordée, on m'a fait comprendre que j'aurais à prendre les bouchées doubles d'ici à mon départ. C'est une mauvaise stratégie de mettre le pied sur l'accélérateur pour livrer à la hâte ce qui a été promis au client au détriment du transfert de connaissances qui risque de se faire à la dernière minute. Même avec quelques jours devant moi, je ne pourrai pas résumer à mes collègues une décennie de savoir-faire.
Pour ne pas nuire à la production, il espérerait que j'aie de l'intérêt à réaliser des contrats en sous-traitance en dehors de mes heures de travail dans les semaines et les mois à venir. Or, pendant toute la durée de mon embauche, j'avais une clause d'exclusivité m'interdisant cette pratique. Et j'étais d'accord car non seulement c'était travailler contre mes intérêts et ceux de mon employeur, c'était aussi un couteau à double tranchant : le risque de devoir travailler tard en soirée sur un side-line pouvait nuire à ma productivité le lendemain dans mon emploi officiel. C'est pourquoi j'ai refusé afin de concentrer mes efforts pour réussir à faire ma place dans mon nouveau poste et de créer de la valeur le plus rapidement possible.

Défauts de mon nouvel employeur

Tel un bon père de famille qui veut donner de bons conseils, il a subtilement glissé dans la conversation des défauts de l'entreprise où je m'en vais dans le but de semer le doute dans ma décision. Comment peut-il les connaître, lui qui n'a jamais travaillé là ? Il ne vaut-il mieux pas se regarder le nombril ?

De plus, il m'a assuré que si je lui avais parlé de mes intentions de quitter, il aurait pu me référer à d'autres entreprises où il a des amis. Aucune de celles qu'il m'a énuméré ne m'intéressaient. Je ne voulais pas d'un autre emploi juste pour le plaisir de changer, je voulais aller vers ce que je considérais le mieux pour moi. C'est pourquoi j'ai envoyé un seul curriculum vitae dans mes démarches et que je les ai tenues secrètes jusqu'au bout.
Bien sûr, mon nouvel employeur a misé sur ses qualités lors des entrevues. Moi aussi. Nous aurons le plaisir de découvrir nos défauts mutuels dans les semaines à venir. Et je fais confiance à ce que j'ai entendu d'eux. J'ai un ami qui y travaille et j'ai découvert qu'une amie d'une amie y est aussi. Les échos sont très positifs.

Est-ce que ce sera mieux ? Chose certaine, ce sera différent et ça me fera du bien de changer d'air.

Tentative de me retenir

Perdre un employé a ses conséquences. Le rôle d'un patron est de faire du damage control et pour éviter cela, il a tenté de présenter une offre bonifiée afin de me faire changer d'avis. Ce n'est pas une question d'argent, c'est une question de défis, de sortir de ma routine et de ma zone de confort, de découvrir autre chose pour progresser, de bénéficier d'un tremplin plutôt que d'avoir l'impression de faire du sur place.

Pour résumer, mes objectifs sont :
  • être stimulé par des nouveaux défis
  • la possibilité d'apprendre des nouvelles technologies
  • la possibilité d'apprendre de d'autres spécialistes en étant mieux entouré que dans une petite équipe
  • manger les restants de lunchs...
Effet d'entraînement
Chaque fois qu'un employé quitte une entreprise, il y a une réflexion qui se fait chez les membres restants de l'équipe. De peur de passer à côté de quelque chose de mieux, que le gazon soit plus vert chez le voisin. Cette remise en question peut provoquer un effet d'entraînement où d'autres employés seraient portés à quitter pour tenter leur chance. Mais la plus grosse crainte du patron, c'est que je vienne débaucher de ses employés pour les attirer chez son compétiteur. Je lui ai promis que je n'agirais pas en ce sens mais je l'ai aussi mis en garde que je ne pouvais être tenu responsable si certains d'entre eux font leurs propres démarches. Ce sera à lui de les retenir.

Espérer l'échec en secret

Face à mon départ prochain, il a tenu à dire qu'il avait apprécié travailler avec moi et c'était réciproque. Il a même ouvert la porte à un retour au sein de l'entreprise dans un avenir plus ou moins proche. Entre temps, j'arriverai dans une nouvelle entreprise avec une expérience dans un contexte précis, je m'attends à devoir tout réapprendre et ce sera ma capacité d'adaptation qui signera le succès ou l'échec de ma démarche.

Il a même eu l'audace de m'expliquer les objectifs futurs de l'entreprise si je venais à revenir et le rôle que je pourrais y jouer. En son for intérieur, ça me semble clair qu'une partie de lui espère que je me plante pour que je revienne à genoux pour l'implorer de ravoir mon emploi. Dans les faits, il me souhaite tout le succès que je mérite.

Une annonce difficile

Annoncer qu'on met un terme à plus de 10 ans de relation de confiance n'est pas une chose facile. Je connais ces gens-là depuis plus longtemps que ma copine (bientôt 10 ans de couple) et j'ai aussi passé beaucoup plus de temps en leur compagnie. Comme pour un divorce ou une rupture, ce n'est pas facile mais c'est parfois nécessaire. Lorsque la nouvelle fût annoncée au reste de l'équipe, tout le monde était sans voix, aucune question ne fût posée.

Je disais dans mon dernier billet qu'il faut oser pour progresser. C'est possible que je fasse une grave erreur en repartant à zéro. D'un autre côté, ce sera peut-être la meilleure décision de ma vie. J'ai toujours suivi mon instinct et ça m'a bien servi. Le temps est venu pour moi de tourner la page et de me lancer dans de nouveaux défis. Je suis fier de ce que j'ai accompli et j'anticipe l'avenir avec beaucoup de positif.


Tags: Le coin du geek

Messages plus récents Messages plus anciens Accueil
S'abonner à : Messages (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (55)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ▼  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ▼  février 2013 (11)
        • Ajouter une liste pré-construite d'options dans un...
        • Anatomie de base d'un module Drupal 7
        • Deux modules Drupal pratiques pour l'interface d'a...
        • Initier un nouvel employé
        • Drupal 7 : mécanique interne de la maintenance
        • Citation no. 159 sur la politesse
        • Installation Drupal et XAMPP
        • Drupal pour débutants
        • Calicem capulus
        • La méthode Google : que ferait Google à votre place ?
        • Les craintes de mon patron suite à ma démission
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ►  2009 (429)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (36)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft