qr-swastika-avoider v0.1.0 — éviter les motifs de croix gammée accidentels dans les QR codes
(crates.io)- Une crate Rust qui détecte les motifs de croix gammée pouvant apparaître par hasard dans les QR codes et, en option, génère des QR codes sans ce motif
- Elle rend les 8 motifs de masque de la norme QR afin de retenir les candidats sans motif, puis choisit le masque ayant la pénalité ISO/IEC 18004 la plus faible
- Elle exclut de l’analyse les modules finder, timing, d’alignement, de format et de version, et tient compte du contraste environnant afin d’éviter de confondre des éléments fonctionnels ou des formes invisibles avec le motif
- Le détecteur par défaut n’a aucune dépendance externe et interdit le code
unsafe; il prend en charge plusieurs bibliothèques QR ainsi que la représentationVec<Vec<bool>> - La détection se limite aux croix gammées 5×5 et 7×7 alignées sur les axes, dans les deux orientations et avec les deux polarités de couleur ; les formes à 45 degrés, diagonales et les rotations arbitraires ne sont pas prises en charge
Pourquoi éviter les motifs accidentels
- qr-swastika-avoider détecte et évite les motifs de croix gammée susceptibles d’apparaître aléatoirement dans les QR codes
- Les QR codes choisissent le meilleur score de lisibilité parmi 8 motifs de masque interchangeables, mais ne vérifient pas la présence de symboles potentiellement offensants
- Les motifs petits et fins peuvent difficilement être éliminés par le processus d’évaluation de la norme QR, et donc rester par hasard dans le code final
Détection tenant compte des éléments fonctionnels et du contraste
- Le détecteur par défaut n’a aucune dépendance externe et applique
#![forbid(unsafe_code)] - Un petit trait
QrModules, composé de deux méthodes, permet d’inspecter différents formats de représentation QR - Les modules finder, timing, d’alignement, de format et de version sont exclus de la détection afin de ne pas confondre les coins des repères finder avec une croix gammée
- Les motifs noyés dans des modules de même couleur, donc invisibles en pratique, sont ignorés selon le contraste environnant ; ce critère est configurable
- Les QR codes existants peuvent être vérifiés avec
contains_swastika; si un motif est trouvé, il est possible de les régénérer ou d’avertir l’utilisateur
Représentations QR et bibliothèques prises en charge
- Les adaptateurs suivants sont fournis via des fonctionnalités Cargo
qrcodegen:QrModulespourqrcodegen::QrCodeqrcode:QrModulespourqrcode::QrCodefast_qr:QrModulespourfast_qr::QRCode
- La matrice brute de modules
Vec<Vec<bool>>est également prise en charge sans adaptateur séparé, oùtruedésigne un module sombre
Génération de QR codes sans motif
encode_safe, dans la fonctionnalitégenerate, prend le contenu et le niveau de correction d’erreurs, puis renvoie un QR code scannable sans motif ; s’il ne peut pas en générer, il retourne une erreur explicite- Le processus de génération rend les 8 masques puis ne conserve que les candidats ne contenant pas le motif ciblé
- Parmi les candidats restants, il renvoie le masque ayant la pénalité ISO/IEC 18004 la plus faible, afin de préserver l’optimisation de lisibilité de la norme
- La valeur renvoyée permet d’obtenir la matrice de modules avec
matrix()et de consulter le masque choisi avecmask()
Configuration des fonctionnalités Cargo
- Les fonctionnalités par défaut incluent uniquement le détecteur sans dépendance
- Les fonctionnalités
qrcodegen,qrcodeetfast_qrajoutent les adaptateurs pour chaque bibliothèque - La fonctionnalité
generateajouteqrcodegencomme dépendance et fournitencode_safe
Portée de la détection et licence
- La détection couvre, avec une petite tolérance, les croix gammées classiques alignées sur les axes en tailles 5×5 et 7×7, dans les deux orientations et avec les deux polarités clair/sombre
- Les motifs à 45 degrés ou diagonaux, ainsi que les formes tournées selon un angle arbitraire, ne sont pas inclus dans la portée de détection
- Distribué sous licence MIT
1 commentaires
Avis sur Lobste.rs
Il est déroutant que ce projet évite les svastikas religieux tout en n’évitant pas celui utilisé par les nazis. Le symbole nazi est une forme tournée de 45 degrés, alors que le projet précise que les « motifs diagonaux ou à 45° et les rotations arbitraires sont hors périmètre »
Les images qui apparaissent par hasard dans un QR code sont de basse résolution ; il est donc plus probable qu’une forme non tournée soit clairement reconnue comme un svastika, plutôt que prise pour un simple motif aléatoire de pixels. Il est donc raisonnable de se concentrer là-dessus
Il est aussi indiqué que les « modules de finder, de timing, d’alignement, de format et de version sont exclus afin de ne pas confondre les coins du finder avec un svastika », mais quand quelqu’un voit un symbole choquant dans un QR code, sa réaction ne dépendra pas du fait que ces pixels appartiennent aux données ou au motif de timing. Les coins du finder ne sont au fond que des carrés, et je ne vois pas pourquoi il faudrait absolument les exclure de l’analyse ; plus j’examine le sujet, moins cela tient debout, au point de me demander si ce n’est pas un résultat généré à la va-vite par une IA
Le simple fait qu’un tel projet existe me rend triste. Je n’avais jamais même envisagé que des symboles choquants puissent apparaître par hasard dans un QR code
J’ai fait le calcul moi-même pour répondre à la question : « à quelle fréquence un énorme symbole nazi peut-il vraiment apparaître aléatoirement quand on génère un simple QR code ? » Le QR code n’est pas entièrement aléatoire, mais j’ignore cela ici.
Si l’on considère indépendamment les svastikas 5×5 et 7×7, chacun existe en deux orientations gauche/droite, deux polarités, et en version inversée ou normale, soit 8 motifs au total. L’ensemble des motifs possibles compte 2^25 = 33 millions de cas en 5×5 et 2^49 = 562 billions de cas en 7×7, donc la probabilité de contenir un svastika est respectivement de 2.38e-7 et 1.42e-14. Comme un QR code contient 289 zones 5×5 et 225 zones 7×7, la probabilité totale qu’au moins un svastika apparaisse dans une forme de QR code aléatoire est d’environ 0,00006, soit 1 sur 14 500. On peut aussi calculer 9×9 et au-delà, mais la probabilité de telles combinaisons de pixels est si faible que cela n’aurait pas d’effet significatif sur le résultat. Malheureusement, à en juger par le code source, ce projet semble avoir été fait en mode vibe coding, mais ce calcul, je l’ai fait moi-même à la main
Pour un projet aussi spécifique, je me demande s’il y a derrière une histoire particulière ou une blague.
Cela dit, quand on voit que des IA très défectueuses sont utilisées, par exemple parce que le hachage perceptuel de Microsoft photoDNA ne gère pas correctement les grilles de miniatures CSAM omniprésentes dans ses données d’entraînement, au point de suspendre des comptes Discord simplement à partir de captures d’écran de feuilles de calcul et de grilles de fabrication Minecraft, un outil plus générique d’évitement des motifs à risque paraît assez séduisant
Au lieu de répéter les problèmes du passé sous une nouvelle forme, il faudrait résoudre les problèmes réels. Il y a trop de gens bien trop susceptibles pour trouver ce genre de projet intéressant
Même si le but est d’éviter les svastikas dans les motifs de données, je me demande si le fait d’afficher les symboles sur la page web elle-même pourrait être illégal en Allemagne
D’après cet arrêt de la Cour fédérale de justice allemande, un svastika barré est autorisé, et pour le reste, comme il s’agit ici d’exemples de motifs que le code doit filtrer, il semble peu probable qu’il y ait un problème
https://en.wikipedia.org/wiki/Strafgesetzbuch_section_86a