2 puan yazan GN⁺ 2024-04-22 | 1 yorum | WhatsApp'ta paylaş
  • doom-htop, htop süreç listesini grafik çıktısı gibi kullanarak Doom tarzı oyun ekranını ASCII biçiminde gösteren deneysel bir projedir
  • Çalıştırmak için bir WAD oyun veri dosyası gerekir; depoda freedoom1.wad yer alır ve klasik shareware DOOM1.wad için ayrı indirme bağlantısı verilir
  • Çalışma mantığı, Doom sürecinin ekran satırı sayısı kadar alt süreç oluşturması ve her sürecin paylaşılan bellekten aldığı bir satırı kendi argv[0] alanına yazarak htop içindeki süreç adı bölümünde kareyi oluşturmasına dayanır
  • htop süreç adlarını her yenilemede güncelleyecek şekilde ayarlanmalıdır; -d 1 ile yaklaşık 10 FPS yenileme hedeflenir ve -s M_VIRT ile sanal bellek ölçütüne göre sıralama kullanılır
  • Klavye girdisi, klavye aygıtını açan basit bir keylogger yöntemiyle alındığı için sudo gerekebilir; yalnızca Ubuntu 22.04 üzerinde test edilmiştir ve WSL ile Arch için aygıt yolunun uyarlanması gerekir

Projenin amacı ve çalışma biçimi

  • doom-htop, htopun klasik video oyunu grafikleri çizmek için kullanılıp kullanılamayacağını görmek amacıyla yapılmış bir projedir
  • Ortaya çıkan görüntü, Doom'u htop süreç listesinin üzerinde ASCII video gibi göstermektedir
  • Proje, ozkl/doomgeneric'in bir fork'udur ve Doom'u çalıştırmaya ilişkin ağır işleri bu proje üstlenir

Derleme ve gerekli oyun verisi

  • Derleme, doomgeneric dizininde make -j8 ile yapılır
cd doomgeneric
make -j8
  • Çalıştırmak için bir WAD oyun veri dosyası gerekir
    • Depoda freedoom1.wad yer alır; teşekkür bilgileri The Freedoom project sayfasındadır
    • Klasik ücretsiz shareware sürümü DOOM1.wad, Doom Wiki üzerinden indirilebilir
    • DOOM1.wad dosyasını GitHub'a koymanın hukuken sorun çıkarıp çıkarmayacağından emin olunmadığı için depoya eklenmemiştir

Çalıştırma yöntemi ve htop ayarları

  • Çalıştırmadan önce önemli işlerin kaydedilmesi önerilir; test ortamı 12 yıllık bir Lenovo ThinkPad T430s, 8GB RAM, Intel Core i7-3520M @ 2.90GHz ve Ubuntu 22.04 idi, burada düzgün çalıştı
  • Temel çalıştırma komutu şöyledir
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
  • Önce doom-htop ya da htop çalıştırılmış olması fark etmez
  • sudo, yalnızca klavye aygıtını açmak için gereklidir
    • sudo olmadan çalıştırılırsa giriş yapmak zorlaşır ama görüntü yine izlenebilir
  • htop -d 1, 10 FPS civarında yenileme hedefleyen ayardır
  • htop -s M_VIRT, ilgili süreçlerin daha düzenli gruplanması için süreçleri sanal bellek tahsisine göre sıralar
  • Sıralama iyi oturmuyorsa main.c içindeki PROCS_MALLOC_SIZE değeri ayarlanabilir
  • sed komutu gereklidir çünkü htop varsayılan olarak süreç adlarını her yenilemede güncellemez

İç çalışma mantığı

  • Depo, mevcut doomgeneric üzerine ağırlıklı olarak üç dosya ekler
    • main.c
    • keylogger.c
    • ascii_stuff.c
  • ascii_stuff.c, basit bir image-to-ASCII dönüştürücü tarafından üretilmiş uzun bir if zinciri içerir
  • Ana Doom süreci, ASCII'ye çevrilmiş görüntünün satır sayısı kadar süreci fork ile oluşturur
  • Ana süreç, her alt süreç için bir paylaşılan bellek segmenti oluşturur ve görüntünün ilgili satırını o sürecin bellek segmentine kopyalar
  • Her alt süreç, kendi segmentindeki içeriği kopyalayıp argv[0] üzerine yazar
  • htop, süreç adı olarak gösterilen argv[0] değerini güncelleyerek ekranın her satırını göstermiş olur

Sıralama fikri ve giriş işleme

  • İlk fikir CPU kullanımına göre sıralamaydı ve belirli CPU kullanım oranı tüketen süreçler oluşturulmak istendi, ancak bunu uygulamak zor oldu
  • Linux nice değeri de düşünüldü, fakat normal kullanıcılar için mümkün olan değer sayısı yalnızca 19 olduğundan daha iyi grafikler için yetersiz görüldü
  • Sonunda sanal bellek tahsisi kullanıldı; bunun süreç bazında oldukça ayrıntılı ayarlanabildiği düşünüldü
  • Tüm fork süreçleri aynı miktarda bellek ayırsa da test sisteminde htop kareleri doğru sırayla gösterdi
    • Eşitlik durumunda oluşturulma zamanına göre sıralanıyor olabileceği tahmin ediliyor
    • Ancak bunun başka sistemlerde nasıl davranacağından emin olunmadığı için aynı değere güvenilmiyor
  • Tuş girdisi, klavye aygıtını açan basit bir keylogger ile işlenir
    • Bu sayede htop açık olmasa bile oyun arka planda çalışmaya devam eder

Platform ve sorun giderme

  • Testler yalnızca Ubuntu 22.04 üzerinde yapıldı
  • WSL ve Arch üzerinde klavye aygıtı adı farklıdır; uyarlama gerekir
  • Klavye çalışmıyorsa main.c içindeki #define KEYBOARD_DEVICE değeri kontrol edilmelidir
    • /dev/input/by-path altında kbd içeren girdiyi bulup seçme yöntemi önerilir
  • Kare donmuş görünüyorsa sed komutu uygulanmamış olabilir
    • htop içinde F2 → “Display options” → “Update process names on every refresh” işaretlenerek elle ayarlanabilir
  • ~/.config/htop/htoprc bulunamadı hatası, htop hiç çalıştırılmadığında ortaya çıkabilir
    • htop bir kez açılıp kapatıldıktan sonra sed komutu yeniden çalıştırılabilir
  • Ana Doom süreci çöker ve geride çok sayıda zombi süreç kalırsa, şu komutla temizlenebilir
sudo pkill doom-htop

Kalan işler ve lisans

  • htop, yön tuşlarıyla gezinirken ekranı kaydırdığı için oyun kontrolü sırasında rahatsız edici olabilir
    • Oyun başladıktan sonra a tuşuna basarak odağı işlemci seçimi menüsüne taşıyan basit bir geçici çözüm önerilir
  • Yapılma nedeni funny idi
  • Freedoom, ana dizindeki freedoom-license.txt içinde yer alan BSD benzeri bir lisansla dağıtılır
  • Kalan kodun ise GPL olduğu belirtilir

1 yorum

 
GN⁺ 2024-04-22
Hacker News yorumları
  • Düşününce, “videoyu” ASCII olarak render edip süreç adlarına koymak oldukça kolay görünüyor olabilir
    DNS üzerinde çalışan oyuncak projelere benziyor; README de işin çoğunu başka projelerin yaptığını söylediği için özel görünmeyebilir
    Öte yandan htop’u bir şeyin render motoru olarak görmeyi hiç akıl edemezdim; bu yüzden gerçekten şaşırtıcı ve etkileyici bir yazılım hack’i

    • Üstünkörü düşününce kolay görünüyor ama pratikte iyi kontrast ve performans elde etmek o kadar önemsiz bir iş değil
      Sadece libaa veya libcaca’ya bakmak bile, insanların bu konuya yüzlerce saat harcadığını gösteriyor
    • Kavramsal olarak anlaması kolay olabilir ama uygulaması epey zor görünüyor
  • Tersine çevrilmiş PSDoom[1] gibi bir şey sanırım
    Bu gönderide Doom’u bir süreç yöneticisiyle oynuyorsunuz; PSDoom’da ise süreç yönetimini Doom ile yapıyorsunuz
    [1]: https://psdoom.sourceforge.net

    • Ben de ters yönünü görmek isterdim diye yazacaktım; bunun zaten var olmasına şaşırmadım
      Güncel Linux’ta çalışacak şekilde port edilmiş bir videosu da var: https://youtu.be/Pf7rpde49NU
      Yine de top yerine geçecek bir araç olarak biraz daha gerçekten kullanışlı olsa güzel olurdu. Canavar boyutu bellek kullanımına, saldırganlık CPU kullanımına göre belirlenir; odalar kullanıcılara göre ayrılır, thread’ler ve ebeveyn/çocuk süreç ilişkileri de görünür kılınabilir
      Uyuyan süreçler elbette uyur; zombi süreçler ise mekânda donup kalmış ya da içinden geçilebilir şekilde saydam yapılabilir. Silahlar kill sinyallerine karşılık getirilebilir
      Eklenebilecek çok şey var ama o zaman giderek Doom’dan uzaklaşır
    • rm -rf ile birlikte kullanınca eğlenceli olurdu
  • İnsanlar böyle şeylere zamanı nasıl buluyor, gerçekten merak ediyorum
    Böyle havalı şeyler gördükçe kendi becerilerime olan güvenim giderek azalıyor
    Mevcut çalışmaları kullanıp ASCII olarak yeniden render ederek süreçlere eşlediği söylenmişti, ama bu kesinlikle az iş değil
    Ne kadar sürdüğünü merak ediyorum; bu sektörde epey uzun süredir olmama rağmen hiçbir şey bilmiyormuşum gibi hissediyorum. Harika ama kendimi inanılmaz aptal gibi hissettiriyor

    • Sıcak sözler için teşekkürler; kendine bu kadar yüklenmene gerek yok
      Muhtemelen sandığından çok daha fazlasını biliyorsun
      Bu iş bütün bir hafta sonu ve bir gün, ayrıca fırsat buldukça birkaç gün daha ufak ufak çalışarak ortaya çıktı
      Yorumlarda bir yerde ve README’de de yazdığım gibi, Doom’u daha taşınabilir hâle getiren zor işi fork’ladığım doom-generic projesi yapmıştı: https://github.com/ozkl/doomgeneric
    • Günde 8 saat çalışıp 1 saat işe gidip gelirsen 15 saatin kalır
      Yemek yemek, uyumak, duş almak ve başka şeyler yapmak gerekir ama bunları umursamazsan 15 saat olduğu gibi kalır
      3 yılda yapmak için fazlasıyla zaman var
      Şimdi 6502 için raycaster’ımı bitirmem lazım
    • Çok tanıdık bir his
      Arkadaşların Instagram’da paylaştığı kusursuz ev fotoğraflarına bakıp özgüvenini aşındırmanın programcı versiyonu gibi
      Çoğu kişi ara sıra böyle hissediyordur; bununla baş etmenin yolları da var, ama zeki insanların çevresinde olmanın çok normal bir yan etkisi
    • Böyle şeyleri her gördüğümde çocuğumun olmadığı zamanları hatırlıyorum
  • “Bir şeyin içine Doom koyma” akımı neredeyse tamamlanma noktasına gelmiş gibi; artık gündelik şeyleri Doom’un içine koymaya başlamanın zamanı geldi
    Doom içindeki bir Todo listesini ya da takvimi hayal edin

    • Kesin konuşmak gerekirse bu, Doom’un içindeki bir Todo listesi ya da takvim değil; Todo listesi ya da takvimin içinde çalışan Doom olurdu
      Todo uygulaması tarafında zaten checkbox’larla render edilmiş Doom var[1]; onu bir Todo uygulamasına entegre etmeyi de okuyucuya alıştırma olarak bırakabiliriz
      [1]: https://healeycodes.github.io/doom-checkboxes/
    • “Bir şeyin içine Doom koyma” akımının sona erdiğini düşünüyorsan, bu dünyaya yeni gelmiş gibisin
    • “Kuşlar DOOM oynuyor”u gördüğümde ben de aynısını düşünmüştüm
  • Bu projeye yaklaşık bir hafta önce tesadüfen rastlayıp buraya koymuştum ama ilgi görmemişti
    Şimdi ön sayfaya çıktığını görmek sevindirici; böyle eğlence odaklı, hack kokan projelerin öne çıkması hoşuma gidiyor

  • Harika bir hack
    Hacker ruhunun hâlâ yaşadığını görmek iyi hissettiriyor

  • Bazen insanlar teknolojiyi fazla ileri götürüyor, ama bu onlardan biri değil

  • Windows Görev Yöneticisi’nde çalıştırılan Bad Apple aklıma geldi
    https://youtu.be/sBeI30ccb6g

  • Saf ve şahane bir delilik. A+

  • Bu oyunun bundan sonra nerede çalıştırılacağını hayal bile edemiyorum