🖥 Трудовые будни. Любовь дня - mapstruct.
Как говорил раньше, в моей текущей задаче достаточно толстые сущности. И основная печаль - большие конструкции по их созданию и апдейту. 🤧
Плюс, еще надо плодить сущности из имеющихся, но с небольшим уменьшением полей, а потом и их апдейтить. 🤮
Короче, этот бойлерплейт стал резать глаза. 📛 И тут я вспомнил про mapstruct. 💡
В разных источниках всегда звучало, что его используют для создания DTO из сущности, а мне надо сущность из сущности. 🤔
Вот я и решил, что если не получится, буду хоть дтохи клепать. 🙏🏻
Как обычно, просто запустить не получилось, но описание настройки помогло и через полдня мучений все заработало. 🔥
Я получил, что хотел, но потом наткнулся на информацию, что можно еще делать и апдейтеры. Интересненько! 🧐
📅 Итог - буду переделывать все на маперы, и если получится, сделаю апдейты.
Кстати, если не надо мапить какое-то поле, то его можно заигнорить.
❓ А вы как мапите и апдейтите толстые сущности?
❓ Может есть что-то еще интересное?
Как говорил раньше, в моей текущей задаче достаточно толстые сущности. И основная печаль - большие конструкции по их созданию и апдейту. 🤧
Плюс, еще надо плодить сущности из имеющихся, но с небольшим уменьшением полей, а потом и их апдейтить. 🤮
Короче, этот бойлерплейт стал резать глаза. 📛 И тут я вспомнил про mapstruct. 💡
В разных источниках всегда звучало, что его используют для создания DTO из сущности, а мне надо сущность из сущности. 🤔
Вот я и решил, что если не получится, буду хоть дтохи клепать. 🙏🏻
Как обычно, просто запустить не получилось, но описание настройки помогло и через полдня мучений все заработало. 🔥
Я получил, что хотел, но потом наткнулся на информацию, что можно еще делать и апдейтеры. Интересненько! 🧐
📅 Итог - буду переделывать все на маперы, и если получится, сделаю апдейты.
Кстати, если не надо мапить какое-то поле, то его можно заигнорить.
❓ А вы как мапите и апдейтите толстые сущности?
❓ Может есть что-то еще интересное?
👍6
🌐 Конференция
Вчера первый раз побывал на профильной конференции.
Скажу сразу - мне очень понравилось. 🔥
🔸 Первый доклад
Андрей Аркаев «Обновление Hibernate через боль»
О переезде на хибер 6.1.
В целом интересно, но проблема показалась далекой от меня.
Хотя схема апдейтов была интересной. 📌
🔸 Второй доклад
Илья и Фёдор Сазоновы «Добровольно-принудительный Spring»
ОЧЕНЬ КРУТО!!!
На ребят приятно смотреть и слушать.
Самым близким стало - "скажи привату НЕТ!!!" 👎 ☠️
Одна из проблем - тестирование приватных методов, потому что они тупо не мокаются. Ребята предлагают вынести их в отдельный бин!!! 🔥
У меня такой даже идеи не возникало!!!🤦♂️
Буду по-тихоньку в текущей задаче переписывать и добавлять тесты, благо, время позволяет. 🤪
Еще из приятного - подарили блокнотик, ручку, карандаш. 😉
Если есть желание посмотреть доклады - вот ссылочка
Вчера первый раз побывал на профильной конференции.
Скажу сразу - мне очень понравилось. 🔥
🔸 Первый доклад
Андрей Аркаев «Обновление Hibernate через боль»
О переезде на хибер 6.1.
В целом интересно, но проблема показалась далекой от меня.
Хотя схема апдейтов была интересной. 📌
🔸 Второй доклад
Илья и Фёдор Сазоновы «Добровольно-принудительный Spring»
ОЧЕНЬ КРУТО!!!
На ребят приятно смотреть и слушать.
Самым близким стало - "скажи привату НЕТ!!!" 👎 ☠️
Одна из проблем - тестирование приватных методов, потому что они тупо не мокаются. Ребята предлагают вынести их в отдельный бин!!! 🔥
У меня такой даже идеи не возникало!!!🤦♂️
Буду по-тихоньку в текущей задаче переписывать и добавлять тесты, благо, время позволяет. 🤪
Еще из приятного - подарили блокнотик, ручку, карандаш. 😉
Если есть желание посмотреть доклады - вот ссылочка
👍5🔥2
🖥 Трудовые будни
Это просто про меня!!!
После посещения конфы у меня родилась идея:
💡 мой поток сознания (код в сервисе) разделить на компоненты. 🤘
Занимался этим три дня. 🛠🛠🛠
Потом еще день запускал проект - NPE и им подобное лезло из всех щелей... 🐜🐜🐜 Хотелось убить автора кода 🤣
Вчера, наконец-то, добрался до простыни с изменениями и ошибками, которые надо исправить. 📜
Сразу прочувствовал и оценил текущую архитектуру 🔥
Место, где что-то надо проверить или исправить, находится быстро.
И т.к. вся логика находится в одном и единственном месте (что-то из SOLID), то и правится тоже быстро. 👍🏻
Плюс ко всему, к исправленному сразу можно написать тест. 🤠
А вам когда-нибудь приходилось переделывать свой же код?
Это просто про меня!!!
После посещения конфы у меня родилась идея:
💡 мой поток сознания (код в сервисе) разделить на компоненты. 🤘
Занимался этим три дня. 🛠🛠🛠
Потом еще день запускал проект - NPE и им подобное лезло из всех щелей... 🐜🐜🐜 Хотелось убить автора кода 🤣
Вчера, наконец-то, добрался до простыни с изменениями и ошибками, которые надо исправить. 📜
Сразу прочувствовал и оценил текущую архитектуру 🔥
Место, где что-то надо проверить или исправить, находится быстро.
И т.к. вся логика находится в одном и единственном месте (что-то из SOLID), то и правится тоже быстро. 👍🏻
Плюс ко всему, к исправленному сразу можно написать тест. 🤠
А вам когда-нибудь приходилось переделывать свой же код?
🔥5
🖥 Трудовые будни
Вчера закончился испытательный срок. 🥳
Тортиков и подарков не было, хотя сказали, что подключат на след неделе к ДМС. 👍🏻
Продолжаю пилить свой сервис. 🧑💻☕️
Уже выложен на тестовые контура и работает. 🚀 Однако, аналитики и рисковики по мере проверки и анализа данных просят кое-что дорабатывать. 🙏🏻📜
Обычно это "кое-что" вылазит в несколько дней веселья.
🤦🏻♂️🤯🧑💻
До работы с облаком так и не добрался....
На работе архитекторы стали говорить о переходе на Spring Boot 3 и Java 17 🤔
С джавой все понятно, а с бутом - нет. Если кто уже переехал или пробовал, скажите, что там за подводные камни?
Как дополнение к выше сказанному - еще заговорили о Kotlin'е 😏
Не исключено, что придется развиваться в эту сторону.
С понедельника начинают внедрять Comunda 7. 📛
Вчера была вводная презентация, сегодня жду воркшоп.
А что у вас неинтересного?
Вчера закончился испытательный срок. 🥳
Тортиков и подарков не было, хотя сказали, что подключат на след неделе к ДМС. 👍🏻
Продолжаю пилить свой сервис. 🧑💻☕️
Уже выложен на тестовые контура и работает. 🚀 Однако, аналитики и рисковики по мере проверки и анализа данных просят кое-что дорабатывать. 🙏🏻📜
Обычно это "кое-что" вылазит в несколько дней веселья.
🤦🏻♂️🤯🧑💻
До работы с облаком так и не добрался....
На работе архитекторы стали говорить о переходе на Spring Boot 3 и Java 17 🤔
С джавой все понятно, а с бутом - нет. Если кто уже переехал или пробовал, скажите, что там за подводные камни?
Как дополнение к выше сказанному - еще заговорили о Kotlin'е 😏
Не исключено, что придется развиваться в эту сторону.
С понедельника начинают внедрять Comunda 7. 📛
Вчера была вводная презентация, сегодня жду воркшоп.
А что у вас неинтересного?
👍6
Обо всем и сразу
🖥 Трудовые будни
На прошлой неделе решилась проблема с облаком: оказывается, косяки были на стороне девопсов 🤬
Никак не можем исправить все баги в бизнес-логике - опять нашли ошибку в вычислениях, буду сегодня править 🛠
Мой непосредственный начальник увольняется. 😭 Я, конечно, за него очень рад, но грустно - умный, спокойный и способный объяснять человек, и, кажется, такого сочетания качеств у оставшихся нет. Ну и просто близкий по духу человек...
🎓 Развитие
Как всегда, все пошло не по плану, хотя оглавление и поиск по нему сделал. ✅
Дожимаю курс по SQL - осталось процентов тридцать. 🤪
За остальное даже не брался. 🤦🏻♂️
Но не все так плохо!
За декабрь поучаствовал в 2 адвентах: Календарь от Дианы 🎉 и Advent of code 2022 🔥
В первом очень хорошо вспомнил instanceof, узнал много интересного о внутрянке String, окончательно разобрался с Enum и познакомился с Record.
Во втором прочувствовал всю глубину поиска в ширину!!!
Ну и с ним я еще не закончил!!!
🖥 Трудовые будни
На прошлой неделе решилась проблема с облаком: оказывается, косяки были на стороне девопсов 🤬
Никак не можем исправить все баги в бизнес-логике - опять нашли ошибку в вычислениях, буду сегодня править 🛠
Мой непосредственный начальник увольняется. 😭 Я, конечно, за него очень рад, но грустно - умный, спокойный и способный объяснять человек, и, кажется, такого сочетания качеств у оставшихся нет. Ну и просто близкий по духу человек...
🎓 Развитие
Как всегда, все пошло не по плану, хотя оглавление и поиск по нему сделал. ✅
Дожимаю курс по SQL - осталось процентов тридцать. 🤪
За остальное даже не брался. 🤦🏻♂️
Но не все так плохо!
За декабрь поучаствовал в 2 адвентах: Календарь от Дианы 🎉 и Advent of code 2022 🔥
В первом очень хорошо вспомнил instanceof, узнал много интересного о внутрянке String, окончательно разобрался с Enum и познакомился с Record.
Во втором прочувствовал всю глубину поиска в ширину!!!
Ну и с ним я еще не закончил!!!
👍3
Всех с наступающим!!! 🎉
Этот год был богат на события. Эти события привели ко множеству перемен. Я, как адепт "глобального позитива", считаю, что все к лучшему 😜
А еще, у нас в семье есть традиция перед новым годом делать тазик имбирных печенек. 🍪🍪🍪
Одно из моих желаний, что бы это продолжалось как можно дольше. 🪄💫
Желаю всем здоровья и любви, молока и переченек!!! 🥳🥳🥳
Этот год был богат на события. Эти события привели ко множеству перемен. Я, как адепт "глобального позитива", считаю, что все к лучшему 😜
А еще, у нас в семье есть традиция перед новым годом делать тазик имбирных печенек. 🍪🍪🍪
Одно из моих желаний, что бы это продолжалось как можно дольше. 🪄💫
Желаю всем здоровья и любви, молока и переченек!!! 🥳🥳🥳
🔥5❤1👍1
🎓 Развитие
Медленно продолжаю продвигаться по по плану.
В курсе по SQL осталось два самых интересных раздела - Constraint и Index.
Так же удается найти время на легкие задачи с leetcode.
Последние заставили вспомнить алгоритм для поиска наибольшего общего делителя НОД (Greatest common divisor GCD), и найти красивую реализацию, прям как я люблю - с магией побитовых операций:
Медленно продолжаю продвигаться по по плану.
В курсе по SQL осталось два самых интересных раздела - Constraint и Index.
Так же удается найти время на легкие задачи с leetcode.
Последние заставили вспомнить алгоритм для поиска наибольшего общего делителя НОД (Greatest common divisor GCD), и найти красивую реализацию, прям как я люблю - с магией побитовых операций:
public static int gcd(int a, int b) {
if (b == 0) return a;
int i = a % b;
return gcd(b, i);
}👍2
🖥 Трудовые будни (1/3)
Недавно возникла необходимость спарсить csv файл.
Вроде бы простая задача. 🐥
Я быстренько списал следующее:
Но потом мне дали несколько файлов на тест - и мой парсер падает. 🤯
Небольшое расследование показало, что проблема в кодировке, но я к этому готов - предусмотрел поле
Сменил его значение с
(продолжение следует)
Недавно возникла необходимость спарсить csv файл.
Вроде бы простая задача. 🐥
Я быстренько списал следующее:
try (var fileReader = new BufferedReader(new InputStreamReader(file.getInputStream(), CHARSET));
var csvParser = new CSVParser(fileReader,
CSVFormat.EXCEL.withFirstRecordAsHeader()
.withIgnoreHeaderCase()
.withTrim()
.withDelimiter(';'))) {
for (CSVRecord csvRecord : csvParser.getRecords()) {
...
}
}
И вроде все заработало... Но потом мне дали несколько файлов на тест - и мой парсер падает. 🤯
Небольшое расследование показало, что проблема в кодировке, но я к этому готов - предусмотрел поле
CHARSET.Сменил его значение с
Charset.forName("Windows-1251") на StandardCharsets.UTF_8 и ожидал рабочего варианта...(продолжение следует)
🖥 Трудовые будни (2/3)
Ожидаемого рабочего варианта не получилось, все равно продолжало падать с ошибкой: 🤬
Проверял руками - значение есть, в списке ожидаемых тоже есть, в файле тоже совпадет.
Гуглеж в этот день почему-то к решению не привел, даже пришлось немного жаловаться коллегам.
В итоге, выяснил, что полученные файлы были в кодировке UTF-8 BOM !!! 🤘
С этим нужно было что-то делать...
(это еще не конец)
Ожидаемого рабочего варианта не получилось, все равно продолжало падать с ошибкой: 🤬
java.lang.IllegalArgumentException: Mapping for ... not found, expected one of [..., ..., ...]
at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:123) ~[commons-csv-1.8.jar:1.8]
at group.nwtn.broker.service.CsvService.parsingImport(CsvService.java:494) ~[classes/:na]
Проверял руками - значение есть, в списке ожидаемых тоже есть, в файле тоже совпадет.
Гуглеж в этот день почему-то к решению не привел, даже пришлось немного жаловаться коллегам.
В итоге, выяснил, что полученные файлы были в кодировке UTF-8 BOM !!! 🤘
С этим нужно было что-то делать...
(это еще не конец)
👍1
🖥 Трудовые будни (3/3)
BOM - Я надолго запомню, что значат эти три буквы!!! 🤦🏻♂️
BOM (BYTE ORDER MARK) - это несколько магических байтов, добавленных в начало файла для каких-то благих служебных целей. Так вот, не все умеют с ними работать.
В моём случае, использованный реадер просто добавлял эти символы в начало имени первого столбца. Это, естественно, приводило к несовпадению с ожидаемым значением.
Конечно, конвертация в безBOM решила проблему, но осадочек, как говорится, остался.
Чтобы в последствии избежать конвертации, решил добить проблему. Нашел доку, использовал класс BOMInputStream:
Повесил себе медальку за то, что разобрался. 🥇
(конец)
BOM - Я надолго запомню, что значат эти три буквы!!! 🤦🏻♂️
BOM (BYTE ORDER MARK) - это несколько магических байтов, добавленных в начало файла для каких-то благих служебных целей. Так вот, не все умеют с ними работать.
В моём случае, использованный реадер просто добавлял эти символы в начало имени первого столбца. Это, естественно, приводило к несовпадению с ожидаемым значением.
Конечно, конвертация в безBOM решила проблему, но осадочек, как говорится, остался.
Чтобы в последствии избежать конвертации, решил добить проблему. Нашел доку, использовал класс BOMInputStream:
var fileReader = new InputStreamReader(new BOMInputStream(file.getInputStream()), CHARSET);
При таком варианте без ошибок парсятся как файлы с BOM, так и без.Повесил себе медальку за то, что разобрался. 🥇
(конец)
👍5
🎓 Развитие
Стараюсь пройти тренировки по алгоритмам от Яндекса, так сказать, онлайн, делая все задания вовремя. Т.е. сдавать задачи до того, как появились новые, а не дожидаясь дедлайна. 🚀
Пока удается. 🤘
Из интересного - вчера узнал про устаревший класс StringTokenizer, который можно использовать как альтернативу для split().
Его единственный, но важный плюс - он работает быстрее, а это как раз то, что требовалось для задачи. ✅
Недавно закончилась лекция, которая лично для меня была самой интересной. Особенно часть про кучу.🔥
Самое сложное было слушать и одновременно отвечать на внезапно появившиеся у сына вопросы про CSS. Оказалось, не так то просто объяснять второкласснику на пальцах. Но, кажется, я справился с обеими задачами сразу😝
А вы чем занимаетесь в вечер пятницы❓
#algorithm_training
Стараюсь пройти тренировки по алгоритмам от Яндекса, так сказать, онлайн, делая все задания вовремя. Т.е. сдавать задачи до того, как появились новые, а не дожидаясь дедлайна. 🚀
Пока удается. 🤘
Из интересного - вчера узнал про устаревший класс StringTokenizer, который можно использовать как альтернативу для split().
Его единственный, но важный плюс - он работает быстрее, а это как раз то, что требовалось для задачи. ✅
Недавно закончилась лекция, которая лично для меня была самой интересной. Особенно часть про кучу.🔥
Самое сложное было слушать и одновременно отвечать на внезапно появившиеся у сына вопросы про CSS. Оказалось, не так то просто объяснять второкласснику на пальцах. Но, кажется, я справился с обеими задачами сразу😝
А вы чем занимаетесь в вечер пятницы❓
#algorithm_training
🔥3