Bilgisayar olmadan QR kod okuma tekniği
(qr.blinry.org)- QR kodunu elde çözebilmek için sürüm 1'in 21×21 modül yapısından maske kaldırma ve bayta dönüştürmeye kadar adım adım süreç anlatılıyor
- Bulucu desen, zamanlama deseni, biçim bilgisi ve quiet zone gibi özel alanlar tanıma için gerekli olsa da gerçek veri okumasında atlanmalı
- Veri okumada önce biçim bilgisinden maske deseni ve hata düzeltme seviyesi belirleniyor, ardından maskenin siyah modül konumlarında QR kod modülleri ters çevrilerek geri yükleniyor
- Okuma, sağ alttan başlayıp ikişer sütun halinde zikzak sırayla yapılıyor; Byte modunda uzunluk için 8 bitten sonra gelen 8 bitlik gruplar karakter baytlarını oluşturuyor
- Hata düzeltme alanını elde çözmek gerekmiyor; basit QR kodlarda uzunluk alanının işaret ettiği kadar bayt okunup ASCII tablosuna çevrilerek içerik çözülebiliyor
Elle okunacak QR kodu hazırlama
- Alıştırma için QR kodu üç şekilde hazırlanabilir
- Rastgele bir metin girerek aşağıda açıklanan QR kodunu güncellemek
- Kamerayla mevcut bir QR kodu tarayıp nasıl okunduğunu öğrenmek
- Rastgele İngilizce kelimelerle alıştırma yapmak; kelime gösterilmediği için eğitim amacıyla kullanılabilir
- Örnek QR kodu 21×21 modül boyutundadır
- QR kodunda piksele karşılık gelen birime modül(module) denir
- QR kod boyutu sürüm(version) ile ayrılır
- En küçük sürüm 21×21 modüldür
- Sonraki her sürümde bir kenarın uzunluğu 4 artar
- 21×21 modüllü QR kod sürüm 1'dir
QR kodda atlanacak özel alanlar
- Bulucu desen(finder pattern), tarayıcının önce QR kodu tanımasına yardımcı olur
- Bulucu desenin çevresindeki boş satırlar içerik okunurken atlanmalıdır
- Sürüm 1 QR kodda hizalama deseni(alignment pattern) yoktur
- Hizalama deseni, tarayıcının QR kodu doğru okumasına yardımcı olan ek bir desendir
- Zamanlama deseni(timing pattern), siyah ve beyaz modüllerin her zaman sırayla dizildiği iki çizgidir ve tarayıcının QR kodu doğru okumasına yardım eder
- Biçim bilgisi, maske deseni ile hata düzeltme seviyesini belirler
- Dikey biçim bilgisi ve yatay biçim bilgisi vardır
- Zamanlama deseni bu iki çizgiyi de keserek geçer
- quiet zone, QR kodun etrafındaki beyaz çerçevedir
- Tarayıcının QR kodun başlangıç ve bitişini ayırt etmesine yardımcı olur
Maske desenini kaldırma
- QR kodlar, büyük siyah veya beyaz bloklardan kaçınmak için maske(mask) kullanır
- Toplam 8 maske seçeneği vardır
- Örnekte siyah modül 1, beyaz modül 0 olarak okunup maske deseni bitleri belirlenir
- Örnek bitler ikilik
110değeridir 110, onluk sistemde 6'ya karşılık gelir
- Örnek bitler ikilik
- Her maske türünün önceden tanımlanmış bir deseni vardır
- Örnek QR kodun deseni, siyah beyaz bir gökkuşağının parçası gibi görünür
- Maske veri alanının üzerine tekrar tekrar yerleştirilir; maskede siyah modül olan her konumda QR kod modülü ters çevrilir
- Tüm maske türleri için kısa bir rehber içeren DIY zine sunuluyor
- Küçük bir kitapçık olarak katlama örneği için bu rehber görsele bakılabilir
Kodlama modu ve okuma sırası
- İçeriği çözmek önce kodlama modunu kontrol etmekle başlar
- Kodlama bilgisi her zaman sağ alt köşededir
- Kodlama modu da önce maske uygulanarak çözülmelidir
- Örnekte rehbere bakılarak iki kutuya XOR uygulanır
- Kodlama modları arasında Numeric, Alphanumeric, Byte, ECI, Kanji ve diğerleri bulunur
- Örnek QR kodun kodlama modu Byte(4) değeridir
- İçerik sağ alt köşeden başlar
- İki sütun arasında yukarı doğru zikzak çizerek okunur
- Ardından soldaki sonraki iki sütunda aşağı doğru zikzakla devam edilir
- Tüm özel alanlar her zaman atlanır
Uzunluk ve bayt çözme
- İlk 4 bit kodlama modudur
- Byte modunda sonraki 8 bit içeriğin uzunluğunu belirtir
- Bundan sonra her 8 bit bir içerik baytını oluşturur
- Uzunluk bilgisi de maske uygulanarak çözülmelidir
- Örnekte maskesi kaldırılmış uzunluk bilgisi
00001100değeridir- Onluk sistemde
12 - Yani toplam içerik uzunluğu 12 bayttır
- Onluk sistemde
- İlk maskesi kaldırılmış bayt
01001000değeridir- Onaltılık sistemde
0x48 - Karşılık gelen ASCII karakteri
Hharfidir
- Onaltılık sistemde
- İkinci maskesi kaldırılmış bayt
01100101değeridir- Onaltılık sistemde
0x65 - Karşılık gelen ASCII karakteri
eharfidir
- Onaltılık sistemde
- Kalan baytlar alıştırma için bırakılmıştır; daha önce okunan uzunluk alanının gösterdiği karakter sayısına ulaşıldığında durulabilir
ASCII tablosu ve hata düzeltme
- Onaltılık değerleri karakterlere dönüştürmek için ASCII tablosu kullanılabilir
- Küçük harflerde
a,0x61ile başlar vez,0x7Aile biter- Aradaki karakterler sayılarak bulunabilir
- Kalan tüm alanlar içerik değildir
- QR kodlarda ayrıca hata düzeltme(error correction) bulunur
- Kodun bir kısmı hasarlı, bulanık veya eksik olsa bile QR kodun okunabilmesini sağlar
- Hata düzeltme matematiksel olarak üretilir, ancak elle okuma amacıyla burada ele alınmaz
- Basit bir QR kodu elde çözme süreci öğrenildikten sonra random code düğmesiyle kısa İngilizce kelimeler üzerinde alıştırma yapılabilir veya Scan code düğmesiyle gerçek QR kodlar taranabilir
- Kaynak kodu Codeberg üzerinde bulunuyor
- Özellikle UTF-8 kodlama modunu açıklayan PR'lar memnuniyetle karşılanıyor
1 yorum
Hacker News yorumları
90’ların sonunda ya da 2000’lerin başında Atari 8-bit disk içeriklerini PC’ye aktarmak istiyordum
Atari’nin SIO portu ile PC seri portunu bağlayan SIO2PC kablosunu ve yazılımını biliyordum ama o zamanlar bunu kendim yapacak elektronik bilgim yoktu
Sonunda Atari’de, diski sektör sektör okuyan ve grafik modu 3’teki iri 4 renkli piksellerle ekrana çizen bir Basic programı yazdım; ardından Atari’yi PC’nin TV kartına bağlayıp bir Delphi programıyla sürekli ekran görüntüsü alarak veriyi çözmesini sağladım
Boş sektörler yüzünden piksel konumu düzeltmesi kaydığı için maske deseni, checksum ve sektör adresini de ekledim; bu yöntemle tüm disk içeriklerini PC’ye aktarabildim
Bunu hâlâ en büyük mühendislik başarım olarak görüyorum
Yaklaşık 10 yıl sonra AspeQt adlı bir SIO2PC programı yaptım; daha güncel topluluk fork’u RespeQt hâlâ bu alanda en çok kullanılan araç ve AtariAge’de buna ayrılmış bir alt forum da var: https://forums.atariage.com/forum/184-respeqt-sio2pc-softwar...
LCD arka ışığıyla bit desenleri yanıp söndürülmüş ve kamera ile bu veri okunmuş deniyor: https://mastodon.social/@bagder/111538350617290554
“Hata düzeltme karmaşık matematik olduğu için elle okumada bununla ilgilenmiyoruz” açıklamasının biraz daha ayrıntılı olması gerek
Matematiğin zor olduğunu anlıyorum ama hata düzeltme verisinin sona mı eklendiğini, her bayttan sonra mı geldiğini, yoksa araya mı yerleştirildiğini merak ediyorum
Hasar görmemiş bir QR kodunda, hata düzeltme olsa bile matematik kısmını atlayıp elle okunup okunamayacağını da bilmek isterdim
% 10gibi bir hesap yaparak 0–9 arasında bir değer elde edersinizBu yüzden veri yanlış olsa bile checksum’ın tesadüfen tutma olasılığı 1/10’dur; ayrıca son rakam, ürünün gerçek benzersiz barkod ID’si açısından zaten önemli değildir
Home Depot’a iade ettiğim bir ürünün barkodu yırtılmış, checksum rakamı aşınmıştı; çalışan manuel arama yapmadan önce bunu hesaplamaya çalışırken umutsuzca acele etmiştim ama sonunda çalışan kazandı, bunu hiç unutamıyorum
https://www.gs1.org/services/how-calculate-check-digit-manua...
https://www.simplybarcodes.com/barcode_check_digit_calculato...
Ardından boyuta ve hata düzeltme seviyesine göre bitstream bloklara bölünür, her blok için hata düzeltme verisi hesaplanır ve sonra bloklar interleave edilir
Bu yüzden bu yöntem, hata düzeltme seviyesinden bağımsız olarak QR sürüm 5’i aşınca başarısız olur; sürüm 3–5’te de hata düzeltme seviyesi yüksekse başarısız olur
Gerçekte bilgi türüne bağlı olarak Reed-Solomon ve BCH adlı biraz farklı iki kod kullanılır
https://www.quaxio.com/an_artisanal_qr_code.html
İlgili yazılar:
Decoding small QR codes by hand (2012) - https://news.ycombinator.com/item?id=36173441 - Haziran 2023, 69 yorum
How a QR code works - https://news.ycombinator.com/item?id=32837565 - Eylül 2022, 114 yorum
Creating a QR Code step by step - https://news.ycombinator.com/item?id=24119124 - Ağustos 2020, 41 yorum
Creating a QR Code step by step - https://news.ycombinator.com/item?id=18360847 - Kasım 2018, 34 yorum
Yazının kendisi de harika ama giriş değerlerine göre tüm görselleri dinamik olarak üretmesi daha da güzel
QR kodlarının nasıl okunacağına dair açıklama iyiydi; yaygın UPC gibi tek boyutlu barkodları çözmeyi anlatan yazı olarak bu da fena değil:
https://scanbot.io/blog/how-do-barcodes-work/
Yaklaşık 10 yıl önce QR kodlarını elle okumayı denemiştim ama maske deseni yüzünden vazgeçtim
Veri tipini öğrenmeden önce bile maske desenini XOR ile uygulamak gerekiyor
Bu maske deseninin gerçek QR kod okuyucularına ne kadar yardımcı olduğunu merak ediyorum
Geçen ay en iyi hata düzeltme ayarını araştırdım; ekranda gösterilen sağlam bir matris gibi hasarsız durumlarda yanıt “yok”tu ve bu sonuca ulaşmak kolay olmadı
Çeşitli ayarları ve tarama uygulamalarını gerçek ortamda karşılaştıran bir kaynak bulamadım; ben de ekranda küçük QR kodları farklı hata düzeltme seviyelerinde gösterip kamerayı sallayarak okuma sorunlarını taklit etmeye çalıştım ama ayarlar arasında anlamlı bir fark göremedim
En az dört hizalama işareti, geniş bir boşluk ve zamanlama desenleri varken, maske olmadığı için beyaz bloklar oluşmasının gerçekten büyük fark yaratıp yaratmayacağını merak ediyorum
QR’ı görsel olarak okumayı denemekten vazgeçmemin ikinci nedeni de çoğu zaman URL’nin altta alternatif metin olarak yazılı olmasıydı; sonradan alternatif metni olmayan birkaç örnek gördüm ama çok nadirdi
Kullanmazsanız mesaj daha az yer kaplar ve QR daha küçük olur
Etiket baskısı gibi sabit bir alana sığdırmanız gerekiyorsa pikselleri fiziksel olarak daha büyük yapabilirsiniz; güvenilir okuma için hata düzeltmeden çok daha büyük pikseller daha faydalı oldu
Mesaj uzunluğuna bağlı olarak nihai QR boyutunu değiştirmeden hata düzeltme seviyesini artırabildiğiniz durumlar oluyor; o zaman ikisini de elde etmiş oluyorsunuz
Bir sürü izleme parametresi eklenmiş URL’nin tamamını sürüm 25, 117x117 koda koyup büyük bir tabelaya asan; üzerine kuş pisliği düşse ve biri çıkartma yapıştırsa bile verinin hayatta kalmasını isteyenler için
Ne kadar küçük basılırsa hâlâ algılanabileceğini görmeye çalışıyordum; yan yorumda söylendiği gibi bunun nedeni tek tek piksellerin daha büyük olması gibi görünüyor
Yaklaşık 10 yıl önce yayımlanmış bir QR çözümleme videosu: https://www.youtube.com/watch?v=KA8hDldvfv0 (20 dk)
QR kodunu adım adım oluşturan etkileşimli web sayfam da var. Temelde ters yöndeki süreç: https://www.nayuki.io/page/creating-a-qr-code-step-by-step
Hata düzeltmeyi merak ettim; QR kodlarının kurtarılabilir oranı %7’den %30’a kadar farklı tasarlanabiliyormuş
İlginç: https://docs.beaconstac.com/en/articles/6018654-what-is-erro...
Shannon 20. yüzyılın ortalarında teorik sınırı bulmuştu ama kimse o sınıra nasıl ulaşılacağını bilmiyordu
1990’larda turbo kod patentiyle bir anda o sınıra yaklaşılınca akademi buna inanmakta zorlandı
Elbette bu tür teknolojiler sayesinde hızlı ve güvenilir mobil ağlar mümkün oldu
2023 Mystery Hunt’ın türev bulmacalarından birinde, hata düzeltmeyle bile kurtarılamayacak kadar bozulmuş bir QR kodunu elle çözmek gerekiyordu
Bu yorum bölümünde geçen rehberlerin hepsine baktım; faydalıydılar ama çok da mükemmel değillerdi
Bu yüzden böyle daha ayrıntılı yazıların çoğalması iyi; bu yazı da kesinlikle oldukça iyi hazırlanmış görünüyor
Merak edenler için bulmaca burada; QR çözümlemesi sonlara doğru geliyor: https://puzzles.mit.edu/2023/abcde.puzzlefactory.place/puzzl...
Wikipedia’ya bakınca QR kodunun 1994’te bir Japon otomotiv parçası üreticisi tarafından otomobil parçalarını etiketlemek için icat edildiği yazıyor
Bugün icat edilseydi daha iyi hale getirilip getirilemeyeceğini merak ediyorum
Daha küçük yapılabilir ya da daha kolay okunabilir miydi?
1994’te de barkodlar zaten her yerdeydi ama bu, QR kodunun yükselmesini engellemedi
Belki de iyileştirme payı pek yoktur; kavramı kökten değiştirip NFC gibi bir şeye gitmediğiniz sürece