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

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

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

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
Освойте разработку ПО на профессиональном уровне и расширьте свои карьерные возможности в IT.

Научитесь применять шаблоны проектирования и SOLID в разработке всего за 4 месяца под руководством опытных экспертов на онлайн-курсе «Архитектура и шаблоны проектирования» от OTUS.

После обучения вы:
▫️поймете, что такое рефакторинг и как писать чистый код;
▫️разберетесь в современных процессах разработки программного обеспечения;
▫️сможете претендовать на повышение грейда, должности и дохода.

Для прохождения программы необходимо:
▫️знание одного из языков программирования: C++, C#, Java, Kotlin, PHP или Python;
▫️знание принципов ООП

➡️Пройдите вступительное тестирование прямо сейчас, чтобы попасть на курс по спец.цене и получить курс по Git в записи бесплатно: пройти тест

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🥰2🔥1
Они уже среди нас: робопчелы, робосоколы и даже роборыбки гуппи. 

Зачем всё это нужно и почему животные не замечают подвоха, читайте в канале Фон от МегаФона. Там рассказывают, куда нас приведут такие технологии, а прямо сейчас еще и подписку Telegram Premium разыгрывают.

erid: LjN8JwbUv
4
Как вызвать нативный код?

Нативным (или машинным) кодом называется скомпилированный бинарный код. В него компилируется, например, код на C++. Java приложение может работать на любой платформе именно потому, что оно не компилируется в бинарник – вместо этого его байткод выполняется на виртуальной машине. Но порой нужно обратиться к готовой программе на другом языке, или воспользоваться специальными возможностями ОС.

Если бинарный код поставляется в виде библиотеки (.dll в Windows, .so в Unix), у вас есть два варианта:

JNI (Java Native Interface) – стандартный фреймворк взаимодействия с бинарным кодом. С ним можно в Java исходнике объявить метод без тела, а реализацию брать из бинарного файла. Простой пример использования читайте на
хабре.

JNA (Java Native Access) – сторонняя open-source библиотека, ставшая стандартом де-факто. Медленнее чем JNI, но гораздо проще в использовании. В отличие от JNI не требует кодогенерации и написания вспомогательной обвязки. Несколько примеров вызова из Java кода функций бинарных библиотек можно найти на
википедии.

Когда нативный код исполняемый (.exe в Windows, файл с правом x в Unix), можно запустить его отдельным процессом, как было описано
ранее. Но если вы разрабатываете этот бинарный код самостоятельно, то лучше сэкономить на создании отдельного процесса, и выбрать вариант сборки в библиотеку.
👍8🔥42😁1
Как архитектурно правильно подходить к избыточности при проектировании высоконагруженных систем?

Узнайте на бесплатном практическом уроке «Балансировка и отказоустойчивость приложений с HAProxy» от OTUS, где вы вместе с опытным экспертом разберете:

1. Как настраивать TCP / UDP балансировщик
2. Как работает и настраивается haproxy
3. Ответы на все возникающие вопросы по теме

Занятие пройдёт 28 марта в 20:00 мск и будет приурочено к старту курса «Highload Architect». Доступна рассрочка на обучение!

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

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🔥21👍1😐1
Можно ли удалять части API?

Иногда этот вопрос можно встретить в форме задачи. Когда библиотека попадает в пользование широкого круга разработчиков, на её разработку фактически накладывается ограничение обратной совместимости. То есть, если в следующей версии вдруг пропадут используемые классы и их члены, разработчики не захотят обновляться. Тогда развитие библиотеки остановится.

Это масштабная и сложная проблема. В её решении помогает в первую очередь семантическое версионирование и механизм прекращения поддержки (deprecation).

В новой версии библиотеки некоторые компоненты API могут получать аннотацию
@Deprecated. Функционально она не делает в программе ничего, но разработчик получит на этапе компиляции предупреждение: компонент устарел и не должен больше использоваться.

Ранее мы уже писали об особенностях использования
@Deprecated. Собираясь удалить компонент API, нужно прежде отметить его @Deprecated(forRemoval=true).

Обычно разработчики библиотеки дают пользователю запас времени на миграцию. Они предоставляют Deprecation policy – документ, в котором дают обещание, сколько времени (или версий) после появления
@Deprecated компонент всё еще не будет удален.

Для поиска в коде использования deprecated компонентов комплект JDK содержит утилиту jdeprscan. Утилита javadoc собирает список устаревших компонентов в отдельную страницу deprecated-list.html.
👍18🔥1
🚀 Пристегните ремни: Spring Framework набирает высоту

⚡️ Пройди тест по Java от OTUS и проверь, готов ли ты к обучению на нашем курсе?

Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.

👉 ПРОЙТИ ТЕСТ: https://otus.pw/HJtVo/

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

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2🥱1
Какой способ логирования выбрать?

Библиотеки логирования, ставшие стандартом де-факто, в хронологическом порядке их появления:

• java.util.Logging из стандартной библиотеки
• Log4j (deprecated)
• Logback
• Log4j 2

Все эти библиотеки поддерживают основные фичи: уровни логирования (что писать), различные хэндлеры (куда писать), форматы (как писать). Развитие библиотек происходило последовательно, в нюансах каждая из них учитывала ошибки предыдущей, сохраняя её преимущества. Обычно выбирают самые свежие варианты – Logback и Log4j 2.

Для совмещения нескольких решений в одном проекте существуют библиотеки-фасады, которые подставляют разные реализации под общий интерфейс:
• SLF4j
• Apache Commons Logging (JCL)

Кроме того, можно использовать bridge-библиотеки. Они маскируют одну реализацию непосредственно под интерфейс другой. С их помощью, например, можно уместить в одном проекте использование двух разных фасадов, или обойтись вовсе без фасадов.
🔥16👍1
3, 2 … Остановимся здесь.⤵️

Потому что 2 недель достаточно, чтобы познакомиться с основами Java и понять, подходит ли вам это направление.

Не обещаем, что будет легко, но интересно, полезно и недорого (всего 990 рублей!) – гарантируем.

Расклад такой: мы даем вам базу — больше 60 уроков, вебинары, лайвкодинг, а вы пишете собственную программу.

Если переживаете — не переживайте :) Рядом всегда будет наставник, готовый ответить на любой ваш вопрос.

 Старт курса уже 4 апреля, присоединяйтесь!
👍4🔥1
Как измерить производительность метода?

Если вы собираетесь оптимизировать код, или же выбрать лучшее с точки зрения производительности готовое решение, выбор необходимо подтвердить тестом производительности до и после. Такие тесты называются benchmark.

Первый вариант который приходит в голову – измерить время до, выполнить метод, посмотреть сколько времени прошло. У такого подхода есть ряд нюансов. Каждый последующий замер может случайным образом сильно отличаться от предыдущего. В реальном приложении результат будет совсем отличным от тестового, потому что виртуальная машина будет «прогретой»: заполнятся различные системные кэши, произойдут JIT-оптимизации горячего кода, память наполнится мусором.

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

Самое правильное решение – использовать готовый инструмент из JDK, JMH. Для этого его библиотеки добавляются в зависимости, а тестовый метод помечается аннотацией
@Benchmark. Тесты можно запускать в виде исполняемого jar-файла, либо вызовом специальных программных методов библиотеки. Итоги тестирования будут выведены в виде таблицы в консоль.
👍25🔥6🥰2
Повышение квалификации для архитекторов, разработчиков и тимлидов

Освойте Software Architect на профессиональном уровне и расширьте свои карьерные возможности

Уникальная программа, топовые преподаватели и огромное количество практики

Стартуем уже 29 марта! Доступна рассрочка на обучение. А еще мы уговорили создателей подарить участникам вебинара скидку на курс 10% по 🎁 промокоду soft10

Пройдите короткий тест и узнайте, готовы ли вы к профессиональному росту: https://vk.cc/cvJ193

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

Байткод – аналог машинного кода для JVM. Он получается в результате компиляции исходного .java файла и хранится в .class файле. Анализ байткода иногда может помочь в исследовании бага, или лучше настроить производительность. Он необходим для отладки с инструментами динамической манипуляции байткодом, вроде ASM или BCEL.

Это бинарный код, и открыть его простым текстовым редактором не выйдет. В пакете утилит JDK доступен инструмент javap. Это утилита командной строки для чтения .class файлов.

Аргументами передается полное имя класса, и classpath в котором этот класс искать. По умолчанию отображаются только объявления публичных членов. Ключ -p добавит приватные методы и поля; -v выведет дополнительные метаданные; -c отобразит сам байткод – скомпилированную реализацию методов.
👍20🔥2🥰2❤‍🔥11
Что такое phase, goal и lifecycle в Maven?

Phase – виртуальные шаги из, которых состоит lifecycle в Maven. Вообще, существует три жизненных цикла:

• Clean – фазы pre-clean, clean, post-clean;
• Default – validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy;
• Site – pre-site, site, post-site, site-deploy.

Goal – это конкретное выполняемое плагином действие. Плагин привязывает свои голы к фазам. Например, когда мы вызываем mvn clean, работу по удалению файлов сборки делает не сама фаза clean, а привязанная к ней цель clean:clean из встроенного maven-clean-plugin.
Когда аргументом команды mvn передается фаза, кроме нее самой выполнятся все предшествующие ей в том же лайфсайкле. Вместо фазы возможно явно передать цель (mvn clean:clean вместо mvn clean), но тогда никакие другие цели вызваны не будут (в данном примере цели фазы pre-clean).

Фазы всегда выполняются в том порядке, в котором они следуют в жизненном цикле. Если к одной фазе привязано несколько целей, они отработают в порядке объявления в pom.xml.

Некоторые плагины могут предоставлять цели, не привязанные ни к каким фазам. Их можно вызвать только явно.

Если в команду mvn передается несколько фаз/целей, они выполнятся последовательно. Каждая цель в процессе выполняется только однажды.

Так, вызов mvn test package – то же самое что mvn package, потому что в первом случае все цели из фазы test (и предыдущих) уже будут исполнены и пропущены в package. mvn clean install так заменить не получится, потому что это фазы из разных жизненных циклов.
👍13🔥1
Как перейти на Scala: основы и особенности

Расскажет Алексей Воронец — руководитель разработки в «NAUMEN». Встречаемся на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом:

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

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

Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://vk.cc/cvSQ36

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🔥4👍3
Чем отличается Servlet Container от Application Server?

JavaEE – это стандарт, набор соглашений. Разделяется на множество отдельных самостоятельных спецификаций технологий. В JDK поставляется в виде только интерфейсов и документации, но не их реализации.

Application Server – это полная реализация всех спецификаций стандарта JavaEE: распределенные транзакции, EJB, пуллинг соединений к БД и т.д.. Используется для хостинга полноценных enterprise-приложений (.ear). Примеры – JBoss, TomEE, Glassfish, WebSphere.

Servlet Container (web server) – это реализация минимальной необходимой части JavaEE – Servlet API и JSP. Умеет хостить статический контент, jsp-страницы и выполнять Java код сервлетов. Остальные спецификации JavaEE при необходимости добавляются сторонними библиотеками-реализациями. Примеры – Tomcat, Jetty.

Каждый сервер приложений содержит в себе контейнер сервлетов. Spring Framework – альтернатива JEE, поэтому для запуска приложения на основе Spring обычно достаточно веб-контейнера. Если же приложение использует всю мощь JEE, необходим сервер приложений.
👍9🔥1
Тест по Java от OTUS

Проверь насколько хорошо ты знаешь Java

Ответишь — пройдешь на продвинутый курс «Java Developer. Professional» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса🎁 .

👉 ПРОЙТИ ТЕСТ: https://vk.cc/cvUzGc

🎫 А ещё, сейчас действуют скидка в честь дня рождения Otus! Возможна оплата в рассрочку! Предложение ограничено.

Хотите протестировать учебный процесс заранее? Регистрируйтесь на открытый урок «Знакомство с Micronaut» 11 апреля


Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
3👍3👏3🎉1
Чем синхронный сервер отличается от асинхронного?

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

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

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

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

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

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

Filter Chain – типичный пример реализации паттерна Chain of responsibility. Каждый фильтр может модифицировать запрос/ответ, и либо отправить на обработку следующему фильтру, либо заворачивать обратно. В фильтрах удобно выполнять некий общий код обработки запросов: отклонение неавторизованных обращений, логгирование, обогащение запроса/ответа данными из контекста.

Фильтр состоит из трех методов: init, doFilter и destroy. doFilter – основная реализация фильтрации, он вызывается для каждого запроса. Инициализация и уничтожение вызываются строго по одному разу. Кроме того, сервлет-контейнер гарантирует, что их вызовы не будут пересекаться: doFilter не начнет работать до конца выполнения init, и закончит до начала destroy.
👍133🔥1
Хотите освоить среду выполнения wasm/wasi и запускать серверные приложения без привязки к операционной системе?

Присоединяйтесь к нашему бесплатному уроку «Wasm на сервере для высоконагруженных систем».

Дата: 09.04 в 20:00 мск

На уроке вы узнаете:
- Основы компиляции приложений в WebAssembly из различных технологий разработки: tinygo, emscripten, cargo.
- Как использовать Docker и NGINX Unit для публикации ваших wasm-приложений.
- Подключение wasm к envoy и публикация как функций в knative.
- Инструменты отладки и оценки производительности опубликованных wasm-приложений с использованием wzprof.
Не упустите возможность погрузиться в мир WebAssembly и трансформировать свою разработку серверных приложений!

После вебинара можно записаться на курс «Highload Architect» от Otus. Курс доступен для приобретения в рассрочку.

Пройдите короткий тест и начните обучение бесплатно: https://otus.pw/oQPE/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🔥4👍2🎉2
Когда использовать WEB-INF, а когда META-INF?

В корне архива java-приложения часто встречаются директории WEB-INF и META-INF. Обе директории хранят в себе различные файлы с метаинформацией о программе, обычно в текстовом виде: yaml, xml, json, обычный текст.

META-INF используется в архивах всех типов. Главный файл этой директории – MANIFEST.MF, о котором уже говорили ранее. Там же хранятся
• Объявления провайдеров SPI;
• Подпись архива: файлы .SF, .DSA, .RSA;
• INDEX.LIST с подсказками о местонахождении пакетов для загрузчика.
Иногда (не часто) приложения добавляют туда свои статические ресурсы, так как эта директория попадает в classpath и доступна в рантайме.

WEB-INF используется только в web-архивах (.war). Она не заменяет, но дополняет META-INF. В ней хранится:
• Главный файл web-приложения web.xml;
• Дескрипторы тегов .TLD;
• Поддиректория classes/ с классами web-приложения;
• Поддиректория lib/ с .jar-библиотеками зависимостей;
• Поддиректория tag/ с файлами тегов.
👍11🔥2
Митап для Java-разработчиков от МТС

16 апреля | 18:30
Офлайн в Москве | Онлайн

Что будет в программе:

— Рассмотрим проблемы Anemic Domain Model и Rich Domain Model в действии;

— Поделимся результатами исследования, которые были получены в процессе выбора СУБД: особенности протокола, трафик, анализ кода PostgreSql;

— Обсудим распределенную трассировку со Spring Cloud Sleuth;

— Расскажем как сделать свой Redis Search в "домашних условиях".

Очных участников ждут нетворкинг и ламповый вечер. Все желающие смогут присоединиться онлайн.

Регистрируйтесь по ссылке.

Реклама. ООО "МТС ДИДЖИТАЛ". ИНН: 7707767501. erid: 2VfnxxsSF76
👍5🔥2