Регулярные выражения в реальной жизни
🔸 SMS Spam Filter
Ловит спам-ключевые слова.
Примеры: "FREE $500!", "prize winner"
🔸 Password Validator
Проверяет сложность пароля (минимум одна заглавная буква, одна цифра, длина ≥ 8).
Примеры: "MyPass123" ✓, "weak" ✗
🔸 Email Field Check
Валидирует email-адрес.
Пример: "[email protected]" ✓
🔸 Smart Date Detection
Находит даты в тексте.
Пример: "Meeting on 15/8/2025"
🔸 Photo Search
Фильтрует фото по дате.
Пример: "IMG_2025-08-15.jpg"
🔸 Subtitle Timing
Матчит формат таймкодов (субтитры).
Пример: "00:01:23,456"
🔸 Parental Controls
Блокирует URL соцсетей.
Пример: "m.facebook.com"
🔸 Expense Tracking
Извлекает суммы в валюте.
Примеры: "$1,500", "$50,000"
🔸 TV Episode Filter
Матчит конкретные сезоны и эпизоды.
Примеры: "S01E05", "S03E12"
🔸 E-book Chapters
Делит текст книги на главы.
Примеры: "CHAPTER 1", "CHAPTER 15"
🔸 Phone Number (US)
Проверяет формат мобильного номера (США).
Пример: "+1 9876543210"
🔸 Credit Card Mask
Находит номера карт для маскировки.
Пример: "1234 5678 9012 3456"
🔸 Log File Parsing
Парсит таймстемпы логов (формат Apache/Nginx).
Пример: "[01/Aug/2025:10:30:45"
🔸 URL Slug Creator
Удаляет не-URL символы (для генерации slug).
Пример: "My Post!" → "my-post"
🔸 ZIP Code (US)
Матчит почтовые индексы США.
Примеры: "12345", "12345-6789"
Паттерны из реальной жизни
🔸 WhatsApp backup names
🔸 YouTube video IDs
Например: "dQw4w9WgXcQ"
🔸 Hashtag extraction
Извлекает хэштеги из текста.
🔸 IPv4 addresses
🔸 HTML tag removal
Удаляет HTML-теги из текста.
🔸 Bitcoin addresses
👉 Java Portal
FREE \b(prize|winner|URGENT)\b
Ловит спам-ключевые слова.
Примеры: "FREE $500!", "prize winner"
(?=.*[A-Z])(?=.*\d).{8,}
Проверяет сложность пароля (минимум одна заглавная буква, одна цифра, длина ≥ 8).
Примеры: "MyPass123" ✓, "weak" ✗
^[\w.+]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Валидирует email-адрес.
Пример: "[email protected]" ✓
\b\d{1,2}/\d{1,2}/\d{4}\b
Находит даты в тексте.
Пример: "Meeting on 15/8/2025"
IMG_2025-08-.*\.jpg
Фильтрует фото по дате.
Пример: "IMG_2025-08-15.jpg"
\d+:\d+:\d+,\d+
Матчит формат таймкодов (субтитры).
Пример: "00:01:23,456"
.*(facebook|instagram)\.com.*
Блокирует URL соцсетей.
Пример: "m.facebook.com"
\$\d{1,3}(,\d{3})*
Извлекает суммы в валюте.
Примеры: "$1,500", "$50,000"
S[0-9]{1,2}E\d{1,2}
Матчит конкретные сезоны и эпизоды.
Примеры: "S01E05", "S03E12"
^CHAPTER\s+\d+\b
Делит текст книги на главы.
Примеры: "CHAPTER 1", "CHAPTER 15"
^\+1\d{10}$
Проверяет формат мобильного номера (США).
Пример: "+1 9876543210"
\d{4}\s?\d{4}\s?\d{4}\s?\d{4}
Находит номера карт для маскировки.
Пример: "1234 5678 9012 3456"
\[\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2}
Парсит таймстемпы логов (формат Apache/Nginx).
Пример: "[01/Aug/2025:10:30:45"
[^a-z0-9-]
Удаляет не-URL символы (для генерации slug).
Пример: "My Post!" → "my-post"
^\d{5}(-\d{4})?$
Матчит почтовые индексы США.
Примеры: "12345", "12345-6789"
Паттерны из реальной жизни
WhatsApp.*\d{4}-\d{2}-\d{2}.*\.crypt\d+
[a-zA-Z0-9_-]{11}
Например: "dQw4w9WgXcQ"
#\w+
Извлекает хэштеги из текста.
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
<[^>]+>
Удаляет HTML-теги из текста.
[13][a-km-zA-HJ-NP-Z1-9]{25,34}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤7🔥4🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Ваш новый секретный арсенал для проектов — более 1500 крутых API в одном месте
Нужны данные о погоде, карты, генерация изображений или мощные NLP-сервисы? Всё это и даже больше в огромной коллекции, которую проверили и отобрали вручную💊
Забираем с сайта или с GitHub🍯
👉 Java Portal
Нужны данные о погоде, карты, генерация изображений или мощные NLP-сервисы? Всё это и даже больше в огромной коллекции, которую проверили и отобрали вручную
Забираем с сайта или с GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3
Фича в Java 21 - Pattern Matching в "switch" блоке
До Java 21 блок
- использовать
- проверять типы прямо в case
- деструктуризировать
До этой фичи, проверить тип
С новой фичей проверку на тип и работа с объектом конкретного типа можно через switch:
Чище, безопаснее и не нужно вручную кастовать типы.
👉 Java Portal
До Java 21 блок
switch
работал только с int, enum, String и еще несколькими примитивами. С JEP 441 теперь можно:- использовать
switch
с любыми объектами- проверять типы прямо в case
- деструктуризировать
record
-объектыДо этой фичи, проверить тип
Object
можно было с помощью instanceof
и код был набором if
-ов с приведением типа Object
к нужному:if (obj instanceof String) {
String s = (String) obj;
System.out.println("String length: " + s.length());
} else if (obj instanceof Integer) {
Integer i = (Integer) obj;
System.out.println("Square: " + (i * i));
}
С новой фичей проверку на тип и работа с объектом конкретного типа можно через switch:
Object obj = "abc";
switch (obj) {
case String s -> System.out.println("String length: " + s.length());
case Integer i -> System.out.println("Square: " + (i * i));
default -> System.out.println("Unknown type");
}
Чище, безопаснее и не нужно вручную кастовать типы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍2
image_2025-08-10_08-06-12.png
3.4 MB
Дорожная карта освоения Java
👉 Java Portal
🔸 Основы Java
Ключевые концепции языка
- Переменные и типы данных
- Операторы и выражения
- Управляющие конструкции
- Массивы и коллекции
- Методы и параметры
- Ввод/вывод и обработка данных
Объектно-ориентированное программирование
- Классы и объекты
- Конструкторы и методы
- Полиморфизм
- Абстракция
- Абстрактные классы
- Интерфейсы
Обработка исключений
- Try-Catch
- Checked и Unchecked исключения
- Throw и Throws
- Best practices по исключениям🔸 Продвинутая Java
Коллекции
- List, Map (HashMap, TreeMap)
- Set (HashSet, TreeSet)
- Очереди и Deque
- Итераторы и листераторы
- Компараторы и Comparable
- Кастомные коллекции
Дженерики и аннотации
- Обобщённые классы и методы
- Wildcards (?, extends, super)
- Встроенные аннотации
- Кастомные аннотации
- Рефлексия и обработка аннотаций
Ввод/вывод и сериализация
- Работа с файлами и потоками
- BufferedReader/Writer
- Scanner
- Сериализация🔸 Многопоточность
Основы потоков
- Thread Class, Runnable Interface
- Жизненный цикл потока
- Методы потока
- Демон-потоки
- Thread Local
Синхронизация
- synchronized методы и блоки
- Wait и Notify
- Lock API
- Producer-Consumer
- Read-Write Lock
Утилиты для многопоточности
- Executor Framework
- Callable и Future
- Concurrent Collections
- Atomic Variables
- Semaphore и Barrier🔸 Современная Java
Lambda и Streams
- Лямбды
- Function, Predicate, Consumer
- Stream API и терминальные операции
- filter, map, reduce
- Optional
Время и дата
- LocalDate/Time, ZonedDateTime
- Duration, Period
- DateTimeFormatter
Новые фичи
- var и ключевое слово yield
- Текстовые блоки
- Pattern Matching
- Sealed Classes
- Virtual Threads🔸 Базы данных и JDBC
JDBC Fundamentals
- Подключение и Connection Management
- Statement, PreparedStatement, ResultSet
- Batch Updates
Операции с БД
- SQL, хранимые процедуры, функции
- Индексы и оптимизация запросов
Основы ORM
- JPA и Hibernate
- Entity Mapping и связи
- HQL, JPQL
- Lazy/Eager Loading🔸 Веб-разработка
Java Web
- Servlets и JSP (жизненный цикл, сервисы, cookies, сессии)
- Spring Framework (Core, MVC, Boot, Security, AOP)
- REST API, Spring Data JPA
Сборка и тестирование
- Maven, Gradle
- JUnit, Mockito
- Интеграционное тестирование
- Логирование (Log4j, SLF4J)🔸 Enterprise Java
- Java EE / Jakarta EE (JPA, JAX-RS, JAX-WS, JMS, JNDI, Bean Validation)
- Микросервисы (Spring Cloud, API Gateway, Service Discovery, Circuit Breaker)
- Message Queues (ActiveMQ, RabbitMQ, Kafka, Apache Pulsar)🔸 Производительность и инструменты
JVM и производительность
- JVM архитектура
- Управление памятью
- Garbage Collector
- Профилирование (JProfiler, VisualVM)
DevTools
- CI/CD (Jenkins, Docker, Kubernetes)
- IntelliJ IDEA, Eclipse, VS Code
Мониторинг и безопасность
- Health Checks
- Метрики
- Аутентификация (OAuth2, JWT)
- OWASP рекомендации🔸 Фреймворки и библиотеки
Web Frameworks
- Spring Boot
- Spring WebFlux
- Struts 2
- JSF
- Play
- Micronaut
- Quarkus
Utility Libraries
- Apache Commons
- Jackson, Gson
- MapStruct
- Lombok
Data & Caching
- Redis
- Elasticsearch
- Ehcache
- Hazelcast
- Apache Ignite
Specialized
- Apache Camel
- Netty
- Akka
- Vert.x
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍2
Часто про блок
Пример из разряда «классика жанра»
Да, при делении на ноль выпадет исключение, но перед завершением работы всё, что внутри
Но есть ситуации, когда
Вызов
Теперь к более интересному
Представим, что у нас есть цепочка методов, где в конце мы хотим сделать какие-то действия в любом случае — например, зафиксировать результат в логах или отправить уведомление
Пусть методы вызывают друг друга вот так:
Пример
В этой схеме исключение может вылететь и в
Нам всё равно, где именно упало — код внутри
Это удобно, когда логика сложная и методы вызывают друг друга
👉 Java Portal
finally
пишут, что он всегда выполнится, даже если в коде случилась ошибка Пример из разряда «классика жанра»
public class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
int result = 10 / 0; // тут бахнет деление на ноль
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок всё равно выполнится");
}
}
}
Да, при делении на ноль выпадет исключение, но перед завершением работы всё, что внутри
finally
, всё равно выполнитсяНо есть ситуации, когда
finally
не доживёт до выполнения. Напримерpublic class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
System.exit(0); // мгновенный выход из программы
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок уже не увидим");
}
}
}
Вызов
System.exit()
или убийство процесса извне (например, kill PID
) не даст finally
сработатьТеперь к более интересному
Представим, что у нас есть цепочка методов, где в конце мы хотим сделать какие-то действия в любом случае — например, зафиксировать результат в логах или отправить уведомление
Пусть методы вызывают друг друга вот так:
main
→ firstLogic
→ secondLogic
→ thirdLogic
→ fourthLogic
Пример
public static void main(String[] args) {
try {
firstLogic();
} finally {
System.out.println("FINALLY MAIN"); // логируем результат
}
}
public static void firstLogic() {
secondLogic();
}
public static void secondLogic() {
try {
thirdLogic();
} finally {
System.out.println("FINALLY SECOND"); // отправляем уведомление
}
}
public static void thirdLogic() {
fourthLogic();
}
public static void fourthLogic() {
System.out.println("D");
throw new RuntimeException();
}
В этой схеме исключение может вылететь и в
thirdLogic
, и в fourthLogic
Нам всё равно, где именно упало — код внутри
finally
, в main
и secondLogic
всё равно выполнитсяЭто удобно, когда логика сложная и методы вызывают друг друга
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Паттерн проектирования Memento
🔸 Сценарий: создание текстового редактора
Вы пишете текстовый редактор и вам нужна функциональность undo/redo.
Пользователь вводит, удаляет, форматирует текст и ожидает возможность откатить изменения к предыдущему состоянию.
Без Memento пришлось бы вручную отслеживать каждое изменение и разрабатывать логику обратного отката для каждого действия.
🔸 Проблемы без Memento
- Доступ к внутренним полям - нужно лезть в приватные данные объекта для сохранения/восстановления состояния
- Сложная логика отката - откат каждого типа операций приходится писать вручную
- Сильная связка - логика undo перемешана с бизнес-логикой
- Прожорливость памяти - хранение целых объектов вместо снапшотов
🔸 Как помогает Memento
Паттерн Memento говорит
Flow
1. Создать снимок состояния
2. Сохранить в Caretaker
3. Продолжить работу
4. Запросить откат
5. Восстановить состояние
🔸 Три ключевых компонента
- Originator - объект, чьё состояние нужно сохранить (например, документ)
- Memento - снимок состояния в определённый момент времени
- Caretaker - управляет снапшотами, но не может их изменять
🔸 Когда использовать Memento
- Undo/Redo в редакторах, играх, формах
- Транзакционный откат в базах данных или операциях
- Чекпоинты в долгих процессах
- История состояния для отладки или аудита
🔸 Преимущества
- Сохранение инкапсуляции - внутреннее состояние остаётся приватным
- Чистое разделение - логика отката отделена от бизнес-логики
- Гибкие снапшоты - сохраняется только то, что нужно
- Простота внедрения - стандартный и понятный паттерн
🔸 Примеры
- Текстовые редакторы - Ctrl+Z с сохранением состояния документа
- Фоторедакторы - панель истории шагов редактирования
- Игры - сохранения и чекпоинты
- Транзакции в БД - откат при сбое
🔸 Недостатки
- Память - хранение множества снапшотов
- Производительность - создание снапшотов требует времени
- Сложность для больших объектов - глубокое копирование может быть дорогим
👉 Java Portal
Вы пишете текстовый редактор и вам нужна функциональность undo/redo.
Пользователь вводит, удаляет, форматирует текст и ожидает возможность откатить изменения к предыдущему состоянию.
// Пользователь ввёл: "Hello"
// Пользователь ввёл: " World"
// Пользователь удалил: "World"
// Пользователь хочет откатить → восстановить "World"
// Пользователь хочет откатить снова → восстановить "Hello"
Без Memento пришлось бы вручную отслеживать каждое изменение и разрабатывать логику обратного отката для каждого действия.
- Доступ к внутренним полям - нужно лезть в приватные данные объекта для сохранения/восстановления состояния
- Сложная логика отката - откат каждого типа операций приходится писать вручную
- Сильная связка - логика undo перемешана с бизнес-логикой
- Прожорливость памяти - хранение целых объектов вместо снапшотов
Паттерн Memento говорит
> «Позволь объектам сохранять и восстанавливать своё состояние через снапшоты, не раскрывая внутренние детали».
Flow
1. Создать снимок состояния
2. Сохранить в Caretaker
3. Продолжить работу
4. Запросить откат
5. Восстановить состояние
- Originator - объект, чьё состояние нужно сохранить (например, документ)
- Memento - снимок состояния в определённый момент времени
- Caretaker - управляет снапшотами, но не может их изменять
- Undo/Redo в редакторах, играх, формах
- Транзакционный откат в базах данных или операциях
- Чекпоинты в долгих процессах
- История состояния для отладки или аудита
- Сохранение инкапсуляции - внутреннее состояние остаётся приватным
- Чистое разделение - логика отката отделена от бизнес-логики
- Гибкие снапшоты - сохраняется только то, что нужно
- Простота внедрения - стандартный и понятный паттерн
- Текстовые редакторы - Ctrl+Z с сохранением состояния документа
- Фоторедакторы - панель истории шагов редактирования
- Игры - сохранения и чекпоинты
- Транзакции в БД - откат при сбое
- Память - хранение множества снапшотов
- Производительность - создание снапшотов требует времени
- Сложность для больших объектов - глубокое копирование может быть дорогим
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤6👍2
Бесплатный API для получения полной информации об IP-адресе.
Без регистрации и каких-либо ограничений.
Работает с Python, JavaScript, Java, PHP, Go и другими языками.
Пример использования: https://api.ipquery.io/1.1.1.1
👉 Java Portal
Без регистрации и каких-либо ограничений.
Работает с Python, JavaScript, Java, PHP, Go и другими языками.
Пример использования: https://api.ipquery.io/1.1.1.1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🌚3🤔2
Проект многопоточный загрузчик файлов на Java отлично подходит для изучения
Учит разбираться в многопоточности и конкурентности
Прокачивает навыки в:
> работе с данными
> файловом вводе-выводе
> многопоточности
> конкурентности
> работе с диапазонами Content-Length в HTTP-запросах
и не только💪
Вот один из проектов к примеру: https://github.com/winnerx0/java-project-box
👉 Java Portal
Учит разбираться в многопоточности и конкурентности
Прокачивает навыки в:
> работе с данными
> файловом вводе-выводе
> многопоточности
> конкурентности
> работе с диапазонами Content-Length в HTTP-запросах
и не только
Вот один из проектов к примеру: https://github.com/winnerx0/java-project-box
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3🔥1
Media is too big
VIEW IN TELEGRAM
Научись создавать проекты с нуля на любом языке программирования
Репо: https://github.com/practical-tutorials/project-based-learning
👉 Java Portal
Репо: https://github.com/practical-tutorials/project-based-learning
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Метод
Иногда нужно вытащить только первые N элементов коллекции например для пагинации отладки или быстрого превью. В Stream API за это отвечает
Пример ниже
Какой бы ни была длина исходной коллекции результат содержит максимум n элементов
👉 Java Portal
limit
в Java Stream API краткоИногда нужно вытащить только первые N элементов коллекции например для пагинации отладки или быстрого превью. В Stream API за это отвечает
limit
который делает это простым и аккуратным способомlimit(long maxSize)
создает новый поток и берет не больше n
элементов из исходного. Остальные элементы пропускаются и дальше не обрабатываютсяПример ниже
import java.util.List;
import java.util.stream.Collectors;
public class LimitExample {
public static void main(String[] args) {
List<String> items = List.of("A", "B", "C", "D", "E");
List<String> limited = items.stream()
.limit(3)
.collect(Collectors.toList());
System.out.println(limited); // [A, B, C]
}
}
Какой бы ни была длина исходной коллекции результат содержит максимум n элементов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Паттерны проектирования систем - шпаргалка
🔸 Webhooks и Outbox
Надёжные внешние уведомления.
Когда использовать — интеграции, сторонние колбэки.
Типичные проблемы — статусы оплат, синхронизация CRM.
🔸 Blob/Object Storage
Дешёвое хранение больших файлов.
Когда использовать — медиа, бэкапы, экспорты.
Типичные проблемы — загрузки пользователей, data lake.
🔸 Оркестратор задач (Airflow/Temporal)
Долгоживущие процессы с состоянием.
Когда использовать — длинные задачи, SLA.
Типичные проблемы — генерация отчётов, обработка видео.
🔸 Blue-Green / Canary деплой
Постепенное переключение трафика.
Когда использовать — безопасные релизы, быстрый откат.
Типичные проблемы — деплой API, смена конфигураций.
🔸 Feature Flags
Включение/отключение фич на лету.
Когда использовать — эксперименты, переключатели.
Типичные проблемы — A/B тесты, скрытые релизы.
🔸 Стратегия миграции схемы
Обратная/прямая совместимость.
Когда использовать — миграция без простоя БД.
Типичные проблемы — expand-migrate-contract.
🔸 Распределённые блокировки / выбор лидера
Координация одного активного воркера.
Когда использовать — уникальность cron, шардовое владение.
Типичные проблемы — один консумер, лидер партиции.
🔸 Наблюдаемость (логи/метрики/трейсы)
Понимание, что делает система.
Когда использовать — SLO, отладка, планирование.
Типичные проблемы — задержка p99, error budget.
🔸 Безопасность: AuthN/AuthZ
Проверка личности и прав доступа.
Когда использовать — мультиарендные продукты, внешние API.
Типичные проблемы — OAuth2/OIDC, RBAC/ABAC.
🔸 Мультиарендность (pool/bridge/isolated)
Уровни изоляции данных и ресурсов.
Когда использовать — SaaS с множеством клиентов.
Типичные проблемы — отдельные БД на арендатора vs общая схема.
🔸 Edge Compute/функции
Запуск логики ближе к пользователю.
Когда использовать — низкая задержка, лёгкие задачи.
Типичные проблемы — персонализация на краю, A/B тесты.
🔸 Rate-Aware DB Patterns
Пакетная, очередная, троттлинг у БД.
Когда использовать — горячие партиции, блокировки.
Типичные проблемы — массовый импорт, ID hotspot.
🔸 Стратегии пагинации
Keyset > Offset для больших данных.
Когда использовать — бесконечный скролл, большие таблицы.
Типичные проблемы — пагинация фидов, списки в админке.
👉 Java Portal
Надёжные внешние уведомления.
Когда использовать — интеграции, сторонние колбэки.
Типичные проблемы — статусы оплат, синхронизация CRM.
Дешёвое хранение больших файлов.
Когда использовать — медиа, бэкапы, экспорты.
Типичные проблемы — загрузки пользователей, data lake.
Долгоживущие процессы с состоянием.
Когда использовать — длинные задачи, SLA.
Типичные проблемы — генерация отчётов, обработка видео.
Постепенное переключение трафика.
Когда использовать — безопасные релизы, быстрый откат.
Типичные проблемы — деплой API, смена конфигураций.
Включение/отключение фич на лету.
Когда использовать — эксперименты, переключатели.
Типичные проблемы — A/B тесты, скрытые релизы.
Обратная/прямая совместимость.
Когда использовать — миграция без простоя БД.
Типичные проблемы — expand-migrate-contract.
Координация одного активного воркера.
Когда использовать — уникальность cron, шардовое владение.
Типичные проблемы — один консумер, лидер партиции.
Понимание, что делает система.
Когда использовать — SLO, отладка, планирование.
Типичные проблемы — задержка p99, error budget.
Проверка личности и прав доступа.
Когда использовать — мультиарендные продукты, внешние API.
Типичные проблемы — OAuth2/OIDC, RBAC/ABAC.
Уровни изоляции данных и ресурсов.
Когда использовать — SaaS с множеством клиентов.
Типичные проблемы — отдельные БД на арендатора vs общая схема.
Запуск логики ближе к пользователю.
Когда использовать — низкая задержка, лёгкие задачи.
Типичные проблемы — персонализация на краю, A/B тесты.
Пакетная, очередная, троттлинг у БД.
Когда использовать — горячие партиции, блокировки.
Типичные проблемы — массовый импорт, ID hotspot.
Keyset > Offset для больших данных.
Когда использовать — бесконечный скролл, большие таблицы.
Типичные проблемы — пагинация фидов, списки в админке.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Кто до сих пор путается в деревьях, графах и сортировках, вот топчик:
https://visualgo.net/en
Визуалка чисто для мозга, всё анимировано: стек, очередь, DFS, BFS, сортировки, хэш-таблицы.
Как будто смотришь, как думает комп. Залипнуть можно.😳
Сохрани
👉 Java Portal
https://visualgo.net/en
Визуалка чисто для мозга, всё анимировано: стек, очередь, DFS, BFS, сортировки, хэш-таблицы.
Как будто смотришь, как думает комп. Залипнуть можно.
Сохрани
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
Освой планирование в Spring Boot с помощью Cron-задач и начальной задержки.
🔸 Cron Job
Планировщик cron запускает задачи в определённое время, используя cron-выражение.
Это самый гибкий способ планировать задачи в Spring Boot — можно запускать их ежедневно, еженедельно, ежемесячно или по любому заданному шаблону.
Пример ниже выполняется каждый день в 9:00 утра по времени IST.
Формат cron:
Примеры:
Используйте cron, когда нужна точность, например для генерации отчётов в конце дня.
🔸 Initial Delay
Параметр initialDelay говорит Spring Boot, сколько ждать после запуска приложения перед первым выполнением задачи.
После первого запуска задача будет работать с указанным
Пример: код ниже ждёт 10 секунд после старта, затем выполняется каждые 5 секунд от начала предыдущего запуска.
Используйте
👉 Java Portal
Планировщик cron запускает задачи в определённое время, используя cron-выражение.
Это самый гибкий способ планировать задачи в Spring Boot — можно запускать их ежедневно, еженедельно, ежемесячно или по любому заданному шаблону.
Пример ниже выполняется каждый день в 9:00 утра по времени IST.
@Scheduled(cron = "0 0 9 * * ?", zone = "Asia/Kolkata")
public void runCron() {
System.out.println("Daily at 9:00 AM");
}
Формат cron:
секунда минута час день месяц деньНедели
Примеры:
0 0 0 * * ?
→ каждый день в полночь0 0/15 * * * ?
→ каждые 15 минутИспользуйте cron, когда нужна точность, например для генерации отчётов в конце дня.
Параметр initialDelay говорит Spring Boot, сколько ждать после запуска приложения перед первым выполнением задачи.
После первого запуска задача будет работать с указанным
fixedRate
или fixedDelay
.Пример: код ниже ждёт 10 секунд после старта, затем выполняется каждые 5 секунд от начала предыдущего запуска.
@Scheduled(initialDelay = 10000, fixedRate = 5000)
public void runWithDelay() {
System.out.println("Starts after 10s, then every 5s");
}
Используйте
initialDelay
, если задача зависит от готовности других сервисов или данных — например, нужно загрузить конфигурацию из базы перед запуском фоновых задач.Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
This media is not supported in your browser
VIEW IN TELEGRAM
27 августа встречаемся на DrinkUp от Авито для backend-разработчиков в Нижнем Новгороде. Уже предчувствуем горячие споры… ☄️
В планах в формате дискуссий обсудить:
➡️ как правильно структурировать проекты;
➡️ кому и как проще вкатиться в Go и почему он такой странный;
➡️ как LLM помогает разработчикам.
Остальные темы раскрывать не будем — можете посмотреть их по ссылке! Там же, кстати, и регистрация на ивент.
В планах в формате дискуссий обсудить:
Остальные темы раскрывать не будем — можете посмотреть их по ссылке! Там же, кстати, и регистрация на ивент.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
8 лучших практик при проектировании API
① Понятные названия → единообразные URL и коллекции
② Идемпотентность → безопасные повторы запросов с одинаковым результатом
③ Пагинация → ограничение количества результатов для снижения нагрузки
④ Сортировка и фильтры → возможность фильтровать результаты
⑤ Кросс-ссылки → не злоупотреблять query string
⑥ Ограничение частоты запросов → контроль количества запросов для стабильности
⑦ Версионирование → сохранение обратной совместимости
⑧ Безопасность → защита через API Keys, JWT, OAuth2
👉 Java Portal
① Понятные названия → единообразные URL и коллекции
② Идемпотентность → безопасные повторы запросов с одинаковым результатом
③ Пагинация → ограничение количества результатов для снижения нагрузки
④ Сортировка и фильтры → возможность фильтровать результаты
⑤ Кросс-ссылки → не злоупотреблять query string
⑥ Ограничение частоты запросов → контроль количества запросов для стабильности
⑦ Версионирование → сохранение обратной совместимости
⑧ Безопасность → защита через API Keys, JWT, OAuth2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Java Logging (SLF4J, Logback) — всё, что нужно знать
1. Логирование → запись событий приложения для отладки и мониторинга
Помогает находить проблемы без запуска отладчика
Пример: запись неудачной попытки входа для целей безопасности
2. SLF4J → простой фасад для логирования в Java
Вы пишете код против API SLF4J, а дальше подключаете любую реализацию логгера
Пример: один и тот же код будет работать с Logback, Log4j или java.util.logging
3. Logback → популярный backend для логирования
Высокая производительность, гибкость, поддержка фильтров и политик ротации
Пример: запись логов в файл с ежедневной ротацией
4. Зачем использовать SLF4J + Logback
- SLF4J → возможность менять backend без переписывания кода
- Logback → функционал продакшен-уровня и высокая производительность
5. Уровни логирования (общие для большинства фреймворков)
-
-
-
-
-
6. Пример настройки
🔸 Используйте параметризованное логирование
🔸 Выбирайте правильный уровень логов — не захламляйте прод debug-сообщениями
🔸 Разделяйте логи приложения и фреймворков
🔸 Применяйте политику ротации, чтобы не копились огромные файлы
🔸 Добавляйте correlation ID для трейсинга запросов между сервисами
Не логируйте чувствительные данные (пароли, токены)
👉 Java Portal
1. Логирование → запись событий приложения для отладки и мониторинга
Помогает находить проблемы без запуска отладчика
Пример: запись неудачной попытки входа для целей безопасности
2. SLF4J → простой фасад для логирования в Java
Вы пишете код против API SLF4J, а дальше подключаете любую реализацию логгера
Пример: один и тот же код будет работать с Logback, Log4j или java.util.logging
3. Logback → популярный backend для логирования
Высокая производительность, гибкость, поддержка фильтров и политик ротации
Пример: запись логов в файл с ежедневной ротацией
4. Зачем использовать SLF4J + Logback
- SLF4J → возможность менять backend без переписывания кода
- Logback → функционал продакшен-уровня и высокая производительность
5. Уровни логирования (общие для большинства фреймворков)
-
TRACE
→ подробная внутренняя информация (редко в продакшене)-
DEBUG
→ отладочная информация (например, значения переменных)-
INFO
→ общие события высокого уровня (например, «Пользователь успешно зарегистрирован»)-
WARN
→ неожиданные, но восстанавливаемые ситуации (например, повторный запрос)-
ERROR
→ критические ошибки, влияющие на функционал6. Пример настройки
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyService {
private static final Logger logger = LoggerFactory.getLogger(MyService.class);
public void processOrder(String orderId) {
logger.info("Processing order {}", orderId);
try {
// бизнес-логика
} catch (Exception e) {
logger.error("Error processing order {}", orderId, e);
}
}
}
logger.debug("User {} logged in", userId)
→ избегайте конкатенации строкНе логируйте чувствительные данные (пароли, токены)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
This media is not supported in your browser
VIEW IN TELEGRAM
Чувак сделал несколько Live Templates для intellijidea, которыми часто пользуется
👉 https://github.com/sivaprasadreddy/intellij-live-templates
С каждой новой версией IntelliJ IDEA часть этих штук появляется прямо из коробки
Например, шаблоны для логов и создания Spring-компонентов уже доступны OOTB
На примере небольшой демо, как можно быстро создавать логгер и Spring-компоненты прямо в intellijidea
👉 Java Portal
С каждой новой версией IntelliJ IDEA часть этих штук появляется прямо из коробки
Например, шаблоны для логов и создания Spring-компонентов уже доступны OOTB
На примере небольшой демо, как можно быстро создавать логгер и Spring-компоненты прямо в intellijidea
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤2
Автоматический toString() в Record
Пример:
Если писать это же через класс, получится больше кода:
И в том и в другом случае мы получаем объект для хранения данных:
Но есть отличие
У
В обычном классе дефолтный
Пример:
Вывод:
То есть у record
👉 Java Portal
record
сравнительно новая фича в Java, которая позволяет описывать сущности без явного объявления полей и написания геттеров/сеттеров.Пример:
record User(String name, int age, String city) { }
Если писать это же через класс, получится больше кода:
class User {
public String name;
public int age;
public String city;
public User(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
}
И в том и в другом случае мы получаем объект для хранения данных:
new User("Nick", 20, "New York");
Но есть отличие
У
record
метод toString()
генерируется автоматически и выводит имена и значения всех полей в удобном формате.В обычном классе дефолтный
toString()
возвращает имя класса и хэш объекта.Пример:
record User(String name, int age, String city) { }
class SecondUser {
public String name;
public int age;
public String city;
public SecondUser(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
}
public static void main(String[] args) throws Exception {
User firstUser = new User("Nick", 20, "New York");
SecondUser secondUser = new SecondUser("Charley", 25, "New York");
System.out.println(firstUser);
System.out.println(secondUser);
}
Вывод:
User[name=Nick, age=20, city=New York]
org.example.SecondUser@68de145
То есть у record
toString()
сразу готов, а для обычного класса придётся переопределять вручную.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍4
РАЗЫГРЫВАЕМ iPhone 16 Pro Max, Macbook Air M4, AirPods Pro и кучу других призов — с вас всего лишь подписка.
Для участия нужно:
Итоги подведём 8 сентября в 18:00 случайным образом при помощи бота. Доставка для победителя бесплатная. Всем удачи!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Ресурс для разработчиков, чтобы создавать изометрические диаграммы своей инфраструктуры или софта.
Open-source: https://github.com/stan-smith/FossFLOW
👉 Java Portal
Open-source: https://github.com/stan-smith/FossFLOW
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🤣1