Le contexte

Maintenant que j'ai installé les outils indispensable au développement HTML5 (node.js, npm, bower et yeoman actuellement), j'ai commencé à me faire la main en utilisant le générateur FountainJs et son exemple d'application "todo list".

Après avoir ajouté une sauvegarde en utilisant le stockage local, il me fallait rendre l'application disponible hors connexion (pas de réseau sous un tunnel dans le RER par exemple...) afin de pouvoir utiliser ce pense-bête sans contrainte de connectivité.

J'allais partir sur les "appcache" quand je suis tombé sur les pages de Mozilla indiquant que cette technique était considérée comme "dépréciée" et qu'il fallait plutôt utiliser les Service Workers pour les nouveaux projets. En dehors de la complexité plus élevée que appcache, la contrainte d'avoir un site en HTTPS n'est pas un problème pour moi, puisque le serveur sur lequel je déploie l'application —un Raspberry Pi— répond exclusivement à ce genre de requête.

Donc le seul obstacle qu'il reste, c'est la mise en œuvre, et pour ça, j'ai simplement cherché un plugin utilisable avec gulp (l'outil de fabrique et d'empaquetage mis en place par le modèle de FountainJs) pour faire le gros du travail. J'ai finalement choisi sw-precache (Software Worker Precache) qui m'a l'air assez poussé, bien documenté, tout en restant simple pour mon petit projets : je mets tous mes fichiers en cache.

Générer le Service Worker

Il n'y a pas de difficulté particulière, mais il va falloir exclure le fichier généré de la tâche de vérification du code avec eslint. Le service worker sera généré dans le fichier sw-app-cache.js.

Récupérer sw-precache

npm install --save-dev sw-precache

Créer les tâches gulp

// variables de configurations (gulp.conf.js)
/**
 * precache global conf values
 */
exports.precacheSpecs = {
  target: 'sw-app-cache.js',
  staticFilesGlob: '/**/*.{js,html,css,png,jpg,gif,svg,eot,ttf,woff}'
};



// définition des tâches (nouveau fichier : precache.js)
// noter la distinction entre l'environnement de développement et l'environnement d'utilisation
const gulp = require('gulp');
const path = require('path');
const swPrecache = require('sw-precache');

const conf = require('../conf/gulp.conf');

// gulp tasks declaration
gulp.task('precache', precache);
gulp.task('precache:dist', precacheDist);


function precache(done) {
  doPrecache(conf, conf.path.src()+'/', '/');
  done();
}

function precacheDist(done) {
  doPrecache(conf, conf.path.dist()+'/', conf.baseHref.default);
  done();
}

function doPrecache(conf, rootDir, appPrefix)
{
  swPrecache.write(path.join(rootDir, conf.precacheSpecs.target), {
    staticFileGlobs: [rootDir + conf.precacheSpecs.staticFilesGlob],
    stripPrefix: rootDir,
    replacePrefix: appPrefix
  });
}


// Inscription des tâches dans la fabrique (gulpfile.js)
// on met à jour les tâche "build" et "serve"
gulp.task('build', gulp.series('partials', gulp.parallel('inject', 'other'), 'build', 'precache:dist'));
gulp.task('serve', gulp.series('inject', 'precache', 'watch', 'browsersync'));

Exclure le fichier de la vérification de code

Cette étape est indispensable pour ne pas bloquer les tâches gulp. Dans mon cas, j'ai donc patché ma tâche scripts comme suit :

diff --git a/gulp_tasks/scripts.js b/gulp_tasks/scripts.js
index f3d2482..5044c2b 100644
--- a/gulp_tasks/scripts.js
+++ b/gulp_tasks/scripts.js
@@ -1,14 +1,20 @@
 const gulp = require('gulp');
 const eslint = require('gulp-eslint');
+const filter = require('gulp-filter');
 
 const conf = require('../conf/gulp.conf');
 
 gulp.task('scripts', scripts);
 
 function scripts() {
+  // do not lint the generated service worker
+  const jsFilter = filter(conf.path.tmp('**/*.js','!sw-app-cache.js'), {restore: true});
+
   return gulp.src(conf.path.src('**/*.js'))
+    .pipe(jsFilter)
     .pipe(eslint())
     .pipe(eslint.format())
+    .pipe(jsFilter.restore)
 
     .pipe(gulp.dest(conf.path.tmp()));
 }

Utiliser le Service Worker généré

Maintenant que la génération du service worker est en ordre de marche, on doit écrire le code qui le référence pour que le navigateur puisse l'utiliser.

J'ai repris le code de démonstration disponible, auquel j'ai rajouté les directives suivantes pour désactiver les plaintes de eslint (on n'est pas dans le code angular de mon application, donc je me permets de le faire) :

/* eslint default-case: "off", angular/log: "off" */

Voici donc la conclusion de ma série d'article axés sur l'ajout de dépôts tiers de paquetages.

L'objectif était de comprendre la réponse trouvé sur askubuntu concernant les commandes explicites à employer pour utiliser NodeSource comme fournisseur des paquetages récent de node.js.

D'ailleurs, ce travail ne m'a pas été inutile, car si j'en crois le macro-planning des versions supportées sur le long terme de node.js, en janvier au plus tard, je devrais basculer sur les dépôts contenant la version 6.

Dans l'article précédent, on a vu comment lister les sources de paquetages tiers déjà déclarés, pour déterminer si certaines de ces sources doivent être enlevées suites à l'ajout d'une nouvelle source.

C'est exactement ce qui arrive dans les scripts d'installation de nodesource.com, qui supprime un éventuel dépôt précédemment utilisé pour obtenir node.js.

Nous allons donc voir comment utiliser apt-add-repository pour enlever ou rajouter un dépôt.

Enlever un dépôt

Utilisons le script de l'article précédent pour faire un état des lieux :

--> /etc/apt/sources.list
http://www.openprinting.org/download/printdriver/debian/
https://deb.nodesource.com/node_4.x
--> /etc/apt/sources.list.d/foo.list
http://foo.foo

On veut supprimer le dépôt "http://foo.foo", on affiche le contenu de foo.list.

#test pour le remove
deb http://foo.foo trusty main

On supprime le dépôt en fournissant la ligne complète à la commande apt-add-repository -r (le "tiret-r" donne l'instruction de supprimer le dépôt à la commande).

sudo apt-add-repository -r "deb http://foo.foo trusty main"

Vérification

--> /etc/apt/sources.list
http://www.openprinting.org/download/printdriver/debian/
https://deb.nodesource.com/node_4.x
--> /etc/apt/sources.list.d/foo.list

On voit bien que la ligne a disparu.

Ajouter un dépôt

Nous sommes prêt à ajouter le dépôt ! Pour node.js en version 4.x, on invoquera donc la commande :

sudo apt-add-repository "deb https://deb.nodesource.com/node_5.x $(lsb_release -sc) main"

La séquence $(lsb_release -sc) est interprétée comme la commande lsb_release à invoquer pour utiliser le résultat. Cette commande retourne le nom de la distribution Ubuntu, dans mon cas trusty.

Dans l'article précédent, j'ai détaillé comment retrouver et ajouter une clé servant à authentifier un dépôt de paquetages, en l'occurrence un dépôt contenant une version à jour de node.js.

Maintenant, il faut ajouter ce dépôt, mais auparavant, il me semble essentiel de pouvoir lister les dépôts actuellement utilisés : il se peut qu'un autre dépôt ait été ajouté auparavant (par exemple, on a précédemment ajouté le dépôt pour les version 4.x de node.js, et maintenant on voudrait utiliser une version 5.x).

Il n'y a malheureusement pas encore de commande pour établir cette liste, alors voici un petit script de ma composition :

#!/bin/bash
#
#List repositories that are not from ubuntu.com

function listExtraRepo() {
  echo "--> $1"
  grep -e '^deb.*$' $1 | grep -v -e 'ubuntu\.com' | grep -o -e '[^ ]*\:\/\/[^ ]*'
}

for l in `find /etc/apt -name "*.list"`; do
  listExtraRepo $l
done

En français, on cherche tous les fichiers "*.list" se trouvant dans /etc/apt, et pour chacun d'eux, on affiche le chemin et le nom du fichier, puis toutes les urls n'étant pas dans "ubuntu.com".

Plus précisement, on filtre le fichier en 3 étapes:

  • D'abord on ne garde que les lignes déclarant un dépôt (exit les commentaires et les lignes vides),
  • Ensuite on rejette toutes les lignes contenant "ubuntu.com",
  • Enfin, on extrait l'url de chaque ligne restante.

Sur mon poste, j'obtiens le résultat suivant (on remarquera que le dépot nodesource est déjà présent, puisque j'écris cet article à postériori) :

--> /etc/apt/sources.list
http://www.openprinting.org/download/printdriver/debian/
https://deb.nodesource.com/node_4.x

Je me suis mis récemment à la programmation d'application HTML5, et pour cela, il faut installer un outil essentiel : node.js

Malheureusement, la version proposé via les dépôts de base d'Ubuntu pour ma "vieille" version (14.04 LTS) est trop vieille et ne sera pas mise à jour, et de toute façon l'outil évolue trop vite. J'ai donc cherché et trouvé un dépôt alternatif : NodeSource

Cependant, la méthode d'installation préconisé implique l’exécution d'un script avec les droits administrateur. Aidé d'un post sur askubuntu, j'ai examiné les commandes à exécuter.

La première commande implique d'ajouter une clé de chiffrement au trousseau utilisé par ubuntu pour récupérer les paquetages de logiciels : sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 68576280. Mais est-ce bien la bonne clé ?

Comment vérifier la clé ?

Aller sur le site keyserver.ubuntu.com (en https), et chercher 'nodesource', qui est le nom du domaine à rajouter. Puis chercher '68576280' qui est l'empreinte courte à rajouter : on trouve effectivement la signature du site.

On peut ensuite comparer cette signature à celle référencée dans le script : si elle sont bien semblable, c'est bon.

Comment lister les clés reconnues ?

Il suffit d'invoquer la commande :

apt-key list

Ce qui affiche une liste comme celle qui suit :

/etc/apt/trusted.gpg
--------------------
pub   1024D/437D05B5 2004-09-12
uid                  Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub   2048g/79164387 2004-09-12

pub   1024D/FBB75451 2004-12-30
uid                  Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>

pub   4096R/C0B21F32 2012-05-11
uid                  Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>

pub   4096R/EFE21092 2012-05-11
uid                  Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

pub   1024D/3E5C1192 2010-09-20
uid                  Ubuntu Extras Archive Automatic Signing Key <ftpmaster@ubuntu.com>

pub   2048R/4CFD1E2F 2013-02-27
uid                  OpenPrinting (OpenPrinting Key) <webmaster@openprinting.org>
sub   2048R/D28F4FAC 2013-02-27

pub   4096R/68576280 2014-06-13
uid                  NodeSource <gpg@nodesource.com>
sub   4096R/AA01DA2C 2014-06-13

Depuis janvier, j'ai fabriqué l'habitude de pratiquer quelques exercices de sport au réveil. On est maintenant en juin, l'habitude est donc prise et je vais donc décrire ma routine, qui prend 10 minutes seulement trois fois par semaines, par exemple le lundi, le mercredi et le vendredi.

Bien entendu, il faut une condition physique compatible avec une activité physique, consultez votre médecin et augmentez progressivement l'intensité de l'effort.

Cliquer sur les liens pour obtenir les planches descriptives.

Tout d'abord on s'échauffe environ 2 minutes en sautant sur place et en agitant les bras.

Ensuite on enchaîne la série d'exercices suivante :

  • 10 flexions
  • 10 pompes
  • 10 secondes de gainage

On répète cette série un nombre de fois qui dépend du niveau de forme.

À la fin des répétitions, il est conseillé de marcher quelques minutes et de s'étirer.

Personnellement j'ai commencé à 4 répétitions, et j'ai attendu 2 semaines avant d'augmenter ce nombre, passant ainsi à 5, puis à 6 répétitions.

Lorsque j'ai attrapé la grippe, je n'ai pas pratiqué cette routine par précaution -je ne le sentais pas-, puis j'ai repris depuis le début (4 répétitions puis 5 puis 6)

Pour aller plus loin

Maintenant qu'un semestre est passé et que ma condition physique le permet, je viens de modifier l'exercice de flexion pour l'adapter à ma pratique de l'aïkido : avec un bokken, je fais un mouvement de coupe (suburi) en même temps que les flexions (évidemment je fais attention au plafond alors mon mouvement n'est pas optimal).

On verra à la fin de l'année pour rajouter un autre exercice !

Fessée or not fessée ?

Le 08 Mars 2015 à 19:12

Le 4 mars 2015, le Comité Européen des Droits Sociaux (CEDS), un organe du Conseil de l'Europe, a condamné la France pour ne pas avoir prévu dans son droit d'interdiction suffisamment claire, contraignante et précise des châtiments corporels infligés aux enfants ni par la loi ni par la jurisprudence.

Je suis assez perplexe sur l'éventualité d'une interdiction de la fessée, car c'est grâce à ce que j'appelle rétrospectivement «La Grosse Fessée du Printemps» que j'ai réussi ma scolarité en primaire (j'ai même eu +10 points du jour au lendemain, une fois). Il serait toutefois hasardeux de généraliser ma réaction personnelle à l'ensemble des éduqués, ainsi que de généraliser le discernement de mes parents à l'ensemble des éducateurs.

En outre, j'ai l'intime conviction que cette interdiction arrivera aussi en France tôt ou tard, qu'on le veuille ou non.

À partir de là, au lieu de s'apitoyer sur le chaos social qui nous menace comme le font beaucoup de monde –à en croire les médias–, je pense qu'il est plus profitable de se familiariser avec des principes éducatifs qui rendraient les châtiments corporels inutiles (je parle de principes plutôt que de méthodes, car chaque enfant est différent), et de les mettre en application du mieux possible.

Je suis d'autant plus motivé que je peux appliquer dès maintenant ces principes. J'ai donc commencé à lire un premier ouvrage sur le sujet.

Affaire à suivre...

Marinade à l'asiatique

Le 23 Février 2015 à 07:30

Cette marinade pour les viandes est une adaptation de celle proposée par Norbert Tarayre dans son émission "Commis d'office" à l'occasion d'une poêlée asiatique. La différence avec la recette d'origine : je n'utilise pas d'huile de sésame (moins par goût que par non envie d'acheter une bouteille spécialement pour ça) ; je n'utilise pas le nuoc mam que je trouve très très fort, je le remplace par du vinaigre de Xérès pour donner à la place une touche d'aigre ; je remplace une c.a.s. de miel par 2 c.a.s. de mirin. Au final, on obtient donc une saveur aigre-douce-salée plutôt que du sucré-salé.

Ingrédients

  • 1 c.a.s. de miel
  • 2 c.a.s. de mirin
  • 2 c.a.s. de sauce d'huître
  • 3 c.a.s. de vinaigre de Xérès
  • 4 c.a.s. de sauce de soja
  • 1 citronnelle finement émincée
  • râpé de zeste de citron vert

Recette

Mélanger tous les ingrédients. Faire mariner la viande finement émincée. Saisir la viande quelques instants dans un wok très chaud avec un peu d'huile.

Bonnes résolutions 2015

Le 02 Février 2015 à 19:00

Mieux vaut tard que jamais, voici une liste de bonnes résolutions publiques pour cette années (cette liste n'inclut donc pas les bonnes résolutions d'ordre privées).

  • Publier régulièrement des articles sur ce blog.
  • Travailler sur la suite de mon roman : consolider les éléments du récit, la description du monde, etc... La rédaction initiale DOIT être terminée fin 2015, pour publication courant 2016.
  • Figer une version de mon plugin maven pour générer des Javabeans à partir d'une description en XML.
  • Utiliser ce plugin pour commencer la réécriture/refonte de mon framework générique pour les jeux 2D.

J'ai testé avec succès ce matin la procédure décrite à cette adresse.

Le point important est de faire croire au site navigo qu'on est sur un système connu (Windows ou OSX), et donc d'avoir une description complète de l'user agent.

En l'occurrence, j'ai utilisé les valeurs suivantes :

User agent
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)
App code name
Mozilla
App Name
Netscape
App version
5.0 (Windows)
Platform
Win64

Pour rappel (au cas où la page d'origine disparaît), voici la procédure en gros :

  • Déterminer le modèle de lecteur avec lsusb
  • Pour ma part, j'ai un lecteur compatible PC/SC, donc j'installe les outils pcsc_scan (package pcsc-tools pour ubuntu) et pcscd.
  • Je vérifie que ça fonctionne avec pcsc_scan (reconnaissance du lecteur, lecture de la carte)
  • Sur le site navigo, je change d'user agent pour faire croire que j'utilise un système officiellement supporté.
  • Et voilà !