MailHog
MailHog (sous licence MIT) permet d’attraper des courriels envoyés par une plate‐forme de développement et de les afficher dans une interface Web. Pour cela, il fournit un serveur SMTP et un remplaçant au binaire sendmail, libre à vous de choisir le moyen qui vous convient le mieux. Il offre également, en option, la possibilité de transférer vers un vrai serveur SMTP les courriels et un outil de type chaos-monkey pour tester les cas d’erreurs d’envoi de courriels.
Je m’en sers quand je développe sur la partie serveur de Cozy Cloud. Cela permet de tester des fonctionnalités qui nécessitent l’envoi de courriels sans avoir à se compliquer la vie à configurer un vrai serveur d’envoi de courriels. En bonus, on évite de prendre le risque d’envoyer des courriels vers de vrais comptes d’autres personnes et on ne perd pas de temps à attendre que le courriel arrive, en attente d’un traitement anti‐pourriel.
Tokei
Pour estimer la taille d’un projet, le nombre de lignes de code peut être une métrique intéressante. Il existe plusieurs projets pour faire ça, celui que je trouve le plus pratique est Tokei (sous licence Apache ou MIT). Voici ce qu’il affiche pour le dépôt principal de code de LinuxFr.org :
-------------------------------------------------------------------------------
Language Files Lines Code Comments Blanks
-------------------------------------------------------------------------------
CoffeeScript 10 770 642 31 97
Dockerfile 1 70 49 4 17
HTML 24 2660 2161 4 495
JavaScript 11 2686 2025 394 267
Markdown 1 187 187 0 0
Rakefile 2 33 24 3 6
Ruby 262 11593 8338 1500 1755
Ruby HTML 1 47 46 0 1
Sass 47 27317 23467 1583 2267
Shell 4 68 50 4 14
SVG 41 10886 10865 17 4
TeX 1 53 43 0 10
Plain Text 44 531 531 0 0
XML 1 11 11 0 0
YAML 4 173 160 4 9
-------------------------------------------------------------------------------
Total 454 57085 48599 3544 4942
-------------------------------------------------------------------------------
Par rapport à cloc, Tokei a plusieurs avantages :
- il est beaucoup plus rapide (0,03 seconde pour Tokei contre 3,2 secondes pour cloc sur le dépôt principal de LinuxFr.org) ;
- il est plus précis : cloc utilise des expressions rationnelles, alors que Tokei a de vrais analyseurs (en particulier, un début de commentaire dans une chaîne de caractères comme
printf("/*")
peut bien induire en erreur cloc) ;
- il ignore par défaut les fichiers listés dans
.gitignore
(par exemple, quand j’ai lancé cloc sur l’exemple ci‐dessus, il a compté les fichiers dans tmp/cache
et j’ai dû le relancer avec des options pour qu’il fasse ce que j’en attendais).
Pandoc
Il existe de nombreux langages de balisage : HTML, Markdown, reStructuredText, textile, DocBook, <img style="display: inline; max-height: 1em;" class="mathjax" src="data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlu%0AayIgc3R5bGU9IndpZHRoOiA1LjE0M2V4OyBoZWlnaHQ6IDIuMTQzZXg7IHZl%0AcnRpY2FsLWFsaWduOiAtMC41NzFleDsgbWFyZ2luLXRvcDogMXB4OyBtYXJn%0AaW4tcmlnaHQ6IDBweDsgbWFyZ2luLWJvdHRvbTogMXB4OyBtYXJnaW4tbGVm%0AdDogMHB4OyBwb3NpdGlvbjogc3RhdGljOyAiIHZpZXdCb3g9Ii0zIC03MDUu%0ANjc2NTIwODk5NjM0MiAyMTg5LjU3Nzc3NzIxMDkxMyA5NDcuMjExNjQ0MTU0%0ANzg5MyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVm%0AcyBpZD0iTWF0aEpheF9TVkdfZ2x5cGhzIj48cGF0aCBpZD0iU1RJWFdFQk1B%0ASU5JLTRDIiBzdHJva2Utd2lkdGg9IjEwIiBkPSJNNTU5IDE4MGwtNTggLTE4%0AMGgtNTA5djE2YzU2IDYgNjQgMTUgODIgNzhsMTIyIDQzOGM4IDI3IDExIDQ3%0AIDExIDYyYzAgMjkgLTE1IDM5IC03NyA0M3YxNmgyNzN2LTE2Yy02MCAtNCAt%0AODUgLTIwIC0xMDEgLTc3bC0xMjAgLTQyOWMtNiAtMjMgLTEwIC00MCAtMTAg%0ALTU0YzAgLTMxIDIzIC00MSAxMDUgLTQxYzEwMCAwIDEzMSA1IDE4MCAzOGMz%0AMiAyMSA1NCA1NCA4MiAxMTJaIj48L3BhdGg+PHBhdGggaWQ9IlNUSVhXRUJN%0AQUlOSS00MSIgc3Ryb2tlLXdpZHRoPSIxMCIgZD0iTTU2NCAwaC0yNDV2MTZj%0ANjMgMyA3NyAxOSA3NyA1M2MwIDggLTEgMTcgLTIgMjZsLTIwIDEzMWgtMjIw%0AbC01OSAtMTExYy0xNCAtMjYgLTIyIC01MCAtMjIgLTY2YzAgLTE5IDE1IC0z%0AMSA2MiAtMzN2LTE2aC0xODZ2MTZjNDYgOSA1OSAyNiAxMzQgMTU2bDI4NSA0%0AOTZoMjZsOTIgLTU1M2MxNCAtODQgMjUgLTk1IDc4IC05OXYtMTZ6TTM2OSAy%0ANjJsLTQ1IDI2M2wtMTQ5IC0yNjNoMTk0WiI+PC9wYXRoPjxwYXRoIGlkPSJT%0AVElYV0VCTUFJTkktNTQiIHN0cm9rZS13aWR0aD0iMTAiIGQ9Ik02MzMgNjUz%0AbC00NCAtMTY0bC0xNyAyYzIgMTcgMyAzMyAzIDQ2YzAgNTMgLTM2IDgxIC0x%0AMDEgODFoLTU4bC0xMzcgLTQ5MGMtNiAtMjEgLTE0IC00NCAtMTQgLTY2YzAg%0ALTMxIDEyIC0zOSA1MyAtNDNsMzUgLTN2LTE2aC0yODh2MTZjNjkgNiA5MiAy%0AMSAxMDcgNzVsMTQzIDUyN2MtMTU4IDAgLTE5MCAtMTYgLTIzOCAtMTI0bC0x%0AOCA0bDQyIDE1NWg1MzJaIj48L3BhdGg+PHBhdGggaWQ9IlNUSVhXRUJNQUlO%0ASS00NSIgc3Ryb2tlLXdpZHRoPSIxMCIgZD0iTTYzNCA2NTNsLTMxIC0xNTRs%0ALTIyIDJjMiAxNyAzIDMzIDMgNDZjMCA2MCAtMzUgNzMgLTE5MiA3M2MtNTcg%0AMCAtNjcgLTQgLTczIC0yNmwtNjYgLTIzM2g3OGM5MCAwIDEwMSAxMiAxMzkg%0AOTdsMTggLTRsLTY4IC0yMzJsLTIwIDVjNSAyMiA3IDM0IDcgNTJjMCAxNyAt%0AMiAyNiAtNyAzMWMtMTEgMTAgLTM4IDE1IC03OCAxNWgtNzhsLTMyIC0xMTJj%0ALTI1IC04OCAtMzYgLTEzNCAtMzYgLTE0NmMwIC0yNCAyMyAtMzQgNzkgLTM0%0AIGM5OCAwIDE1MiAxMiAyMDMgMzljMzIgMTcgNTYgNDUgOTQgOThsMTYgLThs%0ALTYyIC0xNjJoLTUwN3YxNmM1NiAxMCA2NSAxNiA4MSA3NGwxMjMgNDQyYzYg%0AMjAgMTEgNTIgMTEgNjRjMCAyNyAtMTUgMzUgLTc3IDQxdjE2aDQ5N1oiPjwv%0AcGF0aD48cGF0aCBpZD0iU1RJWFdFQk1BSU5JLTU4IiBzdHJva2Utd2lkdGg9%0AIjEwIiBkPSJNNjU1IDY1M3YtMTZjLTQzIC0xNCAtNzUgLTM3IC0xMjUgLTk1%0AbC0xNjkgLTE5NGwxMDEgLTI1NWMyNCAtNjAgMzcgLTY5IDEwNSAtNzd2LTE2%0AaC0yNzF2MTZjNjAgMSA3NyAxMyA3NyAzN2MwIDEzIC02IDMxIC0xNCA1MWwt%0ANjcgMTY1bC0xNTEgLTE3MmMtMTQgLTE2IC0yMyAtMzQgLTIzIC00OGMwIC0y%0AMiAxOCAtMzMgNjYgLTMzdi0xNmgtMjEzdjE2YzU2IDEwIDgzIDQwIDIyMCAy%0AMDBsODMgOTdsLTEwMyAyNTUgYy0xOSA0OCAtMzcgNjQgLTk1IDY5djE2aDI2%0AM3YtMTZjLTU1IC03IC03MSAtMTYgLTcxIC00MWMwIC0xMyA1IC0yOSAxNiAt%0ANTZsNTkgLTE0N2wxNDUgMTY3YzE0IDE2IDIxIDMxIDIxIDQzYzAgMTkgLTE4%0AIDMyIC02MSAzNHYxNmgyMDdaIj48L3BhdGg+PC9kZWZzPjxnIHN0cm9rZT0i%0AYmxhY2siIGZpbGw9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjAiIHRyYW5zZm9y%0AbT0ibWF0cml4KDEgMCAwIC0xIDAgMCkiPjx1c2UgaHJlZj0iI1NUSVhXRUJN%0AQUlOSS00QyIgeGxpbms6aHJlZj0iI1NUSVhXRUJNQUlOSS00QyI+PC91c2U+%0APGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjM5LDApIj48dXNlIHRyYW5zZm9y%0AbT0ic2NhbGUoMC43MDcxMDY3ODExODY1NDc2KSIgaHJlZj0iI1NUSVhXRUJN%0AQUlOSS00MSIgeD0iMCIgeT0iMjk2IiB4bGluazpocmVmPSIjU1RJWFdFQk1B%0ASU5JLTQxIj48L3VzZT48L2c+PHVzZSBocmVmPSIjU1RJWFdFQk1BSU5JLTU0%0AIiB4PSI1MDQiIHk9IjAiIHhsaW5rOmhyZWY9IiNTVElYV0VCTUFJTkktNTQi%0APjwvdXNlPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwMDIsMCkiPjx1c2Ug%0AaHJlZj0iI1NUSVhXRUJNQUlOSS00NSIgeD0iMCIgeT0iLTIxNiIgeGxpbms6%0AaHJlZj0iI1NUSVhXRUJNQUlOSS00NSI+PC91c2U+PC9nPjx1c2UgaHJlZj0i%0AI1NUSVhXRUJNQUlOSS01OCIgeD0iMTUyNiIgeT0iMCIgeGxpbms6aHJlZj0i%0AI1NUSVhXRUJNQUlOSS01OCI+PC91c2U+PC9nPjwvc3ZnPg==%0A" alt="\LaTeX">
, MediaWiki markup, OrgMode, EPUB, etc. Et ces langages ont parfois plusieurs variantes (exemple : CommonMark et GitHub Flavored Markdown pour le Markdown). Bref, ce n’est pas toujours facile de connaître les différents langages et de passer de l’un à l’autre. Pandoc (sous licence GPL v2 ou plus) permet de convertir un texte de la plupart de ces langages vers un autre langage, ou d’autres choses comme du PDF ou de l’OpenDocument.
Je m’en sers, par exemple, pour écrire des présentations en Markdown et en générer une version PDF via la classe Beamer pour <img style="display: inline; max-height: 1em;" class="mathjax" src="data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlu%0AayIgc3R5bGU9IndpZHRoOiA1LjE0M2V4OyBoZWlnaHQ6IDIuMTQzZXg7IHZl%0AcnRpY2FsLWFsaWduOiAtMC41NzFleDsgbWFyZ2luLXRvcDogMXB4OyBtYXJn%0AaW4tcmlnaHQ6IDBweDsgbWFyZ2luLWJvdHRvbTogMXB4OyBtYXJnaW4tbGVm%0AdDogMHB4OyBwb3NpdGlvbjogc3RhdGljOyAiIHZpZXdCb3g9Ii0zIC03MDUu%0ANjc2NTIwODk5NjM0MiAyMTg5LjU3Nzc3NzIxMDkxMyA5NDcuMjExNjQ0MTU0%0ANzg5MyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVm%0AcyBpZD0iTWF0aEpheF9TVkdfZ2x5cGhzIj48cGF0aCBpZD0iU1RJWFdFQk1B%0ASU5JLTRDIiBzdHJva2Utd2lkdGg9IjEwIiBkPSJNNTU5IDE4MGwtNTggLTE4%0AMGgtNTA5djE2YzU2IDYgNjQgMTUgODIgNzhsMTIyIDQzOGM4IDI3IDExIDQ3%0AIDExIDYyYzAgMjkgLTE1IDM5IC03NyA0M3YxNmgyNzN2LTE2Yy02MCAtNCAt%0AODUgLTIwIC0xMDEgLTc3bC0xMjAgLTQyOWMtNiAtMjMgLTEwIC00MCAtMTAg%0ALTU0YzAgLTMxIDIzIC00MSAxMDUgLTQxYzEwMCAwIDEzMSA1IDE4MCAzOGMz%0AMiAyMSA1NCA1NCA4MiAxMTJaIj48L3BhdGg+PHBhdGggaWQ9IlNUSVhXRUJN%0AQUlOSS00MSIgc3Ryb2tlLXdpZHRoPSIxMCIgZD0iTTU2NCAwaC0yNDV2MTZj%0ANjMgMyA3NyAxOSA3NyA1M2MwIDggLTEgMTcgLTIgMjZsLTIwIDEzMWgtMjIw%0AbC01OSAtMTExYy0xNCAtMjYgLTIyIC01MCAtMjIgLTY2YzAgLTE5IDE1IC0z%0AMSA2MiAtMzN2LTE2aC0xODZ2MTZjNDYgOSA1OSAyNiAxMzQgMTU2bDI4NSA0%0AOTZoMjZsOTIgLTU1M2MxNCAtODQgMjUgLTk1IDc4IC05OXYtMTZ6TTM2OSAy%0ANjJsLTQ1IDI2M2wtMTQ5IC0yNjNoMTk0WiI+PC9wYXRoPjxwYXRoIGlkPSJT%0AVElYV0VCTUFJTkktNTQiIHN0cm9rZS13aWR0aD0iMTAiIGQ9Ik02MzMgNjUz%0AbC00NCAtMTY0bC0xNyAyYzIgMTcgMyAzMyAzIDQ2YzAgNTMgLTM2IDgxIC0x%0AMDEgODFoLTU4bC0xMzcgLTQ5MGMtNiAtMjEgLTE0IC00NCAtMTQgLTY2YzAg%0ALTMxIDEyIC0zOSA1MyAtNDNsMzUgLTN2LTE2aC0yODh2MTZjNjkgNiA5MiAy%0AMSAxMDcgNzVsMTQzIDUyN2MtMTU4IDAgLTE5MCAtMTYgLTIzOCAtMTI0bC0x%0AOCA0bDQyIDE1NWg1MzJaIj48L3BhdGg+PHBhdGggaWQ9IlNUSVhXRUJNQUlO%0ASS00NSIgc3Ryb2tlLXdpZHRoPSIxMCIgZD0iTTYzNCA2NTNsLTMxIC0xNTRs%0ALTIyIDJjMiAxNyAzIDMzIDMgNDZjMCA2MCAtMzUgNzMgLTE5MiA3M2MtNTcg%0AMCAtNjcgLTQgLTczIC0yNmwtNjYgLTIzM2g3OGM5MCAwIDEwMSAxMiAxMzkg%0AOTdsMTggLTRsLTY4IC0yMzJsLTIwIDVjNSAyMiA3IDM0IDcgNTJjMCAxNyAt%0AMiAyNiAtNyAzMWMtMTEgMTAgLTM4IDE1IC03OCAxNWgtNzhsLTMyIC0xMTJj%0ALTI1IC04OCAtMzYgLTEzNCAtMzYgLTE0NmMwIC0yNCAyMyAtMzQgNzkgLTM0%0AIGM5OCAwIDE1MiAxMiAyMDMgMzljMzIgMTcgNTYgNDUgOTQgOThsMTYgLThs%0ALTYyIC0xNjJoLTUwN3YxNmM1NiAxMCA2NSAxNiA4MSA3NGwxMjMgNDQyYzYg%0AMjAgMTEgNTIgMTEgNjRjMCAyNyAtMTUgMzUgLTc3IDQxdjE2aDQ5N1oiPjwv%0AcGF0aD48cGF0aCBpZD0iU1RJWFdFQk1BSU5JLTU4IiBzdHJva2Utd2lkdGg9%0AIjEwIiBkPSJNNjU1IDY1M3YtMTZjLTQzIC0xNCAtNzUgLTM3IC0xMjUgLTk1%0AbC0xNjkgLTE5NGwxMDEgLTI1NWMyNCAtNjAgMzcgLTY5IDEwNSAtNzd2LTE2%0AaC0yNzF2MTZjNjAgMSA3NyAxMyA3NyAzN2MwIDEzIC02IDMxIC0xNCA1MWwt%0ANjcgMTY1bC0xNTEgLTE3MmMtMTQgLTE2IC0yMyAtMzQgLTIzIC00OGMwIC0y%0AMiAxOCAtMzMgNjYgLTMzdi0xNmgtMjEzdjE2YzU2IDEwIDgzIDQwIDIyMCAy%0AMDBsODMgOTdsLTEwMyAyNTUgYy0xOSA0OCAtMzcgNjQgLTk1IDY5djE2aDI2%0AM3YtMTZjLTU1IC03IC03MSAtMTYgLTcxIC00MWMwIC0xMyA1IC0yOSAxNiAt%0ANTZsNTkgLTE0N2wxNDUgMTY3YzE0IDE2IDIxIDMxIDIxIDQzYzAgMTkgLTE4%0AIDMyIC02MSAzNHYxNmgyMDdaIj48L3BhdGg+PC9kZWZzPjxnIHN0cm9rZT0i%0AYmxhY2siIGZpbGw9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjAiIHRyYW5zZm9y%0AbT0ibWF0cml4KDEgMCAwIC0xIDAgMCkiPjx1c2UgaHJlZj0iI1NUSVhXRUJN%0AQUlOSS00QyIgeGxpbms6aHJlZj0iI1NUSVhXRUJNQUlOSS00QyI+PC91c2U+%0APGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjM5LDApIj48dXNlIHRyYW5zZm9y%0AbT0ic2NhbGUoMC43MDcxMDY3ODExODY1NDc2KSIgaHJlZj0iI1NUSVhXRUJN%0AQUlOSS00MSIgeD0iMCIgeT0iMjk2IiB4bGluazpocmVmPSIjU1RJWFdFQk1B%0ASU5JLTQxIj48L3VzZT48L2c+PHVzZSBocmVmPSIjU1RJWFdFQk1BSU5JLTU0%0AIiB4PSI1MDQiIHk9IjAiIHhsaW5rOmhyZWY9IiNTVElYV0VCTUFJTkktNTQi%0APjwvdXNlPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwMDIsMCkiPjx1c2Ug%0AaHJlZj0iI1NUSVhXRUJNQUlOSS00NSIgeD0iMCIgeT0iLTIxNiIgeGxpbms6%0AaHJlZj0iI1NUSVhXRUJNQUlOSS00NSI+PC91c2U+PC9nPjx1c2UgaHJlZj0i%0AI1NUSVhXRUJNQUlOSS01OCIgeD0iMTUyNiIgeT0iMCIgeGxpbms6aHJlZj0i%0AI1NUSVhXRUJNQUlOSS01OCI+PC91c2U+PC9nPjwvc3ZnPg==%0A" alt="\LaTeX">
. Ça m’a également servi, par le passé, pour convertir un wiki d’un format à un autre.