Blog

À propos

Une représentation graphique de Teal'c et le colonel O'Neil devant la porte des étoiles avec le vortex ouvert. Le colonel fait du golf. Image génrée par IA

Live blog coding et amusement en golang

2025-05-27T15:55:27Z

On dit souvent que pour se motiver à lancer (et surtout finir) un projet, le mieux c’est de le faire en live, avec du public. Apparemment, ça pousse à aller jusqu’au bout. C’est en tout cas ce que je remarque chez pas mal de devs-influenceurs que je suis sur YouTube.

Bon, moi j’ai clairement pas leur audience et spoiler : je compte pas me filmer en train de coder pendant 3 heures.

Du coup, j’ai eu une idĂ©e qui me correspond mieux : je vais essayer d’écrire un article en mĂȘme temps que je bosse sur mon projet. Une sorte de journal de bord, en mode « devlog maison ». On verra bien ce que ça donne !

Le besoin

J’auto-hĂ©berge quelques projets persos sur un Raspberry Pi, y compris ce blog d’ailleurs. Franchement, ça marche super bien, et ça me permet de m’éclater un peu avec la gestion de serveur, le dĂ©ploiement, tout ça.

Le seul vrai souci que j’ai rencontrĂ©, c’est cette histoire d’IP dynamique. Alors oui, avec nos box actuelles, les IP ont tendance Ă  rester stables pas mal de temps
 mais ce la n'est pas garanti.

DerniĂšrement, j’ai eu la « chance » d’avoir mon IP changĂ©e plusieurs fois en une seule semaine, alors qu'elle Ă©tait stable depuis des mois. Et devoir mettre Ă  jour les enregistrements DNS Ă  la main, c’est clairement pas fun. Surtout que pour connaĂźtre la nouvelle IP, faut ĂȘtre chez soi. Pratique, hein ?

Ce qu’il me faudrait, c’est un petit script qui vĂ©rifie rĂ©guliĂšrement si mon IP a changĂ©, et qui met Ă  jour mes DNS direct chez le registrar. Automatiser un peu tout ça, quoi.

Par chance, mon registrar est OVH. Et mĂȘme si pas mal de monde aime rĂąler sur leurs offres ou certaines dĂ©cisions techniques, personellement je trouve qu’ils font vraiment des efforts pour filer un coup de main aux devs.

Petit flashback : en 2021, quand le data center de Strasbourg a pris feu, plein de sites hĂ©bergĂ©s chez OVH sont tombĂ©s en rade. Je vais pas relancer le dĂ©bat sur les backups, c’est pas le sujet ici, mais forcĂ©ment, tout le monde cherchait Ă  remettre son site en ligne au plus vite. Sauf que l’interface web (le fameux manager) Ă©tait complĂštement saturĂ©e.

C’est lĂ  que je suis tombĂ© sur un article de wikitwist.com qui parlait de cet Ă©vĂ©nement... mais sous un angle un peu diffĂ©rent : celui de l’API d’OVH. Et franchement, elle est super bien conçue et trĂšs bien documentĂ©e. Elle permet, entre autres, de gĂ©rer ses enregistrements DNS. Du coup, je me suis dit : pourquoi ne pas en profiter pour automatiser un peu tout ça ?

l'article de wikitwist sur l'API d'OVH

Le plan

Mon FAI ne m’aide pas vraiment Ă  rĂ©cupĂ©rer facilement mon IP publique (en IPv4), du coup j’ai dĂ» trouver une autre solution pour connaĂźtre mon adresse depuis l’extĂ©rieur. Je pourrais tout simplement interroger un service en ligne qui me retourne mon IP, y’en a plein. Mais bon... les solliciter en boucle, ça me gĂȘne un peu, surtout quand on sait pas trop ce qu’ils font des infos qu’on leur envoie.

Heureusement, j’ai dĂ©jĂ  un serveur externe (VPS chez OVH), en dehors de mon rĂ©seau local. Et faire un petit script PHP pour qu’il affiche mon IP, franchement, c’est pas plus compliquĂ© que quelques lignes. Du coup, j’ai dĂ©cidĂ© de crĂ©er cette premiĂšre brique que j’ai appelĂ©e "KIP", un petit jeu de mots entre “keep” et “IP”. J’aime bien, ça sonne comme l'acronyme KISS.

Ensuite, la seconde partie : un script qui va chercher cette IP, la compare avec celle qu’il a en mĂ©moire, et si jamais elle a changĂ©, il met Ă  jour les DNS via l’API d’OVH. Et comme j’ai trĂšs envie de me mettre sĂ©rieusement Ă  Go, je me suis dit que ce serait un projet parfait pour ça. Appelons ce futur script "GoKeep", ça colle bien au concept.

Pour ĂȘtre tout Ă  fait transparent : j’avais dĂ©jĂ  créé une premiĂšre version de ces deux utilitaires en PHP avec Symfony. Mais avec un peu de recul, utiliser Symfony pour quelquechose d'aussi simple, c'est comme ouvrir un vortex par la porte des Ă©toiles pour travailler son swing. Trop lourd, trop contraignant Ă  maintenir. Donc lĂ , on repart sur du plus lĂ©ger, plus fun Ă  coder, et qui colle mieux Ă  mes envies du moment.

KIP a "simple" API to get infos from your IP

DDOManager is a "small" tool to deal with dynamic IP at home

KIP

Cette fois, je veux que la partie "code" reste aussi simple que possible. L’idĂ©e, c’est de renvoyer juste l’essentiel : la date et l’heure actuelles (au fuseau horaire de mon VPS), l’adresse IP, le port utilisĂ©, et pourquoi pas le hostname pour faire joli. Le tout, bien proprement formatĂ© en JSON. Et quand je dis "rĂ©cupĂ©rer", je parle bien du cĂŽtĂ© utilisateur : aucune donnĂ©e n’est stockĂ©e cĂŽtĂ© serveur (Ă  part ce que les logs Apache enregistrent par dĂ©faut). Juste une rĂ©ponse simple, directe, sans prise de tĂȘte.

Je ne vais pas m’étendre ici sur la mise en ligne du script, car dans mon cas, c’est du trĂšs classique : j’ai un utilisateur dĂ©diĂ© sur le serveur, le code est dans un dossier public_html Ă  l’intĂ©rieur de son $HOME, et j’ai créé un VirtualHost Apache spĂ©cifique juste pour ce "mini-site". Le tout passe sous HTTPS grĂące Ă  Certbot.

Par contre, qui dit public dit potentiellement abusĂ©. Et mĂȘme si le script ne conserve rien, je prĂ©fĂšre poser une petite limite de requĂȘtes pour Ă©viter qu’un bot ne vienne me ping 100 fois par seconde. Pour ça, rien de plus fiable et direct qu’iptables.

ProtĂ©geons l'accĂšs SSH. Parce qu’on ne veut surtout pas se bloquer soi-mĂȘme en appliquant des rĂšgles un peu trop strictes... Non, je ne parle pas d'expĂ©rience, voyons 🙃

Ensuite on ajoute la limite des nouvelles connexions Ă  1/seconde/ip.

Enfin on rejette les excĂšs (et rien d'autre !!!)

On peut vérifier les rÚgles avec la commande

Il est important de vérifier que les pages web sont encore accessible à ce stade, sans couper la connexion SSH. Si ce n'est pas le cas, il faut recommencer en supprimant toutes les rÚgles :

Si tout est bon, on installe le paquet pour les garder au redémarrage :

L’installeur demande si l'on enregistre les rĂšgles actuelles pour IPv4 => Oui. Pour IPv6, chacun son choix (moi j’ai mis Non). Ensuite on vĂ©rifie l'enregistrement comme ceci :

GOKeep

Ça fait des annĂ©es que j’ai envie de me mettre Ă  un autre langage orientĂ© back-end, sans jamais rĂ©ussir Ă  trancher. Dans ma liste, il y avait Rust et Golang. Rust, tout le monde en parle comme du messie, mĂȘme si la courbe d’apprentissage peut faire un peu peur, et toutes les vidĂ©os que j'ai pu voir parlaient de subtilitĂ©s de gestion de mĂ©moire... Pour un langage moderne (de bas niveau), on se retrouvait avec beaucoup de sujets qui rappellent l’époque du C. Du coup, j’ai optĂ© pour Go. (mais je ne ferme pas la porte Ă  Rust, juste je ne peux pas faire les deux en mĂȘme temps...)

Pour me faire une idĂ©e, j’ai regardĂ© pas mal de vidĂ©os sur le sujet, et deux d'entre elles m'ont aidĂ© dans mon choix.

La premiùre, c’est celle de Grafikart : un comparatif entre Go et JavaScript, trùs accessible, avec des exemples concrets, sans trop s’attarder sur les limitations.

La seconde, c’est la prĂ©sentation de Jean-Laurent de Morlhon Ă  DevoxxFR : “Pourquoi Maurice ne doit surtout pas coder en Go”. LĂ , on entre dans le dur : il liste pas mal de "limitations" du langage — formatage imposĂ© du code, gestion trĂšs manuelle des erreurs, syntaxe plutĂŽt verbeuse...

Mais en fait, tous ces points qui sont censĂ©s ĂȘtre des dĂ©fauts, je les ai trouvĂ©s... apaisants. Moins de choix, moins de rĂ©flexions inutiles... donc moins de charge mentale. Attention, cela ne veut pas dire qu’on ne peut pas ĂȘtre crĂ©atif avec Go. C’est un peu comme avec le protocole Gemini : ça paraĂźt simpliste et limitant, mais au final, avoir un cadre rigide pousse Ă  la crĂ©ativitĂ©. Et c’est justement l’objectif de Go : coder plus vite, plus simplement, sans sacrifier la lisibilitĂ© ni la performance.

Et si je devais donner un ultime argument : un code compilĂ© en Go donne un unique binaire autonome, qui s'exĂ©cute sans aucune dĂ©pendance. MĂȘme pas besoin d’avoir Go installĂ© pour le lancer. Pour le DevOps, c’est juste royal.

Découverte du langage Go pour les développeurs JavaScript

Pourquoi Maurice ne doit surtout pas coder en GO

Je ne sais pas encore si ce choix s’avĂ©rera judicieux sur la durĂ©e, mais pour l’instant, il me convient parfaitement.

Structure du script

La structure du projet est assez simple :

Le tout avec des logs.

J'aurais Ă©galement besoin de deux fichiers, le premier qui ne contiendra que l'adresse IP "en mĂ©moire", .ip_history et un second qui contient les informations nĂ©cessaires Ă  la gestion de l'API d'OVH, .godnsfile. Ces fichiers doivent ĂȘtre prĂ©sents Ă  la racine du dossier home de l'utilisateur courant. Voici la structure du fichier .godnsfile :

Maintenant, on code

On est maintenant prĂȘt Ă  passer Ă  la phase la plus satisfaisante du projet : Ă©crire du code. J’écris finalement cette partie de l’article aprĂšs avoir terminĂ© le dĂ©veloppement de la solution, parce que c’était plus simple pour moi de rester concentrĂ© sur la dĂ©couverte du langage, de faire des allers-retours avec la documentation, et de tester plein de petites choses sans avoir Ă  formuler tout ça proprement en mĂȘme temps. Bref, j’ai prĂ©fĂ©rĂ© coder d’abord, Ă©crire ensuite. (tout le monde ne sait pas coder et blogguer en mĂȘme temps...)

On commence par la base : interroger mon service KIP et récupérer mon IP publique.

Je lance avec `go run main.go` et... magie ! Mon JSON s’affiche dans le terminal. On a notre point de dĂ©part. C'est vraiment agrĂ©able d'avoir autant d'outils dĂ©jĂ  intĂ©grĂ© au langage. Finalement, pour des scripts simples, la plus grande difficultĂ© de Go (de ce que j'en vois) est de connaĂźtre la bonne librairie de base pour rĂ©aliser l'action que l'on souhaite.

Notons l’utilisation de defer : un mot-clĂ© tout simple, mais super pratique. Il permet de diffĂ©rer la fermeture de la connexion HTTP Ă  la fin de la fonction, sans risquer de l’oublier plus tard. Moins d’oublis, moins de bugs.

PlutÎt que de bricoler une extraction à coups de regex ou de split, Go propose de typer proprement une réponse JSON via une struct. Je pourrai me contenter de ne déclarer que le champ "ip", mais autant faire les choses proprement.

C’est lĂ  qu’on commence Ă  sentir un des aspects les plus dĂ©criĂ©s de Go : sa gestion des erreurs. Chaque appel potentiellement risquĂ© est suivi d’un if err != nil { ... }. C’est clair, c’est explicite, mais... qu’est-ce que c’est rĂ©pĂ©titif. J’ai vite trouvĂ© une astuce rĂ©currente dans les vidĂ©os de devs Go : crĂ©er une petite fonction utilitaire check() qui encapsule ce comportement, que je veux unique dans mon script : afficher l'erreur et planter comme un lĂąche. Et hop, on remplace tous les "if err != nil" par de simples appels Ă  "check(err)". On rĂ©duit drastiquement le nombre de lignes de notre code.

Go n’est pas un langage orientĂ© objet dans le sens classique du terme, mais sa capacitĂ© Ă  dĂ©finir des structures de donnĂ©es typĂ©es, propres et claires est franchement plaisante.

Certains parlent mĂȘme de "POO implicite" en Go, grĂące Ă  l’usage de struct et de receiver functions.

La programmation orientée objet dans le langage Go

Bon, je ne vais pas réécrire tout le script ici. La suite consiste Ă  utiliser la lib officielle d’OVH pour identifier les enregistrements DNS correspondants, les mettre Ă  jour, et rafraĂźchir la zone.

Une fois le script fonctionnel, j'ai remplacé l'affichage des erreurs par un systÚme de log avec "gopkg.in/natefinch/lumberjack.v2. Ce qui me permet d'enchainer sur le systÚme d'import des dépendances.

Un truc que j’ai vraiment apprĂ©ciĂ© en Go, c’est son systĂšme de gestion des dĂ©pendances. Contrairement Ă  Composer (PHP) ou Maven (Java), ici pas de fichier de conf Ă  remplir Ă  la main, pas de commandes Ă©sotĂ©riques pour initialiser un projet. Tu importes un package, tu fais un go run ou un go build, et Go tĂ©lĂ©charge tout ce qu’il faut.

Et mĂȘme pour du code local (dans le mĂȘme projet), il est possible de structurer son application avec des packages maison. Il suffit de les placer dans des sous-dossiers, puis de les importer avec leur chemin relatif:

Pas besoin d’autoload, de configuration compliquĂ©e ni de rĂ©flexion sur l’arborescence du namespace. Autre point fort : Go impose de ne pas avoir de dĂ©pendances non utilisĂ©es, comme pour les variables. Si tu dĂ©clares un import que tu n’utilises pas... le compilateur t’envoie bouler. C’est brutal, mais ça force Ă  garder un code propre. Un peu Ă  la Unix : chaque outil fait une chose, mais il le fait bien.

Conclusion

J'utilise le couple Kip et GoKeep depuis quelques semaines et j'en suis ravi. Ce projet m’a permis de poser mes premiĂšres briques en Go, et franchement... j’ai adorĂ©.

C’est un langage qui respire la simplicitĂ© sans ĂȘtre simpliste. J’ai Ă  peine effleurĂ© ce qu’il propose : je n’ai pas encore jouĂ© avec les pointeurs, ni touchĂ© aux goroutines ou aux channels, qui sont pourtant parmi les concepts les plus puissants de Go. Mais rien que ce petit script m’a donnĂ© envie d’aller plus loin, de creuser davantage, et surtout de réécrire d'autres outils que j’avais bricolĂ©s en PHP ou Bash avec ce nouveau langage. (Le moteur de ce blog ? Tempo ?)

J’ai ensuite demandĂ© Ă  ChatGPT de me gĂ©nĂ©rer un joli README.md pour accompagner le projet. Oui j'utilise les outis d'IA (ou LLM) sans avoir honte... cela ferait un bon article de blog.

Le code est maintenant disponible sur mon dĂ©pĂŽt GitLab, pour ceux que ça intĂ©resse, ou pour les curieux qui veulent voir un exemple simple et concret d’usage de l’API OVH en Go.

dépÎt GIT du projet "Kip"

dépÎt GIT du projet "GoKeep"

Et toi, quel est le projet, le besoin, qui t'as motivé à apprendre un langage de programmation, voir le langage Golang ?

---

Cet article vous plaßt ? Vous avez envie d'échanger avec moi sur ce sujet ?

Rejoignez moi sur Mastodon

Vous ĂȘtes plus mail que Mastodon ?

mailto:darkblog@lhoir.me

tags :

#developpement

#golang

permalinks :

gemini://darkblog.lhoir.me/2025-05-27-live-blog-coding-et-golang.gmi

https://darkblog.lhoir.me/2025-05-27-live-blog-coding-et-golang.html