2 คะแนน โดย GN⁺ 2024-04-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2024-04-22
ความคิดเห็นจาก 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
    • ถ้าทำงานวันละ 8 ชั่วโมงและเดินทางไปกลับ 1 ชั่วโมง ก็ยังเหลือ 15 ชั่วโมง
      ต้องกิน นอน อาบน้ำ และทำโน่นนี่ก็จริง แต่ถ้าไม่สนใจเรื่องพวกนั้น ก็ยังเหลือครบ 15 ชั่วโมง
      ใน 3 ปีก็มีเวลาพอให้ทำได้
      ตอนนี้คงต้องไปทำ raycaster สำหรับ 6502 ให้เสร็จต่อแล้ว
    • รู้สึกคุ้นเคยมาก
      เหมือนเป็น เวอร์ชันโปรแกรมเมอร์ ของการดูรูปบ้านสมบูรณ์แบบบน Instagram ของเพื่อน ๆ แล้วทำลายความมั่นใจตัวเอง
      คนส่วนใหญ่ก็คงรู้สึกแบบนั้นบ้างเป็นครั้งคราว และมีวิธีรับมืออยู่ แต่มันเป็นผลข้างเคียงที่ปกติมากเมื่ออยู่ท่ามกลางคนเก่ง ๆ
    • ทุกครั้งที่เห็นอะไรแบบนี้ ก็ทำให้นึกถึงสมัยที่ยังไม่มีลูก
  • กระแส “ยัด Doom ลงในอะไรสักอย่าง” ดูเหมือนใกล้ถึงขั้นสมบูรณ์แล้ว และตอนนี้คงถึงเวลาที่จะเริ่ม ยัดสิ่งของในชีวิตประจำวันลงใน Doom บ้าง
    ลองนึกถึง Todo list หรือปฏิทินใน Doom ดูสิ

    • พูดให้เคร่งครัด นั่นไม่ใช่ Todo list หรือปฏิทินใน Doom แต่เป็น Doom ที่รันอยู่ใน Todo list หรือปฏิทิน
      ฝั่งแอป Todo นั้นมี Doom ที่เรนเดอร์ด้วยเช็กบ็อกซ์อยู่แล้ว[1] ดังนั้นการเอามันไปรวมกับแอป Todo ก็ปล่อยให้เป็นแบบฝึกหัดสำหรับผู้อ่าน
      [1]: https://healeycodes.github.io/doom-checkboxes/
    • ถ้ารู้สึกว่ากระแส “ยัด Doom ลงในอะไรสักอย่าง” กำลังจะจบ แปลว่าคุณคงเพิ่งเข้ามาในโลกนี้
    • ตอนเห็น “นกเล่น DOOM” ก็คิดแบบเดียวกันเลย
  • ผมบังเอิญเห็นโปรเจกต์นี้เมื่อราวสัปดาห์ก่อนและเอามาโพสต์ที่นี่ แต่ไม่มีปฏิกิริยาอะไร
    ตอนนี้เห็นมันขึ้น หน้าแรก แล้วก็ดีใจ และชอบที่มีโปรเจกต์แฮ็ก ๆ เพื่อความสนุกแบบนี้ขึ้นมา

  • เป็นการแฮ็กที่ยอดเยี่ยม
    เห็นว่า จิตวิญญาณแฮ็กเกอร์ ยังมีชีวิตอยู่แล้วรู้สึกดี

  • บางครั้งผู้คนก็พาเทคโนโลยีไปไกลเกินไป แต่ครั้งนี้ไม่ใช่กรณีนั้น

  • นึกถึง Bad Apple ที่รันใน Windows Task Manager
    https://youtu.be/sBeI30ccb6g

  • เป็นความบ้าคลั่งที่บริสุทธิ์และยอดเยี่ยม A+

  • จินตนาการไม่ออกเลยว่าต่อไปเกมนี้จะไปรันอยู่ที่ไหนอีก