Архив за месяц: Ноябрь 2014

Как не замусоривать экран при совершении 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 ":||" #'(":||" "" "")), то тактовые черты будут идти только внутри нотного стана, не выходя за его пределы, даже если для группы нотных станов задано использование общих черт:

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

Из-под отладчика

В перловых скриптах (во всяком случае, в тех, что запущены в юниксоподобных системах) определить, запущены ли они из-под отладчика, достаточно просто — надо проверить, существует ли переменная окружения PERLDB_PIDS:

my $DEBUG = exists $ENV{PERLDB_PIDS};

Однако в отладчике, встроенном в Komodo IDE 8.5, такой способ не работает — вместо PERLDB_PIDS устанавливается другая переменная PERL5DB со значением, например, BEGIN { require '/opt/komodo/lib/support/dbgp/perllib/perl5db.pl' }. А в штатном отладчике переменной PERL5DB нет. Значит, надо проверять обе:

my  $DEBUG
    =  exists $ENV{PERLDB_PIDS}
    || exists $ENV{PERL5DB};

update/20.11.2014: И снова товарищи подсказывают — есть переменная $^P. Проверил — работает везде.

В Сыктывкар и в Мурманск

Недавно Тёма Лебедев писал о том, что гугл отслеживает положение владельцев андроидофонов (тоже мне, удивил — это давно известно), затем тов. Ведмедь написал про то же самое.

Решил я посмотреть, что ж гугл узнал о моих шатаниях, глянул на карту — а там вончо:

Карта

Гугл с какого-то перепугу решил, что меня заносило в Сыктывкар и в Мурманск. Врёт.

Смотрим размер файла в бесконечном цикле

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

Сделал по-быстрому скрипт, который просто вызывает wc и выводит его результат, пока пользователю не надоест и он не нажмёт Ctrl+C

#!/usr/bin/perl

print STDERR "Press ^C to exit\n";
my $cmd_line = 'wc ' . join ' ', @ARGV;
my $out;
while (1) {
    $out = `$cmd_line`;
    chomp $out;
    print "\cM$out";
    sleep 1;
}

Запустить можно, например, так:

wcloop -l some-big-file.txt

update/19.11.2014: Мне подсказали пару других, более изящных методов:

Командой watch:

watch -n 1 wc -l ФАЙЛ

Без watch, циклом на баше:

while true; do wc ФАЙЛ | tr '\n' '\r'; sleep 1; done

Темп над пустым тактом

Обнаружил глюк в лилипонде: он не даёт поставить изменение темпа над пустым тактом.

Ноты

Задача — поставить в нотах изменения темпа — ritenuto и какой-нибудь ещё. С каким-нибудь ещё проблем не возникает — LilyPond спокойно принимает команду

\tempo "Медленнее"

А вот с ритенуто такой способ не проходит: я пробовал менять способ записи паузы: вместо R8*9 писал s8 r1, пробовал сдвигать команду изменения темпа в фортепианную партию (это не должно влиять на то, где отображается темп — всегда сверху) — не помогает: в лучшем случае ритенуто пропадает, в худшем — часть нот сдвигается по горизонтали и в партитуре начинается хаос.

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

R8*9^\markup { \bold "riten." }

Такой способ работает.

Снова к нам

Нижегородцы Павел Юдин и Олег Новосельцев (театр бардов «Грань») в декабре снова приедут на Южный Урал:

  • 4 декабря — Усть-Катав,
  • 5 декабря — Миасс,
  • 6 декабря — Челябинск, улица Свободы, 155 — зал Профцентра,
  • (ещё под вопросом) 7 декабря — Шадринск.

Павел Юдин и Олег Новосельцев