HIIT Timer

Premier semestre 2014. Alors en stage de fin d’étude à Lyon, j’ai pratiqué l’escrime médiévale avec la compagnie des corbeaux et c’est à l’occasion de l’un des entraînements que j’ai découvert une première forme d’entraînement fractionné. En effet, pour terminer l’entraînement, nous avions pris l’habitude d’effectuer une sorte de « circuit d’entraînement » (ou circuit training en anglais), sous la forme d’une série d’exercices physiques à exécuter l’un après l’autre. Cela dans le but de renforcer les corps, bras, poignets et autres muscles et articulations, mis à rude épreuve par le maniement d’un bout de métal allant de 1,5 à 2kg environ, à savoir l’épée. L’enchaînement s’effectuant de la manière suivante: 30 secondes d’exercices, puis 30 secondes de repos, pendant lesquelles nous changions d’atelier.

La découverte du principe d’entraînement fractionnée s’est ensuite prolongée dans mes entraînements de roller de vitesse, cette fois avec l’apparition de séries et de blocs. Enfin plus récemment, j’ai pris connaissance du mode d’entraînement dit « fractionné à haute intensité », souvent plus connu sous son acronyme anglais HIIT pour « High Intensity Interval Training ». Avec la déclaration du confinement et les restrictions liées concernant la pratique des sports, je me suis donc mis en tête d’écrire une application simple permettant de configurer une telle session d’entraînement.

Mon cahier des charges était simple, pouvoir configurer les temps d’exercice, pause, repos, ainsi que le nombre d’intervalles et de blocs. Une fois l’entraînement démarré, fournir un compte à rebours pour chaque étape, avec avertissement sonore pour indiquer la fin de la période. Le tout sous la forme d’un site web disponible en PWA, afin de pouvoir être utilisé sur mobile.

Ce petit projet tourne pour le moment dans un App Engine sur la Google Cloud Platform et j’en ai donc profité pour mettre en place un système bien pratique de déploiement automatique après publication de nouveau code dans le dépôt git.

Par ailleurs, il est dommage que la fonctionnalité « wake lock » ne soit pas encore disponible côté mobile, afin d’empêcher le téléphone de se mettre en veille, après demande d’autorisation auprès de l’utilisateur. Pour éviter que l’écran s’éteigne, il faut alors changer la durée avant mise en veille avant de commencer l’entraînement, ou tapoter l’écran régulièrement à chaque période de repos. J’envisage également de supprimer la période de repos constituant la dernière étape de la séquence; à voir à l’usage.

Trêves de bavardage, vous pouvez découvrir l’outil à l’adresse suivante :

hiit.unicoda.com

YtAutoDark – Publication de la version 2

Youtube ayant mis à jour le code des menus de ses pages, j’ai constaté depuis quelques jours que lorsque mon extension avait terminé d’effectuer l’activation du thème sombre de Youtube, le menu n’était pas fermé automatiquement comme avant.

Après quelques heures à parcourir une nouvelle fois le code HTML du site, je suis parvenu à une nouvelle version qui me semble satisfaisante. Le processus est bien plus lent qu’avant car celui-ci doit attendre le chargement du contenu des menus, arrivé avec le nouveau code de Youtube, ce qui n’était pas totalement nécessaire. J’ai également ralenti un peu l’enchaînement des étapes du processus d’activation du thème sombre, il n’est pas impossible que je le diminue ou le supprime complètement dans les prochaines semaines, une fois que j’aurais l’assurance de la stabilité de cette version.

Côté modification, j’ai également allongé le temps pendant lequel l’extension tente de procéder au changement, celui-ci passe de 10 à 15 secondes, car j’ai constaté des temps de chargement du contenu des menus de plusieurs secondes au moment des tests. Une fois ces 15 secondes écoulées, si le thème sombre n’est pas activé, l’extension repasse sur l’ancienne manière de réaliser l’activation avec une fenêtre de 10 secondes (celle-ci étant toujours fonctionnelle, avec néanmoins le problème cosmétique du menu restant ouvert).

Enfin, dans les modifications non visibles pour l’utilisateur, j’ai ajouté un système de log me permettant de suivre les actions effectuées par l’extension et ainsi de faciliter le débogage en cas de problème. Afin de s’assurer de ne pas conserver les logs activés dans la version publiée de l’extension, j’ai écrit quelques lignes en NodeJs, pour vérifier l’état d’activation des logs et faire échouer l’étape de build si besoin.

La version Chrome a également été mise à jour. Par ailleurs, j’ai constaté par hasard que l’interface Youtube change lorsqu’on navigue en étant connecté avec un compte Google, ce qui n’est pas mon cas, sauf dans mon navigateur professionnel avec mon compte pro. Les menus utilisés par l’extension n’étant pas présent (en tout cas, pas totalement au même endroit), il n’est pas dit que l’extension fonctionne pour les personnes connectées à Youtube. De plus, je me demande si le paramètre du thème n’est pas retenu dans les paramètres liés au compte, dans le cas d’une navigation en mode connecté. Quoi qu’il en soit, ce point n’est pas une priorité pour le moment; j’y jetterais peut-être un œil par curiosité si je décide d’y accorder du temps.

Comme toujours, j’espère que l’extension pourra être utile à ceux qui l’auront installé et qu’elle continuera de fonctionner chez le plus grand nombre, aussi bien qu’elle fonctionne dans mon navigateur. Commentaires et remarques à la suite ou sur Github, et si l’extension vous plaît, 5 petites étoiles sur la page de l’extension font toujours plaisir.

YtAutoDark – Publication sur le Chrome Web Store

En ce début d’année, j’ai pris un peu de temps pour effectuer quelques modifications cosmétiques sur l’extension YtAutodark publiée en octobre sur Firefox et que j’avais présenté dans l’article [Extension Firefox] yt-auto-dark. Ajout d’une icône relativement simple, gestion des langues dans un dossier dédié et modification d’autres propriétés du manifest de l’extension pour pouvoir la publier également dans le Chrome Web Store.

L’extension est donc dès à présent disponible pour Chrome sous le nom Thème Sombre Automatique pour Youtube™.

[Extension Firefox] yt-auto-dark

Aujourd’hui, petit article d’auto-promotion, pour mettre en avant une extension pour Firefox à la fonction extrêmement limitée, que j’ai développée pour m’épargner trois clics. J’ai nommé « Thème Sombre Automatique pour YouTube™« , nom de code : yt-auto-dark.

La fonction de l’extension est simple: activer le mode sombre proposé par Youtube, sans que j’ai à intervenir. L’option se situe dans le menu paramètre du site, juste à côté du bouton « se connecter » et nécessite trois clics pour passer du thème par défaut, le thème clair, au thème sombre. N’utilisant pas de compte Youtube, qui aurait éventuellement pu retenir mon choix de thème comme paramètre de configuration du compte, et étant habitué à nettoyer systématiquement mon navigateur après chaque session de navigation, je devais réactiver le thème sombre à chaque nouvelle session de navigation. Pire, utilisant depuis plus d’un an une extension chargée de procéder au nettoyage des cookies d’un onglet, quelques dizaines de secondes après la fermeture de celui-ci, je pouvais être amener à répéter l’opération plusieurs fois.

L’idée est donc venue assez rapidement de créer une extension Firefox pour cette tâche des plus simples. Il m’aura néanmoins fallu quelques heures de recherches et programmation, réparties sur plusieurs mois, avant de trouver une implémentation satisfaisante. Penchons-nous donc un peu sur la technique, sans toutefois rentrer trop dans les détails. Durant mes recherches, j’ai passé de long moment à lire le code source de la page HTML de YouTube, à parcourir les scripts utilisés, à tenter de comprendre la méthode de changement de thème et à essayer de déclencher le changement par appel direct de la bonne fonction, ou en copiant le fonctionnement de celle-ci. Pas d’avancées concrètes de ce côté-là, même après avoir identifié les parties de code mise en œuvre.

Lors de mes recherches, j’avais en autre découvert que l’activation du thème sombre conduisait à l’ajout d’un paramètre dark= »true » sur la balise <html> de la page. J’avais reproduit cet ajout dans mes premiers tests d’extension, sans arriver à un résultat satisfaisant. De mémoire, je crois me souvenir que quelques éléments n’étaient pas colorer correctement (d’autres éléments m’ont également conduit à rejeter cette solution incomplète, mais ne les ayant pas notés, je ne suis plus en mesure de les préciser).

Bref, la solution vers laquelle j’avais décidé de m’orienter consister simplement à écrire du code Javascript qui effectuerai les clics sur les différents éléments de l’interface à ma place. Pas de grande difficulté de ce côté là et j’avais réussi à obtenir une première version fonctionnelle. Celle-ci fonctionnait assez bien, mais un problème subsistait. En général, lors du premier affichage de la page, l’activation du thème sombre échouait, mais réussissait dès le rechargement de celle-ci, ou dès l’affichage d’une autre page. L’implémentation était insuffisante. J’ai donc chercher un moyen pour m’assurer de l’existence des éléments html du menu dans la page avant de permettre à mon extension d’essayer de cliquer dessus.

Après plusieurs tentatives infructueuses en utilisant de la récursivité et une vérification de l’état de la page via la propriété document.readyState, je suis tombé par hasard sur un article présentant les avantages de la fonction requestAnimationFrame. C’est muni de ces nouvelles informations que je suis enfin arrivé à une première version stable de l’extension. Désormais, celle-ci attend donc l’apparition des éléments de menu avant de tenter de cliquer sur les éléments pour tenter de passer au thème sombre. J’utilise l’attribut dark évoqué tout à l’heure pour savoir s’il faut déclencher le changement de thème ou non. De plus, j’ai intégré un mécanisme de sécurité afin de limiter la durée pendant laquelle l’extension tentera d’activer le thème. La limite est donc actuellement configurée à 10s, ce qui semble largement suffisant sur les quelques ordinateurs où j’ai testé l’extension.

Côté amélioration, il pourrait éventuellement être intéressant de pouvoir configurer le temps d’attente, pour pouvoir facilement l’augmenter au besoin. Je pense notamment à une utilisation sur des machines un peu « lentes » dans le chargement des pages web modernes. L’extension n’ayant pas de logo, il pourrait être utile d’en créer un un pour l’identifier plus facilement parmi les extensions installées. Je ne me suis pas pencher sur la question de l’implémentation de logs de débugage, qui permettraient de suivre le fonctionnement de l’extension en cas de dysfonctionnement. En effet, si l’extension fonctionne parfaitement sur tous mes navigateurs Firefox (vérifiée sur 3 instances différentes), l’activation du thème sombre échoue chez l’un de mes collègues de travail.

Passons maintenant au(x) mots de la fin pour clore cette présentation. Je suis très satisfait du fonctionnement de cette petite application, qui me rend désormais service au quotidien. C’était un bon sujet pour découvrir comment réaliser une extension pour Firefox, la tester, et demander son intégration au catalogue d’extensions. Le code source est bien entendu disponible sur Github, sous licence GPLv3. J’espère que cette extension pourra rendre service à ceux qui y trouveront un intérêt, et surtout, qu’elle fonctionnera chez ceux qui tenteront l’installation; et permettront de vérifier que mon extension ne fonctionne pas juste sur ma seule configuration de Firefox. Dans le cas contraire, nous pourront en discuter sur Github, ou dans les commentaires.

RuneAudio comme lecteur de musique

A l’heure d’une réinstallation de RuneAudio, petit point sur la façon dont je profite de ma bibliothèque musicale numérique.

Commençons par planter le décor. L’intégralité de ma musique est stockée sur mon NAS et accessible via un partage samba. Pour la diffusion du son, je dispose d’une petite chaîne Hifi datant de l’époque du début des lecteurs MP3. Pas de connexion Bluetooth, pas de WiFi, pas de port USB, mais une entrée auxiliaire… et un lecteur cassette ! Pour faire le lien entre les deux composants, j’ai choisi un Raspberry Pi dans sa troisième version afin de disposer du WiFi intégré.

Pour la partie logicielle, j’ai testé différentes projets libres : Pi MusicBox, Volumio et RuneAudio. Les deux dernières solutions se distinguent particulièrement par leur interface et leurs fonctionnalités. Mon choix s’est en définitive porté vers RuneAudio dans sa version 0.4-beta. Version plutôt stable malgré son statut de beta. La recherche est le point noir, et retourne en permanence « undefined ». Le problème est connu, mais n’est pas forcément simple à corriger; d’après ce que j’avais pu lire en parcourant le forum.

Inventaire des composants avant montage (Écran tactile non visible).

Pour profiter au mieux du système, j’ai ajouté un écran tactile au Pi, afin de pouvoir contrôler et afficher la liste de lecture, sans avoir à passer par un autre périphérique externe. Le tout, assemblé dans un support  à charnière bien pratique. Par ailleurs, une application Android simple est disponible afin de piloter RuneAudio à partir de son téléphone sans avoir à passer par l’interface web via un navigateur (à condition d’être connecté sur le même réseau).

Mise en place du Pi.

Après presque deux ans d’utilisation, ce montage me donne entière satisfaction. Pas ou peu de problème jusqu’à ce que j’effectue des modifications de configuration du côté de mon routeur, et que la connexion automatique au WiFi devienne quasi impossible (d’où la réinstallation évoquée au début). Dernièrement, l’ajout d’une alimentation à interrupteur m’évite de devoir accéder à la multiprise pour couper l’alimentation du Pi et rends l’ensemble bien plus pratique. Je ne vais pas préciser ici toutes les fonctionnalités, avantages et inconvénients de RuneAudio, et je vous quitte donc sur une photo en situation.