# Byggde in en QR‑kodare — Reed‑Solomon över GF(256), fast modullayout, åtta maskmönster — på 522 rader i stället för att ta in ett tredje körtidsberoende, och verifierade den genom att läsa tillbaka den färdiga matrisen med en oberoende skriven avkodare.

augusti 2026

**Situation.** Dokumenten behövde en QR‑kod som länkade till onlineversionen. Varje tillgängligt bibliotek klarar det, och att ta ett av dem hade lagt till ett tredje beroende vid körning i ett projekt som avsiktligt hade hållit sig till två — en mallmotor och en PDF‑renderare — med argumentet att en dokumentgenerator fortfarande ska gå att installera om flera år.

**Uppgift.** Antingen måste beroendet godtas eller formatet implementeras, och implementationen måste verifieras som korrekt snarare än att bara producera något fyrkantigt och svart.

**Handling.** Kodaren är på 522 rader och implementerar de delar av specifikationen som användningen faktiskt kräver: kodning i byteläge, felkorrigering med Reed‑Solomon över Galoiskroppen med 256 element, där generatorpolynomet byggs med den grad som krävs, den fasta modullayouten med dess positionsmönster, tidsmönster och justeringsmönster, format- och versionsinformation, samt alla åtta datamaskmönster, som utvärderas mot specifikationens fyra regler för straffpoäng så att masken med lägst poäng väljs i stället för en fast mask. Verifieringen är den del som gjorde det försvarbart. Att testa en kodare mot dess egen logik bevisar ingenting, så den färdiga modulmatrisen läses tillbaka av en avkodare som har skrivits oberoende utifrån specifikationens läsordning, och testet säkerställer att den avkodade strängen är lika med indata. Det gör ”den producerar en rimlig bild” till ”den producerar en kod som avkodas till rätt URL”, och det kontrolleras vid varje körning i stället för en gång med blotta ögat och en telefon.

**Resultat.** Antalet beroenden vid körning stannade på två, och kodaren är den enda komponenten som projektet bär med sig i sitt eget källträd. Det ska sägas rakt ut att detta inte är en allmän implementation — den stöder de lägen och versioner som dokumenten använder och ingenting annat, och den ärliga motiveringen är beroendebudgeten snarare än något påstående om att resultatet är bättre än ett moget bibliotek.

---

- Roll: Python‑ingenjör
- Kategorier: [Backendutveckling](https://engineer.company/sv/categories/backend/), [Prestandaoptimering](https://engineer.company/sv/categories/performance/), [Test och kvalitetssäkring](https://engineer.company/sv/categories/testing/), [Python](https://engineer.company/sv/categories/python/), [Dokumentation](https://engineer.company/sv/categories/documentation/)
- Tjänster: [Plattforms- och lösningsarkitektur](https://engineer.company/sv/services/platform-architecture/), [Backend- och API‑utveckling](https://engineer.company/sv/services/backend-development/)

<https://engineer.company/sv/portfolio/vendored-a-qr-encoder-in-522-lines-148/>
