- The Backdooms adalah game HTML terkompresi, self-extracting, dan digenerasi tanpa batas, terinspirasi dari DOOM 1993 dan The Backrooms, yang berjalan langsung di browser dari kode QR
- Seluruh kode game dimasukkan ke dalam URL; setelah dipindai, game ditujukan sebagai struktur sepenuhnya offline yang bisa dimainkan tanpa koneksi internet
- Alur kompresinya: HTML dikompresi dengan Zlib, dienkode ke Base64, lalu dimasukkan ke wrapper HTML JavaScript; di browser, konten didekompresi dan dijalankan menggunakan API
DecompressionStream
- Pembuatan QR memakai
qr.make(fit=True) untuk mencari versi QR terkecil yang memungkinkan, dan gagal jika tidak muat dalam batas standar versi 40 dengan level koreksi kesalahan L
- Dukungan mobile terbatas pada browser mobile modern yang mendukung API
DecompressionStream; README mencantumkan Edge, Yandex, dan Opera sebagai contoh
Apa yang dilakukan The Backdooms
- The Backdooms adalah game HTML yang memuat seluruh game di dalam kode QR dan menjalankannya di web browser
- Game ini terinspirasi dari DOOM 1993 dan The Backrooms, serta disusun sebagai halaman web terkompresi yang mengekstrak dirinya sendiri
- Saat kode QR dipindai, game langsung berjalan di browser tanpa perlu unduhan atau instalasi terpisah
- README menyebutkan bahwa game bisa dipindai untuk dimainkan
- GitHub Pages juga menyediakan versi yang sedikit kurang terkompresi
Metode kompresi yang mendorong batas kapasitas penyimpanan
- Tujuan proyek ini adalah mendorong batas kapasitas penyimpanan kode QR dan kompresi, sekaligus menunjukkan cara menghosting aplikasi web ringan di dalam kode QR
- Alur kompresinya terdiri dari urutan berikut
- Membaca HTML input
- Mengompresi HTML dengan Zlib
- Mengenkode data terkompresi ke Base64
- Menyisipkannya ke wrapper HTML berbasis JavaScript
- Mengubah seluruh HTML menjadi Data URI dengan format
data:text/html;base64,...
- Di browser, API
DecompressionStream digunakan untuk mendekompresi konten terkompresi secara dinamis dan menjalankannya
- Diagram di README mencakup
DecompressionStream 'gzip' dan tahap Format Mismatch pada langkah pemrosesan browser
Logika pembuatan kode QR
- Alat pembuat kode QR menyediakan alur untuk mengubah game berukuran sekitar 2,5kb menjadi kode QR
- Contoh eksekusinya adalah sebagai berikut
python3 QRGEN.py <your-game.html> <output-qrcode.png>
python3 QRGEN.py EVEN-SMALLER-SLAMMER-BACKROOMS.html qrcode.png
- Proses pembuatan terlebih dahulu mencoba versi QR terkecil yang sesuai dengan panjang konten menggunakan
qr.make(fit=True)
- Jika versi yang dibutuhkan melampaui batas standar kode QR, yaitu 40, proses memaksa versi 40 dengan
fit=False
- Untuk memuat data sebanyak mungkin, level koreksi kesalahan yang digunakan adalah yang paling rendah, yaitu L
- Jika data masih terlalu besar untuk versi 40 dan level L, encoding QR gagal dan mengembalikan error
Eksekusi dan kompatibilitas
- Untuk bermain, hanya diperlukan web browser modern
- Setelah dipindai, seluruh kode game berada di dalam URL, sehingga game bisa dimainkan tanpa koneksi internet
- Di mobile, diperlukan browser modern yang mendukung API
DecompressionStream
- README mencantumkan Edge, Yandex, dan Opera sebagai contoh
- Implementasi alternatif berbasis BigInt untuk kode QR yang lebih kecil tersedia di The BigInt Branch, tetapi kompatibilitas browser mobile-nya terbatas
Lingkungan pembuatan dan lisensi
- Untuk membuat kode QR sendiri, dependensi berikut diperlukan
-
Python 3.7+
- Library
qrcode
pillow untuk pemrosesan gambar kode QR
- Perintah instalasi dependensinya adalah sebagai berikut
pip install qrcode[pil]
- Proses pengembangan dirangkum di [MindDump](https://kuberwastaken.github.io/blog/Projects/How-I-Managed-To-Get-Doom-In-A-QR-Code)
- Proyek ini dirilis dengan **MIT License**, sehingga dapat digunakan, dimodifikasi, dan dibagikan secara bebas
1 komentar
Komentar di Hacker News
Baru tahu tentang DecompressionStream, lalu merapikan bagian HTML dan berhasil mengurangi beberapa byte lagi
Saya juga sudah mengajukan PR kalau ada yang tertarik melihatnya
Terima kasih banyak, ini jadi hal terbaik saya bulan ini
Proyek yang benar-benar keren
Saya juga baru tahu soal URL
data:; saya sudah tahu dan pernah memakai skema URIdata:, tapi tidak tahu bahwa itu bisa dipakai sebagai URL lengkapSaya sempat berpikir untuk membuat sesuatu yang serupa yang seluruhnya masuk ke dalam QR code, tetapi menundanya karena keliru mengira perlu tautan HTTP(s). Video ini sangat menginspirasi saya: Can you fit a whole game into a QR code?(https://www.youtube.com/watch?v=ExwqNreocpg)
Namun demi kompatibilitas yang lebih luas, saya mengambil arah berlawanan dengan berbasis browser, dan saya juga mencantumkan atribusinya di repositori
Mungkin ini pertanyaan bodoh karena saya pemula teknis, tapi bukankah QR hanya mengenkode data?
Kalau data maksimum yang bisa ditampung QR sekitar 3 KB, itu kira-kira setara 3.000 karakter teks biasa. Jadi apakah pencapaiannya di sini adalah game mirip Doom ini berjalan sebagai kode yang dapat dieksekusi berukuran sebesar itu?
Dalam standar QR, makna dan tujuan encoding 8-bit tampak agak ambigu, tetapi interpretasi dasarnya adalah set karakter JIS8 dan Shift JIS; pada ECI lain, nilainya mewakili byte 8-bit secara langsung
Bagaimanapun, menyimpan data biner arbitrer di QR code itu mungkin, dan tool
qrencodemendukungnya secara defaultNamun banyak decoder berasumsi bahwa QR berisi teks, sehingga dukungannya rumit. Saya pernah mengirim patch decoding QR biner karena zbar merusak data dengan melewatkannya melalui
iconvAwalnya saya hanya ingin mencetak kunci privat RSA 4096-bit sebagai QR code, tetapi kemudian orang-orang mulai mengenkode video game ke QR juga, dan itu benar-benar keren
https://youtu.be/ExwqNreocpg
https://news.ycombinator.com/item?id=24287347
Saya memindainya dengan pemindai QR code bawaan iPhone, lalu muncul pesan “Tidak dapat menemukan data yang dapat digunakan”
data:Misalnya halaman web mandiri
Hi!bisa dienkode sebagaidata:text/html;base64,PGh0bWw+PGJvZHk+SGkhPC9ib2R5PjwvaHRtbD4=, dan jika ditempelkan ke browser,Hi!akan direnderNamun jika ini dijadikan QR code, dalam situasi tersebut tidak akan berjalan
Kebanyakan ponsel tidak bisa membaca QR code besar dengan baik, jadi perlu sesuatu seperti https://qrscanner.org/
Dan ini mungkin tidak akan berjalan di ponsel; karena batasan ukuran, saya tidak bisa memasukkan kompatibilitas itu juga
Saya sering memindai QR code yang ditempel di berbagai tempat untuk menghemat waktu mengetik URL, jadi cukup menakutkan jika hanya dengan memindai QR code saja bisa terjadi eksekusi kode arbitrer
Jika menambahkan
image-rendering: pixelatedpada CSS canvas, tampilannya mungkin akan menjadi nuansa piksel yang tajam dan tidak buramSaya berharap proyek berikutnya adalah LLM dalam bentuk QR code
Terkait: https://www.reddit.com/r/OpenAI/comments/138kbhs/someone_sho...
Bukan LLM, tetapi tetap chatbot yang cukup keren
https://github.com/Kuberwastaken/MiniLMs/tree/main/SYNEVA
Tautan trailer game mengarah ke Shorts berjudul “Fly me to the moon - 19 September 2024”
Sepertinya itu kesalahan
Saya sangat suka proyek game super kecil seperti ini
Ini mengingatkan saya pada .kkrieger
https://en.wikipedia.org/wiki/.kkrieger
Teruslah membuat hal-hal keren, kuberwastaken
Saya pernah membicarakan ide yang agak terkait dengan seorang teman
Saya penasaran apakah file STL untuk 3D printing bisa dienkode seluruhnya ke dalam QR code dan ditempelkan pada objek fisiknya, sehingga benda yang dibuat bisa dicetak ulang hanya dengan memindainya
Setelah saya cari tahu, datanya tampak terlalu banyak, dan saya bahkan sempat mencari QR code berwarna-warni, tetapi saya tidak tahu bahwa kita bisa membuat QR code yang lebih besar
Karena meja hanya membutuhkan pemotongan papan, saya mengenkode file 2D, tetapi bahkan untuk proof of concept pun saya harus memakai algoritme kompresi kustom
https://johnkestner.com/rev/