Юбилейный хоровой концерт

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

В воскресенье, 11 января в 18 часов в зале камерной и органной музыки «Родина» (Челябинск, улица Кирова, 78) —
концерт вокально-хоровой музыки, посвящённый 75-летию Владимира Александровича Шереметьева.

В концерте принимают участие:

  • Мужской хор русского культурного центра города Челябинска,
  • Академический женский хор «Мечта»,
  • Солисты — ученики детской школы искусств № 1.

Билеты — по 150 рублей — распространяются участниками концерта, и, скорее всего, в кассах их нет.

Губернатор считает, что Ильменку надо проводить в традиционное время на том же месте

Житель Миасса Михаил Пищулин, чья видеозапись ильменского урагана ходила по интернету и ТВ, побывал на очередной встрече блогеров с губернатором (в этот раз меня туда не звали — ну и ладно) и сообщает:

В самом конце, на музыкальной теме, Борис Александрович заявил, что считает правильным в следующем году проводить Ильменский фестиваль, проводить в то же время, проводить в том же месте, но определённым образом подготовить территорию.

Собственные переводы интерфейса OJS

Open Journal Systems — многоязычная система: многие её части могут быть переведены на разные языки. Не все, конечно: например, в материалах статей некоторые поля по странной прихоти разработчиков (или просто по невнимательности) остались одноязычными и добавить в них возможность правильно хранить данные на нескольких языках — не самая простая задача: я, например, так её и не завершил. В версиях 2.4.* нормальной многоязычности статей не будет — возможно, такое положение и объясняет тот факт, что в России OJS не особо популярна — она без применения напильника непригодна даже для тех журналов, где надо всего лишь продублировать имя русского автора статьи латинскими буквами.

С переводом интерфейса дела обстоят чуть получше: переведено может быть почти всё. Но и тут не всё гладко: вместо gettext применяется другой механизм локализации, где ключами служат не фразы на естественном языке (например, английском), а строки вида where.what.someItem. Переводы хранятся в XML-файлах, раскиданных по дереву каталогов. Впрочем, бо́льшая их часть сосредоточена в locale/ и lib/pkp/locale.

Есть два пути внедрения своих собственных переводов: первый, очевидный — отредактировать системные XML-файлы с переводами, плох тем, что при первом же обновлении OJS собственные переводы могут пропасть или вызвать конфликт слияния, если обновление проводится через git. Другой, более правильный — использовать плагин Custom Locale: он позволяет заменить системные переводы своими, не трогая системные файлы. Для того, чтоб заменить какой-либо фрагмент, надо знать ключ, а также файл, где перевод определён. Процесс замены переводов получается таким: сначала ищем, где и как определён нужный текст, затем идём на http://some-ojs-site/journal_name/manager/plugin/generic/customlocaleplugin/edit/ru_RU (если меняем русский текст), ищем в увиденном списке нужный файл, затем пытаемся найти в нём нужный ключ. Поиск там, вроде, есть, но, во-первых, ищет только в пределах текущего файла и умеет искать только точное соответствие с ключом — ничего более. Понятно, что такой интерфейс не нужен: лучше обходиться без него. Плагин хранит изменённые переводы в виде XML-файлов, которые складывает в public/journals/journal_id/customLocale/locale/path, где journal_id — номер журнала, locale — язык в виде язык_СТРАНА, например en_US — американский английский, а path — путь к заменяемым XML-файлам относительно каталога, где установлена OJS.

Пример: некий файл public/journals/1/customLocale/ru_RU/lib/pkp/locale/ru_RU/common.xml заменяет строки из файла lib/pkp/locale/ru_RU/common.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE locale SYSTEM "../../../../../../../../../lib/pkp/dtd/locale.dtd">
<locale name="ru_RU">
	<message key="navigation.about">О журнале</message>
	<message key="navigation.setup">Настройка журнала</message>
	<message key="common.notApplicableShort"> </message>
</locale>

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

Инициализация переменных

Объявлял как-то переменные и присваивал им пустую строку:

my (
    $search_for_name, $search_for_content,
    $action_clean, $action_delete,
    $action_print, $action_print_key,
    $need_help, $need_manual, $verbose
) = ( '' ) x 9;

Надоело при добавлении очередной переменной вручную менять их количество — переписал:

map { $_ = '' } my (
    $search_for_name, $search_for_content,
    $action_clean, $action_delete,
    $action_print, $action_print_key,
    $need_help, $need_manual, $verbose
);

Так тоже работает :-)

Минус ёлки

Недели три назад заметил, что во дворе дома номер 3 по улице Лесопарковой валяются свежеспиленные голубые ели: одна лежит между детсадовской площадкой и учебно-спортивным корпусом ЮУрГУ, другая — возле северо-западного угла площадки, ближе к жилому дому, третья — возле мусорки. Ёлки до сих пор валяются. Как многие месяцы валялись деревья, поваленные летними бурями.

Пройдя по улице Сони Кривой, я заметил сначала относительно свежие пни возле дома номер 83, там где Subway и пункт выдачи «Связного». Но потом понял — искать надо ближе: сразу через дорогу от места, где ёлки валяются — возле недавно построенного дома номер 5 по Лесопарковой: там пеньки и обнаружились.

Парковка без ёлок

Поэтому есть ряд вопросов:

  • Ёлки, скорее всего, являлись собственностью города и городу нанесён ущерб. Кто ответит за его нанесение? Кто возместит ущерб?
  • Почему в течение многих месяцев во дворе и валяются деревья и висят в воздухе, создавая опасность для людей? Кто обязан следить за состоянием двора дома номер три по Лесопарковой?

Как не замусоривать экран при совершении HTTP-запросов средствами модуля Net::Curl::Easy

Чисто перловые HTTP-клиенты, включая широко известный модуль LWP — не самые быстрые, что вполне логично. Гораздо быстрее работают, например, те модули, что используют cURL. В одном из рабочих проектов понадобилось ускорить чтение из сети — это оказалось узким местом. Я проверил — действительно, cURL работает шустрее, чем LWP, при этом к cURL в перле есть несколько интерфейсов. Результаты моего замера вышли такими:

                    Rate     LWP WWW::Curl::Simple   Net::Curl::Easy
LWP                474/s      --              -38%              -88%
WWW::Curl::Simple  760/s     60%                --              -82%
Net::Curl::Easy   4115/s    768%              441%                --

(под LWP здесь понимается LWP::UserAgent).

Шустрый LWP::Curl выбыл из соревнования, потому что я не нашёл, как в нём добавить нужный заголовок к HTTP-запросу. Был проверен ещё и WWW::Curl::Easy — он показал ту же скорость, что и Net::Curl::Easy, вывалив при этом кучу предупреждений — так что он тоже выбыл из забега.

Однако при проведении замера я столкнулся со странным поведением Net::Curl::Easy — при выполнении метода perform на экран (точнее, в STDOUT) иногда выводились полученные данные. Выяснилось, что правильный способ запуска описан в руководстве не на Net::Curl::Easy, а на WWW::Curl — надо не только выполнить запрос, но и указать до выполнения запроса, куда писать полученное содержимое:

# A filehandle, reference to a scalar
# or reference to a typeglob can be used here.
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

В Net::Curl::Easy это тоже сработало.

Уфимский автор-исполнитель Виктор Кузьменко выступит 3 декабря с концертом в Челябинске

Константин Просеков пишет:

Концерт известного Уфимского барда и поэта Виктора Кузьменко в Челябинске.
3 декабря 2014 года, 19:00, кинотеатральный зал для детей и молодежи «Спартак» — проспект Ленина, 19 (ост. «Горки») 200 р.

Афиша

Продолжает Михаил Богуславский:

Виктор Кузьменко не подобен метеору. Он не ворвался с шумом и треском в мир бардовской песни. Виктор входил постепенно, аккуратно, застолбив за собой этапы творческого пути. Рос он, росли его песни, росло влияние барда на читающую и слушающую публику. Немало для этого сделал вышедший в 2008 году поэтический сборник «Недосказанные слова».
Так кто же он, Виктор Кузьменко?

Виктор Александрович Кузьменко родился 13 июня 1956 года в городе Кутаиси. В Уфе живёт с 1963 года. С 1979 по 1985 жил и работал в Казахстане, в городе Ермак. Первые песни написаны в этот период.

С авторской песней познакомился в 1986 году в Уфе в клубе «Тургай» (ныне «Сентябрь»). В 1986–1987 годах — лауреат городских фестивалей. В 1987 году стал дипломантом фестиваля имени Валерия Грушина.

Стихи Виктора публиковались в газетах «Ленинская смена» (Алма-Ата), «Путь» (Ермак), журнале «Бельские просторы» (Уфа).

У каждого зрителя свои любимые песни. Мои любимые: «Зелье приворотное», «Калина-ягода», «Осенние костры», «Караван», «Сентиментальная песня», «Пароходик».

Виктор уже удостоен высшей степени признания зрителя. Его песни, попали в список народных. И в электричках «жалистно» распевая «Калину-ягоду», обещают «урыть», каждого, кто утверждает, что знаком с автором этой «народной» песни. Право, есть ли признание выше?

Как добавить обозначение инструмента не перед первым нотным станом

LilyPond умеет, как и многие другие попадавшиеся мне нотные редакторы, указывать название инструмента либо голоса слева от нотного стана. Доступны два варианта именования нотного стана: полный, задаваемый параметром instrumentName применяется у самого верхнего нотного стана в партитуре (или у их группы), сокращённый shortInstrumentName — у всех остальных. В отечественных хоровых нотах нередко ставят только сокращённые наименования партий возле верхней группы нотных станов (если вообще ставят), а возле остальных групп не ставят ничего.

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

Однако можно сменить название партии в любой момент, не только при описании нотного стана (\new Staff), но и в произвольном месте:

% 25
\voiceOne
\set Staff.shortInstrumentName = "Б."
e4 e8 f f f
\set Staff.shortInstrumentName = ""

Результат:

Ноты — смена обозначения партии

Задание собственных обозначений для тактовых черт

Набирал ноты с репризой и двумя обычными тактовыми чертами — написал код \bar ":||" — не получил желаемое. Более того — тактовая черта вообще пропала. Похоже, в лилипонде нет такого сочетания тактовых черт (что странно — там же есть и двойные черты, и сочетания знака репризы с тонкой и толстой чертой). Не беда — можно нужный знак определить и потом его использовать:

\defineBarLine ":||" #'(":||" "" " ||")
% ...
\bar ":||"

Результат:

Двойная тактовая черта с репризой

Если же в определении тактовой черты не указать параметр span (точнее, оставить его пустым — \defineBarLine ":||" #'(":||" "" "")), то тактовые черты будут идти только внутри нотного стана, не выходя за его пределы, даже если для группы нотных станов задано использование общих черт:

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