Совет по Java 💡
Чтобы сделать большие и сложные цепочки компараторов более читаемыми, мне нравится присваивать компараторы переменным, имена которых начинаются с "by". Таким образом, вызов
@javatg
Чтобы сделать большие и сложные цепочки компараторов более читаемыми, мне нравится присваивать компараторы переменным, имена которых начинаются с "by". Таким образом, вызов
sorted() становится меньше и читается почти как естественный язык. Кроме того, вы можете использовать статический импорт.@javatg
👍34🔥11❤6
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1
🔥На Stepik вышел курс: Linux: полный апгрейд твоих скиллов
Хочешь реально понимать, что происходит под капотом твоей системы, а не просто кликать по GUI?
Без глубокого знания базы ты не инженер - ты просто пользователь.
🔹 В курсе ты:
- Освоишь bash, grep, sed, awk - инструменты, которыми живут админы.
- Разберёшь права, процессы, сеть, файловую систему и научишься чинить всё, что падает.
- Настроишь SSH, firewall, systemd, crontab, демоны и автозапуск.
- Научишься анализировать логи, следить за нагрузкой, и не паниковать при 100% CPU.
💡 Формат: пошаговое объяснение базы и разбор важных практик по работе с Linux.
🎯 После курса ты: будешь чувствовать Linux как родную среду и забудешь, что такое “permission denied”.
🚀 24 часа действует скидка 30%
👉 Учиться со скидкой
Хочешь реально понимать, что происходит под капотом твоей системы, а не просто кликать по GUI?
Без глубокого знания базы ты не инженер - ты просто пользователь.
🔹 В курсе ты:
- Освоишь bash, grep, sed, awk - инструменты, которыми живут админы.
- Разберёшь права, процессы, сеть, файловую систему и научишься чинить всё, что падает.
- Настроишь SSH, firewall, systemd, crontab, демоны и автозапуск.
- Научишься анализировать логи, следить за нагрузкой, и не паниковать при 100% CPU.
💡 Формат: пошаговое объяснение базы и разбор важных практик по работе с Linux.
🎯 После курса ты: будешь чувствовать Linux как родную среду и забудешь, что такое “permission denied”.
🚀 24 часа действует скидка 30%
👉 Учиться со скидкой
🔥7👍5❤3
spring-context-indexerКак вы знаете, при старте Spring Boot-приложения много времени уходит на classpath scanning. Даже если вы используете
@ComponentScan, Spring всё равно перебирает кучу классов в поиске бин-кандидатов. Это рефлексивно и медленно.📌 Есть способ это оптимизировать —
spring-context-indexer.🔧 Что делать
1. Добавьте зависимость в
pom.xml:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>6.1.3</version> <!-- актуальная для Spring Boot 3 -->
<optional>true</optional>
</dependency>
2. Всё! Spring Boot на этапе компиляции сгенерирует индекс классов с аннотациями (
@Component, @Service, @Repository, и т.п.) в META-INF/spring.components.3. При старте приложения Spring сначала смотрит в индекс, а не сканирует classpath целиком.
💡 Полезно, если:
- У вас много модулей;
- Вы используете fat JAR;
- Приложение долго стартует и важна скорость.
⚠️ Важно
- Работает только с аннотациями Spring, не с кастомными;
- Не забудьте включить annotation processing в IDE (особенно в IntelliJ:
Settings → Build, Execution, Deployment → Compiler → Annotation Processors).📊 Профит: в крупных проектах - до 30–50% ускорения старта.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10
Media is too big
VIEW IN TELEGRAM
Не пропусти МТС True Tech Champ — масштабный фестиваль 21 ноября для тех, кто живет технологиями 🔥
Тебя ждут:
▫️ Захватывающая сюжетная линия. Тебя ждет уникальная кибервселенная с возможностью влиять на ход происходящего.
▫️ Конференция с международными спикерами. Эксперты расскажут о трендах в ИИ и инновациях в индустрии.
▫️ ИТ-качалка. Наращивай экспертизу на воркшопах.
▫️ Шоу-финал ИТ-чемпионата. Более 250 талантов со всей России сразятся в лайв-кодинге и программировании роботов на скоростное прохождение лабиринтов со спецэффектами. Выбирай и болей за фаворитов.
▫️ Айтивности. Тебя ждут бои роботов, кодерские челленджи, пайка плат и не только. Заработай True Coins и обменяй их на стильный мерч.
▫️ HR-Hub. Команда МТС расскажет о возможностях для развития в компании и поможет перезагрузить карьерный трек.
▫️ Афтепати со звездными хэдлайнерами. Зажги под популярные хиты.
Когда: 21 ноября, МТС Live Холл в Москве и онлайн.
Регистрируйся на сайте. Участие бесплатно, количество мест ограничено.
Тебя ждут:
▫️ Захватывающая сюжетная линия. Тебя ждет уникальная кибервселенная с возможностью влиять на ход происходящего.
▫️ Конференция с международными спикерами. Эксперты расскажут о трендах в ИИ и инновациях в индустрии.
▫️ ИТ-качалка. Наращивай экспертизу на воркшопах.
▫️ Шоу-финал ИТ-чемпионата. Более 250 талантов со всей России сразятся в лайв-кодинге и программировании роботов на скоростное прохождение лабиринтов со спецэффектами. Выбирай и болей за фаворитов.
▫️ Айтивности. Тебя ждут бои роботов, кодерские челленджи, пайка плат и не только. Заработай True Coins и обменяй их на стильный мерч.
▫️ HR-Hub. Команда МТС расскажет о возможностях для развития в компании и поможет перезагрузить карьерный трек.
▫️ Афтепати со звездными хэдлайнерами. Зажги под популярные хиты.
Когда: 21 ноября, МТС Live Холл в Москве и онлайн.
Регистрируйся на сайте. Участие бесплатно, количество мест ограничено.
🧠 Быстрый профилинг Java:
Хотите понять, что JIT-компилятор делает с вашим кодом и где реально тратится время?
Есть скрытая, но очень полезная фича JVM — флаг:
📌 Что даёт?
JVM начнёт логировать все методы, которые JIT компилирует, и в какой момент.
Вы увидите:
- какие методы вызываются чаще всего (горячие точки);
- какие инлайнятся и оптимизируются;
- где есть неожиданные “узкие места”.
💡 Зачем это нужно?
- Быстро найти кандидатов на оптимизацию;
- Понять, почему приложение медленно стартует (компиляция тяжёлых методов);
- Увидеть, какие части кода JIT не трогает (и, возможно, почему).
⚠️ Нюанс: это диагностический инструмент. На продакшене лучше использовать аккуратно (или дублировать трафик на стенд).
👉 Хочешь глубже? Смотри ещё
Быстрый взгляд на JIT — и вы понимаете поведение кода куда глубже.
-XX:+PrintCompilationХотите понять, что JIT-компилятор делает с вашим кодом и где реально тратится время?
Есть скрытая, но очень полезная фича JVM — флаг:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation -jar app.jar
📌 Что даёт?
JVM начнёт логировать все методы, которые JIT компилирует, и в какой момент.
Вы увидите:
- какие методы вызываются чаще всего (горячие точки);
- какие инлайнятся и оптимизируются;
- где есть неожиданные “узкие места”.
💡 Зачем это нужно?
- Быстро найти кандидатов на оптимизацию;
- Понять, почему приложение медленно стартует (компиляция тяжёлых методов);
- Увидеть, какие части кода JIT не трогает (и, возможно, почему).
⚠️ Нюанс: это диагностический инструмент. На продакшене лучше использовать аккуратно (или дублировать трафик на стенд).
👉 Хочешь глубже? Смотри ещё
-XX:+PrintInlining — покажет какие методы JVM решила инлайнить (и почему отказалась).Быстрый взгляд на JIT — и вы понимаете поведение кода куда глубже.
🎉7👍5🔥2❤1🥰1
По сути это модульный веб-фреймворк для Java, который упрощает создание современных веб-приложений. Он поддерживает множество популярных библиотек и инструментов, таких как MVC, WebSockets, и многие другие, предоставляя простой интерфейс для разработки.
Jooby - хороший выбор для разработчиков, которые ищут простой и расширяемый веб-фреймворк с хорошей производительностью.
https://jooby.io/
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥2🥰1
Рассмотрите этот, на первый взгляд, безобидный код:
public class SideEffectSurprise {
static int x = 10;
public static void main(String[] args) {
int result = x + increment() + x;
System.out.println("result = " + result);
System.out.println("x = " + x);
}
static int increment() {
return ++x;
}
}
Вопрос:
Что выведет программа?
Почему?
Как именно вычисляется выражение x + increment() + x — слева направо или как-то иначе?
Please open Telegram to view this post
VIEW IN TELEGRAM
Команда Яндекса — это профессионалы, которые одержимы своим делом и решают задачи, где нет готовых решений.
Сейчас мы ищем сильных бэкенд-разработчиков — с опытом от 3 лет на C++, Python, Java или Go. Участвуйте в Week Offer, чтобы получить офер онлайн, всего за неделю.
Как будет проходить Week Offer Backend?
• Подайте заявку до 12 ноября.
• Пройдите технические секции 15 и 16 ноября.
• Познакомьтесь с командами и получите офер 17–21 ноября.
Если вам интересно строить полезные сервисы вокруг ИИ-технологий, проводить исследования и превращать их в реальные продукты для миллионов пользователей — переходите по ссылке. На сайте собрали все подробности.
Сейчас мы ищем сильных бэкенд-разработчиков — с опытом от 3 лет на C++, Python, Java или Go. Участвуйте в Week Offer, чтобы получить офер онлайн, всего за неделю.
Как будет проходить Week Offer Backend?
• Подайте заявку до 12 ноября.
• Пройдите технические секции 15 и 16 ноября.
• Познакомьтесь с командами и получите офер 17–21 ноября.
Если вам интересно строить полезные сервисы вокруг ИИ-технологий, проводить исследования и превращать их в реальные продукты для миллионов пользователей — переходите по ссылке. На сайте собрали все подробности.
Где хранятся статические поля классов?
Anonymous Quiz
32%
В Heap
27%
В Stack
30%
В Metaspace
2%
В регистре процессора
8%
В оперативной памяти
👍7🔥3
Серия бесплатных онлайн-уроков от Центрального университета: продукт, ML, аналитика, разработка.
С 27 октября по 5 ноября — эксперты с опытом в Google, Яндексе, Т-Банке и других ведущих IT-компаниях поделятся опытом:
о том, как думают продакты, как выстраивается гибкая разработка и какие ошибки допускают аналитики.
Онлайн — в 19:00 по Москве. Можно присоединиться к любому занятию.
Главное — зарегистрироваться, чтобы получить ссылку на трансляции
С 27 октября по 5 ноября — эксперты с опытом в Google, Яндексе, Т-Банке и других ведущих IT-компаниях поделятся опытом:
о том, как думают продакты, как выстраивается гибкая разработка и какие ошибки допускают аналитики.
Онлайн — в 19:00 по Москве. Можно присоединиться к любому занятию.
Главное — зарегистрироваться, чтобы получить ссылку на трансляции
🔥2
📢 Вышел Kotlin 2.3.0-Beta2!
Новая бета-версия приносит множество улучшений по всем направлениям.
Вот ключевые новинки:
✨ Язык
• Больше стабильных и включённых по умолчанию функций.
• Новый чекер неиспользуемых возвращаемых значений - поможет ловить потенциальные баги.
• Уточнения в контекстно-зависимом разрешении имён.
🖥️ Kotlin/JVM
• Поддержка Java 25 (включая новые языковые и VM-фичи).
📱 Kotlin/Native
• Улучшенная взаимодействие с Swift: экспорт Swift-интерфейсов стал удобнее.
• Проверки границ обобщённых типов теперь включены по умолчанию — строже и безопаснее.
🌐 Kotlin/Wasm
• Поддержка полных квалифицированных имён.
• Новое предложение по обработке исключений включено по умолчанию.
⚡ Kotlin/JS
• Экспериментальная возможность экспорта suspend-функций.
• Новое представление для LongArray — лучше совместимость и производительность.
•
🛠️ Gradle
• Совместимость с Gradle 9.0.
• Новый API для регистрации сгенерированных исходников — проще интегрировать кодогенерацию.
•
📦 Стандартная библиотека
• Функциональность измерения времени (kotlin.time) теперь стабильна!
👉 http://kotl.in/2-3-0-beta2
Новая бета-версия приносит множество улучшений по всем направлениям.
Вот ключевые новинки:
✨ Язык
• Больше стабильных и включённых по умолчанию функций.
• Новый чекер неиспользуемых возвращаемых значений - поможет ловить потенциальные баги.
• Уточнения в контекстно-зависимом разрешении имён.
🖥️ Kotlin/JVM
• Поддержка Java 25 (включая новые языковые и VM-фичи).
📱 Kotlin/Native
• Улучшенная взаимодействие с Swift: экспорт Swift-интерфейсов стал удобнее.
• Проверки границ обобщённых типов теперь включены по умолчанию — строже и безопаснее.
🌐 Kotlin/Wasm
• Поддержка полных квалифицированных имён.
• Новое предложение по обработке исключений включено по умолчанию.
⚡ Kotlin/JS
• Экспериментальная возможность экспорта suspend-функций.
• Новое представление для LongArray — лучше совместимость и производительность.
•
🛠️ Gradle
• Совместимость с Gradle 9.0.
• Новый API для регистрации сгенерированных исходников — проще интегрировать кодогенерацию.
•
📦 Стандартная библиотека
• Функциональность измерения времени (kotlin.time) теперь стабильна!
👉 http://kotl.in/2-3-0-beta2
🔥7❤1🎉1
Forwarded from VK Team
Конкурс для тех, кто не боится высоких нагрузок 😎
Мы в VK вовсю готовимся к Highload++. Привезём много крутого — и вы обязаны это увидеть.
Поэтому мы решили разыграть 2 билета на ивент 💙
Условия простые:
✅подпишитесь на каналы @vkjobs, @backendhubvk и @frontendhubvk
✅нажмите кнопку «Участвовать»
✅увеличьте свои шансы и пригласите друга — вместе веселее!
Информацию об организаторе, правилах и призах ищите здесь, а результаты конкурса мы подведём 1 ноября. Удачи!
Участников: 0
Призовых мест: 2
Дата розыгрыша: 16:00, 01.11.2025 MSK (2 дня)
Мы в VK вовсю готовимся к Highload++. Привезём много крутого — и вы обязаны это увидеть.
Поэтому мы решили разыграть 2 билета на ивент 💙
Условия простые:
✅подпишитесь на каналы @vkjobs, @backendhubvk и @frontendhubvk
✅нажмите кнопку «Участвовать»
✅увеличьте свои шансы и пригласите друга — вместе веселее!
Информацию об организаторе, правилах и призах ищите здесь, а результаты конкурса мы подведём 1 ноября. Удачи!
Участников: 0
Призовых мест: 2
Дата розыгрыша: 16:00, 01.11.2025 MSK (2 дня)
Рассмотрите следующий фрагмент кода:
public class TrickyComparison {
public static void main(String[] args) {
Integer a = 128;
Integer b = 128;
System.out.println(a == b); // Что выведет? Почему?
Integer x = 100;
Integer y = 100;
System.out.println(x == y); // А это?
}
}
Вопрос:
Что напечатает эта программа и почему? Объясните поведение оператора == при сравнении объектов типа
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Санкт-Петербург, 13 ноября в 19:00
Разберём архитектуру облачной записи встреч, наведём порядок в API и покажем, как простые решения спасают сервисы.
В программе:
📌 Как не упустить важное: архитектура облачной записи и конспектирования видеовстреч в Телемосте — Илья Григорьев, разработчик бэкенда Телемоста.
📌 Укрощение API: процессы и инструменты, которые действительно работают — Никита Ломакин, разработчик в команде Техплатформы.
📌 Как мы закапывали звездолёт: почему важно отстаивать простоту на архревью — Артемий Коцюбенко, разработчик протокольных сервисов Почты.
Команда Яндекс 360 работает с нагрузками >1.000.000+ RPS и создает продукты которыми пользуются 95+ млн человек каждый месяц — Диск, Почта, Телемост, Мессенджер и другие.
🍻А после докладов вас будут ждать афтепати и нетворкинг!
Регистрируйтесь по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Полезный совет для Spring Boot
Если клиент прислал в JSON лишние поля, а вы их не используете — приложение может упасть при десериализации.
Чтобы такого не было, добавьте к DTO аннотацию:
@JsonIgnoreProperties(ignoreUnknown = true)
Тогда лишние поля просто игнорируются, и API продолжает работать без ошибок. Удобно при обновлении контрактов и поддержке разных версий клиентов.
#SpringBoot #Java #Backend #SoftwareEngineering
Если клиент прислал в JSON лишние поля, а вы их не используете — приложение может упасть при десериализации.
Чтобы такого не было, добавьте к DTO аннотацию:
@JsonIgnoreProperties(ignoreUnknown = true)
Тогда лишние поля просто игнорируются, и API продолжает работать без ошибок. Удобно при обновлении контрактов и поддержке разных версий клиентов.
#SpringBoot #Java #Backend #SoftwareEngineering
👍28🔥6❤3
🎯 Как настроить фильтрацию запросов с помощью Spring Security и IP-блокировки
Если вы хотите улучшить безопасностб вашего приложения можно настроить фильтрацию запросов с использованием Spring Security, а также внедрить блокировку определённых IP-адресов.
1) Добавление зависимостей
В файл pom.xml добавьте следующие зависимости:
2) Создание фильтра для блокировки IP-адресов
Создайте фильтр, который будет проверять IP-адрес пользователя и блокировать его, если он находится в списке запрещённых:
3) Настройка Spring Security для использования фильтра
Теперь настроим Spring Security, чтобы наш фильтр IP-блокировки применялся ко всем входящим запросам:
4) Создание контроллера для тестирования
Создадим простой контроллер с двумя маршрутами: один доступен всем пользователям, а другой требует аутентификации:
5) Важно
Этот подход не является универсальной защитой от всех типов атак. Он помогает ограничить доступ для определённых IP-адресов, но не защищает от более сложных угроз, таких как атаки с подменой IP (например, через прокси-серверы).
Для более комплексной защиты используйте дополнительные механизмы, такие как WAF, анти-DDoS системы, а также более детальную настройку доступа через роли и права.
@javatg
Если вы хотите улучшить безопасностб вашего приложения можно настроить фильтрацию запросов с использованием Spring Security, а также внедрить блокировку определённых IP-адресов.
1) Добавление зависимостей
В файл pom.xml добавьте следующие зависимости:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2) Создание фильтра для блокировки IP-адресов
Создайте фильтр, который будет проверять IP-адрес пользователя и блокировать его, если он находится в списке запрещённых:
@Component
public class IpFilter extends OncePerRequestFilter {
private static final Set<String> blockedIps = new HashSet<>(Arrays.asList("192.168.1.100", "10.0.0.5"));
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String ipAddress = request.getRemoteAddr();
if (blockedIps.contains(ipAddress)) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.getWriter().write("Access Denied: Your IP is blocked.");
return;
}
filterChain.doFilter(request, response);
}
}
3) Настройка Spring Security для использования фильтра
Теперь настроим Spring Security, чтобы наш фильтр IP-блокировки применялся ко всем входящим запросам:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private IpFilter ipFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Доступ для публичных ресурсов
.anyRequest().authenticated() // Остальные запросы требуют аутентификации
.and()
.addFilterBefore(ipFilter, UsernamePasswordAuthenticationFilter.class); // Вставляем фильтр IP
}
}
4) Создание контроллера для тестирования
Создадим простой контроллер с двумя маршрутами: один доступен всем пользователям, а другой требует аутентификации:
@RestController
public class TestController {
@GetMapping("/public/hello")
public String publicHello() {
return "Hello from public endpoint!";
}
@GetMapping("/private/hello")
public String privateHello() {
return "Hello from private endpoint, you are authenticated!";
}
}
5) Важно
Этот подход не является универсальной защитой от всех типов атак. Он помогает ограничить доступ для определённых IP-адресов, но не защищает от более сложных угроз, таких как атаки с подменой IP (например, через прокси-серверы).
Для более комплексной защиты используйте дополнительные механизмы, такие как WAF, анти-DDoS системы, а также более детальную настройку доступа через роли и права.
@javatg
👍6❤2🔥2🤔1
🚀 Spring Boot Совет
Spring Boot Startup Report помогает прозрачно увидеть, что именно тормозит запуск вашего приложения, и быстро найти узкие места.
Что даёт
- интерактивный HTML-отчёт со списком и таймлайном инициализации бинов
- flame chart для наглядного анализа времени
- поиск по классу или аннотации
- автогенерация отчётов в интеграционных тестах
Как подключить
Gradle:
Как пользоваться
- запустите приложение и откройте endpoint /startup-report для интерактивного отчёта
- в тестах отчёты сохраняются в target/startup-reports для Maven и build/startup-reports для Gradle
- если в classpath нет Jackson, добавьте jackson-databind
Подсказка
- держите зависимость в test-scope, чтобы не тянуть её в прод
- начните с самых тяжёлых бинов из отчёта, вынесите дорогостоящую инициализацию и лениво подгружайте то, что реально нужно на старте
github.com/maciejwalkowiak/spring-boot-startup-report
Spring Boot Startup Report помогает прозрачно увидеть, что именно тормозит запуск вашего приложения, и быстро найти узкие места.
Что даёт
- интерактивный HTML-отчёт со списком и таймлайном инициализации бинов
- flame chart для наглядного анализа времени
- поиск по классу или аннотации
- автогенерация отчётов в интеграционных тестах
Как подключить
Gradle:
testImplementation("com.maciejwalkowiak.spring:spring-boot-startup-report:0.2.0")
Как пользоваться
- запустите приложение и откройте endpoint /startup-report для интерактивного отчёта
- в тестах отчёты сохраняются в target/startup-reports для Maven и build/startup-reports для Gradle
- если в classpath нет Jackson, добавьте jackson-databind
Подсказка
- держите зависимость в test-scope, чтобы не тянуть её в прод
- начните с самых тяжёлых бинов из отчёта, вынесите дорогостоящую инициализацию и лениво подгружайте то, что реально нужно на старте
github.com/maciejwalkowiak/spring-boot-startup-report
👍9❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Вот теперь вы знаете как вы выглядите со стороны
😁16👍1
