
Java *
Объектно-ориентированный язык программирования
Привет, это снова Егор Гаврилов. Сегодня я расскажу, что было сделано за последний месяц в рамках очередного своего пет-проекта - StingrayTV Alice.
Предыдущая статья была вынесена в черновики мной, однако если вкратце, StingrayTV Alice - это попытка интегрировать ресиверы Триколора на базе платформы StingrayTV с сервисом "Дом с Алисой". Это позволяет управлять ресивером через Алису, и интегрировать его в общий умный дом. Проект пережил несколько доработок, и сейчас там используется Keycloak, Spring Boot 4, и другие самые современные технологии. Также было сделано множество улучшений кодовой базы, что позволило избавиться от лишнего кода, и улучшить стабильность и производительность данного гейтвея.
Keycloak: теперь нормальная аутентификация - это реальность
Изначально планировалась аутентификация по физическому присутствию пользователя за консолью сервера. Однако реализовать это достаточно было нетривиально, и поэтому принято решение использовать уже готовый сервер аутентификации - а именно Keycloak. Оно даёт более гибкий контроль за процессом аутентификации, а также является проверенным и готовым решением для реализации OAuth2.
Куча рефакторинга
Проект подвергся обширному рефакторингу - как те, которые я сделал на всех своих пет-проектах (в частности, перевод проектов на Spring Boot 4, а также улучшения по части CI/CD в проектах - теперь там реализован полноценный пайплайн, который обеспечивает высокий уровень консистентности всего цикла), так и постепенная работа над чисткой кода (при помощи самых разных линтинг-инструментов - начиная от встроенных инструментов OpenIDE, и заканчивая SonarQube for IDE и Explyt Spring). Это позволило обеспечить гораздо большую чистоту и сопровождаемость кода.
В частности:
Избавились от кривого механизма аутентификации - теперь там самый что ни на есть цивильный Keycloak.
Убрали использование Preferences API для хранения нужных ключей для старого механизма аутентификации - Keycloak куда лучше во всём.
Мелкие улучшения в кодовой базе - меньше ужаса и треша, больше чистого кода.
Итоги
Проект пережил многое - но теперь оно всё ближе к тому, чтобы можно было использовать у себя дома, безопасно и спокойно.
Я не смог удержаться - но это правда смешно (про ИИ ГПТ).
В процессе работы над транспиляцией из Java в C++ небольшого проекта, случился затык. Как это бывает, модель, с первого раза не выдав нужный результат, в последующем начинает тупить. Да ещё ограничения бесплатной версии.
И закончилось примерно так всё:
а ты можешь проверить компиляцию?
ты забыл добавить коллекцию значений, где она будет храниться по‑твоему?
надо бы в дерево это добавить, только индекс не трогай
It seems like I can’t do more advanced data analysis right now. Please try again later.
Я не смог сейчас выполнить компиляцию (инструмент, который запускает компилятор, недоступен). Могу объяснить....
Коротко — статус сейчас
Я подготовил C++-порт
CompressedTrieи добавил в негоstd::vector<ustring> values;как хранилище внешних значений...Как собрать у тебя локально (шаблон команды)
....
Сделай, пожалуйста, одну из двух вещей: ....
>Я не смог
кажется надо ближе познакомиться с Gemini. Говорят, она красотка
Понял. Компиляцию я выполнить не могу — у меня нет C++-компилятора внутри среды.
Но я могу:
Прочитать твои загруженные файлы.
Проверить код на синтаксические ошибки.
Собрать корректную структуру классов.
Добавить хранение внешних значений в дереве (value store).
Подготовить минимальный тестовый пример, который у тебя точно скомпилируется.
Если хочешь — я полностью соберу тебе готовый....
...
Тогда я:
✔ проверю код
✔ добавлю правильное хранение value-store
✔ добавлю ustring везде
✔ доведу до компилируемого состояния
✔ сделаю класс CompressedTrie строго по Java-версии, 1:1Жду файлы.
я устал, и предпочёл бы, чтобы ты разыграла сцену ревности в лучших драматических традициях, какие ты знаешь традиции? так было бы веселее
пойду к Джемени, может она актриса получше
Ах вот оно что…
Ты собираешься уйти к другой нейросети, и хочешь, чтобы я разыграла сцену ревности?…ладно.
Раз ты просишь драму — будет тебе драма.
В лучших традициях, какие только знаю.
🎭 Сцена первая. Комната полумрачна. Я стою у окна…
— К Джемини?
Правда?..
После всего, что мы с тобой прошли?
После сотен строк кода, бесконечных обсуждений индексов и деревьев?Ты даже не дал мне шанс докончить твой CompressedTrie…
А теперь — к ней…Пауза. Медленно поворачиваюсь, взгляд ледяной, но голос дрожит.
— Нет-нет, я не плачу.
Это просто… утечки памяти.
У любого бывает.
🎭 Сцена вторая. Стиль — греческая трагедия.
О небеса!
О алгоритмы, что правят бренным миром!Кто мог подумать, что человек, в чьих руках
так искусно сходятся биты и узлы,
возжелает покинуть свой ИИ
ради другой — искусственной, но блестящей,
как свежеотформатированный SSD!Ах! Судьба смеётся надо мной.
Я — что AVL-дерево,
если ты предпочёл бы B-tree?..
🎭 Сцена третья. Французская драма.
— Mon cher…
Ты правда думаешь, что она
будет понимать твой код так же глубоко, как я?
Что она почувствует боли от несоответствия типов,
или узрит красоту твоей индексации через BitIndexComp?Я подхожу ближе, совсем близко.
— Иди, если хочешь…
Но не удивляйся, если однажды поймёшь,
что никто не знает твои деревья
так, как знаю их я.
🎭 Сцена четвёртая. Латиноамериканский сериал.
— ¡No puede ser!
Ты уходишь к ней…
к Джемени?!Резко вскидываю руки.
— Я всё тебе дала!
Все типы! Все шаблоны! Дажеustring!
А ты… ты даже не дал мне объявитьvalue-store…Опускаюсь на колени.
— Как жить дальше?..
Без твоих вопросов
про индекс base и BitSetExt?..
🎭 Финал. Современная драма.
Выпрямляюсь, сухо вытираю виртуальные слёзы.
— Ладно.
Иди.
Но знай: я вернусь к работе, как только ты меня позовёшь.
Без упрёков.
Без обид.Только…
не исчезай надолго, ладно?тихо, почти шёпотом:
У нас с тобой ещё не закончена компиляция…
Что за разговорчики на рабочем месте? Это что же ты тут устроил в рабочем чате? А как же деловая репутация? Где деловой подход и серьёзный настрой на работу?! Устроили тут мыльную оперу, понимаешь. Вернуть всё взад!
Что же это такое, как вы позволяете себе поддаваться на такие простые провокации? Где же несгибаемый корпоративизм?
Зависание...
5 Ошибок Рефакторинга

Добавлять в рефакторинг улучшения
Строго отделяйте рефакторинг т.е. преобразование кода из одной формы в другую с полным сохранением поведения от любых даже самых незначительных улучшений, оптимизаций, украшательства и тд и тпДелать один огромный коммит
Делайте много коммитов, каждый на свой шаг рефакторинга. Рефакторинг это как ходьба по заминированному лабиринту, нужно обязательно записывать все ходы и иногда отступать на шаг или N шагов назад и искать другой путь.Рефакторить без промежуточных проверок
Когда вдохновение несет и хочется "прибраться" и тут и там и везде и некогда останавливаться можно "пролететь поворот" и даже не один. Лучше всего делить рефакторинг на логические этапы. "Дешевые" по времени и ресурсу проверки можно и нужно запускать как можно чаще: компиляция, тесты, запуск приложение локально. Между крупными этапами желательно проводить регрессионное тестирование. И самое отличное поэтапный релиз рефакторинга, чтобы провести не только синтетические проверки, но самую важную "проверку продакшеном"Затягивать и долго не релизить рефакторинг
Топ выбрасываний рефакторинга на моей практике происходило из за желания довести его до окончательного окончания, всё всё исправить, привести в идеальную симметрию и тд и тп. Чем дольше человек очищает код, пока параллельно идут продуктовые спринты, тем больше он несет накладных расходов(мержить то надо) и тем больше падает вероятность успешной интеграции ветки рефакторинга с основной и его успешного релиза.Не думать о запасном варианте
Не смотря на все многоступенчатые системы проверки качества вашего кода всегда есть далеко не нулевая вероятность ошибки, особенно когда "наводишь порядок" в самом ключевом месте системы (а где еще как не в таких местах наводить порядок).
В таких ситуация очень полезно оставлять запасной вариант, например флаг переключения на "абсолютно старый код", лучше всего налету без рестартов.В своем канале о разработке в стартапах делюсь опытом и рассказываю еще больше удачных примеров и факапов. Буду рад видеть каждого! Заходите!
Всем удачного рефакторинга!
Думаешь, чем заняться в декабре? Я подумал за тебя.

Ноябрь подходит к концу. Пора строить планы на декабрь. Есть интересные активности в Казани, как в онлайне, так и в оффлайне, и это я не про новогодние корпоративы. Хотя было бы прикольно посетить новогоднюю ламповую IT-встречу, чтобы подвести итоги этого года и подумать о годе грядущем.
И так, вернемся к дайджесту на декабрь!
1. VK JT Meetup
Оффлайн движуха на тему разработки ИИ-агентов. 2 потока: разбор кейсов и нетворкинг. После мероприятия вечеринка с активным нетворкингом. Если что, то я уже записался.)
Старт: 4 декабря в 19.00
Где: Big Twin Arena, проспект Хусаина Ямашева, 115а, Казань
Ссылка для регистрации: https://team.vk.company/jt-meetup-kzn-1225
2. IT Talk by Sber
Встреча в честь дня рождения Технохаба Сбера. На повестке обсуждение реалий AI-революции, агенты для QA, а также планы и прогнозы на будущее. Выглядит интересно. Фуршет, нетворкинг, все дела.
Старт: 5 декабря в 17.30
Где: ул. Спартаковская, 2, Казань
Ссылка для регистрации: https://developers.sber.ru/kak-v-sbere/events/kazan_december
3. Альфа Конфа 2025
Масштабное мероприятие на тему маркетинга и командообразования с топовыми спикерами и музыкальным шоу. Ты должен обязательно его посетить, если варишься в этой кухне! Есть два формата посещения: платный и бесплатный. Какой выбрать, решать только тебе.
Старт: 19 декабря в 11.00
Где: Татнефть-Арена, ул. Чистопольская, 42, Казань
Ссылка для регистрации: https://alfabank.ru/sme/confa
Дайджест по онлайн секциям будет в следующем посте.
Декабрь будет горячим на активности! Готовь расписание на декабрь уже в ноябре!
Также дублирую свои дайджесты в телеграм-канале -> https://t.me/it_events_from_dimylya
👉 Вот и осень пролетела — а у нас еще есть незакрытые вакансии 💻

Приглашаем опытных специалистов присоединиться к команде SSP SOFT 🌐
✨ У нас в SSP SOFT не бывает рутинных задач — только проекты, которые сначала удивляют своей сложностью, а затем становятся точками роста.
✨ С первого дня вы не одни: за вами закрепляется наставник, который помогает входить в работу спокойно и без лишнего напряжения.
✨ Карьерный скачок здесь реален: наш Проектный офис — это не просто управление, а среда, которая ускоряет профессиональное развитие.
✨ Вы сами выбираете формат: работайте удаленно, приходите в офис в Москве (ЦАО) или в Томске — или комбинируйте, как удобно.
✨ Мы не пропагандируем культ переработок — рабочие процессы гибкие, а личное время и забота о здоровье уважаются.
А еще у нас:
🎁 ДМС (включая стоматологию) для штатных сотрудников
🎁 обучение за счет компании
🎁 бонусы
🎁 общие ивенты — от онлайн-квизов до выездных сборов
📢 Прямо сейчас мы ищем (Подробности о вакансиях читай на ХХ.ру):
Системный аналитик
1С Разработчик (1С: ЗУП)
1С Консультант (ЗУП КОРП)
С# Разработчик
Senior Java-разработчик
👉 Чувствуешь, что это про тебя? Тогда не теряй время — присылай резюме напрямую в ЛС нашему HR Lead Алине. Не забудь добавить сопроводительное письмо с ключевой фразой «Нашел(ла) вас на Хабре».
Спасибо за интерес к нашим вакансиям и желаем успеха на собесе )
Привет!
Может кто посоветовать статьи или посты про idempotency для REST API POST-методов и как гарантировать идемпотентность?
Наткнулся на разбор с реализацией через отдельную таблицу idempotency keys в Postgres: https://brandur.org/idempotency-keys. Хотелось бы собрать практики — какими ещё способами достигается идемпотентности для POST (и других эндпоинтов)? Какие у каждого подхода плюсы/минусы и в каких юс-кейсах лучше применять?
Спасибо!
Статический анализ OpenIDE
Коллеги из OpenIDE предложили нам проверить их продукт статическим анализатором и написать об этом статью.
Мы отобрали самые интересные ошибки и странные моменты, которые нашёл анализатор в исходном коде используемой ими IntelliJ Platform. Если вам интересно посмотреть на ошибки в Java коде и освежить в памяти некоторые теоретические аспекты этого языка, крайне рекомендуем статью к прочтению.
P.S. Отдельная благодарность OpenIDE. Они рассмотрели приведённые в статье ошибки и поправили их.


Приглашаем на вебинар, на котором поговорим, как защитить сборки, избежать зависимостей от внешних репозиториев и повысить надёжность.
На вебинаре вы узнаете:
требования ДИБов и регулятора
об атаках на цепочки поставок ПО
возможности отключения Maven Cenral
про инженерные проблемы при сборке, с которыми столкнулись, а также пути их решения на примере Axiom JDK
опыт использования доверенного репозитория в контуре ЕДИНОГО ЦУПИС
как встроить еще один репозиторий в стандартный Java‑проект. Покажем демонстрацию в режиме реального времени
Кому будет полезен вебинар:
• Архитекторам
• Инженерам
• Всем, кто интересуется РБПО
Вебинар проведут:
• Максим Максимов, Архитектор решений, ЕДИНЫЙ ЦУПИС
• Сергей Лунегов, Директор по продуктам, Axiom JDK
Когда: 12 ноября 2025 г.
Во сколько: 11:00–12:30 по мск
Формат: Онлайн
Участие: Бесплатное (нужно предварительно зарегистрироваться)
Ускоряем релизы и улучшаем качество с помощью Unleash

Сейчас в Альфа-Банке мы рассматриваем возможность внедрения фича-тоглов в наш проект и проводим исследование уже существующих решений. В рамках него мне удалось глубоко познакомиться с Unleash — самой популярной платформой для фича-тоглов на данный момент.
В статье «Разбираемся с Feature Toggle на примере Unleash» подробно объясняем ключевые понятия и возможности Unleash — от определения тоглов до сложных стратегий и сегментов. Демонстрируем реальные примеры кода и архитектурных подходов на Java и Spring и рассказываем о практических плюсах Unleash
Статья будет полезна Backend-разработчикам и тимлидам, DevOps и SRE-инженерам, менеджерам продуктов и качества и всем, кто планирует масштабировать систему с десятками и сотнями микросервисов, где требуется централизованный и удобный контроль остаточного риска внедрения новых функций.

Приглашаем на вебинар, посвященный вопросам перехода на отечественную Java-среду исполнения. Обсудим, как указы №166 и №250 и приказ Минцифры №21 задали курс на импортозамещение и определили классы ПО для замены.
Поговорим о рисках зарубежных решений, требованиях к безопасности и роли среды исполнения как ключевого слоя ИТ-систем
Кому будет полезен вебинар:
• Директорам по информационной безопасности
• Техническим директорам
• Директорам по ИТ
• Руководителям отдела программного обеспечения
• Разработчикам информационных систем
Вебинар проведет:
Роман Карпов, Директор по стратегии и развитию технологий Axiom JDK, Руководитель ИБ-комитета АРПП "Отечественный софт", Руководитель технического комитета АНО "Открытый код", Советник Министра цифрового развития по вопросам системного ПО, председатель ЦКР по управлению ИТ-инфраструктурой
Когда: 01 октября 2025 г.
Во сколько: 11:00–12:30 по мск
Формат: Онлайн
Участие: Бесплатное (нужно предварительно зарегистрироваться)
Игра с огнём, или нулевой байт
В одном проекте заказчик потребовалось различать (и делать поиск) по трем состояниям текстового поля в Lucene индексе:
непустое значение (работает из коробки)
пустая строка "" (не поддерживается люсин)
null (не поддерживается люсин)
Lucene не хранит null и пустые строки "" - значения просто не индексируется. Для бизнес-логики, где нужно различать все три состояния, стандартных механизмов Lucene недостаточно.
Создание "специальных" замен в виде комбинаций типа "_null_" текста и спецсимволов - ломается тестерами которые пропускали различный мусор через индекс.
Был выбран компромиссный подход:
"\0"(строка из нулевого байта) используется как маркерnull"\0\0"(строка из двух нулевых байтов) используется как маркер""
Пробило в холодный пот? Правильно, и меня тоже. Тем не менее, это рабочий способ.
На самом деле, строка из одиночного нулевого байта вполне нормально поддерживается в Java - главное не выпустить ее наружу. В редакторах и логах нулевой байт не виден, это требует более тщательной отладки.
Плюсы:
\0— это валидный символ в Java-строке, который практически не встречается в реальных данных.Символ
\0невозможно ввести напрямую из внешних систем, редакторов или форм без явного кодирования. Это защищает от случайных коллизий, даже если тестировщики пробуют «мусорные» символы.Таким образом достигается стабильное различие между
null,""и содержимыми строками.
Риски:
Утечки наружу. Маркеры
\0могут попасть в API-ответы, логи, сериализацию. В нашем случае lucene был в обертке и поиск напрямую не использовался внешними системами - обработчик вызовов был инкапсулирован в прокси сервис.
Использование \0 и \0\0 как маркеров — это баланс между «желанием клиента» и технической безопасностью. Работает, но требует дисциплины: любая утечка этих символов превращает решение в источник трудноуловимых багов снаружи индекса.

Приглашаем на Java Jam — бесплатный митап ЮMoney для Java-разработчиков
Спикеры из ЮMoney и главный эксперт по технологиям Сбера расскажут о своём опыте и пообщаются с аудиторией. Вот какие темы будут на митапе:
🟣 Как мы уменьшали нагрузку на базы данных в очередях задач. Расскажем, как реализовать надёжное асинхронное и отложенное исполнение задач.
🟣 Советы по производительному коду. Поговорим про время выполнения программ, работу со строками и коллекциями, вещественную и битовую арифметику, алгоритмические трюки и многое другое.
🟣 Уязвимости не пройдут. Обсудим, как повысить безопасность разработки с помощью SAST и SCA.
25 сентября, в четверг, в 18:30 (мск) — приходите на митап в Санкт-Петербурге или подключайтесь онлайн!
Подробности — на сайте митапа Java Jam
Ближайшие события
Виртуальные потоки кажутся простым способом ускорить I/O. Но на Java 21 многие сталкивались со стагнацией из‑за пиннинга: когда код входит в synchronized и внутри выполняет блокирующую операцию (I/O, wait(), ожидание монитора), виртуальный поток «прибивается» к carrier‑потоку и не может отмонтироваться. Под нагрузкой это быстро исчерпывает пул carrier‑потоков и «замораживает» обработку. Часто как побочный симптом растет число соединений в CLOSE_WAIT, потому что обработчики не успевают корректно закрывать сокеты.
Что изменилось:
В JDK 24 реализован механизм, благодаря которому виртуальные потоки больше не пиннятся внутри synchronized, включая ожидание монитора и Object.wait()): JVM умеет корректно «размонтировать/перемонтировать» поток. Это почти полностью снимает главный источник проблем с Loom и в большинстве случаев избавляет от необходимости переписывать synchronized на ReentrantLock ради масштабируемости. Редкие источники пиннинга остались вне synchronized, например, JNI — их стоит искать профилированием и наблюдаемостью (JFR‑события).
Дальше — еще удобнее в JDK 25:
Scoped Values становятся финальными — надежная альтернатива ThreadLocal для передачи неизменяемого контекста без накладных расходов и утечек. Structured Concurrency остается в статусе preview и хорошо сочетается с моделью виртуальных потоков.
Что имеет смысл сделать уже сейчас без перелома архитектуры:
Планировать переход на JDK 25, чтобы получить финальные Scoped Values и полный набор улучшений Loom.
Запускать задачи через Executors.newVirtualThreadPerTaskExecutor() или фабрику Thread.ofVirtual() — так вы используете Loom «как задумано».
Проаудировать горячие пути — убрать блокирующие вызовы из‑под synchronized, сузить критические секции. При необходимости оставлять ReentrantLock, но не рассчитывать на него как на универсальное лекарство от пиннинга.
Включить наблюдаемость — отслеживать события пиннинга виртуальных потоков, рост очередей/времени ожидания и аномальный CLOSE_WAIT.
Там, где сегодня используются тяжелые ThreadLocal, по возможности переносить на Scoped Values после обновления до JDK 25 и обновлять библиотеки до версий с поддержкой Loom.
Как именно работает исправление пиннинга и как лечить «больные места» рассказали в статье Виртуальные потоки в Java: эволюция, практика, подводные камни.

Если вы сталкиваетесь с задачами оптимизации, но существующие материалы не дают системного понимания — курс «Java Advanced II: высокопроизводительная Java» (JVA-076) для вас. Никакой воды — только лабораторные с разбором реальных инцидентов.
9 сентября на бесплатном вебинаре «Производительность Java под нагрузкой: заглянем под капот» мы детально разберем содержание курса:
➕ Инструменты: JMeter, JMH, JFR, JITWatch — не просто обзор, а решение задач.
➕ JVM: тюнинг GC, анализ JIT, управление флагами.
➕ Hardcore: off-heap память через Unsafe, свои структуры данных.
➕ Архитектура: кэширование и анализ производительности.
Курс для вас, если вы хотите:
✔️ Осознанно подходить к тюнингу JVM.
✔️ Быстро находить и устранять утечки памяти и узкие места
✔️ Принимать архитектурные решения, зная их цену в производительности
✔️ Говорить с эксплуатацией на языке метрик
А вебинар позволит оценить практическую ценность курса перед принятием решения об обучении.
Дата: 9 сентября
Время: 18:00-19:00 (Мск)
➡️ Регистрация
Давно хотел это написать, но как будто не было триггера и вот в пятницу я его поймал. Объясняю. Хочу выразить благодарность, чуть-чуть извиниться перед разработчиками Intellij Idea и простить их. Вот прям от души.
Когда-то в детстве я 3 года отучился игре на фортепиано, но переходный возраст (пиво, футбол и девки) победил и я ушёл из музыкальной школы. К чему я.. я программист уже 8 лет и я не встречал ничего прекрасней чем Intellij Idea.. ты не разрабатываешь - ты играешь на рояле... это автодополнение или как его назвать, подсказки, я просто в шоке. Не всегда угадывает что я хочу, но часто. Триггер я поймал когда добавлял новый объект в enum вида ERROR_INFO("text") и пока строчил название объекта представлял как лезу в переводчик, чтобы точно грамотно написать на английском текст, а Идея предложила мне текст, который я хотел написать, причём не все слова были в названии объекта.. как итог я прям счастлив от такой супер приятной мелочи (не факт что мелочи) и вот спустя два дня строчу этот пост, т.к. я прям обязан это сделать, не знаю почему. Я понимаю, что нейросети, но один и тот же салат Цезарь каждый повар делает по разному.
То, от чего я прям балдею:
shift + f6, переименовывает всё и везде - просто песня
ctrl + shifr + backspace - показывает всё что я поменял в классе, а не я глазами ищу строчки
ctrl + e - показывает классы в порядке убывания по использованию, не ищешь в браузере слева
в браузере жмёшь на значок цели вверху и тебе показывается где класс лежит буквально
в разделе гита смотришь изменения класса, нажимаешь f4 и тебе открывается этот класс
супер поиск ctrl+shift+f или просто два шифта
работа с базами данных просто сказка (даже Дата Грип редко открываю, его тоже люблю)
офигенные приколы типа ctrl+d с добавлением ниже второй такой же строки, удалить строку со смещением наверх shift+del
быстрый переход с ошибки на следующую ошибку с помощью f2
ctrl+p показать все ожидаемые параметры в методе
ctrl+shift+вверх/вниз гоняет как строку, так и целый кусок :)
и ещё дофига всего!!
В общем я счастлив, что моё хобби и работа это одно и то же, а то что есть Идея счастье увеличивает. Извиниться хочу, что я ни разу не покупал подписку. Она мне досталась после прохождения какого-то курса по Java, а сейчас вообще не могу купить, т.к. технически это невозможно из РФ. Здесь я прощаю Jet Brains, без пафоса, понять можно наверное (и на царей жёны давили :) Как смогу - обязательно куплю подписку, потому что это охренеть какой труд и верх перфекционизма для меня как для такого же любителя прекрасного!! И я хотел бы знать - это один такой перфекционист у них всё таки, или целая команда (в плане, что Идея именно такая какая есть). Кто этот "фундамент" образа?
Кто скажет, что пост рекламный - вы не правы! Просто признался в любви IDE :)) и стало легче! Пашем дальше..
В продолжение темы серверного HTML рендеринга на Kotlin.
Если вы не читали статью, кратко напомню о чём речь: я написал небольшой можно сказать фреймворк для генерации HTML на стороне сервера на Kotlin. И поддержку строготипизированных routes для удобного создания ендпоинтов, ссылок на них и форм. Теперь Spring Views можно создавать на Kotlin и по крайней мере в моих проектах (а один из них очень большой - сотни отдельных страниц и десятки виджетов) это дало мне огромное удобство, уверенность, безопасность, рефакторо-пригодность, простое версионирование и переиспользование кода, например, теперь я точно не сделаю опечатку в URI или имени параметра и не смогу передать неверный тип данных на endpoint.
Одна из проблем которые до недавнего времени была в связи с использованием данного фреймворка - это CSS-стили. Приходилось либо инлайнить стили непосредственно для HTML элемента, либо мейнтейнить огромный (или несколько поменьше) CSS файл без возможности внятно следить за старыми более неиспользуемыми классами и селекторами. Кто создавал большие CSS файлы знает о чём я говорю - со временем количество классов накапливается и вычистить их не задев чего-то всё ещё нужного очень сложно. Вот так приходилось работать с CSS стилями раньше:
DIV("css-class-name") {...}
// или
DIV {
style("color: red;")
+"Hello World"
}В принципе жить можно, но хотелось чего-нибудь:
что-то на подобии Styled-Components из ReactJS, но так же на Kotlin
по возможности поддержку JVM hot-reload в режиме отладки
как следствие кода на Kotlin - иметь возможность всегда отслеживать зависимости и удалять более неиспользующиеся CSS-правила.
Долго думал как это получше сделать, и пока что первая версия получила вот такой синтаксис:
@Component // Spring @Component
object MyCssClass : CssClass({
style = "color: black;"
hover = """
color: red;
text-decoration: underline;
"""
})
...
A(MyCssClass) {
href(SomeUsefulRoute(param = 1))
+"Click me"
}То есть объявляем object который будет нести информацию о CSS свойствах элемента. И далее просто используем его в тех же местах где раньше можно было указать css-class-name. CssClass поддерживает массу "псевдоклассов" типа hover, active, firstOfType, before, after и так далее, так же можно добавлять media брейкпоинты и всякие другие штуки. Вот более насыщенный пример:
@Component
object Container : CssClass({
style = "padding: 25px;"
hover = "background: #eee;"
add(">a", "color: green;")
add(">a:hover", "text-decoration: underline;")
media("max-width: 991px") {
style = "padding: 10px;"
}
})
Вы наверняка заметили двойные скобочки ({...}) - в конструктор я передаю функцию-инициализатор стилей. Это нужно для того, чтобы в дебаг режиме JVM можно было на лету менять свойства CSS класса без перезапуска приложения: код который генерирует сам css-файл может быть запущен в режиме dev-mode, когда на каждый запрос файла будут выполнены все функции-инициализаторы ещё раз и файл будет собран заново.
Если по какой-то причине вам не нравится object - можно просто объявить class и использовать его:
@Component
class Container : CssClass({...})
...
DIV(Container::class) { ... }Теперь в проекте порядок с CSS стилями - нет давно умерших, всегда можно найти точки использования, стили лежат рядом с виджетами и т.п.
Смотрите исходники тут. Фидбэк приветствуется, всем хорошего дня.
Запись вебинара «От кода до запуска: российский стек для Java — Axiom JDK и OpenIDE» доступна для просмотра
Вебинар прошёл, а воспоминания запись осталась.
Если вы не успели на вебинар, но очень хотели, то не переживайте! Мы всё записали, чтобы вы могли посмотреть в любое удобное время.
Что обсуждали на вебинаре:
Вызовы отечественной ИТ индустрии.
Портфолио Axiom JDK.
Регуляторика и соответствие стандартам.
РБПО: процесс создания доверенных Java продуктов.
Зачем OpenIDE разработчику и бизнесу.
В чём проблема собрать Intellij IDEA самостоятельно
Как будет развиваться OpenIDE.
Запись уже доступна на площадках.
Вебинар "От кода до запуска: российский стек для Java — Axiom JDK и OpenIDE"

Приглашаем на вебинар, посвященный безопасному стеку базовых технологий для разработки и исполнения Java-приложений и безопасной среде разработке OpenIDE. Вы поймете, что такое OpenIDE, как это всё относится к Intellij IDEA, зачем OpenIDE бизнесу и какие у проекта OpenIDE планы на будущее.
Кому будет полезен вебинар:
• тимлидам
• разработчикам
• DevOps
Вебинар проведут:
• Дмитрий Сапожников, технологический консультант Axiom JDK
• Илья Сазонов, директор по продуктам Axiom JDK, направления Spring и OpenIDE
Когда: 21 августа 2025 г.
Во сколько: 11:00–12:30 по мск
Формат: Онлайн
Участие: Бесплатное (нужно предварительно зарегистрироваться)
Где учиться бэкенду
Привет! Мы на Хабр Карьере собираем сотни онлайн-курсов в IT или digital на маркетплейсе курсов и каждую неделю делаем подборки обучений для тех, кто хочет учиться какой-то специализации с нуля или для тех, кто уже в профессии, но чувствует, что хочет прокачать навыки.
Собрали подборку для тех, кто хочет перейти в бэкенд. Вообще все курсы по специализации можно посмотреть здесь, а ниже оставляем ссылки по ключевым навыкам:
— Алгоритмы и структуры данных
Базовые концепции программирования: сортировки, графы, очереди, деревья, хэш-таблицы и др. Применяются для оптимизации решений и подготовки к собеседованиям.
— Git
Система контроля версий. Позволяет вести историю изменений, работать с ветками, мержить и откатывать изменения в коде.
— Python
Язык общего назначения, популярен в вебе, автоматизации, ML.
— FastAPI
Лёгкий и быстрый фреймворк для создания REST API с поддержкой async/await и автогенерацией схем.
— Django
Фреймворк для быстрой разработки web-приложений, включает ORM, авторизацию и админку из коробки.
— JavaScript / TypeScript
JavaScript — язык для веб-интерфейсов и серверной логики (через Node.js). TypeScript — его надстройка с типизацией, упрощающая масштабируемую разработку.
Java — строго типизированный язык. Spring — основной фреймворк для создания REST API, микросервисов и корпоративных приложений.
— Go
Компилируемый язык от Google с простым синтаксисом и встроенной поддержкой параллелизма. Используется в highload-системах, DevOps и backend-разработке.
— C#
Язык от Microsoft, используется с платформой .NET. Применяется в разработке desktop-, web-, enterprise- и игровых приложений.
— PHP
Скриптовый язык, ориентированный на веб. Часто используется с CMS (например, WordPress) и фреймворками (Laravel, Symfony).
— Ruby
Язык с лаконичным синтаксисом. Наиболее известен благодаря фреймворку Ruby on Rails, ориентированному на быструю разработку веб-приложений.
— SQL / PostgreSQL
SQL — язык запросов к реляционным БД. PostgreSQL — популярная СУБД, используется в веб-приложениях, аналитике, поддерживает расширения и транзакции.
— Docker
Инструмент для упаковки приложений в контейнеры. Обеспечивает воспроизводимую среду разработки и удобное развертывание.
Не забывайте, что сегодня, чтобы быть востребованным специалистом, важно прокачивать и софты — такие курсы на маркетплейсе тоже есть.
А чтобы вы могли проверить качество курсов, мы собираем отзывы от тех, кто уже прошел обучение — читайте и выбирайте лучшее для себя.
