Max

Java библиотека

Прямой пост
max.ru/javalib
Баллы: 1
Описание канала в MAX

Книги, статьи, мемы и многое другое для Java программиста! По сотрудничеству и рекламе: ссылка скрыта или в ЛС сообщества ВК ссылка скрыта Канал в перечне РКН: ссылка скрыта Мы на бирже: ссылка скрыта Сообщество VK ссылка скрыта

Аудитория
Смешанная аудитория
Подписчики
1 374
0день
+3неделя
+38месяц
Охват поста
237
237за 24 часа
419в среднем
Вовлечённость
17,3%
17,3%за 24 часа
30,5%в среднем
Упоминания в других каналах

Канал упомянули 38 раз в 3 каналах

Чем больше упоминаний и каналов — тем заметнее канал в своей нише.

Информация о подписчиках
Вк, телеграм, макс

Похожие каналы

29 289
Смешанная аудитория
ERR 13%

🔓 Популярные игры, приложения для android устройств, новости технологий и многое другое. 🤝 Сотрудничество: https://clck.su/FWLEf ⚠️ Наш чат: 🔓 Популярные игры, приложения для android устройств, новости технологий и многое другое. 🔓 Популярные игры, приложения для android устройств, новости технологий Игры, приложения, модификации, моды, новости, android, сма

2 200
4 095
Мужская аудитория
ERR 23%

Пишем про новые ИИ-модели, open-source проекты и инструменты для разработки. Следим за релизами и собираем главное в одном месте. Реклама: @clucai_sup Купить рекламу: https://telega.in/c/+tiyGChxuJ0oyZjAy

2 000
1 982
Смешанная аудитория
ERR 17%

ChatGPT (ЧатГпт) | NanoBanana 2 (НаноБанана) | DeepSeek | Claude (Клод) | Veo 3.1 | GPT Image 2 | Kling (Клинг) | Grok | GPT 2 AI Бот | ИИ Бот | ИИ Max | нейросети | написать текст | ответы на вопросы | перевод | генерация фото | генерация видео | улучшить фото | фотосессия Бот с нейросетями — @id711601738400_bot 🧑‍💻 Связь: https://clck.ru/3T8PD8 Сервис аналитики MAX - https://maxframe.ru

600
9 907
Смешанная аудитория
ERR 14%

Канал направленный на исследование в сфере ИБ, OSINT. Сотрудничество: @glebsto Медиа: @agencytender Мы на бирже: https://telega.in/c/info_cybersecurity Архив: https://t.me/tochkaseti

3 000
2 328
Мужская аудитория
ERR 27%

Реклама: https://iimax.ru/seller135

2 000
2 011
Смешанная аудитория
ERR 23%

Вся самая новая и полезная литература для Java разработчиков! По вопросам авторских прав, сотрудничества и рекламы: https://t.me/NadikaKir или в ЛС сообщества ВК https://vk.com/javatutorial Мы на бирже: https://telega.in/channels/bookofgeek/card_max/?r=lcDuijdm Канал в перечне РКН: https://vk.cc/cJrTqo

900
Формат размещения
700

топ 1 час · сутки в ленте · цена напрямую от автора

💎Эффективность за эти деньги
3,0
CPV · за показ
2 954
CPM · за 1000
Пересчитывается от формата и охвата 237/24ч
Гарантия выхода поста и возврат средств
Надёжность сделки
Среднее время ответа админа
Среднее время ответа админа
Обычно отвечает быстро
Размещений через Помогач
Размещений через Помогач
Первое размещение — за вами
Посты в канале
Java библиотека
MAX · канал
➡️ Автотесты интерфейса и API часто живут в разных наборах инструментов, усложняя настройку и сопровождение. Playwright позволяет объединить эти проверки и сократить количество лишних зависимостей в проекте. 📆 3 сентября в 20:00 МСК на открытом уроке «UI и API тестирование с Java и Playwright» разберём: ➖ устройство Playwright, ➖сравним его с Selenium ➖ напишем первые автотесты на Java. Вы научитесь: • запускать проверки пользовательского интерфейса и API, • структурировать код, • подключать тесты к конвейеру непрерывной интеграции и доставки. Также вы получите критерии, которые помогут оценить целесообразность перехода на Playwright в рабочем проекте. Занятие проходит в преддверии старта курса «Автоматизатор тестирования на Java. Продвинутый уровень». ✔️ Зарегистрируйтесь, чтобы освоить Playwright на практике и расширить набор инструментов автоматизации: https://vk.cc/d0OA0X Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
165 просм.25 авг., 13:01
В Java лямбда-выражение создаёт экземпляр функционального интерфейса. Во время выполнения этот экземпляр создаётся с помощью класса LambdaMetaFactory Следующий код на Java создаёт объект Function Function f = s -> s.toUpperCase(); Во время выполнения объект создаётся с помощью кода, аналогичного следующему: @SuppressWarnings("unchecked") void main() throws Throwable { MethodHandles.Lookup lookup; lookup = MethodHandles.lookup(); CallSite callSite; callSite = LambdaMetafactory.metafactory( lookup, "apply", MethodType.methodType(Function.class), MethodType.methodType(Object.class, Object.class), lookup.findStatic( getClass(), "lambda", MethodType.methodType(String.class, String.class) ), MethodType.methodType(String.class, String.class) ); MethodHandle target; target = callSite.getTarget(); Function f; f = (Function) target.invokeExact(); String msg; msg = f.apply("Hello, World!"); IO.println(msg); } private static String lambda(String s) { return s.toUpperCase(); } При выполнении этот код выведет в консоль HELLO, WORLD! Java Библиотека | Мы в Телеграм
233 просм.25 авг., 10:03
Вам доклады по Go или Java? VK приглашает на митап с двойной начинкой 26 августа VK собирает Go- и Java-инженеров, чтобы прокачать знания. В программе два трека — Go и Java, по три доклада в каждом. Трек Go: • «Компиляция Go в динамическую либу, или как мы ускорили выкатку фичи в два раза, но нам не понравилось», Михаил Кичигин, бэкенд-разработчик, Avito Tech • «Go-платформа VK: как мы построили единую основу для создания Go-сервисов», Александр Апанасенко, руководитель команды SDK Backend, VK • «Почтальон от Kubernetes до Palo Alto. Как осуществляется доставка информации об адресах», Дарья Кулькина, бэкенд-разработчик, Точка Банк Трек Java: • «Перформанс-трюки в поисковой платформе Ozon», Пётр Портнов, ведущий разработчик среднего поиска, Ozon • «Архитектура современного движка платёжной системы и переход к новой архитектуре», Игорь Крикунов, технический лидер разработки DBC, Альфа-Банк • «Переход от федерации S3-кластеров в пользу коммунального и мультитенантного кластера», Кирилл Боблак, ведущий разработчик One-cloud, VK А ещё будет мастер-класс по прокачке навыка, который сделает вас звездой любого вечера, и афтепати, чтобы обсудить доклады в неформальной обстановке. Встречаемся в 17:00, начало в 18:00. Участие бесплатное, регистрация обязательна.
248 просм.24 авг., 17:02
Когда и как использовать var? var добавили ещё в Java 10, чтобы облегчить жизнь. Но когда его лучше использовать, а когда стоит быть осторожнее? Когда использовать: 🔵 Когда всё понятно с контекста: если тип переменной очевиден, то можно не писать лишнее var list = new ArrayList(); // Это список, и это сразу видно 🔵 Когда тип слишком громоздкий: если объявление слишком длинное и перегружает код, var упрощает задачу: var map = new HashMap>(); // Чисто и просто 🔵 Короткие методы: в небольших методах с чёткой логикой, var помогает сделать код компактнее и читабельнее. А вот где лучше избегать: 🔵 Если тип неочевиден: когда сложно сразу понять, что это за переменная, лучше явно указать тип, чтобы не путать коллег. var result = process(); // И что за процесс тут? Итог: var — непдохой инструмент, но используйте его с умом. Java Библиотека | Мы в Телеграм
290 просм.24 авг., 15:46
Знаете, что в Java лучше проверять строки через isBlank(), а не только через isEmpty()? isEmpty() проверяет только длину строки: "".isEmpty() Но строка из пробелов для него уже не пустая: " ".isEmpty() А вот isBlank() учитывает пробелы, табы и переносы строк: " ".isBlank() Это удобно для валидации имён, логинов, комментариев, форм и любых пользовательских данных. Так код становится надёжнее, потому что строка из пробелов больше не проходит как нормальное значение. isBlank() это простой способ аккуратнее проверять текст в Java. Java Библиотека | Мы в Телеграм
437 просм.23 авг., 11:29
❌ ThreadLocal + Virtual Threads = утечка памяти Если вы перешли на virtual threads, но продолжаете использовать ThreadLocal, то у вас проблема, которая пока просто не выстрелила. ThreadLocal хранит данные в ThreadLocalMap — по одной map на каждый тред. Когда тредов было 200 в пуле, это было терпимо. Когда виртуальных тредов сотни тысяч, каждый несёт свою map, и heap начинает гореть. Плюс мутабельность: ThreadLocal.set() в глубоком call stack — это неявное состояние, которое легко забыть почистить через .remove(). В try-finally это работает до первого необработанного исключения. Java 21 предлагает замену — ScopedValue. 🔹 Ключевые отличия ScopedValue.where(TENANT_ID, tenant).run(() -> { ... }) — значение привязано к scope, а не к треду. Вышли из блока и значение автоматически недоступно. Никакого .remove(), никакого «забыл почистить». Иммутабельность по дизайну. Нельзя сделать .set(). Если нужно другое значение, создаёте вложенный scope. Это убирает целый класс багов с «протеканием» контекста между запросами. Легковесность. Внутри массив вместо HashMap. При масштабе в 100k+ тредов разница в потреблении памяти ощутимая. Работает в связке со StructuredTaskScope: дочерние виртуальные треды автоматически наследуют scoped values родителя. Не нужно вручную пробрасывать контекст. Практический вывод: если вы мигрируете на virtual threads, аудит ThreadLocal — обязательный шаг. ScopedValue пока preview, но API стабилизируется, и направление очевидно. Как минимум стоит уже сейчас заменить ThreadLocal на ReentrantLock-protected shared state или ScopedValue там, где передаёте tenant ID, request context, trace ID и подобные per-request данные. Знаете, что в Java можно не писать отдельный класс с полями, конструктором, геттерами и toString() вручную? Например, для DTO часто создают обычный класс: public class UserDto { private final Long id; private final String name; private final String email; public UserDto(Long id, String name, String email) { this.id = id; this.name = name; this.email = email; } public Long getId() { return id; } public String getName() { return name; } public String getEmail() { return email; } } Но если объект нужен просто для хранения данных, можно использовать record: public record UserDto( Long id, String name, String email ) {} Java сама создаст конструктор, методы доступа, equals(), hashCode() и toString(). Обращение к полям выглядит немного иначе: user.name() user.email() record хорошо подходит для DTO, ответов API, событий, команд, настроек и небольших неизменяемых объектов. Например, можно удобно вернуть данные из REST-контроллера: return new UserDto(1L, "Alex", "alex@mail.com"); Важно помнить: record по смыслу должен быть простым носителем данных. Если внутри начинает появляться много бизнес-логики, сложных состояний и изменяемых полей, лучше подумать об обычном классе. Так код становится короче, понятнее и меньше засоряется шаблонными методами. Java Библиотека | Мы в Телеграм
411 просм.21 авг., 12:09
Работа с Kafka через библиотеку Kafka Clients Приглашаем на открытый урок. 🗓 26 августа в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Java разработчик. Продвинутый уровень». Kafka Clients это нижний уровень для работы с Kafka из Java. Все более высокоуровневые библиотеки основаны на нем. Данный открытый урок проходит в рамках курса Java разработчик. Продвинутый уровень. О чем поговорим: ✔️ Чтение и отправка сообщений в Kafka ✔️ Управление топиками ✔️ Разные форматы: текст, JSON, Avro ✔️ Использование транзакций 🔗 Ссылка на регистрацию: https://vk.cc/d0Erpe Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
375 просм.20 авг., 15:28
Знаете, что в Java можно не писать отдельный класс с полями, конструктором, геттерами и toString() вручную? Например, для DTO часто создают обычный класс: public class UserDto { private final Long id; private final String name; private final String email; public UserDto(Long id, String name, String email) { this.id = id; this.name = name; this.email = email; } public Long getId() { return id; } public String getName() { return name; } public String getEmail() { return email; } } Но если объект нужен просто для хранения данных, можно использовать record: public record UserDto( Long id, String name, String email ) {} Java сама создаст конструктор, методы доступа, equals(), hashCode() и toString(). Обращение к полям выглядит немного иначе: user.name() user.email() record хорошо подходит для DTO, ответов API, событий, команд, настроек и небольших неизменяемых объектов. Например, можно удобно вернуть данные из REST-контроллера: return new UserDto(1L, "Alex", "alex@mail.com"); Важно помнить: record по смыслу должен быть простым носителем данных. Если внутри начинает появляться много бизнес-логики, сложных состояний и изменяемых полей, лучше подумать об обычном классе. Так код становится короче, понятнее и меньше засоряется шаблонными методами. Java Библиотека | Мы в Телеграм
427 просм.19 авг., 13:29
Используй Files.isSameFile(path1, path2), чтобы проверить, указывают ли два пути на один и тот же файл. Метод также резолвит симлинки. Проверяет, ссылаются ли два объекта Path на один и тот же реальный файл в файловой системе. Java Библиотека | Мы в Телеграм
401 просм.18 авг., 19:08
Java: безопасное сравнение без NullPointerException Objects.equals(a, b) — простой способ сравнивать значения без риска словить NPE. Как это работает: • Если оба значения null → вернёт true • Если только одно null → вернёт false • Если оба не null → вызовет a.equals(b) Вместо: a.equals(b) → может упасть с NullPointerException Используй: Objects.equals(a, b) → всегда безопасно Мелочь, которая регулярно спасает от багов в проде. Java Библиотека | Мы в Телеграм
423 просм.18 авг., 00:35
🎥 Вебинар: AI-ассистент на ваших документах: почему он врёт и что с этим делать Внедрили AI-ассистента по документам, а он уверенно выдаёт неправду? Без кода и формул разберём, почему так происходит, какие есть рычаги качества и как грамотно ставить задачу команде. 🧠 Что будет разобрано: • Почему AI уверенно выдумывает ответы (простыми словами) • Из чего складывается качество ответа по документам • Какие рычаги поднимают точность и сколько это стоит 💪 Что вы сможете делать после: • Формулировать требования к AI-ассистенту для команды • Оценивать, можно ли доверять ответам бота • Понимать, где проходит граница возможного Вебинар пройдет в рамках запуска курса «Развертывание локальных моделей» 👉 Для участия зарегистрируйтесь https://vk.cc/d0zbjR Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
384 просм.17 авг., 15:43
Знаете, что в Java можно обновлять счётчики в Map без лишних if? Обычно для таких задач пишут проверку: есть ли ключ, потом отдельно увеличивают значение: if (stats.containsKey("java")) { stats.put("java", stats.get("java") + 1); } else { stats.put("java", 1); } Метод merge делает это короче и безопаснее: stats.merge("java", 1, Integer::sum); Если ключа ещё нет Java положит значение 1. Если ключ уже есть Java возьмёт старое значение и объединит его с новым через функцию: Integer::sum То есть при повторном вызове значение просто увеличится: stats.merge("java", 1, Integer::sum); Это удобно для подсчёта слов, лайков, событий, ошибок, метрик и любой статистики. Map.merge() это простой способ писать меньше кода и не плодить ручные проверки. Java Библиотека | Мы в Телеграм
450 просм.16 авг., 23:37
TimSort в Java Arrays.sort(Object[]) и Collections.sort() используют TimSort — алгоритм, разработанный Тимом Петерсом для Python в 2002 году и портированный в Java 7. Для примитивов используется dual-pivot quicksort, но для объектов — только TimSort, и причина этого выбора нетривиальна. 🔹 Почему не quicksort для объектов Quicksort не стабилен — одинаковые элементы могут поменяться местами. Для примитивов это безразлично: два одинаковых int неразличимы. Для объектов же критично: Comparator может считать два объекта равными по одному критерию, но они остаются разными объектами. Нестабильная сортировка ломает составные компараторы и пользовательские ожидания. Merge sort стабилен, но требует O(n) дополнительной памяти и не использует частичную упорядоченность входных данных. 🔹 Как работает TimSort TimSort строится на наблюдении: реальные данные редко полностью случайны. Массивы часто содержат уже упорядоченные подпоследовательности — runs. Алгоритм: 1. Проходит по массиву, находя естественные runs — уже отсортированные (возрастающие или убывающие) подпоследовательности. Убывающие разворачиваются на месте. 2. Если run короче минимального порога (minRun, вычисляется от размера массива, обычно 32-64 элемента) — расширяется insertion sort'ом. Insertion sort эффективен на почти отсортированных коротких последовательностях. 3. Runs помещаются в стек и сливаются попарно через merge sort. Merge происходит не сразу — алгоритм поддерживает инвариант на стеке runs для гарантии O(n log n) в худшем случае. 🔹 Galloping mode При слиянии двух runs TimSort переключается в режим gallopping если обнаруживает что элементы из одного run идут длинными сериями подряд. Вместо поэлементного сравнения — бинарный поиск: ищет где именно заканчивается серия из первого run. Это даёт O(n) на уже отсортированных данных вместо O(n log n). Порог переключения в gallopping — MIN_GALLOP = 7. Если 7 раз подряд «выиграл» один run — переключаемся. Порог динамически адаптируется: если gallopping оказывается неэффективным, порог растёт. 🔹 Сложность → Лучший случай (уже отсортированный массив): O(n) — один run, ничего сливать не нужно. → Средний и худший: O(n log n). → Память: O(n) в худшем случае, но на практике меньше — временный буфер для merge не всегда равен половине массива. 🔹 Практическое следствие Если данные поступают уже частично отсортированными — TimSort это эксплуатирует автоматически. Повторная сортировка почти отсортированного массива значительно дешевле первичной сортировки случайных данных. Это важно для пайплайнов где данные сортируются инкрементально или приходят из источника с естественным порядком. Java Библиотека | Мы в Телеграм
415 просм.16 авг., 11:07
Spring Boot: почему нельзя делать длинные транзакции Длинные транзакции - одна из самых частых причин деградации системы, хотя код при этом может выглядеть «нормально». Что происходит на самом деле: - транзакция держит lock в базе - другие запросы начинают ждать - растёт latency - падает throughput - система перестаёт масштабироваться 📉 Итог - узкое место появляется не в коде, а в БД ❌ Плохой подход: начать транзакцию → делать бизнес-логику → ходить во внешние API → потом commit Проблема: ты держишь блокировки всё это время ✅ Правильный подход: сначала сделать всю тяжёлую работу (API, расчёты) потом быстро открыть транзакцию → записать → commit 🧠 Простое правило: транзакция должна быть максимально короткой только чтение/запись - ничего лишнего 🔥 Большинство оптимизирует запросы но сильный рост даёт именно контроль времени транзакций Java Библиотека | Мы в Телеграм
458 просм.15 авг., 18:34
497 просм.14 авг., 14:38
Основные команды Maven для Java-разработчиков Maven — это мощный инструмент автоматизации сборки, который используется в основном для Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта $ mvn archetype:generate Создание нового Maven-проекта $ mvn clean Очистка директории target $ mvn compile Компиляция исходного кода $ mvn test Запуск unit-тестов $ mvn package Сборка проекта в JAR/WAR $ mvn install Установка артефакта в локальный Maven-репозиторий $ mvn install -DskipTests Пропустить тесты при сборке $ mvn spring-boot:run Запуск Spring Boot приложения (если используется spring-boot-maven-plugin) $ mvn dependency:resolve Обновление зависимостей $ mvn dependency:tree Вывод дерева зависимостей $ mvn clean compile package Запуск целей в указанной фазе $ mvn validate Проверка структуры проекта Java Библиотека | Мы в Телеграм
501 просм.14 авг., 14:38
Также подписывайтесь на наши другие каналы в Максе: https://max.ru/bookofgeek https://max.ru/javatasks Java News
448 просм.13 авг., 20:08
Число прописью на Java 25: алгоритм для количественных числительных Пишем алгоритм, который превращает количество в виде числа типа long в корректное числительное на русском языке: от нуля и простых значений до Long.MAX_VALUE. Отрицательные числа отклоняем через IllegalArgumentException. Разберём триады, числа от 10 до 19, род числительных и формы «тысяча — тысячи — тысяч». Реализация выполнена на Java 25 в формате compact source. СМОТРЕТЬ VKVIDEO СМОТРЕТЬ RUTUBE СМОТРЕТЬ YOUTUBE Java Библиотека | Мы в Телеграм
516 просм.13 авг., 14:23
450 просм.13 авг., 10:42
Spring Boot: не делай эту ошибку с filters / interceptors Многие используют фильтры и интерцепторы неправильно 👇 👉 Они должны быть только для cross-cutting задач (то, что применяется ко ВСЕМ запросам) Примеры нормального использования: 🟢 Filters: - CORS - Encoding 🟢 Interceptors: - аутентификация / авторизация - метрики / логирование - locale - общие headers ❌ Главная ошибка: кладут туда бизнес-логику Например: - запрос в БД - проверка подписки - сложная логика Почему это плохо: - выполняется на КАЖДЫЙ запрос - создаёт лишнюю нагрузку - ломает архитектуру - усложняет тестирование 📉 Итог: interceptor превращается в «мусорный слой» 💡 Как правильно: - бизнес-логика → в сервисах - контроллеры → orchestration Java Библиотека | Мы в Телеграм
552 просм.10 авг., 10:10
525 просм.7 авг., 19:39
Магия JVM Flags Запустите своё приложение с -XX:+HeapDumpOnOutOfMemoryError, и когда (не «если») приложение упадёт с OOM, у вас будет дамп памяти. 🟢 Зачем это нужно — При падении с OutOfMemoryError JVM автоматически сохраняет снапшот всей кучи в .hprof-файл. — Без него вы знаете лишь факт смерти процесса. С ним — кто именно убил. — Особенно ценно в контейнерах и CI/CD: процесс умер, лог ротировался, а дамп остался. — Работает с любым анализатором: Eclipse MAT, IntelliJ Profiler, VisualVM, YourKit. 🟢 Как использовать — Базовый запуск (дамп рядом с процессом): java -XX:+HeapDumpOnOutOfMemoryError -jar app.jar — Задать путь явно (обязательно в проде): java -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=/var/dumps/app.hprof \ -jar app.jar — В Docker нужно монтировать папку наружу, иначе дамп умрёт вместе с контейнером: -v /host/dumps:/var/dumps — Руками с живого процесса без рестарта: jcmd GC.heap_dump /tmp/live.hprof Java Библиотека | Мы в Телеграм
500 просм.7 авг., 09:55
522 просм.6 авг., 14:29
Java совет: перестань терять производительность из-за boxing Когда используешь Stream, JVM создаёт объект Integer для каждого значения. Это лишние аллокации, нагрузка на GC и замедление кода. Если работаешь с примитивами — используй primitive streams. ❌ Boxing (медленнее) Stream boxed = Stream.of(1, 2, 3, 4, 5); int sumBoxed = boxed.reduce(0, Integer::sum); ✅ Без boxing (быстрее и эффективнее) int sumPrimitive = IntStream.of(1, 2, 3, 4, 5).sum(); Другие primitive streams: IntStream LongStream DoubleStream Когда это критично: • большие коллекции • high-load сервисы • data processing • performance-sensitive код Правило простое: Если работаешь с числами - используй primitive streams, а не обёртки. Java Библиотека | Мы в Телеграм
515 просм.6 авг., 08:37
📌 Заметил, что среди начинающих аналитиков часто возникает пробел на стыке базовой теории и работы с реальными данными. Недавно наткнулся на один камерный авторский проект, где этот баланс соблюден очень грамотно. 🧠 Автор разбирает фундамент, необходимый каждому аналитику: от исторических предпосылок развития индустрии до конкретных инструментов. Что ценно — сложная высшая математика и алгоритмы на Python здесь объясняются без лишней академичности, на понятных прикладных задачах. Качественный разбор практики помогает быстрее разложить знания по полочкам и избежать типичных ошибок на старте. 🤝 Редко встречаю такой уровень проработки материала в небольших сообществах. Если вы сейчас развиваетесь в профессии и ищете надежный источник для прокачки базы, то заглядывайте https://max.ru/id701744347302_biz2
450 просм.4 авг., 19:00
Spring Boot: можно обрабатывать CORS глобально через WebMvcConfigurer CORS — это механизм, который позволяет веб-приложению на одном домене (origin) получать доступ к ресурсам с другого домена. Java Библиотека | Мы в Телеграм
537 просм.3 авг., 18:29
Когда микросервисов становится больше, проблемы редко возникают в бизнес-логике. Чаще всего они появляются на стыке сервисов: задержки, каскадные сбои, перегрузка и сложность получения данных. Именно здесь архитектурные решения определяют, насколько система будет быстрой и устойчивой. 4 августа в 20:00 МСК приглашаем вас на открытый урок курса «Архитектор программного обеспечения», где разберём, как проектировать взаимодействие между сервисами без лишней сложности и потери производительности. На занятии обсудим причины каскадных задержек, подходы к объединению API, роль API Gateway и агрегаторов, разберём, когда GraphQL действительно оправдан, а также на практических примерах рассмотрим шаблон CQRS и его влияние на масштабирование, кэширование и распределение нагрузки. Вы получите идеи, которые можно применить в существующих проектах. Если вы проектируете микросервисные системы, отвечаете за их развитие или хотите глубже разобраться в архитектурных подходах, зарегистрируйтесь на открытый урок и получите практические решения для создания быстрых и надёжных приложений: https://vk.cc/d09Om7 Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
501 просм.3 авг., 13:01
😁
526 просм.3 авг., 11:00
⚠️ Маленькая настройка в Spring Boot, которая может спасти от скрытых багов. Лучше не менять значение по умолчанию: spring.main.allow-bean-definition-overriding=false Что это делает? Если в приложении два бина с одинаковым именем, Spring не запустится. И это на самом деле хорошо. Почему: ✔️ помогает сразу увидеть конфликт конфигурации ✔️ не даёт одному бину тихо перезаписать другой ✔️ предотвращает скрытые баги в DI Если же включить: spring.main.allow-bean-definition-overriding=true • тогда второй бин молча перезапишет первый. В результате приложение запустится, но будет использовать не тот бин, который вы ожидали. И такие баги потом очень сложно найти. Иногда лучше получить ошибку при старте, чем искать проблему в продакшене. Java Библиотека | Мы в Телеграм
582 просм.2 авг., 23:53
Совет по Java: избегайте глубокой вложенности if-else — используйте guard clauses (ранний выход) Одна из частых проблем в Java-коде — сильно вложенные условия. Формально код работает, но его сложно читать и поддерживать. ✗ Плохо: вложенные if-else * сложно читать * логика размазана * любое изменение усложняет код ✓ Хорошо: guard clauses (ранний выход) * проверки сразу отсекают невалидные состояния * основной сценарий читается сверху вниз * код короче и понятнее Почему guard clauses — профессиональный подход: * снижают когнитивную нагрузку * делают бизнес-логику очевидной * упрощают рефакторинг и тестирование * хорошо сочетаются с fail-fast подходом Правило простое: если условие — это ошибка или отклонение от нормального потока, проверяйте его сразу и выходите из метода. В результате код становится: * линейным * предсказуемым * удобным для поддержки На уровне синтаксиса это мелочь, но на уровне качества кода разница существенная. Java Библиотека | Мы в Телеграм
523 просм.1 авг., 09:57
Сохраняйте шпаргалку по спрингу Собрали шпаргалку по Spring для тех, кто только начинает. Карта экосистемы, главные аннотации и стартеры, типичные ошибки новичков всего на двух страницах. Java Библиотека | Мы в Телеграм
672 просм.31 июля, 22:53
Перестаём писать методы с 7+ параметрами Если сигнатура выглядит как: createUser(firstName, lastName, email, phone, address, city, country) Это уже сигнал, что модель данных развалилась. Проблема не только в читаемости. Такие методы сложнее поддерживать, расширять и тестировать. Любое изменение ломает сигнатуру и тянет за собой каскад правок. Нормальный вариант - собрать связанные данные в объект: UserInfo userInfo Получаем: - чище API - проще добавлять поля - меньше ошибок при передаче параметров - код начинает отражать доменную модель, а не список строк Это базовый приём, но именно на нём чаще всего экономят, а потом платят сложностью. Java Библиотека | Мы в Телеграм
545 просм.31 июля, 10:19
Системы счисления на Java: binary, octal и hex Разбираемся, как одно значение выглядит в десятичной, двоичной, восьмеричной и шестнадцатеричной системах счисления. На понятных схемах увидим роль основания и разрядов, связь битов с octal и hex, а также сведём все позиционные записи к одной общей формуле. Затем напишем compact source на Java 25: преобразуем числа из каждой системы в десятичную и обратно, разберём числовые литералы, Character.digit, Character.forDigit, Integer.parseInt и Integer.toString. СМОТРЕТЬ VKVIDEO СМОТРЕТЬ RUTUBE СМОТРЕТЬ YOUTUBE Java Библиотека | Мы в Телеграм
527 просм.30 июля, 12:15
Основные области памяти JVM: ▪️Heap (куча) Общая для потоков Хранит объекты и экземпляры, управляется сборщиком мусора ▪️Method Area (область методов) Общая для потоков Метаданные классов, статические переменные, байткод ▪️Runtime Constant Pool (пул констант времени выполнения) На класс, разделяется Строковые литералы, ссылки на методы, константы ▪️JVM Stack (стек JVM) На поток Фреймы вызовов, локальные переменные, адреса возврата ▪️Native Stack (нативный стек) На поток Выполнение нативного кода через JNI ▪️Program Counter (PC регистр) На поток Текущая инструкция, которую выполняет поток ▪️Code Cache (кэш кода) Общий Машинный код после JIT-компиляции ▪️Direct Memory (off-heap) Общая Память вне кучи для высокопроизводительного ввода-вывода Разбиение кучи: ▪️Eden Новые объекты создаются здесь ▪️Survivor Краткоживущие объекты перед продвижением ▪️Old Generation Долгоживущие объекты Java Библиотека | Мы в Телеграм
619 просм.30 июля, 10:01
Магия JVM Flags Запустите своё приложение с -XX:+PrintFlagsFinal, и вы увидите все настройки JVM. 🔹 Зачем это нужно — Показывает финальные значения всех JVM-флагов после применения эргономики, дефолтов и ваших переопределений. — Полезно для Java-сервисов в контейнерах: вы думаете, что выставили -Xmx512m, а JVM видит 4GB хоста и живёт своей жизнью. — Мгновенно отвечает на вопрос «а почему heap такой большой?». — Работает на любом JDK без агентов, плагинов и прав суперпользователя. 🔹 Как использовать — Дамп всех флагов при старте: java -XX:+PrintFlagsFinal -version — Только интересующее фильтруем через grep: java -XX:+PrintFlagsFinal -version 2>&1 | grep -i heapsize — Посмотреть, какой GC выбрала эргономика: java -XX:+PrintFlagsFinal -version 2>&1 | grep -i "use.*gc" — На живом процессе без рестарта: jcmd VM.flags jcmd VM.flags — особенно удобен в проде: не надо убивать процесс, видите текущее состояние прямо сейчас. ⚠️ Флаги делятся на три типа в выводе: product — обычный флаг, manageable — можно менять на лету через jcmd, diagnostic — требует -XX:+UnlockDiagnosticVMOptions. Если видите флаг, который хотите поменять, сначала смотрите его тип — сэкономит кучу времени на отладке.
530 просм.29 июля, 12:03
🎥 Вебинар: Сделайте модель своей: дообучение LLM методом QLoRA без кода Базовая модель не знает вашего домена. На живом демо дообучим локальную LLM методом QLoRA на одной видеокарте без единой строчки кода и сравним поведение до и после. Что будет разобрано: • Когда дообучать модель, а когда хватит промпта или RAG • Как устроен QLoRA: квантизация, адаптер, гиперпараметры • Запуск дообучения в Unsloth Studio / H2O LLM Studio без кода Что вы сможете делать после: • Готовить небольшой датасет в правильном формате • Запускать QLoRA-дообучение на одной видеокарте • Сравнивать модель до и после и замечать переобучение ⚠️ Открытый урок проходит в преддверии старта курса «Развертывание локальных моделей». Для участия зарегистрируйтесь: https://vk.cc/cZYNa8 Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
500 просм.28 июля, 13:32
❓Вопрос с собеседования Можно ли создать экземпляр абстрактного класса с помощью анонимного класса? Ответ: Да. Хотя напрямую создать объект абстрактного класса нельзя, Java позволяет создать анонимный подкласс, реализовать в нём абстрактные методы и сразу же создать его экземпляр. Java Библиотека | Мы в Телеграм
555 просм.28 июля, 08:47
Java совет: рекурсивный обход файловой системы В Java есть удобный способ рекурсивно обойти все файлы в директории - метод Files.walk(). Он возвращает Stream, что позволяет легко фильтровать и обрабатывать файлы через Stream API. Пример - найти все .java файлы в папке src: import java.io.IOException; import java.nio.file.*; import java.util.stream.Stream; public class Main { public static void main(String[] args) { Path startPath = Paths.get("src"); try (Stream paths = Files.walk(startPath)) { paths .filter(Files::isRegularFile) .filter(path -> path.toString().endsWith(".java")) .forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } } } Что происходит: • Files.walk(startPath) - рекурсивно проходит по всем папкам • filter(Files::isRegularFile) - оставляет только файлы • endsWith(".java") - фильтр по расширению • forEach - обработка найденных файлов Это намного чище, чем писать собственную рекурсивную функцию обхода директорий. Java Библиотека | Мы в Телеграм
562 просм.27 июля, 09:39
Java: если нужно писать переносы строк, соответствующие ОС, используй System.lineSeparator(). Java Библиотека | Мы в Телеграм
589 просм.26 июля, 09:25
Паттерн Decorator Decorator — структурный паттерн, который добавляет объектам новое поведение, оборачивая их в объекты-обёртки. Альтернатива наследованию, когда комбинаций поведения много и они меняются в рантайме. Использование 🔹 Когда нужно добавить поведение объекту, не меняя его класс и не трогая остальные объекты. 🔹 Когда наследование порождает взрывной рост классов из-за комбинаций поведений. 🔹 Когда поведение нужно добавлять и убирать динамически в рантайме. Преимущества 1️⃣ Гибкость комбинирования поведений Каждый декоратор делает одно дело. Нужно кеширование + логирование + метрики? Оборачиваете в три слоя в любом порядке. Не нужны метрики — просто не добавляете этот слой. 2️⃣ Единая ответственность Кеширование живёт в одном классе, логирование — в другом. Каждый декоратор легко читать, тестировать и заменять независимо. 3️⃣ Прозрачность для клиента Декоратор реализует тот же интерфейс, что и оригинал. Клиентский код не знает, с чем работает — с оригиналом или с обёрткой. ⚠️ Порядок декораторов имеет значение. Метрики снаружи кеша видят кеш-хиты корректно. Метрики внутри — не видят их вообще. Java Библиотека | Мы в Телеграм
588 просм.25 июля, 15:54
Задачи с собеседований: Поиск первого уникального символа в строке (jun+) — Как найти первый уникальный символ в строке? 🔘 Ключевые моменты: - Используйте доп. структуру данных для хранения количества вхождений каждого символа - Предложите в комментарии другие варианты решения. Реализация через Map на картинке 👆 Java Библиотека | Мы в Телеграм
612 просм.24 июля, 18:45
Шпаргалка по алгоритмам, деревьям и графам AlgoTree — платформа, которая помогает анализировать структуры данных: деревья, графы, обходы и другое. Здесь не готовят к собеседованиям и не дают решения задач, а последовательно объясняют, как устроены деревья, графы и алгоритмы, и почему они работают именно так. Java Библиотека | Мы в Телеграм
656 просм.21 июля, 18:13
603 просм.20 июля, 21:50
🎥 Вебинар: Выбор между Serverless и Kubernetes для AI-ворклоадов: как определить оптимальную платформу под задачу На открытом уроке рассмотрим: - В чем различаются Serverless-подходы и Kubernetes при работе с AI-ворклоадами; - Какие преимущества и ограничения есть у каждого подхода с точки зрения масштабируемости, стоимости и сложности эксплуатации; - Какие трейдоффы нужно учитывать при выборе платформы: холодный старт, управление состоянием, поддержка GPU; - Как обосновывать выбор архитектуры для разных AI-сценариев на практическом воркшопе. После занятия вы будете знать: - Как сравнивать Serverless и Kubernetes для различных AI-задач; - Как выбирать платформу оркестрации в зависимости от требований к нагрузке, бюджету и архитектуре решения; - Как учитывать ключевые технические ограничения при проектировании AI-инфраструктуры; - Как аргументированно обосновывать выбор платформы для задач масштабирования, потоковой обработки данных и построения гибридных сред. ⚠️ Открытый урок проходит в преддверии старта курса «ИИ-архитектор». 👉Для участия зарегистрируйтесь: https://vk.cc/cZJIOp Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
520 просм.20 июля, 13:01
Совет по Java: Если нужно посчитать, сколько раз элемент встречается в списке, нет необходимости писать цикл вручную. Используй готовый метод: Collections.frequency(...) Пример: int count = Collections.frequency( List.of("red", "green", "red"), "red" ); System.out.println(count); // 2 Java Библиотека | Мы в Телеграм
561 просм.20 июля, 09:15
IntelliJ IDEA: Evaluate Expression Открывается через Run → Evaluate Expression или Alt + F8 (Option + F8 на macOS). 🟢 Что это вообще такое Небольшое окно с полем ввода, в котором можно написать любое Java-выражение и мгновенно получить результат. Код выполняется в контексте текущего фрейма — видны все локальные переменные, this, поля класса. 🟢 Примеры из реальной жизни 🔘 Вызов метода на живом объекте userService.findById(42L) Не нужно писать тест — просто вызываете метод и смотрите, что он реально вернёт с текущими данными в БД. 🔘 Проверка сложного условия order.getItems().stream() .anyMatch(i -> i.getPrice().compareTo(BigDecimal.ZERO) < 0) Подозреваете, что в заказе есть товары с отрицательной ценой? Проверяете прямо сейчас, не добавляя логов. 🔘 Изменение переменной на лету user.setRole(Role.ADMIN) Хотите проверить, как поведёт себя код с другим значением — меняете стейт прямо в памяти и продолжаете выполнение. Приложение не перезапускается. 🔘 Десериализация или парсинг objectMapper.writeValueAsString(response) Получаете красивый JSON из объекта прямо в дебаггере — удобно проверить, что именно уйдёт клиенту. 🟢 Продвинутые трюки — В окне Evaluate есть переключатель с однострочного режима на Code Fragment — там можно писать многострочный код с переменными, условиями и циклами. — Результат вычисления отображается как обычная переменная в дереве дебаггера. Можно раскрыть, посмотреть вложенные поля, скопировать значение. ⚠️ Evaluate выполняет код реально — если вызовете метод с side-effect (запись в БД, отправка события), это произойдёт по-настоящему. Java Библиотека | Мы в Телеграм
543 просм.19 июля, 22:53
Сборник идей для пет-проектов Это культовый репозиторий с сотней пет-проектов для реализации: от простых CLI-инструментов до полноценных веб-приложений Вместо теории — конкретные задачи, пошаговые туториалы и репозитории, которые помогают прокачивать навыки через практику. Отличный ресурс, чтобы собрать портфолио — забираем тут. Java Библиотека | Мы в Телеграм
602 просм.19 июля, 11:09
Большинство усложняет работу с чтением файлов в Java Хотя для маленьких файлов всё уже есть из коробки Files.readAllLines() одна строка - и у тебя весь файл как список строк • никаких буферов • никакого лишнего кода List lines = Files.readAllLines(Path.of("file.txt")); for (String line : lines) { System.out.println(line); } Чисто. Просто. Читаемо. Да, это не для больших файлов, но для 80% задач - идеальный вариант Java Библиотека | Мы в Телеграм
627 просм.18 июля, 09:19
⚙️ Python, алгоритмы, обработка данных — это уже не отдельные направления, а важные инструменты современного разработчика. Именно эти инструменты лежат в основе программы бакалавриата Университета Иннополис по направлению «Анализ данных и искусственный интеллект». Что в программе: ✅ Машинное обучение и нейронные сети; ✅ Анализ больших данных и построение предсказательных моделей; ✅ Работа с реальными данными и современными ИИ-инструментами. 🔥 С первого курса вы работаете с реальными задачами от индустриальных партнёров, а не просто решаете учебные примеры. К выпуску — готовое портфолио и опыт, за который платят. Обучение на английском языке. Финансы: бюджетные/платные места, грантовый конкурс, покрывающий до 100% стоимости. Результат: навыки Аналитика данных и Инженера по машинному обучению, карьерный старт в ведущих технологических компаниях. Диплом гособразца. 👉 Оставляйте заявку прямо сейчас 👈 Реклама. АНО ВО "УНИВЕРСИТЕТ ИННОПОЛИС". ИНН 1655258235. erid: 2W5zFGDjoXF
185 просм.17 июля, 15:01
Polling vs Long Polling vs Webhooks vs SSE Четыре способа получать обновления от сервера. Каждый даёт свой баланс между простотой, эффективностью и «почти реалтайм» доставкой. Вот как они отличаются: — Polling Клиент каждые несколько секунд отправляет запрос: «есть что-то новое?». Сервер отвечает сразу — независимо от наличия данных. Большинство ответов пустые, что тратит ресурсы клиента и сервера. Подходит для сценариев вроде статуса заказа, где допустима задержка и важна простота реализации. — Long Polling Клиент отправляет запрос, а сервер держит HTTP-соединение открытым до появления данных или таймаута. Пустых ответов значительно меньше, чем в обычном polling. Использовался, например, в чатах для приближения к реалтайм-доставке сообщений. — SSE (Server-Sent Events) Клиент открывает постоянное HTTP-соединение, сервер стримит события по мере появления. Односторонний канал, лёгкий, работает поверх обычного HTTP. Многие AI-интерфейсы стримят ответы токен за токеном именно через SSE. — Webhooks Вместо опроса клиентом, сервис сам отправляет HTTP POST на заранее зарегистрированный callback URL при наступлении события. Stripe использует для подтверждения платежей, GitHub — для событий push. Клиент не держит соединение и не делает запросы, просто принимает вызовы. Часто используется комбинация: polling для простых статусов, SSE для стриминга, webhooks для событий. Java Библиотека | Мы в Телеграм
584 просм.17 июля, 09:14

Посты загружаются автоматически из канала. Администрация сайта не несёт ответственности за их содержание и размещённые в них ссылки.