यह कैसे पढ़ा गया
- सिंबल
- वर्शन
- त्रुटि-सुधार
- मास्क
- सुधारे गए कोडवर्ड
- किस रूप में लिखा
- घोषित कैरेक्टर सेट
- एक सेट का हिस्सा
- सहमत स्कैन लाइनें
- अक्षर
- किससे मिला
index.html को सीधे किसी फ़ोल्डर से खोलने पर ब्राउज़र JavaScript मॉड्यूल रोक देता है, इसलिए पढ़ी जाने वाली तस्वीर चुनने पर कुछ नहीं होगा। इसके बजाय फ़ोल्डर को http पर सर्व कीजिए:
powershell -ExecutionPolicy Bypass -File serve.ps1
फिर http://localhost:8080/ खोलिए।
कैमरा कोड पर कीजिए, या उसकी तस्वीर यहाँ छोड़ दीजिए। पढ़ना यहीं होता है, और कहीं नहीं।
कोड पढ़ना पिक्सलों पर की जाने वाली गणित है, और पिक्सल पहले से यहीं हैं। सिंबल ढूँढ़ना, कोण का हिसाब बैठाना, मास्क हटाना, Reed-Solomon से चोट की मरम्मत करना और बिट वापस पढ़ना — यह सब इसी पन्ने के करीब दो हज़ार लाइन JavaScript में होता है, जिसे आप पढ़ सकते हैं। कैमरा वही वादा है, उसका अपवाद नहीं: एक फ़्रेम इसी टैब में पिक्सल बनकर आता है, जाँचा जाता है, और चला जाता है। कुछ रिकॉर्ड नहीं होता, कुछ रखा नहीं जाता, और इस पन्ने में कोई नेटवर्क सुविधा है ही नहीं जिससे कुछ भेजा जा सके।
लाइव जाँच: जाँच जारी…
ऑफ़लाइन: जाँच जारी…
हमारी बात पर भरोसा करने की ज़रूरत नहीं: DevTools खोलिए, Network टैब पर नज़र रखिए, और कैमरा चालू रखकर कोई कोड स्कैन कीजिए। एक भी अनुरोध न कोई फ़्रेम ले जाता है, न उसमें लिखी बात का एक अक्षर। या इंटरनेट काट दीजिए और कोड फिर भी पढ़िए।
src/ में कहीं न fetch है, न XMLHttpRequest, न sendBeacon, और पन्ने की Content-Security-Policy ऐसा कोई पता छोड़ती ही नहीं जहाँ यह ऑरिजिन कुछ भेज सके, होता तब भी। इसीलिए यह पन्ना नहीं बता सकता कि छोटा किया हुआ लिंक आखिर कहाँ जाता है: यह पता करना यानी पूछना, और यह पूछता नहीं।@ से पहले कोई उपयोगकर्ता नाम, ऐसी लिपि में लिखा नाम जिसके अक्षर हमारे जैसे दिखते हैं, कोई रीडायरेक्ट — वे वहीं नाम लेकर बताई जाती हैं जहाँ मिलती हैं। खुद जाँच लीजिए। ऊपर लिखी किसी भी बात को भरोसे पर मानने की ज़रूरत नहीं। यह पेज रिपॉज़िटरी के टेम्पलेट और कॉन्फ़िग से बनता है, एक ऐसी बिल्ड स्क्रिप्ट के ज़रिए जिसे आप पढ़ भी सकते हैं और खुद चला भी सकते हैं। उसका नतीजा dist ब्रांच पर कमिट रहता है, यानी जो सर्व हो रहा है और सोर्स से बिल्ड करने पर जो बनता है, दोनों का फ़र्क आप खुद देख सकते हैं:
github.com/A-Box-of-Tools/website
सबसे पहले पढ़ने लायक फ़ाइलें ये हैं — Content-Security-Policy के लिए config/site.toml, तस्वीर में सिंबल ढूँढ़ने के लिए src/binarize.js और src/detect.js — थ्रेशोल्ड, फ़ाइंडर पैटर्न और परिप्रेक्ष्य का सुधार —, वापस पढ़ने के लिए src/qr-decode.js, गलत पढ़े हिस्से की मरम्मत के लिए src/reed-solomon.js, धारीदार कोडों के लिए src/linear.js, और src/camera.js, जो इस पन्ने की हर वह लाइन है जो कैमरे को छूती है।
अगर आपके दफ़्तर का सुरक्षा सॉफ़्टवेयर अपलोड की चेतावनी दे। वह उस पल पर नज़र रखता है जब ब्राउज़र में फ़ाइल चुनी जाती है, और यह नहीं जान सकता कि पन्ना उसे भेजने वाला है या नहीं — इसलिए चुनने पर ही चेतावनी देता है। यहाँ से कुछ नहीं भेजा जाता: ब्राउज़र के डेवलपर टूल खोलिए, Network पर जाइए, और एक फ़ाइल चुनिए। उसे ले जाने वाला कोई अनुरोध नहीं है, और पन्ने की अपनी स्थानीय झलक के अलावा कोई अनुरोध ही नहीं। यही जाँच आपकी IT टीम आधे मिनट में कर सकती है।
फ़ोटो, स्क्रीनशॉट, या कैमरा। जो भी चुनिए, तस्वीर यहीं पढ़ी जाती है, इसी पन्ने में, आपकी अपनी मशीन पर — कुछ अपलोड नहीं होता, और कैमरे का फ़्रेम जाँचकर फेंक दिया जाता है, रिकॉर्ड नहीं किया जाता।
आप तस्वीर सीधे Ctrl+V से भी चिपका सकते हैं — जो कोड पहले से स्क्रीन पर है उसका स्क्रीनशॉट सबसे तेज़ रास्ता है।
बत्ती जलाइए बत्ती कुछ ही कैमरों में होती है, और कुछ ही ब्राउज़र किसी पन्ने को उसे माँगने देते हैं। जहाँ यह विकल्प नहीं दिखता, वहाँ बत्ती है ही नहीं।
यहाँ ईमानदार संकेत कैमरे की बत्ती है: जब तक फ़्रेम आ रहे हैं वह जलती है, और रोकते ही बुझ जाती है। इन दो बिंदुओं के बीच का कुछ भी डिस्क पर नहीं लिखा जाता, और इस पन्ने की Content-Security-Policy में कोई ऐसा पता है ही नहीं जहाँ कोई तस्वीर भेजी जा सके।
दिखाया जाता है, खोला कभी नहीं। छपा हुआ कोड ऐसा पता है जिसे कोई पढ़ नहीं सकता, और ठीक इसी वजह से उस पर स्टिकर चिपकाना किसी के लिए फ़ायदे का सौदा बन जाता है — इसलिए पूरी लिखावट यहाँ देखने को है, और जिस होस्ट पर आप सचमुच पहुँचते वह अपनी अलग लाइन में।
क्या इससे काम बन गया?
क्या गड़बड़ हुई?
शुक्रिया — इससे मदद मिलती है।
सिर्फ़ आपका जवाब भेजा जाता है, वह भी तभी जब आप बटन दबाते हैं। आपकी फ़ाइल, उसका नाम या उससे जुड़ी कोई बात कभी नहीं।
# QR और बारकोड रीडर — तस्वीर से या कैमरे से QR कोड स्कैन कीजिए कैमरा कोड पर कीजिए, या उसकी तस्वीर यहाँ छोड़ दीजिए। पढ़ना यहीं होता है, और कहीं नहीं। > किसी फ़ोटो, स्क्रीनशॉट या अपने कैमरे से QR कोड पढ़िए, और खोलने से पहले देखिए कि लिंक असल में कहाँ जाता है। EAN, UPC, Code 128, Code 39 और ITF बारकोड भी। कुछ भी अपलोड नहीं होता। यह पेज एक इंटरैक्टिव टूल है जो पूरी तरह आपके ब्राउज़र में चलता है, https://abox.tools/hi/qr-barcode-reader/ पर — आप इसे जो भी देते हैं, वह कहीं अपलोड नहीं होता। आगे वह सब कुछ है जो यह पेज इस टूल के बारे में शब्दों में कहता है; इसे इस्तेमाल करने के लिए यह पता खोलें। ## यह टूल तस्वीरें और उनमें मौजूद कोड **कभी अपलोड नहीं करता**। यहाँ कोई सर्वर है ही नहीं। कोड पढ़ना पिक्सलों पर की जाने वाली गणित है, और पिक्सल पहले से यहीं हैं। सिंबल ढूँढ़ना, कोण का हिसाब बैठाना, मास्क हटाना, Reed-Solomon से चोट की मरम्मत करना और बिट वापस पढ़ना — यह सब इसी पन्ने के करीब दो हज़ार लाइन JavaScript में होता है, जिसे आप पढ़ सकते हैं। **कैमरा वही वादा है, उसका अपवाद नहीं:** एक फ़्रेम इसी टैब में पिक्सल बनकर आता है, जाँचा जाता है, और चला जाता है। कुछ रिकॉर्ड नहीं होता, कुछ रखा नहीं जाता, और इस पन्ने में कोई नेटवर्क सुविधा है ही नहीं जिससे कुछ भेजा जा सके। - ✗ कोई अपलोड नहीं - ✗ कोई खाता नहीं - ✗ कुछ रिकॉर्ड नहीं - ✓ ऑफ़लाइन चलता है - ✓ ओपन सोर्स ## तस्वीर अपलोड किए बिना QR कोड कैसे पढ़ें 1. **इसे तस्वीर दीजिए।** डिब्बे पर कोई फ़ोटो या स्क्रीनशॉट छोड़िए, सीधे कोई तस्वीर चिपकाइए, या कैमरे का बटन दबाइए। एक साथ कई भी ठीक है — हर एक अलग पढ़ी जाती है और हर एक का अपना जवाब आता है। जो कोड पहले से आपकी स्क्रीन पर है उसका स्क्रीनशॉट सबसे तेज़ और सबसे भरोसेमंद रास्ता है, क्योंकि उसमें न लेंस है, न कोण, न रोशनी। 2. **पूरा सिंबल फ़्रेम में आए, हाशिये समेत।** कोड के चारों ओर की सफ़ेद जगह कोड का हिस्सा है: उसी से रीडर जानता है कि सिंबल कहाँ खत्म होता है। चौकोरों के किनारे तक कटी हुई फ़ोटो अब तक की सबसे आम वजह है कि कोई कोड नहीं पढ़ा जाता। फ़्रेम का करीब आधा हिस्सा कोड से भर जाए, यह लगभग सही है; इससे पास जाने पर कोने तस्वीर से बाहर चले जाते हैं। 3. **कुछ भी तय करने से पहले पता पढ़िए।** पोस्टर, पार्किंग मशीन या चिट्ठी पर लगे कोड को स्कैन करने का मतलब ही यह जानना है कि वह कहाँ ले जाता है, और फ़ोन का कैमरा ठीक यही एक काम आपको सच में करने नहीं देता। यहाँ होस्ट अपनी अलग लाइन में लिखा होता है। अगर वह नाम वैसा नहीं जैसी आपने उम्मीद की थी, तो जिस काम से आप आए थे वह हो चुका और खोलने को कुछ बचा ही नहीं। 4. **चेतावनियों को गंभीरता से लीजिए, खासकर दबी हुई वालों को।** सादा `http://` पता, ऐसी लिपि में लिखा नाम जो दिखती कुछ और है, कोई लिंक छोटा करने वाली सेवा, या पते में `@` से पहले कुछ भी — हर एक वहीं बताया जाता है जहाँ मिलता है। अकेले इनमें से कोई कुछ साबित नहीं करता। वहाँ जाने से पहले सब दस सेकंड के लायक हैं। 5. **अगर न पढ़े, तो सबसे पहले रोशनी बदलिए।** लगभग हर नाकामी थ्रेशोल्ड की दिक्कत होती है: बीच में पड़ती चमक, किसी कोने पर छाया, या ऐसे कोण से खींची गई स्क्रीन जिसमें बैकलाइट आ जाती है। ऐसे खड़े होइए कि चमक कोड पर न पड़े, या कैमरे की बत्ती जला लीजिए। फिर भी न हो तो एक सपाट, सामने से ली गई फ़ोटो खींचकर वही छोड़िए — ठहरी हुई तस्वीर की तलाश उससे कहीं ज़्यादा गहराई से होती है जितनी लाइव फ़्रेम की हो सकती है। 6. **जवाब अटपटा लगे तो सैंपल की गई तस्वीर देखिए।** “यह कैसे पढ़ा गया” खोलिए और छोटी जाली देखिए। यह वही है जो इस पन्ने ने कोड समझा, सैंपल किए गए मॉड्यूलों से दोबारा बनाया हुआ। जिस रीडर ने सिंबल गलत पढ़ा और उसे मरम्मत करके कुछ भरोसेमंद-सा बना दिया, वह इसे वहीं दिखाएगा, और कहीं नहीं। ## विस्तार से [QR कोड कैसे बनाएँ और कैसे साबित करें कि वह पढ़ा जाता है](https://abox.tools/hi/guides/make-a-qr-code-and-prove-it-scans/): कोड बनाइए, फिर उसी साइट के रीडर से जाँचिए: हू-ब-हू सामग्री, असली लिंक, छपाई के आकार में और एक तस्वीर से, छपाई से पहले। सब ब्राउज़र में, कुछ भी अपलोड नहीं। ## बॉक्स में और भी टूल - [हैश और चेकसम](https://abox.tools/hi/hash-checksum/): डाउनलोड की गई फ़ाइल को उस नंबर से मिलाइए जो बनाने वाले ने छापा है, बिना उसे किसी को भेजे। - [पासवर्ड और पासफ़्रेज़ जनरेटर](https://abox.tools/hi/password-generator/): यहीं बनता है, आपके अपने ब्राउज़र से, और कहीं नहीं भेजा जाता। कुछ भी सेव नहीं होता और कोई हिस्ट्री नहीं रहती। - [JSON फ़ॉर्मैटर](https://abox.tools/hi/json-formatter/): JSON, XML, HTML, CSS और YAML, सजाए हुए या बदले हुए। कुछ भी किसी और के सर्वर में चिपकाया नहीं जाता। - [YAML से JSON कन्वर्टर](https://abox.tools/hi/yaml-to-json/): दोनों दिशाएँ, और हर दिशा की कीमत भी बताई जाती है। इनमें से कुछ भी किसी और के सर्वर में पेस्ट नहीं होता। ## सवाल ### क्या तस्वीर कहीं अपलोड होती है? नहीं, और उसमें से पढ़ी गई कोई चीज़ भी नहीं। तस्वीर इसी पन्ने के एक कैनवस पर डिकोड होकर वहीं पढ़ी जाती है, इसी साइट से आए JavaScript के ज़रिए। इस टूल में कोई नेटवर्क सुविधा है ही नहीं — यह कभी कुछ मँगाता नहीं और कभी कुछ भेजता नहीं — और पन्ने की `Content-Security-Policy` में हर वह पता लिखा है जिससे यह संपर्क कर सकता है, और उनमें से कोई हमारा नहीं। सबसे सरल सबूत: इंटरनेट काट दीजिए, यह चलता रहता है। ### क्या कैमरा कुछ रिकॉर्ड करता है? नहीं। कैमरे का फ़्रेम इसी टैब में पिक्सल बनकर आता है, एक कैनवस पर बनता है, जाँचा जाता है, और करीब दसवें हिस्से भर सेकंड बाद अगले फ़्रेम से मिट जाता है। डिस्क पर कुछ लिखा नहीं जाता और कुछ रखा नहीं जाता। जैसे ही आप रोकते हैं स्ट्रीम बंद हो जाती है, टैब पीछे जाने पर भी, और पन्ना छोड़ने पर भी — और भरोसे लायक संकेत आपके कैमरे की बत्ती है, क्योंकि उसे कोई पन्ना बुझा नहीं सकता। ### यह लिंक खोलने के बजाय मुझे दिखाता क्यों है? क्योंकि काम की चीज़ यही है। QR कोड ऐसा पता है जिसे आप पढ़ नहीं सकते, और इसीलिए पार्किंग मशीन के कोड पर चिपका स्टिकर काम कर जाता है: जब तक आपको पता चलता है कि वह कहाँ ले गया, आप वहाँ पहुँच चुके होते हैं। यहाँ पूरी लिखावट छपती है, होस्ट अपनी अलग लाइन में निकाला जाता है, और खोलना एक अलग बटन है जिसे आप पढ़ने के बाद दबाते हैं। यह एक क्लिक ज़्यादा है, और यही वह क्लिक है जिसकी इस फ़ॉर्मैट को हमेशा से ज़रूरत थी। ### यह क्या-क्या पढ़ सकता है? QR कोड, 1 से 40 तक हर वर्शन में, चारों त्रुटि-सुधार स्तरों पर, न्यूमेरिक, अल्फ़ान्यूमेरिक, बाइट और कांजी मोड में, जिसमें ECI कैरेक्टर सेट और जुड़े हुए सेट के सिंबल चुपचाप गिराए जाने के बजाय बताए जाते हैं। धारीदार तरफ़: EAN-13, EAN-8, UPC-A, UPC-E, ITF-14, Interleaved 2 of 5, Code 128 और Code 39। Data Matrix, PDF417, Aztec और MaxiCode यह नहीं पढ़ता। ### मेरा कोड नहीं पढ़ा जा रहा। क्या गड़बड़ है? दस में नौ बार तीन में से कोई एक बात। सफ़ेद हाशिया कट गया है, और रीडर उसी से जानता है कि सिंबल कहाँ खत्म होता है। कोड के किसी हिस्से पर चमक या छाया पड़ रही है, इसलिए कोई थ्रेशोल्ड गहरे चौकोरों को हल्कों से अलग नहीं कर पाता। या कोड फ़्रेम में इतना छोटा है कि उसके मॉड्यूल एक-दो पिक्सल से ज़्यादा के नहीं। रोशनी बदलिए, फ़्रेम का करीब आधा हिस्सा भरिए, और तिरछे के बजाय सामने से फ़ोटो लीजिए। ### क्या यह टूटा हुआ या आंशिक रूप से ढका कोड पढ़ सकता है? अक्सर हाँ, और यह फ़ॉर्मैट का अपने डिज़ाइन के मुताबिक काम करना है, यहाँ की कोई होशियारी नहीं। हर QR कोड Reed-Solomon जाँच-डेटा साथ रखता है, और H स्तर पर बना सिंबल अपने करीब 30% मॉड्यूल खोकर भी हूबहू दोबारा बन जाता है। पन्ना “यह कैसे पढ़ा गया” के नीचे बताता है कि उसे कितने कोडवर्ड सुधारने पड़े, जिससे आप देख सकें कि मामला कितना करीब था। जो यह नहीं करता, वह है अंदाज़ा: जाँच जितना संभाल सकती है उससे ज़्यादा टूटे सिंबल को यह गलत जवाब देने के बजाय अपठनीय बताता है। ### यह क्यों कहता है कि bit.ly लिंक कहाँ जाता है, यह नहीं बता सकता? क्योंकि यह पता करने का मतलब है bit.ly से पूछना, और वह एक नेटवर्क अनुरोध है। इस पन्ने का बाकी हर दावा इसी पर टिका है कि यहाँ ऐसा कोई कोड नहीं जो किसी से संपर्क करे, और चुपचाप एक अपवाद बना लेना उस जवाब से कम कीमती होता। तो लिंक छोटा करने वाली सेवा का नाम बता दिया जाता है और वह जो छिपाती है उसे ईमानदारी से अनजाना छोड़ दिया जाता है। सुलझाना ही है तो उसे किसी ऐसी जगह चिपकाइए जो पूछने को तैयार हो। ### क्या QR कोड स्कैन करना सुरक्षित है? स्कैन करना सुरक्षित है। उस पर अमल करना जोखिम है, और वह असली जोखिम है: पार्किंग मशीनों पर, रेस्तराँ की मेज़ों पर और कूरियर की पर्चियों पर असली कोड के ऊपर चिपकाए गए कोड अब इतने आम हो चुके हैं कि उनका नाम पड़ गया है। वे इसलिए चलते हैं कि कोड को देखकर कोई पढ़ नहीं सकता। उसे खोले बिना पढ़ लेना — जो यह पन्ना करता है — वह पूरी बढ़त छीन लेता है, और होस्ट देखने में लगने वाले दस सेकंड ही सारा बचाव हैं। ### हर नतीजे के नीचे वह छोटी जाली क्या है? वे मॉड्यूल जो इस पन्ने ने सचमुच आपकी तस्वीर से सैंपल किए, प्रति मॉड्यूल एक चौकोर के हिसाब से दोबारा बनाए हुए। वह इसलिए है कि पढ़ाई पर भरोसा करने के बजाय उसे आँख से जाँचा जा सके: अगर वह जाली उसी कोड जैसी दिखती है जो आपने खींचा था, तो ऊपर का जवाब सही पिक्सलों से आया है। शायद ही कोई रीडर आपको यह दिखाता है, और यही उस टूल में फ़र्क है जिसे आप जाँच सकते हैं और उसमें जिस पर आपको भरोसा करना पड़ता है। ### क्या यह एक ही तस्वीर में कई कोड पढ़ता है? फ़िलहाल एक तस्वीर में एक। एक साथ कई तस्वीरें छोड़िए तो हर एक अलग पढ़ी जाती है, और कैमरा हिलाते-हिलाते एक के बाद एक कोड पढ़ता जाता है, हर नया कोड रखता जाता है जो उसने पहले न देखा हो। कोडों से भरे पूरे पन्ने की एक ही फ़ोटो के लिए या तो काट-छाँट चाहिए, या कैमरा एक-एक करके उन पर करना होगा। ### मेरा बारकोड जो मैंने माँगा था उससे अलग नाम से क्यों बताया गया? क्योंकि बारकोड अपना नाम साथ लेकर नहीं चलता। UPC-A दरअसल वही EAN-13 है जिसका पहला अंक शून्य हो, ITF-14 चौदह अंकों और वैध चेक अंक वाला Interleaved 2 of 5 है, और Code 128 अपने अंक-मोड में किसी और जैसा दिखता ही नहीं। यह पन्ना वही बताता है जो धारियाँ कहती हैं, और साथ में वह जो चेक अंक पक्का करता है — उतना ही, जितना खुद सिंबल जानता है। ### क्या यह ऑफ़लाइन चलता है? हाँ। पन्ना एक बार लोड कीजिए, फिर इंटरनेट काट दीजिए और यह चलता रहता है, कैमरे समेत। यह साबित करने का सबसे सरल तरीका भी यही है कि कुछ अपलोड नहीं होता: जो रीडर आपकी तस्वीर डिकोड कराने बाहर भेजता, वह उसी पल रुक जाता जिस पल आप प्लग निकालते। ## प्राइवेसी का यह दावा कैसे जाँचा जा सकता है - **तस्वीर कभी अपलोड नहीं होती, और कैमरा इसका अपवाद नहीं है।** यहाँ छोड़ी गई फ़ोटो इसी पन्ने के एक कैनवस पर डिकोड होकर वहीं पढ़ी जाती है। कैमरे का फ़्रेम वही चीज़ है, बस सेकंड में तीस बार: उसी कैनवस पर बनता है, जाँचा जाता है, और अगले से मिट जाता है। कोई फ़्रेम रिकॉर्ड नहीं होता, कोई रखा नहीं जाता, और रोकने पर कैमरे की बत्ती का बुझ जाना ही पूरी कहानी है। - **यहाँ कुछ भी कहीं से कुछ नहीं मँगाता।** `src/` में कहीं न `fetch` है, न `XMLHttpRequest`, न `sendBeacon`, और पन्ने की `Content-Security-Policy` ऐसा कोई पता छोड़ती ही नहीं जहाँ यह ऑरिजिन कुछ भेज सके, होता तब भी। इसीलिए यह पन्ना नहीं बता सकता कि छोटा किया हुआ लिंक आखिर कहाँ जाता है: यह पता करना यानी पूछना, और यह पूछता नहीं। - **यह आपको पता दिखाता है। खोलता कभी नहीं।** छपा हुआ QR कोड ऐसा पता है जिसे कोई पढ़ नहीं सकता, और ठीक इसी वजह से उस पर स्टिकर चिपकाना किसी के लिए फ़ायदे का सौदा बन जाता है। यहाँ कुछ खोला नहीं जाता। पूरी लिखावट आपके देखने के लिए छपती है, जिस होस्ट पर आप सचमुच पहुँचते वह अलग लाइन में निकाला जाता है, और जो चालें एक पते को दूसरा दिखाती हैं — `@` से पहले कोई उपयोगकर्ता नाम, ऐसी लिपि में लिखा नाम जिसके अक्षर हमारे जैसे दिखते हैं, कोई रीडायरेक्ट — वे वहीं नाम लेकर बताई जाती हैं जहाँ मिलती हैं। - **यह वह भी दिखाता है जो उसने सैंपल किया।** हर QR नतीजे के नीचे उन मॉड्यूलों की तस्वीर होती है जो इस पन्ने ने सचमुच आपकी फ़ोटो से पढ़े। अगर वह उसी कोड जैसी दिखती है जो आपने स्कैन किया, तो ऊपर का जवाब पक्का है; अगर वह बेतरतीब धब्बों जैसी दिखती है, तो नहीं। जो रीडर आपको बस एक लिखावट देकर चुप हो जाए, उसे इस तरह जाँचा ही नहीं जा सकता। - **Google क्या लोड करता है, और उसे क्या नहीं मिलता।** विज्ञापन और माप वाली स्क्रिप्ट Google से आती हैं, और दान का बटन Buy Me a Coffee से। इनमें से किसी को न कोई तस्वीर दी जाती है, न कोई फ़्रेम, न उनमें से पढ़ी कोई चीज़। पिक्सलों को लिखावट में बदलने वाली हर लाइन इसी ऑरिजिन से आती है और रिपॉज़िटरी में मौजूद है। - **यह ऑफ़लाइन चलता है।** नेटवर्क काट दीजिए, टूल वैसा ही रहता है, कैमरे समेत, क्योंकि इसमें नेटवर्क वाला कोई कदम कभी था ही नहीं। इससे सरल सबूत कोई नहीं। **खुद जाँच लीजिए।** ऊपर लिखी किसी भी बात को भरोसे पर मानने की ज़रूरत नहीं। यह पेज रिपॉज़िटरी के टेम्पलेट और कॉन्फ़िग से बनता है, एक ऐसी बिल्ड स्क्रिप्ट के ज़रिए जिसे आप पढ़ भी सकते हैं और खुद चला भी सकते हैं। उसका नतीजा `dist` ब्रांच पर कमिट रहता है, यानी जो सर्व हो रहा है और सोर्स से बिल्ड करने पर जो बनता है, दोनों का फ़र्क आप खुद देख सकते हैं: https://github.com/A-Box-of-Tools/website सबसे पहले पढ़ने लायक फ़ाइलें ये हैं — Content-Security-Policy के लिए `config/site.toml`, तस्वीर में सिंबल ढूँढ़ने के लिए `src/binarize.js` और `src/detect.js` — थ्रेशोल्ड, फ़ाइंडर पैटर्न और परिप्रेक्ष्य का सुधार —, वापस पढ़ने के लिए `src/qr-decode.js`, गलत पढ़े हिस्से की मरम्मत के लिए `src/reed-solomon.js`, धारीदार कोडों के लिए `src/linear.js`, और `src/camera.js`, जो इस पन्ने की हर वह लाइन है जो कैमरे को छूती है।
http:// पता, ऐसी लिपि में लिखा नाम जो दिखती कुछ और है, कोई लिंक छोटा करने वाली सेवा, या पते में @ से पहले कुछ भी — हर एक वहीं बताया जाता है जहाँ मिलता है। अकेले इनमें से कोई कुछ साबित नहीं करता। वहाँ जाने से पहले सब दस सेकंड के लायक हैं। QR कोड कैसे बनाएँ और कैसे साबित करें कि वह पढ़ा जाता है कोड बनाइए, फिर उसी साइट के रीडर से जाँचिए: हू-ब-हू सामग्री, असली लिंक, छपाई के आकार में और एक तस्वीर से, छपाई से पहले। सब ब्राउज़र में, कुछ भी अपलोड नहीं।
नहीं, और उसमें से पढ़ी गई कोई चीज़ भी नहीं। तस्वीर इसी पन्ने के एक कैनवस पर डिकोड होकर वहीं पढ़ी जाती है, इसी साइट से आए JavaScript के ज़रिए। इस टूल में कोई नेटवर्क सुविधा है ही नहीं — यह कभी कुछ मँगाता नहीं और कभी कुछ भेजता नहीं — और पन्ने की Content-Security-Policy में हर वह पता लिखा है जिससे यह संपर्क कर सकता है, और उनमें से कोई हमारा नहीं। सबसे सरल सबूत: इंटरनेट काट दीजिए, यह चलता रहता है।
नहीं। कैमरे का फ़्रेम इसी टैब में पिक्सल बनकर आता है, एक कैनवस पर बनता है, जाँचा जाता है, और करीब दसवें हिस्से भर सेकंड बाद अगले फ़्रेम से मिट जाता है। डिस्क पर कुछ लिखा नहीं जाता और कुछ रखा नहीं जाता। जैसे ही आप रोकते हैं स्ट्रीम बंद हो जाती है, टैब पीछे जाने पर भी, और पन्ना छोड़ने पर भी — और भरोसे लायक संकेत आपके कैमरे की बत्ती है, क्योंकि उसे कोई पन्ना बुझा नहीं सकता।
क्योंकि काम की चीज़ यही है। QR कोड ऐसा पता है जिसे आप पढ़ नहीं सकते, और इसीलिए पार्किंग मशीन के कोड पर चिपका स्टिकर काम कर जाता है: जब तक आपको पता चलता है कि वह कहाँ ले गया, आप वहाँ पहुँच चुके होते हैं। यहाँ पूरी लिखावट छपती है, होस्ट अपनी अलग लाइन में निकाला जाता है, और खोलना एक अलग बटन है जिसे आप पढ़ने के बाद दबाते हैं। यह एक क्लिक ज़्यादा है, और यही वह क्लिक है जिसकी इस फ़ॉर्मैट को हमेशा से ज़रूरत थी।
QR कोड, 1 से 40 तक हर वर्शन में, चारों त्रुटि-सुधार स्तरों पर, न्यूमेरिक, अल्फ़ान्यूमेरिक, बाइट और कांजी मोड में, जिसमें ECI कैरेक्टर सेट और जुड़े हुए सेट के सिंबल चुपचाप गिराए जाने के बजाय बताए जाते हैं। धारीदार तरफ़: EAN-13, EAN-8, UPC-A, UPC-E, ITF-14, Interleaved 2 of 5, Code 128 और Code 39। Data Matrix, PDF417, Aztec और MaxiCode यह नहीं पढ़ता।
दस में नौ बार तीन में से कोई एक बात। सफ़ेद हाशिया कट गया है, और रीडर उसी से जानता है कि सिंबल कहाँ खत्म होता है। कोड के किसी हिस्से पर चमक या छाया पड़ रही है, इसलिए कोई थ्रेशोल्ड गहरे चौकोरों को हल्कों से अलग नहीं कर पाता। या कोड फ़्रेम में इतना छोटा है कि उसके मॉड्यूल एक-दो पिक्सल से ज़्यादा के नहीं। रोशनी बदलिए, फ़्रेम का करीब आधा हिस्सा भरिए, और तिरछे के बजाय सामने से फ़ोटो लीजिए।
अक्सर हाँ, और यह फ़ॉर्मैट का अपने डिज़ाइन के मुताबिक काम करना है, यहाँ की कोई होशियारी नहीं। हर QR कोड Reed-Solomon जाँच-डेटा साथ रखता है, और H स्तर पर बना सिंबल अपने करीब 30% मॉड्यूल खोकर भी हूबहू दोबारा बन जाता है। पन्ना “यह कैसे पढ़ा गया” के नीचे बताता है कि उसे कितने कोडवर्ड सुधारने पड़े, जिससे आप देख सकें कि मामला कितना करीब था। जो यह नहीं करता, वह है अंदाज़ा: जाँच जितना संभाल सकती है उससे ज़्यादा टूटे सिंबल को यह गलत जवाब देने के बजाय अपठनीय बताता है।
क्योंकि यह पता करने का मतलब है bit.ly से पूछना, और वह एक नेटवर्क अनुरोध है। इस पन्ने का बाकी हर दावा इसी पर टिका है कि यहाँ ऐसा कोई कोड नहीं जो किसी से संपर्क करे, और चुपचाप एक अपवाद बना लेना उस जवाब से कम कीमती होता। तो लिंक छोटा करने वाली सेवा का नाम बता दिया जाता है और वह जो छिपाती है उसे ईमानदारी से अनजाना छोड़ दिया जाता है। सुलझाना ही है तो उसे किसी ऐसी जगह चिपकाइए जो पूछने को तैयार हो।
स्कैन करना सुरक्षित है। उस पर अमल करना जोखिम है, और वह असली जोखिम है: पार्किंग मशीनों पर, रेस्तराँ की मेज़ों पर और कूरियर की पर्चियों पर असली कोड के ऊपर चिपकाए गए कोड अब इतने आम हो चुके हैं कि उनका नाम पड़ गया है। वे इसलिए चलते हैं कि कोड को देखकर कोई पढ़ नहीं सकता। उसे खोले बिना पढ़ लेना — जो यह पन्ना करता है — वह पूरी बढ़त छीन लेता है, और होस्ट देखने में लगने वाले दस सेकंड ही सारा बचाव हैं।
वे मॉड्यूल जो इस पन्ने ने सचमुच आपकी तस्वीर से सैंपल किए, प्रति मॉड्यूल एक चौकोर के हिसाब से दोबारा बनाए हुए। वह इसलिए है कि पढ़ाई पर भरोसा करने के बजाय उसे आँख से जाँचा जा सके: अगर वह जाली उसी कोड जैसी दिखती है जो आपने खींचा था, तो ऊपर का जवाब सही पिक्सलों से आया है। शायद ही कोई रीडर आपको यह दिखाता है, और यही उस टूल में फ़र्क है जिसे आप जाँच सकते हैं और उसमें जिस पर आपको भरोसा करना पड़ता है।
फ़िलहाल एक तस्वीर में एक। एक साथ कई तस्वीरें छोड़िए तो हर एक अलग पढ़ी जाती है, और कैमरा हिलाते-हिलाते एक के बाद एक कोड पढ़ता जाता है, हर नया कोड रखता जाता है जो उसने पहले न देखा हो। कोडों से भरे पूरे पन्ने की एक ही फ़ोटो के लिए या तो काट-छाँट चाहिए, या कैमरा एक-एक करके उन पर करना होगा।
क्योंकि बारकोड अपना नाम साथ लेकर नहीं चलता। UPC-A दरअसल वही EAN-13 है जिसका पहला अंक शून्य हो, ITF-14 चौदह अंकों और वैध चेक अंक वाला Interleaved 2 of 5 है, और Code 128 अपने अंक-मोड में किसी और जैसा दिखता ही नहीं। यह पन्ना वही बताता है जो धारियाँ कहती हैं, और साथ में वह जो चेक अंक पक्का करता है — उतना ही, जितना खुद सिंबल जानता है।
हाँ। पन्ना एक बार लोड कीजिए, फिर इंटरनेट काट दीजिए और यह चलता रहता है, कैमरे समेत। यह साबित करने का सबसे सरल तरीका भी यही है कि कुछ अपलोड नहीं होता: जो रीडर आपकी तस्वीर डिकोड कराने बाहर भेजता, वह उसी पल रुक जाता जिस पल आप प्लग निकालते।