- The Backdooms, DOOM 1993 ve The Backrooms'tan ilham alan, sıkıştırılmış, kendinden açılan ve sonsuz üretimli bir HTML oyunudur; QR kodundan doğrudan tarayıcıda çalışır
- Oyunun tüm kodu URL içine gömülür ve taramadan sonra internet bağlantısı olmadan oynanabilen tamamen çevrimdışı bir yapıyı hedefler
- Sıkıştırma akışı, HTML'yi Zlib ile sıkıştırıp Base64 ile kodladıktan sonra JavaScript tabanlı bir HTML sarmalayıcıya yerleştirme ve tarayıcıda
DecompressionStream API'siyle açıp çalıştırma şeklindedir
- QR üretimi,
qr.make(fit=True) ile mümkün olan en küçük QR sürümünü bulur; standart sınır olan sürüm 40 ve hata düzeltme seviyesi L içine sığmazsa başarısız olur
- Mobil destek,
DecompressionStream API'sini destekleyen modern mobil tarayıcılarla sınırlıdır; README'de Edge, Yandex ve Opera örnek olarak verilir
The Backdooms ne yapıyor?
- The Backdooms, tüm oyunu bir QR kodun içine yerleştirip web tarayıcısında çalıştıran bir HTML oyunudur
- Oyun, DOOM 1993 ve The Backrooms'tan ilham almıştır ve sıkıştırılmış, kendinden açılan bir web sayfası olarak yapılandırılmıştır
- QR kod tarandığında doğrudan tarayıcıda çalışır; ek indirme veya kurulum gerekmez
- README'de tarayıp oynayabileceğiniz belirtilir
- GitHub Pages üzerinde biraz daha az sıkıştırılmış bir sürüm de sunulmaktadır
Depolama sınırlarını zorlayan sıkıştırma yöntemi
- Projenin amacı, QR kod depolama kapasitesi ile sıkıştırma sınırlarını zorlamak ve hafif web uygulamalarının QR kod içinde nasıl barındırılabileceğini göstermektir
- Sıkıştırma akışı şu sırayla ilerler
- Girdi HTML'si okunur
- HTML, Zlib ile sıkıştırılır
- Sıkıştırılmış veri Base64 ile kodlanır
- JavaScript tabanlı HTML sarmalayıcıya eklenir
- Tüm HTML,
data:text/html;base64,... biçiminde bir Data URI'ye dönüştürülür
- Tarayıcıda,
DecompressionStream API'si kullanılarak sıkıştırılmış içerik dinamik olarak açılır ve çalıştırılır
- README'deki diyagramda, tarayıcı işleme aşamalarında
DecompressionStream 'gzip' ve Format Mismatch adımı da yer alır
QR kod üretim mantığı
- QR kod üretim aracı, yaklaşık 2.5kb boyutundaki bir oyunu QR koda dönüştürmek için bir akış sunar
- Çalıştırma örnekleri şöyledir
python3 QRGEN.py <your-game.html> <output-qrcode.png>
python3 QRGEN.py EVEN-SMALLER-SLAMMER-BACKROOMS.html qrcode.png
- Üretim süreci,
qr.make(fit=True) ile önce içerik uzunluğuna uygun en küçük QR sürümünü denemeye çalışır
- Gerekli sürüm, QR kod standardının sınırı olan 40'ı aşarsa
fit=False ile sürüm 40 zorlanır
- Azami veri sığdırmak için hata düzeltme seviyesi en düşük seviye olan L kullanılır
- Sürüm 40 ve seviye L ile bile veri fazla büyükse QR kodlama başarısız olur ve hata döndürür
Çalıştırma ve uyumluluk
- Oynamak için yalnızca modern bir web tarayıcısı gerekir
- Taramadan sonra oyunun tüm kodu URL içinde bulunduğundan internet bağlantısı olmadan oynanabilir
- Mobilde,
DecompressionStream API'sini destekleyen güncel tarayıcılar gerekir
- README'de Edge, Yandex ve Opera örnek olarak listelenir
- Daha küçük QR kodları için BigInt tabanlı alternatif uygulama The BigInt Branch altında bulunur, ancak mobil tarayıcı uyumluluğu sınırlıdır
Üretim ortamı ve lisans
- QR kodlarını doğrudan üretmek için şu bağımlılıklar gerekir
-
Python 3.7+
qrcode kütüphanesi
- QR kod görsel işleme için
pillow
- Bağımlılıkları kurma komutu şöyledir
pip install qrcode[pil]
- Geliştirme süreci [MindDump](https://kuberwastaken.github.io/blog/Projects/How-I-Managed-To-Get-Doom-In-A-QR-Code) içinde derlenmiştir
- Proje **MIT License** ile yayımlanmıştır; serbestçe kullanılabilir, değiştirilebilir ve paylaşılabilir
1 yorum
Hacker News yorumları
DecompressionStream’i ilk kez öğrendim ve HTML kısmını elden geçirip birkaç bayt daha küçülttüm.
İlgilenirseniz diye bir PR da açtım.
Gerçekten çok teşekkürler; bu ay başıma gelen en iyi şey oldu.
Gerçekten harika bir proje.
data:URL’lerini de yeni öğrendim;data:URI şemasını biliyor ve kullanmıştım ama tam bir URL olarak kullanılabildiğini bilmiyordum.Tamamı QR kodun içine sığan benzer bir şey yapmayı düşünmüştüm, ama HTTP(s) bağlantısı gerektiğini sanıp ertelemiştim; şu video bana çok ilham verdi: Can you fit a whole game into a QR code?(https://www.youtube.com/watch?v=ExwqNreocpg)
Yalnızca daha geniş uyumluluk için ters yönde, tarayıcı tabanlı bir yol izledim ve depoda da kaynağı belirttim.
Teknoloji konusunda acemiyim; aptalca bir soru olabilir ama QR zaten sadece veriyi kodlamıyor mu?
QR’ın taşıyabileceği azami veri yaklaşık 3 KB ise bu düz metinde yaklaşık 3000 karaktere denk gelir; buradaki başarı, Doom benzeri bu oyunun bu boyutta çalıştırılabilir kod olarak çalışması mı, merak ediyorum.
QR standardında 8-bit kodlamanın anlamı ve amacı biraz muğlak görünüyor, ancak temel yorum JIS8 ve Shift JIS karakter kümeleri; diğer ECI’lerde ise 8-bit bayt değerlerini doğrudan temsil ediyor.
Her hâlükârda QR kodunda keyfi ikili veri saklamak mümkün ve
qrencodearacı bunu varsayılan olarak destekliyor.Ne var ki çözücüler çoğu zaman QR’ın içinde metin olduğunu varsaydığından destek zahmetli oluyor; zbar’ın veriyi
iconvden geçirip bozması nedeniyle ikili QR çözme için bir yama göndermiştim.Aslında tek istediğim 4096 bit RSA gizli anahtarını QR kodu olarak yazdırmaktı; sonrasında insanlar video oyunlarını da QR’a kodlamaya başladı ve bu gerçekten harika.
https://youtu.be/ExwqNreocpg
https://news.ycombinator.com/item?id=24287347
iPhone’un yerleşik QR kod tarayıcısıyla taradığımda “kullanılabilir veri bulunamadı” dedi.
data:URI URL’lerini desteklememesinden kaynaklanıyor.Örneğin kendi kendine yeten
Hi!web sayfasıdata:text/html;base64,PGh0bWw+PGJvZHk+SGkhPC9ib2R5PjwvaHRtbD4=olarak kodlanabilir ve tarayıcıya yapıştırırsanızHi!render edilir.Ama bunu QR kodu yaparsanız bu durumda çalışmaz.
Çoğu telefon büyük QR kodlarını iyi okuyamadığı için https://qrscanner.org/ gibi bir şeye ihtiyaç oluyor.
Ayrıca telefonda çalışmayacaktır; boyut sınırı nedeniyle o uyumluluğu da ekleyemedim.
URL yazma süresinden tasarruf etmek için etrafa yapıştırılmış QR kodlarını sık sık tarıyorum; sırf QR kodu taramakla keyfi kod çalıştırmanın mümkün olduğunu düşünmek epey ürkütücü.
Canvas CSS’ine
image-rendering: pixelatedeklersen bulanık görünmek yerine net piksel havasında görünebilir.Bir sonraki proje QR koddan oluşan bir LLM olsa güzel olur.
İlgili olarak: https://www.reddit.com/r/OpenAI/comments/138kbhs/someone_sho...
LLM değil ama yine de epey havalı bir sohbet botu.
https://github.com/Kuberwastaken/MiniLMs/tree/main/SYNEVA
Oyun fragmanı bağlantısı “Fly me to the moon - 19 September 2024” adlı bir Shorts’a gidiyor.
Sanırım yanlışlık olmuş.
Bu tür ultra küçük oyun projelerini gerçekten seviyorum.
.kkrieger’ı hatırlatıyor.
https://en.wikipedia.org/wiki/.kkrieger
Harika şeyler yapmaya devam etmeni umuyorum, kuberwastaken.
Bir arkadaşımla bir ölçüde ilgili bir fikir konuşmuştuk.
3D baskı için STL dosyasını bütünüyle QR koduna kodlayıp gerçek çıktının üzerine yapıştırırsak, yapılan nesneyi sadece tarayıp yeniden basmak mümkün olur mu diye merak etmiştim.
Araştırınca veri miktarı çok fazla görünmüştü; çok renkli QR kodlarına kadar bakmıştım ama sadece daha büyük QR kodları yapılabildiğini bilmiyordum.
Masalar yalnızca plaka kesimi gerektirdiği için 2D dosya kodlamıştım, buna rağmen kavram kanıtı için özel bir sıkıştırma algoritması bile kullanmam gerekmişti.
https://johnkestner.com/rev/