QR error correction helps and hinders scanning
huonw.github.io
huonw.github.io
That said, in practice, a quiet zone of one module or even only partial quiet zones (around the position patterns) seems to work: https://qrworld.wordpress.com/2011/08/09/the-quiet-zone/
A little tech love such as using short URL’s with an intermediate backend that redirects to the complex site URL with a dozen query parameters would allow much lower resolution (lower version) QR codes that can be scanned faster and/or from a further distance away resulting in better health outcomes. Or at least minimise the negative health outcome from the scanning process.
As the sibling says, there’s some data that is useful to store in every code to enable user-friendly offline check-ins, but they could indeed be much easier to scan and still retain this property.
We know that none of this data ever changes, these sheets are printed once and are not actively replaced
I haven’t investigated the Victorian ones deeply, but I would imagine that the name is only used as a confirmation for the user, and a minimal or manual check-in requires only the ID.
HTTP:// <SHORT DOMAIN> / CODE
Dropping S in HTTPS gives one extra character if you do a 302 redirect. This is fast enough if the server is hosted in same country (which it should be for health data).
6 alphanumeric dropping confusing O0I1 gives 32 chars. 4 digits allows 1M businesses. 5 is 32M. Probably enough.
To fit Version 1 (lowest possible resolution 21x21) using only capital letters including colon and forward slash, you have 25 chars available for low ecc, and 20 chars for medium.
Since the QR code is such low simple resolution we can use Low ECC.
That allows for a domain ending with .state.gov.country (assuming state is 3 chars, country is 2). For example:
HTTP://Q.NSW.GOV.AU/ABCDE
There’s your 32M codes available as a Version 1 QR.
However, it loses some of the niceties for offline check-in (the business name, in particular), without an in-app data source.
And, unfortunately, it low resolution doesn't help that much with error correction: v1 does seem to be slightly easier to scan, but only a little, and the ratios of codes scanned is pretty much the same across all versions:
ec_level L M Q H
version
1 38 46 54 65
2 32 39 49 52
3 32 41 43 50
4 32 40 46 49
5 30 39 42 49
...
39 32 41 46 50
40 31 41 47 51
total 1257 1600 1839 2001
(This is the table in the "Error correction really does make scanning more reliable" section broken down by version.)By this table, the most-scannable encoding under the experimental conditions from the post for that data is ec level H, which requires version 3 (without considering the field-of-view required).
What I would love is poster sized QR codes instead of a small patch of an A4 page. That way you could scan it from afar.
https://i.imgur.com/SHEmEPn.gif
I already know this is a URL with tracking parameters etc. As it encodes so much data and I am in a hurry, it takes my phone forever to scan.
Meanwhile, this QR code would have led me to their site as well:
That's the least common use case. They actually work well for their intended use cases, which are (a) a passenger scanning it from a care a few feet away moving at relatively the same speed (such as on the highway), and (b) the code being scanned while waiting at a stop light (maybe dozens of feet away).
I make URLs that look like
https://gen5.info/$/XQ*42RXF-TLY:$B.8/
(That is the digital twin of an installation on the wall behind me as I type, each square is 8 by 8 inches; the barcodes on the back of the cards are NOT high density, three-sided cards from that generation that link to external sites link directly to low density URLs. New generation three-sided cards use "QRLs" that redirect to external links.)
which are "version 2" QR codes that are larger only than "version 1" QR codes which don't have the little alignment dot in the lower right and don't scan as well. The URL above uses M level error correction, with L level error correction I can make URLs that are a bit longer.
I manage either length of code much like a type 4 UUID and in the later case the space is large enough that I (you and 8 billion of my closest friends) could make every URL unique and be perfectly able to track people at the expense of keeping a database entry for every unique code.
My take is that the degree of compression doesn't matter much in my case because with high density QR codes you can print them large enough that barcode readers have no problem with them.
My experience is that the QR code reading experience on iPhones is night-and-day better than that on cheap Android devices. I think a lot of people are testing barcodes on iOS and have no idea that they scan poorly or not at all for other uses. For one thing, any camera has a minimum depth that it focuses at and if you print a QR code too small you have to hold the camera close to the code to read it and the camera can't focus. Another problem is that most QR code reading programs just don't read white-on-black codes even if the standard allows them. For that matter, many QR code readers require much higher contrast than the standard specifies, and even the standard is conservative compared to what is possible with a generously sized code.
I'm surprised I haven't seen NFC tags being used for covid check-ins as a secondary option to QR codes
Yeah, glossy paper (or glass) leading to reflections can be bad. The worst one I’ve seen is printed at A5 size (on an A4 page…) and then placed behind glass, outside. Basically useless!
I would imagine that NFC requires too much actual hardware, whereas printing is cheap and common.
Other requirements, like that it decodes to something that is meaningful, are secondary.
Alok's quine work is interesting. The actual quining is trivial because the program pulls out its own image using Location.href. (The trick seems to be that when JS code is embedded in a literal "data:" URL, then the Location.href can pull out that URL itself. I'm not a JS person, though.) It looks like the hard work in this project was developing the QR code encoder using a verbose OOP approach, and then code golfing it through 25 steps to make it small.
import qrcode
with open(__file__) as f:
img = qrcode.make(f.read())
img.show()
Could be improved upon, but works as an example :) checky argent and sable
5 square voided in saltire palewise argent
12 square inverted sable in dexter chief a square voided fesswise argent
on a plain cross escartelly checky sable and argent 3 square voided fesswise inverted argent
in third quarter 3 square voided in bend sinister argent
in first quarter 3 square voided in bend argent
I used the interpreter at drawshield.net.Of course it’s not too useful to speculate about what’s required beyond adherence to the specification, it depends on what the scanners your users use accept.