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

Больше перловой документации!

Документация по языку Perl и его модулям теперь доступна и на perldoc.pl, только оно без прокси не работает, ибо заблокировано роскомпозором. Точнее, заблокирован IP-адрес (IPv4, конечно), на котором сидит этот сайт. И lilypond.org без прокси не откроется, и toggl.com, и oEmbed.com…

Инструменты разные — методы похожие

Попробовал решить одну из рабочих задач, применив нелюбимый язык PHP в комплекте с современными инструментами — получилось близко к тому, что делал сравнительно недавно на перле, с некоторыми отличиями:

  • Вместо  перла — PHP,
  • Модули тоже лежат рядом со своим кодом, но управляются не картоном, а через composer,
  • Композер и тесты может запустить (composer test), и отладочный сервер (composer start). Но можно для однообразия для обоих языков сделать Makefile и выполнять нужные действия командой make. Например, у меня запуск тестов — всегда make test, чтобы не путаться.
  • Вместо Mojolicious::Lite — микрофреймворк Slim. Для быстрого старта — Slim-Skeleton.
  • В шаблонах вместо Embedded Perl — Twig.
  • Если сайт работает через PHP-FPM, то нет нужды пинать демона каждый раз, как обновится код — он сам обрабатывает подобную ситуацию. Развёртывание свежей версии простого веб-приложения сводится к трём действиям: обновление рабочей копии (svn up либо git pull), разрешение зависимостей (composer install) и на всякий случай запуск тестов.

Слон и код

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

Кросспроектное связывание коммитов с задачами в Редмайне

Багтрекер Redmine не позволяет связать задачу с фиксацией изменений в системе контроля версий^W^W^W^W^W^W коммитом, относящимся к части хранилища, не связанной с проектом, куда входит задача — ни автоматически, указывая номер задачи в комментарии к коммиту, ни вручную, на странице коммита. Однако при наличии связи в базе данных Редмайн всё же отобразит ссылки на страницах и задач, и коммитов.

Связи хранятся в таблице changesets_issue

changeset_id issue_id
24645 2224

Сопоставить номер связи с номером ревизии можно через таблицу changesets

id repository_id revision committer
24645 37 8801 as

Таблицы в MySQL Workbench

Для создания связи достаточно внести запись в таблицу changesets_issue, подставив в поле changeset_id правильное значение changesets.id — ссылки появятся при ближайшем посещении страниц. Привязать редмайновую задачу с указанным номером ко всем коммитам, в комментариях к которым есть этот номер, можно запросом


SET @issue_id = 1234;
    
INSERT IGNORE INTO changesets_issues
SELECT 
    id, @issue_id
FROM
    changesets
WHERE
    comments REGEXP CONCAT('.*#', @issue_id, '[^0-9].*');

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

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

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

Удивился? Отметь!

Интегрированная среда разработки Geany умеет искать некоторые слова в тексте текущего документа либо проекта и выводить их в отдельное окошко — это удобно, когда по тексту рассыпаны комментарии со словами TODO или FIXME и хочется быстро их найти.

Настройки плагинов Geany

Geany позволяет вносить новые слова в число разыскиваемых: Edit → Plugin Preferences → Addons. Мне стандартных слов не хватает, пришлось ещё добавлять. Теперь можно вставить в текст удивлённое нерусское восклицание, а потом быстро его найти.

Тестирование перловых mojolicious-приложений в Geany

Программировать, используя какую-нибудь могучую интегрированную среду разработки (IDE) — хорошо и зачастую удобно: там «из коробки» могут предоставляться различные удобные штуковины — компиляция, отладка, тестирование, работа с системами контроля версий. Однако некоторые системы при всём своём могуществе оказываются не совсем подходящими — например, могут много весить и сильно тормозить. Приходится выбирать что-нибудь полегче, например, Geany.

В Geany есть (в том числе и средствами дополнительных модулей) всякое:

  • подсветка синтаксиса,
  • организация файлов в проекты,
  • поиск текста как в текущем файле, так и в произвольном их наборе с обходом подкаталогов,
  • поиск парных скобок и тэгов HTML/XML, а также переход по ним,
  • составление оглавления используемых функций,
  • компиляция либо проверка синтаксиса с подсветкой ошибок и быстрым переходом к ним.

С отладчиком в Geany пока не удалось разобраться, а вот процесс тестирования кода можно сделать более удобным.

Итак, у нас есть:

  • IDE Geany,
  • Веб-приложение, написанное на языке Perl с использованием фреймворка Mojolicious и системы управления модулями carton,
  • Желание запускать тесты почаще и попроще, без лишних переключений из редактора в терминал.

Geany позволяет для каждого проекта задать список действий: как общих для всего проекта, так и специфичных для конкретного типа файлов — найти настроки можно в меню Project → Properties → вкладка Build либо Build → Set Build Commands.

Настройки команд в Geany

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

Пойдём дальше — научим Geany прогонять тесты из текущего файла. В Mojolicious тесты представляют собой перловые файлы, имеющие расширение .t и лежащие в каталоге t/. Для того, чтоб, видя в редакторе открытый файл с тестами, прогнать тесты, в настройках придётся добавить путь к корневой папаке приложения. Чтоб не писать путь целиком, можно воспользоваться шаблонами. В документации пишут:

The first occurrence of each of the following character sequences in each of the command and working directory fields is substituted by the items specified below before the command is run.

  • %d — substituted by the absolute path to the directory of the current file.
  • %e — substituted by the name of the current file without the extension or path.
  • %f — substituted by the name of the current file without the path.
  • %p — if a project is open, substituted by the base path from the project.
  • %l — substituted by the line number at the current cursor position.

то есть, некоторые имена файлов и пути к папкам можно указывать специальными переменными.

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

Пробуем выполнить тест — в окно Compiler выводятся результат выполнения. Если есть ошибки, они будут выделены и в этом окне, и в исходном коде теста.

Результат тестирования в Geany

Разноцветный полуночный командир

Популярный в юниксоподобных операционных системах файловый менеджер Midnight Commander можно перекрасить — вдруг кому-то синий цвет не нравится? Я когда-то mc перекрашивал для того, чтоб не путаться в серверах. Каждому серверу — свою раскраску. Делалось это, например, так:

MC_COLOR_TABLE=normal=black,cyan:selected=white,brown:marked=yellow,cyan:markselect=yellow,brown:menu=brightcyan,brown:menusel=black,white:menuhot=yellow,brown:menuhotsel=yellow,white:executable=brightgreen,cyan:directory=white,cyan:link=blue,cyan:stalelink=brightred,cyan:device=magenta,cyan:special=brightblue,cyan:core=red,cyan:editnormal=black,cyan:editbold=brightcyan,green:editmarked=white,brown
export MC_COLOR_TABLE
mc

Прошли годы, сейчас стало всё гораздо проще: через меню теперь можно выбрать нужный внешний вид: F9 → Options → Appearance — и можно выбирать из двадцати восьми вариантов

Меню в Midnight Commander

А можно перекрасить во что-нибудь своё: для этого надо взять ini-файл из /usr/share/mc/skins, скопировать к себе, перекрасить, а потом подсунуть его миднайт командеру:

mc -S path/to/file.ini

Если терминал способен показывать 256 цветов, то можно и mc научить их показывать, указывая их по номеру: от color16 до color231 — эти 216 цветов совпадают с безопасной веб-палитрой (кто-то помнит ещё про такую?), то есть по 6 градаций яркости на каждый компонент — красный, синий и зелёный. Чтоб не рыться в таблицах с кодами цветов, можно указывать цвет синонимами — от rgb000 до rgb555. Оттенков серого побольше — их двадцать четыре, от чёрного gray0 до белого gray23, причём чёрный gray0 в отличие от обычного black не становится серым при добавлении к нему жирности. Результат может быть, например, таким:

Сине-зелёный mc с серым меню

Подробно о раскрашивании mc в 256 цветов написано в комментариях в файле /usr/share/mc/skins/sand256.ini, а судя по тому, что лежит на гитхабе, кое-кто, раскрашивая mc, указывает цвета, выбирая из 16 миллионов — уже существуют TrueColor-скины. И это хорошо 🙂

Как засунуть имиджмеджиком растровые картинки в PDF нужного размера

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

convert *png result.pdf

то результат может и не понравиться. Путём экспериментов с найденным на всяких форумах кодом получился такой рецепт для преобразования в PDF размером 210×297 мм (A4) кучи растровых файлов, отсканированных с разрешением 600 точек на дюйм

convert *png -units pixelsperinch -density 600 -resize 100% \
 -gravity center -background white -extent 4960x7016 result.pdf

размер растровых файлов не меняется, они располагаются в центре получившихся страниц.

PDF-файл с разным заполнением страниц

Из Лилипонда в Музскор

Из всего, в чём доводилось набирать ноты последние лет двадцать, самые красивые получаются в Лилипонде — там и шрифт хороший (хотя Bravura ещё лучше), и расположение нот на листе достаточно компактное. Но в MuseScore набирать проще плюс можно услышать любую ноту да и все изменения видны сразу — не надо ждать, пока компиляция завершится. Лет десять назад MuseScore, как и Denemo, можно было использовать лишь для предварительного набора — сборку и доводку приходилось делать в Лилипонде, потому что Музскор не способен был нормально расставить ноты по странице. Со временем Музскор улучшился — теперь его можно использовать для всего процесса — до самого конца — вывода на печать или в готовый PDF-файл.

И встал вопрос открытия лилипондовых файлов Музскором — нынешние его версии умеют работать с MusicXML, но формат Лилипонда не понимают совсем. Сам же LilyPond умеет читать всякое (точнее, в его состав входит скрипт на питоне, перегоняющий в формат Лилипонда ноты из MusicXML, ABC, MIDI и, вроде, ETF), но выводить в это всякое не желает.

Поэтому воспользуемся сторонним ПО. Например, выяснилось, что Frescobaldi умеет экспортировать ноты в формат MusicXML, но по умолчанию эта возможность в нём отключена. Включить можно в настройках: Edit → Preferences → Generap Preferences → Enable experimental features.

Настройки Frescobaldi

После перезапуска Фрескобальди в его меню File → Export можно найти пункт Export to MusicXML. А уж MusicXML можно открыть и в Музскоре, который будет ругаться на на корявость файла,

Сообщение о невалидном XML

Сообщение о повреждённом файле

но всё равно (если повезёт?) его откроет

MuseScore — результат импорта

Вместо экспорта через Frescobaldi можно с командной строки использовать python-ly:


ly musicxml solo.ly -o solo.musicxml

Результат почти полностью совпадает с тем, что выдаёт Фрескобальди — скорее всего, этот же скрипт и вызывается.