Архив рубрики: Perl

Выпускаем джинна

Похоже, с нынешней тенденцией писать редакторы на яваскрипте и запихивать в них ещё и тормозящий браузер, придётся переходить всё-таки на лёгкий софт, потому что не только монстр Komodo тормозит, но даже якобы не такие уж и тяжёлые Atom и Visual Studio Code не отличаются достойной скоростью.

Vim шустр, но всё-таки без постоянной практики его клавиатурные команды забываются. GEdit управляется более знакомыми клавишами, но слишком прост (хотя там за счёт плагинов можно подключить всякие интересные возможности).

geany

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

Четверть гигабайта

Чего только нет в редакторе Komodo Edit! По сравнению с могучей Komodo IDE нет отладчика, нет профилировщика, нет модульного тестирования, нет интерфейса к системам контроля версий… А весит всё равно дофига!

Komodo Edit

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

Statt zu schlafen

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

Могу:

  • Программировать на Перле — как древние 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 (нем.) — вместо того, чтобы спать

Тестирование для комода

The same in English: Perl: testing with Komodo IDE

В перловых приложениях, написанных с использованием фреймворка Mojolicious, лежащие в каталоге t тесты запустить достаточно просто — одна из доступных «из коробки» команд приложения — как раз test, которая без дополнительных параметров запускает все имеющиеся тесты:

$ ./app-name.pl test
[Fri Sep  9 13:21:06 2016] [debug] Some message
Running tests from "/path/to/t".
/path/to/t/1868-prev-next.t .. ok     
/path/to/t/1869-design.t ..... ok     
...
All tests successful.
Files=8, Tests=171,  5 wallclock secs ( 0.08 usr  0.01 sys +  3.76 cusr  0.28 csys =  4.13 CPU)
Result: PASS

Для упрощения процесса я обычно создаю Makefile, в котором пишу

SCRIPT=info.pl
APP=perl $(SCRIPT)

test: $(SCRIPT)
        $(APP) test

и всё, в общем-то, прекрасно работает — тесты запускаются привычной командой make test.

Недавно поставил себе свежую ActiveState Komodo IDE и, пока испытательный срок не кончился, пробую всякие её возможности, среди которых есть и тестирование. Выяснилось, что Komodo пытается найти Makefile и запустить тесты через него, но понять результаты оно не может и выводит перед каждой строкой сообщение **** Unrecognized input

Тестирование в Komodo IDE не может распознать вывод

Можно запускать тесты по-другому — командой prove — она выдаёт похожий результат:

$ prove -l
t/1868-prev-next.t .. ok     
t/1869-design.t ..... ok     
...
All tests successful.
Files=8, Tests=171,  5 wallclock secs ( 0.07 usr  0.00 sys +  3.86 cusr  0.23 csys =  4.16 CPU)
Result: PASS

Разница заключается в том, что не выводятся отладочные сообщения и вместо абсолютных путей к файлам отображаются относительные. Этого оказалось достаточно для того, чтоб Комодо больше не ругалось:

Успешное тестирование в Komodo IDE

Затягивает

Вроде, недавно только поменял процесс подпиливания ильменского сайта — там теперь TDD — а уже каким-то образом 220 тестов написал. Хотя файлов, конечно, сильно меньше 🙂

All tests successful.
Files=11, Tests=220, 14 wallclock secs ( 0.12 usr  0.02 sys +  9.66 cusr  0.64 csys = 10.44 CPU)
Result: PASS

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

Без @ARGV

Обнаружил в попавшемся на глаза чужом скрипте чтение переданных через командную строку параметров без упоминания массива @ARGV. Проверил — работает:

#!/usr/bin/perl

my $shifted = shift or die 'Not shifted';

print "Shifted value is $shifted\n";

Выдаёт

$ ./shift.pl
Not shifted at ./shift.pl line 3.
$ ./shift.pl ARGV?!
Shifted value is ARGV?!

Век живи — век учись.

Атомный редактор

Пробую очередной текстовый редактор — Atom. Поначалу не удавалось его запустить — на сайте выложена версия для архитектуры amd64, а собрать из исходников не получилось (не очень-то и хотелось), однако нашёлся вариант для ленивых — PPA с поддержкой 32-битных версий убунты.

Проверка синтаксиса в редакторе Atom

Хоть, конечно, и требует напильника, но пока нравится: работает шустро, клавиатурные сочетания для основных операций с текстом по умолчанию вполне подходящие плюс можно легко скачиватьи ставить модули для функций, которых по умолчанию нет. Вот, например, модуль linter-perl позволяет проверить синтаксис перловых файлов, а svn подсвечивает изменённые строки и файлы при использовании Subversion — до полноценного клиента, правда, ещё далеко.

Больше букв

Функция selectall_arrayref перлового модуля DBI хороша для тех, кому лень писать:

This utility method combines «prepare», «execute» and «fetchall_arrayref» into a single call. It returns a reference to an array containing a reference to an array (or hash, see below) for each row of data fetched.

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

Реальный пример: скрипт, извлекающий тайлы из пакета, созданного Тайлмиллом, пытался читать данные как раз функцией selectall_arrayref. Зная, что применяется запрос

SELECT * FROM tiles

и что представление tiles содержит, помимо прочего, содержимое тайлов, занимающее места больше всего остального, нетрудно догадаться, что попытка выполнения запроса потребует выделения памяти в объёме, сопоставимом с размером файла, в котором сидит база (пакет с тайлами — это база SQLite).

Набор тайлов для территории размером 600×400 км в средних широтах — например, с Челябинском по центру, Ашой на западе, Карталами на юге и Тюменью на северо-востоке — займёт больше гигабайта для набора масштабов не больше шестнадцатого. На практике так и получилось: скрипт отжирал больше гигабайта памяти и всё никак не мог приступить к полезной части, пытаясь отожрать ещё. Если же увеличивать масштаб, затраты вырастут ещё сильнее: добавим семнадцатый зум масштаб — понадобятся ещё три-четыре гигабайта, Добавим восемнадцатый, которого хватит даже для любопытных исследователей карт — ещё на десять-двадцать объём вырастет. Если будем сохранять тайлы с глубиной цвета 24 бита, а не восемь — ещё больше места израсходуем. Получается, что средних размеров российская область может занять своими тайлами десятки гигабайт. И скрипт бы безуспешно пытался эти десятки получить.

Переписал:

-my $tiles = $dbh->selectall_arrayref(
-    'SELECT * FROM tiles',
-    { Slice => {} }
-);
-
-foreach my $tile ( @$tiles ) {

+my $sth = $dbh->prepare('SELECT * FROM tiles');
+   $sth->execute;
+
+while ( my $tile = $sth->fetchrow_hashref ) {

и всё наладилось: скрипт перестал жрать память (ему хватило десяти мегабайт) и ждать её выделения — сразу работает.

Вывод: не всегда надо экономить рабочее время программиста — иногда надо и о машинном времени задумываться.

Re: в третий раз ходил за ёлкой

Улучшенный Ильменский сайт вчера наконец-то переехал на ilmeny.org — там теперь и шустрый FastCGI-бэкенд, и HTML5/CSS3/SVG, и нормальный внешний вид на мобильных устройствах. Точнее, не сайт переехал, а адрес стал указывать на новый сайт вместо старого. Так что процесс разработки и тестирования можно считать завершённым — пора начинать собираться на фестиваль.

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

test.ilmeny.org