?

Log in

No account? Create an account

Категория: it

Прибито гвоздём
  1. Всё, написанное здесь ниже — личное мнение автора либо цитата, что указывается явно. Редакция автор в переписку вступает (например, посредством комментов), однако рукописи не рецензирует и не всегда возвращает. Автор предпочитает писать и читать на русском языке, хотя может (или когда-то мог) на английском, немецком, перле, пхп, яваскрипте, C/C++, ассемблере процессора Intel 8086, бейсике, паскале, а также на ЯП ПМК «Электроника МК-52». В изучении иврита, итальянского, китайского, литовского, питона, руби, татарского, форта, французского и эсперанто автор пока не преуспел.
  2. Анонс:
  3. В записях используются метки — используйте их для поиска нужной темы.
  4. Основной адрес этого блога — shoorick.ru (с октября 2013). В ЖЖ — копия. Помимо ЖЖ транслируется в:
  5. Этот блог не является средством массовой информации.
  6. Используемые обозначения:
    • цитаты и фрагменты программного кода
    • программный код
    • клавиатурный ввод
    • аббревиатуры и другие сокращения

Тестирование в моджо — только через прув
Рыжий
shoorick

Из перлового веб-фреймворка Mojolicious начиная с вышедшей ровно четыре месяца назад версии 8.0 убрана команда test

попытка выполнить тест

Теперь вместо этой команды надо использовать prove.

http://shoorick.ru/2019/01/15/mojo-no-test/
Метки: , ,

Разрешаем Имиджмеджику делать PDF
Рыжий
shoorick

ImageMagick позволяет собирать многостраничный PDF-файл из нескольких растровых картинок, но не всегда — на некоторых компьютерах выдаёт ошибку

convert: not authorized `result.pdf' @ error/constitute.c/WriteImage/1028.

Причина — в том, что в конкретном экземпляре может быть запрещено создавать PDF, но есть рецепт, как это исправить: в файле /etc/ImageMagick-6/policy.xml надо включить нужное разрешение — строку

<policy domain="coder" rights="none" pattern="PDF" />

надо заменить на 

<policy domain="coder" rights="read|write" pattern="PDF" />

После этого PDF-файл будет нормально создаваться.

Теперь осталось понять, почему же готовый файл вдвое тяжелее суммы исходных. Добавление в команду преобразования параметров -dither none -colors 2 на размер готового файла практически не влияет.

http://shoorick.ru/2018/12/19/magick-allow-pdf/

Вместо себя
Рыжий
shoorick
Есть ненулевая вероятность того, что приближающийся 2019 год будет для моей семьи не таким, как сейчас и я в силу разных причин не смогу быть там, где сначала лет пять играл и слегка учился, потом ещё пять серьёзно учился и слегка работал, а потом ещё почти двадцать серьёзно работал — в крупнейшем на ближайшие несколько областей университете. Я, конечно, последние несколько лет стараюсь достаточно подробно документировать рабочие процессы и коллеги, надеюсь, разберутся, но лучше бы найти ещё кого-то вместо себя, чтобы хозяйство не развалилось без присмотра.

Итак, нам нужен программист. Живьём на полный рабочий день (понедельник—пятница с 8:30 до 17). Требования и пожелания:
  • Высшее образование, желательно профильное (ЭВМ, прикладная математика, информатика, какие-нибудь информационные системы в чём-нибудь); практика показывает, что у нас можно работать, даже имея квалификацию «филолог» или «учёный-агроном», но оформление такого сотрудника — тот ещё квест, так что лучше, чтоб образование было соответствующим.

  • Знакомство с веб-технологиями: начиная с HTML, CSS (желательно с препроцессорами LESS и SASS) и до установки/настройки/обслуживания/допиливания CMS (желательно иметь опыт хотя бы с одной из тройки лидеров: WordPress, Joomla, Drupal).

  • Навыки веб-программирования — хорошее владение хотя бы одним из языков, применяемых на стороне сервера (бэкенд) — в первую очередь PHP и Perl. Ruby, Python — тоже неплохо, это лучше, чем ничего. Знание JavaScript (фронтенд). Адекватное применение фреймворков и библиотек. Способность соблюдать рекомендации по стилю кодирования (см. например, перловые perlstyle и Perl Best Practice, пхпшные PSR), а также писать документацию к своему коду.

  • Опыт работы в юниксоподобных ОС — хотя бы на минимальном уровне: взять терминал, прицепиться к серверу и ничего там не сломать. Если есть опыт конфигурирования Apache, nginx — будет плюсом. Способность не пугаться многомегабайтных логов, а спокойно извлекать из них нужную информацию штатными системными утилитами — тоже пригодится.

  • Опыт в программировании общего назначения, не обязательно связанного с вебом. Знание bash и хотя бы одного из популярных скриптовых языков (Perl, Python). Желание автоматизировать то, что не надо делать вручную.

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

  • Использование систем контроля версий (subversion, git) и багтрекеров (например, Redmine). Если есть код, опубликованный на github/bitbucket или ответы на stackoverflow — хорошо.

  • Способность грамотно излагать мысли в письменном виде по-русски и понимать написанное другими. То же самое, хотя бы на минимальном уровне — по-английски (кстати, сотрудники университета могут посещать бесплатные курсы английского и в перспективе дойти до сдачи IELTS или TOEFL).

Больше перловой документации!
Рыжий
shoorick
Документация по языку Perl и его модулям теперь доступна и на perldoc.pl, только оно без прокси не работает, ибо заблокировано роскомпозором. Точнее, заблокирован IP-адрес (IPv4, конечно), на котором сидит этот сайт. И lilypond.org без прокси не откроется, и toggl.com, и oEmbed.com...

http://shoorick.ru/2018/11/06/more-perldoc/

Инструменты разные — методы похожие
Рыжий
shoorick
Попробовал решить одну из рабочих задач, применив нелюбимый язык 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, но всё равно компактным и понятным.

http://shoorick.ru/2018/10/24/slim-php/

Re: Кросспроектное связывание коммитов с задачами в Редмайне
Рыжий
shoorick
Привязать редмайновую задачу с заданным номером ко всем коммитам, в комментариях к которым есть этот номер, можно запросом

SET @issue_id = 1234;
    
INSERT IGNORE INTO changesets_issues
SELECT 
    id, @issue_id
FROM
    changesets
WHERE
    comments REGEXP CONCAT('.*#', @issue_id, '[^0-9].*');

Кросспроектное связывание коммитов с задачами в Редмайне
Рыжий
shoorick
Багтрекер 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 — ссылки появятся при ближайшем посещении страниц.

Добавка/12.10:
Привязать редмайновую задачу с заданным номером ко всем коммитам, в комментариях к которым есть этот номер, можно запросом

SET @issue_id = 1234;
    
INSERT IGNORE INTO changesets_issues
SELECT 
    id, @issue_id
FROM
    changesets
WHERE
    comments REGEXP CONCAT('.*#', @issue_id, '[^0-9].*');


http://shoorick.ru/2018/10/11/redmine-link-issue-changeset/
Метки: , , ,

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

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

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

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

  • Закрыты все имевшиеся по состоянию на вчерашний день issues, в том числе

  • Исправлена проблема с экспортом всего возможного оператором use Lingua::RU::Inflect ':all' — компилятор теперь не ругается на попытку экспортировать функции, убранные в другой модуль.

  • Имена с беглыми гласными (Лев, Павел) и некоторые фамилии на -ец (Песец, Писец и Отец) стали склоняться правильно — беглая гласная убегает, как ей и положено. Там, где убегать не положено (Швец, Жнец, Надудеигрец и полный крах, крушение всех надежд — шесть букв, вторая И, но не фиаско) — не убегает.

  • Женские фамилии, оканчивающиеся на -ов, -ёв, -ин, -ий, -ый — похожие на мужские, но всё-таки женские — перестали склоняться.

  • Мужские фамилии, оканчивающиеся на -их и -ых, могут всё-таки склоняться: например, Бултых, Жмых, Отдых, Дитрих, Рерих, Ульрих, Фрейндлих и Эрлих склоняются, а Синих, Серых, Карих, Чёрных — нет.

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


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

http://shoorick.ru/2018/10/05/inflect-006/

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

Карта

http://shoorick.ru/2018/09/28/perl-apach/

Дорогой язык
Рыжий
shoorick
Вышел отчёт по собранным Мойкругом зарплатам на середину 2018 года — https://vc.ru/flood/43849-zarplaty-it-specialistov-na-seredinu-2018-goda

В отчёте есть график, показывающий зависимость программистских доходов от используемых языков:

График

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

http://shoorick.ru/2018/09/07/gainful-language/

Тестирование перловых mojolicious-приложений в Geany
Рыжий
shoorick
Программировать, используя какую-нибудь могучую интегрированную среду разработки (IDE) — хорошо и зачастую удобно: там «из коробки» могут предоставляться различные удобные штуковины — компиляция, отладка, тестирование, работа с системами контроля версий. Однако некоторые системы при всём своём могуществе оказываются не совсем подходящими — например, могут много весить и сильно тормозить. Приходится выбирать что-нибудь полегче, например, Geany.

В Geany есть (в том числе и средствами дополнительных модулей) всякое:

  • подсветка синтаксиса,

  • организация файлов в проекты,

  • поиск текста как в текущем файле, так и в произвольном их наборе с обходом подкаталогов,

  • поиск парных скобок и тэгов HTML/XML, а также переход по ним,

  • составление оглавления используемых функций,

  • компиляция либо проверка синтаксиса с подсветкой ошибок и быстрым переходом к ним.


С отладчиком в Geany пока не удалось разобраться, а вот процесс тестирования кода можно сделать более удобным.

Итак, у нас есть:

  • IDE Geany,

  • Веб-приложение, написанное на языке Perl с использованием фреймворка Mojolicious и системы управления модулями carton,

  • Желание запускать тесты почаще и попроще, без лишних переключений из редактора в терминал.


Geany позволяет для каждого проекта задать список действий: как общих для всего проекта, так и специфичных для конкретного типа файлов — найти настроки можно в меню Project → Properties → вкладка Build либо Build → Set Build Commands.

Настройки команд в Geany

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

Пойдём дальше — научим Geany прогонять тесты из текущего файла. В Mojolicious тесты представляют собой перловые файлы, имеющие расширение .t и лежащие в каталоге t/. Для того, чтоб, видя в редакторе открытый файл с тестами, прогнать тесты, в настройках придётся добавить путь к корневой папаке приложения. Чтоб не писать путь целиком, можно воспользоваться шаблонами. В документации пишут:
The first occurrence of each of the following character sequences in each of the command and working directory fields is substituted by the items specified below before the command is run.

  • %d - substituted by the absolute path to the directory of the current file.

  • %e - substituted by the name of the current file without the extension or path.

  • %f - substituted by the name of the current file without the path.

  • %p - if a project is open, substituted by the base path from the project.

  • %l - substituted by the line number at the current cursor position.



то есть, некоторые имена файлов и пути к папкам можно указывать специальными переменными.

Вторая команда в списке тех, что зависят от типа файла, получает в меню кирпичную иконку и (по умолчанию) клавишу F9 для быстрого запуска. Клик по кнопке с кирпичом, расположенной на панели инструментов под меню также вызовет выполнение этой второй команды.

Пробуем выполнить тест — в окно Compiler выводятся результат выполнения. Если есть ошибки, они будут выделены и в этом окне, и в исходном коде теста.

Результат тестирования в Geany

http://shoorick.ru/2018/04/04/test-mojo-geany/

Сфинкс спрятался? Сделаем туннель, но ненадолго
Рыжий
shoorick
Ситуация: жил-был Сфинкс (поисковая система Sphinx) на старом сервере, да пришла пора на новый переезжать. Нужный порт на новом месте доступен скриптам, что живут там же, а снаружи — нет и не надейтесь. Результат — кое-где тесты покраснели.

На сервере есть SSH — значит, можно проложить туннель, чтоб разработчик мог тестировать свои приложения на своих компьютерах, прежде чем делать коммиты и лезть на сервер. Команда для проброса стандартного сфинксового порта 9312 с локальной машины на сервер может выглядеть так:
ssh -L 9312:localhost:9312 server.name

Однако в таком виде она неудобна: команду надо запускать в одном окне терминала, тесты — в соседнем, а после завершения тестов надо ещё и закрывать SSH-сессию в первом окне.

man ssh

В инструкции (man ssh) пишут:
SYNOPSIS
     ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address]
         [-c cipher_spec] [-D [bind_address:]port] [-E log_file]
         [-e escape_char] [-F configfile] [-I pkcs11]
         [-i identity_file] [-J [user@]host[:port]] [-L address]
         [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option]
         [-p port] [-Q query_option] [-R address] [-S ctl_path]
         [-W host:port] [-w local_tun[:remote_tun]]
         [user@]hostname [command]
...
     -f      Requests ssh to go to background just before
             command execution.

То есть, ssh позволяет и команду выполнить, и перед этим уйти в фоновый режим. Приме́ним полученные знания:
ssh -fL 9312:localhost:9312 server.name sleep 5

Такая команда откроет туннель, не выводя ничего в терминал, подождёт пять секунд и закроется — почти то, что надо!

Осталось исключить рытьё тоннелей на сервере
test `uname -n` != 'server' && ssh -fL 9312:localhost:9312 server.name sleep 5

и скрестить открытие туннеля с тестированием. Тесты в перловом веб-приложении, написанном с использованием микрофреймворка Mojolicious::Lite, могут вызываться различными путями — и как ./application.pl test, и командой prove, и как-нибудь ещё — я, например, обычно создаю Makefile с нужными мне задачами и тесты выполняю командой make test — мне так удобнее. Чтоб не рассматривать все возможные варианты тестирования, надо поместить открытие туннеля прямо в тест. Если конфигурация приложения хранится в каком-либо отдельном файле (YAML хорошо для этого подходит — в Моджолишисе есть плагин для чтения ЯМЛ-конфигов), можно команду открытия туннеля хранить рядом с остальными настройками — это лучше, чем пихать её в тест. А в тесте останется лишь вызвать её после создания объекта Test::Mojo:
my $t = Test::Mojo->new();

system($t->app->config->'sphinx'->'tunnel') == 0
or warn "Cannot open SSH tunnel to Sphinx: $!";

Тесты зеленеют, можно спокойно идти заниматься музыкой :-)

P.S. Если вместо system применить функцию exec, то тест не будет выполняться до тех пор, пока не закроется туннель — тест будет ждать завершения дочернего процесса и в итоге так и останется красным.

http://shoorick.ru/2018/03/21/sphinx-tunnel/

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

Один из вариантов — использовать carton. Для тех, кому лень читать по-английски, есть перевод — статья Вячеслава Тихановского «Локальная установка и использование Perl-модулей» из журнала Pragmatic Perl за 2014 год.

Дерево каталогов

Carton берёт список модулей, ставит их локально (root не нужен) вместе с зависимостями и позволяет запускать приложения с таким вот набором модулей. Список используемых модулей (если carton ещё ничего не ставил) можно достать из скриптов и своих модулей:
find . -type f -name \*p\[lm\] -exec egrep -n '^use ' '' ';' \
 | cut -d' ' -f 2 | sort -u

Чтоб указать необходимость установки какого-нибудь Module::Name, достаточно добавить в файл cpanfile строку
requires 'Module::Name';

Carton умеет ставить нужные версии модулей, однако в документации этот момент вскользь упомянут, но не описан должным образом. Если захотеть, например, поставить старую версию модуля Sphinx::Search (это потребуется, если сам Сфинкс не новый) и написать
requires 'Sphinx::Search', '0.28';

то вместо желаемой версии будет установлена свежая (0.31 по состоянию на март 2018) — похоже, такая запись указывает минимально допустимую версию. Если поменять код на
requires 'Sphinx::Search', '== 0.28';

и снова выполнить carton install, версия поменяется
Installing modules using /home/.../cpanfile
Successfully installed Sphinx-Search-0.28 (downgraded from 0.31)
1 distribution installed


Команда carton exec может пригодиться для запуска не только самого́ приложения, но и чего-нибудь ещё:
carton exec prove -l


http://shoorick.ru/2018/03/10/carton/

Простая drag’n’drop-передача файлов в перловое приложение на Mojolicious::Lite
Рыжий
shoorick
Хочу упростить загрузку файлов пользователем на некоторые сайты, сделанные на Mojolicious::Lite — нужна обработка нескольких файлов за раз плюс поддержка drag and drop — это удобно, когда надо загрузить несколько файлов, которые в проводнике файловом менеджере либо просмотрщике картинок отображаются не рядом.

Естественно, ищу готовые примеры, чтоб не изобретать велосипед. Нашёл два:

  • Один из них красивый и работает (надо брать!), но примеры серверной части для него — не на перле. Понятно, что можно взять имеющиеся примеры (на пхп и питоне) и перевести их. Либо погуглить тщательнее.

  • Другой — маленький и простой, и даже конкретно под Mojolicious::Lite, но не работает, потому как был написан во времена, когда автор активно пилил Моджолишес, не обращая внимания на обратную совместимость — мне уже приходилось сталкиваться с необходимостью допиливания старых приложений, которые не взлетали на новом Моджо. Пара взмахов напильником — и оно заработало.


Pull request

Попутно выяснилось, что в клиентской части можно даже без jQuery обойтись — оно способно работать на голом JavaScript.

http://shoorick.ru/2018/03/09/simple-dragndrop-upload/

Тесты зеленеют
Рыжий
shoorick
Для разминки и в честь приближения весны поковырял один зелёный сайт.

Обновление Mojolicious приложения

Попутно выяснил странную штуку: почему-то перловое приложение на Mojolicious::Lite всегда запускает тесты в режиме отладки вместо боевого несмотря на явное указание
./app.pl test -m deployment

Хотя раньше, вроде, разница была. Или не было?

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

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

http://shoorick.ru/2018/02/27/tests-become-green/

Шрифт дорожных знаков теперь содержит все предусмотренные стандартами латинские буквы
Рыжий
shoorick
Государственные стандарты ГОСТ 10807-78 и ГОСТ Р 52290-2004 описывают дорожные знаки и шрифт для них. Образцы латинских букв предусматривают явно не всё — помимо основных пятидесяти двух букв (два раза по двадцать шесть) предусмотрены ещё 42: Āā Ää Ąą Čč Ēē Ėė Ęę Ģģ Īī Įį Ķķ Ļļ Ņņ Õõ Öö Šš Ūū Üü Ųų Žž, в том числе пара лигатур: эсцет ß и амперсанд &. По-французски или по-испански таким набором не напишешь. Да и для западнославянских языков типа польского и чешского букв не хватит. А вот для языков советских прибалтийских республик — хватит: указанные в стандартах буквы есть в латышском, литовском и эстонском. Ну и для немецкого — там есть Ää Öö Üü ß.

Russian road sign font

Все эти буквы теперь есть в шрифте дорожных знаков. Есть и буквы, нужные для русских текстов въ дореволюціонной орѳографіи — Іі Ҍѣ Ѳѳ Ѵѵ. Ну и для современных русских текстов давно уже есть. Когда доберусь до добавления остальной кириллицы (стандартом предусмотрено больше 160 кириллических символов) — неизвестно, но могу предположить, что в конце года ещё что-нибудь добавлю. Когда исправлю размеры букв и отступы — даже не рискну предполагать.

http://shoorick.ru/2018/02/05/road-sign-font-has-all-latin-letters/

Нужен перлдок
Рыжий
shoorick
Программам нужна документация и чем программа больше — тем сильнее эта самая документация нужна. Для некоторых языков программирования существует возможность генерировать документацию на основе имеющихся комментариев при помощи специальных программ. В перле подобная возможность — создавать документацию из комментариев — тоже есть, но здесь не требуются какие-то сторонние программы — всё уже сразу есть. Речь идёт о POD — Plain Old Documentation format — языке разметки для документирования перла, перловых программ и перловых модулей — текст, размеченный с его помощью, можно сразу в скрипты вставлять. Подробнее написано в man perlpod.

Можно сделать и так, чтоб консольное перловое приложение выводило документацию о себе, если запущено с определёнными аргументами, например, -?, -h или --help вызывало бы вывод краткой информации, а -m, --man или --manual — полной. Делается это так:
#!/usr/bin/perl

=head1 SYNOPSIS

./script-name.pl I<[options]>

=head1 OPTIONS

... ещё документация

=cut

use Getopt::Long;
use Pod::Usage qw( pod2usage );

my $need_help;
my $need_manual;

GetOptions(
    # обработка других аргументов
    'help|?'            => \$need_help,
    'manual'            => \$need_manual,
);

pod2usage(1)
    if $need_help;
pod2usage('verbose' => 2)
    if $need_manual;

Запускаем с аргументом -? — видим краткую справку, пробуем -m — видим что попало: где-то видна документация, а где-то — исходный код. Если после выхода из просмотра этого кода внимательнее посмотреть на экран, можно заметить сообщение
You need to install the perl-doc package to use this program.

Причина — отсутствие перлдока. В некоторых системах, например, во FreeBSD, perldoc сразу установлен, в других, таких как Debian — нет, и его надо ставить отдельно. Если поставить perldoc, то и скрипты начинают нормально выводить свою документацию:

$ perldoc ./script-name.pl
You need to install the perl-doc package to use this program.
$ sudo apt install perl-doc
...
$ ./script-name.pl --man
SYNOPSIS
./script-name.pl [options]
...


http://shoorick.ru/2018/01/26/perldoc-needed/

Как перенести комментарий в другую задачу в редмайне
Рыжий
shoorick
Система управления проектами (и заодно багтрекер) под названием Redmine в штатной комплектации не умеет переносить комментарии из одной задачи в другую. Во всяком случае, в той версии, что установлена у нас. Редмайн позволяет отредактировать текст комментария, процитировать его, написав новый комментарий или удалить его совсем.

Комментарий в Редмайне

Конечно, существует плагин, который позволяет двигать комментарии, но иногда проще поковыряться руками в базе данных.

Комментарии хранятся в таблице journals, номера задач — в поле journalized_id. Присоединённые файлы — в таблице attachments, номера задач — в поле container_id. Поменял значения — комментарий переехал.

http://shoorick.ru/2017/10/17/redmine-move-comments-between-issues/

Старый хром
Рыжий
shoorick
Браузер Google Chrome не желает обновляться на 32-битных системах, включая всякие линуксы:

Unsupported 32-bit Linux

застрял когда-то на версии 48, и всё. Всякие сайты ругаются, но Хром обновляться не желает.

About Google Chrome 48

Выход — использовать Chromium. Он спокойно продолжает обновляться и видит те дополнения, что были поставлены в Хроме.

About Chromium 61

http://shoorick.ru/2017/10/15/old-chrome/

Чтоб не тыкать вручную — автоматическое совмещение кадров в Hugin
Рыжий
shoorick
Под виндой для склеивания панорам есть Kolor Autopano, под линуксом — Hugin. В принципе, Хугином вполне можно пользоваться: единственное, чего в нём не было по сравнению с Автопано — автоматического поиска серий кадров, но это не критично. С остальными задачами — аккуратно совместить кадры, внося необходимые геометрические искажения и поправляя цвет, дать пользователю выбрать тип проекции и сделать панораму в нужном размере — Хугин справляется. Однако с недавних пор в нём пропала возможность автоматически находить контрольные точки для совмещения кадров — приходится указывать их вручную. На панорамах из двух-трёх кадров это ещё терпимо, но если кадров десяток и панорам — не одна, это быстро утомляет.

Причина оказалась в том, что программу autopano-sift, которая использовалась для совмещения, из доступных в Ubuntu программ убрали, а альтернативу — autopano-sift-c — не добавили.

Способ решения — поставить что-нибудь из программ совмещения, с которыми Хугин умеет работать. Мне, как перлопрограммеру, ближе способ, который сводится к установке модуля Panotools::Script, и выбору Match-n-shift в настройках Хугина (File → Preferences → Control Point Detectors) в качестве программы по умолчанию. Попробовал — работает.

Аргазинское водохранилище

Аргазинское водохранилище

Аргазинское водохранилище

Река Миасс

http://shoorick.ru/2017/09/10/rather-than-autopano/

Автомобильный видеорегистратор для записи GPS-треков
Рыжий
shoorick
Перед отпуском приобрёл видеорегистратор Mystery MDR-970HDG — помимо записи в видеофайл того, что находится перед его объективом, он может определять своё положение по GPS-спутникам. В инструкции описано, как смотреть получившиеся файлы специальным видеоплеером (под Windows, разумеется), который должен показывать помимо картинки и место, где она была снята, но это — не наш метод. Нам нужен трек!

Расковыривание собранных данных показало...Свернуть )
Вывод: видеорегистратор Mystery MDR-970HDG вполне можно использовать в качестве GPS-логгера, но треки, добытые в условиях плотной городской застройки, надо фильтровать.

http://shoorick.ru/2017/07/28/dvr-as-gps-logger/

Подсветка синтаксиса LESS- и SCSS-файлов в geany
Рыжий
shoorick
Пробую на работе писать код в geany — он в отличие от Комодо, Атома и Вижл Студио Кода сделан сам по себе, а не из браузера и поэтому гораздо шустрее. Имеющаяся у меня версия 1.24.1, вышедшая почти три года назад (да, я знаю, что есть и более свежие, но у меня дебиан) не подсвечивает синтаксис в LESS- и SCSS-файлах, а при ручном указании типа (Document → Set Filetype → Markup Languages → Cascading Stylesheet) подсветка хоть и включается, но ругается на особенности синтаксиса, выходящие за рамки обычного CSS.

Решение нашлось на http://superuser.com/questions/344441/less-syntax-highlighting-in-geany:

1. В файле ~/.config/geany/filetype_extensions.conf меняем
CSS=*.css

на
CSS=*.css;*.less;*.scss;

Если такого файла нет, его можно взять из /usr/share/geany (в дебиане — так).

2. В файл ~/.config/geany/filedefs/filetypes.css (который тоже можно взять из /usr/share/geany) добавляем
[lexer_properties]
lexer.css.less.language=1

3. Если geany уже запущен — перечитываем конфигурацию: Tools → Reload Configuration

Подсветка синтаксиса LESS-файлов в geany

Результат — подсветка включается автоматически при открытии LESS- и SCSS-файлов и всякие специфические штуки отображаются нормально: geany теперь не ругается на вложенность правил, на селекторы с амперсандом, на комментарии в стиле C++ (две косые черты), на LESS-переменные с @собакой и на SCSS-переменные с $долларом.

http://shoorick.ru/2017/03/01/geany-less-highlight/

Statt zu schlafen
Рыжий
shoorick
Учёт домашних доходов с расходами — сплошное расстройство. Теперь вот вместо того, чтоб спать, пытаюсь вспомнить, что же умею делать за деньги, потому что на одну зарплату прокормить семью вообще нереально.

Могу:

  • Программировать на Перле — как древние CGI-приложения, так и современные, с использованием фреймворков Mojolicious, Dancer, Catalyst.

  • Программировать на PHP: в основном допиливать существующие приложения, а не писать с нуля что-то большое.

  • Настраивать CMS Drupal и WordPress, а также дорабатывать их темы оформления.

  • Настраивать и дорабатывать Open Journal Systems, включая реализацию многоязычности имён — делал это в OJS 2.4.2, 2.4.7.1, 2.4.8.1, думаю, и в Open Conference Systems смогу реализовать.

  • Кроссбраузерно верстать веб-страницы.

  • Немножко программировать на Руби (в том числе, с использованием Ruby on Rails) — наверное, на юниорском уровне.

  • Немножко программировать на ЯваСкрипте — как голый JavaScript, так и с jQuery.

  • Постоянно внушать коллегам необходимость использования багтрекера и системы контроля версий.

  • (хоть и не считаю это основными профессиональными навыками) фотографировать, петь, аккомпанировать на шестиструнной гитаре, водить легковой автомобиль, быть Дедом Морозом, набирать ноты в MuseScore и LilyPond — медленно, но красиво.


1000 рублей

Хочу от 15 USD / 1 kRUB в час.




Statt zu schlafen (нем.) — вместо того, чтобы спать

http://shoorick.ru/2016/10/18/statt-zu-schlafen/

Паама́им некудота́им
Рыжий
shoorick
Израильские PHP-разработчики как назвали оператор двойного двоеточия на иврите — так оно в пхп и просочилось.

Паамаим некудотаим

Но в пхп с юникодом — фигня. Потому-то T_PAAMAYIM_NEKUDOTAYIM пишется всё-таки латинскими буквами :-)

http://shoorick.ru/2016/09/20/paamayim-nekudotayim/

А воз и ныне там
Рыжий
shoorick
В Open Journal Systems данные людей — пользователей и авторов — могут быть только на одном языке. В багтрекере уже шесть лет висит bug 5598 — allow for author names in multiple languages. В последнем комментарии разработчик честно сообщает:
This hasn't yet been prioritized for a specific release, but I'd say it's very unlikely to be implemented for OJS 2.x; it'll become a higher priority after OJS 3.0 is released.

Итак, OJS 3.0.0 вышла — и действительно, ничего не поменялось: раз эта задача не была приоритетной, то и многоязычности нет.

SQL-запрос

Значит, придётся и дальше поддерживать свой хак, пытаясь всё-таки сделать из него нормальный плагин.

http://shoorick.ru/2016/09/19/ojs-bug-5598-stalled/

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

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

Рельеф — в единых цветах
Рыжий
shoorick
Когда я пробовал рисовать позиционную физическую карту, не сильно парился о точности соответствия цветов тем, что используются на остальных картах — тыкать пипеткой в соседние карты не хотелось. Приблизительно попал — и ладно, потом подправлю. Однако товарищи вики-географы не дремлют, шлют ссылки на правильные палитры. Хорошо, попробуем исправить.
Цифры и перловый кодСвернуть )
Эти цвета не такие насыщенные как те, что получились сначала. Южный Урал в этой палитре получается таким:

Рельеф Южного Урала
http://shoorick.ru/2014/10/31/relief-united-colors/

Как отменить прилипание указателя мыши к краю экрана
Рыжий
shoorick
Так получилось, что не дождавшись апреля, когда должна выйти очередная версия Ubuntu 14.04 LTS, обновил свою старую 12.04 LTS до актуальной 13.10 — и тут же напоролся на кучу глюков в старом гноме, куда пошёл по привычке. Решил всё-таки попробовать Unity — кое-что (например, запуск приложений по клавише Win) мне там показался удобным.

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

Погуглил — нашёл метод: достаточно в настройке дисплеев отключить прилипание и задать тот, монитор, на котором панель всё-таки нужна.

Displays

Параметры Launcher placement и Sticky edges как раз и позволяют это настроить. По умолчанию панель отображается на обоих мониторах и прилипание включено.

Droid Sans и Open Sans — почти близнецы
Рыжий
shoorick
Заметил, что шрифты Droid Sans и Open Sans сильно похожи. Стал сравнивать — почти что близнецы:

Шрифты Droid Sans и Open Sans

Droid Sans чуть у́же и темнее, а в остальном они похожи. Из статьи в английской википедии узнал, что разница у этих шрифтов не только в ширине — в наличии курсива. В Open Sans курсив настоящий, а в Droid Sans — жалкая китайская подделка нет — всего лишь наклонное начертание. Ну и выбор начертаний у Open Sans побогаче: помимо Normal и Bold есть ещё и Light, Semi-Bold, Ultra-Bold.

Open Sans можно использовать на сайтах — он размещён в Google WebFonts. При указании шрифта в CSS лучше сначала указать Open Sans (потому что он с настоящим курсивом), а уж потом Droid Sans (на случай, когда Open Sans недоступен):
.some {
  fond-family: "Open Sans","Droid Sans",sans-serif;
}

На чём делать перловый веб-сервер?
Рыжий
shoorick
Как я только не запускал перловые скрипты на веб-серверах — и как CGI, и как mod_perl (на обоих апачах), и как FastCGI через nginx.

А какой способ принято сейчас использовать?

Мы завели отдельную железяку под перловый хостинг, чтоб выселить туда всё перловое: несколько сайтов на Mojolicious, Catalyst и Movable Type плюс древний самописный кошмар, который давно переписать на чём-нибудь современном.

Хочется сделать это хорошо и правильно. Как быть? Что читать?

Свободный шрифт с цифрами с дорожных знаков
Рыжий
shoorick
Цифры и буквы

Если кому-то нужен шрифт с цифрами, используемыми на дорожных знаках — берите с https://github.com/shoorick/russian-road-sign-font

БезДвозДмезДно. CC-BY-SA. Пулл-реквесты принимаются. Кернинга и нормальных хинтов пока нет.

Сейчас в шрифте есть все цифры и немного букв. Программа-максимум — отрисовать все символы, определённые в ГОСТ 10807-78 плюс ещё чуть-чуть. Программа-минимум — хотя бы те, что определены в ГОСТ Р 52290-2004.

Рисовал в FontForge + Inkscape. Под виндой ещё не тестировал.

Сравниваю скорость
Рыжий
shoorick
Решил как-то написать робота, чтоб он следил, не появилась ли на OSM очередная порция пригодного к обрисовке спутникового снимка Bing высокого разрешения. Попутно выяснил, что можно легко вычислить номера кусочков снимка (и путь к файлу с картинкой), используемого в OSM — под это, что неудивительно, на CPAN есть модуль Geo::OSM::Tiles. Но на maps.bing.com нумерация другая: адрес тайла фрагмента задаётся не тремя числами, как в OSM (масштаб, смещение по горизонтали и вертикали), а одним длинным числом, где замечательным образом смешано всё. Впрочем, вооружившись отладчиком браузера, вполне можно понять принцип, по которому строится это число. Соответствующего модуля на CPAN я не нашёл — значит, надо реализовать самостоятельно.

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

ЦифрыСвернуть )

Re: Не в ту сторону
Рыжий
shoorick
Решил проблему, описанную час назад. Естественно, методом тыка проб и ошибок.

Итак, задача для начала достаточно проста: соединить синтезатор (тут он выступает как MIDI-клавиатура) с компьютером и вывести описанный MIDI-командами звук через компьютер. Потому как встроенный MIDI-синтез в клавишах ужасен (а чё вы хотите за 100 баксов?). Задачу ввода нот с MIDI-клавиатуры решать пока не будем — не до неё сейчас (хотя, насколько мне известно, rumor и Rosegarden могут MIDI-команды преобразовывать в ноты и сохранять их в формате LilyPond).

Рецепты и решениеСвернуть )