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

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

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

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

Как увеличить отступ одной строки в MuseScore

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

  • Через меню: A̲dd → F̲rames → Insert Horizontal Frame вставит фрейм перед текущим тактом;
  • A̲dd → F̲rames → Append Horizontal Frame — после текущего;
  • Команду Insert Horizontal Frame можно найти и в палитрах инструментов: и в обычной, вызываемой клавишей F9, и в мастер-палитре (Shift+F9) в разделе Frames & Measures.
    Insert horizontal frame

Фрейм вставляется перед всей группой нотных станов — нет нужды двигать каждый нотный стан.

Отступ в MuseScore

Счётчики в углу

Случается, что сложные партитуры я набираю в каком-то странном порядке: то из одной партии кусочек, то из другой. Чтоб не забывать, где остановился, сам себе придумал небольшой lifehack — записывать номера последних набранных тактов прямо в нотах и лучше всего — в левом верхнем углу, чтоб быстрее найти можно было.

Счётчики

Попробую на практике — может быть, приживётся…

Переключение окон в mc

Midnight Commаnder позволяет переключаться между панелями и окнами редатора и просмотра — в меню F9 → C̲ommand есть пункт Screen list̲ M-` — эта же клавиатурная команда работает и в редакторе mcedit (хотя в меню там нет такого пункта), и в просмотрщике (хотя там вообще нет меню). Сочетания клавиш LWin+` (точнее, Meta+`) и LAlt+` третий гном по умолчанию использует для переключения окнами одного приложения (хотя некоторые приложения поддерживают ещё и традиционное Ctrl+Tab), так что мне в терминале доступен лишь один способ ввести M-` — нажать и отпустить по очереди Esc и `

В командной строке эти клавиши не работают — для возврата к синим панелям оттуда есть традиционное сочетание Ctrl+O.