Буква Й - файл не найден

Если вы скопируете файл, содержащий в названии эту замечательную букву с Linux-машины на MacOS-машину и обратно, то
попытавшись обнаружить этот файл, вы, скорее всего, уже не сможете этого сделать (ответом будет File not found):

$ ls *й*

Учитывая, что при простом отображении файлов в директории, вы его увидите:

$ ls

Это происходит потому, что букву Й можно закодировать в UTF-8 как один или два символа. И эти две системы делают это
по-разному. При копировании на MacOS файл кодируется по-другому и при копировании обратно, он не будет уже тем старым
добрым Й, который вы знали на Linux-машине. Короче, аккуратнее с этими вещами.

Спасибо человеку, ответившему на тот же вопрос, с которым я столкнулся: http://ru.stackoverflow.com/a/481109

Простой конфиг обратного прокси в nginx

Для проксирования запросов через nginx “куда-то еще” можно использовать подобный скрипт. Это называется “reverse proxy”.

В случае ниже, nginx слушает 80 порт для example.com и перенаправляет его на http://127.0.0.1:1000. При этом, он сохранит server_name и IP посетителя.

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:1000;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout       600;
        proxy_send_timeout          600;
        proxy_read_timeout          600;
        send_timeout                600;
    }
}

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

Например, у нас есть модель такого вида:

class Email(models.Model):
    email = models.CharField(max_length=50)

И мы хотим удалить дубликаты объектов этой модели. Для этого делаем следующее.

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

for email in Email.objects.values_list('email', flat=True).distinct():
    Email.objects.filter(pk__in=Email.objects.filter(email=email).values_list('id', flat=True)[1:]).delete()

Обратите внимание, что если значения будут пустыми строками или null, то они будут также обработаны и удалены, кроме одного.
Для того, чтобы это избежать, можно сделать следующее:

for email in Email.objects.values_list('email', flat=True).distinct():
    Email.objects.exclude(email__isnull=True).exclude(email__exact='').filter(pk__in=Email.objects.filter(email=email).values_list('id', flat=True)[1:]).delete()

Приведенные выше действия можно производить где угодно, но обычно это делает однажды в django shell:

./manage.py shell

Источник: http://stackoverflow.com/questions/5877306/remove-duplicates-in-a-django-query

Создание бекапов в Яндекс.Диск (Ubuntu)

Описание

Скрипт умеет:

  • Делать бекапы директорий, например, /etc.
  • Делать бекапы поддиректорий (разделяя их), например, /var/www/*.
  • Делать дампы MySQL.
  • Делать дампы PostgreSQL.
  • Загружать все это дело в Яндекс.Диск.

Подготовка

Для начала необходимо получить токен для Яндекс.Диска.

Для этого:

  1. Перейдите по этому URL https://oauth.yandex.ru/client/new.
  2. Название введите любое, например, “server_backup” без кавычек.
  3. Права выберите пункт “Яндекс.Диск REST API” и в нем “Доступ к папке приложения на Диске”.
  4. Снизу нажмите “Подставить URL для разработки”.
  5. Сохраните.

Вам выдаст подобные результаты:

ID: 61bf56f1e72a4112b83e1db9e44dbe9c
Пароль: 74087cd13d2247c48661c75617916b75
Callback URL: https://oauth.yandex.ru/verification_code
  1. Переходим по URL https://oauth.yandex.ru/authorize?response_type=token&display=popup&client_id=%ID%
    Обратите внимание. Замените в URL выше %ID% на то, что получили выше, т.е. в моем примере - “61bf56f1e72a4112b83e1db9e44dbe9c”.
  2. Нажимаем кнопку “Разрешить”.
  3. Копируем полученный токен и вставляем его в скрипт в YD_TOKEN (см. ниже).

Настройка

Скачайте файл backup_yd.sh и сохраните его на сервере.

Далее, вам необходимо изменить переменные в блоке “Init variables”:

# Базовый путь для сохранения бекапов.
BASE_BACKUP_DIR="/home/user/backups"

# Токен Yandex.Disk.
YD_TOKEN=""

# Пароль от пользователя root СУБД MySQL. Если она не используется, оставьте пустым.
MYSQL_ROOT_PASSWORD=""

# Делать дампы СУБД PostgreSQL?
# Пустая строка - нет
# "1" - да
USE_POSTGRESQL=""

# Список директорий, которые необходимо бекапить.
# В данном примере будет забекаплена директория /etc как архив etc.tar.gz и
# все поддиректории /var/www с соответствующими именами.
declare -a DIRS_FOR_BACKUP=('/etc' '/var/www/*');

# Размеры чанков (т.к. максимальный размер файлов ограничен, то необходимо
# разрезать архив на несколько частей. Чанк - и есть эта часть).
SPLIT_BY="200MiB"

Также, необходимо дать права на запуск:

chmod +x ./backup_yd.sh

Проверяем

Для проверки запустим скрипт:

./backup_yd.sh

В директории %BASE_BACKUP_DIR% будет создана директория с текущей датой, в ней поддиректории для файлов и дампов баз данных.
Все файлы бекапов разрезаются на чанки.

Затем будет произведена загрузка на Яндекс.Диск и директория будет удалена.

Примечание: Чтобы собрать бекап из чанков, используйте команду cat:

cat mybackup.tgz_* > mybackup.tgz

Настраиваем ежедневные бекапы по времени

Запускаем cron:

crontab -e

Добавляем следующую строку (впишите правильный путь до файла backup_yd.sh)

0 3 * * * /bin/bash /home/user/backups/backup_yd.sh

После этого сохраняйте и выходите из редактирования cron.

Все, теперь каждый день в 3 часа ночи будет создаваться новый бекап и загружаться в ваш Яндекс.Диск.

Давайте потестируем ifttt

Добавил связку RSS-ленты сайта со своим каналом в телеграме. Посмотрим, сработает ли она.

На сайте было все довольно интуитивно понятно и просто. Добавляем новый аплет, в нем указываем при каком событии (новый итем в RSS) что (запостить это в телеграм) должно происходить.

Сайт: https://ifttt.com
Бот в телеграме: @ifttt

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

Находим все файлы с расширением “.png” и, если их размер больше 1500х1500 пикселей, то уменьшаем их размер,
чтобы пропорционально вписать в квадрат 1500х1500, перезаписывая оригинал изображения.

find . -name '*.png' -exec convert -resize "1500x1500>" {} {} \;

Это позволит хоть немного освободить место на жестком диске, если у вас слишком большие изображения.

Поиск файлов с помощью bash

Найти файлы рекурсивно, начиная с текущей папки, с текстом “my_text”

egrep -ir --include=*.* "(my_text)" .

Найти файлы, измененные за последние три дня в указанной директории рекурсивно

find /my/directory/path -type f -mtime -3

Найти последние измененные файлы в указанной директории рекурсивно (10 шт.)

find /my/directory/path/ -type f -printf '%T@ %p\0' | sort -zk 1nr | sed -z 's/^[^ ]* //' | tr '\0' '\n' | head -n 10

Найти рекурсивно все файлы с размером 0, начиная с текущей директории

find ./ -size 0 -print