Le petit coin de Nicolas

Aller au contenu | Aller au menu | Aller à la recherche

Recherche développeur PHP - Symfony pour un annuaire d'entreprise à JCDecaux

Ci-après le descriptif de la mission :

Mission :

Conception et développement du nouvel annuaire d’entreprise Globe.

Les travaux relatifs à la mission seront :

  • Participation à la spécification détaillée du système constitué d’une base de données, d’une IHM de consultation et d’un ensemble de traitements batch
  • Conception et réalisation en PHP / Symfony (incluant les tests unitaires)
  • Elaboration des tests de qualification du système

Environnement technique :

  • PHP 5.2.x
  • Framework Symfony
  • MySQL 5.0/5.1
  • Microsoft Active Directory
  • Redhat 5.x

Compétences techniques requises :

  • Rédaction de spécifications détaillées
  • Framework Symfony et PHP
  • Modèle relationnel, requêtes SQL

Compétences techniques appréciées :

  • SQL Oracle (l'existant est stocké dans une base Oracle)
  • Javascript et jQuery
  • VBS (Visual Basic Script) (pour la réalisation de scripts - compétence non bloquante car pourra au pire être réalisée en interne)
  • Active Directory

Qualités humaines recherchées :

  • Esprit d’analyse
  • Rigueur
  • Dynamisme
  • Sens de la communication

Localisation du poste :

  • Plaisir ZI Sainte-Apolline (78)
  • Pas de télé-travail possible pour cette mission

Date de démarrage souhaitée :

  • Au plus tôt

Durée de la mission :

  • 50 jours sur 3 mois

Contact :

  • nicolas POINT steinmetz AT jcdecaux POINT fr

Extension Postgres pour PHP sous Slackware

Par défaut, la version de PHP fournie par Slackware ne comprend pas les extensions pgsql et pdo_pgsql, chose que nous allons corriger dans un instant :

Pour commencer, récupérer le slackbuild de PHP pour votre version de Slackware :

rsync -avz --del rsync://slackware.mirrors.tds.net/slackware/slackware64-13.0/patches/source/php ./
rsync -avz --del rsync://slackware.mirrors.tds.net/slackware/slackware64-13.0/source/n/alpine ./

Pour PHP, on s'appuie sur les patchs car la version par défaut dans Slackware 13.0 est PHP 5.2.10 et que par la suite il y a eu une mise à jour en PHP 5.2.12. Pour alpine, il s'agit d'une dépendance afin de pouvoir compiler l'extension imap de PHP. Il n'y a pas eu de mise à jour d'alpine depuis la sortie de Slackware 13.0 donc on le prend dans les sources originelles.

Editez ensuite php/php.Slackbuild pour y ajouter les informations relatives à Postgres dans le cadre du configure, à savoir :

--with-pgsql=shared,/usr \
--with-pdo-pgsql=shared,/usr \

Ce qui me donne au final (et avec au passage modification du BUILD pour le distinguer du paquet officiel)

BUILD=${BUILD:-1_slack13.0_with_pgsql}
 
[...]
 
  --with-mysql=shared,/usr \
  --with-mysqli=shared,/usr/bin/mysql_config \
  --enable-pdo=shared \
  --with-pdo-mysql=shared,/usr \
  --with-pdo-sqlite=shared \
  --with-pgsql=shared,/usr \
  --with-pdo-pgsql=shared,/usr \
  --with-pspell=shared,/usr \
  --with-mm=/usr \
 
[...]

Ensuite il faut éditer le fichier doinst.sh pour que les extensions relatives à Postgres soient chargées ; il y a surement plus propre comme méthode mais ça marche :

echo "extension=pgsql.so" >> /etc/httpd/php.ini
echo "extension=pdo_pgsql.so" >> /etc/httpd/php.ini

Ne pas oublier de re-gzipper à nouveau doinst.sh pour qu'il soit pris en compte par le slackbuild :

gzip doinst.sh

Une fois cela effectué, pour générer la création de votre package PHP, il vous suffit de faire :

./php.SlackBuild

Une fois généré, pour l'installer :

removepkg php
installpkg /tmp/php-5.2.12-x86_64-1_slack13.0_with_pgsql.txz

Pour ceux qui veulent récupérer le slackbuild ou bien le package 64 bits :

Pour ceux qui ne sont pas en 64 bits, il suffit de recompiler en précisant dans php.Slackbuild :

ARCH=${ARCH:-i486}

Et voilà...

Eviter le kernel panic en mettant à jour vers slackware current

Par curiosité, j"ai voulu voir ce que pouvait donner slackware-current (le branche "bleeding-edge" de slackware) et dans un premier temps bien mal m'en a pris vu que cela s'est terminé par un joli "Kernel Panic". Après discussion avec un collègue et un peu de recherche sur internet, il s'avère qu'à partir du noyau linux 2.6.32, Slackware a désactivé la vieille couche IDE qui faisait que les périphériques étaient vus en /dev/hd*.

Voici la manipulation à suivre pour passer d'une slackware 13.0 à slackware current :

Tout d'abord, utiliser un mirroir slackware-current en éditant /etc/slackpkg/mirrors en lieu et place du mirroir de la version stable. Mettre à jour ensuite votre distribution :

slackpkg update gpg
slackpkg update
slackpkg install-new
slackpkg upgrade-all

A ce stade, votre système est à jour et vous avez un joli noyau 2.6.33 en passe de devenir votre noyau par défaut.

Avant de redémarrer votre machine, il faut faire les manipulations suivantes :

  • Edition de /etc/lilo.conf pour remplacer les occurrences de /dev/hd* par /dev/sd*
  • Edition de /etc/fstab pour remplacer les occurences de /dev/hd* par /dev/sd*
  • Suppression de /etc/udev/rules.d/70-persistent-cd.rules ; Le fichier sera régénéré correctement au redémarrage de la machine
  • Si vous utilisez initrd au démarrage, il faut éditer /boot/initrd-tree/rootdev et regénérer votre image initrd via mkinitrd. Dans mon cas avec une installation de base de slackware, je n'en ai pas eu besoin. Par contre, j'en aurai besoin pour mon linutop.

A ce stade, si vous faites un lilo -v pour prendre en compte vos modifications, il va hurler puisqu'il ne trouve pas de périphérique /dev/sd*.

Pour cela il suffit de tricher un peu (ma partition /boot est sur /dev/hda2) :

ln -s /dev/hda /dev/sda
ln -s /dev/hda1 /dev/sda1
ln -s /dev/sda2 /dev/sda2
lilo -v
reboot

Au redémarrage, udev remplacera vos liens symboliques /dev/sd* par les bonnes entrées qui vont bien.

Vais pouvoir aller tester KDE 4.3.5 en attendant que KDE 4.4.x arrive dans slackware-current du coup... :-)

Source : Robby’s libata switchover howto

Pour ceux qui utiliseraient encore une url en unelectronlibre.info

Le domaine expire demain et ne sera pas renouvelé puisque cela fait plus d'un an que tout a migré sur http://nicolas.steinmetz.fr avec les redirections permanentes qui vont bien ;-)

Pour les 219 abonnés (tout ça ? merci à vous :-) ) qui utilisent l'url FeedBurner (http://feeds.feedburner.com/UnElect...), pas de souci, je continue à la maintenir. Rien à changer de ce côté là...

Certains lecteurs voudraient-ils recevoir le flux RSS par email ? C'est maintenant possible...

Un modem peut en cacher un autre

Ci-après ma contribution à Polar Geek, initiative pour le moins ingénieuse de Bruno Bord.

Mon téléphone s'agita, le message fut bref :
- "Rendez-vous au Bar de la Taupe à 15 heures"
J'eus à peine le temps d'assimiler le message que l'appel était fini. Sortant de ma torpeur, je notais rapidement le message sur un bout de papier tant qu'il résonnait encore en ma mémoire. Je ne connaissais qu'une personne en mesure de me passer ce type d'appel et cela faisait bien des années que je n'avais pas entendu cette voix. Me réveillant doucement en sirotant mon café, je songeais à ce message et surtout à son émetteur. Les souvenirs remontaient au fur et à mesure et ma mémoire commençait à rassembler des bribes de visage dans mon esprit. Rigolo, il se rappelait que j'évitais de travailler en début d'après-midi pour cause de digestion et de sa sieste associée. Il ne prenait aucun risque quant à ma disponibilité de me fixer un rendez-vous à 15h dans ce lieu... Il était donc toujours de la partie ? J'aurais pensé qu'il aurait fini par renoncer... L'après-midi s'annonçait intéressant et pour le moins intrigant...

La matinée passa machinalement avec son lot de paperasses et ses coups de téléphone. Les quelques affaires en cours n'avaient pas grand intérêt mais me permettaient de payer mon toit, mon manger et les croquettes du chat. Pour ne pas rater mon rendez-vous, je mangeai léger et me rendis en marchant jusqu'au Bar de la Taupe. A défaut de dormir, ce sera une marche digestive...

Le Bar de la Taupe a pour intérêt d'y accueillir une grande diversité de personnes. Des jeunes lycéens crapoteurs aux cadres tirés à quatre épingles, il se transformait en "salon de thé" tous les jeudi après-midi pour y accueillir un groupe de mamies terribles, plus portées sur le panaché que le thé et plus sur leurs parties de poker que leur tricot. Je m'assis donc en terrasse, afin de profiter des quelques rayons de soleil et commandai mon café. A peine eus-je le temps de poser ma veste qu'il arriva. Il n'avait pas changé malgré toutes ces années. Toujours habillé de son vieux costume pastel et de son noeud-papillon, il était maigre comme un clou. De prime abord, il ne ressemblait à rien, beaucoup de personnes s'y étaient laissés prendre et avaient fini par perdre leur dossier contre lui. Denis Zot, alias Papy, s'assit et commanda un café avec son nuage de lait.
" Toujours avocat ?", lançai-je
" Bien évidemment, le petit peuple a besoin qu'on le représente !"
Ainsi, il n'avait vraiment pas changé. Idéaliste jusqu'au bout des ongles, il était le chevalier servant de la justice dans un monde qui grouillait de requins à la solde de gros intérêts privés. Personne n'avait donc eu raison de lui jusqu'à présent ; ça laissait présager de bonnes choses.
"J'ai un dossier pour toi", me dit-il, "c'est urgent et tu es le seul qui peut m'aider"
Perplexe, je le laissais continuer :
"Tes derniers dossiers ne t'ayant pas tenu au fait de l'actualité informatico-légale, il se trouve que depuis plusieurs mois, j'ai mis à mal bon nombre de majors et des membres de nos gouvernements dans leurs tentatives de poursuite d'internautes pour des histoires de copyrights. Au début, cela était assez simple, il suffisait de trouver le vide de procédure pour faire tomber le château de cartes. Même si la presse a peu relayer l'information, j'ai quand même réussi à évincer A. Dopi de toute velléité électorale..."
Ah oui songeais-je. Je m'en souviens maintenant, c'était l'une des dernières informations qu'avait remonté un vieux script en analysant des flux RSS que je pensais périmés. Depuis l'avénement des "Etats Majors" en lieu et place des "Etats Nations" au début du 21ème siècle, la presse était sous contrôle et il était de plus en plus complexe d'échapper à la propagande d'Etat. Le modèle Chinois s'était imposé de part le monde, toute l'information était contrôlée par l'une des cinq Majors et les bribes de gouvernement qui restait ne faisait que leur obéir aveuglément. Arrestations sommaires et mise sur écoute se faisaient à tour de bras. Papy, en face de moi, faisait donc la résistance et jouait le rôle de Chevalier Blanc du petit peuple. Il devait être considéré comme l'ennemi public n°1 ou presque. Il ne devait pas non plus lui rester beaucoup de soutien. Dans quoi allait-il m'embarquer ???
"... mais bon revenons-en à notre affaire" me dit-il. "Mon client, qui comme moi, milite pour le retour aux libertés fondamentales, après moult menaces (comprendre des courriers envoyés par le ministère de la culture pour des activités soit-disant illégales) vient d'être arrêté. S'il ne signe pas un faux aveu, il sera expédié dans son pays natal avec sa femme et ses deux enfants. S'ils repartent en Birmanie, ce sont les pompes funèbres qui vont les accueillir à l'aéroport..."
"Qu'attends-tu de moi ?"
"Trouve la preuve du complot ; seul toi peut la trouver et je n'ai confiance qu'en toi."
"Et j'y gagne quoi ? Hormis de passer sur une liste noire ?"
"Financièrement, donne-moi ton prix et tu l'auras. La question n'est pas là. Comme tu le sais peut-être, la contestation gronde et nous avons besoin d'un coup d'éclat pour faire prendre conscience au reste du peuple que la solution est là. On peut mettre fin au joug des Majors. Ce que je t'offre, c'est la liberté !" Le bougre, il savait que j'étais sensible à ces mots et que je ne supporterais pas que l'on puisse faire du mal à des enfants. Et puis financièrement, je n'avais pas trop le choix, je commençais à prendre les raviolis en grippe...
"Ok, j'accepte ; qu'as tu pour moi ?"
"La clé de sa maison, la milice du Ministère de la Culture ne s'y est pas encore rendue. Ils iront demain d'après un de mes informateurs. C'est ton unique chance de trouver les preuves de son innocence avant qu'ils ne déposent les fausses. C'est tout ce que j'ai pour toi..."
"Bien, j'y vais de ce pas..."
"Fais attention à toi et surveille bien tes échanges" me dit-il. Alors qu'il se levait pour partir il me dit "Tu en auras besoin aussi : Pomme Noisette" et il disparut.

Je finis d'un trait mon café, payai l'addition. Je repartis au bureau mais plutôt que de monter à l'étage, je pris le chemin de la cave. Il me fallait du matériel spécifique et qu'on ne remonte pas jusqu'à moi si je me faisais prendre. Je ne faisais aucunement confiance au matériel dernier cri qui était sur mon bureau. Pour mes affaires courantes, cela allait bien mais pas pour des situations comme celles-ci. Je ressortis mon petit netbook sous Slackware en disant "Hello Citrouille, j'ai du boulot pour toi". Au moins avec Slackware, on sait que l'on installe les sources officielles. Pas de risque de rootkit ou autre tripatouillage exotique. Le temps de vérifier le bon état des batteries et de son bon fonctionnement et je prenais la direction de la maison du client de Papy.

La maison était située en banlieue Ouest de Paris. Elle était au milieu d'une résidence calme et agréable. Un bon coin pour une vie de famille songeais-je. Un jour peut-être... Après avoir fait un petit tour de la maison pour vérifier de la véracité des propos de l'informateur de Papy, je m'y introduisis sans problème. Pas de voisine curieuse pour casser mon approche, vraiment chouette ce quartier. L'intérieur était propre et bien rangé. Quelques jouets dispersés témoignaient de la présence d'enfants.
Je m'attelais au travail et cherchais les ordinateurs. Une fois le premier trouvé, je remarquai que le réseau était filaire. Chose étrange de nos jours mais trahissant le coté paranoïaque du client. En effet, le Wifi s'était imposé comme mode d'accès par défaut mais sa médiocre sécurité permettaient une écoute des plus aisées par nos milices étatiques ou la multitudes de sociétés privées dont les résultats étaient basées sur la délation d'internautes. Au moins avec un réseau filaire, il est aisé de trouver les différents ordinateurs. Je dénombrais 2 portables et deux tours, ainsi qu'une sorte de client léger collé sous le bureau, au même niveau que les prises électriques. Avant d'entrer plus loin dans mon investigations, je branchais Citrouille pour vérifier quelques informations supplémentaires : pas de réseau wifi à proximité, donc j'ai bien tous mes PCs.
Je commençais mon analyse par les deux tours situés dans les chambres des enfants. Je les débranchais du réseau et y introduisis ma clé USB magique contenant un OS minimaliste et surtout des outils d'analyse rapide. Ces derniers ne m'apprirent pas grand chose des deux tours. Les logiciels étaient tous en règles et à jour et les données étaient celles d'un ordinateurs d'enfant : des photos, des jeux vidéos, quelques listes aux Père Noel et quelques menues bricoles. La seule chose repérée fut la présence d'un proxy. Tiens, le père de famille semble vouloir protéger ses enfants. Cela doit correspondre au client léger repéré sous le bureau. Passons à autre chose...

Je décidais alors de brancher Citrouille sur le réseau en utilisant le câble réseau d'une des tours pour voir s'il y avait des activités suspectes. J'activais le mode furtif et en lecture seule pour éviter toute intrusion désobligeante. Le temps que Citrouille s'initialise, je poursuivais l'analyse des deux portables. Pour l'un des deux, ce fut facile, il était complètement HS et vue la dose de poussière sur la machine, cela ne datait pas d'hier. Pour le second, il était en veille et tout de suite un mot de passe me fut demandé. J'avais deux solutions pour cet ordinateur : soit le redémarrer sur ma clé usb magique et analyser son contenu au risque de perdre les données actuellement en cours ; soit le sortir de sa veille et l'analyser en direct live, sans trop savoir ce qu'il contenait tant d'un point de vue données que de celui du mouchard. Il me fallait bien sur trouver le mot de passe... Un mouvement de lumière attira mon attention. Je retins mon souffle avant de constater que c'était seulement lié au soleil qui se couchait et dont la lumière se reflétait dans la porte du four. Et là, le déclic : Pomme Noisette pardi ! Le mot de passe en ma possession, cela ne m'aidait pas pour autant sur l'attitude à suivre vis à vis de ce portable.

Mon attention se déporta alors sur le client léger placé sous le bureau. Je connaissais ce genre de modèle, une configuration minimaliste qui ne prend pas de place et qui permet de rendre des services. Une invite me demanda un mot de passe et Pomme Noisette fut le sésame. Mes soupçons étaient justes, la machine faisait bien office de proxy particulièrement agressif. Des tunnels VPN étaient en outre établis et obéissaient à des règles de routage bien particulières. Tout était fait pour protéger les internautes de la maison et anonymiser au maximum certaines pratiques. Le client de Papy est pour le moins paranoïaque et la réalité ne pouvait que lui donner raison. Toutefois, il s'était fait prendre. Il me restait à trouver comment...

Tout d'un coup, Citrouille se mit à biper dans tous les sens. Elle m'indiqua que le réseau contenait une activité anormale de programmes cherchant à récupérer des informations de tout ce qui circulait sur le réseau et/ou à s'introduire sur les machines présentes sur le réseau. A priori, elle ne s'était pas fait prendre mais il allait falloir la jouer finement pour en apprendre un maximum sans se faire prendre ou montrer que quelqu'un cherche à innocenter le client de Papy...
Il me fallait maintenant accéder au contenu du portable à tout prix sans éveiller les soupçons. Du client légér, je récupérais toutes les informations réseau sur le profil du portable (Adresse MAC, etc). Ceci s'ajoutant aux informations produit écrites sur le portable, j'étais en mesure de créer un profil factice sur Citrouille pour se faire passer pour le portable afin de pouvoir l'analyser tranquillement. Alors que je notais les informations sur un bout de papier, je notais la présence d'un bon de livraison émis par le FAI pour le remplacement du modem/routeur. En y regardant de plus près, cela datait de la semaine précédente... tiens donc. Le courrier stipulait que l'équipe du FAI en charge de la surveillance du matériel avait noté des incidents sur le modem. Par conséquent, un modem de rechange était envoyé de façon préventive et moyennant l'envoi du modem originel pour réparation. Mon radar vit rouge tout de suite, se pourrait-il que le modem soit le responsable de l'histoire ?

Rejoignant Citrouille, je peaufinais mon plan d'attaque. Citrouille allait se faire passer pour le portable et me permettrait d'analyser le modem à son insu en lui donnant des données bidon à manger en masse. Ces données était constituées d'un savant mix de consultations de sites honnêtes, téléchargement de binaires et d'images de femmes plus ou moins dénudées, histoire de faire tilter tout algo de surveillance comme il se doit. Citrouille était prête, il ne me restait plus qu'à taper sur "Entrée". Une pression de touche plus tard et simulant une micro-coupure réseau, Citrouille avait pris la place du portable. J'ouvris alors la session et lança le gestionnaire des tâches ; aucune activité suspecte pour le moment. Il cherchait à se reconnecter sur le réseau mais je ne craignais rien, Citrouille l'empêcherait de revenir en ligne. Je fis une passe rapide sur l'ordinateur. Rapidement je découvris un dossier "Téléchargement" contenant quelques oeuvres piratées à des dates variées. Cela était vraiment trop gros comme pièce à conviction mais à l'heure des Etats Majors, cela suffisait amplement pour vous mettre à l'ombre et vider votre compte en banque. Surtout, cela ne collait pas avec ce que j'avais pu voir précédemment sur le client de Papy. Un Dialer dont le nom contenait celui du FAI chercha alors à s'exécuter ; louche me dis-je et tuait alors le processus. Pour éviter tout autre problème, j'arrêtai l'ordinateur pour une analyse ultérieure. Mon regard revint sur le modem, qui de ses diodes me narguait, je le savais...

Citrouille me donna la solution. De nombreuses connexions avaient cherché à se connecter sur le portable pour récupérer moult informations et surtout y placer les mêmes fichiers que ceux que j'avais vu dans le dossier "Téléchargement". Je le tenais mon coupable et il devenait aisé de reconstituer l'histoire. En recevant son nouveau modem, le client de Papy bien qu'habituellement derrière son proxy, dut pour une fois se connecter en direct au modem. A ceci s'ajoutant le CD d'installation dont venait surement le Dialer (et surement d'autres exécutables peu catholiques), le portable avait été compromis à ce moment là. Les autorités n'avaient alors plus qu'à attendre que le modem fasse son travail et de saisir l'individu quand bon leur semblait. L'énigme était résolue, je remis les choses en ordre et quittais discrètement la maison du client de Papy.

La fin de l'affaire fut explosive. Après avoir fait part de mes découvertes à Papy, celui-ci contacta différents collectifs et associations en faveur de la liberté pour créer un effet presse hors du commun. Lorsque la communication fut lancée, les autorités ne purent la retenir et elle déferla sur l'espace public. Le quidam moyen s'empara du sujet et des manifestations spontanées eurent lieu aux quatre coins du pays. L'opposition bien qu'affaiblie tira son épingle du jeu en faisant part de son expérience à ce mouvement citoyen qui grossissait de façon exponentielle. Le gouvernement chercha à faire sauter quelques fusibles en la présence de Monsieur Lop Psi et d'A. Cta mais cela ne suffit pas. Après un mois de manifestation, il fut contraint à la démission et de désapprouver les Majors. Un nouveau gouvernement fut élu et il s'empressa de rétablir bon nombre de libertés fondamentales bafouées depuis tant d'années, ainsi que la neutralité du net. Quelques FAI jugés trop proches des Majors firent faillite et il fut décider de confier les accès à internet à des associations citoyennes.

Personnellement, je savourais cette victoire même si je regrettais de ne pas avoir demandé une rémunération supérieure pour ce que j'avais fait. Je me consolais néanmoins en me disant que de toutes façons, la liberté n'a pas de prix...

Note de l'auteur : au départ, j'étais parti sur tout à fait autre chose. Le revirement s'est fait suite à la lecture du billet "La Quadrature jette l'éponge". Il semblerait que nous prenions une route où mon histoire pourrait devenir possible (tout au moins le début, pour la fin j'en doute). Après DADVSI et HADOPI, il y maintenant LOPPSI et ACTA... Pour soutenir la Quadrature du Net, il vous est possible de faire un don si vous n'avez pas la possibilité de les aider autrement...

Créer votre première application CouchDB (Partie 4)

Pour ceux qui utiliserait le code mis dans les exemples, sachez qu'à partir de la version 0.10, le contenu du fichier lists/all.js qui s'écrivait :

function(head, row, req, info) {
  // !json templates.all
  // !code vendor/couchapp/path.js
  // !code vendor/couchapp/template.js
 
  return respondWith(req, {
    html : function() {
      if (head) {
        return template(templates.all.head, {
          assets : assetPath(),
        });
      } else if (row) {
        return template(templates.all.row, {
          fav: row.value,
        });
      } else {
        return template(templates.all.tail, {
            assets : assetPath(),
        });
      }
    },
  })
};

s'écrit désormais :

function(head, req) {
  // !json templates.all
  // !code vendor/couchapp/path.js
  // !code vendor/couchapp/date.js
  // !code vendor/couchapp/template.js
  // !json myfav
 
  provides("html", function() {
      
      send(template(templates.all.head, {
          assets : assetPath(),
          title : myfav.title,
       }));
      
      var row, key;
      while (row = getRow()) {
        key = row.key;
        var fav = row.value;
        send(template(templates.all.row, {
            url: fav.url,
            title: fav.title,
            description: fav.description,                      
        }));
      }
      
      return template(templates.all.tail, {
            assets : assetPath(),
      });
  });
};

et bien sur templates/all/row.html devient :

<dt><a href="<%= url %>"><%= title %></a></dt>
<dd><%= description %></dd>

Au passage, il m'a fallu récupérer la nouvelle version de vendor/couchapp/path.js.

Pour ceux que ça intéresse, le code est disponible ici : http://bitbucket.org/nsteinmetz/mycouchfav/.

Pour ceux qui veulent voir le rendu :

Voilà, c'était histoire de me remotiver dans cette prise en main de CouchDB/CouchApp - peut-être que la prochaine fois, on verra un formulaire de soumission de favoris... ;-)

CouchDB 0.10.1 on Slackware 13.0

Dépendances de CouchDB

Dans un premier temps, il vous faut récupérer les slackbuilds suivants :

Les autres dépendances sont normalement satisfaites :

  • curl : à vérifier en utilisant un curl-config --version
  • make & gcc

Créer les packages des slackbuids (les slackbuils sont prévus pour i486 ; si vous êtes en 64 bits, éditer le fichier <package>.Slackbuild pour modifier la valeur de ARCH.

Pour que le SlackBuild fonctionne, il vous faut mettre l'archive des sources du package à créer dans le répertoire créé en décompressant le fichier slackbuild.

tar xzf js.tar.gz
cd js
./js.SlackBuild
=> Slackware package /tmp/js-1.8.0_rc1-x86_64-1_SBo.tgz created.
 
tar xzf icu4c.tar.gz
cd ../icu4c
./icu4c.SlackBuild
=> Slackware package /tmp/icu4c-4.2.1-x86_64-1_SBo.tgz created
 
tar xzf erlang-otp.tar.gz
cd erlang-otp
./erlang-otp.SlackBuild
=> Slackware package /tmp/erlang-otp-13B03-x86_64-1_SBo.tgz created.

Installer ensuite les packages créés :

nicolas@cassis:/tmp$ sudo installpkg icu4c-4.2.1-x86_64-1_SBo.tgz 
Verifying package icu4c-4.2.1-x86_64-1_SBo.tgz.                   
Installing package icu4c-4.2.1-x86_64-1_SBo.tgz:                  
PACKAGE DESCRIPTION:                                              
# icu4c (International Components for Unicode)                    
#                                                                 
# The International Components for Unicode (ICU) libraries provide
# robust and full-featured Unicode services on a wide variety of  
# platforms.                                                      
#                                                                 
# Homepage: http://www.icu-project.org/                           
#                                                                 
Executing install script for icu4c-4.2.1-x86_64-1_SBo.tgz.        
Package icu4c-4.2.1-x86_64-1_SBo.tgz installed.                   
 
nicolas@cassis:/tmp$ sudo installpkg js-1.8.0_rc1-x86_64-1_SBo.tgz
Verifying package js-1.8.0_rc1-x86_64-1_SBo.tgz.
Installing package js-1.8.0_rc1-x86_64-1_SBo.tgz:
PACKAGE DESCRIPTION:
# SpiderMonkey (Mozilla's JavaScript Engine)
#
# SpiderMonkey is the code-name for the Mozilla's C implementation of
# JavaScript. It can be used by applications such as elinks and others.
#
# This is the standalone version of the engine used by Firefox and other
# Mozilla applications.
#
# Homepage: http://www.mozilla.org/js/spidermonkey
#
Package js-1.8.0_rc1-x86_64-1_SBo.tgz installed.
 
nicolas@cassis:/tmp$ sudo installpkg erlang-otp-13B03-x86_64-1_SBo.tgz
Verifying package erlang-otp-13B03-x86_64-1_SBo.tgz.
Installing package erlang-otp-13B03-x86_64-1_SBo.tgz:
PACKAGE DESCRIPTION:
# Erlang (programming language)
#
# Erlang is a general-purpose concurrent programming language and
# runtime system.
# The sequential subset of Erlang is a functional language,
# with strict evaluation, single assignment, and dynamic typing.
# It was designed by Ericsson to support distributed,
# fault-tolerant, soft-real-time, non-stop applications.
#
# http://www.erlang.org/
#
Executing install script for erlang-otp-13B03-x86_64-1_SBo.tgz.
Package erlang-otp-13B03-x86_64-1_SBo.tgz installed.

Installation de CouchDB

Il vous faut au préalable créer un utilisateur et un groupe couchdb :

groupadd -g 231 couchdb
useradd -u 231 -g couchdb -d /var/lib/couchdb -s /bin/sh couchdb

Récupérer le slackbuild de CouchDB

il vous faut alors procéder de la façon suivante :

tar xzf couchdb.tar.gz
cd couchdb
# récupérer les sources de couchdb 0.10.1 et metter les dans votre répertoire couchdb
# éditer si besoin le SlackBuild
# créer votre package :
./couchdb.Slackbuild
=> Slackware package /tmp/SBo/couchdb-0.10.1-x86_64-1_SBo.tgz created.

Il ne reste plus qu'à installer le paquet :

installpkg /tmp/SBo/couchdb-0.10.1-x86_64-1_SBo.tgz

Démarrage / Arrêt automatique de CouchDB

Editer /etc/rc.d/rc.local pour y ajouter :

if [ -x /etc/rc.d/rc.couchdb ]; then
	. /etc/rc.d/rc.couchdb start
fi

et dans /etc/rc.d/rc.local_shutdown :

if [ -x /etc/rc.d/rc.couchdb ]; then
	. /etc/rc.d/rc.couchdb stop
fi

Ouvrez http://localhost:5984/_utils/

Et voilà... il est maintenant temps de vous relaxer ;-)

Edit 1 : Mise à jour suite à l'approbation & correction de mon slackbuild sur Slackbuilds.org

Perl vs Shell vs Python

Ayant suivi il y a 2 semaines une formation Perl de 3 jours vu qu'il s'agit d'un standard de fait chez JCDecaux pour tout ce qui touche au scripting, mon petit ressenti sur le sujet.

Tout d'abord, il faut dire que j'allais à cette formation avec un a priori plutôt négatif sur Perl de part ce que j'avais pu en entendre ici ou là. Il faut dire que j'ai plutôt été agréablement surpris par certains cotés.

Match perl vs bash :

  • Perl peut être vue comme une bonne alternative / un bon complément à des scripts bash. Plutôt que de vous casser la tête à apprendre à utiliser grep/sed/awk, vous pouvez faire la même chose mais uniquement en perl. Parce que bon, franchement awk, c'est peut être super puissant mais je trouve ça inabordable et loin d'être évident.
  • Je compte ainsi revoir certains scripts bash qui ne me satisfont pas pour voir si Perl ne me permettrait pas d'atteindre l'objectif souhaité.

Match perl vs python : avantage Python

  • Pour le coup, le langage avec des des $, %, et même @ devant les types de données, des accolades pour les débuts/fin de bloc qu'on ne sait jamais à quel niveau positionner pour rester lisible de bout en bout et des ; en fin de ligne, j'ai du mal. Surtout maintenant que je me suis habitué à la syntaxe python que je trouve infiniment plus lisible et moins source d'erreur.
  • Dans la même veine, les syntaxes sont pas des plus évidentes : ainsi dire que $tab est un scalaire, @tab un tableau, %tab un tableau associatif et que si on met un "antislash" devant on parle alors d'une référence vers le scalaire/tableau/tableau associatif, ça aide pas l'écriture d'un script

Par ex en perl :

if ( $toto == 2)
{
    print "Toto vaut : $toto\n";
}

et en python :

if toto == 2:
    print "Toto vaut %s" % toto
  • Perl fonctionne de façon beaucoup trop implicite/facultative contrairement à python. Python impose un certain nombre de conventions et c'est bien. Le "There is more than one way to do it" de Perl peut être séduisant mais aussi contre productif, surtout en entreprise.

Exemple pour parcourir un tableau en perl :

#! /usr/bin/perl -w
 
# Tableau simple
@tab = ("fraise", "abricot", "goyave", "pamplemousse");
foreach (@tab)
{
    print "Valeur : $_ \n";
}
 
# Tableau associatif
%hash = ("France" => "Paris", "Allemagne" => "Berlin", "Angleterre" => "Londres");
foreach (keys %hash)
{
    print "Pays : $_ , Capitale: $hash{$_}\n";
}

Le $_ est appelé scalaire par défaut. Il est conseillé de vivement l'utilisé plutôt que d'initialiser une variable. De prime abord, ça surprend. Il existe aussi un @_ dans les fonctions et qui correspond à un tableau d'arguments passés à la fonction.

Dans ce cas les parenthèses sont implicites. On peut bien sur écrire :

foreach(keys(%hash))

alors qu'en python :

tab = ["fraise", "abricot", "goyave", "pamplemousse"]
for fruit in tab:
    print "Valeur : %s" % fruit
 
hash = {'France' : 'Paris', 'Allemagne': 'Berlin',  'Angleterre' : 'Londres'};
for key, value in hash.items():
    print "Clé : %s Valeur %s" % (key, value)

Dans les deux cas, nous aurons :

Valeur : fraise
Valeur : abricot
Valeur : goyave
Valeur : pamplemousse
Pays : France , Capitale: Paris
Pays : Angleterre , Capitale: Londres
Pays : Allemagne , Capitale: Berlin

Si on rajoutait un tri en perl, en implicite cela peut aller jusqu'à :

foreach (sort keys %tab)
{
}

Difficile de s'y retrouver à mon humble avis.

  • Perl n'a pas de "prompt" intégré : Franchement pouvoir taper "python" dans un shell et ensuite codé en direct son script et le retoucher, que de temps gagné. Il y a certes perl -pe "commandes perl" mais c'est bien en deçà de ce que peut offrir python.
  • Mettre /usr/bin/perl -w en début de script permet de lever les warnings et corriger les éventuels bugs
  • Python propose le module "re" pour les expressions régulières. Pas besoin donc de se mettre spécifiquement à Perl s'il y a des besoins de RegExp ;-)
  • J'ai l'impression que la doc python est de meilleure qualité même si apparemment Perl rattrape petit à petit son chemin...
  • Globalement, Python et Perl doivent permettre de faire les mêmes choses, donc je vais considérer le périmètre des langages comme ex-aequo.
  • Même si cela m'a troublé de prime abord avec les listes en python, les listes en perl sont sympathiques :
@tab = ("un", "deux", "trois");
($t1, $t2, $t3) = @tab;
 print "t1 vaut $t1\n";
 print "t2 vaut $t2\n";
 print "t3 vaut $t3\n";

Contrairement à ce que l'on pourrait croire de prime abord, cela n'est pas un tableau mais juste un "panier" de variables. On peut donc utiliser $t1 & co.

  • La notation objet est plus claire en Python. Je n'adhère toujours pas au $titi->dosomething(); (comme en PHP en fait)
  • La prise en main de python est beaucoup plus immédiate (aux listes / tuples (grosso modo des listes non modifiables) / dictionnaires (tableaux associatifs) prêt ;-) )
    • D'ailleurs, les listes en python correspondent aux tableaux en perl et les dictionnaires python au hash (tableau associatif) perl.
    • Sauf erreur, il n'y a pas d'équivalent des tuples en perl
    • Les listes en perl n'ont donc rien à avoir avec les listes en python (cela m'a pas mal dérangé durant la formation)

Ce qui fait qu'au final, je rejoins tout à fait David sur "Pourquoi Python & Django". A titre personnel, mon langage de prédilection va donc rester python et je vais voir dans quelle mesure je peux encourager python au boulot. J'y ai déjà glissé une appli Django après tout ;-)

Perl a malgré tout été une bonne surprise, je m'attendais à pire. Il convient par contre dans un contexte d'entreprise je pense de rendre le code le plus verbeux possible pour facilité sa reprise et sa maintenance.

Les exilés d'asceltis (Tome 1/2/3)

Pour rendre la pareille à la revue de BD de Jérome Renard, je vais vous parler des Exilés d'asceltis.

Ayant particulièrement aimé "Les Brumes d'Asceltis", j'ai naturellement suivi sur "Les exilés d'Asceltis" du même auteur Nicolas JARRY (qui au passage à écrit un roman génial : Chroniques du Loup de Deb, à lire également !).

Le synopsis est le suivant :

8000 ans avant les Brumes d’Asceltis, les Naabdirs furent chassés du continent par les Guerres Corgones. Ceux qui survécurent à l’exode trouvèrent refuge, puis prospérèrent dans l’Archipel fleuri d’Aloy Nihib. Sur Asceltis, Obion, le Dieu Naabdir agonise… Pour raviver la foi des siens, il leur envoie un messager, un bébé albinos. Mais les Naabdirs sont partagés: Comment interpréter la venue de cet enfant ? Faut-il revenir sur Asceltis ? Ou au contraire, rester sur l’Archipel ? Pour être certains de respecter la volonté de leur Dieu, ils décident d’attendre que l’enfant soit en âge de prendre lui-même cette délicate décision. Mais dans l’ombre, la présence de ce mystérieux bébé a déjà remis en route les sombres engrenages d’une implacable destinée…

L'histoire s'étale sur 3 tomes (et je ne pense pas qu'un 4ème arrive) ce qui fait qu'elle a le temps de se mettre en place, se développer et se finir sans tomber dans les séries à 40 épisodes où on gère mal sa fin comme Lanfeust des Etoiles par ex. Les dessins sont très beaux et le scénario se tient de bout en bout (avec un rythme assez continu, je n'ai pas observé de trous). Les personnages sont aussi bien réalisés, chacun apportant sa spécificité à l'édifice.

Pour ceux qui auraient lu les brumes d'Asceltis, ils peuvent éventuellement être un peu désemparés aux début car il n'y a pas vraiment de liens entre les deux séries (pas les mêmes races de personnages hormis les nains sur la fin et une autre race dont je ne retrouve pas le nom) et les dessins ne sont pas du tout les mêmes. Les exilés d'Asceltis sur une chronologie se place en fait bien avant les brumes d'Asceltis.

Bien sur, pour apprécier la série, il vous faut passer par le tome 1 car prendre l'histoire en route ne vous ménera nulle part.

Au final, ces deux séries se placent dans le haut de ma liste de BDs en terme de préférence. Il n'y a peut être que "Les naufragés d'Ythaq" (autre coup de coeur de l'année, j'y reviendrais prochainement) qui pourrait leur faire un peu d'ombre. Tout dépend comment cela va se terminer, en espérant qu'ils évitent l'écueil Lanfeust des Etoiles...

Faut-il sauver MySQL ?

A la demande de Jérome Renard et suite à la publication de "Help saving MySQL" par le fondateur de MySQL, ma première pensée fut ; "Hard to have an opinion on oracle/mysql debate. Was sun a better home ? FUD ?'

Sans nul doute il y a conflits d'intérêts entre Oracle & MySQL vu qu'il s'agit de deux bases de données relationelles; toutefois sur MySQL :

  • SI vous utilisez le moteur InnoDB, vous ^tes déjà dpendant d'Oracle depuis que ce dernier à racheter Innobase en octobre 2005. Votre dépendance cessera lorsque le nouveau plugin InnoDB sera sorti en version stable
  • La base de données Oracle est je pense principalement utilisée pour des applications orientées "entreprise". Dans ce contexte, pour Oracle, l'acquisition de MySQL peut lui permettre d'être sur de nouveaux segments comme le web ou les PME (qui ne peuvent s'offrir des licences Oracle).
  • En qui Sun était une meilleure maison pour MySQL ? J'ai plutôt l'impression que MySQL en a pati que tirer partie ?
  • Le fondateur de MySQL a déjà lancé l'Open Database Alliance ainsi qu'un fork de MySQL : Maria DB et une société de services Mpnthy AB. Quel est son intérêt dans l'histoire ? Est-ce si "désintéressé" que cela ?
  • La gestion du développement de MySQL était déjà sujet à critiques (toujours par le fondateur de MYSQL). En quoi cela peut être pire ?
  • Si Oracle venait à tuer MySQL (activement ou pas), il est toujours possible de forker (c'est d'ailleurs déjà fait) - donc hormis le coté médiatique / crédibilité / image de marque à gérer, où est le problème ?
  • MySQL s'est imposée comme base de données par défaut pour le web et PME. Ce serait certes une mauvaise image pour la promotion du libre de voir MySQL disparaitre. Mais comme dit précédemment, le fork peut se faire.
  • Pour les constructeurs de solutions opensource (ou pas) autour de MySQL, il leur faut évaluer leur dépendance vis à vis des composants retenus. Temps d'adopter un ORM ou d'être compatible multi-db ?
  • Pour éviter ce cas, n'aurait-il pas fallu créer une fondation MySQL, détentrice des droits et du contrôle sur son développement ? Cela pourrait être une porte de sortie pour Oracle... A vouloir monétiser MySQL, c'est peut être une leçon à retenir ?
  • (Edit1) La grand gagnant de MySQL vs Oracle sera-t-il Postgres ?
  • (Edit 2) Le MagIT indique d'ailleurs : "Notons que Monty Widenius n'est pas totalement désinteressé. Il a récement lancé Maria DB, un fork de MySQL et ambitionne de répliquer le succès qu'il a connu avec la première itération de sa base. Autant dire qu'un MySQL en bonne santé entre les griffres d'Oracle, pourrait largement éclipser ses chances de réussite".
  • (Edit 3) : Monty admet (fin d'article) que les développements autour de MySQL sont "morts" depuis 5 ans. Le rachat de MySQL par Sun n'a rien changé : Les innovations sur MySQL ont déjà été stoppées il y a 5 ans. Il s'agissait d'ailleurs d'un point sur lequel javais beaucoup d'espoirs en intégrant Sun. C'était un désastre complet en matière de développements. Et je comptais beaucoup sur Sun pour régler le problème. Malheureusement, cela ne s'est jamais produit. On peut donc dire que les développements sont déjà morts. C'est également pour cette raison que j'ai quitté le projet. D'ailleurs aujourd'hui, il y deux vrais forks (nouveaux projets dérivant du code initial de la base libre, NDLR) de MySQL, hors Drizzle.. Cela en fait de l'agitation poru un mort... ;-)
  • (Edit 4 du 05.01.10) : La communauté semble de plus en plus critique sur Monty par bien des aspets (cf billet du président de la fondation python). Plus j'y pense, plus je me dis que le danger de l'acquisition pour Monthy est de ne plus pouvoir profiter gratuitement du code de MySQL. Je m'explique, si on considère que MariaDB == MySQL + code spécifique, alors son entreprise dans son business plan prévoyait pour le moment de ne payer que les dev spécifiques. L'acquisition d'oracle peut mettre fin à ce modèle. D'où 2 solutons pour Monty : soit on reste dans la situation actuelle et il peut bénéficier du code de MySQL gratuitement pour faire ses affaires avec MariaDB. Soit il cherche à ce que les développeurs MySQL passent à MariaDB pour reproduire l'existant. Ainsi, le cout logiciel de MariaDB reste le code spécifique et non la globalité du code (MySQL + code spécifique).
  • (Edit 5 du 06/01/10) :Monty Widenius wants another billion dollars, should we help him ?. Tout est dit sur Monty...

Sans vouloir voir MySQL disparaitre, j'ai plutôt l'impression que les problèmes étaient déjà présents par le passé et que l'acquisition d'Oracle ne fait que les mettre en valeur / compléter.

Votre avis ?

- page 1 de 20

Bienvenue

Ce blog en actuellement en cours de travaux :-)

Pour les liens en tous genre, voir en haut & pied de page