8/19/2017

[Fr] Il décide de réaliser une table démontable en bois de palette en 1 weekend, vous n'imaginerez jamais ce qu'il s'est passé ensuite

⭐️ Avant de commencer cher lecteur, n'hésite pas à choisir le niveau de sémantique souhaité pour lire cet article.

🎓 Ce billet est écrit en StretchText, concept que j'avais déjà développé en 2014 (plus d'informations ici) et que je reprends ici mais cette fois-ci en exposant le choix de la sémantique au lecteur au lieu que d'exposer le choix sur la profondeur de l'information.

Publier un billet avec un titre putaclic, check 👌.

Sortons un instant du monde aseptisé high-tech et revenons au monde physique. L'idée de ce billet est de partager les erreurs et les succès liés au projet de création d'une table à manger... en bois de palette... en un weekend, rien que ça !

J'ai toujours aimé travailler le bois. Tout petit, une fois la journée d'école terminée, je descendais dans l'atelier de mon grand-père (décédé depuis peu) pour y travailler en sa compagnie. Je clouais tout ce qui me passait sous la main et ma plus grande réalisation — à date — avait été un traîneau de Père Noël de la longueur d'une voiture break. Ce projet de table est l'occasion parfaite d'un retour aux sources et au plaisir de travailler à nouveau le bois.

Un retour aux sources qui d'ailleurs est assez récent...

A la recherche de la parfaite table à manger

Fraîchement installé dans le centre de Rennes, il manquait à mon salon une table à manger. Après moult recherches sur l'inter-web et des pins anticipés sur Pinterest, je découvre enfin le saint graal, chez Ligne-roset. La table parfaite, réunissant robustesse, légèreté, esthétisme et praticité !

Mais (car il y a toujours un mais) elle était bien trop grande pour pouvoir entrer par l'escalier. L'appartement étant dans un immeuble historique, il est sans ascenseur. La location d'une monte meuble était alors nécessaire... bref... beaucoup trop de paperasse pour si peu !

Sans perdre espoir et aspirant manger autrement que debout, je décidai donc de réserver le weekend suivant à la réalisation d'une table (... et d'une chaise). Mais pas n'importe quelle table...

C'était ambitieux, rendons cela impossible

La design de la table devait répondre à plusieurs contraintes :

  • La première était temporelle, il fallait réaliser la table en un weekend afin de pouvoir... tout simplement l'utiliser et arrêter de manger debout.
  • La seconde était que la table devait être démontable en 6 pièces : 4 pieds, 1 cadre et 1 plateau — bref, interopérable et modulaire par design (déformation professionnelle) — afin d'être transportable dans une voiture entre l'atelier (si l'on considère que travailler dehors, sur du bitume, est un atelier) et l'appartement.
  • La table devait être réalisée en bois de palette parce que... j'avais accumulé un petit stock, les réalisations précédentes aidant. En cas d'échec du projet seul mon temps aurait été gaspillé, l'erreur était donc autorisée, ce qui n'est pas sans importance lorsque l'on a jamais construit de table de sa vie !

Dès cette étape, séparer le cadre de la table de son plateau était fondamental. Il permettait de rendre le plateau de la table interchangeable et donc de gagner énormément de temps sur la réalisation de sa première version. Cette approche me permettait des évolutions futures à faible coût d'huile de coude. La première version du plateau se devait simplement d'être fonctionnelle. Je pourrais ensuite à loisir créer de nouveaux plateaux plus esthétiques.

Premier weekend - le cadre

Le cadre devait avoir pour dimension 150cm L x 95cm l. Les planches de palette ont donc d'abord été rabotées (un Ryobi) puis poncées (avec une ponceuse excentrique Bosch PEX 400) et enfin découpées à la scie circulaire (avec une Bosch PTS 10 dont je suis très satisfait !)

Ce qui est assez embêtant avec le bois de récupération c'est que les planches ont parfois déjà beaucoup travaillé et deviennent tordu, il faudrait utiliser une dégauchisseuse (comme celle-ci par exemple) pour les remettre droites, mais Rome — comprendre : la complétude du matériel dans l'atelier — ne s'est pas construite en un jour !

Bref. Pour gagner du temps, j'avais acheté des équerres (comme celle-ci et celle-ci) afin de réduire au maximum le travail du bois en prévoyant que la suite allait être beaucoup moins facile (avec le recul, c'était un bon point d'anticipé !)

J'aurais préféré réaliser directement les joints en bois mais cela sera pour une prochaine fois !

Après quelques ajustements, le cadre était fin prêt!

Premier weekend toujours (\o/) les pieds

Là ça se complique, il faut aller vite, utiliser les outils à disposition, avoir si possible un rendu assez design, tout en garantissant la solidité de la structure.

Malheureusement n'ayant pas de poutre en bois adéquate sous la main, j'ai décidé de faire une entrave à la règle du "tout-en-palette" d'aller m'approvisionner au Mr Bricolage du coin.

Soyons franc, le plan initial était somme toute très simple...

Mais il s'est avéré être trop classique et difficilement réalisable avec les outils à disposition dans le temps imparti.

Par contre, en utilisant la scie circulaire à bon escient, les 4 pieds ont pu être découpés en croix avec une particularité esthétique. L'idée était de former une pyramide sur la base de la croix et une fois le cadre de la table imbriqué que le cadre donne l'impression d'être en lévitation au dessus de la pyramide (avec 2mm d'espace).

Et hop ! Le tour est joué !

Plusieurs pistes d'amélioration à ce stade :

  • Des triangles en bois ou en acier aurait pu être vissés au dessus des coins du cadre afin d'assurer plus de robustesse à la structure.
  • L'imbrication des pieds a été réalisée au cas par cas. Les pieds sont donc numérotés pour tenir compte des quelques millimètres de différence au niveau des angles du cadre. Ce n'est pas parfait mais ça permet d'assurer une stabilité de la table au millimètre près.
  • Avec suffisamment de temps j'aurais pu réaliser un tour à bois de fortune et créer un peu de style aux niveaux des pieds... Mais le temps étant le facteur limitant de ce projet, oublions cela pour l'instant.

Malheureusement un problème insurmontable pointait le bon de son nez. Le weekend touchait à sa fin. Plutôt que de bâcler le plateau, j'ai préféré me résigner et attendre une semaine de plus — augmentant par la même ma motivation 😏 -. Une semaine plus tard, le second acte pouvait commencer.

Acte second - Le plateau

La seconde étape a d'abord consisté à sélectionner des planches pas trop pourries (ce qui concernait la majorité du stock). Puis d'une longueur suffisante. On notera l'usage de serre-joints Wolfcraft qui sont toujours un réel plaisir à utiliser, c'est clairement l'un des meilleurs achats que j'ai pu faire dans le domaine !

La bonne astuce a été de les numéroter afin de pouvoir retourner le plateau intégralement sans se tromper dans l'ordre des planches.

Visse moi ça

Vient ensuite l'étape du vissage avec une Bosch PSB 1800 dont je suis franchement super satisfait. Pour cela, j'ai coupé en deux grâce à la scie circulaire une planche, puis je l'ai placée sur la tranche pour assurer un maintien rigide au niveau des deux longueurs du cadre. Ensuite, une à une, j'ai bloqué les planches à fixer au plateau par le dessous grâce à un serre-joint (afin d'assurer qu'elles touchent bien le cadre) tout en bloquant la planche de maintien du plateau.

Les vis utilisées étaient de 60mm pour cette opération. Les 35mm ont été utilisées pour fixer les équerres. Des pointes n'auraient pas suffit elles n'ont pas un caractère bloquant.

Ici l'erreur que j'ai faite a été de ne pas prendre le temps de poncer les planches avant de les visser. J'en étais conscient au moment du vissage parce que je voulais vérifier que tout s'imbriquait bien avant de passer à l'étape de ponçage. Encore une fois, la gestion du temps était clé et il était hors de question de passer un weekend supplémentaire à l'ouvrage.

La découpe

L'astuce est de créer une règle en bois, de la bloquer avec des serre-joints et de l'utiliser pour guider la découpe de la scie sauteuse (il s'agit d'une scie sauteuse 750W Titan). Le résultat était déjà très propre !

Égalise moi tout ça (au rabot) !

Comme toutes les planches n'avaient pas la même épaisseur, il fallait égaliser. Un bon coup de rabot pour enlever les millimètres en trop et hop, plus aucune différence !

Le ponçage - start game

A ce moment là du projet, je n'avais qu'une petite ponceuse excentrique, je savais qu'une ponceuse à bande était l'outil adéquat mais je ne pensais pas encore en faire l’acquisition. J'ai vite déchanté...

Outre le fait que le ponçage soit très très lent, le processus était peu efficace, même avec un grain de 40. La puissance de la ponceuse était trop faible pour la tâche, il était temps de passer au niveau supérieur.

Après 1 heure de ponçage long et imparfait s'en était trop

Le ponçage - god mode

Cette ponceuse, c'est un peu la grosse bertha. Quand on la sort, c'est 750 Watts (Bosch PBS 75 AE) pour clore instantanément tout débat. Dans le mille.

En moins de 15 minutes, le plateau était intégralement poncé avec une bande de 36... du 36 ! Quelques dizaines de minutes plus tard c'était au tour de la bande de 80 et pour terminer la bande de 120. A cette étape le plateau et ses bords sont uniformes et il ne s'agit que de finition.

Malheureusement je n'ai pas trouvé de bande de 240 pour assurer une finition et un polissage parfaits mais le résultat était déjà satisfaisant pour un premier jet. Nous dirons qu'il s'agit là du MVP en attendant une v1 !

Un dernier passage avec la ponceuse excentrique et un disque de 120 et il ne restait plus que l'étape du huilage.

L'huile

Pour l'huile (Huile et protection V33, 0.5 L, miel, fabriqué en France)j'avais choisi du "Miel mat" (A+ au niveau de la qualité de l'air), mais c'est surtout une question de goût. Avec le recul, j'aurais peut-être dû prendre Chêne foncé mais cela sera pour un prochain plateau !

Après deux couches et 2h de séchage entre chaque, le résultat était impeccable !

Le weekend se terminait, s'ensuivit un démontage et 2h de route. J'ai pu installé comme prévu la table dans l'appartement avec un résultat qui — je trouve — valait la peine d'attendre 2 semaines !

Packshot

Il ne me restait plus bien entendu qu'à prendre une photo en mode hipster-stagram et la boucle était bouclée !

Tu as lu jusqu'ici ? Bravo 🎉 et merci 🙏 ! N'hésite pas à suivre mes trouvailles et réalisations DIY/Craft/Maker sur Pinterest et Instagram.


[Mise à jour] 2 weekends plus tard c'est toute l'équipe de KillBug qui l'utilise pour travailler !

8/17/2017

Free custom pixel tracking with Google Spreadsheet

I think this is one of the simplest*, serverless™*, free forever, way to build a pixel tracker.

  • Create a new Google Spreadsheet
  • Tools > Script editor...
  • Copy/paste the code below
  • Publish > Deploy as web app...
  • Use the generated link inside an <img src="PASTE_URL_HERE"/>
  • Enjoy.
function doGet(e) {
  if(!e.parameter.id){throw new Error('Query parameter "id" is required')}
  var as=SpreadsheetApp.getActiveSpreadsheet();
  (as.getSheetByName('logs') || as.insertSheet('logs')).appendRow([new Date().toISOString().substring(0, 16).replace('T', ' '), e.parameter.id,  HtmlService.getUserAgent()]);
  return HtmlService.createHtmlOutput('http://blog.fgribreau.com/2017/08/free-pixel-tracker-with-google-spreadsheet.html');
}

* yes, you could also use the pixel tracker from Google Analytics.
* yes, it's a troll.

4/23/2017

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:

gitlab-ci-validate-watch

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.

gitlab-ci-validate
{
  "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.

4/06/2017

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:";
    return;
  else
    args='--filter "*/docker-compose.yml"' && [[ $1 ]] && args=$@;
  fi
  eval watchexec --restart $args -w $(pwd) "docker-compose up"
}

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

Usage:

docker-compose-watch --help
OPTIONS:
    -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.

4/04/2017

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.

4/03/2017

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:

deploy:clevercloud:
  image: node:6-wheezy
  stage: deploy
  only:
    - /master/
  script:
    - 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.

3/25/2017

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 !

3/08/2017

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

Acme.sh

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
export OVH_AK="APPLICATION_KEY"
# application secret
export OVH_AS="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
export OVH_AK="APPLICATION_KEY"
# application secret
export OVH_AS="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.

1/30/2017

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!

1/28/2017

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!


1/02/2017

[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.
http://bit.ly/1II1u5L