Java Guru 🤓
13.4K subscribers
933 photos
15 videos
788 links
Канал с вопросами и задачами с собеседований!

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

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

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
Java Developer Middle+/Senior/Lead

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

Обязанности:
Разрабатывать внешние и внутренние продукты
Прорабатывать и реализовать интеграционные решени
Требования:
Опыт разработки на Java от 3 лет
Опыт коммерческой разработки на Java 11+ или Kotlin
Опыт коммерческой разработки с любым из фреймворков: Spring Boot, Quarkus, Micronaut или Vert.x
Опыт коммерческой разработки с одним из контейнеризаторов: Kubernetes, Docker или OpenShift
Опыт коммерческой разработки с одним из брокеров: Kafka, Rabbit MQ или Active MQ
Опыт коммерческой разработки с Postgress, MySQL или Oracle будет плюсом
Опыт работы с системой контроля версий

Условия:
Аккредитованная IT-компания
Возможность удаленной работы
Полное соблюдение ТК РФ и своевременная выплата заработной платы;
Расширенное ДМС со стоматологией, бесплатные лекарства по назначению врачей;
Корпоративное обучение и сертификация в технических областях;
Бесплатное обучение английскому;
Онлайн-йога

Контакты:
+7 960 324 9665
https://t.iss.one/ntsh_02
3👍3🔥2👏1
Как сгенерировать хорошее случайное число?

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

Псевдослучайные числа – это последовательность случайных на вид чисел, на самом деле полученных в результате математического алгоритма. Последовательность таких чисел можно воспроизвести, зная начальные условия (seed, энтропия) и используемый алгоритм. Метод, который используется для генерации чисел в классе java.util.Random, дает криптографически ненадежные псевдослучайные числа – злоумышленник может достаточно легко их предугадывать.

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

Класс SecureRandom предоставляет доступ к криптографически надежным генераторам случайных чисел. При том, это могут быть как достаточно сложные последовательности псевдослучайных, так и истинно случайные числа. Согласно стандартам безопасности, они будут достаточно непредсказуемы.

Не все случайные числа одинаково случайны. Шанс что рост случайного человека окажется ближе к среднему высок, тогда как у игральной кости одинакова вероятность выпадения любой из граней. В математике это называется распределением вероятностей.

Внутри SecureRandom использует SPI. Мы можем выбирать из различных алгоритмов генерации и их провайдеров, указав их названия в фабричном методе getInstance. Все перечисленные выше свойства определяются именно используемым алгоритмом.
🔥12👍81
Мечтаешь о карьере в бигтехе?

Приходи на интенсив в Открытые школы Т1 для Java-разработчиков с опытом от года. Это возможность получить оффер от Т1 — крупнейшей ИТ-компании страны по версии RAEX и CNews Analytics 2023 🔝, в портфеле которой 800+ масштабных проектов и 70+ продуктов и услуг.

Поддержка наставников и советы HR помогают пройти интервью в Т1 успешнее, а карьерный трек позволяет выпускникам программы быстрее вырасти из джуна в мидла в Т1.

Почему в Т1 классно?

🔹Уникальный рыночный опыт. Наши проекты ежегодно получают награды на ИТ-конкурсах: Global CIO, Национальной банковской премии и др.

🔹Быстрый рост в ИТ при экспертной поддержке. Карьерные треки для выпускников Открытых школ позволяют быстро вырасти в мидла.

🔹Работа в бигтехе, где есть ДМС, удалёнка и крутые офисы, спорт и обучение, митапы, программы развития и др.

⌛️ Быстрое обучение: 1 месяц.
💻 Гибкий формат: все этапы онлайн, занятия по вечерам.

Подавай заявку до 13 сентября!

Старт 16 сентября.

Реклама. ООО "Т1". ИНН 7720484492.
👍32🔥2👏1
Что выведет на экран следующий код?
👍43🔥2
👍93🔥2
👩‍💻 Освойте Java-разработку с нуля и станьте востребованным специалистом!

Ждём вас на онлайн-курсе «Специализация Java-разработчик». Только живые вебинары, вы освоите самые востребованные инструменты и лучшие практики.

Ознакомится с курсом можно на бесплатном открытом уроке «Знакомимся с Java на примере пинг-понга».

📌 Урок пройдет 24 сентября в 20:00 мск.

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

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

В пакете java.util расположены старые классы стандартной библиотеки Java: Date (дата+время), Calendar (конвертация и манипуляция), TimeZone (смещение часового пояса). Эти классы обладали рядом известных проблем. Экземпляры были изменяемыми, что делало их потоко-небезопасными. Работа с датами через календарь была неудобной, не было нормальной поддержки часовых поясов и интернационализации.

Постепенно стандартом де-факто стала сторонняя библиотека Joda-Time. Её разработчики решили все названные выше проблемы.

В Java 8 был добавлен пакет java.time, который взял решения из Joda-Time в стандарт, создатель библиотеки участвовал в разработке. Ключевые классы пакета:
• LocalDate, LocalTime и LocalDateTime – локальные для пользователя дата/время.
• ZonedDateTime – дата/время в определенной часовой зоне.
• Period и Duration – периоды дат и времени соответственно.

Отдельно существуют классы Date и Time пакета java.sql. Это представление даты и времени для обмена данными через JDBC. Не стоит пользоваться ими вне уровня доступа к данным, хотя бы потому, что это классы-наследники старого java.util.Date.
🔥11👍4🥰2
Бесплатный интенсив: Java-разработчик: старт в профессии с нуля.

📆 Когда: 17-18 сентября в 19:00 по мск.

За два дня интенсива в прямом эфире, под руководством опытного Java-разработчика, вы сможете:

✔️ Познакомиться с синтаксисом и основными конструкциями языка Java.
✔️ Написать свой первый проект и определить, подходит ли вам профессия разработчика.
✔️ Создать Telegram-бота с нуля.
✔️ Узнать ответы интересующие вас вопросы.
✔️ Получить доступ к закрытому профессиональному сообществу.

🎁 Подарки для участниковинтенсива: гайд «Как заговорить на сленге IT-специалистов», карта компетенций начинающего Java-разработчика и доступ в закрытое сообщество «Старт в Java» от Хекслета!
👍52🔥2
Как сгенерировать уникальный идентификатор?

UUID (universally unique identifier) – стандарт, описывающий способ создания правильных уникальных идентификаторов. Значения генерируются на основании таких источников информации, как системное время и MAC-адрес, за счет чего они остаются с достаточной вероятностью уникальными, даже будучи сгенерированными независимо. Можно с разных машин добавлять в базу данных записи с UUID-идентификаторами, и не бояться конфликта.

UUID бывает пяти разных версий, версия определяет способ создания. Формат остается одинаковым: это строковое шестнадцатеричное представление 128-битного целого числа (два long-а), разделенное дефисами на группы фиксированного размера:

25b32eaa-3017-4ad7-9224-383f6bfa5212


В Java уникальный идентификатор представляется иммутабельным классом UUID из пакета java.util. В нём нет сложной логики, только getter-ы для описанных в стандарте составных частей, конструктор и статические фабричные методы.

Единственный конструктор позволяет создать экземпляр по двум указанным половинам значения (старшие и младшие 64 бита в виде long параметров). nameUUIDFromBytes строит из заданного массива байтов UUID версии 3. randomUUID генерирует случайный уникальный идентификатор версии 4, с применением SecureRandom.
👍13🔥2
Хакатон IT INNO HACK

Кейс №1: Record Linkage для данных о клиентах. Разработай алгоритмы и методы для решения задачи о нахождении и объединении записей, которые относятся к одному и тому же клиенту из разных информационных систем.

Кейс №2: Система управления проектами. Создай высокопроизводительное приложение для управления проектами, которое будет включать в себя функционал для работы с задачами, пользователями и интеграции с внешними системами.

👨‍💻Кого мы ждём?
Студентов, junior, middle разработчиков; ML-специалистов, NLP- специалистов; Frontend-разработчиков, Backend-разработчиков, Fullstack-разработчиков, разработчиков CRM-систем, DevOps-инженеров.

📆 Даты хакатона: 27 - 29 сентября
📌Формат: Онлайн
📍Дедлайн регистрации: 23:59 23 сентября
🏆Призовой фонд: 600.000 рублей

Подробная информация и регистрация: https://tglink.io/81500dbe9250
👍42🔥2👏1
Чем IllegalArgumentException лучше чем NullPointerException?

Речь здесь идет о выборе подхода к обработке ошибки, когда пользователь передал в non-nullable параметр значение null.

Технически, оба этих исключения unchecked, оба из стандартной библиотеки, и особой разницы нет.

Однако семантически эти исключения отличаются. NullPointerException говорит пользователю о попытке обратиться к членам класса через null-ссылку. Это лишь техническое описание, без информации для пользователя о логике программы. IllegalArgumentException, напротив, явно говорит о недопустимом значении аргумента – это понятная для пользователя информация.

Семантическая разница иногда проявляется и технически. Например, в обработчиках исключений некоторых фреймворков именно IllegalArgumentException превращается в HTTP-ответ с кодом 400 Bad Request, в то время как NPE остается общим кодом «неизвестной ошибки» 500 Internal Server Error.

Кроме того, чтобы выбросить NullPointerException не требуется явного кода обработки null. Остается неизвестным, ожидаемо ли в этом случае исключение, или разработчик попросту забыл добавить корректную обработку.

Явная обработка null и выброс IllegalArgumentException для пользователя кода будет служить документацией, а сообщение об ошибке в аргументе его конструктора внесет еще больше ясности.
👍17🔥2
Как найти первую работу после курсов Java не имея опыта работы? Получи первый опыт работы в команде на реальном коммерческом проекте. Интенсив. Прокачайся с Junior до Middle. Больше никакого стресса!

Всего за 3 месяца вы овладеете навыками работы в команде, получите опыт работы с инструментами развертывания приложений, освоите множество смежных технологий применяемых современными компаниями при разработке ПО (Java, Spring, Microservices architecture, Flyway, Docker, Gradle, Git, Swagger, Event listener, Checkstyle, Webflux reactive, Kafka, PostgeSQl, GitLab CI/CD, Integration API tests, API Gateway, Spring Security, Google Meet, Soft skills ...)

100% наших выпускников находят работу сразу после окончания стажировки.
Команда из 5 разработчиков. Созвоны с тимлидом три раза в неделю по часу. Тимлид уровня Senior. Глубокий рефакторинг вашего кода.

До конца сентября скидка 15%.

Ознакомиться можно на сайте: Roadmap IT School
👍4🔥1🥴1
Сгенерируйте случайное число в интервале

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

Самые стандартные классы-генераторы случайных чисел создают равномерно распределенные значения. Любое число возникает с одинаковой вероятностью – это ожидаемое поведение для большинства задач. Например, метод Random.nextInt(1) будет генерировать примерно одинаковое количество значений 0 и 1.

Однако, программист легко может "испортить" равномерность значений последующими операциями. Возьмем вместо предыдущего примера Random.nextInt(2)%2. Такая конструкция тоже будет возвращать 0 или 1. Однако, третье возможное значение из генератора, 2, будет тоже превращено в 0. Значит, ответ 0 будет возникать в два раза чаще чем 1.

Это та причина, по которой лучше не пользоваться общепринятым «школьным» арифметическим ограничением с помощью оператора %. Вместо этого следует оставить заботу о распределении разработчикам библиотеки, и пользоваться в прикладном коде готовыми методами с границами.

Если задача подразумевает более плотную работу с распределениями, стоит воспользоваться специализированной библиотекой вроде Apache Commons Math.
👍12🔥3
Как создавать код, который легко модифицировать и поддерживать?

Узнайте на открытом вебинаре «Практическое руководство по применению SOLID-принципов» 16 сентября в 20:00 мск, где мы разберем:

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

Урок для backend и fullstack-разработчиков, архитекторов ПО и начинающих программистов.

Встречаемся в преддверии старта курса «Архитектура и шаблоны проектирования». Все участники вебинара получат специальную цену на обучение!

Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие.
5👍2🔥2
Когда стоит выбрать char[] вместо String?

Первая, очевидная причина – оптимизация. Если вам заранее известен размер строки, и он фиксирован, может быть полезно выбрать массив. Если программа работает с неизменяемыми подстроками, удобно представить их в виде offset-ов общего массива (как это было сделано раньше в самом String).

Следует помнить, что оптимизировать нужно осознанно и своевременно. JVM тоже прикладывает усилия по оптимизации строк (вроде интернирования), которые могут оказаться эффективнее ваших.

Вторая, менее очевидная причина – безопасность. Строки в Java иммутабельны. Это значит, что когда вы сохраняете пароль в объекте типа String, физически уничтожить его из памяти может только сборщик мусора.

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

Если пароль хранится в массиве, программист может самостоятельно «занулить» значение после использования.
👍13🔥5
Хотите узнать, как использовать Kafka Streams для эффективной работы с данными?

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

Присоединяйтесь к открытому вебинару 19 сентября в 20:00 мск!

Урок будет полезен разработчикам, которым интересно узнать про потоковую обработку данных из Kafka с использованием kafka-streams.

Спикер Евгений Непомнящий — опытный разработчик и преподаватель.

Встречаемся в преддверии старта курса «Apache Kafka». Все участники вебинара получат специальную цену на обучение!

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

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

В стандартной библиотеке современных версий Java для этих целей есть два класса:

Period – календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime.

Duration – длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.

Оба класса реализуют общий интерфейс TemporalAmount – период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX() возвращает новый экземпляр с измененным значением.

Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration: "P2DT3H4M", Period: "P1Y2M3D".

До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод between() нужного элемента енама ChronoUnit.
👍11🔥2
Если JAVA, SPRING, API для тебя не просто набор сектантских аббревиатур, ждём тебя на нашем JAVA митапе!
27 сентября Axenix проведет открытый митап для всех java-разработчиков и не только.
📅 Дата: 27 сентября, 18:30
📍 Место проведения: г. Санкт-Петербург, Аптекарский проспект д. 4, к.2, стр. 1, (Амфитеатр Ленполиграфмаша).

Программа: 

🔶Валерий Торопов, «Что за фокусник такой Spring-Data-Redis».  
🔶Михаил Бондаренко, «Оптимизация логирования и маскирования». 
🔶Антон Богун, «Prometheus: как Бог огня стал Богом мониторинга». 

🔥Для всех гостей митапа будет проведена пивная дегустация и кейтеринг! 
Зови друзей и приходи сам, количество мест ограничено! Успей зарегистрироваться!
👍3🔥2😁2
Что напечатает следующий код?
🔥8👍2