이건 어떻게 읽었는가
- 심벌
- 버전
- 오류 정정
- 마스크
- 복구한 코드워드
- 기록 방식
- 선언된 문자 집합
- 묶음 중 한 장
- 일치한 스캔 선
- 글자 수
- 찾은 방법
index.html을 폴더에서 바로 열면 브라우저가 JavaScript 모듈을 막습니다. 그래서 읽을 이미지를 골라도 아무 일도 일어나지 않아요. 폴더를 http로 띄워서 여세요:
powershell -ExecutionPolicy Bypass -File serve.ps1
그런 다음 http://localhost:8080/을 여세요.
코드에 카메라를 대거나, 찍어 둔 사진을 올려놓으세요. 읽는 일은 여기서만 일어납니다.
코드를 읽는 일은 픽셀에 대한 산술이고, 그 픽셀은 이미 여기 있습니다. 심벌을 찾고, 찍힌 각도를 보정하고, 마스크를 풀고, 리드-솔로몬으로 손상된 부분을 복구하고, 비트를 다시 읽어 내는 일이 모두 이 페이지 안의 이천 줄 남짓한 자바스크립트에서 일어납니다. 직접 읽어 보실 수 있습니다. 카메라도 같은 약속이지, 거기서 빠지는 예외가 아닙니다. 한 프레임은 이 탭 안으로 픽셀이 되어 들어와, 살펴본 뒤 사라집니다. 저장되는 것도 남는 것도 없고, 애초에 이 페이지에는 무언가를 보낼 네트워크 기능이 하나도 없습니다.
실시간 확인: 확인 중…
오프라인: 확인 중…
말만 믿지 마세요. 개발자 도구를 열고 네트워크 탭을 지켜보면서 카메라를 켠 채로 코드를 읽어 보세요. 어느 요청도 화면 한 장이나 그 안에 적힌 글자 하나를 실어 가지 않습니다. 아니면 인터넷을 끊고도 코드를 읽어 보세요.
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입니다.
회사 보안 소프트웨어가 업로드를 경고한다면. 그것은 브라우저에서 파일이 선택되는 순간을 지켜보며, 페이지가 그것을 보낼 생각인지는 알 수 없습니다 — 그래서 고르는 순간에 경고합니다. 여기서는 아무것도 보내지 않습니다. 브라우저 개발자 도구를 열고 네트워크 탭으로 옮긴 뒤 파일을 골라 보세요. 그것을 실어 나르는 요청은 없고, 이 페이지 자체의 로컬 미리보기 말고는 요청 자체가 없습니다. 같은 확인을 IT 팀도 삼십 초면 할 수 있습니다.
사진이든, 스크린숏이든, 카메라든. 무엇을 고르시든 이미지는 여기서, 이 페이지 안에서, 당신 기기 위에서 읽힙니다 — 아무것도 올라가지 않고, 카메라 프레임은 살펴본 뒤 버려질 뿐 저장되지 않습니다.
Ctrl+V로 이미지를 바로 붙여 넣을 수도 있습니다 — 이미 화면에 떠 있는 코드의 스크린숏이 가장 빠른 길입니다.
조명 켜기 조명이 달린 카메라는 일부뿐이고, 페이지가 그것을 요청하도록 허락하는 브라우저도 일부뿐입니다. 여기에 보이지 않는다면 없는 것입니다.
여기서 정직한 표시는 카메라 불빛입니다. 프레임이 들어오는 동안 켜져 있고, 멈추는 순간 꺼집니다. 그 두 지점 사이의 무엇도 디스크에 쓰이지 않고, 이 페이지의 Content-Security-Policy에는 이미지가 갈 수 있는 주소가 하나도 없습니다.
보여 줄 뿐, 열지 않습니다. 인쇄된 코드는 아무도 읽을 수 없는 주소이고, 그 위에 스티커를 붙이는 일이 누군가에게 남는 장사가 되는 이유가 바로 그것입니다 — 그래서 문자열 전체를 여기에 두어 보시게 하고, 실제로 닿게 될 호스트는 자기만의 줄로 빼냈습니다.
원하는 결과가 나왔나요?
무엇이 잘못됐나요?
고맙습니다 — 큰 도움이 됩니다.
보내지는 것은 답변뿐이고, 그것도 버튼을 눌렀을 때만입니다. 파일도, 파일 이름도, 파일에 관한 어떤 정보도 보내지 않습니다.
# QR & 바코드 스캔 — 이미지나 카메라로 QR 코드 읽기 코드에 카메라를 대거나, 찍어 둔 사진을 올려놓으세요. 읽는 일은 여기서만 일어납니다. > 사진, 스크린숏, 카메라로 QR 코드를 읽고, 열기 전에 링크가 실제로 어디로 가는지 확인하세요. EAN, UPC, Code 128, Code 39, ITF 바코드도 읽습니다. 아무것도 올라가지 않습니다. 이 페이지는 브라우저 안에서만 동작하는 대화형 도구입니다(https://abox.tools/ko/qr코드-스캔/). 도구에 넘긴 어떤 것도 업로드되지 않습니다. 아래는 이 페이지가 도구에 대해 글로 설명하는 내용 전부입니다. 도구를 쓰려면 이 주소를 여세요. ## 이미지와 그 안의 코드는 **절대 업로드되지 않습니다**. 서버가 아예 없으니까요. 코드를 읽는 일은 픽셀에 대한 산술이고, 그 픽셀은 이미 여기 있습니다. 심벌을 찾고, 찍힌 각도를 보정하고, 마스크를 풀고, 리드-솔로몬으로 손상된 부분을 복구하고, 비트를 다시 읽어 내는 일이 모두 이 페이지 안의 이천 줄 남짓한 자바스크립트에서 일어납니다. 직접 읽어 보실 수 있습니다. **카메라도 같은 약속이지, 거기서 빠지는 예외가 아닙니다.** 한 프레임은 이 탭 안으로 픽셀이 되어 들어와, 살펴본 뒤 사라집니다. 저장되는 것도 남는 것도 없고, 애초에 이 페이지에는 무언가를 보낼 네트워크 기능이 하나도 없습니다. - ✗ 업로드 없음 - ✗ 계정 없음 - ✗ 저장하지 않음 - ✓ 오프라인 동작 - ✓ 오픈 소스 ## 이미지를 올리지 않고 QR 코드를 읽는 방법 1. **이미지를 주세요.** 사진이나 스크린숏을 상자에 놓거나, 바로 붙여 넣거나, 카메라 버튼을 누르세요. 한 번에 여러 장도 괜찮습니다. 각각 따로 읽히고 각각 자기 답을 받습니다. 이미 화면에 떠 있는 코드의 스크린숏이 가장 빠르고 가장 확실합니다. 거기에는 렌즈도, 각도도, 빛도 끼어들지 않으니까요. 2. **여백까지 포함해 심벌 전체를 화면에 넣으세요.** 코드 둘레의 흰 여백은 코드의 일부입니다. 리더는 그것으로 심벌이 어디서 끝나는지 압니다. 네모 가장자리까지 잘라 낸 사진은 코드가 읽히지 않는 이유 중 압도적으로 흔한 쪽입니다. 화면의 절반쯤을 코드로 채우면 대체로 맞고, 그보다 더 다가가면 모서리가 화면 밖으로 나갑니다. 3. **무엇을 정하기 전에 주소부터 읽으세요.** 포스터나 주차 정산기, 편지에 붙은 코드를 스캔하는 이유는 그것이 어디로 가는지 알기 위해서입니다. 그리고 바로 그 한 가지를 휴대폰 카메라는 사실상 하게 해 주지 않습니다. 여기서는 호스트가 자기만의 줄에 적힙니다. 예상하던 이름이 아니라면, 온 목적은 이미 이룬 것이고 열 것은 남지 않았습니다. 4. **경고는 진지하게, 특히 조용한 경고일수록.** 밋밋한 `http://` 주소, 보이는 것과 다른 문자 체계로 쓴 이름, 링크 단축 서비스, 주소의 `@` 앞에 붙은 무엇이든 — 하나하나 나타난 자리에서 이름이 붙습니다. 그중 어느 것도 혼자서는 아무것도 증명하지 않습니다. 그리고 전부, 가기 전에 십 초를 쓸 값어치가 있습니다. 5. **읽히지 않으면 다른 것보다 먼저 빛을 바꾸세요.** 거의 모든 실패는 임계값 문제입니다. 한가운데를 가로지르는 반사, 한쪽 모서리에 걸린 그림자, 백라이트가 들어오는 각도로 찍은 화면. 빛이 코드에 얹히지 않도록 자리를 옮기거나 카메라 조명을 켜세요. 그래도 안 되면 정면에서 평평하게 한 장 찍어 그 사진을 올리세요. 정지 이미지는 실시간 화면이 받을 수 있는 것보다 훨씬 꼼꼼한 탐색을 받습니다. 6. **답이 이상하면 표본으로 삼은 그림을 보세요.** “이건 어떻게 읽었는가”를 펼쳐 작은 격자를 보세요. 표본으로 삼은 모듈에서 다시 그려 낸, 이 페이지가 코드라고 믿은 그림입니다. 심벌을 잘못 읽고 그럴듯한 무언가로 복구해 버린 리더는 그 사실을 거기에서만 드러냅니다. ## 자세한 설명 [QR 코드를 만들고 찍힌다는 것을 증명하는 방법](https://abox.tools/ko/가이드/qr코드-만들고-스캔-확인/): 코드를 생성한 뒤 같은 사이트의 리더로 검증합니다. 정확한 내용물, 진짜 링크를, 인쇄 크기에서 사진으로, 대량 인쇄 전에. 전부 브라우저에서, 아무것도 업로드하지 않고. ## 상자 속 다른 도구 - [해시와 체크섬](https://abox.tools/ko/체크섬-확인/): 받은 파일을 배포처가 적어 둔 숫자와 맞춰 봅니다. 어디로도 보내지 않고요. - [비밀번호·패스프레이즈 생성기](https://abox.tools/ko/비밀번호-생성기/): 여기서, 본인 브라우저가 만듭니다. 어디로도 보내지 않고, 저장하지 않고, 기록도 남기지 않습니다. - [JSON 포매터](https://abox.tools/ko/json-포맷터/): JSON, XML, HTML, CSS, YAML을 정렬하거나 변환합니다. 남의 서버에 붙여 넣는 것은 없습니다. - [YAML → JSON 변환기](https://abox.tools/ko/yaml-json-변환/): 양쪽 방향 모두, 그리고 각 방향이 무엇을 치르는지도 말해 줍니다. 그 어느 것도 남의 서버에 붙여 넣지 않습니다. ## 자주 묻는 질문 ### 이미지가 어딘가로 올라가나요? 아닙니다. 거기서 읽어 낸 것도 마찬가지입니다. 이미지는 이 페이지 안의 캔버스로 디코딩되어, 이 사이트에서 제공된 자바스크립트로 거기서 읽힙니다. 이 도구에는 네트워크 기능이 하나도 없습니다. 무언가를 가져오지도, 보내지도 않습니다. 페이지의 `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 코드는 리드-솔로몬 검사 데이터를 지니고, H 수준으로 만든 심벌은 모듈의 30% 정도를 잃어도 그대로 복원됩니다. 코드워드를 몇 개 복구했는지는 “이건 어떻게 읽었는가”에 나오므로 얼마나 아슬아슬했는지 볼 수 있습니다. 하지 않는 것은 짐작입니다. 검사가 감당할 수 있는 한계를 넘어 손상된 심벌은 틀린 답을 내는 대신 읽을 수 없다고 알립니다. ### bit.ly 링크가 어디로 가는지 알 수 없다고 하는 이유는 무엇인가요? 알아내려면 bit.ly에 물어봐야 하고, 그것이 네트워크 요청이기 때문입니다. 이 페이지가 하는 다른 모든 주장은 여기에 무언가와 접속하는 코드가 하나도 없다는 사실에 기대고 있고, 조용히 예외를 하나 두는 일은 그 답보다 값이 쌉니다. 그래서 단축 서비스의 이름은 밝히고, 그것이 감춘 것은 정직하게 모르는 채로 둡니다. 풀어 보고 싶다면 물어볼 의향이 있는 곳에 붙여 넣으세요. ### QR 코드를 스캔하는 것 자체가 안전한가요? 스캔은 안전합니다. 위험한 것은 따르는 쪽이고, 그건 실제 위험입니다. 진짜 코드 위에 덧붙인 코드는 주차 정산기에서도, 식당 테이블에서도, 택배 부재중 안내지에서도 이제 이름이 붙을 만큼 흔합니다. 그것이 통하는 이유는 코드를 눈으로 봐서 읽을 수 있는 사람이 없기 때문입니다. 열지 않고 읽는 것, 곧 이 페이지가 하는 일이 그 이점을 통째로 없애고, 호스트를 보는 십 초가 방어의 전부입니다. ### 결과 아래의 작은 격자는 무엇인가요? 이 페이지가 당신 이미지에서 실제로 표본으로 삼은 모듈을, 모듈당 네모 한 칸씩 다시 그린 것입니다. 읽은 결과를 믿는 대신 눈으로 확인할 수 있으라고 거기에 있습니다. 그 격자가 찍은 코드처럼 보인다면 위의 답은 맞는 픽셀에서 나온 것입니다. 이걸 보여 주는 리더는 거의 없고, 확인할 수 있는 도구와 믿어야만 하는 도구의 차이가 여기에 있습니다. ### 한 이미지에서 코드를 여러 개 읽나요? 지금은 이미지당 하나입니다. 여러 장을 한 번에 놓으면 각각 따로 읽히고, 카메라는 움직이는 동안 코드를 하나씩 이어서 읽으며 아직 보지 못한 것을 새로 담습니다. 코드가 잔뜩 인쇄된 종이를 한 장으로 찍은 사진은 잘라 내거나, 카메라를 하나씩 대야 할 경우입니다. ### 제가 요청한 것과 다른 이름으로 바코드를 부르는 이유는 무엇인가요? 바코드는 자기 이름을 지니고 다니지 않기 때문입니다. UPC-A는 첫 자리가 0인 EAN-13이고, ITF-14는 열네 자리에 유효한 검사 숫자가 붙은 Interleaved 2 of 5이며, Code 128의 숫자 모드는 다른 무엇과도 닮지 않았습니다. 이 페이지가 알리는 것은 막대가 말하는 내용에 검사 숫자가 확인해 준 것을 더한 만큼이고, 심벌 자신이 아는 것도 딱 거기까지입니다. ### 오프라인에서도 되나요? 됩니다. 페이지를 한 번 불러온 뒤 인터넷을 끊어도 카메라까지 그대로 동작합니다. 아무것도 올라가지 않는다는 것을 보이는 가장 간단한 방법이기도 합니다. 이미지를 밖으로 보내 디코딩시키는 리더라면 선을 뽑는 순간 멈출 테니까요. ## 이 약속을 직접 확인하는 방법 - **이미지는 절대 올라가지 않고, 카메라도 예외가 아닙니다.** 여기에 놓은 사진은 이 페이지 안의 캔버스로 디코딩되어 거기서 읽힙니다. 카메라 프레임도 같은 일이 초당 서른 번 일어나는 것뿐입니다. 그 캔버스에 그려지고, 살펴지고, 다음 프레임에 덮어써집니다. 저장되는 프레임도 남는 프레임도 없고, 정지를 누를 때 카메라 불이 꺼지는 것, 그것이 전부입니다. - **여기에는 무언가를 가져오는 코드가 없습니다.** `src/` 어디에도 `fetch`도, `XMLHttpRequest`도, `sendBeacon`도 없고, 페이지의 `Content-Security-Policy`는 설령 그런 코드가 있더라도 이 출처가 보낼 수 있는 주소를 하나도 남겨 두지 않습니다. 단축 링크가 어디로 가는지 이 페이지가 말해 주지 못하는 이유가 그것입니다. 알아내려면 물어봐야 하는데, 이 페이지는 묻지 않습니다. - **주소를 보여 줍니다. 열지는 않습니다.** 인쇄된 QR 코드는 아무도 읽을 수 없는 주소이고, 그 위에 스티커를 붙이는 일이 누군가에게 남는 장사가 되는 이유가 바로 그것입니다. 여기서는 아무것도 열지 않습니다. 문자열 전체를 보시라고 그대로 인쇄하고, 실제로 닿게 될 호스트는 따로 한 줄로 빼내고, 어떤 주소를 다른 주소처럼 보이게 하는 수법들은 나타난 자리에서 이름을 붙입니다. `@` 앞의 사용자 이름, 우리 글자와 모양이 같은 다른 문자 체계로 쓴 이름, 그리고 리디렉션입니다. - **무엇을 표본으로 삼았는지도 보여 줍니다.** QR 결과마다 그 아래에, 이 페이지가 당신 사진에서 실제로 읽어 낸 모듈의 그림이 있습니다. 그것이 스캔한 코드처럼 보이면 위의 답은 믿을 만합니다. 잡음처럼 보이면 아닙니다. 문자열만 건네고 마는 리더는 이렇게 확인할 방법이 없습니다. - **구글이 무엇을 불러오고, 무엇을 받지 못하는지.** 광고와 측정 스크립트는 구글에서, 후원 버튼은 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 코드를 만들고 찍힌다는 것을 증명하는 방법 코드를 생성한 뒤 같은 사이트의 리더로 검증합니다. 정확한 내용물, 진짜 링크를, 인쇄 크기에서 사진으로, 대량 인쇄 전에. 전부 브라우저에서, 아무것도 업로드하지 않고.
아닙니다. 거기서 읽어 낸 것도 마찬가지입니다. 이미지는 이 페이지 안의 캔버스로 디코딩되어, 이 사이트에서 제공된 자바스크립트로 거기서 읽힙니다. 이 도구에는 네트워크 기능이 하나도 없습니다. 무언가를 가져오지도, 보내지도 않습니다. 페이지의 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 코드는 리드-솔로몬 검사 데이터를 지니고, H 수준으로 만든 심벌은 모듈의 30% 정도를 잃어도 그대로 복원됩니다. 코드워드를 몇 개 복구했는지는 “이건 어떻게 읽었는가”에 나오므로 얼마나 아슬아슬했는지 볼 수 있습니다. 하지 않는 것은 짐작입니다. 검사가 감당할 수 있는 한계를 넘어 손상된 심벌은 틀린 답을 내는 대신 읽을 수 없다고 알립니다.
알아내려면 bit.ly에 물어봐야 하고, 그것이 네트워크 요청이기 때문입니다. 이 페이지가 하는 다른 모든 주장은 여기에 무언가와 접속하는 코드가 하나도 없다는 사실에 기대고 있고, 조용히 예외를 하나 두는 일은 그 답보다 값이 쌉니다. 그래서 단축 서비스의 이름은 밝히고, 그것이 감춘 것은 정직하게 모르는 채로 둡니다. 풀어 보고 싶다면 물어볼 의향이 있는 곳에 붙여 넣으세요.
스캔은 안전합니다. 위험한 것은 따르는 쪽이고, 그건 실제 위험입니다. 진짜 코드 위에 덧붙인 코드는 주차 정산기에서도, 식당 테이블에서도, 택배 부재중 안내지에서도 이제 이름이 붙을 만큼 흔합니다. 그것이 통하는 이유는 코드를 눈으로 봐서 읽을 수 있는 사람이 없기 때문입니다. 열지 않고 읽는 것, 곧 이 페이지가 하는 일이 그 이점을 통째로 없애고, 호스트를 보는 십 초가 방어의 전부입니다.
이 페이지가 당신 이미지에서 실제로 표본으로 삼은 모듈을, 모듈당 네모 한 칸씩 다시 그린 것입니다. 읽은 결과를 믿는 대신 눈으로 확인할 수 있으라고 거기에 있습니다. 그 격자가 찍은 코드처럼 보인다면 위의 답은 맞는 픽셀에서 나온 것입니다. 이걸 보여 주는 리더는 거의 없고, 확인할 수 있는 도구와 믿어야만 하는 도구의 차이가 여기에 있습니다.
지금은 이미지당 하나입니다. 여러 장을 한 번에 놓으면 각각 따로 읽히고, 카메라는 움직이는 동안 코드를 하나씩 이어서 읽으며 아직 보지 못한 것을 새로 담습니다. 코드가 잔뜩 인쇄된 종이를 한 장으로 찍은 사진은 잘라 내거나, 카메라를 하나씩 대야 할 경우입니다.
바코드는 자기 이름을 지니고 다니지 않기 때문입니다. UPC-A는 첫 자리가 0인 EAN-13이고, ITF-14는 열네 자리에 유효한 검사 숫자가 붙은 Interleaved 2 of 5이며, Code 128의 숫자 모드는 다른 무엇과도 닮지 않았습니다. 이 페이지가 알리는 것은 막대가 말하는 내용에 검사 숫자가 확인해 준 것을 더한 만큼이고, 심벌 자신이 아는 것도 딱 거기까지입니다.
됩니다. 페이지를 한 번 불러온 뒤 인터넷을 끊어도 카메라까지 그대로 동작합니다. 아무것도 올라가지 않는다는 것을 보이는 가장 간단한 방법이기도 합니다. 이미지를 밖으로 보내 디코딩시키는 리더라면 선을 뽑는 순간 멈출 테니까요.