4 poin oleh GN⁺ 2024-01-23 | 1 komentar | Bagikan ke WhatsApp
  • Merangkum prosedur langkah demi langkah agar kode QR dapat diuraikan secara manual, mulai dari struktur modul 21×21 versi 1 hingga pelepasan mask dan konversi byte
  • Area khusus seperti finder pattern, timing pattern, informasi format, dan quiet zone diperlukan untuk pengenalan, tetapi harus dilewati saat membaca data sebenarnya
  • Data dipulihkan dengan terlebih dahulu memeriksa pola mask dan tingkat koreksi kesalahan dari informasi format, lalu membalik modul kode QR pada setiap posisi modul hitam di mask
  • Pembacaan dimulai dari kanan bawah dengan urutan zigzag dua kolom sekaligus; dalam mode Byte, kumpulan 8 bit setelah panjang 8 bit menjadi byte karakter
  • Area koreksi kesalahan tidak perlu dipecahkan secara manual; untuk kode QR sederhana, cukup baca byte sebanyak yang ditunjukkan field panjang lalu ubah dengan tabel ASCII untuk menguraikannya

Menyiapkan kode QR untuk dibaca secara manual

  • Kode QR untuk latihan dapat disiapkan dengan tiga cara
    • Masukkan teks apa pun untuk memperbarui kode QR yang dijelaskan di bawah
    • Pelajari cara membacanya dengan memindai kode QR yang sudah ada menggunakan kamera
    • Berlatih dengan kata bahasa Inggris acak; kata tersebut tidak ditampilkan sehingga dapat digunakan untuk latihan
  • Contoh kode QR berukuran 21×21 modul
  • Satuan yang setara dengan piksel dalam kode QR disebut modul (module)
  • Ukuran kode QR dibedakan berdasarkan versi (version)
    • Versi terkecil adalah 21×21 modul
    • Pada setiap versi berikutnya, ukuran tiap sisi bertambah 4
    • Kode QR 21×21 modul adalah versi 1

Area khusus yang dilewati dalam kode QR

  • Finder pattern membantu pemindai mengenali kode QR terlebih dahulu
  • Baris kosong di sekitar finder pattern harus dilewati saat membaca konten
  • Kode QR versi 1 tidak memiliki alignment pattern
    • Alignment pattern adalah pola tambahan yang membantu pemindai membaca kode QR dengan benar
  • Timing pattern adalah dua baris tempat modul hitam dan putih selalu muncul bergantian, membantu pemindai membaca kode QR dengan benar
  • Informasi format menentukan pola mask dan tingkat koreksi kesalahan
    • Ada informasi format vertikal dan informasi format horizontal
    • Timing pattern melewati dan memutus kedua baris tersebut
  • Quiet zone adalah bingkai putih di sekitar kode QR
    • Ini membantu pemindai mengenali awal dan akhir kode QR

Melepas pola mask

  • Kode QR menggunakan mask untuk menghindari gumpalan besar berwarna hitam atau putih
  • Ada total 8 pilihan mask
  • Dalam contoh, modul hitam dibaca sebagai 1 dan modul putih sebagai 0 untuk memeriksa bit pola mask
    • Bit contoh adalah biner 110
    • 110 setara dengan desimal 6
  • Setiap jenis mask memiliki pola yang telah ditentukan sebelumnya
  • Pola pada contoh kode QR terlihat seperti sebagian pelangi hitam-putih
  • Setelah menempatkan mask secara berulang di atas area data, balik modul kode QR pada setiap posisi yang merupakan modul hitam di mask
  • Tersedia DIY zine yang berisi lembar contekan untuk semua jenis mask

Mode encoding dan urutan membaca

  • Penguraian konten dimulai dengan memeriksa mode encoding terlebih dahulu
  • Informasi encoding selalu berada di sudut kanan bawah
  • Mode encoding juga harus dilepas terlebih dahulu dengan menerapkan mask
    • Dalam contoh, lihat lembar contekan lalu lakukan XOR pada dua kotak
  • Mode encoding mencakup Numeric, Alphanumeric, Byte, ECI, Kanji, dan lainnya
  • Mode encoding pada contoh kode QR adalah Byte(4)
  • Konten dimulai dari sudut kanan bawah
    • Baca sambil naik secara zigzag di antara dua kolom
    • Lalu turun secara zigzag pada dua kolom berikutnya di sebelah kiri
    • Semua area khusus selalu dilewati

Menguraikan panjang dan byte

  • 4 bit pertama adalah mode encoding
  • Dalam mode Byte, 8 bit berikutnya menentukan panjang konten
  • Setelah itu, setiap 8 bit menjadi satu byte konten
  • Informasi panjang juga harus dilepas dengan menerapkan mask
  • Informasi panjang pada contoh setelah mask dilepas adalah 00001100
    • Dalam desimal, 12
    • Artinya total panjang konten adalah 12 byte
  • Byte pertama setelah mask dilepas adalah 01001000
    • Dalam heksadesimal, 0x48
    • Karakter ASCII yang sesuai adalah H
  • Byte kedua setelah mask dilepas adalah 01100101
    • Dalam heksadesimal, 0x65
    • Karakter ASCII yang sesuai adalah e
  • Byte sisanya dibiarkan sebagai latihan; Anda dapat berhenti setelah membaca sejumlah karakter yang ditunjukkan oleh field panjang yang telah dibaca sebelumnya

Tabel ASCII dan koreksi kesalahan

  • Dengan tabel ASCII, nilai heksadesimal dapat dikonversi menjadi karakter
  • Huruf kecil dimulai dari a pada 0x61 dan berakhir dengan z pada 0x7A
    • Karakter di antaranya dapat ditemukan dengan menghitungnya
  • Tidak semua area yang tersisa adalah konten
  • Kode QR juga mencakup koreksi kesalahan (error correction)
    • Ini memungkinkan kode QR tetap dapat dibaca meskipun sebagian rusak, buram, atau hilang
    • Koreksi kesalahan dihasilkan dengan matematika, tetapi tidak dibahas untuk tujuan membaca secara manual
  • Setelah mempelajari prosedur menguraikan kode QR sederhana secara manual, Anda dapat berlatih dengan kata bahasa Inggris pendek melalui tombol kode acak, atau memindai kode QR sungguhan melalui tombol Scan code
  • Kode sumber ada di Codeberg
    • PR yang menjelaskan mode encoding UTF-8 sangat diterima

1 komentar

 
GN⁺ 2024-01-23
Opini Hacker News
  • Pada akhir 90-an atau awal 2000-an, saya ingin memindahkan isi disk Atari 8-bit ke PC
    Saya tahu ada kabel dan software SIO2PC yang menghubungkan port SIO Atari dengan port serial PC, tetapi saat itu saya belum punya kemampuan elektronika untuk membuatnya sendiri
    Akhirnya saya menulis program Basic di Atari untuk membaca disk sektor demi sektor, menggambarkannya di layar sebagai piksel 4 warna berukuran besar dalam mode grafis 3, lalu menghubungkan Atari ke kartu TV di PC dan membuat program Delphi yang terus mengambil screenshot untuk mendekode datanya
    Karena sektor kosong membuat koreksi posisi piksel meleset, saya menambahkan pola mask, checksum, hingga alamat sektor, dan dengan cara itu saya bisa memindahkan seluruh isi disk ke PC
    Sampai sekarang saya masih menganggap ini sebagai pencapaian engineering terbaik saya
    Sekitar 10 tahun kemudian saya membuat program SIO2PC bernama AspeQt, dan fork komunitas yang lebih baru, RespeQt, masih menjadi tool yang paling banyak digunakan di bidang ini; AtariAge juga punya subforum khusus untuknya: https://forums.atariage.com/forum/184-respeqt-sio2pc-softwar...

    • Ini mengingatkan pada cara firmware dan key iPod generasi pertama direkayasa balik
      Katanya mereka membuat backlight LCD berkedip dalam pola bit dan membaca data itu dengan kamera: https://mastodon.social/@bagder/111538350617290554
    • Semakin umum sistem yang terkunci, eksfiltrasi data berbasis display seperti ini jelas tampak punya masa depan
  • Penjelasan bahwa “koreksi kesalahan adalah matematika rumit, jadi tidak dibahas untuk pembacaan manual” seharusnya bisa lebih rinci
    Saya paham matematikanya sulit, tetapi saya penasaran apakah data koreksi kesalahan ditempelkan di akhir, setelah setiap byte, atau disisipkan di tengah
    Saya juga ingin tahu apakah QR code yang tidak rusak tetap bisa dibaca manual dengan melewati bagian matematikanya meskipun ada koreksi kesalahan

    • Barcode memakai angka terakhir sebagai checksum, lalu menjumlahkan dan mengalikan digit-digitnya dan melakukan perhitungan seperti % 10 sehingga hasilnya menjadi salah satu angka 0–9
      Jadi ada peluang 1/10 data salah tetapi checksum kebetulan cocok, dan bagaimanapun angka terakhir tidak penting bagi ID barcode unik produk yang sebenarnya
      Pernah barcode barang yang saya kembalikan ke Home Depot sobek sehingga angka checksumnya aus; saya mati-matian bergegas mencoba menghitungnya sebelum staf melakukan pencarian manual, tetapi akhirnya stafnya menang, dan saya tidak bisa melupakannya
      https://www.gs1.org/services/how-calculate-check-digit-manua...
      https://www.simplybarcodes.com/barcode_check_digit_calculato...
    • Data di dalam QR code dienkode sebagai bitstream dalam salah satu dari beberapa alfabet, dan byte hanyalah salah satunya
      Setelah itu, tergantung ukuran dan level koreksi kesalahan, bitstream dibagi menjadi blok, data koreksi kesalahan untuk tiap blok dihitung, lalu blok-blok tersebut di-interleave
      Karena itu, metode ini akan gagal untuk QR versi di atas 5 terlepas dari level koreksi kesalahan, dan juga gagal pada versi 3–5 jika level koreksi kesalahannya tinggi
    • An Artisanal QR Code menunjukkan cara menghitung checksum secara manual dengan aritmetika yang mirip pembagian panjang
      Dalam praktiknya, dua kode yang sedikit berbeda, Reed-Solomon dan BCH, digunakan tergantung jenis informasinya
      https://www.quaxio.com/an_artisanal_qr_code.html
  • Artikel terkait:
    Decoding small QR codes by hand (2012) - https://news.ycombinator.com/item?id=36173441 - Juni 2023, 69 komentar
    How a QR code works - https://news.ycombinator.com/item?id=32837565 - September 2022, 114 komentar
    Creating a QR Code step by step - https://news.ycombinator.com/item?id=24119124 - Agustus 2020, 41 komentar
    Creating a QR Code step by step - https://news.ycombinator.com/item?id=18360847 - November 2018, 34 komentar

  • Artikelnya sendiri memang bagus, tetapi yang lebih keren adalah semua gambar dibuat secara dinamis sesuai input

  • Penjelasan tentang cara membaca QR code bagus, dan untuk tulisan tentang mendekode barcode satu dimensi umum seperti UPC, yang ini juga cukup bagus:
    https://scanbot.io/blog/how-do-barcodes-work/

  • Sekitar 10 tahun lalu saya pernah mencoba membaca kode QR secara manual, tetapi menyerah karena pola mask
    Bahkan sebelum mengetahui tipe datanya, pola mask harus diterapkan dengan XOR
    Saya penasaran seberapa besar pola mask ini membantu pembaca kode QR sungguhan
    Bulan lalu saya mencari pengaturan koreksi kesalahan yang optimal, tetapi untuk kasus yang tidak rusak seperti matriks utuh yang ditampilkan di layar, jawabannya adalah “tidak ada”, dan kesimpulan ini tidak mudah ditemukan
    Saya tidak menemukan materi yang membandingkan berbagai pengaturan dan implementasi pemindaian di lingkungan nyata, lalu saya sendiri menampilkan QR kecil di layar dengan beberapa tingkat koreksi kesalahan dan menggoyangkan kamera untuk meniru masalah pembacaan, tetapi tidak melihat perbedaan berarti antar-pengaturan
    Ada setidaknya empat marker penyelarasan, margin besar, dan pola timing juga; saya jadi bertanya-tanya apakah gumpalan putih yang muncul karena tidak adanya mask benar-benar membuat perbedaan besar
    Alasan kedua saya berhenti mencoba membaca QR secara visual adalah karena biasanya URL tertulis di bawahnya sebagai teks alternatif; sejak itu saya memang beberapa kali melihat kasus tanpa teks alternatif, tetapi sangat jarang

    • Koreksi kesalahan itu aneh
      Jika tidak dipakai, pesan memakan lebih sedikit ruang dan QR menjadi lebih kecil
      Jika harus muat dalam ruang tetap seperti cetakan stiker, piksel bisa dibuat lebih besar secara fisik, dan untuk pembacaan yang stabil, piksel yang lebih besar lebih membantu daripada koreksi kesalahan
      Tergantung panjang pesan, ada kasus ketika tingkat koreksi kesalahan bisa dinaikkan tanpa mengubah ukuran akhir QR; saat itu, bisa dibilang mendapat keduanya
    • Koreksi kesalahan bukan untuk orang yang berpikir “bagaimana cara membuat pesan lebih kecil agar keterbacaan kode QR meningkat”
      Ini untuk orang yang memasukkan seluruh URL dengan setumpuk parameter pelacakan ke dalam kode versi 25, 117x117, lalu menempelkannya di papan reklame besar, dan ingin datanya tetap bertahan meski terkena kotoran burung atau ditempeli stiker oleh seseorang
    • Tahun lalu saya melakukan eksperimen serupa, dan setidaknya untuk kode QR cetak 3D, hasil terbaik adalah tanpa koreksi kesalahan
      Eksperimen itu untuk melihat seberapa kecil ia bisa dicetak namun tetap terdeteksi, dan seperti komentar di samping, tampaknya karena setiap piksel menjadi lebih besar
  • Video penguraian QR yang diunggah sekitar 10 tahun lalu: https://www.youtube.com/watch?v=KA8hDldvfv0 (20 menit)
    Saya juga punya halaman web interaktif yang membuat kode QR langkah demi langkah. Pada dasarnya ini adalah proses kebalikannya: https://www.nayuki.io/page/creating-a-qr-code-step-by-step

  • Saya jadi penasaran soal koreksi kesalahan; katanya kode QR bisa dirancang dengan rasio yang dapat dipulihkan berbeda-beda, dari 7% hingga 30%
    Menarik: https://docs.beaconstac.com/en/articles/6018654-what-is-erro...

    • Koreksi kesalahan benar-benar topik yang menarik
      Shannon menemukan batas teoretisnya pada pertengahan abad ke-20, tetapi tidak ada yang tahu cara mencapai batas itu
      Ketika pada 1990-an turbo code tiba-tiba mendekati batas tersebut melalui paten, dunia akademik bereaksi seolah sulit dipercaya
      Tentu saja berkat teknologi seperti ini, jaringan seluler yang cepat dan andal menjadi mungkin
  • Dalam salah satu puzzle turunan Mystery Hunt 2023, ada soal yang mengharuskan menguraikan kode QR secara manual karena sudah rusak parah sampai tidak bisa dipulihkan bahkan dengan koreksi kesalahan
    Saya membaca semua panduan yang muncul di kolom komentar ini, dan meski berguna, tidak ada yang benar-benar luar biasa
    Jadi saya senang melihat semakin banyak tulisan yang lebih rinci seperti ini, dan tulisan ini jelas terlihat sangat matang
    Jika penasaran, puzzle-nya ada di sini, dan penguraian QR muncul di bagian akhir: https://puzzles.mit.edu/2023/abcde.puzzlefactory.place/puzzl...

  • Menurut Wikipedia, kode QR ditemukan pada 1994 oleh produsen suku cadang otomotif Jepang untuk pelabelan suku cadang mobil
    Saya penasaran apakah jika ditemukan hari ini, ia bisa dibuat lebih baik
    Bisakah dibuat lebih kecil atau lebih mudah dibaca?

    • Tidak ada yang benar-benar menghalangi rancangan baru yang lebih baik
      Pada 1994 pun barcode sudah ada di mana-mana, tetapi itu tidak mencegah kode QR populer
      Mungkin juga ruang untuk perbaikan memang tidak banyak, kecuali konsepnya diubah besar-besaran ke sesuatu seperti NFC
    • Kalau ditemukan hari ini, sepertinya bentuknya heksagonal