4 पॉइंट द्वारा GN⁺ 2024-01-23 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • QR कोड को हाथ से decode करने के लिए version 1 के 21×21 modules की संरचना से लेकर mask हटाने और byte conversion तक की step-by-step प्रक्रिया व्यवस्थित की गई है
  • finder pattern, timing pattern, format information, quiet zone जैसे special areas पहचान के लिए ज़रूरी हैं, लेकिन वास्तविक data पढ़ते समय इन्हें skip करना होता है
  • data को format information से mask pattern और error correction level की पुष्टि करने के बाद, mask में काले module वाली हर position पर QR code modules को flip करके restore किया जाता है
  • नीचे दाईं ओर से शुरू करके दो columns के हिसाब से zigzag order में पढ़ा जाता है, और Byte mode में 8-bit length के बाद आने वाले 8-bit groups character bytes बनते हैं
  • error correction area को हाथ से हल करने की ज़रूरत नहीं है; simple QR codes में length field जितने bytes बताए, उतने पढ़कर ASCII table से बदल दें तो decode किया जा सकता है

हाथ से पढ़ने के लिए QR कोड तैयार करना

  • practice के लिए QR code तीन तरीकों से तैयार किया जा सकता है
    • कोई भी text डालकर नीचे समझाए गए QR code को update करें
    • camera से मौजूदा QR code scan करके उसे पढ़ना सीखें
    • random English words से practice करें; शब्द दिखाए नहीं जाते, इसलिए training के लिए इस्तेमाल किया जा सकता है
  • example QR code का size 21×21 modules है
  • QR code में pixel के बराबर unit को module कहा जाता है
  • QR code size को version से अलग किया जाता है
    • सबसे छोटा version 21×21 modules का होता है
    • इसके बाद हर version में एक side का size 4 से बढ़ता है
    • 21×21 modules वाला QR code version 1 है

QR code में skip किए जाने वाले special areas

  • finder pattern scanner को पहले QR code identify करने में मदद करता है
  • finder pattern के आसपास की खाली lines content पढ़ते समय skip करनी चाहिए
  • version 1 QR code में alignment pattern नहीं होता
    • alignment pattern एक additional pattern है, जो scanner को QR code सही तरीके से पढ़ने में मदद करता है
  • timing pattern दो lines होती हैं जिनमें black और white modules हमेशा बारी-बारी से आते हैं; ये scanner को QR code सही तरीके से पढ़ने में मदद करती हैं
  • format information mask pattern और error correction level तय करती है
    • vertical format information और horizontal format information होती है
    • timing pattern दोनों lines को काटते हुए गुजरता है
  • quiet zone QR code के आसपास की white border है
    • यह scanner को QR code की शुरुआत और अंत identify करने में मदद करती है

mask pattern हटाना

  • QR code बड़े black blocks या white blocks से बचने के लिए mask का इस्तेमाल करता है
  • mask के कुल 8 options होते हैं
  • example में mask pattern bits check करने के लिए black module को 1 और white module को 0 के रूप में पढ़ा जाता है
    • example bits binary 110 हैं
    • 110 decimal 6 के बराबर है
  • हर mask type का एक predefined pattern होता है
  • example QR code का pattern black-and-white rainbow के एक हिस्से जैसा दिखने वाला pattern है
  • mask को data area के ऊपर repeat करके रखें, फिर mask में जहाँ black module हो, उन positions पर QR code modules को flip करें
  • सभी mask types की cheat sheet वाली DIY zine उपलब्ध है
    • छोटी booklet की तरह fold करने का example इस guide image में देखा जा सकता है

encoding mode और पढ़ने का order

  • content decode करने की शुरुआत पहले encoding mode check करने से होती है
  • encoding information हमेशा नीचे दाएँ कोने में होती है
  • encoding mode को भी पहले mask apply करके हटाना होता है
    • example में cheat sheet देखकर दो boxes को XOR किया जाता है
  • encoding modes में Numeric, Alphanumeric, Byte, ECI, Kanji आदि शामिल हैं
  • example QR code का encoding mode Byte(4) है
  • content नीचे दाएँ कोने से शुरू होता है
    • दो columns के बीच zigzag में ऊपर जाते हुए पढ़ें
    • फिर बाईं ओर के अगले दो columns में zigzag में नीचे आएँ
    • सभी special areas हमेशा skip करें

length और bytes decode करना

  • पहले 4 bits encoding mode होते हैं
  • Byte mode में अगले 8 bits content length specify करते हैं
  • इसके बाद हर 8 bits एक content byte बनते हैं
  • length information को भी mask apply करके हटाना होता है
  • example की mask हटाई गई length information 00001100 है
    • decimal में 12
    • इसका मतलब total content length 12 bytes है
  • पहला mask हटाया गया byte 01001000 है
    • hexadecimal में 0x48
    • उससे मेल खाने वाला ASCII character H है
  • दूसरा mask हटाया गया byte 01100101 है
    • hexadecimal में 0x65
    • उससे मेल खाने वाला ASCII character e है
  • बाकी bytes practice के लिए छोड़े गए हैं; पहले पढ़ी गई length field जितने characters बताए, उतने पढ़कर रुक सकते हैं

ASCII table और error correction

  • ASCII table का इस्तेमाल करके hexadecimal values को characters में बदला जा सकता है
  • lowercase letters में a 0x61 से शुरू होता है और z 0x7A पर खत्म होता है
    • बीच के characters गिनकर खोजे जा सकते हैं
  • बाकी बचा हर area content नहीं होता
  • QR code में error correction भी शामिल होता है
    • इससे कुछ हिस्सा damaged, blurred या missing होने पर भी QR code पढ़ा जा सकता है
    • error correction mathematics से generate होता है, लेकिन हाथ से पढ़ने के उद्देश्य में इसे cover नहीं किया जाता
  • simple QR code को हाथ से decode करने की प्रक्रिया सीखने के बाद, random code button से छोटे English words की practice की जा सकती है, या Scan code button से actual QR code scan किया जा सकता है
  • source code Codeberg पर है
    • UTF-8 encoding mode समझाने वाले PR का विशेष स्वागत है

1 टिप्पणियां

 
GN⁺ 2024-01-23
Hacker News की राय
  • 90 के दशक के आखिर या 2000 के दशक की शुरुआत में मैं Atari 8-bit डिस्क की सामग्री को PC पर ले जाना चाहता था
    मुझे Atari के SIO पोर्ट और PC serial port को जोड़ने वाले SIO2PC केबल और software के बारे में पता था, लेकिन उस समय मेरे पास उसे खुद बनाने लायक electronics skills नहीं थीं
    आखिरकार मैंने Atari पर एक Basic प्रोग्राम लिखा जो डिस्क को sector-दर-sector पढ़ता था, और उसे graphics mode 3 के बड़े 4-color pixels के रूप में स्क्रीन पर बनाता था; फिर Atari को PC के TV card से जोड़ा और एक Delphi प्रोग्राम से लगातार screenshots लेकर डेटा decode करवाया
    खाली sectors की वजह से pixel position correction बिगड़ जाती थी, इसलिए मैंने mask pattern, checksum, और sector address तक जोड़ दिए, और उस तरीके से डिस्क की पूरी सामग्री PC पर ले जा सका
    आज भी मैं इसे अपनी सबसे बड़ी engineering achievement मानता हूँ
    लगभग 10 साल बाद मैंने AspeQt नाम का SIO2PC प्रोग्राम बनाया, और उसका नया community fork RespeQt आज भी इस क्षेत्र में सबसे ज़्यादा इस्तेमाल होने वाला tool है; AtariAge पर इसका dedicated subforum भी है: https://forums.atariage.com/forum/184-respeqt-sio2pc-softwar...

    • इससे 1st-gen iPod firmware और keys की reverse engineering का तरीका याद आता है
      कहा जाता है कि LCD backlight से bit pattern blink कराया गया था और camera से वह डेटा पढ़ा गया था: https://mastodon.social/@bagder/111538350617290554
    • जितने ज़्यादा locked-down systems आम होते जाएँगे, इस तरह का display-based data exfiltration उतना ही भविष्य वाला लगता है
  • “error correction जटिल गणित है, इसलिए हाथ से पढ़ने में उसे नहीं देखते” वाली बात को थोड़ा और विस्तार चाहिए
    गणित मुश्किल है, यह समझ में आता है, लेकिन error correction data आखिर में जुड़ता है, हर byte के बाद आता है, या बीच में डाला जाता है—यह जानने की जिज्ञासा है
    अगर QR code खराब न हुआ हो, तो क्या error correction मौजूद होने पर भी गणित वाले हिस्से को छोड़कर उसे हाथ से पढ़ा जा सकता है, यह भी जानना चाहूँगा

    • barcode में आख़िरी अंक को checksum के रूप में इस्तेमाल किया जाता है, और अंकों को जोड़कर-गुणा करके % 10 जैसी गणना की जाती है, जिससे 0~9 में से एक मान मिलता है
      इसलिए डेटा गलत होने पर भी संयोग से checksum सही निकलने की संभावना 1/10 होती है, और वैसे भी आख़िरी अंक वास्तविक product के unique barcode ID के लिए महत्वपूर्ण नहीं होता
      Home Depot में return करने जा रहे सामान के barcode का checksum digit फटकर खराब हो गया था; मैं manual lookup से पहले उसे खुद गणना करने के लिए बेतहाशा जल्दी कर रहा था, लेकिन आखिरकार कर्मचारी मुझसे तेज़ निकला, और वह बात आज तक नहीं भूला हूँ
      https://www.gs1.org/services/how-calculate-check-digit-manua...
      https://www.simplybarcodes.com/barcode_check_digit_calculato...
    • QR code के भीतर का डेटा कई alphabets में से किसी एक के रूप में bitstream में encode किया जाता है; byte उनमें से सिर्फ़ एक है
      उसके बाद size और error correction level के अनुसार bitstream को blocks में बाँटा जाता है, हर block के लिए error correction data निकाला जाता है, और फिर blocks को interleave किया जाता है
      इसलिए यह तरीका error correction level की परवाह किए बिना QR version 5 से आगे विफल हो जाता है, और version 3~5 में भी high error correction level होने पर काम नहीं करता
    • An Artisanal QR Code दिखाता है कि लंबी भाग जैसी arithmetic से checksum को हाथ से कैसे निकाला जा सकता है
      व्यवहार में, जानकारी के प्रकार के अनुसार Reed-Solomon और BCH नाम के दो थोड़े अलग codes इस्तेमाल होते हैं
      https://www.quaxio.com/an_artisanal_qr_code.html
  • संबंधित पोस्टें:
    Decoding small QR codes by hand (2012) - https://news.ycombinator.com/item?id=36173441 - जून 2023, 69 टिप्पणियाँ
    How a QR code works - https://news.ycombinator.com/item?id=32837565 - सितंबर 2022, 114 टिप्पणियाँ
    Creating a QR Code step by step - https://news.ycombinator.com/item?id=24119124 - अगस्त 2020, 41 टिप्पणियाँ
    Creating a QR Code step by step - https://news.ycombinator.com/item?id=18360847 - नवंबर 2018, 34 टिप्पणियाँ

  • लेख खुद भी शानदार है, लेकिन यह बात और भी बढ़िया है कि input value के अनुसार सभी चित्रों को dynamically generate किया जाता है

  • QR code पढ़ने के तरीके की व्याख्या अच्छी लगी, और सामान्य UPC जैसे 1-dimensional barcodes को decode करने पर यह लेख भी ठीक है:
    https://scanbot.io/blog/how-do-barcodes-work/

  • करीब 10 साल पहले मैंने QR code को हाथ से पढ़ने की कोशिश की थी, लेकिन mask pattern की वजह से हार मान ली थी
    data type पता करने से पहले भी इस mask pattern को XOR के साथ लागू करना पड़ता है
    सोचता हूँ कि यह mask pattern असली QR code reader में कितना मददगार होता है
    पिछले महीने मैंने optimal error correction setting भी देखी थी, लेकिन जब मामला स्क्रीन पर दिख रहे पूरे matrix जैसा बिना नुकसान वाला हो, तो जवाब “कोई नहीं” था, और इस निष्कर्ष तक पहुँचना आसान नहीं था
    अलग-अलग settings और scanning implementations की वास्तविक परिस्थितियों में तुलना करने वाला कोई material नहीं मिला, और मैंने खुद स्क्रीन पर छोटे QR को कई error correction levels के साथ दिखाकर camera हिलाते हुए पढ़ने की समस्या की नकल भी की, लेकिन settings के बीच कोई meaningful फर्क नहीं दिखा
    कम-से-कम चार alignment markers, बड़ा margin और timing pattern भी होते हैं, इसलिए लगता है कि mask न होने से सफेद धब्बे बन जाना क्या सच में इतना बड़ा फर्क पैदा करता है
    QR को visually पढ़ने की कोशिश छोड़ने का दूसरा कारण यह था कि आम तौर पर नीचे URL alternative text के रूप में लिखा होता था, हालांकि बाद में कुछ बार बिना alternative text वाले मामले भी देखे, लेकिन वे बहुत दुर्लभ थे

    • error correction अजीब चीज़ है
      इसे न इस्तेमाल करो तो message कम जगह लेता है और QR छोटा हो जाता है
      अगर sticker printing की तरह fixed space में फिट करना हो, तो pixel को physically बड़ा बनाया जा सकता है, और reliable reading के लिए error correction से ज़्यादा बड़े pixel मददगार रहे
      message की लंबाई के हिसाब से final QR size बदले बिना error correction level बढ़ाया जा सकता है, तो उस स्थिति में दोनों फायदे मिलते हैं
    • error correction उन लोगों के लिए नहीं है जो यह सोच रहे हैं कि “message को छोटा बनाकर QR code की readability कैसे बढ़ाई जाए”
      यह उन लोगों के लिए है जो tracking parameters से भरा पूरा URL version 25, 117x117 code में डालकर बड़े signboard पर चिपकाते हैं, ताकि उस पर पक्षियों की बीट गिर जाए या कोई sticker चिपका दे, तब भी data बचा रहे
    • पिछले साल मैंने ऐसा ही एक experiment किया था, और कम-से-कम 3D printed QR code में error correction न होना सबसे अच्छा निकला
      experiment यह देखने का था कि कितने छोटे आकार में print करने पर भी detection संभव है, और बगल की comment की तरह लगता है कि वजह individual pixel का बड़ा होना है
  • करीब 10 साल पहले का QR decoding video: https://www.youtube.com/watch?v=KA8hDldvfv0 (20 मिनट)
    QR code को step-by-step बनाने वाला मेरा interactive web page भी है। मूल रूप से यह reverse process है: https://www.nayuki.io/page/creating-a-qr-code-step-by-step

  • error correction को लेकर जिज्ञासा हुई, तो पता चला कि QR code को recoverable percentage 7% से 30% तक अलग-अलग तरह से design किया जा सकता है
    दिलचस्प: https://docs.beaconstac.com/en/articles/6018654-what-is-erro...

    • error correction सचमुच बहुत दिलचस्प विषय है
      Shannon ने 20वीं सदी के मध्य में इसकी सैद्धांतिक सीमा खोज ली थी, लेकिन उस सीमा तक पहुँचना कैसे है यह कोई नहीं जानता था
      1990s में turbo code patent के साथ अचानक उस सीमा के करीब पहुँचा गया, तो अकादमिक जगत को इस पर यक़ीन करना मुश्किल लगा
      बेशक, ऐसी तकनीकों की वजह से तेज़ और भरोसेमंद mobile network संभव हुए
  • 2023 Mystery Hunt की एक derivative puzzle में ऐसा सवाल था, जिसमें error correction से भी recover न हो सकने जितना खराब QR code को हाथ से decode करना पड़ता था
    इस comment section में आई सारी guides मैंने देखी थीं, और वे उपयोगी तो थीं, लेकिन बहुत शानदार नहीं थीं
    इसलिए इस तरह के और ज़्यादा detailed लेख बढ़ना अच्छा है, और यह लेख निश्चित रूप से काफ़ी polished लगता है
    अगर दिलचस्पी हो, तो puzzle यहाँ है, और QR decoding बाद के हिस्से में आता है: https://puzzles.mit.edu/2023/abcde.puzzlefactory.place/puzzl...

  • Wikipedia के मुताबिक QR code का आविष्कार 1994 में जापान की एक automotive parts manufacturer ने automobile parts labeling के लिए किया था
    सोचता हूँ कि अगर इसका आविष्कार आज होता, तो क्या इसे और बेहतर बनाया जा सकता था
    क्या इसे और छोटा या पढ़ने में और आसान बनाया जा सकता था?

    • पर्याप्त रूप से बेहतर नई design को रोकने वाली कोई चीज़ नहीं है
      1994 में भी barcode पहले से हर जगह थे, लेकिन इससे QR code के उभरने पर रोक नहीं लगी
      शायद बहुत ज़्यादा सुधार की गुंजाइश ही न हो। जब तक कि concept को बहुत बदलकर NFC जैसी किसी चीज़ की ओर न जाया जाए
    • अगर आज आविष्कार होता, तो शायद यह hexagonal होता