Все записи автора Shoorick

Надо ругаться в боевом режиме

В состав перлового микрофреймворка Mojolicious::Lite входит класс Mojo::Log, который не просто пишет сообщения в лог, а ещё и учитывает важность сообщений — в отладочном режиме пишет много, а боевом — мало. Обнаружилось, что сообщения об ошибках имеют тот же класс debug, что и остальные сообщения

[Tue Nov 13 12:25:51 2018] [debug] Format html
[Tue Nov 13 12:25:51 2018] [debug] 200 OK (0.076118s, 13.137/s)
[Tue Nov 13 12:25:53 2018] [debug] GET "/some/url"
[Tue Nov 13 12:25:53 2018] [debug] Template "not_found.development.html.ep" not found
[Tue Nov 13 12:25:53 2018] [debug] Rendering template "not_found.html.ep"
[Tue Nov 13 12:25:53 2018] [debug] Rendering template "layouts/error.html.ep"
[Tue Nov 13 12:25:53 2018] [debug] Rendering cached template "layouts/admin.html.ep"
[Tue Nov 13 12:25:53 2018] [debug] Rendering cached template "search_form_navbar.html.ep"
[Tue Nov 13 12:25:53 2018] [debug] Format html
[Tue Nov 13 12:25:53 2018] [debug] 404 Not Found (0.004841s, 206.569/s)

из-за чего при запуске в продакшне под реальной нагрузкой в лог не попадает почти ничего — например, там нет сообщения об ошибках 404 Not Found.

Возможно, где-нибудь во внутренностях Mojo можно исправить такую ситуацию, но мы пойдём другим путём — применим хук after_dispatch:


hook after_dispatch => sub {
    my $self = shift;
    my $req  = $self->req;
    my $res  = $self->res;

    if ( $res->code >= 400 ) {
        $self->app->log->error(join ' ',
            '"' . $req->method . ' ' . $req->url . '"',
            $res->code,
            $req->headers->referrer || '-',
            '"' . $req->headers->user_agent . '"',
        );
    }
};

after_dispatch

Результат — в логе появились сообщения об ошибках:

Sending children hup signal
[Tue Nov 13 12:30:46 2018] [error] "GET /none" 404 - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
[Tue Nov 13 12:44:50 2018] [error] "GET /SW/Rplayer.html" 404 - "Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +http://go.mail.ru/help/robots)"

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

Документация по языку 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, но всё равно компактным и понятным.

Вынимаем фильтр из угла

Ситуация: стиральная машина Hotpoint Ariston AVTL 83 в процессе работы иногда пахнет палёным и в конце концов подыхает — приступаем к разборке.

Для начала можно снять блок с кнопками — он крепится двумя саморезами, расположенными со стороны задней стенки, и снимается достаточно легко — надо приподнять заднюю часть блока и он легко выйдет из зацепления с корпусом машины. Смысл операции — убедиться, что там, вроде, всё в порядке. Можно сразу же поставить на место и прикрутить.

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

Стиральная машина Hotpoint Ariston AVTL 83

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

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

Чтобы извлечь фильтр радиопомех, надо

  1. отцепить провода от выхода,
  2. открутить винт, удерживающий фильтр на задней стенке машины,
  3. толкнуть фильтр вверх — после этого его можно будет  извлечь через квадратное отверстие в задней стенке машины.

Фильтр радиопомех

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

Фильтр радиопомех

и колодка, через которую к фильтру подключены провода

Колодка Колодка

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

Хотя можно поступить проще: сразу позвонить мастеру, объяснить ситуацию — он может и детали добыть, и на место их воткнуть.

Продолжение следует.

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

Багтрекер 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].*');

Не стой под арендо́й

Дендрофобы, вырубившие полтора года назад под свой стеклянный сарай деревья возле памятника Курчатову, заканчивают стройку — забор убран, на сарай повешена табличка с адресом [проспект Ленина, 89а], таблички «Аренда» ещё нет, рядом расставлены знаки «Остановка запрещена» и пасутся эвакуаторы.

Склоняем точнее

Мы стали более лучше одеваться^W^W^W правильнее склонять имена с фамилиями. Вчера вышла свежая версия предназначенного для этого перлового модуля Lingua::RU::Inflect (он же есть и на гитхабе — чуть свеже́е, чем на CPAN).

Фрагмент документации модуля Lingua::RU::Inflect

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

Итак, в новой версии:

  • Закрыты все имевшиеся по состоянию на вчерашний день issues, в том числе
  • Исправлена проблема с экспортом всего возможного оператором — компилятор теперь не ругается на попытку экспортировать функции, убранные в другой модуль.
  • Имена с беглыми гласными (Лев, Павел) и некоторые фамилии на -ец (Песец, Писец, Боец и Отец) стали склоняться правильно — беглая гласная убегает, как ей и положено. Там, где убегать не положено (Швец, Жнец,  Надудеигрец и полный крах, крушение всех надежд — шесть букв, вторая И, но не фиаско) — не убегает.
  • Женские фамилии, оканчивающиеся на -ов, -ёв, -ин, -ий, -ый — похожие на мужские, но всё-таки женские — перестали склоняться.
  • Мужские фамилии, оканчивающиеся на -их и -ых, могут всё-таки склоняться: например, Бултых, Жмых, Отдых, Дитрих, Рерих, Ульрих, Фрейндлих и Эрлих склоняются, а Синих, Серых, Карих, Чёрных — нет.
  • Точнее определяются имена, нехарактерные для русских и не подпадающие под обычное правило: женские оканчиваются на -а и -я, мужские — на согласную. В списки исключений добавлено несколько десятков имён. Определитель теперь знает тюркоязычные и исландские отчества.

В итоге количество ошибок на тестовом наборе данных сократилось в 2–3 раза, до одной ошибки на 200–300 человек — есть неочевидные случаи, потому и оценка приблизительна. Двойные имена и фамилии пока слоняются неправильно — исправлю как-нибудь потом.

Суевериям назло

В 2012 году тринадцатый троллейбусный маршрут закрыли — якобы по просьбам водятлов, которым неудобно было парковаться на узенькой улице Сони Кривой. С тех пор движение троллейбусов по ней было редким — улица использовалась для оборота подвижного состава, возвращающегося с обеда. Вчера тринадцатый маршрут восстановили — он как и раньше идёт в объезд: с перекрёстка Братьев Кашириных × Молодогвардейцев в гору по Молодогвардейцев, затем по трём проспектам — Комсомольскому, Свердловскому, Ленина до парка, а обратно до Свердловского — по Сони Кривой.

 

Почти что Перл с Апачем

Новости географии: в одном люксембургском углу находится никому не известная деревня Шенген, ближайшая к ней железнодорожная платформа, буквально на другом берегу реки — Perl (по-русски всё-таки Перль), это же имя носит и муниципалитет (в других переводах — коммуна), и крупнейший его населённый пункт. А рядом с ними — Apach, но по-русски это не Апач, а, если верить википедии, Апаш, хотя, думаю, немцы могут прочесть и как Апах. При этом все три эти деревни — в разных странах.

Карта

Не летайте над проспектом

Кто едет по проспекту Ленина — будьте внимательны и осторожны: после укладки асфальта ремонт не закончен: сейчас долбят свежеуложенный асфальт вокруг колодцев, а места работ либо огораживают грязно-белыми пластиковыми блоками, либо совсем никак не отмечают — вот, например, на перекрёстке с улицей Володарского нет вообще ничего — чуть не влетел в яму полчаса назад, но всё-таки успел снизить скорость и объехать.
Телефон Управления дорожных работ в Челябинске — +7-351-727-46-26.