- The Backdooms เป็นเกม HTML แบบบีบอัดและแตกไฟล์เองที่สร้างฉากได้ไม่สิ้นสุด ได้แรงบันดาลใจจาก DOOM 1993 และ The Backrooms และรันจาก QR code ไปยังเบราว์เซอร์ได้โดยตรง
- ใช้วิธีใส่โค้ดทั้งหมดของเกมไว้ใน URL และตั้งเป้าให้เป็นโครงสร้างแบบ ออฟไลน์เต็มรูปแบบ ที่เล่นได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ตหลังสแกน
- กระบวนการบีบอัดคือบีบอัด HTML ด้วย Zlib แล้วเข้ารหัสเป็น Base64 จากนั้นใส่ไว้ใน JavaScript HTML wrapper และให้เบราว์เซอร์แตกไฟล์ด้วย API
DecompressionStream เพื่อรัน
- การสร้าง QR ใช้
qr.make(fit=True) เพื่อหา QR version ที่เล็กที่สุดเท่าที่เป็นไปได้ และจะล้มเหลวหากไม่พอดีภายในขีดจำกัดมาตรฐานคือ version 40 และ error correction level L
- การรองรับมือถือจำกัดเฉพาะเบราว์เซอร์มือถือรุ่นใหม่ที่รองรับ API
DecompressionStream โดย README ยกตัวอย่าง Edge, Yandex, Opera
The Backdooms ทำอะไร
- The Backdooms เป็นเกม HTML ที่ใส่เกมทั้งตัวไว้ใน QR code และรันในเว็บเบราว์เซอร์
- เกมได้แรงบันดาลใจจาก DOOM 1993 และ The Backrooms และถูกจัดทำในรูปแบบเว็บเพจแบบบีบอัดที่แตกไฟล์เอง
- เมื่อสแกน QR code จะรันในเบราว์เซอร์ได้ทันที โดยไม่ต้องดาวน์โหลดหรือติดตั้งเพิ่มเติม
- README ระบุว่าสามารถ สแกนเพื่อเล่น ได้
- GitHub Pages ยังมี เวอร์ชันที่บีบอัดน้อยลงเล็กน้อย ให้ใช้งานด้วย
วิธีบีบอัดที่ผลักดันขีดจำกัดพื้นที่จัดเก็บ
- เป้าหมายของโปรเจกต์คือผลักดันขีดจำกัดของ ความจุในการเก็บข้อมูลของ QR code และการบีบอัด พร้อมแสดงวิธีโฮสต์เว็บแอปพลิเคชันขนาดเบาไว้ใน QR code
- กระบวนการบีบอัดประกอบด้วยลำดับต่อไปนี้
- อ่าน HTML อินพุต
- บีบอัด HTML ด้วย Zlib
- เข้ารหัสข้อมูลที่บีบอัดแล้วเป็น Base64
- แทรกลงใน HTML wrapper ที่ใช้ JavaScript
- แปลง HTML ทั้งหมดเป็น Data URI รูปแบบ
data:text/html;base64,...
- ในเบราว์เซอร์จะใช้ API
DecompressionStream เพื่อแตกเนื้อหาที่บีบอัดแบบไดนามิกและรัน
- ในไดอะแกรมของ README มีขั้นตอน
DecompressionStream 'gzip' และขั้นตอน Format Mismatch รวมอยู่ในช่วงการประมวลผลของเบราว์เซอร์
ตรรกะการสร้าง QR code
- เครื่องมือสร้าง QR code มีขั้นตอนสำหรับเปลี่ยนเกมขนาดประมาณ 2.5kb ให้เป็น QR code
- ตัวอย่างการรันมีดังนี้
python3 QRGEN.py <your-game.html> <output-qrcode.png>
python3 QRGEN.py EVEN-SMALLER-SLAMMER-BACKROOMS.html qrcode.png
- ระหว่างสร้าง จะลองใช้
qr.make(fit=True) ก่อน เพื่อหา QR version ที่เล็กที่สุดซึ่งพอดีกับความยาวของเนื้อหา
- หาก version ที่ต้องใช้เกินขีดจำกัดมาตรฐาน QR code คือ 40 จะบังคับใช้ version 40 ด้วย
fit=False
- เพื่อใส่ข้อมูลให้ได้มากที่สุด จะใช้ error correction level ต่ำสุดคือ L
- หากข้อมูลยังใหญ่เกินไปแม้ใช้ version 40 และ level L การเข้ารหัส QR จะล้มเหลวและส่งคืนข้อผิดพลาด
การรันและความเข้ากันได้
- การเล่นต้องใช้เพียงเว็บเบราว์เซอร์รุ่นใหม่
- หลังสแกนแล้ว โค้ดทั้งหมดของเกมจะอยู่ใน URL จึงเล่นได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต
- บนมือถือจำเป็นต้องใช้เบราว์เซอร์รุ่นใหม่ที่รองรับ API
DecompressionStream
- README ยกตัวอย่าง Edge, Yandex, Opera
- การใช้งานทางเลือกที่ใช้ BigInt เพื่อให้ได้ QR code ที่เล็กลงอยู่ใน The BigInt Branch แต่ความเข้ากันได้กับเบราว์เซอร์มือถือมีข้อจำกัด
สภาพแวดล้อมการสร้างและไลเซนส์
- หากต้องการสร้าง QR code เอง ต้องมี dependency ต่อไปนี้
-
Python 3.7+
- ไลบรารี
qrcode
pillow สำหรับประมวลผลภาพ QR code
- คำสั่งติดตั้ง dependency มีดังนี้
pip install qrcode[pil]
- กระบวนการพัฒนาถูกสรุปไว้ใน [MindDump](https://kuberwastaken.github.io/blog/Projects/How-I-Managed-To-Get-Doom-In-A-QR-Code)
- โปรเจกต์เผยแพร่ภายใต้ **MIT License** จึงสามารถใช้ แก้ไข และแชร์ได้อย่างเสรี
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เพิ่งรู้จัก DecompressionStream เป็นครั้งแรก และได้ปรับแต่งส่วน HTML ให้ลดลงได้อีกไม่กี่ไบต์
ถ้าสนใจก็ส่ง PR ไว้ให้ดูแล้ว
ขอบคุณจริง ๆ นี่เป็นเรื่องดีที่สุดของเดือนนี้เลย
เป็นโปรเจกต์ที่เจ๋งมาก
เพิ่งได้รู้จัก
data:URL ด้วย ก่อนหน้านี้รู้และเคยใช้สคีมdata:URI อยู่แล้ว แต่ไม่รู้ว่าสามารถใช้เป็น URL แบบเต็ม ได้เคยคิดจะทำอะไรคล้าย ๆ กันที่ใส่ทั้งหมดไว้ใน QR code แต่เข้าใจผิดว่าต้องมีลิงก์ HTTP(s) เลยพักไว้ก่อน วิดีโอนี้ให้แรงบันดาลใจมาก: Can you fit a whole game into a QR code?(https://www.youtube.com/watch?v=ExwqNreocpg)
แต่เพื่อความเข้ากันได้ที่กว้างกว่า เลยไปในทิศทางตรงกันข้ามคือทำบนเบราว์เซอร์ และใส่เครดิตไว้ใน repository แล้ว
อาจเป็นคำถามโง่ ๆ เพราะผมยังเป็นมือใหม่ด้านเทคนิค แต่ QR ก็แค่เข้ารหัสข้อมูลไม่ใช่เหรอ?
ถ้าข้อมูลสูงสุดที่ QR เก็บได้อยู่ราว 3KB ก็น่าจะเท่ากับอักขระข้อความธรรมดาประมาณ 3,000 ตัว เลยสงสัยว่าความสำเร็จตรงนี้หมายถึงเกมคล้าย Doom นี้ทำงานได้ด้วย โค้ดที่รันได้จริง ในขนาดประมาณนั้นใช่ไหม
ความหมายและจุดประสงค์ของการเข้ารหัส 8 บิตในมาตรฐาน QR ดูจะคลุมเครืออยู่บ้าง แต่การตีความพื้นฐานคือชุดอักขระ JIS8 และ Shift JIS ส่วนใน ECI อื่น ๆ จะหมายถึงค่าไบต์ 8 บิตโดยตรง
ไม่ว่าอย่างไร การเก็บข้อมูลไบนารีใด ๆ ใน QR code ก็ทำได้ และเครื่องมือ
qrencodeรองรับสิ่งนี้เป็นค่าเริ่มต้นอย่างไรก็ตาม ตัวถอดรหัสมักสมมติว่าข้างใน QR เป็นข้อความ ทำให้การรองรับยุ่งยาก และผมเคยส่งแพตช์ถอดรหัส QR แบบไบนารีไป เพราะ zbar ทำข้อมูลพังจากการส่งผ่าน
iconvเดิมทีผมแค่อยากพิมพ์ คีย์ลับ RSA 4096 บิต เป็น QR code เท่านั้น แต่หลังจากนั้นผู้คนก็เริ่มเข้ารหัสวิดีโอเกมลง QR กันด้วย เจ๋งมากจริง ๆ
https://youtu.be/ExwqNreocpg
https://news.ycombinator.com/item?id=24287347
ลองสแกนด้วยตัวสแกน QR code พื้นฐานของ iPhone แล้วขึ้นว่า “ไม่พบข้อมูลที่ใช้งานได้”
data:URIตัวอย่างเช่น เว็บเพจแบบบรรจุในตัวเอง
Hi!สามารถเข้ารหัสเป็นdata:text/html;base64,PGh0bWw+PGJvZHk+SGkhPC9ib2R5PjwvaHRtbD4=และถ้าวางลงในเบราว์เซอร์ก็จะแสดงผลเป็นHi!แต่ถ้านำสิ่งนี้ไปทำเป็น QR code จะไม่ทำงานในสถานการณ์นั้น
โทรศัพท์ส่วนใหญ่สแกน QR code ขนาดใหญ่ได้ไม่ดีนัก เลยต้องใช้บริการอย่าง https://qrscanner.org/
และบนโทรศัพท์ก็คงไม่ทำงานอยู่ดี เพราะข้อจำกัดด้านขนาดทำให้ใส่ความเข้ากันได้ระดับนั้นเพิ่มไม่ได้
ผมมักสแกน QR code ที่ติดตามที่ต่าง ๆ เพื่อประหยัดเวลาในการพิมพ์ URL แต่ถ้าคิดว่าการสแกน QR code เพียงอย่างเดียวสามารถทำให้เกิด การรันโค้ดตามอำเภอใจ ได้ ก็น่ากลัวพอสมควร
ถ้าใส่
image-rendering: pixelatedใน CSS ของ canvas น่าจะดูเป็น พิกเซลคม ๆ ไม่เบลอโปรเจกต์ถัดไปอยากให้เป็น LLM ในรูป QR code
ที่เกี่ยวข้อง: https://www.reddit.com/r/OpenAI/comments/138kbhs/someone_sho...
ไม่ใช่ LLM แต่ก็เป็นแชตบอตที่ค่อนข้างเจ๋ง
https://github.com/Kuberwastaken/MiniLMs/tree/main/SYNEVA
ลิงก์เทรลเลอร์เกมพาไปที่ Shorts ชื่อ “Fly me to the moon - 19 September 2024”
น่าจะเป็นความผิดพลาด
ชอบ โปรเจกต์เกมขนาดจิ๋ว แบบนี้มาก
ทำให้นึกถึง .kkrieger
https://en.wikipedia.org/wiki/.kkrieger
หวังว่าจะทำของเจ๋ง ๆ ออกมาเรื่อย ๆ นะ kuberwastaken
เคยคุยไอเดียที่เกี่ยวข้องอยู่บ้างกับเพื่อน
สงสัยว่าถ้าเข้ารหัส ไฟล์ STL สำหรับพิมพ์ 3D ทั้งไฟล์ลงใน QR code แล้วแปะไว้บนชิ้นงานจริง จะทำให้แค่สแกนของที่ทำไว้แล้วพิมพ์ซ้ำได้หรือเปล่า
พอลองหาข้อมูลแล้วดูเหมือนข้อมูลจะเยอะเกินไป และถึงขั้นไปดู QR code แบบหลายสีด้วย แต่ไม่รู้เลยว่าสามารถทำ QR code ให้ใหญ่ขึ้นได้
โต๊ะต้องใช้แค่การตัดแผ่นวัสดุ เลยเข้ารหัสไฟล์ 2D แต่ถึงอย่างนั้น เพื่อพิสูจน์แนวคิดก็ยังต้องใช้ อัลกอริทึมบีบอัดแบบกำหนดเอง
https://johnkestner.com/rev/