Заметки

Позднее Ctrl + ↑

Неподдерживаемый код

Случайно наткнулся на пример запроса в 1С, который считает разницу между двумя датами (в годах, месяцах и днях).

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

И это еще далеко не самый наглядный пример. Взять хотя бы регулярки для проверки e-mail. Хочется выйти подышать, да? :-)

18 января 2020

Тысяча и одна ночь с 1С

Архитектор нашего основного продукта (и, по совместительству, мой тимлид) рассказывает о том, как мы внедряли 1С в Дубае. Погружений в технические детали нет, так что можно смотреть всем, кто хотя бы чуть-чуть в теме.

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

16 января 2020 работа

В пятьдесят раз быстрее

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

Лезу в код, делаю замер производительности и вижу, что и почти всё это время платформа тратит на одну-единственную процедуру, выполняя пакет запросов. Смотрю первый из них; ну, думаю, классика — запрос данных через точку от составного типа. Наверняка СУБД пристегивает целый вагон соединений с тяжеленными таблицами документов, вот оптимизатор и не успевает набросать адекватный план.

Проверяю теорию — так, а тип SalesDocument включает всего восемь документов. Это, условно, в пределах допустимого (считается, что оптимизатор в состоянии подобрать адекватный план выполнения запроса, если количество соединений — в пределах восьми).

Смотрю размеры таблиц документов — не особенно-то и большие. Выполняю запрос отдельно от пакета — да, работает не мгновенно (читает около 350 000 записей и отбирает примерно 200 000), но никак не час.

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

Проверил — именно тут платформа и проводит большую часть времени, ожидая ответа от СУБД.

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

Это тот случай, когда общая рекомендация 1С сработала идеально — вместо 50 минут документ стал проводиться за три, а после дополнительной оптимизации кода — за минуту. То есть, в пятьдесят раз быстрее того, что я имел вначале.

Такой результат я счел достаточным (минута для закрытия месяца — это в общем случае нормально) и остановился.

5 декабря 2019 готово оптимизация работа

Зачем нужен ЦУП?

ЦУП нужен, чтобы:

  1. Найти в системе узкое место (медленный код, тяжелый запрос);
  2. Расследовать конкретные блокировки или взаимоблокировки.

В первом случае можно включить анализ запросов и, допустим, серверных вызовов. По результатам можно понять, что в системе грузит сервер приложений, а что — сервер СУБД. Часто так делают даже не решая конкретную проблему, а просто чтобы устранить узкие места и увеличить запас прочности системы на будущее.

Во втором сценарии включают анализ блокировок или взаимоблокировок — когда знают, что они есть в системе, и хотят получить отчет: кто заблокировал, кого, когда, на какой строчке кода и так далее.

В обеих случаях мониторинг запускают только в периоды основной нагрузки и минут на десять-пятнадцать. Массив исходных данных получается сравнительно небольшим (ЦУП'у нужно его обработать перед выдачей результата, чем больше данных — тем больше времени потребуется). Кроме того, не будет собрано лишних данных — например, не будет анализа нагрузки от регламентных работ, которые вы проводите ночью.

Кроме того, это снижает влияние сбора данных на работу системы. Дело в том, что ЦУП может собирать очень тяжелый ТЖ, способный заметно нагрузить железо (на 30% медленнее? подержи мое пиво). С этим лучше быть осторожным.

Для всего, что перечислено выше, достаточно аналитических показателей ЦУП'а: анализа запросов, ожиданий на блокировках, анализа взаимоблокировок 1С и MS SQL. Что до оперативных показателей — количества выполняемых запросов, суммарного времени их выполнения и так далее — то популярностью они не пользуются. Польза от них обычно не стоит времени на настройку, и ЦУП по большому счету никогда не проектировался для того, чтобы постоянно собирать их.

24 ноября 2019

Поиск методов с параметром

Задача: нужно найти в общих модулях конфигурации методы с определенным параметром (в этом примере — с параметром DecimalPlacesFor).

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

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

Скриншот консоли

Профит? Профит!

18 ноября 2019 bash готово

Что такое Баблокс?

Посмотрел вебинар Евгения Филиппова про Баблокс. В общем, это такая дополнительная методика оценки производительности. Как и Апдекс, опирается на замеры времени — но предлагает иную механику расчета.

Чтобы посчитать Баблокс, нужно умножить продолжительность операции на зарплату пользователя, который эту операцию делает. Зарплатой может быть:

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

В итоге получим сумму, которую бизнес потерял, условно, из-за тормозов программы. В этом главный плюс методики: это число проще донести до среднего финансового директора. Что означает Апдекс, равный нулю целых пяти десятых — еще поди объясни, а вот что такое потерянные триста тысяч рублей — понятно сразу.

Кроме того, снимаются субъективные вопросы, которые возникают при каждом внедрении. Например, определение ключевых операций; вот скажите, что важнее — быстрее продать товар или оприходовать на склад? Когда известно, сколько компания теряет в деньгах на каждой из этих операций — ответ дать куда проще.

Конечно, это не идеальная модель. Например, возьмем такую ситуацию: программа тормозит у кладовщиков, но нормально работает у бухгалтеров. Зарплата кладовщиков ниже, чем зарплата бухгалтеров, и Баблокс для них будет невелик. Однако бухгалтера работают с тем, что ввели кладовщики, и пока последние не закончили — бухгалтерам нечем заняться. То есть компания теряет деньги из-за тормозов программы у кладовщиков, но Баблокс это не покажет.

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

20 октября 2019

Большое внедрение 1С

Что можно считать большим внедрением 1С? Фактически, эта платформа в России используется почти везде — даже в тех компаниях, где широко применяются решения конкурентов (например, тот же SAP). Конечно, где-то объемы внедрения невелики и 1С решает чисто утилитарные задачи вроде формирования отчетности, но среди работ ЦКТП можно найти по-настоящему колоссальные проекты — например, оптимизацию системы «Деловых линий», которая рассчитана на пять тысяч одновременно работающих пользователей.

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

Размер базы при этом — не критерий: есть множество конфигураций, не предполагающих одновременной работы пользователей. Классический пример — 1C:Документооборот, менее классический — «Управление Автовокзалами» Авибуса. Последняя в состоянии накопить в своей центральной базе огромный объем данных от удаленных узлов своей распределенной сети (автовокзалов и автостанцией), однако большое количество одновременно работающих пользователей для нее не характерно.

15 октября 2019

Оборотный регистр без оборотов

Если отключить для всех измерений оборотного регистра опцию «Использование в итогах», то обороты для регистра рассчитываться не будут. Более того, таблица оборотов регистра будет удалена из базы данных, и попытка обратиться к ней на языке запросов 1С приведет к ошибке.

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

Конечно, при виде такой задачи в голову сразу приходит регистр сведений. Однако эффективность этого варианта зависит от количества измерений, которые вы собираетесь завести в регистре; дело в том, что каждый индекс по регистру сведений включает все его измерения (а периодические регистры — ещё и период). Между тем, платформа создает базовый индекс по измерениям, индекс для каждого измерения с признаком «Ведущее», а ещё — индекс для каждого измерения, ресурса или реквизита, которые вы решите проиндексировать отдельно. И это мы еще не дошли до таблиц срезов, где применяется тот же подход!

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

15 октября 2019

River City Girls

Прошли на пару с мелкой River City Girls (недавно вышедший beat 'em up; это такой жанр игр, где нужно навалять всем, кто тебе не нравится).

На фоточке я наблюдаю за десятилетней Лисой, которая в этот момент уверенно разбрасывает толпу японских мордоворотов.

30 сентября 2019 семья видеоигры

Control

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

Вторая претензия — то, при каких обстоятельствах игрок слышит My Dark Disquet от Poets of The Fall. Черт побери, это слишком крутой трек для такого проходного участка! Ожидал встретить его во время титров или какой-нибудь сумасшедшей схватки.

Я понимаю, что оба пункта звучат мальца несерьёзно, но это правда всё. Control исключительно хороша и внешне, и геймплейно, и сюжетно. Единственная причина, по которой я никому не подарю эту игру на Новый Год — в Epic Games Store пока нет возможности это сделать :-)

14 сентября 2019 видеоигры

Control и Poets of the Fall

Я и так уже не устоял перед рыжей чертовкой из трейлера Control, а этим роликом ребята из Remedy и вовсе зашли с непробиваемых козырей.

Послушайте, это просто неприлично круто! Можно как-нибудь перемотать время на конец августа? :-)

23 августа 2019 видеоигры

Парадокс Ферми

Твит

Причем, если игра хорошая, это обычно происходит как-то незаметно. Сидишь такой гоняешь в нишевый азиатский хоррор, а потом щелк! И приходишь в себя через пару часов где-нибудь в википедии, на странице про второй кризис в Тайваньском проливе.

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

19 августа 2019 тем временем видеоигры

На, мужик, изоленту

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

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

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

― Энди Вейер, «Марсианин»

2 августа 2019 книги работа

Observation

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

Это завязка недавней Observation от No Code. Коротко: игра — пушка. Зайдет любителям научной фантастики, особенно классики (Артур Кларк, вот это всё). Из последнего, во что я играл в этом жанре, круче — только SOMA.

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

Музыку к интро, кстати, написал Робин Финк (Nine Inch Nails). Вижуал в момент просмотра непонятен, но когда догоняешь, что именно там показывают — невольно проникаешься.

28 июля 2019 видеоигры

Хороший день

Твит

Дорогой дневник! Сегодня мне заплатили, чтобы я нарисовал думгая, который учит Рапунцель из диснеевской «Запутанной истории» стрельбе из тяжелой штурмовой винтовки. Сегодня был хороший день!

― izra

Обожаю художников. Особенные люди :-)

(а также на рисунке я, обучающий дочку, как рашить зилотами в Starcraft 2)

9 июля 2019 семья видеоигры

Мультиязычность в Vue.js

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

Звучит просто, но на самом деле эта задача рождает довольно много дополнительных проблем, и одна из них — вывод интерфейса. Сначала я по привычке завел на клиенте два массива с фразами на разных языках, но быстро выкинул этот велосипед и прикрутил Vue I18n.

На нижнем уровне это, правда, всё те же два массива с фразами (их нужно задать при инициализации), однако выгода здесь в другом. Этот плагин сам по себе закрывает еще две проблемы с генерацией интерфейса:

  1. Склонение существительных. Нужно, чтобы правильно выводить слово «страница» в статистике по тегам — одна заметка, две заметки, пять заметок и так далее.
  2. Вывод дат. Например, дата под этой заметкой.

Обе задачи, конечно, можно было закрыть на стороне сервера, силами PHP, но я счел это некрасивым решением. Сервер должен возвращать данные, клиент — строить интерфейс. Нечего их смешивать.

25 июня 2019 блог вебдев готово

Draugen

Сравнительно короткая, но по-своему яркая история. Проиграть тут нельзя, особого выбора (кроме вариантов реплик) нет. Но то, как тут всё звучит и выглядит, то, как здорово прописаны персонажи — удивляет и трогает. Даже если угадываешь повороты сюжета до того, как с ними столкнешься.

В целом игра напомнила то ли Firewatch, то ли The Vanishing of Ethan Carter. Сюжет, на мой вкус, мог быть немного длиннее и заметно драматичнее, но мне всё равно чертовски понравилось, как всё закончилось. Эмоции от финала можно выразить — осторожно, спойлервот этой картинкой :-)

10 июня 2019 видеоигры

И приятнее пахнуть

На днях выпустили очередный релиз FirstBIT ERP (наш программный продукт для автоматизации бизнеса в ОАЭ). Вложен вагон труда, всё работает как надо, есть чем гордиться и всё такое. Я, например, кучу сил потратил на то, чтобы сделать полноценный обмен данными с Битрикс24 и порядком рад, что успел этот механизм зафиналить.

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

10 июня 2019 видеоигры работа Битрикс

Сикока сикока?

Этот сайт почти полностью написан на PHP. JavaScript на клиенте используется ситуативно — редирект сделать, картинку показать и так далее.

Для личного ресурса ничего сложнее и не нужно, но некоторое время назад мне приспичило слегка освежить свои навыки веб-разработки. В качестве платформы для эксперимента я выбрал Vue.js — популярный, быстрый и не слишком сложный фреймворк.

Я, собственно, к чему это всё пишу. Развернул тут Node.js, Vue CLI, создал первый проект — и чуть не поседел. Триста мегабайт джаваскрипта прямо со старта?! Серьёзно?!

5 июня 2019 блог вебдев Node.js JavaScript

Yomawari: Night Alone

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

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

30 мая 2019 видеоигры

Ранее Ctrl + ↓