henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2024-02-08 06:21 pm

xcron

Знайшов dump $HOME 2008 року, який був зроблений на fbsd. Всередині побачив файла з назвою xcron. Це шелóвий скрипта, який я ув 2008 (і раніше) пускав для нагадування дій як:

% xcron 4 кофе стынет

де через 4 хвилини воно малювало X11 даялога з відповідним повідомленням.

Скрипта є настільки смішний, що заслуговує на зображення тут. Яка це була ітерація його, на жаль, залишається невідомим--про ґіта я тоді не чув, а тримати ув svn різноманітний мотлох було ліньки, тому що створювати ріпо ув svn то була Процедура. (Не пам'ятаю чи існували тоді аналоги ґітхабу для приватних ріпос; якщо і так, то грошей на них все одно не було.)

Біхолд:

xcron script from 2008

Найкращій блока--"cat all arguments", ггг

Не знаю чи може він сперечатися з шедеврами на кшталт

return (foo == "bar" ? true : false)

але мені здається що on a par з ними, так би мовити.

Скрипта, звичайно, є непридатний до сучасний лайнаксів: xmessage то була Xaw ютіліта (кінця 80х?) для створювання елементарних даялогів yes/no. Ув 2008 році користувалися нею майже ніхто, а вірогідність того що вона буде інстальована зараз є 0.

З графічними аналогами dialog(1) за цей час ліпше також не стало, їх популярність залишається дуже низька. Tk помер, байдінґами до gtk/qt ув ruby/python користуються 10 людей на планеті Земля.

Можна було би кликати термінального емулятора:

 $ xterm -fs 20 -e 'whiptail --msgbox KURWA\ BÓBR 0 0'

але по-1ше, xterm буває тільки у поціновувачів середовищ вільних від середовищ стільниці (страшно далєкі оні от народа), по-2ге, портабельного поняття діфолтний термінала не існує--ув кожному середовищі стільниці він є свій зі своїм механізмом з'ясування який саме є улюбленцем користувача. Можна тримати таблицю "éкзек'ютабл аргументи-для-зміни-шрифта", але це є забагато клопоту задля такої дрібниці.

Або:

  • ембедити маленьку C gtk4 програму (яка малює даялога) та компілювати її кожного разу перед закінченням таймера;

  • переписати скрипта на расті з використанням якогось GUI тулкіта типу Slint (який лінкується статично) та розповсюджувати байнарника;

  • писати повідомлення ув $(mktemp /tmp/XXXXXX.html) та кликати бовзера через xdg-open;

  • через D-Bus кликати метода org.freedesktop.Notifications.Notify на віддаленому об'єкті демона нотіфікацій. Кожне середовище стільниці останнього має своє, але API є стандартизований.

Варіянт 2024 з ді-басом:

#!/bin/sh

set -e
eh() { echo "$*" 1>&2; exit 1; }

command -v notify-send >/dev/null || eh no notify-send
[ $# -ge 2 ] || eh "Usage: xcron N msg ..."
sec=$1; [ "$sec" -ge 0 ] 2>&- || eh "Invalid int: $sec"; shift
summary=`ngettext "1 minute is up" "$sec minutes are up" "$sec"`

(
    sleep $((60*sec))
    notify-send -i modem -- "xcron: $summary" "$*"
) &
juan_gandhi: (Default)

[personal profile] juan_gandhi 2024-02-08 05:34 pm (UTC)(link)

Забавно. Преданья старины глубокой.

kondybas: (Default)

[personal profile] kondybas 2024-02-08 05:57 pm (UTC)(link)
Хехе!
Колись робив "менеджер сервісів" для фрі на dialog, аби дозволити керувати сервісами підлеглим:
#!/bin/sh                                                                  
                                                                           
tfile=/tmp/sdme.$$                                                         
while true                                                                 
do                                                                         
  cnt=0                                                                    
  vlist=                                                                   
  for i in $(service -e | egrep "/local/|cron|sshd|named|ntpd\$|syslogd" ) 
  do                                                                       
    i=${i##*/}                                                             
    if service $i status | grep "not running" > /dev/null                  
    then vlist="$vlist ' $i ' '\Z1 Stopped \Zn' x "                        
    else vlist="$vlist ' $i ' '\Zb\Z3 Running \Zn' x "                     
    fi                                                                     
    cnt=$(( cnt + 1 ))                                                     
  done                                                                     
  cnt2=$(( cnt + 7 ))                                                      
                                                                           
  comm="--colors  --ok-label 'Re/Start' --extra-button --extra-label 'Stop'
  --cancel-label 'Exit' --separate-output --checklist                      
  '\Z1\Zb \Zr == Simplest Daemon Manager Ever == \Zn' $cnt2 42 $cnt "      
                                                                           
  echo -e "\a\c"                                                           
  eval dialog $comm $vlist 2>$tfile; retval=$?                             
                                                                           
  case $retval in                                                          
    0) cmd="restart" ;;                                                    
    3) cmd="stop" ;;                                                       
    *) rm $tfile ; exit 0 ;;                                               
  esac                                                                     
                                                                           
  for line in $( cat $tfile )                                              
  do  service $line $cmd 2>/dev/null 1>/dev/null; done                     
  sleep 1                                                                  
done                                                                       
####