Spring til indhold

Har indlejret en QR‑encoder på 522 linjer

Har indlejret en QR‑encoder — Reed‑Solomon over GF(256), fast modullayout, otte maskemønstre — på 522 linjer i stedet for at tage en tredje runtime‑afhængighed ind og verificeret den ved at læse den færdige matrix tilbage med en uafhængigt skrevet dekoder.

  • Nature, wooden, qr code
    Foto: viarami / Pixabay
  • Mosaic, hd wallpaper, tiles
    Foto: 652234 / Pixabay

522 linjers QR‑encoder i stedet for en tredje afhængighed

Situation. Dokumenterne havde brug for en QR‑kode, der henviser til onlineversionen. Alle tilgængelige biblioteker kan det, og at tage et af dem ville have tilføjet en tredje kørselsafhængighed til et projekt, der bevidst havde holdt sig til to — en skabelonmotor og en PDF‑gengiver — ud fra det argument, at en dokumentgenerator stadig skal kunne installeres om flere år.

Opgave. Enten skulle afhængigheden accepteres eller formatet implementeres, og implementeringen skulle efterprøves som korrekt og ikke blot frembringe noget firkantet og sort.

Handling. Indkoderen er på 522 linjer og implementerer de dele af specifikationen, som formålet reelt kræver: indkodning i byte‑tilstand, Reed‑Solomon‑fejlkorrektion over Galois‑legemet med 256 elementer med generatorpolynomiet bygget i den krævede grad, det faste modullayout med dets søgemønstre, timingmønstre og justeringsmønstre, format- og versionsinformation samt alle otte datamaskemønstre vurderet mod specifikationens fire strafregler, så masken med den laveste score vælges i stedet for en fast. Efterprøvningen er den del, der gjorde det forsvarligt. At teste en indkoder mod dens egen logik beviser intet, så den færdige modulmatrix læses tilbage af en afkoder, der er skrevet uafhængigt ud fra specifikationens læserækkefølge, og testen fastslår, at den afkodede streng er lig med inddata. Det gør “den frembringer et plausibelt billede” til “den frembringer en kode, der afkoder til den rigtige URL”, og det tjekkes ved hver kørsel og ikke én gang med øjet og en telefon.

Resultat. Antallet af kørselsafhængigheder forblev to, og indkoderen er den eneste medleverede komponent i projektet. Det skal siges ligeud, at dette ikke er en generel implementering — den understøtter de tilstande og versioner, dokumenterne bruger, og intet andet, og den ærlige begrundelse er afhængighedsbudgettet og ikke nogen påstand om, at resultatet er bedre end et modent bibliotek.

Ét stykke af en længere fortegnelse — og det hele ligger her på sitet.

Hver post er skrevet på samme måde: situationen, opgaven, hvad vi gjorde, og hvad der ændrede sig.

Se hele fortegnelsen