QR kôdovi - Pametne črčke

Posljednjih godina svjedoci smo ekspanzije fenomena koji se polako ali sigurno integrirao u društvo, a to su QR kôdovi. Srećemo ih svakodnevno u najrazličitijim situacijama i na najrazličitijim mjestima, od onih očekivanih, kao što su računi u trgovinama, nalozi za plaćanje, ID kartice, vizitke, artikli u trgovinama, oglasi u novinama, flyeri, vozne karte, na autobusima, na oglasnim panoima... do manje očekivanih kao što su novčanice (Rusija, Uganda) ili čak nadgrobni spomenici

Zoran Tica subota, 1. lipnja 2019. u 00:00
Upotreba QR kôda u komercijalne namjene
Upotreba QR kôda u komercijalne namjene

Svoju ekspanziju doživjeli su zahvaljujući ekspanziji “pametnih” mobilnih naprava – telefona i tableta, na kojima su se pojavile aplikacije koje su bile u stanju preko kamere skenirati QR kôd, brzo pročitati njegov sadržaj i s pročitanim podacima izvesti odgovarajuću akciju. Ako uzmemo u obzir da danas više od dvije trećine populacije planeta Zemlje posjeduje pametni mobilni uređaj i ima mogućnost skenirati i koristiti QR kôdove, shvatimo da je to ogromno komercijalno tržište na koje se mogu plasirati QR kôdovi u svojim najrazličitijim oblicima i namjenama.

Masahiro Hara, razvijatelj QR kôdova
Masahiro Hara, razvijatelj QR kôdova

Sam naziv QR kôd skraćenica je od “Quick Response” kôd, odnosno kôd s brzom reakcijom – odgovorom. Prema obliku su dvodimenzionalni matrični kôdovi, koji su nastali kao nadgradnja jednodimenzionalnih linearnih UPC bar-kôdova zbog potrebe da se na što manjoj površini prikaže što veća količine podataka. Za njihovo čitanje i upotrebu potreban je odgovarajući uređaj opremljen optičkim čitačem i programom za dekodiranje podataka, kao što je, primjerice, mobilni telefon s kamerom.

Praćenje porijekla hrane preko QR kôdova
Praćenje porijekla hrane preko QR kôdova

Svjetski standardi

QR kôdovi nisu tako mladi kao što se može zaključiti na temelju početka njihove komercijalne ekspanzije. Nastali su 1994. godine u Japanu, i prvi oblici razvijeni su za potrebe japanske autoindustrije. Razvila ih je tvrtka Denso Wave (https://www.denso-wave.com/en), a tadašnji razvoj vodio je Masahiro Hara.

S gledišta standardizacije, QR kôdovi nisu samo jedna neuređena gomila pravila i dogovora koju je donijela grupica tvrtki, odnosno korisnika, već podliježu svjetskim standardima. Najprije ih je u listopadu 1997. godine standardizirao AIM (Association for Automatic Identification and Mobility), nakon toga, u siječnju 1999. godine, uključeni u JIS (Japanese Industrial Standards), a u lipnju 2000. godine postali su dio ISO standarda (ISO/IEC 18004:2000, ISO/IEC 18004:2006 i ISO/IEC 18004:2015).

Prva varijanta QR kôda iz 1994. godine imala je naziv “Model 1”, ali je vremenom nadograđena. Povećan je kapacitet, a istodobno je olakšano čitanje i dekodiranje podataka, te je tako nastala nova varijanta s nazivom “Model 2”, i to je danas najzastupljenija komercijalna varijanta. Postoje i druge varijante koje su prilagođene specijalnim namjenama, kao što su “Micro QR” kôd (specijaliziran da dimenzijski bude što manji), “iQR” kôd (povećan kapacitet, a za razliku od modela 2, može imati oblik pravokutnika), “SQRC” kôd (mogućnost enkripcije podataka), “Frame” QR kôd (postavlja se kao okvir oko slike).

Struktura matrice QR kôda
Struktura matrice QR kôda

Tekst koji se kodira u QR kôd moguće je oblikovati tako da QR kôd čitač sam prepozna namjenu teksta i na temelju toga izvede odgovarajuću akciju. Primjerice, ako se u QR kôdu nalazi kodiran link na internetsku stranicu, pametni telefon će nakon skeniranja kôda sam otvoriti pretraživač i prikazati tu stranicu. Link će prepoznati na temelju prefiksa linka “http://” ili “https://”. Slično je moguće u QR kôd kodirati podatke za slanje elektronske pošte (prefiks “mailto:”, primjerice, “mailto:zoran.tica@gmail.com?subject=Hello%20Zoran”), kontaktne informacije za telefonski imenik (u MECARD, odnosno vCard formatu), telefonske brojeve (prefiks “tel:”, primjerice, “tel:0038670212278”), SMS ili MMS poruke (prefiks “sms:”, primjerice, “sms:0038670212278:Hello%20Zoran”), geokoordinate za mape i navigaciju (prefiks “geo:”, primjerice, “geo:46.074619,14.496143”), podatke za konekciju na WiFi mrežu (prefiks “WIFI:”, primjerice, “WIFI:T:WPA;S:mynetwork;P:mypass;;”), a u posljednje vrijeme je definirana podrška i za kalendar i događaje (iCalendar i vCalendar format).

Maskiranje matrice QR kôda
Maskiranje matrice QR kôda

Terminologija

QR kôdovi, kao i svako specifično područje, posjeduje svoju terminologiju. QR kôd matrica sastavljena je iz kvadratića crne ili bijele boje, koji se nazivaju “moduli”. Veličina matrice naziva se “verzija”, i njene vrijednosti su za QR kôd “Model 2” od 1 do 40. Verzija 1 ima veličinu 21 puta 21 modul, a verzija 40 ima veličinu 177 puta 177 modula. Razlika između dvije verzije su 4 modula te tako verzija 2 ima veličinu 25 x 25, verzija 3 29 x 29, i tako dalje do verzije 40.

Dobra osobina QR kôdova je to što posjeduju mehanizam korekcije greški pri čitanju i dekodiranju podataka. Do greški pri čitanju može doći zbog različitih razloga kao što su fizičko oštećenje kôda, pozicija kôda (cijeli kôd nije vidljiv), kuta čitanja, programske greške pri kodiranju ili dekodiranju i slično. Mehanizam je implementiran tako što su u QR matricu pored željenog teksta zapisani i kôdovi za korekciju greške, koji se koriste da se nepravilno dekodiran tekst restaurira. Za varijantu QR kôdova “Model 2” postoje 4 razine korekcije greški u ovisnosti od toga koliku su količinu teksta sposobni restaurirati. To su L, M, Q i H (“Low”, “Medium”, “Quartile” i “High” respektivno). Low može restaurirati 7% teksta, Medium 15%, Quartile 25% i High 30%. Potrebno je obratiti pozornost na činjenicu da kôdovi za korekciju greške također zauzimaju prostor u QR kôdu. Viša razina korekcije zauzima više prostora, i zbog toga se može dogoditi da je za istu količinu teksta potreban dimenzijski veći QR kôd, odnosno viša verzija.

Za izračun rasporeda crnih i bijelih modula QR matrice dovoljno je definirati dva podatka – ulazni tekst koji se želi kodirati u QR kôd i razinu korekcije greške (L, M, Q ili H). Proces izračuna rasporeda crnih i bijelih modula QR matrice sastoji se od šest koraka: analiza ulaznog teksta, kodiranje ulaznog teksta u binarni oblik, izračun kôdova za korekciju greške, priprema ulaznog teksta i kôdova za korekciju greške za upis u QR matricu, strukturiranje osnovnog oblika QR matrice i maskiranje podataka u matrici.

HCC2D kôdovi
HCC2D kôdovi

Analiza ulaznog teksta

U prvom koraku (analiza ulaznog teksta) cilj je odrediti tip ulaznog teksta i verziju. Postoje četiri različita tipa – numerički, alfanumerički, ISO 8859-1 i “Kanji”. Ako se ulazni tekst sastoji isključivo od brojeva, to je numerički tip. Ako se sastoji isključivo od brojeva, velikih slova, znaka “space” i znakova “$%*+-./:”, to je alfanumerički tip. Ako su znakovi iz seta ISO 8859-1, to je ISO 8859-1 tip. “Kanji” tip je posebni tip za japanske znakove. Nakon što se odredi tip ulaznog teksta, izračuna se koliko ulazni tekst ima znakova. Na temelju tipa ulaznog teksta, ulazne razine korekcije grešaka i broja znakova ulaznog teksta (dužine), iz preddefinirane tabele odredi se verzija, odnosno veličina, QR matrice. U tabeli je prikazano koliko određena verzija maksimalno može sadržavati znakova, s obzirom na tri spomenuta kriterija. Primjer: ulazni tekst “HTTP://WWW.ZT-TECH.EU” alfanumeričkog je tipa, ima dužinu 21 znak, i za razinu korekcije greške Q mora se koristiti verzija 2, koja sadržava maksimalno 29 znakova. Verzija 1 ne odgovara jer sadrži maksimalno 16 znakova.

U drugom koraku (kodiranje ulaznog teksta u binarni oblik) cilj je da se indikator tipa ulaznog teksta, broj znakova teksta, i sam ulazni tekst kodiraju u binarni niz. Indikator tipa teksta je dug 4 bita. Broj znakova teksta kodira se kao binarni broj dužine od 8 do 16 bitova, ovisno o verziji i tipu ulaznog teksta. Sam tekst kodira se na različite načine, ovisno o tipu teksta. Najjednostavnije se kodira tip ISO 8859-1, kod kojega se ASCII vrijednost svakog znaka kodira u 8-bitni binarni broj. Ako je ulazni tekst kraći od maksimalne količine znakova koju verzija može sadržavati (određeno u tabeli), onda se na kraj dodaju bajtovi 236 i 17 naizmjenično, dok se maksimalna količina znakova ne popuni. Ti bajtovi se također kodiraju u 8-bitni binarni oblik, i tako popune binarni niz do kraja.

U trećem koraku (izračun kôdova korekcije greške) cilj je da se za kodirani ulazni tekst iz prošlog koraka izračunaju kôdovi za korekciju greške. Najprije se binarni niz kreiran u drugom koraku podijeli na 8-bitne binarne brojeve, i oni se pretvore u decimalne brojeve raspona od 0 do 255, takozvane elemente. Za veću količinu ulaznog teksta posljedično se dobije i veća količina decimalnih brojeva, odnosno elemenata, koji se prema potrebi podijele u grupe. Broj grupa, broj elemenata u grupi, i broj kôdova za korekciju greške odredi se iz preddefinirane tabele, gdje su kriteriji verzija (veličina matrice) i ulazna razina korekcije greške. Nakon što se elementi podijele u grupe, za svaku se grupu izvede izračun kôdova korekcije greške.

Korekcija greške

Kôdovi za korekciju greške računaju se pomoću algoritma Reed-Solomon koji koristi metodu dijeljenja dva polinoma visokog stupnja (“Polynomial Long Division”), gdje se osnovni polinom (takozvani “Message” polinom) dijeli s “Generator” polinomom, a ostatak dijeljenja određuje kôdove za korekciju greške. Osnovni polinom definira se iz elemenata grupe kao element1*Xn+element2*Xn-1+...+elementn*X0, gdje je “n” broj elemenata u grupi. Generator polinom se definira kao (x – α0)* (x – α1) * ... * (x – αn-1), gdje je “n” broj kôdova za korekciju greške tekuće grupe. Njegova osobina je ta da nije ovisan o ulaznom tekstu, odnosno elementima grupe, nego samo o broju kôdova za korekciju greške, tako da za određeni broj kôdova korekcije greške uvijek ima isti oblik. Primjerice, za 16 kôdova korekcije greške oblik je uvijek α0x16 + α120x15 + α104x14 + α107x13 + ... + α120. Matematičke operacije izvode se u Galoisovom polju 256. Osnovni polinom ima indekse u decimalnom obliku, generator polinom ima indekse u logaritamskom obliku, i zato se izvodi transformacija indeksa iz decimalnog u logaritamski oblik i obrnuto. Za lakšu transformaciju postoji preddefinirana tabela transformacije iz jednog oblika u drugi. Zbrajanje i oduzimanje indeksa u Galoisovom polju izvodi se kao XOR operacija. Indeksi polinoma koji ostane na kraju dijeljenja su kôdovi za korekciju greške. To su cijeli brojevi u rasponu od 0 do 255.

U četvrtom koraku (priprema ulaznog teksta i kôdova za korekciju greške za upis u QR matricu) cilj je da se elementi i kôdovi za korekciju greške uvrste u niz decimalnih brojeva i pretvore u binarni niz. Najprije se pomiješaju među sobom elementi pojedinih grupa i sastavi se niz elemenata. Niz započne prvim elementom prve grupe, zatim prvim elementom druge grupe, i tako dalje, koliko ima grupa. Zatim se niz nastavlja drugim elementom prve grupe, drugim elementom druge grupe, i tako dalje do kraja. Zatim se sličan postupak ponovi s kôdovima za korekciju greške (prvi kôd prva grupa, prvi kôd druga grupa...). Na kraju se svi brojevi u nizu, najprije elementi a zatim i kôdovi za korekciju greške, pretvore u 8-bitne binarne brojeve i spoje u binarni niz koji će se integrirati u QR kôd matricu.

U petom koraku (strukturiranje osnovnog oblika QR matrice) cilj je da se prazna matrica, dimenzija n puta n modula, popuni bijelim i crnim modulima i tako definira osnovni oblik matrice. U QR matrici nalaze se fiksni dijelovi koji nisu ovisni o ulaznim podacima (tekst i razina korekcije greške) i dijelovi koji su ovisni. Dijelovi koji nisu ovisni su sljedeći. “Finder patterns” su tri veća kvadrata dimenzija 7x7 modula, locirana u gornjem desnom, gornjem lijevom i donjem lijevom kutu matrice, koje čitač koristi za glavnu orijentaciju matrice pri čitanju. “Separatori” su linije bijelih modula, debljine jedan modul, koji odvajaju findere od ostalog dijela matrice. “Timing patterns” su dvije linije naizmjeničnih crnih i bijelih modula (jedna vertikalna i druga horizontalna), debljine jedan modul, koje povezuju tri finder patterna. “Alignment patterns” su manji kvadrati dimenzija 5x5, koji su raspoređeni na određenim koordinatama po matrici, a koordinate se mogu dobiti iz preddefinirane tabele (kriterij je verzija, odnosno veličina matrice).

Uz donji lijevi finder nalazi se jedan tamni modul. “Quiet Zone” je okvir bijelih modula oko matrice, širine 4 modula. Dijelovi koji su ovisni o ulaznim podacima su informacije o verziji i formatu QR kôda te kodiran ulazni tekst i kôdovi za korekciju greške. Informacija o verziji zapisuje se uz gornji desni i donji lijevi finder. Svaka verzija ima svoj preddefinirani binarni zapis koji se može naći u tabeli. Za informacije o formatu, koji se određuje u sljedećem, šestom koraku, rezerviraju se moduli iz sva tri findera. Kodiran ulazni tekst i kôdovi za korekciju greške (binarni niz definiran u prethodnom koraku) bilježe se u prazne module, počevši od donjeg desnog kuta matrice. Binarna jedinica ekvivalentna je crnom modulu, a nula bijelom modulu. Popunjavaju se u dvije kolone u smjeru prema gore (desna i lijeva naizmjenično) u prazne module koji nisu prethodno popunjeni. Kada se dođe do vrha matrice, popunjavaju se sljedeće dvije kolone prema lijevo. Postupak se ponavlja dok se ne popune svi moduli. Tako je definiran osnovni oblik matrice.

Maskiranje podataka

U šestom koraku (maskiranje podataka u matrici) cilj je da se izvede transformacija matrice na osam različitih načina i da se odabere oblik matrice koji je čitaču najlakši za čitanje. Čitači imaju problema s čitanjem ako su crni i bijeli moduli previše grupirani, ako u matrici ima previše crnih ili bijelih modula, ili ako su moduli raspoređeni tako da podsjećaju na findere. Zato se izvodi “maskiranje”, odnosno postupak da moduli u matrici na određenim pozicijama zamijene boju – crni postaju bijeli i obrnuto. Postoji osam postupaka maskiranja, i za svaki se postupak kreira kopija osnovne matrice, na kojoj se zatim izvodi maskiranje. Svaki postupak ima svoju formulu, u kojoj su dvije promjenjive – broj reda i kolone modula. Primjer jedne formule je “(red + kolona) mod 2 == 0”. U formulu se uvrste red i kolona (koordinate) svakog modula u matrici.

Ako je formula za koordinate modula točna, taj se modul “maskira” – crni postane bijeli, i obrnuto. Maskiraju se samo moduli koji sadrže podatke o ulaznom tekstu i kôdove za korekciju greške. U svaku se kopiju matrice upiše informacija o formatu (postupku) u module koji su u prethodnom koraku rezervirani, i nakon toga je kopija matrice do kraja popunjena i maskirana. Nakon što se kreira osam kopija matrice, potrebno je odrediti, odnosno izmjeriti, koja kopija matrice je čitaču najlakša za čitanje. Postoje četiri kriterija za mjerenje. Prvi kriterij provjerava postoje li horizontalne ili vertikalne grupe modula iste boje, drugi kriterij provjerava postoje li kvadratne grupe modula iste boje, treći kriterij provjerava postoje li horizontalne ili vertikalne grupe koje podsjećaju na findere, i četvrti kriterij provjerava odnos broja crnih i bijelih modula. Svaki kriterij izračuna svoj broj penala (negativnih točaka). Suma penala sva 4 kriterija predstavlja ukupan broj penala kopije matrice. Što manje penala, to je kopija matrice lakša za čitanje. Na kraju se odabere kopija matrice koja ima najmanje penala. Ta kopija matrice zatim se koristi kao rezultat cjelokupnog izračuna i predstavlja željeni QR kôd.

Za generiranje QR kôdova postoje biblioteke za skoro sve programske jezike koje omogućuju da se QR kôdovi izračunaju i prikažu korisniku u raznim grafičkim oblicima (kao tekst, slika, HTML kôd i slično). Isto tako, postoje internetske stranice i internetski servisi za generiranje QR kôdova.

Evolucija QR kôdova, s tehničkog i korisničkog gledišta, definitivno nije završena. Istraživači su zaokupljeni otkrivanjem novih oblika QR kôdova koji će povećati njihov kapacitet i načiniti ih još manje osjetljivima na greške. Jedna od tehničkih inovacija na tom području su High Capacity Colored 2-Dimensional kôdovi (“HCC2D” kôdovi) koji koriste module, ne samo crne i bijele boje, nego različitih boja. Korisničku evoluciju danas uglavnom diktiraju komercijalne potrebe tržišta, i te potrebe oblikuju forme i ideje kako da se novi način upotrebe QR kôdova plasira krajnjim korisnicima. No, jedno je sigurno – za oba toka evolucije tek ćemo vidjeti u kojem će ih smjeru ljudska kreativnost usmjeriti, i s kakvim ćemo se oblicima i uporabama kôdova u budućnosti sresti.

Prezentacija PL/SQL Oracleova rješenja na HROUG konferenciji 2018
Prezentacija PL/SQL Oracleova rješenja na HROUG konferenciji 2018

NAPOMENA: Ovaj tekst je izvorno objavljen u časopisu Mreža.