shoorick: (Рыжий)
Появилась задача преобразования из одного XML в другой. Метод понятен — это обсуждалось ужеXSLT.

XSLT

Только вот в голове — пусто, почти всё забыл. «Как так? — удивляешься, — Недавно же вроде делал...» Лезешь в багтрекер за деталями — выясняешь ненароком, что «недавно» — это восемь с половиной лет.

http://shoorick.ru/2016/11/12/forgiven-details/
shoorick: (Рыжий)
Челябинск, ночь на двадцать второе июня. Перед памятником танкистам-добровольцам горят свечи, стоя́щие в форме цифр 7 и 5.

Свечи перед памятником танкистам-добровольцам

Свечи перед памятником танкистам-добровольцам

Свечи перед памятником танкистам-добровольцам

Свечи перед памятником танкистам-добровольцам

http://shoorick.ru/2016/06/21/seventy-five/
shoorick: (Рыжий)
Функция 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 ) {

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

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

http://shoorick.ru/2015/08/26/more-code/
shoorick: (Рыжий)
Китайфон Star X12 вчера окончательно сошёл с ума, заявив, что память кончилась вся. Дело не ограничилось отказом приёма SMS — телефон заявил, что не видит SIM-карт и на попытку запустить что угодно (включая автоматически запускающиеся задачи вроде Google Services Framework) отвечал всё тем же сообщением, что памяти нет, после чего убивал свежезапущенную задачу. Удаление не очень нужных приложений не помогло. Взял терминал, поглядел на файловые системы: команда du показала, что в /data занято около 60 мегабайт из 220, команда df — что занято всё (как так?), fsck выполняться не стала, ругаясь на отсутствие файла /etc/fstab

Скопировал почти всё из /data на microSD и вызвал загрузочное меню, нажав при включении телефона вместе кнопки питания, Home и увеличения громкости (может, есть и другой метод, но этот работает). Перемещаться по меню можно кнопками изменения громкости, выбирать нужный пункт — кнопкой Menu. В меню есть пункт wipe data/factory reset — его вызов полностью очищает /cache и /data — его и вызвал.

Телефон теперь снова может принимать SMS. Телефонная книга восстановилась автоматически.
shoorick: (Default)
Каталистовое приложение жрёт достаточно много памяти

Конечно, это можно пытаться обойти, перезапуская дочерние процессы сервера после обработки определённого количества запросов, но это как-то не со совсем правильно: уже после пары десятков запросов каждый процесс съедает до 150 метров, а когда процессы жиди подольше и запускались через mod_perl, апачные процессы раздувались ещё сильнее.

С другой стороны, более правильным методом было бы устранение утечек, а не отстрел процессов. Для этого есть куча методов: например, на xpoint.ru лежит список модулей, помогающих обнаружить утечки памяти. Попробовал запустить сервер, используя Devel::LeakTrace::Fast — всё затормозилось: только запуск ждать пришлось минут десять, если не больше, а отрисовка страницы занимала от одной до трёх минут. В результате в STDERR вывалился здоровенный список дырявых мест, причём бóльшая их часть — не в нашем приложении, а во внешних модулях.

Что делать — непонятно. Для начала, думаю, надо посмотреть и разобраться, что же мы сами-то написали.
shoorick: (Default)
Удалось запустить подопытный сайт через nginx+FastCGI. Предварительно пришлось поставить p5-FastCGI-ProcManager, который почему-то не был автоматически поставлен при установке каталиста и обновить libtool, без которого FastCGI::ProcManager не желал ставиться.

Наблюдается интересная картина: производительность, судя по результатам работы ab, в 2–2,5 раза хуже, чем при использовании Apache+mod_perl (но во столько же лучше, чем у каталистового тестового сервера), однако расход памяти заметно ниже: апач на каждый процесс сразу отъедал около 60 метров памяти, процессы размножались и раздувались (до 200 метров на процесс — легко!), потребляя в сумме несколько гигабайт (стремясь сожрать всю доступную память: и физическую, и виртуальную); при использовании FastCGI всё не так: запускается всего 2 процесса со сходными аппетитами на память, один из них ничего не делает, зато другой делает, видимо, всё остальное:
$ top
  PID USERNAME THR PRI NICE   SIZE    RES STATE  C   TIME   WCPU COMMAND
72718 as         1 125    0 57400K 49068K RUN    1   0:55 74.72% perl
72715 as         1   8    0 56896K 44720K wait   0   0:03  0.00% perl
Статичные файлы, как можно догадаться, раздаются непосредственно nginx'ом. Лёгкие файлы (например, иконка весом менее килобайта) выдаются раза в 2 быстрее, чем апачем, тяжёлые (например, prototype.js — больше 100 кБ) — примерно с одинаковой скоростью.
shoorick: (Default)
Из неотправленного, трёхмесячной давности:
Соседи здороваются, называя по имени. А я совершенно не помню, кто есть кто.
shoorick: (Default)
Михаил Болгар10 декабря
Заслуженному путешественнику РФ,
Михаилу Израиловичу Болгару
исполнилось бы 60 лет.

12 декабря друзья, коллеги и родственники Адмирала соберутся на вечер его памяти в УралГУФК (Челябинск, ул. Орджоникидзе, 1). Начало в 18 часов.
shoorick: (Default)
В «Дне радио» персонажи носят те же имена, что и артисты. С одной стороны, это, несомненно, удобно: посмотрел на товарища, назвал по имени — и (в большинстве случаев) угадал. Но с другой-то стороны непостоянство состава требует от артистов всегда помнить, кто сегодня играет. Чтобы правильно сказать, у кого «был роман с Кареном» — у Нонны или у Ксюши.

Кстати, Алексей Кортнев, исполняя «Ночной ларёк», перепутал куплеты местами и на ходу сочинил новые слова в песне — но в целом успешно выкрутился. Следовательно, никакой фанеры — пел живьём, в чём я и не сомневался.

Все участники — молодцы!
shoorick: (Default)
Вчера вспомнилась сабжевая фраза. Сегодня опять вспомнилась.
Подумалось «К чему бы это?», а вечером, на репетиции, всё прояснилось: мужской хор восстанавливает в программе несколько православных произведений, в том числе «Ныне отпущаеши» А. А. Архангельского.
Оказалось, что я всё ещё помню свою партию. Хоть прошло 13 лет…
shoorick: (В бабочке)
Концертный костюм взял. GPS взял. Пуховик и зимние боты надел. А вот чайник, ложку, нож и кедровку - забыл.
shoorick: (Default)
Знание трёх из основных четырёх партий, а также гармоническая память на общее звучание произведения — весьма полезны при наборе нот.
Доводилось петь current music и за дискантов, и за теноров, и за басов...

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 03:09 pm
Powered by Dreamwidth Studios