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

Боль-ше де-фи-сов

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

Слипшиеся слоги

В русском тексте с его обилием букв это достаточно часто встречается. Выглядит непривычно, да и авторы набираемых произведений настаивают всё-таки на разделении.

Решение нашлось в LilyPond Snippet Repository — переопределив значение свойства LyricHyphen.minimum-distance, можно добиться не только увеличения дистанции между слогами, но и принудительной расстановки дефисов — такое переопредение можно засунуть прямо в блок с текстом:

choirVerse = \lyricmode {
  \override LyricHyphen.minimum-distance = #0.5

  Да не у -- мрёт ни с_на -- ми, ни по -- том

Результат — появились дефисы:

Слоги разделены дефисами

Если вместо 0.5 указать значение побольше, слоги разойдутся дальше.

Edwin — очередной потомок Школьной

В состав нотного редактора MuseScore начиная с версии 3.6 входит шрифт Edwin — он используется для текста по умолчанию и неплохо выглядит в латинской части — всё-таки она даже в страшненьких свободных вариантах шрифта, скопированного с New Century Schoolbook, была нормальной, чего не скажешь о кириллице — во входящем в состав GhostScript шрифте Century Schoolbook L она была вообще ужасна.

В Эдвине кириллицу слегка подправили — иногда ноты с ней смотрятся вполне терпимо, особенно если там нет букв З и Э. С дореволюционной кириллицей ситуация хуже: буква ять — только строчная, да и та страшная, ижица в курсиве смотрится странновато.

Ноты с шрифтом Edwin

Для современных нот этот шрифт использовать уже можно (если не сильно всматриваться в детали), для дореволюционных — ещё нѣтъ.

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

Если собирать Имиджмеджиком многостраничный 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 — мегабайт десятичный, по системе СИ.

Больше нот!

Семь лет назад я замерял скорость нотного набора, когда используешь LilyPond — на простых хоровые нотах без аккомпанемента получалось около 0,8 листа в час. С аккомпанементом, как я предполагал, скорость должна была упасть ещё в несколько раз.

Сейчас набираю в MuseScore — он становится всё лучше и лучше. Попутно и трудозатраты отмечаю — привык делать это после некоторых работ, где оплачивалось потраченное время. Получается около одного листа в час (уточнение после изучения отчёта — а иногда и полтора, то есть три листа за два часа), причём с аккомпанементом. Без аккомпанемента, вроде, раза в три быстрее. Но вывод из таких замеров остаётся прежним — программирование оплачивается более щедро и набор нот можно оставить лишь в роли хобби, а не основного заработка.

Как добавить флаги в меню выбора языков Google Translate

Google Translate знает много языков. Очень много. И выбирать их только мышкой без помощи клавиатуры сложновато — из-за большого количества выглядящих похожим образом элементов трудно быстро найти нужный, не тратя время на чтение всех названий.

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

Существуют браузерные дополнения, позволяющие задавать свои стилевые правила для конкретных сайтов — для Firefox, Google Chrome и других брауеров, основанных на Chromium, это делает Stylebot. Попробуем добавить стилевые правила для отдельного пункта — укажем не только иконку (пусть будет флаг), но и цвет:

div[data-language-code="lt"] div.Llmcnf {
  color: #060;
}

div[data-language-code="lt"] div.Llmcnf:before {
  content: "🇱🇹";
  padding-right: .25em;
}

Стало гораздо заметнее:

Как долго в Google Translate будет использоваться название класса Llmcnf — не возьмусь предсказывать, но пока такой метод работает и работает уже не первую неделю.

Если помечать таким образом не все языки, а только нужные, их найти будет достаточно легко — например, раньше я всё время очень долго искал немецкий, потому что искал не German, а Deutsch — теперь же вижу его сразу:

Re: Как сдвинуть одинокую вершину

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

digraph G {
    graph [ rankdir=LR ]
    node [ shape=box, fontname="PT Mono", fontsize=32 ]

    subgraph cluster_values {
        color=blue
        style="rounded,dashed"

        "'value'" [ fontcolor=grey, color=grey ]
        42
    }

    name [ shape=cds, style=filled, fillcolor=wheat ]
    name -> 42
}

Попутно обнаружился ряд интересных моментов:

  1. Имя субграфа должно начинаться со слова cluster для того, чтобы можно было его раскрасить и подписать. Если не будет, то параметры style, color, fillcolor, label и аналогичные будут проигнорированы.
  2. Если субграф используется только для группировки вершин, а отображать его совсем не надо, можно дать ему любое имя, но в таком случае надо добавить параметр rank=same для того, чтобы вершины выстроились рядом.

Концы строк в LibreOffice

Writer — текстовая часть пакета LibreOffice — аналог Microsoft Word — имеет странную особенность: если поставить в диалоге замены галочку «Регулярные выражения», то выражение \n будет иметь разное значение в зависимости от того, где его написать: в строке поиска оно соответствует переводу строки ↲, вставляемому сочетанием клавиш Shift+Enter, но в строке замены это же самое будет уже концом абзаца ¶, который вставляется одиночным нажатием клавиши Enter.

Как же заменить концы абзацев на переводы строк?

На форуме по LibreOffice нашёлся рецепт:

  • Вводим где-нибудь перевод строки (Shift+Enter), копируем его в буфер обмена
  • Вызываем диалог поиска и замены клавишами Ctrl+H либо через меню: Edit → Find & Replace
  • В поле Search for пишем $
  • Раскрываем при необходимости группу параметров Other options и отмечаем там Regular expressions
  • Нажимаем кнопку Find All — выделятся концы абзацев, закрываем диалоговое окно
  • Вставляем из буфера переводы строк
диалог поиска и замены

Я проверил в LibreOffice 6.1.5.2 — работает.

Добавление существующего git-хранилища на GitHub

Иногда код, хранимый локально, дорастает до состояния, что его уже можно выложить на GitHub. Конечно же, с сохранением уже накопленной истории изменений. Если установлен gh — клиент для Гитхаба с интерфейсом командной строки, то решить такую задачу будет просто: достаточно зайти в каталог с существующим кодом, создать командой gh repo create новое GitHub-хранилище — оно автоматически будет указано в качестве удалённой ветки (remote branch) — после этого останется отправить всё наружу командой git push origin master (да, git всё-таки ещё главную ветвь называет мастером, а не main). То есть, достаточно всего двух команд.

path/to/code$ gh repo create slide-python --public -d 'Slides for Python classes'
? This will create 'slide-python' in your current directory. Continue? Yes
✓ Created repository shoorick/slide-python on GitHub
✓ Added remote git@github.com:shoorick/slide-python.git
path/to/code$ git remote -v
origin git@github.com:shoorick/slide-python.git (fetch)
origin git@github.com:shoorick/slide-python.git (push)
path/to/code$ git push origin master
Enumerating objects: 370, done.
Counting objects: 100% (370/370), done.
Delta compression using up to 4 threads
Compressing objects: 100% (368/368), done.
Writing objects: 100% (370/370), 832.24 KiB | 13.87 MiB/s, done.
Total 370 (delta 249), reused 0 (delta 0)
remote: Resolving deltas: 100% (249/249), done.
To github.com:shoorick/slide-python.git
[new branch] master -> master

Как сдвинуть одинокую вершину

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

digraph G {
    graph [ rankdir=LR ]
    node [ shape=box, fontname="PT Mono", fontsize=32 ]

    name [ shape=cds, style=filled, fillcolor=wheat ]
    name -> 42

    "'value'" [ fontcolor=grey, color=grey ]
}
Вершина value находится слева

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

none -> "'value'"

Сделаем невидимым ненужное ребро:

none -> "'value'" [ style=invis ]
Невидимое ребро

и ненужную вершину — тоже. После этого получится именно то, что надо:

none [ style=invis ]
Вершина value сдвинута вправо