1 puan yazan GN⁺ 2025-04-19 | 1 yorum | WhatsApp'ta paylaş
  • 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

 
GN⁺ 2025-04-19
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.

    • Bu sayede açılan alanla dokunmatik ekran desteği, daha iyi hareket, düşman oluşturma ve hasar işlemeyi bile ekleyebildim.
      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)

    • O videoyu da lockdown döneminde izlemiş ve ondan ilham almıştım; gerçekten harikaydı.
      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 kodlarında sayısal, alfasayısal, 8-bit, Kanji gibi çeşitli kodlama modları var; en yaygını alfasayısal kodlama, en yoğun olanı ise ikili veriyi olduğu gibi saklayan 8-bit kodlama.
      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 qrencode aracı 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.

    • Bu QR kodunun boyutu ya da uzunluğuyla ilgili değil; iPhone’un yerleşik tarayıcısının 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ız Hi! render edilir.
      Ama bunu QR kodu yaparsanız bu durumda çalışmaz.
    • Kontrol ettiğin için teşekkürler.
      Ç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.
    • iPhone’da çalışmaması beni biraz rahatlattı doğrusu.
      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: pixelated eklersen bulanık görünmek yerine net piksel havasında görünebilir.

    • Denedim ama şu anki görünüm daha eğlenceli ve retro hissettirdiği için onu daha çok sevdim.
  • 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...

  • 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ş.

    • Artık düzelmiş olmalı.
  • Bu tür ultra küçük oyun projelerini gerçekten seviyorum.
    .kkrieger’ı hatırlatıyor.
    https://en.wikipedia.org/wiki/.kkrieger

    • LinkedIn’de paylaştığımda biri bana bundan bahsetmişti; gerçekten çok etkileyiciydi.
  • Harika şeyler yapmaya devam etmeni umuyorum, kuberwastaken.

    • Elimden geleni yapacağım.
  • 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.

    • Eskiden tasarım keşfi amacıyla masalar üzerinde benzer bir şey denemiştim.
      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/