- doom-htop เป็นโปรเจกต์ทดลองที่ใช้รายการโปรเซสของ
htop เสมือนเป็นเอาต์พุตกราฟิก เพื่อแสดงภาพเกมตระกูล Doom ในรูปแบบ ASCII
- การรันต้องใช้ไฟล์ข้อมูลเกมแบบ WAD โดยในที่เก็บมี freedoom1.wad รวมมาให้ และแนะนำให้ดาวน์โหลด classic shareware
DOOM1.wad แยกต่างหาก
- วิธีทำงานคือโปรเซส Doom จะสร้างโปรเซสลูกตามจำนวนบรรทัดของหน้าจอ และแต่ละโปรเซสจะเขียนหนึ่งบรรทัดที่รับมาจากหน่วยความจำที่ใช้ร่วมกันลงใน argv[0] ของตัวเอง เพื่อประกอบเป็นเฟรมในพื้นที่ชื่อโปรเซสของ
htop
- ต้องตั้งค่า
htop ให้รีเฟรชชื่อโปรเซสทุกครั้ง โดยใช้ -d 1 เพื่อเล็งการรีเฟรชประมาณ 10 FPS และใช้ -s M_VIRT เพื่อจัดเรียงตามหน่วยความจำเสมือน
- การรับคีย์บอร์ดอินพุตใช้วิธีแบบ keylogger อย่างง่ายที่เปิดอุปกรณ์คีย์บอร์ดโดยตรง จึงอาจต้องใช้
sudo และมีการทดสอบเฉพาะบน Ubuntu 22.04 ส่วน WSL และ Arch ต้องปรับพาธอุปกรณ์
เป้าหมายของโปรเจกต์และรูปแบบการรัน
- doom-htop เป็นโปรเจกต์ที่สร้างขึ้นเพื่อดูว่า
htop สามารถใช้เรนเดอร์กราฟิกของวิดีโอเกมคลาสสิกได้หรือไม่
- หน้าจอที่ได้คือการแสดง Doom เป็นภาพ ASCII บนรายการโปรเซสของ
htop
- โปรเจกต์นี้ fork มาจาก ozkl/doomgeneric โดยงานหนักที่เกี่ยวกับการรัน Doom นั้นเป็นหน้าที่ของโปรเจกต์ดังกล่าว
การบิลด์และข้อมูลเกมที่ต้องใช้
- การบิลด์ทำในไดเรกทอรี
doomgeneric ด้วย make -j8
cd doomgeneric
make -j8
- หากต้องการรัน จำเป็นต้องมี ไฟล์ข้อมูลเกมแบบ WAD
- ในที่เก็บมี
freedoom1.wad รวมมาให้ โดยเครดิตอยู่ที่ The Freedoom project
- เวอร์ชัน classic free shareware
DOOM1.wad สามารถดาวน์โหลดได้จาก Doom Wiki
- ไม่ได้รวม
DOOM1.wad ไว้ เพราะผู้พัฒนาไม่มั่นใจว่าอัปขึ้น GitHub จะไม่มีปัญหาทางกฎหมาย
วิธีรันและการตั้งค่า htop
- มีคำแนะนำให้บันทึกงานสำคัญก่อนรัน โดยสภาพแวดล้อมที่ใช้ทดสอบคือ Lenovo ThinkPad T430s อายุ 12 ปี, RAM 8GB, Intel Core i7-3520M @ 2.90GHz, Ubuntu 22.04 และทำงานได้ตามปกติ
- คำสั่งรันพื้นฐานมีดังนี้
sed -i 's/update_process_names=0/update_process_names=1/' ~/.config/htop/htoprc
sudo ./doom-htop -iwad freedoom1.wad
htop -d 1 -s M_VIRT
- จะรัน
doom-htop หรือ htop ก่อนก็ได้
sudo จำเป็นเฉพาะสำหรับการเปิดอุปกรณ์คีย์บอร์ด
- หากรันโดยไม่ใช้
sudo อาจป้อนอินพุตไม่ได้ แต่ยังดูภาพได้
htop -d 1 เป็นการตั้งค่าเพื่อเล็งรีเฟรชที่ 10 FPS
htop -s M_VIRT เป็นการตั้งค่าเพื่อจัดเรียงโปรเซสตามปริมาณหน่วยความจำเสมือนที่จองไว้ เพื่อให้โปรเซสที่เกี่ยวข้องถูกจัดกลุ่มและดูได้ง่าย
- หากการจัดเรียงไม่ตรงดี สามารถปรับค่า
PROCS_MALLOC_SIZE ใน main.c ได้
- คำสั่ง
sed จำเป็นเพราะโดยปกติ htop จะไม่อัปเดตชื่อโปรเซสทุกครั้ง
กลไกการทำงานภายใน
- ที่เก็บนี้เพิ่มไฟล์หลักเข้าไปใน
doomgeneric เดิมอยู่ 3 ไฟล์
main.c
keylogger.c
ascii_stuff.c
- ใน
ascii_stuff.c มีชุดคำสั่ง if ยาว ๆ ที่สร้างโดย ตัวแปลงภาพเป็น ASCII แบบง่าย
- โปรเซส Doom หลักจะสร้างโปรเซสด้วย
fork ตามจำนวนบรรทัดของภาพที่แปลงเป็น ASCII
- โปรเซสหลักจะสร้าง เซกเมนต์หน่วยความจำที่ใช้ร่วมกัน กับโปรเซสลูกแต่ละตัว แล้วคัดลอกแต่ละบรรทัดของภาพลงในเซกเมนต์หน่วยความจำของโปรเซสที่ตรงกัน
- โปรเซสลูกแต่ละตัวจะคัดลอกข้อมูลจากเซกเมนต์ของตัวเองแล้วเขียนทับ
argv[0]
- จากนั้น
htop จะอัปเดตค่า argv[0] ที่แสดงเป็นชื่อโปรเซส ทำให้เกิดภาพทีละบรรทัดบนหน้าจอ
แนวคิดการจัดเรียงและการจัดการอินพุต
- ไอเดียแรกคือจัดเรียงตามการใช้ CPU และพยายามสร้างโปรเซสที่ใช้ CPU ตามสัดส่วนที่กำหนด แต่ทำได้ยาก
- มีการพิจารณาค่า
nice ของ Linux ด้วย แต่ค่าที่ผู้ใช้ทั่วไปตั้งได้มีเพียง 19 ระดับ จึงมองว่าไม่พอสำหรับกราฟิกที่ดีกว่า
- สุดท้ายจึงเลือกใช้ ปริมาณหน่วยความจำเสมือนที่จองไว้ เพราะมองว่าสามารถปรับได้ค่อนข้างละเอียดในระดับต่อโปรเซส
- แม้โปรเซสที่ fork ออกมาทั้งหมดจะจองหน่วยความจำเท่ากัน แต่ในระบบที่ใช้ทดสอบ
htop ก็ยังแสดงเฟรมในลำดับที่ถูกต้อง
- มีการคาดว่าในกรณีที่ค่าเท่ากันอาจจัดเรียงตามเวลาที่สร้าง
- อย่างไรก็ตาม ผู้พัฒนาไม่มั่นใจว่าจะทำงานอย่างไรบนระบบอื่น จึงไม่ได้พึ่งพาค่าที่เท่ากันนั้น
- อินพุตจากคีย์ถูกจัดการด้วย keylogger แบบง่ายที่เปิดอุปกรณ์คีย์บอร์ดโดยตรง
- ด้วยวิธีนี้ เกมจะยังรันต่อในเบื้องหลังได้แม้ไม่ได้เปิด
htop
แพลตฟอร์มและการแก้ปัญหา
- มีการทดสอบบน Ubuntu 22.04 เท่านั้น
- บน WSL และ Arch ชื่ออุปกรณ์คีย์บอร์ดต่างกัน จึงต้องพอร์ตหรือปรับแก้
- หากคีย์บอร์ดไม่ทำงาน ควรตรวจสอบค่า
#define KEYBOARD_DEVICE ใน main.c
- มีคำแนะนำให้ดูที่
/dev/input/by-path แล้วเลือกอุปกรณ์ที่มี kbd อยู่ในชื่อ
- หากภาพค้าง อาจเป็นเพราะคำสั่ง
sed ยังไม่ถูกนำไปใช้
- สามารถตั้งค่าด้วยตนเองใน
htop ผ่าน F2 → “Display options” → “Update process names on every refresh”
- ข้อผิดพลาดว่าไม่มี
~/.config/htop/htoprc อาจเกิดขึ้นเมื่อยังไม่เคยรัน htop
- ให้เปิด
htop หนึ่งครั้งแล้วปิด จากนั้นค่อยรันคำสั่ง sed อีกครั้ง
- หากโปรเซส Doom หลักแครชแล้วเหลือโปรเซสซอมบี้จำนวนมาก สามารถล้างได้ด้วยคำสั่งต่อไปนี้
sudo pkill doom-htop
งานที่ยังเหลือและไลเซนส์
htop จะเลื่อนหน้าจอเมื่อใช้ปุ่มลูกศร ซึ่งอาจรบกวนการควบคุมเกม
- มีการเสนอวิธีแก้ชั่วคราวแบบง่าย ๆ คือกด
a หลังเริ่มเกม เพื่อย้ายโฟกัสไปที่เมนูเลือกโปรเซสเซอร์
- เหตุผลที่สร้างคือ funny
- Freedoom แจกจ่ายภายใต้ไลเซนส์คล้าย BSD ที่อยู่ใน
freedoom-license.txt ในไดเรกทอรีหลัก
- ส่วนโค้ดที่เหลือระบุว่าน่าจะเป็น GPL
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
พอลองคิดดูแล้ว การ เรนเดอร์ “วิดีโอ” เป็น ASCII แล้วใส่ลงในชื่อโปรเซสดูเหมือนจะค่อนข้างง่ายอยู่เหมือนกัน
คล้าย ๆ กับโปรเจกต์ของเล่นที่รันบน DNS และใน README ก็ระบุว่างานส่วนใหญ่เป็นผลงานของโปรเจกต์อื่น จึงอาจดูไม่ได้พิเศษนัก
แต่อีกมุมหนึ่ง ผมคงไม่เคยคิดเลยว่าจะมอง htop เป็น เรนเดอริงเอนจิน สำหรับอะไรบางอย่างได้ นี่จึงเป็นการแฮ็กซอฟต์แวร์ที่น่าทึ่งและน่าประทับใจจริง ๆ
แค่ดู libaa หรือ libcaca ก็มีตัวอย่างที่ใช้เวลาหลายร้อยชั่วโมงกับเรื่องนี้แล้ว
เหมือน PSDoom[1] แบบกลับด้านสินะ
งานที่ส่งมานี้คือการเล่น Doom ด้วยตัวจัดการโปรเซส ส่วน PSDoom คือการจัดการโปรเซสด้วย Doom
[1]: https://psdoom.sourceforge.net
มีวิดีโอที่พอร์ตให้รันบน Linux ปัจจุบันด้วย: https://youtu.be/Pf7rpde49NU
แต่อยากให้มันมีประโยชน์จริงมากขึ้นหน่อยในฐานะตัวแทน top ขนาดของมอนสเตอร์อิงตามการใช้หน่วยความจำ ความดุดันอิงตามการใช้ CPU ห้องแบ่งตามผู้ใช้ และทำให้เห็นความสัมพันธ์ของเธรดกับโปรเซสพ่อ/ลูกได้ด้วย
โปรเซสที่หลับอยู่ก็แน่นอนว่าควรหลับ ส่วนโปรเซสซอมบี้อาจถูกแช่แข็งอยู่ในพื้นที่ หรือโปร่งใสจนเดินทะลุได้ อาวุธก็ผูกกับสัญญาณ kill ได้
ยังมีอะไรให้เพิ่มได้อีกเยอะ แต่ถ้าเป็นอย่างนั้นก็จะค่อย ๆ ห่างจาก Doom ไปเรื่อย ๆ
rm -rfคงสนุกดีสงสัยจริง ๆ ว่าเขาหาเวลาทำอะไรแบบนี้ได้อย่างไร
ยิ่งเห็นอะไรเจ๋ง ๆ แบบนี้ ความมั่นใจในความสามารถของตัวเองก็ยิ่งลดลงเรื่อย ๆ
มีคนบอกว่าเป็นการใช้ผลงานก่อนหน้าแล้วเรนเดอร์ใหม่เป็น ASCII และแมปกับโปรเซส แต่ถึงอย่างนั้นก็ไม่ใช่งานน้อยเลย
อยากรู้ว่าใช้เวลานานแค่ไหน และแม้อยู่ในวงการนี้มานานพอสมควรแล้วก็ยังรู้สึกเหมือนไม่รู้อะไรเลย มันเจ๋งมาก แต่ทำให้รู้สึกว่าตัวเองโง่มาก ๆ
มีโอกาสสูงว่าคุณรู้มากกว่าที่ตัวเองคิดเยอะ
งานนี้ทำขึ้นจากการลงมือทำ ตลอดสุดสัปดาห์ บวกอีกประมาณหนึ่งวัน และค่อย ๆ ทำเพิ่มอีกไม่กี่วันตอนมีเวลา
อย่างที่เขียนไว้ในคอมเมนต์สักที่และใน README งานยากในการทำให้ Doom พอร์ตได้ง่ายขึ้นนั้นทำไว้แล้วโดยโปรเจกต์ doom-generic ที่ fork มา: https://github.com/ozkl/doomgeneric
ต้องกิน นอน อาบน้ำ และทำโน่นนี่ก็จริง แต่ถ้าไม่สนใจเรื่องพวกนั้น ก็ยังเหลือครบ 15 ชั่วโมง
ใน 3 ปีก็มีเวลาพอให้ทำได้
ตอนนี้คงต้องไปทำ raycaster สำหรับ 6502 ให้เสร็จต่อแล้ว
เหมือนเป็น เวอร์ชันโปรแกรมเมอร์ ของการดูรูปบ้านสมบูรณ์แบบบน Instagram ของเพื่อน ๆ แล้วทำลายความมั่นใจตัวเอง
คนส่วนใหญ่ก็คงรู้สึกแบบนั้นบ้างเป็นครั้งคราว และมีวิธีรับมืออยู่ แต่มันเป็นผลข้างเคียงที่ปกติมากเมื่ออยู่ท่ามกลางคนเก่ง ๆ
กระแส “ยัด Doom ลงในอะไรสักอย่าง” ดูเหมือนใกล้ถึงขั้นสมบูรณ์แล้ว และตอนนี้คงถึงเวลาที่จะเริ่ม ยัดสิ่งของในชีวิตประจำวันลงใน Doom บ้าง
ลองนึกถึง Todo list หรือปฏิทินใน Doom ดูสิ
ฝั่งแอป Todo นั้นมี Doom ที่เรนเดอร์ด้วยเช็กบ็อกซ์อยู่แล้ว[1] ดังนั้นการเอามันไปรวมกับแอป Todo ก็ปล่อยให้เป็นแบบฝึกหัดสำหรับผู้อ่าน
[1]: https://healeycodes.github.io/doom-checkboxes/
ผมบังเอิญเห็นโปรเจกต์นี้เมื่อราวสัปดาห์ก่อนและเอามาโพสต์ที่นี่ แต่ไม่มีปฏิกิริยาอะไร
ตอนนี้เห็นมันขึ้น หน้าแรก แล้วก็ดีใจ และชอบที่มีโปรเจกต์แฮ็ก ๆ เพื่อความสนุกแบบนี้ขึ้นมา
เป็นการแฮ็กที่ยอดเยี่ยม
เห็นว่า จิตวิญญาณแฮ็กเกอร์ ยังมีชีวิตอยู่แล้วรู้สึกดี
บางครั้งผู้คนก็พาเทคโนโลยีไปไกลเกินไป แต่ครั้งนี้ไม่ใช่กรณีนั้น
นึกถึง Bad Apple ที่รันใน Windows Task Manager
https://youtu.be/sBeI30ccb6g
เป็นความบ้าคลั่งที่บริสุทธิ์และยอดเยี่ยม A+
จินตนาการไม่ออกเลยว่าต่อไปเกมนี้จะไปรันอยู่ที่ไหนอีก