Серия «Мемуары говнокодеров»

Пока все не разошлись

Хочу сохранить сохранённое, хотя бы сами посты (https://pikabu.ru/saved-stories)
А ума нет. И лапки. ЧатГПТ сделал скрипт для браузера

Просто страницы закачивает. Умеет ли JS из браузера сам создать папки?
Чтобы было не плоско: Общее_XYZ.html, Общее_MN.html
А так: Общее[XYZ.html, MN.html] - по папкам разложить.

Перекладываешь жысоны? Пссст, парень, смотри сюда!

Не знаю, как я раньше жил без этих плагинов IDEA...

Перекладываешь жысоны? Пссст, парень, смотри сюда! Программирование, IT, IDE, Jetbrains, Программист, Длиннопост

Да нормально жил, но утомлялся точно больше 😑 Не скажу даже вот так сразу, какой из них полезней.

Перекладываешь жысоны? Пссст, парень, смотри сюда! Программирование, IT, IDE, Jetbrains, Программист, Длиннопост

👉 Пожалуй, всё же - генератор POJO из JSON (RoboPOJOGenerator). Копипастишь прямо из документации - 🪄ВЖУХ! И ни фига! Сначала надо засунуть в insomnia (ну или postman, или http клиент в идее - кому что привычней) и проверить, что json не кривой. Зато потом - магия срабатывает в полный рост. Все эти тысячи полей, вложенных структур - уже не надо сидеть, уныло создавая и перенося руками. Чуть подправить там да сям разные мелочи в конце.

Перекладываешь жысоны? Пссст, парень, смотри сюда! Программирование, IT, IDE, Jetbrains, Программист, Длиннопост

👉 Обратный генератор POJO в JSON пригождается реже, но когда пригождается - очень удобен. Он может набить json случайными данными с нужными типами. Дальше можно сразу сунуть готовый json в запрос, или скинуть на обсуждение.

Теперь это в прошлом -

копирование полей по одному из документации в DTO и сочинение примеров запросов.

Слава роботам!
https://t.me/panykey/110

Показать полностью 2

Пейте, дети, молоко! Пользуйтесь стандартной библиотекой И будьте бдительны!

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

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

LocalDate startDate = LocalDate.of(2022, 11, 1);

LocalDate endDate = startDate.minusMonths(12);

for (LocalDate date = endDate; date.isBefore(startDate); date = date.minusMonths(1))

Подобный метод-агрегатор был не один, и на ревью первого из них я коллеге посоветовал генерировать набор дат вызовом библиотечного АПИ datesUntil с шагом в месяц, и дальше сгенерированный набор использовать. Это дело благополучно забылось, даты продолжали создаваться внутри for и кочевали с копипастой, дожив до обсуждаемого момента 🤷🏻‍♂️

Я сильно засомневался, что в совершенно ненагруженном вызове, при итерации по 12 элементам — иной способ итерации даст какую-то заметную разницу. Сделал иллюстративные наброски в JShell (полноценные бенчмарки лень было, да и ни к чему) для сравнения разных способов с исходным. Типа таких:

Пейте, дети, молоко! Пользуйтесь стандартной библиотекой  И будьте бдительны! Программирование, IT, Java, Программист

(копипастабельный текст тут)

Внимательный читатель уже видит суть проблемы. 🕵🏻‍♂️ Самый внимательный - уверен, увидел уже на третьем абзаце!

Результаты, ожидаемо, отличались крайне незначительно:

Dates list for - i => 692

Dates in-place generated for each => 704

Dates list for - each => 708

Dates array for - i => 708

Dates list forEach => 712

Dates list while + iterator => 1060

Разумного объяснения не было 🤯 Стали закрадываться мысли - а не хлопнуть ли нам взяться ли нам за JMeter, профайлер, снять граф... Углубиться, так сказать, до дна.

Не пришлось - взглянул повнимательней и заметил разницу: date = date.minusMonths(1) vs date.plusMonths(1). Вот оно! 🥳 Банальный бесконечный цикл с отмоткой назад от нижней границы периода.

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

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

Молоко, говорят - просто полезно для здоровья. Его даже за вредность дают. Но не всем 🐱

Показать полностью 1

Достать “Enum с параметром” по значению параметра в джаве

Частенько встречаются перечисления, дополнительно хранящие некие значения.

Чтобы в дальнейшем можно было, например, при сериализации в json это самое значение подставлять автоматом. Тогда возникает обычно и обратная задача – десериализовать (распарсить) значение обратно в Enum.

Вот мне и надоело копипастить туда-сюда все эти методы (сериализации/десериализации) между классами Enum. Их прям очень много таких оказалось на нынешнем проекте. Решил сделать один раз утилитный метод и в проекте им пользоваться. Благо, время позволило.

В принципе, подобный метод есть в недрах Apache Commons EnumUtils, но он работает только со строковым параметром String enumName, плюс выкидывает стандартное исключение. А обычно надо выкинуть некое кастомное, принятое на проекте. Так и родился свой костылёчек, как оно зачастую и бывает.

Получить класс Enum по значению

Импорты копировать не буду, полагаю, IDE предложит их подставить по выбору, если автоматически не сможет этого сделать. Сам утилитный метод примитивен:

Достать “Enum с параметром” по значению параметра в джаве Программирование, Кросспостинг, IT, Java

Разве что – в реальных условиях он выбрасывает не IllegalArgumentException, а кастомное исключение.

ValuedEnum – это интерфейс, который реализуют все Enum со значением. Вот он:

Достать “Enum с параметром” по значению параметра в джаве Программирование, Кросспостинг, IT, Java

Сделан sealed, чтобы при имплементации (методом копипасты с опорой на "так сойдёт") – был дополнительный “маячок”, заставляющий обратить внимание – это именно Enum со значением.

Примеры реализаций и тесты картинками вставлять смысла не вижу - там уже достаточно много и проще скопировать-запустить с сайта или найти в говнотелеге.

Результаты тестов привожу:

Достать “Enum с параметром” по значению параметра в джаве Программирование, Кросспостинг, IT, Java

Всяческого разумного порицания жду нетерпеливо, неразумного - со смирением :)

Показать полностью 2
Отличная работа, все прочитано!