Архив рубрики: unix

Имиджмеджику надо бы добавить память

Если собирать Имиджмеджиком многостраничный PDF-файл из картинок разрешением 600 DPI, он ругается на недостаточный размер памяти даже для файлов, которые не такие и большие

convert-im6.q16: cache resources exhausted `0002-bw.png' @ error/cache.c/OpenPixelCache/4095.
convert-im6.q16: cache resources exhausted `0003-bw.png' @ error/cache.c/OpenPixelCache/4095.

Раньше оно работало, но сломалось в процессе обновления системы — в ходе него изменился файл /etc/ImageMagick-6/policy.xmlтот самый, где по умолчанию запрещено создавать PDF — в нём же задаются и предельные размеры картинок и используемых для их обработки ресурсов. Я эти параметры уже менял в 2018 году, ещё живя под Ubuntu — сейчас у меня Debian, от которого Убунту и происходит. Значения параметров в сохранённой копии конфигурационного файла отличаются от того, что появилось после обновления. Увеличим парочку параметров вдвое:

  <policy domain="resource" name="area" value="256MP"/>
  <policy domain="resource" name="disk" value="2GiB"/>

После этого сборка идёт как надо.

Лишь недавно заметил, что площадь всё-таки указывается в мегапикселях (MP), а не в мегабайтах, как у меня почему-то было раньше. При этом в policy.xml допустимы два варианта: традиционный двоичный, равный 2²⁰ = 1048576 байт, обозначается как MiB, а то, что обозначают как MB — мегабайт десятичный, по системе СИ.

Синхронизация часов в десятом Дебиане

В свежем Debian GNU/Linux (вроде, и в Ubuntu 16.04 LTS четырёхлетней давности аналогично) для синхронизации часов используют не ntp, а timesyncd. Только оно по умолчанию не работает — ни на рабочем компьютере, ни на домашнем ноутбуке.

Начал разбираться — выяснил:

  1. Настройки хранятся в /etc/systemd/timesyncd.conf: там есть адрес основного сервера для синхронизации и список запасных — и оба этих списка закомментированы. Понятно, что надо раскомментировать плюс можно в качестве основного адреса указать тайм-сервер своего провайдера.
  2. VirtualBox препятствует синхронизации — его можно запустить (sudo VBoxService --timesync-set-start — мне не помогло) или совсем проигнорировать, если используется редко, как я и сделал.

После этого останется лишь перезапустить демонов и время наконец-то станет точным.

Скачивание видеороликов с попутным их склеиванием

Если что-то в интернете можно посмотреть, значит, это можно и скачать, хоть это и не всегда удобно.

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

Как известно, если нельзя, но очень хочется, то можно.

Метод

1. Заходим на страницу с архивом, находим нужный фрагмент, открываем отладчик (клавишей F12), переключаемся на вкладку Network — так и в Google Chrome, и в Mozilla Firefox.

2. Запускаем воспроизведение — отладчик покажет выполненные запросы.

3. Когда запросы перестанут идти (то есть, всё нужно, уже скачалось), можно, щёлкнув по ним правой кнопкой, выбрать пункт “Save all as HAR” — запросы и ответы на них будут сохранены единым файлом с расширением HAR — на самом деле это JSON.

В отладчике открыта вкладка Network

4. Берём какой-нибудь HAR-extractor (есть всякие варианты — мне подошёл первый попавшийся, написанный на Node.JS), натравливаем его на HAR-файл, получаем папку, в одной из подпапок которой будут лежать видеофайлы с расширением TS.

5. Смотрим эти видеофайлы — под линуксом с гномом можно использовать стандартный видеоплеер totem или всеядный mpv (ну или mplayer, из которого он и вырос).

6. Создаём текстовый файл, каждая строка которого состоит из слова file, пробела и имени файла в апострофах:

file 'cam42_16-10-2020_26778689266.ts'
file 'cam42_16-10-2020_26778699914.ts'

7. Склеиваем мелкие видеофрагменты в один большой файл:

ffmpeg -f concat -i список.txt -codec copy результат.mp4

Всё!


Аналогичный способ — сохранение кучи мелких файликов через HAR — можно использовать для того, чтоб добыть тайлы — небольшие квадратные картинки из которых состоят интерактивные карты на сайтах, а потом, делая свою карту, разместить эти тайлы где-нибудь у себя, чтоб не создавать лишнюю нагрузку на тайлопровайдера — они этого не любят: OpenStreetMap просит не брать тайлы непосредственно у них, а фонд ВикиМедиа всё время клянчит денег на поддержку функционирования Википедии. Реальный пример такого подхода — карта Global SUSU на сайте Южно-Уральского университета: тайлы там сгенерированы Википедией из общедоступных данных OpenStreetMap, но хранятся на одном из университетских серверов.

Аська выступает

ICQ (точнее, Mail.ru Group), похоже, хочет заставить пользователей переползти на использование нового клиента. Мне кажется, эффект будет обратным — народ разбежится.

Вот я, например, не собираюсь ни с отдельным клиентом возиться (мне универсального Пиджина хватает), ни держать аську в браузере — и без неё десятки вкладок иногда открыты. Так что если с нового года моя ромашка покраснеет — значит, пишите письма. Почта куда надёжнее аськи.

Разрешаем Имиджмеджику делать PDF

ImageMagick позволяет собирать многостраничный PDF-файл из нескольких растровых картинок, но не всегда — на некоторых компьютерах выдаёт ошибку

convert: not authorized `result.pdf' @ error/constitute.c/WriteImage/1028.

Причина — в том, что в конкретном экземпляре может быть запрещено создавать PDF, но есть рецепт, как это исправить: в файле /etc/ImageMagick-6/policy.xml надо включить нужное разрешение — строку

&lt;policy domain="coder" rights="none" pattern="PDF" /&gt;

надо заменить на 

&lt;policy domain="coder" rights="read|write" pattern="PDF" /&gt;

После этого PDF-файл будет нормально создаваться.

Теперь осталось понять, почему же готовый файл вдвое тяжелее суммы исходных. Добавление в команду преобразования параметров -dither none -colors 2 на размер готового файла практически не влияет.

Иконки в пятом либреофисе

Пятой версией пакета LibreOffice, когда она запущена в девятом дебиане, где по умолчанию стоит третий Гном и тема оформления Adwaita, пользоваться неудобно — в меню без иконок легко запутаться, а прошлогодний рецепт по их возвращению не помогает. Оказалось, у советских — собственная гордость^W^W^W^W в LibreOffice применяются свои собственные настройки — T̲ools → O̲ptions (Alt+F12)

Настройки LibreOffice

По умолчанию установлено автоматическое отображение либо скрытие иконок и в моём случае это всё-таки скрытие. Если их включить — менюшки станут удобнее — и основное меню поменяется, и контекстные.

Меню

Офисные меню выглядят не очень хорошо — вместо отсутствующих иконок надо было бы показать пустоту и сдвинуть текст, но даже в таком виде лучше, чем совсем без иконок.

Регистрозависимая сортировка

Линуксовая команда sort (во всяком случае, в Ubuntu 16.04 LTS) почему-то сразу сортирует без учёта регистра, хотя такое поведение должно включаться специальным ключом -f либо --ignore-case. Ключа --no-ignore-case для выключения такого поведения нет. Выход — сортировать перловым однострочником


perl -0777 -ne 'print join "\n", sort split "\n"'

Выделение ресурсов на преобразование картинок

ImageMagick иногда падает, ругаясь на исчерпание ресурсов:

convert-im6.q16: DistributedPixelCache ‘127.0.0.1’ @ error/distribute-cache.c/ConnectPixelCacheServer/244.
convert-im6.q16: cache resources exhausted `/tmp/magick-7601a0NxF7K2WOIO4′ @ error/cache.c/OpenPixelCache/3945.

несмотря на то, что на компьютере хватает и оперативной памяти, и места на диске. Решение нашлось в одном из комментариев к описанию этой проблемы: надо изменить объём доступной имиджмеджику памяти — он указывается в файле /etc/ImageMagick-6/policy.xml

Фрагмент файла policy.xml из настроек ImageMagick

Я увеличил указанные там величины вдвое — не помогло, увеличил ещё вдвое — хватило.

Сфинкс спрятался? Сделаем туннель, но ненадолго

Ситуация: жил-был Сфинкс (поисковая система Sphinx) на старом сервере, да пришла пора на новый переезжать. Нужный порт на новом месте доступен скриптам, что живут там же, а снаружи — нет и не надейтесь. Результат — кое-где тесты покраснели.

На сервере есть SSH — значит, можно проложить туннель, чтоб разработчик мог тестировать свои приложения на своих компьютерах, прежде чем делать коммиты и лезть на сервер. Команда для проброса стандартного сфинксового порта 9312 с локальной машины на сервер может выглядеть так:

ssh -L 9312:localhost:9312 server.name

Однако в таком виде она неудобна: команду надо запускать в одном окне терминала, тесты — в соседнем, а после завершения тестов надо ещё и закрывать SSH-сессию в первом окне.

man ssh

В инструкции (man ssh) пишут:

SYNOPSIS
     ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address]
         [-c cipher_spec] [-D [bind_address:]port] [-E log_file]
         [-e escape_char] [-F configfile] [-I pkcs11]
         [-i identity_file] [-J [user@]host[:port]] [-L address]
         [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option]
         [-p port] [-Q query_option] [-R address] [-S ctl_path]
         [-W host:port] [-w local_tun[:remote_tun]]
         [user@]hostname [command]
...
     -f      Requests ssh to go to background just before
             command execution.

То есть, ssh позволяет и команду выполнить, и перед этим уйти в фоновый режим. Приме́ним полученные знания:

ssh -fL 9312:localhost:9312 server.name sleep 5

Такая команда откроет туннель, не выводя ничего в терминал, подождёт пять секунд и закроется — почти то, что надо!

Осталось исключить рытьё тоннелей на сервере

test `uname -n` != 'server' &amp;&amp; ssh -fL 9312:localhost:9312 server.name sleep 5

и скрестить открытие туннеля с тестированием. Тесты в перловом веб-приложении, написанном с использованием микрофреймворка Mojolicious::Lite, могут вызываться различными путями — и как ./application.pl test, и командой prove, и как-нибудь ещё — я, например, обычно создаю Makefile с нужными мне задачами и тесты выполняю командой make test — мне так удобнее. Чтоб не рассматривать все возможные варианты тестирования, надо поместить открытие туннеля прямо в тест. Если конфигурация приложения хранится в каком-либо отдельном файле (YAML хорошо для этого подходит — в Моджолишисе есть плагин для чтения ЯМЛ-конфигов), можно команду открытия туннеля хранить рядом с остальными настройками — это лучше, чем пихать её в тест. А в тесте останется лишь вызвать её после создания объекта Test::Mojo:

my $t = Test::Mojo-&gt;new();

system($t-&gt;app-&gt;config-&gt;{'sphinx'}-&gt;{'tunnel'}) == 0
or warn "Cannot open SSH tunnel to Sphinx: $!";

Тесты зеленеют, можно спокойно идти заниматься музыкой 🙂

P.S. Если вместо system применить функцию exec, то тест не будет выполняться до тех пор, пока не закроется туннель — тест будет ждать завершения дочернего процесса и в итоге так и останется красным.