Русский
Русский
English
Статистика
Реклама

Starter

Code evaluation как средство отладки

15.02.2021 14:04:42 | Автор: admin

Господа разработчики java приложений. Сегодня вашему вниманию представляется простой способ использования code evaluation, реализация которого позволит исполнять произвольный код в работающем приложении, что в свою очередь позволит сэкономить массу времени на CI/CD.

Зачем мне это нужно?

Если вам приходится разрабатывать в условиях микросервисной архитектуры, особенно в большой компании, то скорее всего вам знакома ситуация, когда посмотреть как "по-боевому" работает приложение можно только на стендах на которых есть интеграции с другими микросервисами. И поскольку далеко не все вещи можно проверить локально на заглушках, для того чтобы проверить ту или иную гипотезу, приходится пушить новый код (не факт что работающий корректно) в репозиторий... прогонять его через CI/CD... и только потом по логам понять что где-то что-то пошло не так. И хорошо если логи сразу покажут в чём вы ошиблись, потому как иначе этот процесс пуша и прогона по пайплайнам может стать вашим круговоротом сансары.

Исполнение динамически введённого кода поможет решить эту проблему.

Как это работает?

Как мы с вами знаем, groovy это полностью совместимый с Java язык программирования с динамической компиляцией. Эти две особенности groovy и помогут нам в том, что бы реализовать code evaluation для java приложений. О том как добавить поддержку groovy в java проект вы сможете легко найти сами. А я приведу пример, как реализовать code evaluation (в некотором смысле аналогичный тому, который вы можете видеть во время дебага в вашей IDE).

1) Создадим groovy класс, а в нём шаблонную строку в которую поместим класс и плейсхолдер для динамически введённого кода. Пример такой строки:

def EXPRESSION_CLASS_TEMPLATE = """package dev.toliyansky.eval.serviceclass ExpressionClass implements java.util.function.Supplier<Object> {def get() {%s}}"""

Примечание: package должен быть такой же как и у класса в котором вы этот код будете писать.

Почему мы имплементируем Supplier будет описано ниже.

2) Динамически скомпилируем и загрузим этот класс.

Кусок кода ниже может быть размещён например в REST контроллере, который получает code как тело запроса.

def finalClassCode = String.format(EXPRESSION_CLASS_TEMPLATE, code)def supplier = groovyClassLoader.parseClass(finalClassCode)                                .getDeclaredConstructor()                                .newInstance() as Supplier<Object>def result = supplier.get()

В первой строчке заменяем %s на код который хотим динамически ввести и исполнить в рантайме.

Во второй строке компилируем и загружаем класс из строки, которую получили на предыдущем шаге. Тут важно заметить что созданный инстанс класса приводим к Supplier для того, чтобы далее в третьей строчке можно было сделать вызов метода в котором должен исполниться динамически введённый код. Supplier<Object> в данном случае идеально нам подходит.

Вот собственно и всё.

Пример использования code evaluation

Допустим у вас web приложение в kubernetes. Вы написали какую-то новую фичу, закоммитились, прошли код ревью, прогнали код через CI/CD и вот POD с вашим приложением наконец поднимается, вы заходите в логи и видите что фича работает не так как ожидалось. Допустим, для примера, что вы забыли в конструкторе что-то проинициализировать и поэтому остальная бизнес логика не отрабатывает с банальным NullPointerException.

Имея в своём арсенале HTTP роут с исполнением динамического кода, можно спокойно обратиться к applicationContext, вытащить нужный бин и ручками проинициализировать забытую переменную. После чего потыкать в инициирование отработки бизнес кода и проверить результат, минуя весь CI/CD. Таким банальным примером всё не ограничивается. При желании можно даже в райнтайме переопределить метод класса с бизнес логикой и играться до тех пор пока не отладите код и потом уже зная как оно себя ведёт коммититься и прогонять пайплайны.

Готовое решение для web приложений на spring boot

Если вы не хотите возиться с добавлением groovy в ваш java проект и писать все эти контроллеры, обёртки, разбираться с динамикой, а просто хотите добавить в одну строчку зависимость в ваш проект и чтобы работало из коробки, то тогда специально для вас презентую маленький проект который всё это умеет - evaluator-spring-boot-starter

Это, как можно догадаться из названия, spring boot starter. Подключение данного стартера добавляет в ваше web приложение роут http://host:port/eval отдающий WEB-UI, в котором можно ввести код который хотите динамически исполнить, а результат выведется в окне рядом. Всё это приправлено подсветкой синтаксиса, и прочими удобствами. Если же, например, ваше приложение не имеет выходного роута из кластера и вы можете только лишь использовать curl или wget из терминала POD, то тогда можно использовать роут http://host:port/eval/groovy и отправлять код как параметр GET запроса или как тело POST запроса.

Впрочем, всё это более-менее подробно описано в readme проекта.

Скриншот WEB-UI evaluator-spring-boot-starterСкриншот WEB-UI evaluator-spring-boot-starter

В итоге

  • Продемонстрировано как code evaluation может сэкономить время на отладке приложения

  • Продемонстрировано как реализовать code evaluation в java проекте

  • Продемонстрировано готовое решение в виде spring boot starter.

Подробнее..

Правильный аккумулятор для дома на колёсах

13.05.2021 14:15:47 | Автор: admin
image
А помните время, когда было достаточно просто палатки для выезда?

Нельзя просто так взять и воткнуть обычный аккумулятор в дом на колёсах, лодку или автономный источник питания где-то в горах. Точнее, можно. Но через короткое время он деградирует, и его придётся выбросить. Многие через это проходили, когда пытались использовать обычные стартерные батареи в качестве ИБП для домашнего сервера или как буфер для солнечной батареи.

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

Что такое сульфатация


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

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

Реакция на положительном электроде (зарядка идёт слева направо):

image

Реакция на отрицательном электроде (зарядка идёт слева направо):

image

В норме эта реакция почти обратима. Чем более мелкодисперсные кристаллы сульфата свинца образуются, тем легче протекает обратная реакция при зарядке. Кристаллы мелкие, а внутреннее сопротивление пластины невелико, пока батарея не сильно разряжена. Грубо говоря, когда вы разрядили батарею на 2030 % всё хорошо. До 100 % можно будет зарядить практически без потерь.

Вот так выглядят новые пластины
image
Положительная пластина до процесса формирования.

image
Зеленоватая отрицательная пластина до процесса формирования.


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

image

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

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

Как восстановить активную массу?


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

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

Правильный тип аккумулятора


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

image
Стартерные батареи и батареи долгосрочного питания сильно отличаются по строению и используются в различных целях.

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

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

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

Если провести аналогию, то стартовые аккумуляторы спринтеры, а резервные бегуны на длинные дистанции.

image
Equipment-линейка самая энергоэффективная и живучая на длинных дистанциях.

У Exide есть две-три ключевые линейки батарей, при этом, как показано на картинке, для одного и того же запаса энергии могут понадобиться три обычных Exide Dual, или один гелевый, или литиевые аккумуляторы:

  1. Starter (обычный, AGM) отдают пиковые токи и предназначены только для запуска двигателя. В качестве источника резервного питания они не подходят: в таком режиме эксплуатации они быстро выйдут из строя.
  2. Dual (обычный, AGM и EFB ) промежуточный вариант, совмещающий два режима работы: пуск двигателя и питание электрооборудования. Они могут отдать большой ток и лучше переносят сильный разряд. Ими можно запустить двигатель, и при этом они подойдут для использования в качестве источника для не очень прожорливого оборудования, например, освещения, телевизора, зарядки электробритвы или насоса для циркуляции воды. При этом более продвинутая технология EFB с применением Carbon Boost и AGM даёт больше запаса энергии из расчёта на килограмм и большую скорость приёма заряда.
  3. Equipment (AGM, GEL, Li-ion) специально для питания оборудования. Двигатель ими в теории завести можно, но это не их профиль: пиковые токи у них существенно ниже. Зато заряд они держат очень долго и могут длительное время питать много разных потребителей. В принципе, если такие аккумуляторы установить на моторную лодку, они вполне смогут длительное время питать ультразвуковой сонар для поиска рыбы или навигационное оборудование. При этом двигатель можно длительное время держать выключенным, чтобы не мешать рыбалке.

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

Что ещё важно учитывать?


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

image

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

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

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru