Я всё ещё тут

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

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

Имитация GROUP BY с помощью awk

Недавно понадобилось вычислить средние значения для каждой из групп данных из буфера обмена. Чтобы не копировать данные в текстовый файл и не открывать Excel для этого, воспользовался утилитой awk.

Пример данных:

1
2
3
4
5
6
23100 1600
20500 1600
19400 1600
36900 512
43100 512
48000 512
1
2
3
4
5
6
7
8
9
$ # SUM
$ awk '{arr[$2]+=$1} END {for (i in arr) {print i, arr[i]}}'
512 128000
1600 63000
$ # AVG
$ awk '{arr_sum[$2]+=$1; arr_cnt[$2]+=1} END \
       {for (i in arr_sum) {print i, arr_sum[i]/arr_cnt[i]}}'
512 42666.7
1600 21000

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

О чём молчит 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 *
do
    qpdf --decrypt --password='123456' "${f}" "${f%%.*}-1.pdf"
    mv -f "${f%%.*}-1.pdf" "$f"
done

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