Skip to content

Instantly share code, notes, and snippets.

@nskondratev
Last active July 18, 2022 10:28
Show Gist options
  • Save nskondratev/a5f32c89f627eb91d653ac3cfb536b7a to your computer and use it in GitHub Desktop.
Save nskondratev/a5f32c89f627eb91d653ac3cfb536b7a to your computer and use it in GitHub Desktop.
Some useful snippets

Полезное в bash-скриптах

Подстановка значения по умолчанию

Для аргумента

MYSQL_DOCKER_CONTAINER=${1:-sp_docker_mysql_1}

Для переменной

MYSQL_DOCKER_CONTAINER=${OTHER_VAR:-sp_docker_mysql_1}

Циклы

#!/bin/bash
tables=("customers" "orders" "items")

for i in "${tables[@]}"
do
  echo ${i}
done

Проверка, передан ли аргумент

if [ -z "$1" ]; then
  echo "You must provide arg"
  exit 1
fi

Замена строки с помощью sed

# Replace string
find . -type f \
    -name '*.go' \
    -exec sed -i -e "s,old_str,new_str,g" {} \;

# Remove backup files generated by sed
find . -type f -name '*.go-e' -delete

Проверка на существование файла

if [ ! -f "./file" ]; then
  echo "file doesn't exist"
  exit 1
fi

Установка вебхука для Телеграма

#!/bin/bash

ENV_FILE=.env

# Check existence of .env file
if [ ! -f "$ENV_FILE" ]; then
  echo ".env doesn't exist. Rename example file and fill it: mv .env.example .env && nano .env"
  exit 1
fi

# Load variables from .env file
source $ENV_FILE

# Parse -c option
CLEAR=false
while getopts ":c" opt; do
  case ${opt} in
    c )
      CLEAR=true
      ;;
    \? ) echo "Usage: ./scripts/set_webhook.sh [-c], where -c - clear existing webhook"
      exit 2
      ;;
  esac
done

# Build request params
REQ_PARAMS="url=$WEBHOOK_URL"

if [ $CLEAR = true ]; then
  REQ_PARAMS='url='
fi

echo "Response from Telegram on /setWebhook request:"

curl -F $REQ_PARAMS "https://api.telegram.org/bot$TELEGRAM_API_TOKEN/setWebhook"

printf "\n"

Преобразование BDMV в MKV

Нужно установить mkvtoolnix. Вызывать так: ./conv.sh . Выходной файл будет потом в папке BDMV/STREAM

#!/bin/bash
BDMV_FOLD=`find "$1" -name "BDMV" -print0`

if [[ $BDMV_FOLD == *BDMV* ]]; then
   # cd to the ./BDMV/STREAM sub folder
   cd "$BDMV_FOLD/STREAM/"
   # Find the biggest .M2TS file, usually the movie
   BIGST_M2TS=`find . -type f | xargs ls -1S | head -n 1 | rev | cut -c 6- | rev`
   # MkvMerge the file
   mkvmerge -o "$BIGST_M2TS".mkv --compression -1:none "$BIGST_M2TS".m2ts
   # Change MKV permission to -rw-r--r-- and move file out of STREAM folder
   chmod 644 "$BIGST_M2TS".mkv
   mv "$BIGST_M2TS".mkv "$1"
   echo "MKV created! ("$1")"
else
   echo "BDMV2Mkv: no processing"
fi

Преобразование всех heic-файлов в папке в jpg

heic-to-jpg() {
    # brew install imagemagick
	magick mogrify -monitor -format jpg *.heic

	echo "Remove .heic files? [y/n]"
	read remove

	if [[ "$remove" == "y" ]]; then
		find . -depth 1 -name "*.heic" -delete
	fi
}

Полезное в Docker

Скачивание образа

docker pull <image_name>

Первый запуск образа

docker run [--options -p <port_host:port_container> -v <volume_host:volume_container> --name <container_name>] <image_name>

Остановка образа

docker stop <container_name>

Запуск образа

docker start <container_name>

Подключение к контейнеру

docker exec -i -t <container_name> /bin/bash

Обновление параметров уже запущенного контейнера

docker update --restart=always <containerId>

Сборка и пуш образов

Собрать образ с тегом

docker build -t <hub-user>/<repo-name>[:<tag>] .

Запушить образ с тегом

docker push <hub-user>/<repo-name>:<tag>

Показать только остановленные контейнеры

docker ps -f "status=exited"

Полезное в Git

Удаление последнего коммита

git reset --hard HEAD~1

Редактирование сообщения последнего коммита

git commit --amend -m "New message"

Редактирование сообщений нескольких последних коммитов

git rebase -i HEAD~3 # Вместо 3 можно поставить нужное число коммитов

Удаление тэга

git push --delete origin tagName  
git tag -d tagName

Создание патча и его применение

git diff > diff.txt
git apply diff.txt

Поменять время последнего коммита

На текущее время

git commit --amend --date=now --no-edit

На произвольное время

git commit --amend --date="2021-10-03T14:20:21+03:00" --no-edit

Быстрое клонирование репозитория

git clone --depth 1 <url>

Если нужна конкретная ветка:

git clone --depth 1 --branch <branch> <name>

Как потом получить все ветки:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*' && git fetch

Полезное в Linux

Использование жесткого диска

df -h

Какие папки занимают больше места

du -sh /*

Вместе со скрытыми папками

du -sch .[!.]* * |sort -h

Обрезка файла

truncate -s 0 filename.txt

Копирование папки

cp -ar dirname

Генерирование рандомной строки

date +%s | sha256sum | base64 | head -c 8 ; echo

Опции:

  • a - сохранение атрибутов,
  • r - рекурсивное копирование

Сжатие и распаковка .tar.gz архивов

# Compress
tar -zcvf archive-name.tar.gz directory-name

# Extract
tar -zxvf archive-name.tar.gz

Добавление пользователя с sudo правами

sudo adduser newuser
sudo usermod -aG sudo newuser

Загрузка директории с помощью SCP

scp -r dir user@host:/destination_dir

Импорт OpenVPN соединения

sudo apt install network-manager-openvpn-gnome openvpn-systemd-resolved
sudo nmcli connection import type openvpn file /path/to/your.ovpn

Убивание процесса по номеру порта

sudo kill $(sudo lsof -t -i:8080)

Чтение содержимого текстовых файлов в bash

Первые строки / символы

head -n [number_of_lines] -c [number_of_characters] file.txt

Последние строки / символы

tail -n [number_of_lines] -c [number_of_characters] file.txt

Удалить из файла первые строки

Удалить первую строку:

tail -n +2 file.txt > new_file.txt

Разбивание большого текстового файла

split -d -l [number_of_lines] -C [output_file_size] -a [suffix_length] input.txt [prefix]
  • -d - использование числовых суффиксов
  • -l - по кол-ву строк
  • -C - по размеру выходного файла с гарантией, что файл разбит по строкам
  • -a - длина суффикса (по умолчанию: 2)

Оставить только уникальные строки в файле

sort -u input.csv -o output.csv

Обрезать пробелы в строках файла

cat file.txt | sed 's/^[ \t]*//;s/[ \t]*$//' > out.txt

Установка статического IP-адреса в Ubuntu 16.04

sudo /etc/network/interfaces

Будет что-то такое:

auto eth0
iface eth0 inet dhcp

Подправить, чтобы выглядело как-то так:

auto eth0
iface eth0 inet static 
  address 192.168.0.100
  netmask 255.255.255.0
  gateway 192.168.0.1
  dns-nameservers 4.4.4.4
  dns-nameservers 8.8.8.8

Перезапустить сервис networking:

sudo systemctl restart networking

Узнать внешний IP адрес

echo $(wget -qO - https://api.ipify.org)

Прокси через сервер по ssh

ssh -D 8111 user@125.16.109.17 -p 2022

Запуск Go приложения в качестве сервиса

$ nano /lib/systemd/system/go_proxy.service

Там написать:

[Unit]
Description=SOCKS5 proxy server written in Go

[Service]
Type=simple
Restart=always
RestartSec=5s
WorkingDirectory=/root/go-socks5-proxy-server
ExecStart=/root/go-socks5-proxy-server/socks5-proxy-server

[Install]
WantedBy=multi-user.target

Запустить и авто-запуск:

service go_proxy start && service go_proxy enable

Получение внутреннего IP адреса в MacOS

ipconfig getifaddr en0

Получение текущего времени в виде Unix Timestamp

date +%s

Полезное в MongoDB

Запуск Replica Set через Docker

# Create network and db instances
docker network create mongo-rs && \
docker run --name am-mongo-1 --net mongo-rs -p 21001:21001 -v /home/nikita/mongo_data/1:/data/db --restart=always -d mongo --smallfiles --replSet rs --oplogSize 50 --port 21001 && \
docker run --name am-mongo-2 --net mongo-rs -p 21002:21002 -v /home/nikita/mongo_data/2:/data/db --restart=always -d mongo --smallfiles --replSet rs --oplogSize 50 --port 21002 && \
docker run --name am-mongo-3 --net mongo-rs -p 21003:21003 -v /home/nikita/mongo_data/3:/data/db --restart=always -d mongo --smallfiles --replSet rs --oplogSize 50 --port 21003

Подключиться к БД и выполнить:

rs.initiate({
  _id: "rs",
  members: [
    {_id: 0, host: "am-mongo-1:21001"},
    {_id: 1, host: "am-mongo-2:21002"},
    {_id: 2, host: "am-mongo-3:21003", arbiterOnly: true}
  ]
})

Проверить статус:

rs.status()

Удаление дубликатов

db.events.aggregate([
    { "$group": {
        "_id": { "uid": "$uid", "sid": "$sid" },
        "dups": { "$push": "$_id" },
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } }}
], {allowDiskUse: true}).forEach(function(doc) {
    doc.dups.shift();
    db.events.remove({ "_id": {"$in": doc.dups }});
});

Экспорт коллекции в CSV-файл

mongoexport --db test --collection test --type=csv --fields _id,field --query '{"createdAt":{"$gte":{"$date":"2019-01-01T00:00:00Z"}}}' | gzip -9 > output.csv.gz

Полезное в MySQL

Show foreign keys

For a table

SELECT  
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME  
FROM  
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
WHERE  
  REFERENCED_TABLE_SCHEMA = '<database>' AND  
  REFERENCED_TABLE_NAME = '<table>';  

For a column

SELECT  
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME  
FROM  
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
WHERE  
  REFERENCED_TABLE_SCHEMA = '<database>' AND  
  REFERENCED_COLUMN_NAME = '<column>';  

Конвертация кодировки

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;  
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Выгрузка таблицы в csv файл

mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv

Бэкапы

Сделать бэкап и сжать его

mysqldump -u USER -pPASSWORD DATABASE | gzip > /path/to/outputfile.sql.gz

Восстановить бэкап из архива

gunzip < /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE

Выделить одну таблицу из бэкапа всей БД

sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

Размер таблицы

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME"
    AND table_name = "$TABLE_NAME";

Список выполняемых запросов

mysqladmin -uroot -p -i 1 processlist

Проблема с доступом к кастомной директории для файлов

nano /etc/apparmor.d/local/usr.sbin.mysqld

Туда добавить:

/media/sdc/mysql/ r,
/media/sdc/mysql/** rwk, 

Сохранить и выполнить:

service apparmor reload

Удаление всех таблиц из БД без удаления самой БД

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
  FROM information_schema.tables
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables,'dummy') INTO @tables;

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

Полезное в Nginx

Включение Gzip

gzip on;  
gzip_comp_level 5;  
gzip_disable "msie6";  
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;  

Кэширование

expires {seconds}

Правильное кэширование

. . .
# Expires map
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     max;
    ~image/                    max;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    expires $expires;
. . .

Прокси на Node.JS приложение

location / {

        proxy_pass http://localhost:3000;

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection 'upgrade';

        proxy_set_header Host $host;

        proxy_cache_bypass $http_upgrade;

}

Открытие 80 порта

sudo firewall-cmd --add-service=http --permanent &&
sudo firewall-cmd --reload &&
sudo iptables -L | grep http &&
ACCEPT TCP -- anywhere anywhere tcp dpt:http ctstate:NEW

Load-balancing

upstream dsnode {
        hash $remote_addr$http_user_agent;
        server 127.0.0.1:8889;
        server 127.0.0.1:8886;
}

Полезное в NodeJS

Buffer to Stream

let Duplex = require('stream').Duplex;  
function bufferToStream(buffer) {  
    let stream = new Duplex();  
    stream.push(buffer);  
    stream.push(null);  
    return stream;  
}

Полезное в PostgreSQL

Экспорт/импорт таблицы в CSV-файл

Экспорт

docker exec -i postgres sh -c 'psql -h some.remote.host -d remote_db -p 5432 -U pg_user -c "\copy needed_table to STDOUT CSV HEADER"' > table.csv

Импорт

docker exec -i postgres sh -c 'psql -h localhost -d local_db -U pg_user -c "\copy needed_table from STDIN WITH CSV HEADER"' < table.csv

Узнать примерное число строк

SELECT reltuples FROM pg_class WHERE relname = 'table_name';

Узнать размер строки в байтах

SELECT pg_size_pretty(sum(pg_column_size(t)-24)) as filesize, count(*) as filerow FROM TABLE_NAME as t;

По всем таблицам

Полезное в Python

Индексы в матрицах numpy

a = np.matrix('1 2 3; 4 5 6; 7 8 9', dtype=np.uint8)  
a[0, 1] # 2

a[{{row}}, {{column}}]

Работа с пакетами и pip

Обновление пакета

pip install package -U

Фриз зависимостей в файл requirements.txt

pip freeze > requirements.txt

Установка всех пакетов из файла requirements.txt

pip install -r requirements.txt

Форматирование текущей даты и времени

datetime.today().strftime('%Y-%m-%d-%H:%M:%S')

Конкатенация строк

s = 'a'+'b'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment