LaTeX

2022-01-18

Черт возьми, поставил Mint (Linux 5.4.0-94-generic), поставил Battlefield V и играю. Осталось только ярлычок сочинить, чтобы эта связка Lutris -> Origin -> Battlefield V по клику заводилась и шарманила.
В принципе, для любого приложения в linux можно посмотреть (если есть procfs) /proc/<pid>/environ и /proc/<pid>/cmdline:
p = <pid of running app>

strings /proc/self/environ | sed 's#^#export #' | sed 's#=#="#' | sed 's#$#"#' > Desktop/app

cat /proc/$p/cmdline >> Desktop/app


в случае с .exe нужно заменить все-таки на вызов wine64 и если убрать все лишнее получится вполне себе ярлык:

export GST_PLUGIN_SYSTEM_PATH_1_0="/home/az/.local/share/lutris/runners/wine/lutris-fshack-6.21-6-x86_64/lib64/gstreamer-1.0/:/home/az/.local/share/lutris/runners/wine/lutris-fshack-6.21-6-x86_64/lib/gstreamer-1.0/"

export PWD="/opt/Games/origin/drive_c/Program Files (x86)/Origin"

export DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1="1"

export WINEESYNC="1"

export XAUTHORITY="/home/az/.Xauthority"

export XDG_GREETER_DATA_DIR="/var/lib/lightdm-data/az"

export LUTRIS_GAME_UUID="67a989c3-410c-4053-a597-151770746b92"

export WINEARCH="win64"

export WINEPREFIX="/opt/Games/origin"

export WINEDLLOVERRIDES="d3d10core,d3d11,d3d12,d3d9,d3dcompiler_42,d3dcompiler_43,d3dcompiler_46,d3dcompiler_47,d3dx10,d3dx10_33,d3dx10_34,d3dx10_35,d3dx10_36,d3dx10_37,d3dx10_38,d3dx10_39,d3dx10_40,d3dx10_41,d3dx10_42,d3dx10_43,d3dx11_42,d3dx11_43,d3dx9_24,d3dx9_25,d3dx9_26,d3dx9_27,d3dx9_28,d3dx9_29,d3dx9_30,d3dx9_31,d3dx9_32,d3dx9_33,d3dx9_34,d3dx9_35,d3dx9_36,d3dx9_37,d3dx9_38,d3dx9_39,d3dx9_40,d3dx9_41,d3dx9_42,d3dx9_43,dxgi,nvapi,nvapi64,nvml=n;nvapi,nvapi64,winemenubuilder="

export WINE_LARGE_ADDRESS_AWARE="1"

export game_name="Origin"

export DISPLAY=":0.0"

export WINEDEBUG="-all"

export STAGING_SHARED_MEMORY="0"

export LD_LIBRARY_PATH="/home/az/.local/share/lutris/runners/wine/lutris-fshack-6.21-6-x86_64/lib:/home/az/.local/share/lutris/runners/wine/lutris-fshack-6.21-6-x86_64/lib64:/lib/x86_64-linux-gnu:/lib/i386-linux-gnu:/opt/amdgpu/lib/x86_64-linux-gnu:/opt/amdgpu/lib/i386-linux-gnu:/lib:/opt/rocm-4.5.1/opencl/lib:/lib/i386-linux-gnu/i686/sse2:/lib/i386-linux-gnu/sse2:/usr/lib/x86_64-linux-gnu/libfakeroot:/lib64:/lib32:/lib64:/usr/lib:/usr/lib64:/usr/lib32:/usr/lib64:/usr/lib/i386-linux-gnu:/usr/lib/x86_64-linux-gnu:/home/az/.local/share/lutris/runtime/Ubuntu-18.04-i686:/home/az/.local/share/lutris/runtime/steam/i386/lib/i386-linux-gnu:/home/az/.local/share/lutris/runtime/steam/i386/lib:/home/az/.local/share/lutris/runtime/steam/i386/usr/lib/i386-linux-gnu:/home/az/.local/share/lutris/runtime/steam/i386/usr/lib:/home/az/.local/share/lutris/runtime/Ubuntu-18.04-x86_64:/home/az/.local/share/lutris/runtime/steam/amd64/lib/x86_64-linux-gnu:/home/az/.local/share/lutris/runtime/steam/amd64/lib:/home/az/.local/share/lutris/runtime/steam/amd64/usr/lib/x86_64-linux-gnu:/home/az/.local/share/lutris/runtime/steam/amd64/usr/lib:$LD_LIBRARY_PATH"

export WINEFSYNC="0"

export DXVK_NVAPIHACK="0"

export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libgamemodeauto.so.0"

export WINELOADERNOEXEC="1"

export WINEPRELOADRESERVE="140000000-14e8aa000"

/home/az/.local/share/lutris/runners/wine/lutris-fshack-6.21-6-x86_64/bin/wine64 "/opt/Origin/Battlefield V/bfv.exe" >/dev/null


з.ы. эта платформа - просто жуть какая-то.

2019-05-09

https://www.reddit.com/r/dataisbeautiful/comments/bmbuu1/its_my_life/ blogger does not work

2017-05-30

beaglebone pwm.sh

#!/bin/sh
SLOTS=/sys/devices/bone_capemgr.9/slots
PWM=/sys/devices/ocp.3/

green=pwm_test_P8_19.13
yellow=pwm_test_P8_13.12
red=pwm_test_P8_34.14

duty_grn=500000 # initial
duty_ylw=250000 # initial
duty_red=0 # initial


install_cap() {
cap=$1
if ! grep $cap $SLOTS >/dev/null; then
echo $cap > $SLOTS
fi
}


install_cap am33xx_pwm
install_cap bone_pwm_P8_13
install_cap bone_pwm_P8_19
install_cap bone_pwm_P8_34
maxduty=`cat /sys/devices/ocp.3/$green/period`
duty=$maxduty
step=`expr $maxduty / 50`

led_setup() {
echo 0 > /sys/devices/ocp.3/$2/polarity
echo $1 > /sys/devices/ocp.3/$2/duty
}

led_loop() {
pin=$1
cd $PWM/$pin

duty=`cat duty`
duty=`expr $duty - $step`

if [ $duty -lt 0 ]; then 
duty=$maxduty
pol=`cat polarity`
echo `expr 1 - $pol` > polarity && echo $duty > duty
fi
echo $duty > duty
}

led_setup $duty_grn $green
led_setup $duty_ylw $yellow
led_setup $duty_red $red

while true; do

led_loop $green
led_loop $yellow
led_loop $red

done

beagle bone leds.sh

#!/bin/bash
DP=/sys/class/gpio
led_green=47
led_yellow=46
led_red=76

pin_on() {
echo 1 > $DP/gpio$1/value
}

pin_off() {
echo 0 > $DP/gpio$1/value
}
pin_blink() {
pin_on $1
sleep 0.15
pin_off $1
}

for l in $led_green $led_yellow $led_red; do 
echo $l > $DP/export
echo out > $DP/gpio$l/direction;
done

while true; do
for l in $led_green $led_yellow $led_red; do pin_blink $l; done
for l in $led_red $led_yellow $led_green; do pin_blink $l; done

done

2015-03-19

Нотификация продолжительных комманд в bash и KDE

Проблема: При запуске «долгоиграющих» команд в консоли благополучно забываешь о них, переключаясь на другие задачи. Нужна нотификация окончания таких команд, дабы экономить время.

Решение: Для начала, сделаем хорошо нашему .bashrc и нам - вынесем все что касается приглашения коммандной строки в отдельный файл .bash_prompt, а в .bashrc оставим:

if [ -f ~/.bash_prompt ]; then
    . ~/.bash_prompt
fi
Чтобы отслеживать продолжительности комманды, очевидно, необходимо записать время начала команды и ее окончание. К сожалению, прямого пути здесь нет. Сценарий будет следующим:
  1. Записываем время команды в файлик.
  2. По окончании выполнения команды - сравниваем текущее время и записанное.
  3. Если времени много - нофицируем пользователя, что команда закончилась.

Запись времени команды в файлик

Как мы знаем, в bash есть замечательная переменная окружения PROMPT_COMMAND, в которой записанная по имени функция будет вызываться каждый раз при выводе приглашения оболочки. Это было первое что мне пришло на ум - сохранять время в этой точке. Вторая мысль, которая пришла следом - куда сохранять: для каждого tty в отдельный файл. Таким образом, две команды из разных консолек не «пересекутся». Например это было бы примерно так:

command_prompt() {
  FTTY=`tty | sed 's#/#_#g'`
  now=`date '+%s'`                  # Текущее время
  
  # do not overwrite until promt notifies and removes
  if [ ! -f "/tmp/$FTTY" ]; then
    echo $now > "/tmp/$FTTY"
  fi
}
PROMPT_COMMAND=command_prompt
Записать, записали. Как видно, здесь стоит проверка существования файла со временем. Если же файл есть, значит команда уже была и мы можем прочитать его и проверить длительность.
LONG_TIMEOUT=60
command_prompt() {
  FTTY=`tty | sed 's#/#_#g'`
  now=`date '+%s'`                  # Текущее время

  if [ -f "/tmp/$FTTY" ]; then
    last_command_time=`cat "/tmp/$FTTY"`
    if [ `expr $now - $last_command_time` -gt $LONG_TIMEOUT ]; then
      notify_long_command `expr $now - $last_command_time`
    fi
    
    rm -f "/tmp/$FTTY"
  fi
  
  echo $now > "/tmp/$FTTY"

}
PROMPT_COMMAND=command_prompt
Осталось нотифицировать. За что мне понравился в свое время KDE, так это за маленькую удобную консольную утилитку kdialog. Незаменимая вещь для налаживания доброго диалога с пользователем. Она может показывать диалоги:
  • Текстовые (обычные, предупреждающие, извиняющиеся, ошибочные), как просто так и с кнопками да-нет-наверное (kdialog --yesnocancel "Привет, наверное!")
  • Принимать ввод пользователя, простым текстовым полем, выпадающим списком, переключалками или чекбоксами, слайдер, календарь и даже цвет
  • Выводить прогресс бар!
  • запрашивать файловые вещи, путь файла, папки или URL (диалоги выбора файла)
  • ну и определять заголовок диалога, переопределять тексты кнопок и сохранять выбор пользователя "не показывать мне больше"
и все это простой командой kdialog. Ну и использовать я ее буду так:
notify_long_command() {
  if which kdialog > /dev/null; then
    kdialog --passivepopup "\"$1\" completes in `format_time $2`"
  fi
}
--passivepopup позволяет «кинуть» нотификацию, как, например, при отвалившейся сети. И вот тут, захотелось большего - знать конкретную команду, которая выполняется. И иметь, в конце концов, нотификацию вида "rm -rf / завершилась за 00:05:25". Но авто-переменной BASH с текущей командой нет. Максимум что удалось накопать - это переменная, в которой записано "bash" - это и правда текущая команда :)