Skip to content

Commit

Permalink
most features working, add real-life blog posts for tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mna committed Jul 11, 2013
1 parent 08a91f5 commit a0d58be
Show file tree
Hide file tree
Showing 34 changed files with 2,512 additions and 69 deletions.
61 changes: 61 additions & 0 deletions posts/002-meta-billet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
Date: 2012-02-29
Title: Méta-billet: un mot sur le Calepin
Author: Martin Angers
Category: technologie
Abstract: Il existe de nombreux moteurs de blogue gratuits sur internet. Pourquoi avoir jeté l'ancre sur ce discret et modeste Calepin?

Il existe de nombreux moteurs de blogue gratuits sur internet, tels [Wordpress][wp], [Blogger][] et [Tumblr][]. Pourquoi avoir jeté l'ancre sur ce discret et modeste [Calepin][]? Peut-être un peu pour ça, tiens, pour me tenir loin des tumultes de ces méga-centres urbains du Web. Un peu aussi pour ce *design* minimaliste, centré sur le contenu, sur les mots. Et un peu pour deux qualités franchement moins romantiques: *dropbox* et *markdown*.

### Mes billets, mon coffret

La plupart des [blogiciels][blogiciel] utilisent une base de données quelconque pour stocker leurs articles. Wordpress, par exemple, repose sur une base de données [MySql][wpmysql]. Pour éviter à l'utilisateur l'horrible expérience d'inscrire son texte directement dans la base de données via des commandes SQL, ces blogiciels offrent, généralement sous la forme d'une page Web privée, des outils d'édition maison, permettant d'insérer, modifier ou supprimer les articles de façon relativement conviviale. C'est bien, c'est même un aspect important de ce qu'il est convenu d'appeler le [Web 2.0][web20], mais c'est une approche qui comporte quelques irritants:

* Le contenu doit être saisi dans l'outil d'édition fourni. Ou importé d'un format tiers, si l'outil d'édition le permet. Bon nombre de formats sont théoriquement "compatibles" avec Wordpress, moyennant l'installation de tel ou tel [plugiciel][] plus ou moins supporté, maintenu et fonctionnel, mais c'est quand même une étape de plus, donc de trop.
* Les billets sont conservés dans l'inutilisable format de la base de données. Bien sûr, on peut se tourner vers une fonctionnalité d'exportation du contenu, question d'obtenir, par exemple, un sympathique fichier XML (oui, c'est du sarcasme), le tout avec plus ou moins de contrôle sur ce qui sera exporté.

On parle pourtant de blogue ici, d'articles écrits pour être lus. Je peux imaginer assez aisément bon nombre d'auteurs écrire d'abord leurs billets dans le traitement de texte de leur choix, pour ensuite le transcrire, le copier ou l'importer tant bien que mal dans le blogiciel. Le Calepin prend une approche plus respectueuse du texte: mes billets restent dans leur fichier d'origine, bien au chaud et en sécurité dans *mon* coffret dans les nuages, *mon* dropbox. Le Calepin n'a besoin que d'un accès autorisé à un répertoire spécifique de dropbox, et à mon signal, il lit le contenu de ce répertoire et construit le blogue à partir de ce qu'il y trouve.

Je ferme mon blogue? Je largue les amarres? Mes billets sont toujours confortablement installés dans mon nuage. Et en tout temps, ils demeurent totalement lisibles et modifiables par l'outil de *mon* choix. Ce qui m'amène à parler du format de ces articles.

### Minimaliste jusque dans la syntaxe

Le format, la langue que comprend le Calepin, est le [markdown][]. C'est pratiquement un anti-format, en ce sens que le *markdown* est d'abord et avant tout du texte brut, sans flafla, sans encodage binaire ou enrobage XML, pouvant être lu et modifié avec le plus humble des éditeurs de texte. Là où le HTML - un langage de type *markup*, contraste intéressant - ajoute des balises dans le texte, rendant la lecture de la source difficile ou à tout le moins désagréable sans traitement préalable par un fureteur, le *markdown* utilise un nombre limité de légers artifices pour permettre d'identifier, par exemple, des en-têtes, une emphase, ou des points de forme. Ces artifices se traduisent aisément en code HTML ou une multitude d'autres formats via différents outils (dont le Calepin) mais même sous leur forme originelle, l'effet recherché est tout à fait perceptible (on peut d'ailleurs visualiser la source de chaque article sur Calepin en remplaçant le ".html" dans l'adresse par ".txt"). Un exemple:

:::markdown
## Ceci est un en-tête ##

Et voici une *emphase*, et _une autre_ avec une syntaxe alternative.

* Ceci est un point de forme.
* Et un autre.

> Et voici une citation, qui rappelle la syntaxe utilisée dans les
> courriels lorsqu'on répond en citant le message original.

D'une simplicité géniale. Plus de problème de compatibilité entre Mac, Windows, Linux, Android ou iOS, c'est du texte encodé en UTF-8, tout ce qu'il y a de plus standard aujourd'hui. En fait, certains en ont même fait leur [format portable à utiliser pour toute documentation][mdhn], au détriment des Word et LibreOffice de ce monde. Je considère fortement permettre cette syntaxe pour le [Compte Rendu Web][crw], puisqu'elle combine expressivité, simplicité et rapidité, trois caractéristiques essentielles pour la prise de note en temps réel.

### De la personnalité, une signature

Le Calepin enrobe le coffret dans les nuages de *dropbox* et la syntaxe pure et naturelle du *markdown* d'une fine couche de gestion à l'attention de l'auteur du blogue. À l'image de tout le reste, la page d'administration est dénuée de toute exhubérance, en trois courtes étapes tout est fait:

![Administration du Calepin](http://dl.dropbox.com/u/21605004/CalepinAdmin.jpg)

1. L'authentification à son compte *dropbox*, qui sert par le fait même d'authentification au blogue.
2. La configuration du blogue, soit le titre, l'option d'y ajouter le gestionnaire de commentaires qui est [Disqus][] et c'est tout, l'option du lien social qui est [Twitter][] et c'est tout, et le nom de domaine si on ne veut pas celui du Calepin par défaut.
3. Le bouton de publication.

Voilà. Il y a quelques options mineures au niveau des méta-données de chaque article et une configuration pour le site, principalement des valeurs par défaut, mais rien de renversant, et ce *par choix*. Pas de blogoliste (*blog roll*), de nuage de mots-clefs (*tag cloud*), de catalogue de thèmes dans tous les tons de marron, de barre de partage pour trente-douze gazillions de sites sociaux. C'est la sympathique personnalité du Calepin, minimaliste jusqu'au bout!

[blogiciel]: http://www.oqlf.gouv.qc.ca/ressources/bibliotheque/dictionnaires/terminologie_blogue/blogiciel.html
[wpmysql]: http://codex.wordpress.org/FAQ_Developer_Documentation#Why_does_WordPress_only_support_MySQL.3F_What_about_DB_abstraction.3F
[web20]: http://fr.wikipedia.org/wiki/Web_2.0
[wp]: http://wordpress.org/
[blogger]: http://blogger.com/
[tumblr]: https://www.tumblr.com/
[plugiciel]: http://www.oqlf.gouv.qc.ca/ressources/bibliotheque/dictionnaires/internet/fiches/1299146.html
[calepin]: http://calepin.co/
[markdown]: http://daringfireball.net/projects/markdown/basics
[mdhn]: http://www.hiltmon.com/blog/2012/02/20/the-markdown-mindset/
[disqus]: http://disqus.com/
[twitter]: https://twitter.com/PuerkitoBio
[crw]: http://www.compterenduweb.com/
106 changes: 106 additions & 0 deletions posts/003-dependances.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
Date: 2012-03-05
Title: npm: la base essentielle pour débuter avec node.js
Author: Martin Angers
Category: technologie
Abstract: La plateforme node.js est volontairement limitée, en son coeur, aux fonctionnalités les plus fondamentales. Elle mise donc sur les contributions de sa communauté pour enrichir le noyau et repousser les limites du possible. Avec près de 8000 librairies à ce jour, il y a sérieux danger de chaos. Et si on y retrouve plutôt quelque chose comme une belle organisation, c'est en bonne partie grâce au gestionnaire de librairies npm.

La plateforme node.js est [volontairement limitée][userland], en son coeur, aux fonctionnalités les plus fondamentales. Elle mise donc sur les contributions - souvent époustouflantes, [j'en parle ici][billetnode] - de sa communauté pour enrichir le noyau et repousser les limites du possible.

Avec près de 8000 librairies pullulant dans son écosystème, il y a sérieux danger de chaos. Et si on y retrouve plutôt quelque chose comme une belle organisation, c'est en bonne partie grâce à la colonne vertébrale qui unit et soutient cette terre fertile, le gestionnaire de librairies [npm][]. Présentation, trucs et astuces dans les lignes qui suivent.

### La base: installation, désinstallation, indicateur global

*npm* lui-même s'installe de façon fort simple depuis quelques versions: il est livré avec node. Il s'agit donc d'installer node d'une des [nombreuses][installnode] [façons][nvm] [possibles][n].

Ensuite, toute librairie publiée dans [le registre de npm][registry] est à portée de main. Pour installer une librairie, par exemple le gestionnaire de versions *n*:

:::Bash shell scripts
martin@LilDevil:~/sublime-wrkspc/crw$ npm install n
npm http GET https://registry.npmjs.org/n
npm http 200 https://registry.npmjs.org/n
npm http GET https://registry.npmjs.org/n/-/n-0.7.0.tgz
npm http 200 https://registry.npmjs.org/n/-/n-0.7.0.tgz
n@0.7.0 ./node_modules/n

Seul bémol à propos de cette démonstration rayonnante de simplicité: la commande ne respecte pas [la règle de silence de UNIX][unixrules], qui veut que si tu n'as rien de spécial à dire, tu ne dis rien. En effet, sur UNIX et ses déclinaisons, on s'attend à ce qu'une commande qui fait ce qu'on lui demande sans problème n'affiche aucun message. C'est mineur, mais c'est une des philosophies importantes à respecter pour bien s'intégrer à l'ensemble.

Une fois installée, la librairie est au bon endroit pour être retrouvée par node et utilisable dans notre code, via la commande habituelle `var librairie = require('librairie');`. Si on veut installer non seulement la librairie et ses dépendances pour qu'elle s'exécute correctement (l'installation par défaut), mais aussi ses dépendances de développement, par exemple pour exécuter les tests automatisés de la librairie, alors on doit spécifier l'indicateur -dev (`npm install n -dev`). Pour désinstaller, on s'en doute, c'est `npm uninstall n` (ou un alias équivalent, soit `npm remove` ou `npm rm`).

Autres commandes de base toujours utiles, pour connaître la version actuelle de npm:

:::Bash shell scripts
martin@LilDevil:~/sublime-wrkspc/crw$ npm -v
1.1.4

Et pour lister les librairies installées dans le répertoire courant (dans cet exemple, les librairies utilisées par le [Compte Rendu Web][crw] à ce point-ci de son développement):

:::Bash shell scripts
martin@LilDevil:~/sublime-wrkspc/crw$ npm ls
crw@0.1.0 /home/martin/sublime-wrkspc/crw
├── debug@0.5.0
├─┬ express@2.5.8
│ ├─┬ connect@1.8.5
│ │ ├── formidable@1.0.9
│ │ └── mime@1.2.5
│ ├── mime@1.2.4
│ ├── mkdirp@0.3.0
│ └── qs@0.4.2
├─┬ jade@0.20.3
│ ├── commander@0.5.2
│ └── mkdirp@0.3.0
├── less@1.2.2
├─┬ mocha@0.14.0
│ ├── commander@0.5.2
│ ├── diff@1.0.2
│ └── growl@1.5.0
├─┬ mongoose@2.5.9
│ ├── hooks@0.1.9
│ └── mongodb@0.9.7-3-5
├── request@2.9.153
├── should@0.6.0
└── uglify-js@1.2.5

`npm list` est équivalent, et `npm ll` (ou `npm la`) offre des informations plus détaillées. Par défaut, npm conserve toutes les dépendances localement, dans un sous-répertoire "node_modules" du répertoire courant. Ainsi, comme chaque librairie installée vient avec ses propres dépendances dans son propre sous-répertoire "node_modules", une application node peut utiliser les librairies A et B, chacune ayant une dépendance sur C, mais A et B peuvent utiliser une version différente de C sans problème. On en voit un exemple concret sous la librairie *express*, qui dépend directement sur *mime*, alors que sa dépendance *connect* dépend aussi sur *mime*, mais dans une version distincte, et ce sans conflit:

:::Bash shell scripts
├─┬ express@2.5.8
│ ├─┬ connect@1.8.5
│ │ ├── formidable@1.0.9
│ │ └── mime@1.2.5
│ ├── mime@1.2.4
│ ├── mkdirp@0.3.0
│ └── qs@0.4.2

C'est une qualité assez exceptionnelle parmi les environnements de développement, que [Mikeal Rogers n'a pas manqué de souligner][mikeal]:

> Node’s local module support accomplishes what no other platform I know of has done, it allows for two dependencies to require entirely different versions of the same dependency without caveats and unforeseen failures.
Parfois, on peut préférer une installation globale d'une librairie, par exemple lorsqu'il s'agit d'une application console (*command-line interface (CLI)*) que l'on veut rendre disponible partout. npm supporte ce mode via l'indicateur `-g` ou l'équivalent `--global`. Ainsi, pour installer globalement: `npm install -g <librairie>`, pour lister les librairies installées globalement: `npm ls -g`, et ainsi de suite, les mêmes commandes s'appliquent mais avec une portée globale. À noter que ce n'est **pas** l'option recommandée pour une librairie que l'on veut utiliser dans le code d'une application node. L'approche locale à cette application est à privilégier dans ce cas (on verra pourquoi dans un futur article sur la gestion des dépendances).

### Le registre au bout des doigts

J'ai mentionné [le registre de npm][registry], qui permet de rechercher avec des mots-clefs dans les nombreuses librairies disponibles. Or, il n'est pas nécessaire d'aller sur le site Web pour effectuer ces recherches. Avec npm, on a ce registre au bout des doigts, exploitable avec de simples commandes.

:::Bash shell scripts
martin@LilDevil:~$ npm search /^jscov
NAME DESCRIPTION AUTHOR DATE KEYW
jscoverage jscoverage module for node.js =kate.sf 2012-02-28 02:11

Ainsi, `npm search` suivi de mots à rechercher est équivalent à la recherche par le site Web. Il est également possible, tel que démontré dans l'exemple, d'utiliser une expression régulière en commençant le mot à rechercher par `/`. Pour afficher les informations détaillées d'une librairie spécifique - par exemple ses dépendances et ses auteurs, c'est la commande `npm view <librairie>`.

Pour profiter des fonctionnalités non anonymes, il faut bien sûr se créer un compte utilisateur. C'est tout simple, avec `npm adduser`, on peut choisir un nom d'utilisateur, un mot de passe, et associer le tout à une adresse courriel. Ensuite il est possible d'utiliser une des commandes méconnues qui a pourtant un potentiel intéressant pour découvrir les librairies de qualité: `npm star <librairie>`. C'est l'équivalent d'un *j'aime* de Facebook, et c'est une information visible dans le registre. Elle gagnerait à être davantage utilisée et mieux exploitée, car plus l'écosystème grossit, plus il devient difficile de discerner les librairies de calibre production, maintenues et codées de façon professionnelle, des projets de fin de semaine avec plus ou moins d'avenir. C'est une problématique [qui commence à faire beaucoup jaser][trouble] dans la communauté, et une solution - ou du moins une amélioration - serait sur les planches à dessin du côté de l'équipe de npm.

Dans un prochain article j'aborderai les commandes davantage liées à une librairie spécifique, son fichier `package.json`, et les bonnes pratiques (toujours en évolution!) pour la gestion des dépendances d'une application node.

[userland]: https://github.com/joyent/node/wiki/node-core-vs-userland
[billetnode]: http://hypermegatop.calepin.co/propulse-par-nodejs.html
[npm]: http://npmjs.org/
[installnode]: https://github.com/joyent/node/wiki/Installation
[nvm]: https://github.com/creationix/nvm
[n]: https://github.com/visionmedia/n
[registry]: http://search.npmjs.org/
[crw]: http://www.compterenduweb.com/
[mikeal]: http://www.mikealrogers.com/posts/nodemodules-in-git.html
[unixrules]: http://www.faqs.org/docs/artu/ch01s06.html
[privateregistry]: http://npmjs.org/doc/registry.html
[trouble]: http://mikkel.hoegh.org/blog/2011/12/20/trouble-in-node-dot-js-paradise-the-mess-that-is-npm/
Loading

0 comments on commit a0d58be

Please sign in to comment.