Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Marque de Core

Core — QR

Un outil Core, agence digitale à Charleroi

Des QR codes qui se lisent vraiment, fabriqués dans le navigateur.

Essayer

Licence Dépendances Hors ligne Contrôles

Vérification

core-agency.github.io/core-qr


Ce que ça fait

Lien, Wi-Fi, contact, texte Les conventions d'écriture qui font qu'un téléphone propose d'ouvrir, de rejoindre ou d'enregistrer
Quatre niveaux de correction De L à H, avec ce que chacun tolère comme dégâts
Couleurs de la marque Avec un garde-fou : l'outil refuse un contraste qui ne se lira pas
Réserve pour un logo Chiffrée en codets détruits contre codets réparables, pas à l'estime
Planche d'autocollants Une adresse, un numéro de table par étiquette, prête à imprimer en A4
SVG et PNG Le SVG pour l'imprimeur, le PNG ×12 pour un autocollant de 5 cm

Aucune donnée ne sort de la machine : ni l'adresse de votre commerce, ni le mot de passe de votre Wi-Fi, ni l'image de votre logo. Ouvrez l'onglet « Réseau » de vos outils de développement, il restera vide.

D'où vient ce code

L'encodeur est celui que Core a écrit pour le système de commande à table du Maharaja, à Charleroi, puis repris pour The Building. Il y avait été vérifié bit à bit contre une implémentation de référence sur 399 charges utiles — mais au seul niveau de correction M, le seul dont ces projets avaient besoin.

L'ouverture aux niveaux L, Q et H est la seule extension apportée pour cette publication. C'est aussi la seule chose qui demandait à être re-vérifiée, et c'est l'objet du harnais de test.

Ce qui rend ces codes fiables

Les tables de la norme ne sont pas recopiées, elles sont déduites. On ne retient que deux nombres par symbole — codets de correction par bloc, et nombre de blocs. Le reste (codets de données, découpage en deux groupes de longueurs différentes) se calcule à partir de la géométrie : surface du symbole, moins les motifs de repérage, les chronomètres, les alignements et les zones réservées. Moins de chiffres recopiés, moins de fautes de frappe possibles.

Le budget d'une réserve centrale se compte en codets, pas en modules. C'est le piège de ce genre d'outil. Reed-Solomon corrige des octets entiers : un codet touché par un seul module effacé est perdu au même prix qu'un codet effacé en entier. Et comme les codets sont posés en zigzag par pavés de 2 × 4 modules, une pastille de côté s en abîme de l'ordre de (s/2 + 1) × (s/4 + 1). Compté en modules — l'erreur naturelle — un logo de 20 % semble tenir au niveau L, alors qu'il détruit une fois et demie le budget de correction.

Le contraste est jugé, pas subi. Un code aux couleurs de la marque reste lisible tant que l'écart de luminance est franc. Sous 4:1, l'outil refuse. Et il refuse également les codes inversés — modules clairs sur fond sombre : beaucoup de lecteurs s'en accommodent, aucun ne le garantit.

Un seul <path> pour tous les modules. Un <rect> par module donne un fichier six fois plus lourd en version 10, et les traceurs d'imprimante laissent un filet blanc entre les carrés adjacents.

Vérifié

node tests/verifier.js

218 contrôles, dont 92 allers-retours complets. Quatre familles, dont trois indépendantes de l'encodeur :

Contrôle Ce qu'il attrape
Témoin La structure déduite doit reproduire à l'identique la table du niveau M déjà vérifiée sur 399 charges utiles. Si la déduction est juste pour M, elle l'est pour L, Q et H.
Capacités Les 40 combinaisons (10 versions × 4 niveaux) doivent retomber sur les capacités publiées par la norme. Ces capacités sont recopiées séparément : une faute dans les tables de correction ne peut pas se compenser dans l'autre.
Bourrage Les bits restants après le dernier codet entier, par version.
Aller-retour Un décodeur écrit pour ce harnais, qui ne partage rien avec l'encodeur, relit chaque symbole : information de format, démasquage, lecture en zigzag, désentrelacement, syndromes de Reed-Solomon, puis comparaison au texte de départ.

Le décodeur calcule ses syndromes par évaluation en α⁰…α^(n-1) et construit son corps de Galois par tables exponentielle et logarithme ; l'encodeur fait une division polynomiale et multiplie bit à bit. Deux chemins différents vers la même arithmétique : ils se trompent difficilement de la même manière.

Les charges d'essai couvrent les accents, le cyrillique, le japonais, les paires de substitution (🥞), les points-virgules dans un mot de passe Wi-Fi, et les dix versions à chacun des quatre niveaux.

Ce que cet outil ne fait pas

Il s'arrête à la version 10. Soit 271 caractères au niveau L, 119 au niveau H. C'est très au-delà d'une adresse web, et bien assez pour une vCard courte ou un accès Wi-Fi ; ce n'est pas assez pour y loger un menu entier. Les versions 11 à 40 demanderaient 320 nombres recopiés de la norme, que le harnais actuel ne saurait pas vérifier avec la même rigueur — elles viendront le jour où la vérification suivra.

Il n'encode qu'en mode octet. La norme prévoit des modes numérique et alphanumérique plus compacts. En majuscules, HTTPS://EXEMPLE.BE tiendrait plus court. L'écart ne devient sensible qu'aux adresses très longues.

Il ne lit pas les QR codes, il n'en fabrique que. Le décodeur du harnais de test suppose un symbole parfait : il vérifie, il ne corrige pas.

Un code valide à l'écran n'est pas un code lisible en salle. Un symbole trop petit, imprimé sur du papier brillant, posé sous un vernis ou collé dans un angle sombre peut refuser de se lire. Imprimez-en un, scannez-le avec deux téléphones, à la lumière du lieu — avant de lancer la planche entière.

Le mot de passe d'un code Wi-Fi est en clair. Quiconque photographie l'autocollant obtient l'accès. Réservez-le au réseau invités, séparé de celui de la caisse.

Utiliser

Téléchargez le dossier et ouvrez index.html. Aucune compilation, aucun gestionnaire de paquets.

Le moteur s'utilise aussi seul, dans une page ou dans Node :

const CoreQR = require('./js/qr-code.js');

const symbole = CoreQR.encoder('https://core-agency.be', { niveau: 'H' });
// { taille: 33, version: 4, niveau: 'H', masque: 2, modules: [[...]], … }

CoreQR.svg('https://core-agency.be', { niveau: 'Q', sombre: '#6355E0', marge: 4 });
CoreQR.budgetReserve(6, 'H', 0.20);   // { codetsDetruits, codetsCorrigibles, tenable }

Structure

index.html            l'atelier
css/qr.css            charte Core : violet, lavande, Lexend Deca
js/qr-code.js         le moteur ISO/IEC 18004 — autonome, réutilisable seul
js/atelier.js         l'interface, les garde-fous, la planche
tests/verifier.js     le harnais et son décodeur indépendant
fonts/                Lexend Deca et JetBrains Mono, sous licence OFL

Licence

MIT — voir LICENSE.


Construit par Core, agence digitale à Charleroi.

About

Générateur de QR codes sans dépendance : encodeur ISO/IEC 18004 maison, réserve pour un logo chiffrée en codets, planche d'autocollants de table.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages