Скрипт для резервного копирования mercurial, subversion, mysql и etc

На днях мне в руки неожиданно попался 40 гиговый диск. Недолго думая, я приспособил его для бекапов, до которых все никак не доходили руки. Выкладываю скрипт для создания бекапов, может кому еще пригодится.

#!/bin/sh
 
# Текущая дата
DATE=`date "+%Y-%m-%d"`
# Папка для бекапов
BACKUP_DIR=/var/backups/manual
 
# Удаляем все файлы старше семи дней
find $BACKUP_DIR -type f -mtime +7 -delete
 
# Архивируем папки /etc, /usr/local/etc и /var/db/ports
/usr/bin/tar -Pzcf $BACKUP_DIR/etc_$DATE.tar.gz /etc /usr/local/etc /var/db/ports /var/named/etc/namedb > /dev/null
# Архивируем вебсайт
/usr/bin/tar -Pzcf $BACKUP_DIR/www_$DATE.tar.gz /usr/local/www > /dev/null
# Архивируем базы данных
/usr/local/bin/mysqldump --opt -Aau backup -pbackuppass | gzip -c > $BACKUP_DIR/sql_$DATE.sql.gz
# Архивируем subversion
/usr/local/bin/svnadmin dump -q /home/svn | gzip -c > $BACKUP_DIR/svn_$DATE.gz
 
# Для всех папок в /home/hg создаем бандлы
for i in `/usr/bin/find /home/hg/ -type d -depth 1`
do
    /usr/local/bin/hg bundle -qa --cwd $i $BACKUP_DIR/hg/`basename $i`_$DATE.hg
done

HINT: Перед запуском создайте папки /var/backups/manual и /var/backups/manual/hg. Плюс к этому измените пользователя баз данных ‘backup’ на своего. Желательно /var/backups иметь на дополнительном диске, а еще лучше на другом сервере.

Что такое кватернион — объяснение человеческим языком

Для закончивших ВУЗ данный вопрос не представляет проблемы, а для нас, учащихся ПТУ и техникумов, это тайна за семью замками. Особенно если вы, как и я, постоянно прогуливали высшую математику.

Цитата из википедии: Кватернио́ны (от лат. quaterni, по четыре) — система гиперкомплексных чисел, предложенная Гамильтоном в 1843 году.. Вы что-нибудь поняли? Значит дальше вам читать не надо, до свидания! Заходите еще..

Кватернион — это ось, относительно которой будем вращать объект и угол, на который мы будем вращать объект относительно этой оси. Всего у кватерниона четыре компоненты: X, Y, Z и W. XYZ — та самая ось поворота (нормализуем и каждый компонент умножаем на синус половины угла), W — угол поворота (который задается через косинус половины угла).

Псевдокод получения кватерниона из угла и оси:

def quatFromAngleAxis(self, a, x, y, z):
    # Длина вектора xyz
    l = sqrt(x * x + y * y + z * z)
    # Нормализуем вектор xyz
    x = x / l
    y = y / l
    z = z / l
    # Синус половины угла (a - угол в радианах)
    hSin = sin(a / 2)
    # Заполняем xyz
    self.x = x * hSin
    self.y = y * hSin
    self.z = z * hSin
    # Косинус половины угла
    hCos = cos(a / 2)
    # Заполняем w
    self.w = hCos

Важно помнить, что кватернион не задает результат, через него выражается действие, которое можно применить к какому-либо объекту в пространстве.

Ещё более простым языком: представьте, что у вас есть некий объект, допустим яблоко, вы протыкаете его спицей и вращаете. Так вот спица — это ось вращения, её направление — наш вектор (x, y, z), а угол вращения — это наш угол a, который означает насколько вы повернули яблоко на спице по часовой стрелке или против.

Если вас приводит в недоумение термин «матрица», рекомендую почитать заметку: Что такое матрица 4×4 в трехмерных играх?

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