О чём молчит MySQL

Тест:

1
2
3
4
5
6
7
8
CREATE TABLE test_int (
    u32 INT(10) UNSIGNED,
    i32 INT(10)
);

INSERT INTO test_int (u32, i32) VALUES(4294967295, 4294967295);

SELECT * FROM test_int;

Результат:

1
2
3
4
5
+------------+------------+
| u32        | i32        |
+------------+------------+
| 4294967295 | 2147483647 |
+------------+------------+

Как можно заметить, MySQL молча обрезает значение, если оно не помещается в назначенный столбцу тип.

PostgreSQL, например, выбрасывает следующую ошибку в подобном случае:

1
ERROR:  smallint out of range

Тест для PostgreSQL:

1
2
3
4
5
6
CREATE TABLE test_int (
    small smallint,
    medium integer
);

INSERT INTO test_int (small, medium) VALUES(4294967295, 4294967295);

😒

Читать дальше

Депаролизация PDF

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

НО. Если попробовать распечатать такой документ, качество получится настолько плохим, что тяжело разобрать всё написанное.

Эта «защитная» опция (и несколько других) устанавливается на этапе шифрования и не может быть отключена стандартными способами. Я пробовал печатать в PDF, но результат тот же — качество ужасное. Из программ использовал Acrobat Reader и Google Chrome, но толку никакого.

Зачем мне понадобилось печатать эти документы? Например, в 90% случаев для аренды квартиры требуется подтверждение дохода за последние три месяца.

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

В любом случае, не многих усилий стоило найти способ расшифровать PDF и использовать как обычно. Это легко можно с утилитой QPDF:

1
qpdf --decrypt --password='*******' infile.pdf outfile.pdf

Моя версия qpdf не позволила мне расшифровать PDF файл на месте, поэтому я использовал крошечный скрипт для обработки сразу всех нужных файлов в директории:

1
2
3
4
5
for f in `ls 2018-*`
do
    qpdf --decrypt --password=‘123456’ ${f} ${f%%.*}-1.pdf
    mv -f ${f%%.*}-1.pdf $f
done

Читать дальше

Оптимизация блога

К своей заметке об оптимизации изображений для блога я получил пару советов о том, как ещё сэкономить траффик.

Первый совет заключался в более агрессивном уменьшении разрешения и качества изображений.

После эксперимента решил, что качество ниже 70 мне не подходит, а вот разрешение уменьшить нужно. Однако, хочется чтобы на экранах с повышенной плотностью пикселей, типа ретины, качество не страдало. Для этого можно использовать атрибут srcset — с помощью него можно задать изображение для тега img в зависимости от ширины экрана или от плотности пикселей.

Подробнее ознакомившись с этой темой, решил ещё поэкспериментировать с размерами и дописать скрипт, чтобы все варианты размеров генерировал автоматически. И желательно ещё автоматизировать указание размеров в самой разметке страницы. «Но потом, не сейчас»

Второй совет заключался в использовании модуля PageSpeed для Nginx.

Для того, чтобы не засорять систему разнообразными пакетами программ и библиотек, я все веб-сервисы на своём сервере запускаю в виде докер-контейнеров. Найти образ контейнера с Nginx и этим модулем на первый взгляд показалось пустяковым делом — обычно полезные вещи уже есть в репозиториях популярных дистрибутивов линукс или в виде готовых контейнеров. Однако, готового пакета для стандартного базового дистрибутива Alpine Linux не нашёл. Не особо удивился, потому что дистрибутив в последнее время достаточно популярный, но только как база для образов Докера и всяких микрокомпьютеров. А вот отсутствие готового ПО для CentOS и Debian удивило. Тем не менее, нашлось изрядное количество образов на гитхабе.

Проблема обнаружилась, когда часть из них не смогла собраться, а часть использовала старые версии программ или предоставляла не подходящий мне интерфейс. В итоге нашёл нужный образ, немного подправил его и, казалось бы, можно разворачивать и заменять мой стандартный Nginx. Но нет — PageSpeed не может быть скомпилирован отдельно и подключён к уже готовому Nginx, нужно компилировать Nginx заново вместе с модулем. Это требует достаточно много времени даже на восьми ядрах, которые у меня выделены для Докера. К слову сказать, основное время занимает компиляция самого модуля. В итоге, запустить сборку на своём одноядерном сервере я не решился. Пришлось собирать на ноутбуке, упаковывать образ в архив, отправлять на сервер, там распаковывать и потом уже запускать.

Вместе с прокачанным Nginx получил ещё страничку со статистикой трафика и соединений и пару других модулей. Но вот на скорость загрузки блога это никак не повлияло. Вероятно, потому, что предыдущая версия веб-сервера использовала gzip сжатие, которое отлично сжимает весь текст, картинки уже были неплохо оптимизированы, а скрипты и стили заранее минифицированы. Но у меня есть ещё пара сайтов, которые в режиме разработки ничего особо не сжимают и не минифицируют. Чуть позже замерю разницу для них.

Читать дальше