meowtrics, makinenizin durumuna tepki veren küçük bir tray simgesidir. CPU sıcaksa terler. Sistem boştaysa kestirir. Disk doluysa endişeli görünür. Bir güncelleme varsa beklentiyle bakar. Açıkça bir izleme aracı değildir, ve README bu konuda nettir. Sunucunuzun ölüp ölmediğini bilmek için emojiye göz ucuyla bakmamanız gerekir. Ara sıra neşe kaynağıdır, başka bir şey değil.
Aynı zamanda en çok şey öğrendiğim proje, ve bu bir sürprizdi. Sistem durumuna bağlı animasyonlu tray simgeleri kulağa üç saatlik iş gibi geliyor. Gerçekte, her sensörü saniyede yirmi kez okumamak, her tray uygulamasını kırmamak veya bellek sızdırmamak için özen ister.
Bütün hile debouncing'tir. Naif bir uygulama CPU kullanımını, sıcaklığı, diski, ağı, RAM'i ve birkaç başka değeri her birkaç yüz milisaniyede okur, demeti bir ruh hali tanımlayıcısına eşler ve tray simgesini buna göre değiştirir. Bu aynı anda iki kötü şey yapar. CPU bir an için %70'e sıçrayıp hemen geri döndüğünde simge titrer. Ve aksi halde boş bir makinede her birkaç yüz milisaniyede sysfs'i uyandırır.
Onun yerine her sensör kendi frekansında çalışır ve hepsinin bir histerez eşiği vardır. Ruh hali yalnızca hareketli ortalama sürdürülen bir süre boyunca farklı bir kademeye ulaştığında değişir. Kısa bir CPU yükselmesi hiçbir şey değiştirmez. Sürdürülen bir iş yükü değiştirir. Bu zekice değil, ama nihai sonuç, izlemesi tüketici yerine ilgi çekici olan bir simge.
İkinci tökezleme noktası tray spec'inin kendisiydi. X11'de libappindicator ve SNI (StatusNotifierItem) vardır. Wayland'da prensip olarak yalnızca SNI vardır, ama compositor desteği değişir. KDE Plasma SNI'yı doğrudan render eder. GNOME, varsayılan kurulumdan tray desteğini kaldırdı ve bir extension gerektirir. Sway, Hyprland, dwl ve Co. ya waybar ya da kendi durum çubuklarını kullanır ve SNI ile D-Bus üzerinden konuşur.
Bu, her yerde çalışan bir tray simgesi göndermenin tray-arka-uç tespiti ve hiçbiri yoksa zarif hata mesajları egzersizi olduğu anlamına gelir. meowtrics çalışma zamanında üç arka ucu sırayla dener: D-Bus üzerinden SNI, eski shell'ler için bir wrapper olarak libappindicator, ve hiçbir şey ulaşılamazsa tray'e hiçbir şey yapmayan basit bir bildirim yedeği – programı sadece gömmek yerine.
Rust burada ideolojik bir seçimden çok pragmatik bir seçimdi. Program küçük olmalı, sıkı entegre olmalı, uzun süre çalışmalı, ve hiçbir şey sızdırmamalı. Saniyede birkaç kez sensör okuyan uzun ömürlü bir tray programı, kendi C++ uygulamamı unutmam, RAII'yi düşünmem ve test etmediğim bir sistemde ölmem için ideal yer. Rust burada bana bedava iki garanti verir: kullanıldıktan sonra serbest bırakma yok, vahşi kaynak sızıntıları yok, çünkü modellenmediğim bir şey yapan bir thread yok.
Ruh halleri sabit kodlanmış stringler değildir. Paketle gönderilen küçük bir SQLite veritabanındaki satırlardır. Her ruh halinin bir anahtarı, bir simge varlık yolu, bir tetikleyici yolu (sensör + eşik) ve isteğe bağlı bir tooltip'i vardır. Kendi ruh halinizi eklemek istiyorsanız bir satır eklersiniz. Davranışa bakmak istiyorsanız DB'ye bakarsınız. YAML şeması, yeniden yükleme kancası veya hot-reload hilesi yok. Programı yeniden başlatırsınız, ve başlangıçta DB'yi okur.
SQLite kırk satır yapılandırma verisi için aşırıydı, ama kısıtlamalar, araçlar, bilinen bir okuma hikayesi ve sıfır satır parser kodu getirir. Bu en iyi türden aşırıdır.
Disclaimer kozmetik değil. meowtrics veri kaydetmez, hiçbir yere bir şey göndermez ve takip etmeniz gereken eşikleri izlemez. Bir sensör iki saat boyunca kırmızı bölgedeydi ve simgeye bakmadıysanız, simge fark etmeden önce sakinleşmiş olabilir. Ruh halidir, alarm değildir. Diskiniz dolmak üzereyse, emojiyi izlemeyi bırakın ve gerçek bir izleme sistemi kurun.
Oyuncaklar mühendislik çabasının gerçekte ne anlama geldiği konusunda ciddi araçlardan daha dürüsttür. Ciddi bir araçta karmaşıklığı kısıtlamaların arkasına saklayabilirsiniz: bu uyumluluk, bu bir denetim gereksinimi, müşterilerimiz böyle yapılandırır. Bir oyuncakta kısıtlama yoktur. Sonunda üç tray arka ucu, bir histerez sistemi ve bir SQLite DB'niz varsa çünkü simge aksi halde titrer veya çökerdi, bu size gerçek işin nerede olduğunu öğretir. Terleyen kedi yüzüyle ilgili değil. Bir sensör değeri ile tray'inizdeki bir piksel arasında ne olduğuyla ilgili.
