Иконки в пятом либреофисе

Пятой версией пакета LibreOffice, когда она запущена в девятом дебиане, где по умолчанию стоит третий Гном и тема оформления Adwaita, пользоваться неудобно — в меню без иконок легко запутаться, а прошлогодний рецепт по их возвращению не помогает. Оказалось, у советских — собственная гордость^W^W^W^W в LibreOffice применяются свои собственные настройки — T̲ools → O̲ptions (Alt+F12)

Настройки LibreOffice

По умолчанию установлено автоматическое отображение либо скрытие иконок и в моём случае это всё-таки скрытие. Если их включить — менюшки станут удобнее — и основное меню поменяется, и контекстные.

Меню

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

Правильный тип для офисных файлов

Перловый микрофреймворк Mojolicious::Lite умеет сам выдавать существующие файлы, но при этом не все из них получают верный тип содержимого Content-type: некоторые файлы прикидываются обычными текстовыми (text/plain), другие же вообще не имеют никакого типа — браузер такие файлы может воспринимать как угодно. В состав фреймворка входит модуль Mojolicious::Types, в котором определены MIME-типы для наиболее популярных (most common) расширений файлов:

appcache -> text/cache-manifest
atom     -> application/atom+xml
bin      -> application/octet-stream
css      -> text/css
gif      -> image/gif
gz       -> application/x-gzip
htm      -> text/html
html     -> text/html;charset=UTF-8
ico      -> image/x-icon
jpeg     -> image/jpeg
jpg      -> image/jpeg
js       -> application/javascript
json     -> application/json;charset=UTF-8
mp3      -> audio/mpeg
mp4      -> video/mp4
ogg      -> audio/ogg
ogv      -> video/ogg
pdf      -> application/pdf
png      -> image/png
rss      -> application/rss+xml
svg      -> image/svg+xml
txt      -> text/plain;charset=UTF-8
webm     -> video/webm
woff     -> font/woff
woff2    -> font/woff2
xml      -> application/xml,text/xml
zip      -> application/zip

странно, но среди них нет ни одного, относящегося к офисным пакетам. На сайте Microsoft | Developer можно найти список типов — Office 2007 File Format MIME Types for HTTP Content Streaming. Чтобы не задумываться, какие же из этих типов брать, можно сохранить все — если есть какой-нибудь конфигурационный файл, он вполне подойдёт для хранения такого списка. В моём случае конфигурационные файлы обычно в формате YAML — это удобно.

---
# ... ещё какие-нибудь параметры

# MS Office types
types:
    rtf:    application/rtf
    doc:    application/msword
    dot:    application/msword
    docx:   application/vnd.openxmlformats-officedocument.wordprocessingml.document

Где-нибудь перед запуском приложения надо добавить типы (допустим, конфигурация приложения доступна через $config)

while ( my ( $ext, $type ) = each %{ $config->{'types'} } ) {
    app->types->type($ext => $type);
}

Правда, при выдаче файла тип его содержимого придётся всё-таки указать явно, иначе Mojolicious вернёт тип только для знакомых файлов, а для офисных будет undef

my $type = $self->app->types->mapping->{$ext}->[0];
if (my $asset = $self->app->static->file("/$path/$id.$ext")) {
    $self->res->headers->content_type($type);
    return $self->reply->asset($asset);
}
else {
    return $self->reply->not_found;
}

Теперь и офисные файлы возвращаются нормально.

В шрифте дорожных знаков всё больше нерусской кириллицы

В шрифте советских дорожных знаков теперь есть не только все предусмотренные стандартом ГОСТ 10807-78 латинские буквы, но и достаточно большое число кириллических — 88 процентов.

Рәхим итегеҙ!

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

Регистрозависимая сортировка

Линуксовая команда sort (во всяком случае, в Ubuntu 16.04 LTS) почему-то сразу сортирует без учёта регистра, хотя такое поведение должно включаться специальным ключом -f либо --ignore-case. Ключа --no-ignore-case для выключения такого поведения нет. Выход — сортировать перловым однострочником


perl -0777 -ne 'print join "\n", sort split "\n"'

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

В состав перлового микрофреймворка 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].*');