Java Guru 🤓
13.2K subscribers
879 photos
16 videos
743 links
Канал с вопросами и задачами с собеседований!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrSQZ

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
Чем синхронный сервер отличается от асинхронного?

Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».

Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.

Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.

Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.

Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
🔥13👏4👍2🥴2
Как написать на Java UDP-сервер?

Естественно, сначала необходимо разобраться, что такое UDP. Упрощая, User Datagram Protocol – это альтернатива TCP, когда информацию нужно слать быстро, много, и при этом допустимы потери и дублирование данных. Типичные примеры использования – потоковое видео и аудио, интернет-телефония, торренты.

В Java данные, которые планируется отправить клиентам по протоколу UDP, упаковываются в объект класса DatagramPacket. В виде массива байтов их передают в конструктор.

Для отправки и получения информации используется DatagramSocket. Он похож на ServerSocket, который применяют для создания TCP-сервера. Для приёма сообщений используется блокирующий метод receive, для отправки – send. Примечательно, что оба метода принимают DatagramPacket параметром. В случае receive его байтовый массив заполняется пришедшими данными.

Для реализации клиентской стороны используется тот же самый DatagramSocket. Просто он создается несвязанным (unbound) – в его конструкторе не указывается порт. Адрес и порт, на которые нужно отправить сообщение, устанавливаются через конструктор DatagramPacket.

В Java NIO доступна версия UDP-сокета в виде канала – DatagramChannel.
👍13🔥1
⌨️С чего начать обучение на Java-разработчика?
С бесплатного открытого урока «Многопоточность в Java» от OTUS!

На вебинаре мы:
Поговорим об организации многопоточной обработки на Java, обсудим когда ее стоит применять и какие проблемы возникают при ее использовании.

Занятие подойдет:
Тем, кто только начинает программировать на Java или думает о начале обучения программированию.

В результате:
Вы получите понимание, что такое многопоточное программирование и как это делается на языке Java

Занятие пройдёт 19 марта в 20:00 мск и будет приурочено к старту курса «Специализация Java-разработчик».

👉🏻Для бесплатного участия и получения записи урока регистрируйтесь прямо сейчас: регистрация

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Что такое JDBC-драйвер? Какие бывают типы?

JDBC – Java DataBase Connectivity – соединение с базами данных на Java. Это стандарт взаимодействия с БД. Его интерфейс поставляется в стандартной JDK в виде пакета java.sql. Какой бы библиотекой для работы с базой данных вы ни пользовались, в ее основе почти всегда лежит низкоуровневый JDBC.

JDBC-драйвер – реализация JDBC для определенной базы данных. В приложении может быть зарегистрировано несколько разных драйверов. При соединении к базе, нужный выбирается исходя из URL соединения. Например, для jdbc:mysql://localhost:3306/db_name будет использован MySQL JDBC драйвер (при наличии). Драйверы делятся на 4 типа:

Тип 1 – JDBC-ODBC мост. Делегирует работу с базой установленному в системе ODBC-драйверу. Платформозависимый. Не поддерживается с Java 8.

Тип 2 – Native API. Делегирует работу с базой библиотеке, установленной в системе. Платформозависимый. Библиотеки в отличие от ODBC специфичны для конкретной базы, поэтому такой драйвер обычно работает быстрее.

Тип 3 – драйвер сетевого протокола. Работает с промежуточным слоем (JavaEE сервером приложений), который транслирует запросы в сетевой протокол, с которым работает конкретная БД. Такой драйвер полностью реализован на Java.

Тип 4 – драйвер протокола БД/тонкий драйвер. Полная реализация протокола взаимодействия с базой данных. Отличается от типа 3 тем, что здесь логика протокола находится не на внешнем промежуточном слое, а прямо в самом драйвере.
👍10🔥3
👩‍💻 Как собрать дамп памяти в Eclipse Memory Analyzer и провести экспресс анализ OutOfMememory — практический урок для разработчиков и тестировщиков на Java

🎙Спикер Александр Царев — Tech Lead в Сбере и кандидат технических наук.

На вебинаре вы:

- узнаете, что такое дамп памяти, как его собрать и какие инструменты существуют для этих целей;
- познакомитесь с инструментом Eclipse Memory Analyzer, с помощью которого можно исследовать дампы памяти;
- получите ответы на все свои вопросы.

📢📢 Занятие пройдёт 19 марта в 20:00 мск и будет приурочено к старту курса «Java Developer. Advanced». Доступна рассрочка на обучение!

➡️ Пройдите короткий тест прямо сейчас, чтобы занять место на открытом уроке и получить запись: https://otus.pw/x8bG/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Как выбрать между Statement, PreparedStatement и CallableStatement?

Statement – SQL-выражение, подготовленное к выполнению в рамках определенной JDBC-сессии. Выполняется методом execute для обычного выражения, executeUpdate для модифицирующего, executeBatch для пакетного. Когда ожидаемый размер результата больше Integer.MAX_VALUE, используются версии методов executeLarge*.

После выполнения, экземпляр Statement владеет ResultSet-ом, и другими данными о результате выполнения, такими как количество обновленных записей и сгенерированные ключи.

PreparedStatement – предскомпилированная версия Statement, его наследник. Эффективнее выполняет одно и то же выражение множество раз. Входные параметры объявляются в SQL-выражении символом ?, следом сеттерами задаются их типы и значения. Делегирует обязанность экранировать введенные пользователем параметры базе данных.

CallableStatement – наследник PreparedStatement для вызова хранимых процедур. Кроме входных параметров, позволяет регистрировать выходные.

Экземпляры всех трех типов создаются методами интерфейса Connection.
7🥰1
Бесплатный практический урок 💥«Эффекты в Scala на примере ZIO»💥

🔥 Спикер Алексей Воронец — руководитель разработки в «NAUMEN». На вебинаре:

- узнаем о предпосылках и истории возникновения ZIO;
- сформируем представление, какие задачи решают так называемые «функциональные эффекты» в целом и ZIO в частности;
- попрактикуемся в создании и комбинировании ZIO-эффектов.

Занятие пройдёт 25 марта в 20:00 мск в рамках курса «Scala-разработчик». Доступна рассрочка на обучение!

👉 Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://otus.pw/biKL/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍2🔥1
Какие классы вовлечены в соединение с базой данных?

DriverManager управляет всеми JDBC-драйверами в приложении. Представляет набор статических методов. Лениво загружает системным класслоадером доступные предсконфигурированные драйверы:
• По списку полных имен классов из проперти jdbc.drivers;
• Через Service Provider Interface (SPI).

Менеджер занимается созданием экземпляра Connection – ключевого класса при работе с базой данных. Альтернативный менеджеру (и даже рекомендуемый) способ соединения с источником данных – ConnectionBuilder. Билдер получают из javax.sql.DataSource – формально это часть Java EE, так что здесь не будем подробно на нем останавливаться.

Driver – главный класс реализации JDBC-драйвера. Когда загружается класслоадером, сам регистрирует себя в DriverManager. Так что кроме предсконфигурированных драйверов, дополнительные можно загрузить просто вызвав Class.forName.

Можно явно создавать Connection через драйвер, минуя менеджера и билдер. Драйвер предоставляет информацию о возможных/требуемых для своей работы свойствах в виде массива DriverPropertyInfo.

DriverAction – дополнительный интерфейс, который должен реализовывать Driver, если хочет получать уведомления о разрегистрации DriverManager-ом.
👍11👏31🔥1
23 марта, в субботу, SM Lab проводит Spring Day Offer для Java-разработчиков.

📍 Программа Spring Day Offer, 23 марта:
● Тестовые задания. Проверим уровень ваших навыков.
● Техтолки. В перерывах между тестовыми заданиями с докладами выступят наши ведущие специалисты.
● Знакомство с командами. Успешные кандидаты познакомятся с командами и узнают, какие задачи им предстоит решать.
● Кульминация! Оффер! Успешно прошедшие все этапы кандидаты в этот же день получат от нас предложение о работе.

📍 Мы ждем, что вы:
● Java-разработчик с опытом работы на Spring от 3-х лет;
● стремитесь расти и развиваться; 
● хотите делать качественные ИТ-продукты и развивать ритейл в России;
● понимаете важность командной работы и стремитесь к ней.
🔥 Если вам интересно — до 19 марта зарегистрируйтесь на лендинге, и с вами свяжутся. 
Остались вопросы? Пишите сюда: [email protected]

erid: LjN8KPrEt
👍5🔥21
Что можно делать с классом Connection?

Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.

Connection предоставляет в виде класса DatabaseMetaData мета-информацию о базе данных в целом: таблицы, поддерживаемая грамматика SQL, хранимые процедуры, возможности этого соединения, и т.д..

В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.

Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.
👍14
🔥 Какие актуальные технологии нужно знать для разработки на Spring?

🎙 Расскажет Александр Оруджев — Senior Software Engineer. Встречаемся на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом разберете:

- паттерны Controller, Service и Repository;
- какую пользу они могут принести;
- особенности использования данных шаблонов в Spring.


📅 Занятие пройдёт 20 марта в 20:00 мск и будет приурочено к старту курса «Разработчик на Spring Framework». Доступна рассрочка на обучение!

👉 Пройдите короткий тест прямо сейчас, чтобы занять место на открытом уроке и получить запись: https://otus.pw/EHOI/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Какая разница между @⁠ElementCollection, @⁠OneToMany и @⁠ManyToMany?

Все эти аннотации – часть Java Persistence API. С их использованием мы регулярно сталкиваемся в реализациях JPA, таких как Hibernate.

Когда в базу данных сохраняется сущность, в которой есть поле-коллекция, это поле обязано быть помеченным одной из аннотаций.

@⁠OneToMany и @⁠ManyToMany хранят вложенные объекты как отдельные полноценные сущности – для них действуют всё те же требования, которые JPA выдвигает для всех
@Entity классов. Каждая из аннотаций отвечает за свое отношение.

@⁠ElementCollection создает коллекцию встраиваемых классов. Применять её можно только на коллекции, тип элементов которых помечен
@Embeddable, или входит в список стандартных встраиваемых классов (обертки примитивов, строки, даты, и т.д.).

На уровне хранения в реляционной базе, для
@ElementCollection будет также создана отдельная таблица. Технически она будет находиться в отношении one-to-many.

Но из Java кода коллекция будет выглядеть встроенной: её элементом не нужно иметь собственные id, ими нельзя манипулировать отдельно от основной сущности. Единственное, чем такая коллекция отличается от встроенного поля-примитива – её можно загружать лениво (включено по умолчанию).
10👍2🎉2
Что выведет следующий код?
👍62🔥1
Что выведет следующий код?
Anonymous Quiz
16%
falsetrue
33%
falsefalse
29%
truetrue
21%
truefalse
👍14🔥3🥴3
🔥 Годнота

Наткнулся на базу с 1700 вопросов с собеседований на Java разработчика. Фишка в том что просчитана вероятность с которой вопрос буден задан и есть примеры ответов. Теперь можно легко получить оффер, подготовившись к самым популярным вопросам 😏
😁5🔥4
Для чего служит Java KeyStore?

KeyStore и TrustStore – это хранилища криптографических публичных и приватных ключей и сертификатов. Обычно они представляются файлами формата .jks, .dks, .p12, и другими, в зависимости от типа хранилища.

Для манипуляций над файлами хранилищ в JDK поставляется специальная утилита – keytool. Отдельные ключи разных типов добавляются в хранилище под заданными именами (alias). Еще этот файл называют базой данных сертификатов. Этот файл обычно защищен паролем.

KeyStore и TrustStore устроены похоже, но служат разным целям. KeyStore хранит данные о нашем приложении, тогда как TrustStore – о других, которым мы доверяем.

По умолчанию не подключается никакой KeyStore. Подключить его можно параметрами javax.net.ssl.keyStore (расположение файла), javax.net.ssl.keyStoreType (тип) и javax.net.ssl.keyStorePassword (пароль). Добавочные можно загружать динамически, классом java.security.KeyStore.

По умолчанию в приложении подключен один TrustStore, файл jre/lib/security/cacerts. Переопределить его можно параметрами JVM javax.net.ssl.trustStore, javax.net.ssl.trustStorePassword и javax.net.ssl.trustStorePassword.

Типичный пример использования – подключить TrustStore с самоподписанным SSL сертификатом, чтобы приложение могло ходить на определенный сайт по протоколу HTTPS, не проваливая проверку безопасности. Либо же подключить KeyStore с подлинным SSL сертификатом, чтобы приложение само работало как HTTPS-сервер.
👍163
♨️ Хочешь выйти на новый профессиональный уровень джавист?
- Осваивай Spring!


Тест на знание языка Java

— Ответь на 21 вопрос
и проверь, насколько хорошо ты знаешь язык Java и готов освоить Spring. Сможешь сдать — пройдёшь на продвинутый онлайн-курс "Разработчик на Spring" Framework со скидкой!

👉 ПРОЙТИ ТЕСТ ОНЛАЙН-КУРСА "Разработчик на Spring Framework": https://otus.pw/SUwX/

🎫 Курс можно приобрести в рассрочку

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥21
Как приложению ограничить доступ к файлу?

В целях безопасности, весь доступ приложения к определенным частям кода и ресурсам может быть ограничен. Решения о доступе к, например, Reflection API, или к файлу принимаются менеджером безопасности.

Внутри менеджера представлен набор методов check*(), которые делегируют выполнение основному методу checkPermission(). Сам доступ, права на который нужно проверить, представляется классом java.security.Permission. Так, доступ к файлу на чтение проверяет метод checkRead. Он передает в checkPermission объект FilePermission с указанным именем файла.

Экземпляр класса SecurityManager, который реализует нужную логику ограничения доступа, можно установить программно методом System.setSecurityManager, или на старте приложения флагом -Djava.security.manager. По умолчанию менеджер не установлен.

Менеджер безопасности изначально был нужен для ограничения апплетов – они выполнялись в браузере пользователя и не должны были получить доступ к локальным пользовательским данным. Сейчас технология апплетов устарела, но SecurityManager остается всё таким же актуальным.
👍5🔥1
Как прочитать криптографический ключ?

KeyFactory – основной класс платформы Java для работы с криптографическими ключами. Набор реализаций для этой фабрики подключается с помощью механизма SPI.

Существует большое разнообразие алгоритмов шифрования: DSA, RSA, и другие. Строка-название нужного алгоритма поставляется в фабрику ключей при её создании.

KeyFactory занимается конвертацией спецификации ключа в сам публичный или приватный ключ, и обратно.

Спецификация, объект интерфейса KeySpec, – входные данные ключа. Это может быть например модуль и экспонента приватного ключа RSA.

Сами внутренние представления ключей реализуют интерфейсы PublicKey и PrivateKey – наследники общего Key.

Для каждого конкретного типа ключа используются соответствующие им классы-реализации интерфейсов.
👍9🥰3
Готов принять вызов

Стартовала регистрация на Всероссийские соревнования по продуктовому программированию «Хакатон: умный помощник для тендеров»!

Присоединяйтесь к участию и станьте частью комьюнити Федерации спортивного программирования, объединяющей талантливых специалистов и спортсменов!

Без лишних слов переходим к сути ⬅️

Когда: 23-25 марта 2024 года
Формат: гибридный
Итоги: питч-сессия пройдёт 25 марта на площадке РЭУ им. Г.В. Плеханова.
Командам из регионов доступно участие в онлайн-формате
Дедлайн регистрации: 20 марта, 23:59 (мск)

Какой кейс предстоит решить командам?

Разработка умного помощника для участия в тендерах: необходимо создать цифровой инструмент, который поможет автоматически собрать информацию по тендерам из открытых источников, и будет автоматически подбирать список позиций компании, которые подходят по критериям тендера, и делать рекомендацию сотруднику маркетинговой службы.

Кого мы ждём?
Студенческие команды в составе от 3-х до 5-ти человек
Учащихся технических специальностей
IT-специалистов
Заинтересованных представителей регионов Российской Федерации

Регистрируйся по ссылке и принимай участие в IT-соревновании от Федерации спортивного программирования!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥21