Applications autonomes

CouchDB peut être utile pour plusieurs parties d’un logiciel. Puisque MapReduce et le mécanisme de réplication fonctionnent de manière incrémentale, ils sont particulièrement adaptés aux documents interactifs et aux tâches de traitement des données. Cela correspond à la charge de travail que subissent bon nombre d’applications web. En ajoutant à cela l’interface HTTP de CouchDB, cela en fait une solution naturellement adaptée à ce milieu.

Dans cette partie, nous verrons une application web orientée document : un blogue basique. Comme plus petit dénominateur commun, nous utiliserons du bon vieux HTML et du JavaScript. Les enseignements que vous pourrez en tirer s’appliqueront à Django, Rails, aux intergiciels basés sur Java et même aux tâches intensives de fouille de données avec MapReduce. Que vous exploitiez une petite installation ou un cluster industriel, l’API de CouchDB est la même.

Il n’y a pas de réponse magique quant au framework de développement que vous devriez utiliser avec CouchDB. Nous avons vu fonctionner des applications avec presque tous les langages répandus et avec n’importe quel framework. Pour notre exemple, nous utilisons une architecture deux tiers : CouchDB comme tiers de persistance des données et le navigateur comme interface d’accès à celles-ci. Nous pensons qu’il s’agit d’un modèle viable pour de nombreux logiciels orientés documents. De plus, c’est un bon moyen d’enseigner CouchDB, car nous pouvons estimer sans grand risque que vous disposez d’un navigateur sous la main sans avoir à poser un quelconque prérequis sur votre maîtrise des langages côté serveur.

Utiliser la bonne version

Cette partie est interactive, alors soyez prêt à la suivre avec votre ordinateur portable et à faire fonctionner une base de données CouchDB. Nous avons complètement créé cette application et avons publié l’intégralité du code source. C’est pourquoi vous commencerez par télécharger la dernière version de l’application et que vous l’installerez sur votre instance de CouchDB.

Un des défis posés par ce livre pour son écriture et son édition est que CouchDB évolue très vite. Les fondamentaux n’ont pas changé depuis longtemps et ne changeront probablement pas avant longtemps, mais ce qui les entoure évolue rapidement pour atteindre la version 1.0 de CouchDB.

Ce livre sera édité à l’époque de la version 0.10.0. La majeure partie du code a été rédigée avec la version 0.9.1 et le tronc courant du développement qui va devenir la 0.10.0. Dans cette partie, nous travaillerons avec deux autres logiciels : CouchApp, un ensemble d’outils pour éditer et partager du code d’application CouchDB, et Sofa, le blogue d’exemple.

Visitez http://couchapp.org pour obtenir les dernières informations concernant CouchApp.

En tant que lecteur, il est de votre responsabilité d’utiliser les bonnes versions de ces logiciels. Pour CouchApp, la bonne version est toujours la dernière. La bonne version de Sofa dépend de la version de CouchDB que vous utilisez. Pour savoir quelle version vous utilisez, faites :

curl http://127.0.0.1:5984

Vous devriez voir l’une de ces trois réponses :

{"couchdb":"Welcome","version":"0.9.1"}

{"couchdb":"Welcome","version":"0.10.0"}

{"couchdb":"Welcome","version":"0.11.0a858744"}

Ces trois lignes correspondent aux versions 0.9.1, 0.10.0 et au tronc de développement. Si vous utilisez CouchDB 0.9.1 ou plus récent, vous devriez mettre à jour pour atteindre au moins la version 0.10.0, puisque Sofa utilise des fonctionnalités qui ne sont pas présentes avant. Il existe toutefois une ancienne version de Sofa qui fonctionnera, mais ce livre décrit des fonctionnalités et des APIs qui sont liés à la version 0.10.0 de CouchDB. Il est probable qu’au jour où vous lirez ceci, il existera une version 0.9.2 ou 0.10.1, voire une 0.10.2. Utilisez la dernière mise à jour de la version que vous préférez.

Le tronc fait référence à la dernière version de développement de CouchDB disponible sur le dépôt Subversion d’Apache. Nous vous recommandons d’utiliser une version publiée de CouchDB, mais en tant que développeurs, nous utilisons souvent le tronc de développement. La branche maîtresse de Sofa aura tendance à fonctionner avec le tronc, donc si vous désirez rester à la pointe, vous savez comment vous y prendre.

JavaScript portable

Si le JavaScript ne vous est pas familier, nous espérons que les exemples qui vous sont donnés s’accompagnent de suffisamment d’éléments de contexte et d’explications pour que vous puissiez suivre. Si le JavaScript vous est familier, vous serez sans doute heureux de savoir que CouchDB intègre les fonctions de vue et de patrons de rendu (ou modèles de documents).

L’un des avantages à bâtir des applications qui nécessitent uniquement CouchDB est qu’elles peuvent être répliquées par le mécanisme de la base. Cela signifie que votre application, si vous la faites uniquement reposer sur CouchDB, pourra être utilisée hors ligne sans développement complémentaire. Avoir des données locales change considérablement la donne pour les utilisateurs, mais nous ne rentrerons pas ici dans les détails. Les applications qui nécessitent uniquement CouchDB pour fonctionner sont appelées « CouchApps ».

Les CouchApps sont un excellent moyen pour enseigner CouchDB parce qu’elles ne requièrent pas de choisir un langage ou un framework ; nous travaillerons directement avec CouchDB, ce qui permet aux lecteurs de comprendre rapidement la structure de l’application. Une fois que vous aurez réalisé l’application d’exemple, vous en aurez suffisamment vu pour savoir appliquer CouchDB à votre problématique. Si vous ne connaissez pas trop Ajax, vous l’apprendrez un peu, tout comme vous en apprendrez un peu sur jQuery, et nous espérons que vous trouverez l’expérience relaxante.

Les applications sont des documents

Les applications sont stockées comme des design documents (cf. Figure 1, CouchDB exécute une application stockée dans un design document). Vous pouvez répliquer les design document comme n’importe quoi d’autre dans CouchDB. Puisque les design document peuvent être répliqués, l’application entière peut l’être aussi. Les CouchApps peuvent être mises à jour par réplication, mais les utilisateurs peuvent aussi les bifurquer [NdT : fork en anglais] et modifier le code source comme bon leur semble.

Figure 1. CouchDB exécute une application stockée dans un design document

Puisque les applications sont juste un type particulier de document, il est facile de les partager.

« Quand je pense à la réplication d’applications conçues pour fonctionner sur un nœud, je me souviens de mes années de collège, quand nous partagions entre amis des programmes sur les TI-85 que nous étions obligés d’avoir », déclare J. Chris. « Deux calculatrices pouvaient être connectées par un câble et nous pouvions transférer des fafiots de sciences physiques. Hangman, quelques aventures multi-joueurs en mode texte, et, au paroxysme de nos talents, je crois me souvenir qu’un clone de Doom tournait aussi. »

« Les programmes de la TI-85 étaient écrits en Basic, donc tout le monde passait son temps à bidouiller les bidouillages des autres. Peut-être même que le programme le plus ridicule qui fût était une version de Spy Hunter que vous contrôliez avec votre esprit. L’idée était que vous pouviez influencer le générateur de nombres pseudoaléatoires en vous concentrant suffisamment et, par là même, contrôler le jeu. Ça ne marchait d’ailleurs pas du tout. Quoiqu’il en fût, l’important est que quand vous donnez accès aux autres à votre code source, personne ne peut prédire ce qui va se passer. »

Si certains n’apprécient pas le design de votre application, ils peuvent modifier les CSS. Si d’autres n’approuvent pas vos choix d’interfaces, ils peuvent améliorer le HTML. S’ils veulent modifier une fonctionnalité, ils peuvent éditer le code JavaScript. En poussant la logique à l’extrême, ils pourraient bifurquer complètement votre application pour répondre à leur propre besoin. Quand ils montreront leur version à leurs amis et collègues, donc avec un peu de chance, à vous aussi, il est possible que d’autres personnes veuillent apporter des améliorations.

En tant que concepteur originel, vous contrôlez ce que devient votre version et pouvez accepter ou refuser les modifications comme bon vous semble. Si quelqu’un se mélange les pinceaux et détruit son application locale, il peut récupérer à nouveau la vôtre, comme le montre la Figure 2, Répliquer les modifications apportées à une application avec un groupe d’amis.

Figure 2. Répliquer les modifications apportées à une application avec un groupe d’amis

Bien sûr, ce n’est peut-être pas votre tasse de thé. Ne vous inquiétez pas, vous pouvez être aussi restrictif que vous le désirez avec CouchDB. Vous pouvez limiter l’accès aux données comme vous le voulez, mais soyez conscient des occasions sur lesquelles vous passez peut-être. Il existe des compromis entre la collaboration ouverte à tous les vents et la restriction absolue des accès.

Une fois que vous avez achevé la procédure d’installation, vous serez capable de voir tout le code de l’application Sofa, aussi bien dans votre éditeur de texte que sous la forme d’un design document dans Futon.

Autosuffisance

Que se passe-t-il si vous joignez un fichier HTML à un document ? La même chose. CouchDB peut servir directement des pages web. Bien sûr, vous aurez peut-être aussi besoin d’images, de feuilles de style ou de scripts. Aucun souci : ajoutez ces fichiers comme des pièces jointes et liez-les entre eux avec des URIs relatives.

Prenons du recul. Qu’avons-nous à présent ? Un moyen de servir des documents HTML et d’autres fichiers statiques sur le Web. Vous pouvez donc créer un publier des sites web traditionnels avec CouchDB. Fantastique ! Mais n’est-ce pas réinventer la roue ? Eh bien, le changement, c’est que nous avons aussi une base de données derrière. Nous pouvons attaquer cette base de données avec le JavaScript envoyé dans nos pages web. Bienvenu à bord de la Rolls-Royce !

Les fonctionnalités de CouchDB permettent de bâtir des applications web autonomes s’appuyant sur une base de données puissante. Pour preuve, regardez l’interface d’administration Futon : elle est intégrée à CouchDB. Futon est une application de gestion de base de données pleinement opérationnelle avec de HTML, du CSS et du JavaScript. Et rien d’autre. CouchDB est fait pour s’entendre avec les applications web.

Dans la nature

Il existe de nombreux exemples de CouchApps dans la nature. Cette section contient des captures d’écran de quelques sites et applications qui utilisent une architecture CouchDB autonome.

Damien Katz, inventeur de CouchDB et auteur de la préface de ce livre, a cherché à voir combien de temps serait nécessaire à implémenter un calendrier partagé avec des mises à jour en temps réel quand un évènement est modifié sur le serveur. Cela lui a pris l’après-midi, grâce soit rendue à quelques greffons impressionnants du framework JQuery. Le calendrier fonctionne toujours sur le serveur de J. Chris. Reportez-vous à la Figure 3, Calendrier de groupe.

Figure 3. Calendrier de groupe

Jason Davies s’est appuyé sur CouchDB pour le stockage du site Ely Service. Les détails techniques sont donnés sur son blogue. Reportez-vous à la Figure 4, Ely Service.

Figure 4. Ely Service

Jason a aussi converti le site commercial de sa mère, Bet Ha Bracha, en une CouchApp. Il utilise le gestionnaire _update pour s’adresse aux passerelles de transaction. Reportez-vous à la Figure 5, Bet Ha Bracha.

Processing JS est une bibliothèque qui permet d’écrire des animations qui s’exécutent dans le navigateur. Processing JS Studio est une galerie recensant les « croquis » de Processing JS. Reportez-vous à la Figure 6, Processing JS Studio.

Figure 5. Bet Ha Bracha

Figure 6. Processing JS Studio

Swinger est une CouchApp pour créer et partager des diaporamas. Il repose sur Sammy JavaScript application framework. Reportez-vous à la Figure 7, Swinger.

Figure 7. Swinger

Nymphormation est un site de partage d’adresses et de classification conçu par Benoît Chesneau. Il utilise l’authentification par cookie de CouchDB et permet le partage des adresses par les mécanismes de réplication. Reportez-vous à la Figure 8, Nymphormation.

Boom Amazing est une CouchApp développée par Alexander Lang qui vous permet de pivoter, de zoomer et de faire des panoramiques de fichiers SVG, le tout en mémorisant les différentes positions pour pouvoir les rejouer lors d’une présentation (dixit le Boom Amazing README). Reportez-vous à la Figure 9, Boom Amazing.

Figure 8. Nymphormation

Figure 9. Boom Amazing

Le client Twitter CouchDB fut une des premières CouchApp créées. Il est décrit par l’article du blogue de J. Chris My Couch or Yours, Shareable Apps are the Future. La capture d’écran présentée par la Figure 10, Client Twitter montre un nuage de mots généré par une vue MapReduce des gazouillis archivés dans la base CouchDB. Ce nuage est stabilisé à partir de la vue globale, ce qui garantit que les mots communs ne domineront pas le nuage.

Figure 10. Client Twitter

Toast est un système de communication instantané qui permet aux utilisateurs de créer des salons et d’y inviter d’autres personnes. À l’origine, c’était une démonstration de la boucle d’évènements _changes, mais il a fini par être un moyen de communication. Reportez-vous à la figure Figure 11, Toast.

Sofa est l’application d’exemple de cette partie, et elle a été déployée par différents auteurs sur le Web. La capture d’écran illustrée par la Figure 12, Sofa a été prise sur le Tumblelog de Jan. Pour en voir davantage, vous pouvez visiter le site web de J. Chris qui est en ligne depuis fin 2008.

Figure 11. Toast

Figure 12. Sofa

Résumé

J. Chris a décidé de migrer son blogue de Ruby on Rails vers CouchDB. Il a commencé par exporter les objets ActiveRecords de Rails vers leur équivalent JSON en abandonnant quelques fonctionnalités pour en intégrer d’autres dans les codes HTML et JavaScript.

Le moteur de blogue qui en résulte offre les fonctionnalités de contrôle d’accès, de commentaires libres avec la possibilité de les modérer, de flux Atom, de formatage Markdown, etc. Le sujet principal de ce livre n’est pas jQuery, donc même si nous utilisons cette bibliothèque JavaScript, nous nous retiendrons de creuser ce sujet. Les lecteurs familiers des requêtes XML HTTP asynchrones (asynchronous XMLHttpRequests, XHR) devraient se sentir chez eux en présence du code. Gardez toutefois à l’esprit que les extraits de code et les illustrations de cette partie passent sous silence certains détails.

Nous allons étudier cette application et voir comment elle met en pratique les fonctionnalités de base de CouchDB. Les compétences acquises dans cette partie devraient pouvoir s’appliquer dans tous les domaines où CouchDB a sa place, que vous comptiez bâtir une CouchApp que vous hébergez vous-mêmes ou non.