Кирилл Артёменко

Личный блог | Написать мне

Определяем темную тему в CSS

16 Июля 2018 W3C зарегистрировала новый стандарт Media Queries Level 5.

Благодаря данному стандарту, можем использовать новое условие prefers-color-scheme в @media для определения темной темы в CSS:

/* Темное оформление */
@media (prefers-color-scheme: dark) {
    body {
        background-color: black;
        color: white;
    }
}
/* Светлое оформление */
@media (prefers-color-scheme: light) {}

P.S. Поддержка нового условия (на 15 апреля 2019) есть только у Safari 12.1+ и Firefox 67+

2019   CSS

Удаление данных из огромных таблиц

Самый простой и быстрый вариант, полная очистка таблицы:

-- удаляет все записи из таблицы
TRUNCATE TABLE huge_table;

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

DELETE FROM huge_table WHERE date <  NOW() - INTERVAL 1 MONTH;

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

Предлагаю следующий алгоритм:

-- создаем пустую таблицу по образу нужной
CREATE TABLE new_table LIKE huge_table;
-- перемещаем в нее нужные данные ( в нашем случае за последний месяц)
INSERT new_table SELECT * FROM huge_table WHERE date >  NOW() - INTERVAL 1 MONTH;
-- и атомарно меняем таблицы местами
RENAME TABLE huge_table AS huge_table_to_delete, new_table AS huge_table;
-- после этого выполняем удаление без условий (работа уже идет с новой таблицей)
DELETE TABLE huge_table_to_delete;

Готово!

2019   SQL

Запрет выполнения PHP в конкретной директории

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

Если веб-сервер Apache достаточно создать в директории файл .htaccess со следующим содержимым (комментарии можно убрать):

# отключаем исполнение CGI и листинг директорий
Options -ExecCGI -Indexes
# отменяем все обработчики и явно отключаем PHP
RemoveHandler .php .phtml .php3
RemoveType .php .phtml .php3
php_flag engine off
# для всех файлов с расширением .php
<FilesMatch "\.php$">
# отменяем обработчик
SetHandler none
# и полностью запрещаем доступ
Order Allow,Deny
Deny from all
</FilesMatch>

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

Прочие полезные хаки .htaccess описаны в данной статье

2019   .htaccess   Apache   PHP

Копирование БД на локальную машину

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

nohup ssh user@remoteserver "mysqldump --all-backup-options-here database | gzip -3 -c" > "/local/path/to/backup/database-$(date +'%Y-%m-%d-%H:%M').sql.gz" &

nohup ......... & — выводит данный процесс за пределы сессии пользователя позволяя ему выполняться в фоне даже после завершения текущей сессии.

Удачного копирования!

Бэкап и восстановление MySQL в Docker

# Backup
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql

--lock-tables=false # не блокирует таблицы во время дампа
--single-transaction # оборачивает в единую транзакцию вместо блокировки (только для InnoDB)
--skip-add-locks # ускоряет время восстановления за счет пропуска блокировок

# Restore
cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE
2019   Docker   SQL

SSH без пароля и приватный доступ к GIT

Для доступа к серверу по SSH без ввода пароля, необходимо, чтоб он нас узнавал. Для этого, добавим наш публичный ключ на удаленный сервер. Разместим его в домашней директории пользователя, под которым будем подключаться, в файле ~/.ssh/authorized_keys.

Если ключа нет, сгенерируем его:

# генерация пары public/private rsa ключей (создаст 2048 битный RSA ключ)
ssh-keygen -t rsa -b 2048
# или можно сгенерировать 4096 битный ключ с комментарием
ssh-keygen -t rsa -b 4096 -C "КОММЕНТАРИЙ"

После размещения ПУБЛИЧНОГО ключа на сервере в списке авторизованных, он перестанет запрашивать пароль при подключении.

# сделать это можно используя команду ssh-copy-id (если она имеется)
ssh-copy-id user@server
# или при помощи последовательности команд
cat ~/.ssh/id_rsa.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >>  ~/.ssh/authorized_keys"
# если возникли сложности с командами, добавьте ключ вручную в файл ~/.ssh/authorized_keys

Теперь, мы можем подключаться без пароля.

# подключаемся по SSH
ssh user@server
# работает, далее давайте настроим приватный доступ к GitHub — убедимся, что он нас не узнает
user@server:~$ ssh -T git@github.com
Permission denied (publickey).
# так и есть, не узнал

Для того, чтоб он нас узнавал, необходимо добавить наш ПРИВАТНЫЙ ключ в SSH-клиент и установить соединение с использованием личного ключа используя атрибут -A.

# добавляем ключ в SSH-клиент
ssh-add ~/.ssh/id_rsa
# подключаемся по SSH с использованием добавленного ключа (указав атрибут -A)
ssh -A user@server
#  проверяем узнает ли нас теперь GitHub
user@server:~$ ssh -T git@github.com
Hi KirillArtemenko! You've successfully authenticated, but GitHub does not provide shell access.
#  теперь можно работать со своими приватными репозиториями

На этом все. Приятного использования!

Ctrl + ↓ Ранее