Validate Gitlab .gitlab-ci.yml one-liner

Who does not fight everyday to follow the least surprise/astonishment principle? I know I do and my last issue was related with Gitlab-CI.

I had to wait after each git push to discover if my .gitlab-ci.yml file was valid or not.

As usual, automation is the answer. Wouldn't it be awesome if we could run this:


And then edit our .gitlab-ci.yml until it's valid? That would be really awesome right?

Sadly at the time of writing Gitlab-CI documentation and API requires us to send our YAML file in stringified JSON format inside a content object to /api/v4/ci/lint api endpoint. Yep, that's a lot of hard work for such a simple task.

Fortunately we can leverage jq.node (it's like jq but WAY MORE powerful) for that along with watchexec!

If you do not have jq.node and watchexec installed it's never too late:

npm i jq.node -g
brew install watchexec

With these two I was able to write the following helpers (don't forget to add them inside your ~/.zshrc or equivalent):

function gitlab-ci-validate(){
  DATA=$(jq.node -r js-yaml -x 'jsYaml.safeLoad | thru(x => (JSON.stringify({content: JSON.stringify(x)})))' < .gitlab-ci.yml)
  curl -s --header "Content-Type: application/json" https://gitlab.com/api/v4/ci/lint --data $DATA | jq.node

function gitlab-ci-validate-watch(){
  watchexec --watch $(pwd)/.gitlab-ci.yml 'zsh -c "source ~/.zshrc && gitlab-ci-validate"'

gitlab-ci-validate validates .gitlab-ci.yml file from the current working directory using gitlab.com (it will also work with self-hosted gitlab instances) and gitlab-ci-validate-watch runs gitlab-ci-validate every time I save .gitlab-ci.yaml.

  "status": "invalid",
  "errors": [
    "jobs:update:db:script config should be a string or an array of strings"

For extra sweetness, we might want to run gitlab-ci-validate before each git push using git pre-push hook.


docker-compose watch (a-k-a docker-compose reload) one-liner

Even if I often saw docker-compose misused...

... I do find it sometimes useful when I develop locally. But I can't bear the cmd+tab + ctrl+c + up + enter each time I want to reload my containers because some configuration file changed. I'm not the only one, an issue exists on docker-compose project since 2014 (Watch code and automatically rebuild when something changes).

So here is a one-liner that works and restart docker-compose each time a *.yml, *.toml or *.conf file change:

watchexec --restart --exts "yml,toml,conf" --watch . "docker-compose up"

I used watchexec (rust) but you could definitely use something else like nodemon (nodejs).

And if you wish to restart docker-compose each time files from a specific folder are updated (e.g. api/), --filter is what you are looking for:

watchexec --restart --filter "$(pwd)/api/*" --watch . "docker-compose up"

For extra sweetness — because who wants to remember this one-liner forever? — I put the function below in my ~/.zshrc

function docker-compose-watch() {
  local args;
  if [[ $1 == "help" ]] || [[ $1 = "--help" ]]; then
    watchexec --help | grep -A 3 "OPTIONS:";
    args='--filter "*/docker-compose.yml"' && [[ $1 ]] && args=$@;
  eval watchexec --restart $args -w $(pwd) "docker-compose up"

alias docker-compose-reload=docker-compose-watch;


docker-compose-watch --help
    -e, --exts         Comma-separated list of file extensions to watch (js,css,html)
    -f, --filter ...      Ignore all modifications except those matching the pattern
    -i, --ignore ...      Ignore modifications to paths matching the pattern
docker-compose-watch -e '*.js' -i './api'
Starting api_worker_1
Starting api_postgrest_1
Attaching to api_worker_1, api_postgrest_1
[... updating a file ...]
Gracefully stopping... (press Ctrl+C again to force)
Stopping api_postgrest_1 ... done
Stopping api_worker_1 ... done
Starting api_worker_1
Starting api_postgrest_1

Note: I definitely prefer to restart docker-compose up after each file change (with soft shutdown) than have to first remember to run docker-compose up and then run watchexec ... "docker-compose restart" and finally ctrl+c + docker-compose down.


Merging RedisWeekly into RedisWatch

I'm copy/pasting here the email sent to RedisWeekly subscribers for archiving purpose.

What a long way since the first issue of RedisWeekly the 16th of August 2013!

As you may have seen from the past weeks, I was not able to send you weekly doses of Redis news! In this regard I decided to leave RedisWeekly in the good hands of Redis Watch curator Itamar Haber from Redis Labs and I would highly recommend you to stick with Redis Watch.

If you do not unsubscribe from this mailing list before the 9th of April you will be automatically subscribed to Redis Watch.

As for me I will continue to share and spread what I find interesting on my Twitter account and hope I will meet some of you at some tech conference!

Thank you for all these years of your trust in RedisWeekly.


Continuous Deployment with Gitlab, Gitlab-CI and CleverCloud

Recent events aside, Gitlab and Gitlab-CI is a great integrated forge for software development. I recently decided to migrate Image-Charts on it as well as the soon-to-be-announced-new-SaaS from the old Bitbucket, Jenkins workflow used at Redsmin and Bringr.

As a side note, JenkinsFile never grew up on me, I never liked it, it's too verbose and I definitely prefer the configuration approach (limited feature-set) over the code (unlimited but can quickly get messy) approach.

I first tried to setup a private deploy SSH key as an environment variable and then inject it using GIT_SSH_COMMAND and then hack the known_hosts file to fix the sadly well-known Host key verification failed issue aaaand don't forget to chmod 400! Phew, that's a lot of work for something that should be easy to do. Thankfully there is a simpler way!

You will first need to install clever-tools locally (if you did not already). We could do the following steps without it but doing the oAuth dance through the API is not as easy as using Clever CLI.

npm i clever-tools -g

Then login:

clever login

And now the good part:

cat ~/.cleverrc
{"token":"7ea753c8cb23000000000000000","secret":"02000000700000000047000200"} // copy token and secret value

Open the Gitlab-CI project CI/CD settings, add CLEVER_TOKEN and CLEVER_SECRET environment variables with the values you just copied.

Finally edit your project .gitlab-ci.yml like so:

  image: node:6-wheezy
  stage: deploy
    - /master/
    - git remote add clever https://$CLEVER_TOKEN:$CLEVER_SECRET@push-par-clevercloud-customers.services.clever-cloud.com/app_YOUR_APPLICATION_ID.git
    - git push --verbose --force clever master 2>&1 | grep -e 'remote:' -e '->'

Let's take it step by step:

  • deploy:clevercloud: the job name, could be deploy or whatever you want
  • image: node:6-wheezy: I used this docker image on the previous steps because the app is in NodeJS you can use any docker image you want as long as it has git installed
  • stage: deploy: gitlab-ci pipeline stage.
  • only: - /master/: restrict this job to the master branch.
  • git remote add clever ...: we first need to add CleverCloud remote git repository to the build local git repository.
  • ... https://$CLEVER_TOKEN:$CLEVER_SECRET@push-par-clevercloud-customers.services.clever-cloud.com/...: this is where the magic happens, instead of using git+ssh we are using https transport, the authentication is through basic auth token:secret and thus we don't need to setup a private ssh key.
  • ... clevercloud-customers.services.clever-cloud.com/app_YOUR_APPLICATION_ID.git ...: don't forget to set your APPLICATION_ID.
  • ... git push --force clever master ... I always use --force in CD pipelines, I don't want anyone else to bypass the CD pipeline. It's often a source of longer outage when tests are bypassed to fix directly the production environment.
  • ... 2>&1 | grep -e 'remote:' -e '->' ... this part is very important, without it token:secret will leak into job logs and even emails in case of job failure.

That's it! It only took 2 lines in a Gitlab-CI job to automatically deploy your project on CleverCloud.

Deploying to CleverCloud is only one side of the story, I hope to share later the Gitlab-CI pipeline I use to deploy the soon-to-be-announced-new-SaaS with Kubernetes on Google Container Engine.


Mon opération laser des yeux (LASIK) sur Nantes

Contexte (~2 mois avant l'opération)

Cela faisait plusieurs années que je réfléchissais à l'opération laser des yeux pour enfin ne plus avoir à porter de lunettes. L'opération me correspondait à la fois par principe et à la fois par besoin réel. Le besoin réel était lié en grande partie aux activités sportives. Qu'il est énervant de ne rien voir sans lunettes ou d'avoir constamment de la buée sur ses lunettes tout cela pour une petite myopie à -1.50 sur chaque oeil !

Comme tout le monde, cela commence par une traditionnelle recherche des retours sur l'opération laser LASIK à Nantes et à ma grande surprise il n'existait que quelques messages sur des forums mais pas un seul retour complet. J'y ai découvert que l'opération laser des yeux via la technique LASIK avait 96% de réussite, les 4% restant concernaient une correction finale non optimale. Enfin le nombre d'aveugles suite à l'opération semblait être incalculable car bien trop faible, rassurant.

Aussi, après l'opération, beaucoup d'amis m'ont fait part de leur intérêt pour LASIK avec le flot de questions associés... Je vais donc décrire ici mon expérience afin que ce billet soit la Single-Source-Of-Truth de tout ce que j'ai à dire sur le sujet. Plutôt que de dupliquer l'information oralement pour chaque interlocuteur, autant leur indiquer ce billet avant de répondre à leurs questions !

Il y a deux offres sur Nantes : une privée (par le Dr. Mehel à la clinique Sourdille) et une publique (au CHU de Nantes). Ayant l'habitude d'aller au centre d'ophtalmologie des Hauts Pavés avec le Dr. Mehel depuis des années j'ai donc pris un rendez-vous là-bas.

Premier rendez-vous (31 Jan. 2017, ~1 mois avant l'opération)

Le premier rendez-vous permet de valider si la vue est stable. Dans mon cas, entre le dernier checkpoint de 2015 et ce rendez-vous de 2017 ma vue était stabilisée je pouvais donc accéder à l'opération. Lors de ce point, on m'a dit que si l'opération était réalisée le vendredi, je pourrais reprendre le travail dès le lundi. On m'a aussi informé que les deux yeux seraient opérés en même temps, sans anesthésie générale (donc ouvert consciemment) en fixant un point précis, sans bouger, par laser, tour à tour.

Le devis, les tarifs

En sortant du rendez-vous, j'ai donc eu un devis qui s'élevait à 2 770€. Cela représente effectivement un coût mais c'est un investissement pour soi. Sur ces 2 770€, la mutuelle de mon entreprise en couvrait plus de 43% (soit 1 200€) ce qui n'est pas négligeable.

Une fois le devis validé et la date de l'opération déterminée, deux chèques sont à faire, le premier au Dr. Mehel (2 014€) et le second pour la clinique Sourdille (756€). Vous recevez aussi une ordonnance pour un anxiolytique (Lexomil) afin d'être relaxé avant l'opération ainsi que de la documentation supplémentaire.

J'en profite pour préciser qu'une amie directrice d'hôpital m'a bien affirmée plusieurs fois que le fait de payer plus cher dans le privé pour ce type d'opération n'apportait pas plus de soin que le public et qu'il s'agissait avant tout d'un biais, d'une vue de l'esprit. A chacun de se faire son opinion.

Astuce utile avant l'opération (-5 jours)

J'avais pris soin de faire changer les verres adaptés à ma vue sur mes lunettes de soleil par les verres d'origine avant l'opération. Vous comprendrez plus tard en quoi c'était très utile.

Opération (3 Mar. 2017, jour J)

Le jour même, bien entendu, venez accompagné. Mon opération était à 15h et j'ai donc pris 1/4 de Lexomil 2h avant (aucun effet ressenti ni visible depuis l'extérieur, grande déception).

Arrivé à la clinique Sourdille, j'ai pu croiser des patients sortant de l'opération, des coques en plastique scotchées sur les yeux. Comme pour le centre d'ophtalmologie, il y a là une organisation du travail exceptionnelle — si seulement il en était de même pour d'autres secteurs... — où la prise en charge est courte et efficace.

On m'appelle, je rentre dans la salle de préparation, on me met une calotte sur la tête, sur les chaussures et une blouse. Puis commencent les gouttes dans les yeux, beaucoup de gouttes. C'est à la fois — de ce que j'ai compris — pour nettoyer et aussi pour anesthésier localement. Enfin on vous badigeonne les paupières supérieures pour désinfecter. Et encore des gouttes, et des gouttes et des gouttes.

Vous apprenez que vous aurez des coques en plastique sur les yeux vous aussi en sortant de l'opération et qu'il faudra les garder jusqu'au lendemain matin, puis les porter chaque nuit pendant 10 jours afin de ne pas vous frotter les yeux la nuit par inadvertance. Pas de sport pendant au moins 1 semaine voir 3 semaines, pas de natation avant 3 semaines pour ne pas risquer une infection. Enfin on vous rappel qu'il ne faudra surtout pas vous frotter les yeux afin de les laisser se cicatriser.

En face de vous, la porte — massive — du bloc opératoire, avec un signe jaune et noir "danger laser". La porte s'ouvre, le patient précédent sort avec deux grosses coques en plastique scotchées sur les yeux et un chirurgien assistant vient vous chercher et c'est à votre tour et vous demande de vous allonger sur le siège présent au milieu de la pièce.

Dans ce qui va suivre, je vais vous partager la manière dont je l'ai vécu, ce que j'ai ressenti, avec mes propres mots. Si des chirurgiens passent par là, je m'excuse d'avance des grandes simplifications et approximations !

Je reprends, la première étape pour le Dr Mehel a donc consisté à me mettre des sortes de demi-sphère en plastique (approximations, remember ?) directement sur les yeux. Il fallait ouvrir les yeux pour que le chirurgien puisse les "encapsuler". Mais on ne touche pas à mes yeux comme ça et malgré mes efforts, impossible de les garder ouvert.

Il est donc passé au plan B, les fameux écarteurs que l'on connaît si bien depuis Orange Mécanique ! Je suis sûr que si vous réfléchissez à faire cette opération, vous avez repensé à cette fameuse scène du film.

Figurez-vous qu'outre la désagréable sensation au début, ce n'était pas tellement douloureux, ça pique un peu mais ce n'est pas du tout insupportable. Il a pu placer les deux "demi-sphères", il y a une impression de brûlure au début mais c'est assez court. Après cela, je n'avais pas l'impression de pouvoir bouger mes yeux (ni eu l'envie de le faire), je me souviens que mon oeil droit était aveugle mais ce n'était pas problématique apparemment.

Le boîtier du laser est ensuite descendu sur mon oeil droit, il touche physiquement l'oeil au point même que ma tête était plus enfoncée encore dans l'appui-tête. La sensation est bizarre mais l'étape est indolore. Puis le laser a fait son office sans que je ne ressente quoi que ce soit.

Ensuite ce fut l'oeil gauche, et là j'ai vu ce qu'il se passait. Si je devais le décrire, je voyais à travers la lentille du laser comme une section de fibre optique, avec plusieurs constellations rouges et une seule constellation verte. J'ai donc observé la partie verte, sans rien sentir, encore une fois.

L'étape du laser n'a pas durée plus d'une minute au total.

Pour la dernière étape, je vais simplement la décrire comme je l'ai vécu. Imaginez un paludier dans les marais salant avec un grand balai en bois. Eh bien j'avais l'impression que le marais étant mon oeil que je voyais depuis sous l'eau, observant ce "balai" récupérer de l'eau sur la surface... ou devrais-je dire dans mon oeil. Il n'y avait rien de désagréable, aucune sensation, simplement une sorte de balai qui passait devant mes yeux.

Enfin après avoir enlevé les "demi-sphères" et les écarteurs, on m'a scotché les fameuses coques de protection sur les yeux et je pouvais sortir de la salle d'opération. Je voyais flou mais je pouvais m'orienter.

Vous sortez ensuite de la salle de préparation avec une enveloppe contenant vos anciennes lunettes, une ordonnance et de la documentation supplémentaire.

Post-opération (+1 heure après l'opération)

Surtout, demandez à la personne qui vous accompagne d'aller chercher le plus rapidement possible les médicaments à la pharmacie. L'ordonnance contient des gouttes à prendre matin, midi et soir, du dafalgan 1G à prendre pendant ~3 jours et d'autres gouttes encore en cas d'irritation. L'erreur que nous avons fait a été de conduire pendant 1h-1h30 de route (aahhhh ces bouchons du vendredi soir à Nantes !) avant d'aller à la pharmacie. En 1h30, l'anesthésie à le temps de diminuer et vous commencez à sentir une vive douleur puis à vous tortiller sans rien pouvoir faire. A chaque fois que j'ouvrais les yeux, c'était comme un torrent de liquide qui en sortait sans que je ne puisse rien y faire, c'est extrêmement désagréable.

Une fois arrivé, direction une chambre dans le noir, goutte et Doliprane 1G. Le temps que les médicaments fassent effet. La douleur était tout de même extrêmement vive et ce n'était clairement pas un des meilleurs moment de ma vie mais vers 20h cela allait déjà mieux, j'ai sauté un repas car tout simplement dans l'incapacité de me déplacer et surtout d'ouvrir à nouveaux les yeux. Les médicaments ont été très efficace, une fois endormi la nuit est passée d'un trait et est venu ensuite le doux moment du réveil.

Là l'expérience est tout simplement incroyable. Vous n'avez plus mal, vous ouvrez les yeux et découvrez que vous voyez parfaitement sans lunette. Quelle joie !

Mais la réalité va vite vous rattraper car l'exposition à la lumière et aux écrans est très vite insoutenable, vous passerez donc la journée avec des lunettes de soleil... d'où l'intérêt d'avoir anticipé le changement en amont. J'ai passé plusieurs jours avec des lunettes de soleil, les halos de lumière sont parfois trop fort et génèrent des maux de tête ; les lunettes de soleil réduisent considérablement le désagrément.

Dès le samedi matin j'étais en mesure de traiter quelques emails et d'assurer un suivi de Redsmin et Image-Charts (avec beaucoup de pauses) sur 1h30.

Ensuite le programme des 3 semaines suivantes est simple : pas de sport, pas d'exposition forte au soleil, les coques de protection chaque nuit pendant 10 nuits, des gouttes 3 fois par jour et d'autres gouttes pour les irritations.

Dernier point : en regardant de plus près mes yeux dans le miroir, j'ai compris que chaque oeil avait eu deux incisions, une en haut (invisible car située sous la paupière supérieure) et une en bas cachée par la paupière inférieure, sauf pour mon oeil gauche pour une raison que j'ignore.

Rendez-vous post-opération (+3 semaines après l'opération)

Le checkpoint habituel au centre d'ophtalmologie, une cartographie de l'oeil et enfin une conclusion par le Dr. Mehel : “10/10 à chaque oeil et cela va encore s'améliorer dans les prochains jours”. A partir de ce moment, je dois l'avouer, on se sent bien.

Ce rendez-vous a coûté 56€. Il n'y en a pas d'autre à prendre avant 3 ans, sauf en cas de problème. Je peux dès à présent recommencer toutes mes activités habituelles (natation, menuiserie, ...) et cela sans aucune limitation.

Conclusion (+3,1 semaines après l'opération)

Au moment où j'écris ces lignes, il m'arrive encore parfois de voir flou de près et c'est tout à fait normal, il faut encore que l'oeil cicatrise et que le cerveau s'habitue à faire le travail qui était assuré auparavant par la correction des lunettes. La conduite de nuit reste désagréable à cause des halos toujours présents mais cela devrait s'estomper avec le temps. Enfin il faut de temps en temps mettre des gouttes pour atténuer l'irritation.

Outre les quelques points négatifs précédents, après 3 semaines de post-opération, la vie est à nouveau "normale" et je redécouvre chaque jour les avantages de la vie sans lunettes !

J'espère que cet article aura répondu à bon nombre de vos questions, sinon, n'hésitez pas à laisser un commentaire !


How to issue and renew Let's Encrypt certificates with OVH DNS API


First thing first, download and install acme.sh.

Create OVH Application

Open https://eu.api.ovh.com/createApp/.

How to issue a Let's Encrypt free SSL certificate

# application key
# application secret

acme.sh --issue -d mydomain.net -d sub1.mydomain.net -d sub2.mydomain.net --dns dns_ovh

If you run this command for the first time you will have to authenticate.

How to renew a Let's Encrypt free SSL certificate

# application key
# application secret

acme.sh --renew -d mydomain.net -d sub1.mydomain.net -d sub2.mydomain.net --dns dns_ovh

What to do in case of INVALID_CREDENTIALS or invalid domain error

If you have this error:

[Wed Mar  8 12:28:08 CET 2017] invalid domain
[Wed Mar  8 12:28:08 CET 2017] Error add txt for domain:_acme-challenge.mydomain.net

Or this error:

[Wed Mar  8 12:28:08 CET 2017] INVALID_CREDENTIALS

I had these issues because I manage multiple domains over multiple OVH account and acme.sh currently does not handle this.

To resolve these issues, edit and remove everything related to the OVH API (OVH_AK and OVH_AS) in the file below:

nano ~/.acme.sh/account.conf

Other issues

Try to follow the guide.


How we reduced by 37% our NodeJS project build time with one line

For Image-Charts, Redsmin and the-to-be-announced-next-SaaS I use Jenkins as the continuous integration system. Lately I discovered that 75% of Image-Charts project build time was related to the dependencies installation part.
I don't like and do not advise to enable caching at the build level because it inherently breaks the principle of repeatable and independent builds thus for every project I work on each build starts with a clean empty cache.

So I wondered how long Image-Charts build would take if we were to replace npm with yarn for the dependencies installation part.

For a medium-sized project like Image-Charts (39 dependencies and 9 dev-dependencies and some native dependencies) switching the installation step to yarn reduced the build time by up to 37% which is really awesome! The next pain point to improve would be a switch from mocha to ava in order to leverage parallel tests execution but that's another story!


How to test Rust projects on CircleCI (one-liner with Docker)

I'm currently adding Rust support to MailChecker thus I had to run the Rust generated project tests on CircleCI. At the time of writing, CircleCI does not support Rust and Rustup setup had an issue with CircleCI. I just wanted to find the easiest way to use cargo test in the CI and the good news is: that's what Docker is good at!

Just add a single line to your circle.yml file and you are good to go, I hope this will help others!


[Fr] Le Prophète en 22 extraits

Le Prophète est un livre du poète libanais Khalil Gibran (1883-1931) publié en 1923 en anglais et qui est devenu un immense succès international traduit dans plus de quarante langues. L’ouvrage combine les sources orientales et occidentales du mysticisme et présente sous une forme poétique questions et réponses sur les thèmes les plus divers posées à un sage qui s’apprête à quitter la ville d’Orphalese où il habitait.
Le genre littéraire adopté rappelle Ainsi parlait Zarathoustra de Nietzsche [...] — Wikipedia

Comme le résume bien Wikipédia, ce livre est une succession de questions et de réponses données par un hypothétique prophète à une foule avant son départ pour le grand large. On notera la transition des thèmes partant de l'amour immatériel, au matériel puis passant par l'élévation de l'âme et pour enfin terminer par la mort. Chaque thème commence par la question d'une personne de la foule et les réponses du "prophète" sont belles par la poésie et la puissance visuelle qu'elles libèrent.

Le prophète

L'amour (Almitra)

"L'amour ne possède rien et ne saurait être possédé, car l'amour suffit à l'amour."

Le Mariage (Almitra)

"Remplissez vos coupes l'un pour l'autre, mais ne buvez pas dans une seule coupe."
"Offrez votre coeur à l'autre, mais ne lui en confiez pas la garde"
"Le chêne et le cyprès ne peuvent croître dans l'ombre l'un de l'autre."

Les enfants (une femme)

"Vous pouvez abriter leurs corps, mais pas leurs âmes,"
"Car leurs âmes habitent la maison de demain, que vous ne pouvez visiter, pas même dans vos rêves."

Le Don (un homme riche)

"Vous donnez peu quand vous donnez vos biens."
"C'est en donnant de vous-mêmes que vous donnez vraiment."

Le boire et le manger (un aubergiste)

"Si seulement vous pouviez vivre du parfum de la terre et, telle une plante aérienne, vous nourrir de la lumière !"

Le Travail (un laboureur)

"Quand vous travaillez, vous êtes une flûte qui transforme le murmure des heures en musique."

La Joie et la Peine (une femme)

"Plus votre peine entaille profondément votre être, plus vous pouvez contenir de joie."
"Quand vous êtes joyeux, sondez les profondeurs de votre coeur, et vous découvrirez que ce qui vous a donné de la peine vous donne à présent de la joie."
"Quand vous êtes tristes, sondez de nouveau votre coeur et vous vous apercevrez qu'en vérité vous pleurez sur ce qui vous a réjoui."

Les Maisons (un maçon)

"Et dites-moi, habitants d'Orphalèse, que détenez-vous dans vos maisons ? Que protégez-vous derrière vos portes verrouillées ?"
"Détenez-vous la paix, cette ferveur sereine qui révèle votre pouvoir ?"
 [...] "Ou bien n'avez-vous que le confort, et le désir du confort, cet intrus qui s'immisce dans la maison en tant qu'invité, avant de devenir un hôte permanent, puis le maître des lieux ?"

Les habits (un tisserand)

 'Vos habits dissimulent une bonne part de votre beauté, mais ne cachent pas votre laideur."
"Et bien que vous recherchiez dans vos vêtements la liberté de l'intimité, il se peut que vous y trouviez un harnais et une chaîne."

L'achat et la vente (un marchant)

Le crime et le châtiment (un juge)

"Souvent je vous ai entendu parler de celui qui a commis une faute comme s'il n'était pas l'un des vôtres, mais un étranger parmi vous et un intrus dans votre monde."
"Et lorsque l'un d'entre vous trébuche, sa chute prévient ceux qui le suivent et les met en garde contre la pierre glissante."
"Le juste n'est pas innocent des forfaits du méchant,"

Les lois (un homme de loi)

La liberté (un orateur)

La raison et la passion (la prêtresse)

"La raison et la passion sont le gouvernail et les voiles de votre âme de marin."
"Car si la raison gouverne sans partage, elle est une force contraignante, tandis que la passion sans contraintes est une flamme qui se dévore elle-meêm jusqu'à l'extinction."

La souffrance (une femme)

La connaissance de soi (un homme)

"Vous voudriez connaître en paroles ce que vous avez toujours connu en pensées."
"Ne dites pas: “J'ai trouvé la vérité“, mais plutôt: “J'ai trouvé une vérité.“"

L'enseignement (un maître)

"S'il [NLDR: Le maître] est vraiment sage, il ne vous invite pas à entrer dans la maison de sa sagesse, mais vous conduit plutôt jusqu'au seuil de votre propre esprit."

L'amitié (un jeune homme)

"Que votre ami vous ouvre son esprit en paroles, vous ne craignez pas le "non" qui survient dans le vôtre ni ne retenez le "oui"."

Le verbe (un érudit)

"Vous parlez quand vous cessez d'être en paix avec vos pensées. Quand vous ne pouvez demeurer plus longtemps dans la solitude de votre coeur, vous vivez sur vos lèvres, et le son qu'elles émettent n'est que distraction et passe-temps."
"Car la pensée est un oiseau de l'espace, qui dans la cage des mots peut déployer ses ailes, mais ne peut pas voler."

Le temps (un astronome)

"Vous voudriez mesurer le temps, lui qui n'a ni mesures ni limites. Vous voudriez ajuster votre conduite et même diriger le cours de votre esprit en fonction des heures et des saisons. [...]

Le bien et le mal (un ancien)

"Vous êtes bons de multiples manières, et quand vous n'êtes pas bons, vous n'êtes pas mauvais pour autant. Vous êtes seulement indolent et paresseux. Quel dommage que le cerf [NDLR: Le prophète] ne puisse enseigner la vitesse à la tortue."

La prière (une prêtresse)

"Vous priez dans la détresse et dans le besoin ; vous devriez aussi prier dans la plénitude de la joie et dans les jours d'abondance."
"Et si vous en êtes réduits à pleurer quand votre âme vous appelle à la prière, elle devrait vous éperonner sans relâche, jusqu'à ce que le rire émerge de vos larmes."
"Quand vous priez, vous vous élevez pour rencontrer en plein ciel ceux qui prient à la même heure, et que vous ne pourriez côtoyer en dehors de la prière."

Le plaisir (un ermite)

La beauté (un poète)

"La beauté n'est pas un besoin mais une extase"
"Elle n'est ni l'image que vous voudriez voir ni le chat que vous souhaiteriez entendre, Mais plutôt l'image que vous voyez en fermant les yeux, le chant que vous entendez en vous bouchant les oreilles"

La religion (un vieux prètre)

"Ai-je parlé d'autre chose aujourd'hui ?"
"La religion n'englobe-t-elle pas tout acte et toute réflexion."

La mort (Almitra)

"Votre peur de la mort n'est que le tremblement du berger, debout devant le roi qui s'apprête à poser la main sur lui pour l'honorer"

Les adieux

"Vous juger en fonction de vos échecs , c'est blâmer les saisons pour leur inconstance."
"Ce qui en vous semble le plus faible et le plus hésitant est en fait le plus fort et le plus déterminé. N'est-ce pas votre souffle qui a érigé et renforcé la structure de vos os ? Et n'est-ce pas un rêve, [...] qui a édifié la ville et façonné tout ce qu'elle abrite ?"

Bref, si c'est votre tasse de thé et que vous avez quelques heures devant vous, allez-y. Oh ! Et pour les plus paresseux le livre a été adapté au cinéma par le réalisateur du Roi Lion :

« »
Made with on a hot august night from an airplane the 19th of March 2017.