Скрипт для резервного копирования

Всем привет, обновил скрипт для резервного копирования с учётом того, что я вообще-то программист, а не просто айтишник! Он стал более интеллектуально определять и удалять старые файлы, учитывать ограничение в 4.5Gb (на FTP для бекапа доступно 5Gb) и успешность операций, добавлены сообщения об ошибках. И бонусом сообщения раскрашены в разные цвета, нейтральные выделены жирным, хорошие зелёным, а плохие красным цветом — красота! Скрипт проверен на сайте ShellCheck, который я настоятельно рекомендую к использованию. Если найдёте ошибку или вам есть что добавить, смело пишите комментарий.

#!/usr/local/bin/bash
 
# Основная папка для архивов
BACKUP_ROOT=/var/backups/manual/
# Папка, куда непоредственно пишем файлы, выглядит как BACKUP_ROOT/ГОД/МЕСЯЦ/ДЕНЬ
BACKUP_DIR="$BACKUP_ROOT"$(date +"%Y/%m/%d")
# Время запуска скрипта. Все файлы имеют вид имя_файла_%ЧАС%%МИНУТА%.tag.bz2
TIME=$(date +"%H%M")
# Ограничение хранилища в килобайтах для проверки
LIMIT=$(echo "4096*2^10"|bc)
# Ограничение хранилища в мегабайтах для вывода в сообщениях
HLIMIT=$(echo "$LIMIT/1024"|bc)"Mb"
 
# Функция выход в случае ошибки
exit_on_error() {
    # Получаем код ошибки
    exit_code=$?
    # Входное сообщение
    message=$1
    if [ $exit_code -ne 0 ]; then
        # Выводим сообщение в stderr
        >&2 echo -e "\e[31m${message}\e[0m"
        # Выходим к кодом exit_code
        exit $exit_code
    fi
}
 
# Если папки нет
if [ ! -d "$BACKUP_DIR" ]; then
    # Создаём папку со всеми промежуточными подпапками
    mkdir -p "$BACKUP_DIR"
fi
 
printf "\e[1mSearching space for backup\e[0m .. "
# Цикл от 100 дней до нуля
for days in $(seq 100 -1 0)
do
    SIZE=$(du -sB 1 $BACKUP_ROOT | cut -f 1)
    HSZ=$(echo "$SIZE/1024"|bc)"Mb"
    # Если размер хранилища не превышает лимита
    if [[ $SIZE -le $LIMIT ]]; then
        # Выводим сообщение и прерываем цикл
        printf "[%s/%s] .. " "$HSZ" "$HLIMIT"
        break
    fi
    # Если нет ни одного файла старше $days дней
    if [[ -z "$(find $BACKUP_ROOT -type f -mtime +"$days")" ]]; then
        # Продолжаем цикл
        continue
    fi
    printf "\e[31m%s/%s]\e[0m .. " "$HSZ" "$HLIMIT"
    # Удаление файлов старше $days прошло успешно
    if find $BACKUP_ROOT -type f -mtime +"$days"d -delete > /dev/null; then
        # Выводим сообщение 
        printf "CLEAN (older than %s days) .. " "$days"
    else
        # Выходим с сообщением FAIL
        exit_on_error "FAIL"
    fi
    # Удаляем пустые папки, чтоб не мусорить
    find $BACKUP_ROOT -empty -type d -delete
done
echo -e "\e[32mOK\e[0m"
 
printf "\e[1mBackuping etc files\e[0m .. "
/usr/bin/tar -Pjcf "$BACKUP_DIR"/etc_"$TIME".tar.bz2 /etc /usr/local/etc /home /var/db/ports /var/named/etc/namedb /root/scripts > /dev/null 2>&1 && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"
 
printf "\e[1mBackuping www folder\e[0m .. "
/usr/bin/tar -Pjcf "$BACKUP_DIR"/www_"$TIME".tar.bz2 /usr/local/www > /dev/null && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"
 
printf "\e[1mBackuping SQL databases\e[0m .. "
/usr/local/bin/mysqldump --login-path=backup --opt --all-databases --triggers --routines --events | bzip2 -c > "$BACKUP_DIR"/sql_"$TIME".sql.bz2 && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"

Откровенно говоря, не до конца понимаю, в каких единицах считает занятое место команда du. Предполагаю, что в килобайтах.

P.S. Для того, чтобы получить вывод без цвета, использую утилиту textproc/ansifilter:

script.sh | ansifilter --text
Добавил меню

Всем привет! Вам конечно всё равно, но я добавил меню. Теперь у меня есть навигация не только по меткам, но и по рубрикам. Можно посмотреть все Путешествия или рубрику Программирование включая подрубрики C++, Python, Java и так далее. Всё добавлено вручную, никакой автоматизации.

Поддержка меню в WordPress встроена изначально, все пункты и подменю добавляются в админке, но поскольку тема у меня самописная, пришлось попотеть с CSS и немного с JavaScript. Что-то натырено со сторонних сайтов, что-то взято из видео ниже.

Добавить меню хотел очень давно, но не хватало стимула и знаний. Спасибо каналу хлопца Евгения. После просмотра его видео про адаптивное меню решил сменить профессию сделать похожее на своём сайте.

Дайте знать, если плашка с рубрикой нужна к каждой статье. Хотя кого я спрашиваю, ходит на сайт два с половиной человека. Один из них гуглбот, а второй — это я.

UPD: В мобильной версии сайта добавил меню с помощью плагина WP Mobile Menu.

Где размять мозги программисту? Тренировочный полигон для айтишников

Всем привет! В этот раз расскажу, чем меряться программистам после кружки пива. Вот есть бегун, очевидно, что лучший бегун бежит или быстрее всех, или дальше всех. Или вот стрелок. Лучший конечно же тот, который чаще всего попадает в центр мишени, чем вне её.

А программистам и похвастаться нечем. Они не бегают и стрелять не умеют, а сидят сгорбленные, уставившись красными глазами в монитор и что-то пишут. Чем он занят? Зачем он здесь? Никто не знает.

А работодатель хочет знать как определить сильного программиста. По хиленьким ручкам, красным глазкам, горбатой спине или катышкам на свитере? Ну, допустим, текущему работодателю определить просто — надо брать того, кто не слишком сильно пахнет, а как быть с новым работодателем?

Вот пришёл ты такой красивый на собес и тебе прямо с порога — давай сортировку пузырьком пиши в уме! А ты работаешь в своём НИИ уже пятый десяток и всегда использовал метод sort() из вашей секретной сверхбыстрой библиотеки на Фортране и знать не знаешь что у неё внутри. И библиотека та написана учёным седовласым мужем, чьё имя с отчеством произносятся в конторе с придыханием и пиететом и бюст евоный стоит сразу при входе в холле. И значит это ровно то, что часть мозга, которая отвечает за простейшие алгоритмы атрофировалась за ненадобностью. Потому что все эти вещи пишутся один раз и навсегда, а не каждый день, как полагает потенциальный работодатель. Посему надо держать себя в тонусе. И помогут нам в этом два сайта LeetCode и HackerRank. Оба сайта, в принципе, одинаковые, но работодателя больше возбуждает HackerRank почему-то. Может из-за названия?

Сайты представлют собой список задач разного уровня сложности и среду для решения этих задач. Если вы программист и вам скучно или если вы не программист и вам интересно чем программисты зарабатывают на жизнь, смело заходите на любой из этих сайтов и решайте задачи.

Кому интересно, мой профиль на LeetCode и HackerRank.

Отпуск в Турции после ковидной эры

Загрузившись таблетками, как самоходный полевой госпиталь, мы с супругой отправились в Турцию.

Море в Турции

Я уверен, когда Роберт Линн Асприн описывал деволов — обитателей измерения Девы, он прогуливался по торговым улочкам Кемера. Манера торговаться, угадывать язык покупателя, продавать снег зимой — вот это всё скопировано с турков-продавцов.

А теперь сразу про деньги. Турки берут любую валюту: евро, доллары, турецкие лиры, некоторые берут рубли. Трудностей в общении нет, если вы хотите что-то купить, местные сразу вспоминают русский язык. Если вы не знаете английский, а продавец не знает русский, он найдёт вам переводчика. Так что языковой барьер у турков отсутствует, как у всякого порядочного девола.

Всем привет! Как вы уже догадались, сейчас расскажу про поездку в Турцию, город Кемер, в условиях санкций от всего т.н. «цивилизованного» мира. Отношение к этому я уже выражал ранее картинкой на языке их хозяев.

За один доллар дают 16-17 лир, за один евро 20 лир, про рубли — не знаю. Лиры снимали в банкоматах банков Ziraat, Deniz и Vakif с рублёвого счёта карты Мир Тинькофф. Карта Мир Альфа банка работать отказалась ни в банкомате, ни в терминале оплаты, бесполезный кусок пластика, хорошо этот кусок хоть бесплатный. Лиры в России не покупайте, наши упыри продают их по удвоенному курсу, гореть им в аду. Снимайте лиры в банкоматах с рублёвого счёта и платите наличкой, курс при этом близок к самому выгодному даже учитывая комиссию.

В Кемере мы были в отеле Kemer Hotel, три звезды. Его я не рекомендую: мясо/рыба в меню отсутствует, в номере не убираются ни перед заездом, ни во время отдыха. Единственная отрада — вкусный чёрный чай.

Экскурсии можно заказывать у туроператорного гида за тройную цену или в уличных турагенствах гораздо дешевле, мы брали в Ginza Travel. Туроператорный гид упорно отговаривает от уличных турагенств, настаивая на отсутствии у них страховки — в чём я сильно сомневаюсь.

Турция, Сулуада

Турки, в отличие от россиян, большие патриоты. Флаг Турции висит на каждом шагу. Может потому, что им не рассказывают из каждого утюга, что ненавидеть свою страну — это нормально и почётно. Как сказал гид Ясин по прозвищу «Мультфильм» скоро Россия и Турция совсем породнятся. Кстати, в Турции процветает культ личности Мустафа Кемаля Ататюрка и никого это не коробит. Памятники и площади имени Ататюрка в каждом городе Турции. Оскорбление его памяти карается законом.

В стоимость экскурсий, как правило, включён незамысловатый обед с макарошками, салатом и курицей/рыбой, или просто чьё-то безымянное мясо, плюс к этому кусочек булки/хлеба. Иногда за напиток надо доплачивать отдельно. Почему в России не предлагают даже такой же сервис за приемлемые деньги — вопрос риторический.

Сначала мы прогулялись по Кемеру и поназаказывали экскурсии почти на каждый день. Три корабля, подъем на гору Тахталы и посещение Памукале, итого пять штук подряд. Стоимость в среднем 500-550 лир на двоих, самая дорогая в Памукале 1180 лир, но она того стоит. Потом мы отправились в Чиралы своим ходом на автобусе и маршрутке. Маршрутка стоит 26 лир с человека и ходит раз в час. Сначала вас высаживают из автобуса (30 лир с человека) на трассе, потом надо спускаться вниз семь километров на маршрутке (можно пешком). Автобус и маршрутка называются милым уху словом «долмуш». Чиралы является заповедником, на его пляжах морские черепахи хранят свои яички, поэтому зонты и шезлонги лежат в тридцати метрах от моря. Парковка и катание на машине по пляжу стоит четыре тысячи долларов. Так же рядом для любителей можно посетить развалины древнего города.

Турция, шоссе D400

Вернувшись из Чиралы, через туристическое агенство арендовали машину на сутки, начиная со следующего утра. Машина отличная на мой взгляд, у ней унутри три цилиндра и 65 лошадиных сил, называется RENAULT TALIANT (белого цвета), коробка автомат, есть кондиционер. Обошлось нам это чудо инженерной мысли в 835 лир за сутки (50 баксов). Несмотря на слабый двигатель, машина в горах показала себя достаточно хорошо. Целью нашего путешествия был пляж Капуташ, всего 160 километров в одну сторону — это пляж с изумительно изумрудной водой, куда не возят туристов. Супруга ловко справилась с машиной, которую видела первый раз в жизни в незнакомой стране, поэтому к вечеру, уставшие, но довольные были в отеле.

Турция, пляж Капуташ

В первую экскурсию на корабле утром нас забыли забрать из отеля (Hello, Mehmet!), так что в Турции тоже не всегда всё слава Аллаху Богу. Мы связались с гидом и за нами прислали люкс автобус на две персоны, благо ехать было недалеко, а до стоянки яхт быстрее было дойти пешком, но уговор ждать автобус у отеля, есть уговор. Стоимость экскурсии была 500 лир на двоих, что по-нашему примерно 1750 рублей. В эту цену входит обед, трансфер туда и обратно, напитки отдельно за свои. Там мы около трёх раз купались в разных локациях, поели, позагорали и отправились домой. Мы такое дело вдвоём очень уважаем — когда делать ничего не надо, сверху яркая оранжевая штука в небе, солёная вода внизу, так что остались довольны, а сразу после поездки отправились к продавцу путёвок устраивать скандал, чтоб ему жизнь медом не казалась. Тот заверил нас, что больше такого не повторится.

На следующий день мы отправились в экскурсию на гору Тахталы, купленную через гида от туроператора. Подъём на фуникулёре на высоту 2365 метров полнейший восторг, страшно аж яички втягиваются. Фуникулёр промышленного масштаба — рассчитан на 80 человек. До подъёма заехали на оливковую ферму, где пили прямо из стопок масло и дегустировали вино. После спуска нас повезли в каньон Гейнюк,где накормили и дали искупаться, но желающих плавать в холодной горной реке особо не нашлось. Потом небольшой заплыв на корабле и по домам. Отдали за всё удовольствие 158 баксов на двоих в теории, а на практике на 18 баксов дороже, потому что терминал туроператорного гида взял двумя руками комиссию сколько смог унести (привет, Мевлюд!).

С интернетом в отеле было плохо, WiFi платный (доллар в сутки) и не работал из номера, поэтому мы купили симку оператора Vodafone за 450 лир, куда было включено 20 гигабайт интернета, ещё 750 минут и 1000 СМС, но работал почему-то только интернет.

А ещё турки много и часто курят и было сложно сдержаться от соблазна закурить снова (я бросил год назад). Проблема в том, что в моей памяти нет моментов, когда я, например, выхожу с аэропорта по прилёту и не курю, когда не курю после пива, потому что стаж моего курения около 25 лет и начался задолго до моих заграничных поездок по курортам. Но я сдержался и потому большой молодец!

Читатели просили подвести итог нашего путешествия и написать заключительный абзац. А вот и он! Всё понравилось, было пару неприятных моментов с уборкой в номере и веганском меню в отеле. В остальном всё хорошо. Супруга заставляла мазаться солцезащитным кремом, чтоб избежать возможного спидорака, поэтому домой приехал белый, зато ни разу не сгорел.

Симуляции жидкости в реальном времени

Всем привет!

Наткнулся на видео о том, как работает симуляции жидкости:

И там же есть полезная ссылка на книгу о симуляции жидкости в реальном времени: Real-Time Fluid Dynamics for Games. Сишного кода в книге на сто строк всего. Безо всякой зубодробительной математики. Любопытно, что книга понятнее, чем видео. Схороню здесь, чтобы не потерять. Давно интересовался этой темой.

И чтоб два раза не вставать, симуляция нетвёрдых тел (типа желе):

Возможно, в будущем, напишу реализацию жидкости/дыма на JavaScript и выложу на сайте с описанием и исходниками.

Блог Евгения Жирнова