Compare commits

...

15 Commits

Author SHA1 Message Date
6b8f7c297d clean utils fix 2026-03-09 14:45:14 +08:00
0370ee7308 new drotate util 2026-03-09 09:48:55 +08:00
fda5997f50 new clean util 2026-03-09 09:44:20 +08:00
c748863d30 new space util 2026-03-08 23:03:04 +08:00
f7088631b2 qwerty tool 2026-03-06 17:44:35 +08:00
e8247ba2ab JAVA_PATH fix in .profile 2026-03-06 13:43:07 +08:00
18e03a83b5 easyeffects misc 2026-03-06 13:42:02 +08:00
c99b5a2117 audio --switch 2026-03-04 08:37:22 +08:00
939289f172 vscode misc 2026-03-04 01:35:42 +08:00
35cdffa984 refactored sound to audio 2026-03-04 01:28:50 +08:00
f7b59f9d81 sound utility 2026-02-26 22:28:12 +08:00
b9635a5697 notes utils 2026-02-21 18:10:21 +08:00
153776c54e utils upgrade 2026-02-21 18:10:09 +08:00
f4c500d6cd dc util removed 2026-02-21 18:06:33 +08:00
2a177b5413 easyeffects update 2026-02-21 09:25:46 +08:00
44 changed files with 1158 additions and 155 deletions

View File

@@ -1,5 +1,13 @@
{ {
"output": { "output": {
"bass_loudness#0": {
"bypass": false,
"input-gain": 0.0,
"link": -9.1,
"loudness": -3.0000000000000013,
"output": -6.499999999999998,
"output-gain": 0.0
},
"blocklist": [], "blocklist": [],
"equalizer#0": { "equalizer#0": {
"balance": 0.0, "balance": 0.0,
@@ -259,7 +267,8 @@
"split-channels": false "split-channels": false
}, },
"plugins_order": [ "plugins_order": [
"equalizer#0" "equalizer#0",
"bass_loudness#0"
] ]
} }
} }

View File

@@ -1,7 +1,7 @@
{ {
"output": { "output": {
"bass_enhancer#0": { "bass_enhancer#0": {
"amount": 2.5000000000000058, "amount": 4.000000000000007,
"blend": 0.0, "blend": 0.0,
"bypass": false, "bypass": false,
"floor": 20.0, "floor": 20.0,
@@ -41,7 +41,7 @@
}, },
"band10": { "band10": {
"frequency": 15336.699231206312, "frequency": 15336.699231206312,
"gain": -9.65, "gain": -7.65,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -74,7 +74,7 @@
}, },
"band4": { "band4": {
"frequency": 354.2976439525226, "frequency": 354.2976439525226,
"gain": -22.9, "gain": -23.0,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -85,7 +85,7 @@
}, },
"band5": { "band5": {
"frequency": 663.8890981166219, "frequency": 663.8890981166219,
"gain": -18.08, "gain": -15.08,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719794, "q": 1.6444038237719794,
@@ -96,7 +96,7 @@
}, },
"band6": { "band6": {
"frequency": 1244.006958897993, "frequency": 1244.006958897993,
"gain": -12.57, "gain": -10.57,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -107,7 +107,7 @@
}, },
"band7": { "band7": {
"frequency": 2331.041913742621, "frequency": 2331.041913742621,
"gain": -6.2, "gain": -5.2,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719794, "q": 1.6444038237719794,
@@ -118,7 +118,7 @@
}, },
"band8": { "band8": {
"frequency": 4367.946951388736, "frequency": 4367.946951388736,
"gain": -2.62, "gain": -0.62,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -129,7 +129,7 @@
}, },
"band9": { "band9": {
"frequency": 8184.735099642112, "frequency": 8184.735099642112,
"gain": -1.81, "gain": 0.19,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -169,7 +169,7 @@
}, },
"band10": { "band10": {
"frequency": 15336.699231206312, "frequency": 15336.699231206312,
"gain": -9.65, "gain": -7.65,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -202,7 +202,7 @@
}, },
"band4": { "band4": {
"frequency": 354.2976439525226, "frequency": 354.2976439525226,
"gain": -22.9, "gain": -23.0,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -213,7 +213,7 @@
}, },
"band5": { "band5": {
"frequency": 663.8890981166219, "frequency": 663.8890981166219,
"gain": -18.08, "gain": -15.08,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719794, "q": 1.6444038237719794,
@@ -224,7 +224,7 @@
}, },
"band6": { "band6": {
"frequency": 1244.006958897993, "frequency": 1244.006958897993,
"gain": -12.57, "gain": -10.57,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -235,7 +235,7 @@
}, },
"band7": { "band7": {
"frequency": 2331.041913742621, "frequency": 2331.041913742621,
"gain": -6.2, "gain": -5.2,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719794, "q": 1.6444038237719794,
@@ -246,7 +246,7 @@
}, },
"band8": { "band8": {
"frequency": 4367.946951388736, "frequency": 4367.946951388736,
"gain": -2.62, "gain": -0.62,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,
@@ -257,7 +257,7 @@
}, },
"band9": { "band9": {
"frequency": 8184.735099642112, "frequency": 8184.735099642112,
"gain": -1.81, "gain": 0.19,
"mode": "RLC (BT)", "mode": "RLC (BT)",
"mute": false, "mute": false,
"q": 1.6444038237719791, "q": 1.6444038237719791,

View File

@@ -12,10 +12,10 @@
"scope": 30.0 "scope": 30.0
}, },
"bass_loudness#0": { "bass_loudness#0": {
"bypass": true, "bypass": false,
"input-gain": 0.0, "input-gain": 0.0,
"link": -9.1, "link": -9.1,
"loudness": -3.0, "loudness": -3.499999999999999,
"output": -6.0, "output": -6.0,
"output-gain": 0.0 "output-gain": 0.0
}, },
@@ -277,21 +277,10 @@
}, },
"split-channels": false "split-channels": false
}, },
"loudness#0": {
"bypass": false,
"clipping": false,
"clipping-range": 6.0,
"fft": "4096",
"input-gain": 8.0,
"output-gain": 0.0,
"std": "ISO226-2003",
"volume": 0.0
},
"plugins_order": [ "plugins_order": [
"equalizer#0", "equalizer#0",
"bass_enhancer#0", "bass_enhancer#0",
"bass_loudness#0", "bass_loudness#0"
"loudness#0"
] ]
} }
} }

View File

@@ -17,7 +17,9 @@ fi
### AAA ########################################## ### AAA ##########################################
export EDITOR="nano" export EDITOR="nano"
export JAVA_HOME="/usr/bin/" # export JAVA_HOME="/usr/lib/jvm/java-21-openjdk-amd64"
export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
export PATH="$JAVA_HOME/bin/:$PATH"
export PATH="$PATH:/opt/nvim/bin/" export PATH="$PATH:/opt/nvim/bin/"
export PATH="$PATH:$HOME/.local/bin/" export PATH="$PATH:$HOME/.local/bin/"
export PATH="$PATH:$HOME/.local/share/JetBrains/Toolbox/scripts/" export PATH="$PATH:$HOME/.local/share/JetBrains/Toolbox/scripts/"
@@ -51,4 +53,4 @@ export NVM_DIR="$HOME/.nvm"
[ -f "$HOME/yandex-cloud/completion.zsh.inc" ] && source "$HOME/yandex-cloud/completion.zsh.inc" [ -f "$HOME/yandex-cloud/completion.zsh.inc" ] && source "$HOME/yandex-cloud/completion.zsh.inc"
# misc # misc
[[ -f $HOME/.profile.local ]] && source $HOME/.profile.local [[ -f "$HOME/.profile.local" ]] && source "$HOME/.profile.local"

75
utils/.local/bin/audio Executable file
View File

@@ -0,0 +1,75 @@
#!/usr/bin/env bash
# available sinks listed here: pactl list sinks
CURRENT_SINK="$(pactl get-default-sink)"
CURRENT_PRESET="$(easyeffects --active-preset output)"
LOUD_SINK="alsa_output.pci-0000_00_1f.3.analog-stereo"
LOUD_PRESET="Defender"
HEAD_SINK="alsa_output.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.analog-stereo"
HEAD_PRESET="Techno"
set_head() {
if [ "$CURRENT_SINK" != "$HEAD_SINK" ]; then
pactl set-default-sink "$HEAD_SINK" || exit 1
easyeffects --load-preset "$HEAD_PRESET" || exit 2
echo -e "Current sink\t: $HEAD_SINK"
echo -e "Current preset\t: $HEAD_PRESET"
fi
}
set_loud() {
if [ "$CURRENT_SINK" != "$LOUD_SINK" ]; then
pactl set-default-sink "$LOUD_SINK" || exit 1
easyeffects --load-preset "$LOUD_PRESET" || exit 2
echo -e "Current sink\t: $LOUD_SINK"
echo -e "Current preset\t: $LOUD_PRESET"
fi
}
show_help() {
echo "Usage: $(basename "$0") [-h|--help|--loud|--head|--switch]"
echo
echo "Switch audio output and apply appropriate easyffects preset."
echo
echo "Options:"
echo " -h, --help Show this help message"
echo " --loud Enable loud speakers"
echo " --head Enable headphones"
echo " --switch Switch between loud and headphones"
echo
}
if [ -z "$1" ]; then
echo -e "Loud sink\t: $LOUD_SINK"
echo -e "Loud preset\t: $LOUD_PRESET"
echo -e "Head sink\t: $HEAD_SINK"
echo -e "Head preset\t: $HEAD_PRESET"
echo
echo -e "Current sink\t: $CURRENT_SINK"
echo -e "Current preset\t: $CURRENT_PRESET"
exit
fi
if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
show_help
exit
fi
if [ "$1" == "--loud" ]; then
set_loud
exit
fi
if [ "$1" == "--head" ]; then
set_head
exit
fi
if [ "$1" == "--switch" ]; then
case "$CURRENT_SINK" in
*$LOUD_SINK*) set_head ;;
*$HEAD_SINK*) set_loud ;;
*) show_help ;;
esac
fi

136
utils/.local/bin/clean Executable file
View File

@@ -0,0 +1,136 @@
#!/usr/bin/env bash
#
# Скрипт для очистки системных логов
# Требует права root
#
set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] [1|2|3]
Clean system logs and data to free some space on system disk.
Options:
-h, --help Show this help message
1|2|3 Safe, normal or aggressive clean level
EOF
exit 0
fi
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
log_error() { echo -e "${RED}[ERROR]${NC} $*"; }
show_size() {
local path="$1"
sudo du -sh "$path" 2>/dev/null | awk '{print $1}'
}
# Показываем текущее использование
log_info "Текущее использование:"
df -hx tmpfs
echo
log_info "По директориям:"
sudo du -h --max-depth=0 \
/var/log/ \
/var/cache/apt/ \
/var/lib/docker/ \
"$HOME"/.local/share/Trash/files/ \
"$HOME"/.cache/thumbnails/ \
2>/dev/null \
| sort -rh
echo
choice="$1"
if [ -z "$choice" ]; then
echo "Выберите режим очистки:"
echo " 1) Безопасный"
echo " 2) Средний"
echo " 3) Агрессивный"
echo
read -rp "Выбор [1-3]: " choice
echo
fi
case "$choice" in
1)
log_info "Выбран безопасный (1) режим..."
set -x
sudo journalctl --vacuum-size=100M
sudo find /var/log -name "*.gz" -mtime +7 -delete 2>/dev/null || true
sudo find /var/log -name "*.log.*" -mtime +7 -delete 2>/dev/null || true
[ -d "$HOME"/.local/share/Trash/files/ ] && sudo rm -rfv "$HOME"/.local/share/Trash/files/*
[ -d "$HOME"/.cache/thumbnails/ ] && sudo rm -rfv "$HOME"/.cache/thumbnails/*
set +x
;;
2)
log_info "Выбран средний (2) режим..."
set -x
sudo journalctl --vacuum-size=50M
sudo find /var/log -name "*.gz" -mtime +3 -delete 2>/dev/null || true
sudo find /var/log -name "*.log.*" -mtime +3 -delete 2>/dev/null || true
sudo find /var/log -name "dpkg.log.*" -mtime +3 -delete 2>/dev/null || true
[ -d "$HOME"/.local/share/Trash/files/ ] && sudo rm -rfv "$HOME"/.local/share/Trash/files/* 2>/dev/null || true
[ -d "$HOME"/.cache/thumbnails/ ] && sudo rm -rfv "$HOME"/.cache/thumbnails/* 2>/dev/null || true
sudo rm -rfv /var/cache/apt/archives/*.deb 2>/dev/null || true
sudo apt clean 2>/dev/null || true
set +x
;;
3)
log_info "Выбран агрессивный (3) режим!"
read -rp "Продолжить? (y|yes|n|no): " confirm
if [[ "$confirm" != "yes" ]] && [[ "$confirm" != "y" ]]; then
log_info "Отменено"
exit 0
fi
set -x
sudo journalctl --vacuum-time=1d
sudo find /var/log -name "*.gz" -delete 2>/dev/null || true
sudo find /var/log -name "*.log.*" -delete 2>/dev/null || true
sudo rm -rfv /var/log/journal/user-*@* 2>/dev/null || true
sudo rm -rfv /var/log/journal/system*@* 2>/dev/null || true
sudo rm -fv /var/log/{syslog,dmesg,btmp}.* 2>/dev/null || true
sudo apt autoremove --purge
sudo apt autoclean
sudo apt clean
sudo rm -rfv /var/cache/apt/archives/* 2>/dev/null || true
hash docker && docker system prune -f
snap list 2>/dev/null && snap refresh --list 2>/dev/null || true
sudo snap list --all \
| awk '/disabled/{print $1, $3}' \
| while read snapname revision; do
sudo snap remove "$snapname" --revision="$revision"
done
set +x
;;
*)
log_error "Неверный выбор"
exit 1
;;
esac
echo
log_info "Очистка завершена!"
log_info "Текущее использование:"
df -hx tmpfs
echo
log_info "По директориям:"
sudo du -h --max-depth=0 \
/var/log/ \
/var/cache/apt/ \
/var/lib/docker/ \
"$HOME"/.local/share/Trash/files/ \
"$HOME"/.cache/thumbnails/ \
2>/dev/null \
| sort -rh

View File

@@ -1,3 +1,17 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail
watch -tn 1 date '+%l:%M:%S%p' if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Display current time and unix timestamp (updates every second).
Options:
-h, --help Show this help message
EOF
exit 0
fi
watch -tn 1 date '+%H:%M:%S%n%s'

View File

@@ -1,6 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] [file]
Copy content to system clipboard.
Options:
-h, --help Show this help message
Arguments:
file File to copy (reads from stdin if not specified)
EOF
exit 0
fi
if hash pbcopy 2>/dev/null; then if hash pbcopy 2>/dev/null; then
exec pbcopy exec pbcopy
elif hash xclip 2>/dev/null; then elif hash xclip 2>/dev/null; then

View File

@@ -1,6 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <url>
Display detailed curl statistics for a URL.
Options:
-h, --help Show this help message
Arguments:
url URL to fetch statistics for
EOF
exit 0
fi
curl -sLw @- -o /dev/null "$@" <<'EOF' curl -sLw @- -o /dev/null "$@" <<'EOF'
URL:\t\t\t%{url}\n URL:\t\t\t%{url}\n
Address:\t\t%{remote_ip}:%{remote_port}\n Address:\t\t%{remote_ip}:%{remote_port}\n

View File

@@ -1,26 +0,0 @@
#!/usr/bin/env bash
CONTAINER="my-container" # the name of the container in which to 'exec' something
CONFIG="$(dirname $([ -L $0 ] && readlink -f $0 || echo $0))/docker-compose.yml" # path to compose yml file
CMD="docker-compose -f $CONFIG" # docker-compose command
APP_URL='http://localhost:8000/'
open_browser() {
if which xdg-open > /dev/null; then
xdg-open "$1" </dev/null >/dev/null 2>&1 & disown
elif which gnome-open > /dev/null; then
gnome-open "$1" </dev/null >/dev/null 2>&1 & disown
fi
}
case "$1" in
'' | 'help' ) echo -e "Provide one of operations: \t start, stop, up, down, restart, rebuild, open";
echo "Otherwise all args will be passed to 'docker exec -ti $CONTAINER ...'" ;;
'open' ) open_browser $APP_URL ;;
'up' ) $CMD up -d --build ;; # build and start containers
'down' ) $CMD down --remove-orphans ;; # stop and remove containers
'start' ) $CMD start ;; # start containers
'stop' ) $CMD stop ;; # stop containers
'restart' ) $CMD stop && $CMD start ;; # restart containers
'rebuild' ) $CMD down --remove-orphans && $CMD up -d --build ;; # rebuild containers
* ) docker exec -ti $CONTAINER $@ # exec anything in container
esac

28
utils/.local/bin/drotate Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/env bash
# X11:
# xrandr --listactivemonitors
# xrandr --output $OUTPUT --rotate (normal|left|right|...)
# Wayland KDE: https://www.reddit.com/r/kde/comments/11vrbwc/how_do_i_rotate_the_screen_on_kde_with_wayland/
# kscreen-doctor --outputs
OUTPUT='HDMI-A-1'
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] [normal|left|right|inverted]
Rotate a display.
Options:
-h, --help Show this help message
Arguments:
normal|left|right|inverted Direction
EOF
exit 0
fi
[ "$1" ] && DIRECTION="$1" || DIRECTION="normal"
kscreen-doctor "output.$OUTPUT.rotation.$DIRECTION"

View File

@@ -1,10 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [ -z "$1" ]; then if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>" echo "Usage: $(basename "$0") <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
echo " extract <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]" echo " $(basename "$0") <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]"
exit 1 echo
echo "Options:"
echo " -h, --help Show this help message"
exit 0
fi fi
for n in "$@"; do for n in "$@"; do

View File

@@ -1,3 +1,17 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Flush DNS cache using resolvectl.
Options:
-h, --help Show this help message
EOF
exit 0
fi
sudo resolvectl flush-caches sudo resolvectl flush-caches

View File

@@ -1,5 +1,25 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -eo pipefail
show_usage() {
cat <<EOF
Usage: $(basename "$0") [-h] [search]
List or search HTTP status codes.
Options:
-h, --help Show this help message
Arguments:
search Search term to filter status codes
EOF
}
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
show_usage
exit 0
fi
statuses="100 Continue statuses="100 Continue
101 Switching Protocols 101 Switching Protocols

View File

@@ -1,4 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <command>
Check if a command is available.
Options:
-h, --help Show this help message
Arguments:
command Command to check
Returns 0 if command exists, 1 otherwise.
EOF
exit 0
fi
[ -n "$1" ] && command -v "$1" || exit 1 [ -n "$1" ] && command -v "$1" || exit 1

View File

@@ -1,4 +1,24 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <string>
Display length of a string.
Options:
-h, --help Show this help message
Arguments:
string String to measure
EOF
exit 0
fi
if [[ ! -t 0 ]]; then # Read from stdin (pipe)
wc -c | awk '{print $1}'
else # Read from arguments
echo -n "$@" | wc -c | awk '{print $1}' echo -n "$@" | wc -c | awk '{print $1}'
fi

View File

@@ -1,5 +1,27 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <lineno> <file>
Display a specific line from a file.
Options:
-h, --help Show this help message
Arguments:
lineno Line number to display (1-based)
file File to read from
EOF
exit 0
fi
lineno="$1"; shift lineno="$1"; shift
if [[ ! -t 0 ]]; then # Read from stdin (pipe)
sed -n "${lineno}p"
else # Read from file
sed -n "${lineno}p" -- "$@" sed -n "${lineno}p" -- "$@"
fi

View File

@@ -1,4 +1,21 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <directory>
Create directory and change to it.
Options:
-h, --help Show this help message
Arguments:
directory Directory to create and enter
EOF
exit 0
fi
mkdir -p "$1" mkdir -p "$1"
cd "$1" || exit cd "$1" || false

View File

@@ -1,6 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <script>
Create a new bash script with boilerplate.
Options:
-h, --help Show this help message
Arguments:
script Script filename to create
EOF
exit 0
fi
if [ ! $# -eq 1 ]; then if [ ! $# -eq 1 ]; then
echo 'mksh takes one argument' 1>&2 echo 'mksh takes one argument' 1>&2
exit 1 exit 1
@@ -9,13 +25,11 @@ elif [ -e "$1" ]; then
exit 1 exit 1
fi fi
echo '#!/usr/bin/env bash {
set -e echo '#!/usr/bin/env bash'
set -u echo 'set -eo pipefail'
set -o pipefail echo
} > "$1"
' > "$1"
chmod u+x "$1" chmod u+x "$1"
exec "$EDITOR" "$1"
nano "$1"

View File

@@ -1,4 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail
curl http://ipecho.net/plain if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Display external IP address.
Options:
-h, --help Show this help message
EOF
exit 0
fi
if [[ "$1" == "-2" ]]; then
curl -fsSL https://api.myip.com | jq -r .ip
else
curl -fsSL http://ipecho.net/plain
echo echo
fi

171
utils/.local/bin/notes Executable file
View File

@@ -0,0 +1,171 @@
#!/bin/bash
#shellcheck disable=SC2155,SC2207
set -eo pipefail
NOTES_DIR="$HOME/notes"
EDITOR="${EDITOR:-nano}"
mkdir -p "$NOTES_DIR"
show_usage() {
cat <<EOF
Usage: $(basename "$0") <command> [options]
Commands:
add Create a new note
edit Open a note in editor
rm Remove a note
list List all notes
Options for 'add':
-n, --name <name> Custom note name (default: <unixtime>-untitled-note.md)
-t, --title <title> Custom note title (default: "Untitled note")
--no-time Don't add creation timestamp
--no-edit Don't open editor
Options for 'edit':
<name> Note filename to edit
Options for 'rm':
<name> Note filename to remove
Options for 'list':
(none)
EOF
}
cmd_add() {
local name="untitled-note"
local title="Untitled note"
local add_time=true
local new_edit=true
while [[ $# -gt 0 ]]; do
case "$1" in
-n|--name) name="$2"; shift 2 ;;
-t|--title) title="$2"; shift 2 ;;
--no-time) add_time=false; shift ;;
--no-edit) new_edit=false; shift ;;
*)
echo "Unknown option: $1"
show_usage
exit 1
;;
esac
done
local filename="$(date +%s)-${name}.md"
local filepath="$NOTES_DIR/$filename"
{
echo "# $title"
echo
if [[ "$add_time" == true ]]; then
echo
echo "Created at $(date '+%Y-%m-%d %H:%M:%S')"
echo
fi
echo "---"
echo
} > "$filepath"
echo "Created note: $filepath"
if [[ "$new_edit" == true ]]; then
$EDITOR "$filepath"
fi
}
cmd_edit() {
if [[ $# -lt 1 ]]; then
echo "Error: Note name required"
show_usage
exit 1
fi
local filename="$1"
local filepath="$NOTES_DIR/$filename"
if [[ ! -f "$filepath" ]]; then
echo "Error: Note not found: $filename"
exit 1
fi
$EDITOR "$filepath"
}
cmd_rm() {
if [[ $# -lt 1 ]]; then
echo "Error: Note name required"
show_usage
exit 1
fi
local filename="$1"
local filepath="$NOTES_DIR/$filename"
if [[ ! -f "$filepath" ]]; then
echo "Error: Note not found: $filename"
exit 1
fi
rm -v "$filepath"
}
cmd_list() {
local count=0
printf "%-40s %s\n" "Filename" "Title"
printf "%-40s %s\n" "--------" "-----"
# Use nullglob to handle empty directory case
local shopt_save
shopt_save=$(shopt -p nullglob)
shopt -s nullglob
local files=("$NOTES_DIR"/*.md)
# Restore original nullglob setting
eval "$shopt_save"
for file in "${files[@]}"; do
if [[ -f "$file" ]]; then
local filename=$(basename "$file")
local title=$(sed -n 's/^# \([^#].*\)/\1/p' "$file" | head -n1)
if [[ -z "$title" ]]; then
title="Untitled note"
fi
printf "%-40s # %s\n" "$filename" "$title"
((count++))
fi
done
if [[ $count -eq 0 ]]; then
echo "No notes found"
else
echo ""
echo "Total: $count note(s)"
fi
}
if [[ $# -lt 1 ]]; then
cmd_list "$@"
exit 0
fi
command="$1"
shift
case "$command" in
add) cmd_add "$@" ;;
edit) cmd_edit "$@" ;;
rm) cmd_rm "$@" ;;
list) cmd_list "$@" ;;
-h|--help|help) show_usage ;;
*)
echo "Unknown command: $command"
show_usage
exit 1
;;
esac

View File

@@ -0,0 +1,62 @@
#!/bin/bash
#shellcheck disable=SC2155,SC2207,SC2309,SC2034,SC2154,SC1087
set -eo pipefail
_notes_completion() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local command="${COMP_WORDS[1]}"
if [[ COMP_CWORD -eq 1 ]]; then
COMPREPLY=($(compgen -W "add edit rm list" -- "$cur"))
return
fi
if [[ "$command" == "edit" || "$command" == "rm" ]]; then
local notes_dir="$HOME/notes"
local notes=()
if [[ -d "$notes_dir" ]]; then
for file in "$notes_dir"/*.md; do
if [[ -f "$file" ]]; then
notes+=("$(basename "$file")")
fi
done
fi
local IFS=$'\n'
COMPREPLY=($(compgen -W "$(printf '%s\n' "${notes[@]}")" -- "$cur"))
compopt -o filenames
return
fi
}
_notes() {
local -a commands=(
'add:Create a new note'
'edit:Open a note in editor'
'rm:Remove a note'
'list:List all notes'
)
if (( CURRENT == 2 )); then
_describe 'command' commands
elif (( CURRENT >= 3 )); then
case $words[2] in
edit|rm)
local notes_dir="$HOME/notes"
if [[ -d "$notes_dir" ]]; then
_files -W "$notes_dir" -g '*.md'
fi
;;
*)
_message 'no more arguments'
;;
esac
fi
}
if [[ -n "$BASH_VERSION" ]]; then
complete -F _notes_completion notes ./notes
fi
if [[ -n "$ZSH_VERSION" ]]; then
compdef _notes notes ./notes
fi

View File

@@ -1,3 +1,17 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail
date '+%d.%m.%Y %H:%M:%S' if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Display current time and unix timestamp.
Options:
-h, --help Show this help message
EOF
exit 0
fi
date '+%H:%M:%S%n%s'

View File

@@ -1,4 +1,20 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <files...>
Change ownership of files to current user.
Options:
-h, --help Show this help message
Arguments:
files Files or directories to change ownership
EOF
exit 0
fi
sudo chown "$(whoami)". -R --changes --preserve-root "$@" sudo chown "$(whoami)". -R --changes --preserve-root "$@"

View File

@@ -1,6 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Paste content from system clipboard.
Options:
-h, --help Show this help message
EOF
exit 0
fi
if hash pbpaste 2>/dev/null; then if hash pbpaste 2>/dev/null; then
exec pbpaste exec pbpaste
elif hash xclip 2>/dev/null; then elif hash xclip 2>/dev/null; then

View File

@@ -1,4 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Set default permissions for files and directories in current directory.
Options:
-h, --help Show this help message
Sets:
- Files: 0664 (rw-rw-r--)
- Directories: 0775 (rwxrwxr-x)
EOF
exit 0
fi
# TODO permissions via arguments # TODO permissions via arguments

20
utils/.local/bin/qwerty Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env python3
import sys
en = "qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?"
ru = "йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"
def toggle(text):
if any('а' <= c <= 'я' or 'А' <= c <= 'Я' for c in text):
trans = str.maketrans(ru, en)
else:
trans = str.maketrans(en, ru)
return text.translate(trans)
if len(sys.argv) > 1:
input_text = " ".join(sys.argv[1:])
else:
input_text = sys.stdin.read().strip()
if input_text:
print(toggle(input_text))

View File

@@ -1,12 +1,29 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] [filter]
Display running processes.
Options:
-h, --help Show this help message
Arguments:
filter Optional filter string to match processes
EOF
exit 0
fi
if [[ $# == 0 ]]; then
process_list="$(ps -eo 'pid command')" process_list="$(ps -eo 'pid command')"
if [[ $# != 0 ]]; then else
process_list="$(echo "$process_list" | grep -Fiw "$@")" process_list="$(echo "$process_list" | grep -Fiw "$@")"
fi fi
echo "$process_list" | echo "$process_list" \
grep -Fv "${BASH_SOURCE[0]}" | | grep -Fv "${BASH_SOURCE[0]}" \
grep -Fv grep | | grep -Fv grep \
GREP_COLORS='mt=00;35' grep -E --colour=auto '^\s*[[:digit:]]+' | GREP_COLORS='mt=00;35' grep -E --colour=auto '^\s*[[:digit:]]+'

View File

@@ -1,6 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Open a temporary scratchpad file in \$EDITOR.
Options:
-h, --help Show this help message
EOF
exit 0
fi
file="$(mktemp)" file="$(mktemp)"
echo "Editing $file" echo "Editing $file"
exec "$EDITOR" "$file" exec "$EDITOR" "$file"

View File

@@ -1,11 +1,24 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
port='8888' if [[ "$1" == "-h" || "$1" == "--help" ]]; then
if [ $# -eq 1 ]; then cat <<EOF
port="$1" Usage: $(basename "$0") [-h] [port]
Start a simple HTTP server in current directory.
Options:
-h, --help Show this help message
Arguments:
port Port number (default: 8888)
EOF
exit 0
fi fi
port="${1:-8888}"
if hash php 2>/dev/null; then if hash php 2>/dev/null; then
exec php -S "localhost:$port" exec php -S "localhost:$port"
elif hash python3 2>/dev/null; then elif hash python3 2>/dev/null; then

24
utils/.local/bin/space Executable file
View File

@@ -0,0 +1,24 @@
#!/usr/bin/env bash
set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] PATH [-N]
Display used space on disk by PATH or show top N most heavy paths inside a PATH
Options:
-h, --help Show this help message
EOF
exit 0
fi
if [ -n "$2" ]; then
du -ah "$1" 2>/dev/null \
| sort -rh 2>/dev/null \
| head -"$2" 2>/dev/null
else
du -ah --max-depth=1 "$1" 2>/dev/null \
| sort -rh 2>/dev/null
fi

View File

@@ -1,6 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <seconds>
Set a timer with desktop notification.
Options:
-h, --help Show this help message
Arguments:
seconds Timer duration in seconds
EOF
exit 0
fi
sleep "$1" sleep "$1"
notify-send 'Timer complete!' \ notify-send 'Timer complete!' \
-u normal \ -u normal \

17
utils/.local/bin/today Executable file
View File

@@ -0,0 +1,17 @@
#!/usr/bin/env bash
set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Display current date.
Options:
-h, --help Show this help message
EOF
exit 0
fi
date '+%d.%m.%Y'

View File

@@ -1,3 +1,20 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <files...>
Move files to trash using gio.
Options:
-h, --help Show this help message
Arguments:
files Files or directories to move to trash
EOF
exit 0
fi
gio trash "$@" gio trash "$@"

View File

@@ -1,5 +1,21 @@
#!/usr/bin/env bash #!/husr/bin/env bash
set -u set -uo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <command>
Retry a command until it fails.
Options:
-h, --help Show this help message
Arguments:
command Command to repeatedly execute
EOF
exit 0
fi
"$@" "$@"
while [[ "$?" -eq 0 ]]; do while [[ "$?" -eq 0 ]]; do

View File

@@ -1,5 +1,21 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -u set -uo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <command>
Retry a command until it succeeds.
Options:
-h, --help Show this help message
Arguments:
command Command to repeatedly execute
EOF
exit 0
fi
"$@" "$@"
while [[ "$?" -ne 0 ]]; do while [[ "$?" -ne 0 ]]; do

16
utils/.local/bin/unixtime Executable file
View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Display current unix timestamp.
Options:
-h, --help Show this help message
EOF
exit 0
fi
date '%s'

View File

@@ -1,10 +1,23 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h]
Upgrade system packages (apt, snap, flatpak).
Options:
-h, --help Show this help message
EOF
exit 0
fi
is apt >/dev/null && { is apt >/dev/null && {
echo echo
echo "===========================" echo "==========================="
echo "Upgarding apt packages..." echo "Upgrading apt packages..."
echo "===========================" echo "==========================="
echo echo
sudo apt update sudo apt update
@@ -14,7 +27,7 @@ is apt >/dev/null && {
is snap >/dev/null && { is snap >/dev/null && {
echo echo
echo "===========================" echo "==========================="
echo "Upgarding snap packages..." echo "Upgrading snap packages..."
echo "===========================" echo "==========================="
echo echo
sudo snap refresh sudo snap refresh
@@ -23,7 +36,7 @@ is snap >/dev/null && {
is flatpak >/dev/null && { is flatpak >/dev/null && {
echo echo
echo "===========================" echo "==========================="
echo "Upgarding flatpak packages..." echo "Upgrading flatpak packages..."
echo "===========================" echo "==========================="
echo echo
sudo flatpak update -y sudo flatpak update -y

View File

@@ -1,12 +1,38 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
curl "https://r.jina.ai/$1" \ if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <url>
Convert webpage URL to markdown using jina.ai.
Options:
-h, --help Show this help message
Arguments:
url URL of webpage to convert
EOF
exit 0
fi
# More details: https://jina.ai/reader/
url="$1"; shift
curl "https://r.jina.ai/$url" \
-sS \ -sS \
-H "DNT: 1" \ -H "DNT: 1" \
-H "X-Md-Hr: ---" \
-H "X-Base: final" \ -H "X-Base: final" \
-H "X-Engine: direct" \ -H "X-Timeout: 10" \
-H "X-Locale: ru-RU" \
-H "X-No-Cache: true" \
-H "X-Engine: browser" \
-H "X-User-Agent: url2md" \
-H "X-Md-Em-Delimiter: *" \ -H "X-Md-Em-Delimiter: *" \
-H "X-Md-Heading-Style: setext" \ -H "X-Md-Link-Style: inlined" \
-H "X-Return-Format: markdown" \
-H "X-Keep-Img-Data-Url: true" \
-H "X-Md-Link-Reference-Style: collapsed" \ -H "X-Md-Link-Reference-Style: collapsed" \
-H "X-Md-Link-Style: referenced" "$@"

View File

@@ -1,4 +1,30 @@
#!/usr/bin/env bash #!/usr/bin/env bash
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <input.mp4>
Compress MP4 video using ffmpeg.
Options:
-h, --help Show this help message
Arguments:
input.mp4 Input video file (must be .mp4)
Output:
<input>_compressed.mp4
EOF
exit 0
fi
filename="${1%.mp4}" filename="${1%.mp4}"
ffmpeg -i "$filename".mp4 -c:v libx264 -crf 28 -preset veryslow -c:a aac -b:a 128k "$filename"_compressed.mp4 ffmpeg \
-i "$filename".mp4 \
-c:v libx264 \
-crf 28 \
-preset veryslow \
-c:a aac \
-b:a 128k \
"$filename"_compressed.mp4

View File

@@ -1,6 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <pid>
Wait for a process to complete.
Options:
-h, --help Show this help message
Arguments:
pid Process ID to wait for
EOF
exit 0
fi
if hash systemd-inhibit 2>/dev/null; then if hash systemd-inhibit 2>/dev/null; then
systemd-inhibit \ systemd-inhibit \
--who=waitfor \ --who=waitfor \

View File

@@ -1,4 +1,22 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#set -eo pipefail
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <command>
Show detailed information about a command.
Options:
-h, --help Show this help message
Arguments:
command Command to investigate
EOF
exit 0
fi
set -x set -x
type "$1" 2>/dev/null type "$1" 2>/dev/null

View File

@@ -1,4 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail
# Download music from Youtube or Youtube Music # Download music from Youtube or Youtube Music
# and save as top quality flac file without video # and save as top quality flac file without video
@@ -6,6 +7,25 @@
# Usage: $ ytmusic https://www.youtube.com/watch?v=dQw4w9WgXcQ # Usage: $ ytmusic https://www.youtube.com/watch?v=dQw4w9WgXcQ
# More info: https://github.com/ytdl-org/youtube-dl # More info: https://github.com/ytdl-org/youtube-dl
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
cat <<EOF
Usage: $(basename "$0") [-h] <url>
Download music from YouTube or YouTube Music as FLAC.
Options:
-h, --help Show this help message
Arguments:
url YouTube or YouTube Music URL (playlist or video)
Output:
$HOME/ytmusic/<playlist>/<channel> - <title>.flac
EOF
exit 0
fi
DEST_PATH="${HOME}/ytmusic" DEST_PATH="${HOME}/ytmusic"
mkdir -p "${DEST_PATH}" mkdir -p "${DEST_PATH}"

View File

@@ -32,10 +32,10 @@
"chat.commandCenter.enabled": false, "chat.commandCenter.enabled": false,
"window.enableMenuBarMnemonics": false, "window.enableMenuBarMnemonics": false,
"window.restoreFullscreen": true, "window.restoreFullscreen": true,
"window.newWindowProfile": "По умолчанию",
"window.customTitleBarVisibility": "auto", "window.customTitleBarVisibility": "auto",
"window.commandCenter": false, "window.commandCenter": false,
"window.menuBarVisibility": "compact", "window.menuStyle": "custom",
"window.menuBarVisibility": "toggle",
"debug.toolBarLocation": "docked", "debug.toolBarLocation": "docked",
"testing.coverageToolbarEnabled": true, "testing.coverageToolbarEnabled": true,