Привет!
Играюсь тут в MapStruct+kotlin
сначала застрелился выяснять, что у меня процессинг аннотаций не работет, потому что я скопипасти приме для джавы, а не котлина и написал annotationProcessor, вместо kapt.
Потом когда наконец всё это добро завёл тут же словил нарушение LSP в стандартной либе Котлина и дикий ВТФ с императивным стилем мапструкта
В Котлине emptyList() возвращает объект, который имплементит List, но не имплементит clear().
Ну это типа в целом можно понять, империтивное наследие джавы совместимость с джавой, все дела
но вот то, что мапструк работает через clear+addAll - меня сначала вырубило. я бы тупо перетащил ссылку из исходника в таргет. А потом до меня дошло, что с изменяемыми структурами так нельзя - вдруг ссылка на целевой лист куда-то утекла и уже у того человека будет ВТФ, когда у него "один и тот же объект" не совпадут.
Это к вопросу, чем неизменяемые структуры данных и декларативный стиль проще.
пойду ещё покапаюсь, может это можно как-то захачить
#tools@ergonomic_code #kotlin@ergonomic_code
Играюсь тут в MapStruct+kotlin
сначала застрелился выяснять, что у меня процессинг аннотаций не работет, потому что я скопипасти приме для джавы, а не котлина и написал annotationProcessor, вместо kapt.
Потом когда наконец всё это добро завёл тут же словил нарушение LSP в стандартной либе Котлина и дикий ВТФ с императивным стилем мапструкта
В Котлине emptyList() возвращает объект, который имплементит List, но не имплементит clear().
Ну это типа в целом можно понять, империтивное наследие джавы совместимость с джавой, все дела
но вот то, что мапструк работает через clear+addAll - меня сначала вырубило. я бы тупо перетащил ссылку из исходника в таргет. А потом до меня дошло, что с изменяемыми структурами так нельзя - вдруг ссылка на целевой лист куда-то утекла и уже у того человека будет ВТФ, когда у него "один и тот же объект" не совпадут.
Это к вопросу, чем неизменяемые структуры данных и декларативный стиль проще.
пойду ещё покапаюсь, может это можно как-то захачить
#tools@ergonomic_code #kotlin@ergonomic_code
👍1
Привет!
Java 19 зарелизали О_О
ещё недавно ток 17ая была
сколько между 7ой и 8ой лет прошло? 4?
Щяс даже Котлин, кажись, раз в год релизается
Туда ещё и структурную канкаренси в инкубаторе впихнули О_О
так глядишь, году к 30, на юбилейной 30ой джаве можно будет жить почти как на Котлине
#tools@ergonomic_code #java@ergonomic_code
Java 19 зарелизали О_О
ещё недавно ток 17ая была
сколько между 7ой и 8ой лет прошло? 4?
Щяс даже Котлин, кажись, раз в год релизается
Туда ещё и структурную канкаренси в инкубаторе впихнули О_О
так глядишь, году к 30, на юбилейной 30ой джаве можно будет жить почти как на Котлине
#tools@ergonomic_code #java@ergonomic_code
Молния!
Я, возможно, тормоз, но я тут открыл github codespaces
И они реально работают - мне тут надо было подправить пулл реквест в спеку диаграммы эффектов, я открыл ветку в спейсе, мне открылся ВС Код, я там поставил плагин аскиидока, и открыл превью! О_О
Поставил вим и он заработал
А вот синк сеттинги на веб не поставились.
Но в любом случае, это вполне рабочий вариант что-то подхачить в приличной среде, не выходя из облака
#tools@ergonomic_code
Я, возможно, тормоз, но я тут открыл github codespaces
И они реально работают - мне тут надо было подправить пулл реквест в спеку диаграммы эффектов, я открыл ветку в спейсе, мне открылся ВС Код, я там поставил плагин аскиидока, и открыл превью! О_О
Поставил вим и он заработал
А вот синк сеттинги на веб не поставились.
Но в любом случае, это вполне рабочий вариант что-то подхачить в приличной среде, не выходя из облака
#tools@ergonomic_code
GitHub
GitHub Codespaces
GitHub Codespaces gets you up and coding faster with fully configured, secure cloud development environments native to GitHub.
Привет!
Я молния! опечатка по фрейду
Молния! Я разочаровался в Spring Data JDBC. Вкратце, по трём причинам: отсутствие наследования, отсутствие спецификаций и отсутствие возможности автоматически подтянуть ридонли агрегат по ссылке. Потом, может, подробнее распишу.
Поэтому я снова полез гуглить идеальный орм и откопал любопытную штуку. Он пока у меня особо доверия не вызывает и на мой у него довольно многословное АПИ, но идея прикольная.
#tools@ergonomic_code @spring_data_jdbc@ergonomic_code #ergo_persistance@ergonomic_code
Молния! Я разочаровался в Spring Data JDBC. Вкратце, по трём причинам: отсутствие наследования, отсутствие спецификаций и отсутствие возможности автоматически подтянуть ридонли агрегат по ссылке. Потом, может, подробнее распишу.
Поэтому я снова полез гуглить идеальный орм и откопал любопытную штуку. Он пока у меня особо доверия не вызывает и на мой у него довольно многословное АПИ, но идея прикольная.
#tools@ergonomic_code @spring_data_jdbc@ergonomic_code #ergo_persistance@ergonomic_code
GitHub
GitHub - babyfish-ct/jimmer: The most advanced ORM of JVM, for both java & kotlin
The most advanced ORM of JVM, for both java & kotlin - babyfish-ct/jimmer
Привет!
У меня продолжается маниакальная стадия "мне нужен идеальный ОРМ" и я накопал ещё пару любопытных линок.
Либа персистентных (в смысле переживающих процесс) коллекций для Kotlin/Java. Она, кажется начинает подгнивать, но может пригодиться в некритичных задачах
Вы говорите в ОРМах много магии? А как насчёт МетаОРМа?
Наконец, на обе штуки я уже давал ссылки, но и себе и вам напомню, что существуют примеры того, что я считаю идеальной технологией персистанса: MicroStream и Erlang Mnesia
#posts@ergonomic_code #tools@ergonomic_code #ergo_persistance@ergonomic_code
У меня продолжается маниакальная стадия "мне нужен идеальный ОРМ" и я накопал ещё пару любопытных линок.
Либа персистентных (в смысле переживающих процесс) коллекций для Kotlin/Java. Она, кажется начинает подгнивать, но может пригодиться в некритичных задачах
Вы говорите в ОРМах много магии? А как насчёт МетаОРМа?
Наконец, на обе штуки я уже давал ссылки, но и себе и вам напомню, что существуют примеры того, что я считаю идеальной технологией персистанса: MicroStream и Erlang Mnesia
#posts@ergonomic_code #tools@ergonomic_code #ergo_persistance@ergonomic_code
GitHub
GitHub - jankotek/mapdb: MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast…
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine. - jankotek/mapdb
👍3🥰1
Привет!
По посту с декомпозицией пока особых новостей нет и не будет до JPoint-а, поэтому пока накатал микропост с описанием опыта внедерния тулов статического анализа кода (Detekt, Kover, ArchUnit) в Проект Э.
#posts@ergonomic_code #tools@ergonomic_code #case@ergonomic_code
По посту с декомпозицией пока особых новостей нет и не будет до JPoint-а, поэтому пока накатал микропост с описанием опыта внедерния тулов статического анализа кода (Detekt, Kover, ArchUnit) в Проект Э.
#posts@ergonomic_code #tools@ergonomic_code #case@ergonomic_code
Привет!
Кто-нибудь знает простую plain text-овую нотацию для описания HTTP API? Что-нибудь в таком духе, но ещё более Markdown-нистое.
#posts@ergonomic_code #tools@ergonomic_code
Кто-нибудь знает простую plain text-овую нотацию для описания HTTP API? Что-нибудь в таком духе, но ещё более Markdown-нистое.
#posts@ergonomic_code #tools@ergonomic_code
JSight.io
JSight | JSight — Human-friendly language for designing APIs
JSight is the simplest, user-friendly, compact language for description of APIs. Feel the difference compared to OpenAPI!
Привет!
Как и обещал, пишу о впечатлениях от переезда на Spring Boot 3.1.
Их нет.
Накрутил версию гредлового плагина до 3.1.0, заменил зависимость тестконтейнеров на
Чуть поинтереснее история с интеграцией с композом.
1. Добавил в грэдл
И почти всё. Была одна проблема - в какой-то обвязке кролика vhost захардкожен в "/", а нам в наследство достался нестандартный. Это подправил - и всё взлетело.
Потом ещё небольшая мелочушка была - через спринг нельзя прописать имя композ-проекта - добавил его в композ файл.
И вот это совсем всё. Теперь у нас сетап выглядит так:
1. Поставить Джаву, Идею, Докер, Гит
2. Качнуть репоз
3. Запустить приложение в Идеи
4. Готово
Я хоть и не люблю спринг за его монструозность и автомагичность, но вот такие плюшки прям подкупают.
Плюс у нас есть ещё скриптик (правда только под Linux), который качает дампы из дев кластера и если его запустить между шагами 2 и 3 - будет ещё и сетап на живых данных.
И бонусом ещё немного нашей внутренней кухни - рядом с композом инфраструктуры у нас есть композ, который умеет запускать несколько экземпляров приложения с роутингом через traefik - соответственно потестить работу в многонодовом режиме тоже можно в одну кнопку.
#tools@ergonomic_code #spring@ergonomic_code #devx@ergonomic_code #project_e@ergonomic_code
Как и обещал, пишу о впечатлениях от переезда на Spring Boot 3.1.
Их нет.
Накрутил версию гредлового плагина до 3.1.0, заменил зависимость тестконтейнеров на
testImplementation("org.springframework.boot:spring-boot-testcontainers")
и всё. Приложение собралось и запустилось, все тесты прошли. Я это в мастер в следующий цикл вмёржу - может на стендах что-то вылезет.Чуть поинтереснее история с интеграцией с композом.
1. Добавил в грэдл
developmentOnly("org.springframework.boot:spring-boot-docker-compose")
2. Добавил конфиг application-local-dev.yml:spring:
docker:
compose:
file: ./env/docker-compose-infra.yml
enabled: true
lifecycle-management: start_only
И почти всё. Была одна проблема - в какой-то обвязке кролика vhost захардкожен в "/", а нам в наследство достался нестандартный. Это подправил - и всё взлетело.
Потом ещё небольшая мелочушка была - через спринг нельзя прописать имя композ-проекта - добавил его в композ файл.
И вот это совсем всё. Теперь у нас сетап выглядит так:
1. Поставить Джаву, Идею, Докер, Гит
2. Качнуть репоз
3. Запустить приложение в Идеи
4. Готово
Я хоть и не люблю спринг за его монструозность и автомагичность, но вот такие плюшки прям подкупают.
Плюс у нас есть ещё скриптик (правда только под Linux), который качает дампы из дев кластера и если его запустить между шагами 2 и 3 - будет ещё и сетап на живых данных.
И бонусом ещё немного нашей внутренней кухни - рядом с композом инфраструктуры у нас есть композ, который умеет запускать несколько экземпляров приложения с роутингом через traefik - соответственно потестить работу в многонодовом режиме тоже можно в одну кнопку.
#tools@ergonomic_code #spring@ergonomic_code #devx@ergonomic_code #project_e@ergonomic_code
Docker
traefik - Official Image | Docker Hub
Traefik, The Cloud Native Edge Router
👍2
Привет!
Если вы как и я сильно ждали, но всё равно пропустили, вот вам "новость" - вышла Ява 21. Так как я пишу на Котлине меня в ней интересует только Project Loom - я уже знаю место в Проекте Э, которое с его помощью можно будет чуть упростить. Но ещё больше я жду Spring Boot 3.2, с поддержкой лума, который уже в стадии RC-1.
По традиции, на 21 Яву я перееду в ближайшее время и расскажу как всё прошло.
#tools@ergonomic_code #java@ergonomic_code
Если вы как и я сильно ждали, но всё равно пропустили, вот вам "новость" - вышла Ява 21. Так как я пишу на Котлине меня в ней интересует только Project Loom - я уже знаю место в Проекте Э, которое с его помощью можно будет чуть упростить. Но ещё больше я жду Spring Boot 3.2, с поддержкой лума, который уже в стадии RC-1.
По традиции, на 21 Яву я перееду в ближайшее время и расскажу как всё прошло.
#tools@ergonomic_code #java@ergonomic_code
Хабр
Вышла Java 21
Вышла общедоступная версия Java 21 . В этот релиз попало около 2500 закрытых задач и 15 JEP'ов . Release Notes можно посмотреть здесь . Изменения API – здесь . Java 21 является LTS-релизом, а...
👍11
Привет!
Если вы как и я в последние лет 6 несколько раз пытались дедуплцировать версии зависимостей в мультипроектном Gradle-билде на Kotlin DSL и всякий раз терпели крах: кажется, наконец-то появился вменяемый способ это сделать - в 7-ом Грэдле оказывается появилась фича каталога версий
#tools@@ergonomic_code #gradle@ergonomic_code
Если вы как и я в последние лет 6 несколько раз пытались дедуплцировать версии зависимостей в мультипроектном Gradle-билде на Kotlin DSL и всякий раз терпели крах: кажется, наконец-то появился вменяемый способ это сделать - в 7-ом Грэдле оказывается появилась фича каталога версий
#tools@@ergonomic_code #gradle@ergonomic_code
❤2
Привет!
Сегодня решил поделиться полезняшкой - git worktree.
Эта команда позволяет добавить рабочую директорию для существующего гит репоза (ещё одну директорию с исходниками без собственной директории .git).
Это позволяет даже для больших проектов иметь пачку "репозов" и быстро переключаться между задачами. У меня как правило для каждого проекта есть пачка рабочих директорий:
1) main - для текущей задачи
2) hot-fix - для хот фиксов
3) по директории на каждого разработчика - для ревью
4) плюс частенько завожу ещё отдельные директории для различных экспериментов с кодовой базой.
#tools@ergonomic_code #git@ergonomic_code
Сегодня решил поделиться полезняшкой - git worktree.
Эта команда позволяет добавить рабочую директорию для существующего гит репоза (ещё одну директорию с исходниками без собственной директории .git).
Это позволяет даже для больших проектов иметь пачку "репозов" и быстро переключаться между задачами. У меня как правило для каждого проекта есть пачка рабочих директорий:
1) main - для текущей задачи
2) hot-fix - для хот фиксов
3) по директории на каждого разработчика - для ревью
4) плюс частенько завожу ещё отдельные директории для различных экспериментов с кодовой базой.
#tools@ergonomic_code #git@ergonomic_code
👍8
Привет!
Пока готовил доклад наткнулся на прикольную штуку: Cognitive Complexity - метрику оценки сложности кода, которая явно ближе к правде, чем Cyclomatic complexity.
Она, на мой взгляд, тоже не идеальна, так как не учитывает наличие и количество изменяемого состояния (а это важно) и позволяет "замести" сложность под вызовы функций, но даже в текущем виде полезна и подсвечивает места, с которыми точно надо что-то сделать.
И для Идеи даже есть плагинчик, который прям в редакторе рисует сложность методов. Только для Котлина он не учитывает ветвление потока управления даже в базовых map, filter, forEach и т.д., поэтому может сильно приврать в сторону простоты. Но если в коде откровенное кровавое месиво - он это подсветит.
#tools@ergonomic_code #craftsmanship@ergonomic_code
Пока готовил доклад наткнулся на прикольную штуку: Cognitive Complexity - метрику оценки сложности кода, которая явно ближе к правде, чем Cyclomatic complexity.
Она, на мой взгляд, тоже не идеальна, так как не учитывает наличие и количество изменяемого состояния (а это важно) и позволяет "замести" сложность под вызовы функций, но даже в текущем виде полезна и подсвечивает места, с которыми точно надо что-то сделать.
И для Идеи даже есть плагинчик, который прям в редакторе рисует сложность методов. Только для Котлина он не учитывает ветвление потока управления даже в базовых map, filter, forEach и т.д., поэтому может сильно приврать в сторону простоты. Но если в коде откровенное кровавое месиво - он это подсветит.
#tools@ergonomic_code #craftsmanship@ergonomic_code
Wikipedia
Цикломатическая сложность
структурная (или топологическая) мера сложности компьютерной программы; для вычисления используется граф потока управления программы
👍6🔥2
Привет!
JB прислали напоминалку, что заканчивается лицензия, решил приобщиться к импортозамещению и попробовать посидеть на gigaide, gigacode и amplicode.
Пока выглядит так, что мне не хватает только HTTP Client-а.
Через недельку напишу как впечатления
#tools@ergonomic_code
JB прислали напоминалку, что заканчивается лицензия, решил приобщиться к импортозамещению и попробовать посидеть на gigaide, gigacode и amplicode.
Пока выглядит так, что мне не хватает только HTTP Client-а.
Через недельку напишу как впечатления
#tools@ergonomic_code
gitverse.ru
GitVerse — Платформа для работы с исходным кодом, Git-репозиторий
✅ GitVerse — платформа для разработчиков. ✅ Создавайте и развивайте проекты с открытым и закрытым исходным кодом. ✅ Загрузка репозиториев, импорт и зеркалирование из других git-сервисов.
👍8
GitHub
GitHub - ergonomic-code/Trainer-Advisor: Информационная система йогатерапевта и демонстрационный проект Эргономичного подхода
Информационная система йогатерапевта и демонстрационный проект Эргономичного подхода - ergonomic-code/Trainer-Advisor
Привет!
На выходных спинным мозгом чутка подвигал Trainer Advisor
Переезд на Kotlin 2.0.20
Начал с того, что с третьей попытки наконец осилил переехать с Kotlin 1.9.20 на 2.0.20.
Летом при переезде на 2.0.0 (и, возможно, 2.0.10 - не помню уже точно) было какое-то совершенно невнятное сообщение об ошибке компиляции, которое ставило меня в тупик.
В этот раз было даже не сообщение об ошибке компиляции, а вообще какая-то кровавая жесть из кишёк компилятора, но победить её удалось. Случайно.
Я начал пытаться локализовать строчку, на которой компилятор взрывается (он писал файл). И долокализовался до того, что файл вообще удалил, а компилятор продолжил взрываться 🤯
Потом каким-то чудом я обнаружил, что у меня есть одноимённый файл в Gradle Test Fixtures source set. И вот когда я туда залез - там у меня ужеIDEA GigaIDE начала взрываться, что не найдены Spring-овые классы. Пошёл гуглить WTF и по первой же ссылке выяснил, что во 2-ой версии, impl-зависимости продового кода не перекидываются в testFixture - прокинул, завелось.
Мораль - чёрт его знает. Проект на 13К нетривиального кода (люблю я знаете ли проверять компиляторы на прочность) перевести мне удалось. Но чудом. Если ждали знака, чтобы попробовать перевести свой проект - вот он. Но будьте готовы к приключениям.
Переезд на HTMX 2.0.3
Следующим шагом переехал на новую мажорную версию HTMX. Просто обновил и всё заработало. Вряд ли это кому-то ещё интересно, но если вдруг - на HTMX 2 можно достаточно смело ехать.
Greenmail для локальной работы в докере
Но кое-какой нюанс с переездом всё таки был - если покрытие серверного кода, включая рендеринг HTML у меня близок к 100%, то динамика UI (у меня там ещё и alpine.js немного есть) у меня очень слабо покрыта e2e тестами - есть только тесты на критичные сценарии - регистрация и логин и создание карточки клиента и приёма.
Поэтому я на всякий случай после переезда на HTMX 2 решил руками прогнать полный регресс.
И упёрся в небольшую шероховатость DevX-а проекта.
Наполовину по историческим причинам и наполовину во имя простоты бэка, сейчас при регистрации пароль отправляется письмом на почту юзера.
Примерно по тем же причинам, в проде для отправки почты у меня используется бесплатный ящик на Яндексе. И креды от него, по понятным причинам, куда-то заныканы.
Соответственно, при локальной разработке, после чекаута проекта зарегаться нельзя - надо сначала как-то настроить отправку писем.
Об это я и споткнулся, когда начал делать регресс в новом проекте - обычно я 99% работы делаю через тесты и ещё для 0.99% работы мне достаточно юзера, который добавляется в демо-данных при локальной разработке.
А вот регистрация из коробки не работала.
Вот это я и залечил, добавив Greenmail в проект компоуза локальной инфры.
И написав shell-однострочник для выковыривания пароля оттуда:
PS>
Напоминаю, что мне в ТА можно поконтрибьютить.
Если вы опытный разработчик и вам не комфортно работать в том стиле, в котором пишете сейчас - это хороший способ пощупать ЭП руками и понять нравится ли вам такой DevX.
Если вы молодой разработчик - это хороший способ получить мой менторинг на реальном проекте в замен за работу. Я очень тщательно провожу ревью и в целом стараюсь давать максимум полезной обратной связи.
Код двух подписчиков уже есть в TA - так что это вполне реально:)
Отзыв одного из них:
Если интересно - пишите в личку, договоримся о звонке для онбоардинга
#trainer_advisor@ergonomic_code #tools@ergonomic_code #kotlin@ergonomic_code #devx@ergonomic_code
На выходных спинным мозгом чутка подвигал Trainer Advisor
Переезд на Kotlin 2.0.20
Начал с того, что с третьей попытки наконец осилил переехать с Kotlin 1.9.20 на 2.0.20.
Летом при переезде на 2.0.0 (и, возможно, 2.0.10 - не помню уже точно) было какое-то совершенно невнятное сообщение об ошибке компиляции, которое ставило меня в тупик.
В этот раз было даже не сообщение об ошибке компиляции, а вообще какая-то кровавая жесть из кишёк компилятора, но победить её удалось. Случайно.
Я начал пытаться локализовать строчку, на которой компилятор взрывается (он писал файл). И долокализовался до того, что файл вообще удалил, а компилятор продолжил взрываться 🤯
Потом каким-то чудом я обнаружил, что у меня есть одноимённый файл в Gradle Test Fixtures source set. И вот когда я туда залез - там у меня уже
Мораль - чёрт его знает. Проект на 13К нетривиального кода (люблю я знаете ли проверять компиляторы на прочность) перевести мне удалось. Но чудом. Если ждали знака, чтобы попробовать перевести свой проект - вот он. Но будьте готовы к приключениям.
Переезд на HTMX 2.0.3
Следующим шагом переехал на новую мажорную версию HTMX. Просто обновил и всё заработало. Вряд ли это кому-то ещё интересно, но если вдруг - на HTMX 2 можно достаточно смело ехать.
Greenmail для локальной работы в докере
Но кое-какой нюанс с переездом всё таки был - если покрытие серверного кода, включая рендеринг HTML у меня близок к 100%, то динамика UI (у меня там ещё и alpine.js немного есть) у меня очень слабо покрыта e2e тестами - есть только тесты на критичные сценарии - регистрация и логин и создание карточки клиента и приёма.
Поэтому я на всякий случай после переезда на HTMX 2 решил руками прогнать полный регресс.
И упёрся в небольшую шероховатость DevX-а проекта.
Наполовину по историческим причинам и наполовину во имя простоты бэка, сейчас при регистрации пароль отправляется письмом на почту юзера.
Примерно по тем же причинам, в проде для отправки почты у меня используется бесплатный ящик на Яндексе. И креды от него, по понятным причинам, куда-то заныканы.
Соответственно, при локальной разработке, после чекаута проекта зарегаться нельзя - надо сначала как-то настроить отправку писем.
Об это я и споткнулся, когда начал делать регресс в новом проекте - обычно я 99% работы делаю через тесты и ещё для 0.99% работы мне достаточно юзера, который добавляется в демо-данных при локальной разработке.
А вот регистрация из коробки не работала.
Вот это я и залечил, добавив Greenmail в проект компоуза локальной инфры.
И написав shell-однострочник для выковыривания пароля оттуда:
curl -X GET "http://localhost:58080/api/user/test%40ya.ru/messages/" \
-H 'accept: application/json' | jq -r '.[] | .mimeMessage ' | grep -A7 0JfQ | python3 -m base64 -d | grep 'Пароль'
PS>
Напоминаю, что мне в ТА можно поконтрибьютить.
Если вы опытный разработчик и вам не комфортно работать в том стиле, в котором пишете сейчас - это хороший способ пощупать ЭП руками и понять нравится ли вам такой DevX.
Если вы молодой разработчик - это хороший способ получить мой менторинг на реальном проекте в замен за работу. Я очень тщательно провожу ревью и в целом стараюсь давать максимум полезной обратной связи.
Код двух подписчиков уже есть в TA - так что это вполне реально:)
Отзыв одного из них:
В целом, мне понравилось делать изменения у тебя. Не могу сказать, что согласен со всем. Мне пока кажется почти идеальным вот этот layout https://github.com/gushakov/cargo-clean
Если интересно - пишите в личку, договоримся о звонке для онбоардинга
#trainer_advisor@ergonomic_code #tools@ergonomic_code #kotlin@ergonomic_code #devx@ergonomic_code
🔥6👍2🥰2
Привет!
Ползеняшка
В Идее есть такая штука, как структурный поиск. С её помощью можно найти, например, все классы в которых есть поля id и name, в независимости от их типа и форматирования в коде (в каком порядке, с какими аннотациями, комментами и т.д.)
Ещё пример использования этой штуки - удаление модификтора suspend у всех методов всех классов репозиториев
Я вообще искал класс, в котором есть только эти поля, но сходу не осилил как это сделать - если кто-то знает как - научите в комментах, пожалуйста.
#tools@ergonomic_code
Ползеняшка
В Идее есть такая штука, как структурный поиск. С её помощью можно найти, например, все классы в которых есть поля id и name, в независимости от их типа и форматирования в коде (в каком порядке, с какими аннотациями, комментами и т.д.)
Ещё пример использования этой штуки - удаление модификтора suspend у всех методов всех классов репозиториев
Я вообще искал класс, в котором есть только эти поля, но сходу не осилил как это сделать - если кто-то знает как - научите в комментах, пожалуйста.
#tools@ergonomic_code
2❤5
Привет!
Полезняшка
Представьте, что у вас есть json-файл с массивом на 500 объектов.
И вам надо добавить в эти 500 объектов по ключу externalId с разными UUID-ами.
Есть вариант влоб - написать скриптик.
А есть вариант попроще.
Зайти в neovim и написать:
1. qq - запустить запись макроса
2. /lastExistingKey - найти следующую строку, в которой содержится подстрока с именем последнего существующего ключа
3. A - переместить курсор в конец строки и войти в режим печати
4.
5. <esc> - вернуться в командный режим
5. :read!uuidgen<enter> - запустить программу uuidgen и вставить её вывод в новой строке файла после курсора
6. I - перейти в начало строки и войти в режим печати
7.
8. <esc> - вернуться в командный режим
9. A - перейти в конец строки и войти в режим печати
10.
11. <esc> - вернуться в командный режим
12. q - завершить запись макроса
13. 499@q - 499 раз исполнить макрос
Вопрос примерно 2 минут вместе с гуглением uuidgen и задача решена.
Быстрее, наверное, только на sed/awk - но с ними у меня проблема, что такие задачи у меня раз в месяц появляются и за этот месяц у меня этот клингонский из головы выветривается. А вимом я пользуюсь каждый день и он у меня уже на подкорке.
Поддержка vim-режима есть во всех популярных ИДЕ/редакторов включая Emacs (😄 - если вы понимаете о чём я)
#tools@ergonomic_code
Полезняшка
Представьте, что у вас есть json-файл с массивом на 500 объектов.
И вам надо добавить в эти 500 объектов по ключу externalId с разными UUID-ами.
Есть вариант влоб - написать скриптик.
А есть вариант попроще.
Зайти в neovim и написать:
1. qq - запустить запись макроса
2. /lastExistingKey - найти следующую строку, в которой содержится подстрока с именем последнего существующего ключа
3. A - переместить курсор в конец строки и войти в режим печати
4.
,
- добавить запятую в конце строки5. <esc> - вернуться в командный режим
5. :read!uuidgen<enter> - запустить программу uuidgen и вставить её вывод в новой строке файла после курсора
6. I - перейти в начало строки и войти в режим печати
7.
"externalId": "
- добавить в начале стоки отступ, имя ключа и кавычку перед значением8. <esc> - вернуться в командный режим
9. A - перейти в конец строки и войти в режим печати
10.
"
- добавить в конце строки кавычки11. <esc> - вернуться в командный режим
12. q - завершить запись макроса
13. 499@q - 499 раз исполнить макрос
Вопрос примерно 2 минут вместе с гуглением uuidgen и задача решена.
Быстрее, наверное, только на sed/awk - но с ними у меня проблема, что такие задачи у меня раз в месяц появляются и за этот месяц у меня этот клингонский из головы выветривается. А вимом я пользуюсь каждый день и он у меня уже на подкорке.
Поддержка vim-режима есть во всех популярных ИДЕ/редакторов включая Emacs (
#tools@ergonomic_code
Please open Telegram to view this post
VIEW IN TELEGRAM
Neovim
Hyperextensible Vim-based text editor
🔥4👍3😁2
Привет!
Полезняшка. А для кого-то может и целых три за раз:)
Если вы не знали - с одним гит-репозом можно использовать несколько рабочих деревьев. Которые будут разделять между собой директорию .git.
Это экономит место на диске (и время синхронизации в облако, если пользуетесь) и позволяет фетчить origin только один раз.
Я этим активно пользуюсь - у меня всегда есть ворктри для основной текущей задачи, для быстрых фиксов, и для ревью каждого члена команды. Соответственно между всеми этим активностями можно переключаться по щелку. И не чертыхаться каждый раз, что надо зафетчиться.
А ещё если не знали - для Gradle есть плагин, который позволяет закинуть в проект git.properties-файл с инфой о сборке (дата, ветка, тэг, автор и т.д.), который можно добыть в рантайме через Actuator.
Ноесть была проблема - плагин не умеет в worktrees и по дефолту взрывает всю сборку при запуске из директории со вторичной копией.
Я года 4 хачил это комментированием плагина во вторчных директориях. И раза три это случайно коммитал и откатывал.
И вот наконец написал 8 строк, которые костыляют эту проблему аккуратнее
Важное уточнение - это именно костыль и в git.properties при этом попадут данные из основной рабочей директории, а не той, где была запущена сборка
#tools@ergonomic_code #tips@ergonomic_code #git@ergonomic_code
Полезняшка. А для кого-то может и целых три за раз:)
Если вы не знали - с одним гит-репозом можно использовать несколько рабочих деревьев. Которые будут разделять между собой директорию .git.
Это экономит место на диске (и время синхронизации в облако, если пользуетесь) и позволяет фетчить origin только один раз.
Я этим активно пользуюсь - у меня всегда есть ворктри для основной текущей задачи, для быстрых фиксов, и для ревью каждого члена команды. Соответственно между всеми этим активностями можно переключаться по щелку. И не чертыхаться каждый раз, что надо зафетчиться.
А ещё если не знали - для Gradle есть плагин, который позволяет закинуть в проект git.properties-файл с инфой о сборке (дата, ветка, тэг, автор и т.д.), который можно добыть в рантайме через Actuator.
Но
Я года 4 хачил это комментированием плагина во вторчных директориях. И раза три это случайно коммитал и откатывал.
И вот наконец написал 8 строк, которые костыляют эту проблему аккуратнее
// build.gradle.kts
gitProperties {
val dotGit = File(".git")
if (dotGit.isFile) {
val actualGitDir = dotGit.readText().substringAfter("gitdir: ").substringBefore("/worktrees")
this.dotGitDirectory.set(File(actualGitDir))
}
}
Важное уточнение - это именно костыль и в git.properties при этом попадут данные из основной рабочей директории, а не той, где была запущена сборка
#tools@ergonomic_code #tips@ergonomic_code #git@ergonomic_code
👍6🔥4
Привет!
Жутиков вам в утреннюю ленту.
В текущем мастере Хибера 1.3М строк Java-кода:
#whynotjpa@ergonomic_code #tools@ergonomic_code
Жутиков вам в утреннюю ленту.
В текущем мастере Хибера 1.3М строк Java-кода:
atomic-armchair : ~/tmp > git clone https://github.com/hibernate/hibernate-orm.git
Cloning into 'hibernate-orm'...
remote: Enumerating objects: 763047, done.
remote: Counting objects: 100% (333/333), done.
remote: Compressing objects: 100% (162/162), done.
remote: Total 763047 (delta 243), reused 171 (delta 171), pack-reused 762714 (from 2)
Receiving objects: 100% (763047/763047), 281.04 MiB | 2.20 MiB/s, done.
Resolving deltas: 100% (471253/471253), done.
atomic-armchair : ~/tmp > cloc hibernate-orm/
17126 text files.
17002 unique files.
204 files ignored.
github.com/AlDanial/cloc v 2.04 T=25.71 s (661.3 files/s, 77566.1 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Java 15603 266991 243111 1348435
AsciiDoc 128 10432 660 32337
XML 816 4135 4441 25428
XSD 21 3912 1455 22496
SVG 29 11 28 6548
Gradle 41 788 436 3426
CSS 7 176 184 3164
SQL 218 401 346 2981
ANTLR Grammar 8 414 698 1760
Bourne Shell 13 222 427 1599
Text 46 322 0 1354
Properties 34 179 257 952
DTD 2 143 185 805
YAML 6 37 77 588
Groovy 5 75 63 367
Markdown 6 114 6 302
HTML 2 24 4 256
Maven 7 33 24 225
DOS Batch 2 42 4 138
Dockerfile 5 20 145 75
JavaScript 1 6 0 52
Kotlin 2 6 4 25
-------------------------------------------------------------------------------
SUM: 17002 288483 252555 1453313
-------------------------------------------------------------------------------
#whynotjpa@ergonomic_code #tools@ergonomic_code
😱11
Привет!
Я из лесу вышел - а тут такоооое!
Если вы как и я посматриваете на VS Code из-за тормозов или проблем с подпиской в IDEA, но вас среди прочего останавливало отсутствие DB Client-а, то вам может быть интересно, что MS недавно выпустили официальный плагин для PostgreSQL. Пока в превью.
#ide@ergonomic_code #tools@ergonomic_code
Я из лесу вышел - а тут такоооое!
Если вы как и я посматриваете на VS Code из-за тормозов или проблем с подпиской в IDEA, но вас среди прочего останавливало отсутствие DB Client-а, то вам может быть интересно, что MS недавно выпустили официальный плагин для PostgreSQL. Пока в превью.
#ide@ergonomic_code #tools@ergonomic_code
Visualstudio
PostgreSQL - Visual Studio Marketplace
Extension for Visual Studio Code - Develop PostgreSQL applications everywhere.
🔥8👍5