4 puan yazan GN⁺ 2024-01-23 | 1 yorum | WhatsApp'ta paylaş
  • 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 110 değeridir
    • 110, onluk sistemde 6'ya karşılık gelir
  • 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

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 00001100 değeridir
    • Onluk sistemde 12
    • Yani toplam içerik uzunluğu 12 bayttır
  • İlk maskesi kaldırılmış bayt 01001000 değeridir
    • Onaltılık sistemde 0x48
    • Karşılık gelen ASCII karakteri H harfidir
  • İkinci maskesi kaldırılmış bayt 01100101 değeridir
    • Onaltılık sistemde 0x65
    • Karşılık gelen ASCII karakteri e harfidir
  • 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, 0x61 ile başlar ve z, 0x7A ile 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

 
GN⁺ 2024-01-23
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...

      1. nesil iPod firmware’i ve anahtarlarının tersine mühendislikle çıkarılma yöntemini hatırlatıyor
        LCD arka ışığıyla bit desenleri yanıp söndürülmüş ve kamera ile bu veri okunmuş deniyor: https://mastodon.social/@bagder/111538350617290554
    • Kilitli sistemler daha yaygın hâle geldikçe, bu tür ekran tabanlı veri sızdırmanın kesinlikle bir geleceği var gibi görünüyor
  • “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

    • Barkodlar son rakamı checksum olarak kullanır; rakamları toplayıp çarpar ve % 10 gibi bir hesap yaparak 0–9 arasında bir değer elde edersiniz
      Bu 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...
    • QR kodunun içindeki veri, birkaç alfabeden biriyle bitstream olarak kodlanır; byte bunlardan yalnızca biridir
      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
    • An Artisanal QR Code, uzun bölmeye benzer aritmetikle checksum’ın elle nasıl hesaplanacağını gösteriyor
      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

    • Hata düzeltme tuhaf bir şey
      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
    • Hata düzeltme, “Mesajı daha küçük yapıp QR kodun okunabilirliğini nasıl artırırım?” diye düşünenler için değil
      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
    • Geçen yıl benzer bir deney yaptım ve en azından 3D baskı QR kodlarda hata düzeltmesiz olan en iyisiydi
      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...

    • Hata düzeltme gerçekten ilginç bir konu
      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?

    • Daha iyi yeni bir tasarımı engelleyen bir şey yok
      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
    • Bugün icat edilseydi muhtemelen altıgen olurdu