Рассказываю что можно сделать на одном только голом JDK. Это старое и ныне почти забытое искусство разработки без внешних библиотек и фреймворков. Работать будем «как в былинные времена» — киркой и лопатой голыми руками и немного мозгом.
User
JPA Entity Graph и нюансы его использования
Entity Graph — это один из мощных инструментов JPA, который помогает разработчикам гибко управлять загрузкой связанных сущностей. Entity Graph позволяет динамически настраивать загрузку данных во время выполнения программы, что делает его особенно полезным в проектах со сложными структурами данных.
Команда Spring АйО подготовила статью, в которой рассмотрела, как использовать Entity Graph.
Функциональные коллекции в Java с Vavr: обзор и применение
Приветствую всех, кто устал от бесконечных проверок на null
, громоздких блоков try-catch
и мутирующих коллекций. Если вы когда-нибудь мечтали о том, чтобы привнести в Java немного функциональности, то я рад рассказать вам о библиотеке Vavr.
Взаимодействие микросервисов между собой
Следующий возникающий в голове вопрос, когда разобрался с тем, как работать с данными в данной архитектуре (а может у кого то этот вопрос стоит первым) - как микросервисы будут взаимодействовать между собой?
В данной статье разберемся с синхронным и асинхронным взаимодействием, сложностями и разными подходами.
Микросервисы. Исследование кухни
Исследования никогда не утоляют мой голод к изучению, поэтому в этот раз, они подтолкнули меня к написанию статьи. Тут постарался ответить на возможные насущные вопросы о микросервисной архитектуре.
Чистый код: Принцип разделения интерфейса (ISP)
Принцип разделения интерфейсов предполагает, что вы не должны заставлять клиента реализовывать интерфейс, содержащий методы, которые ему не нужны. Вместо этого вам следует разбить более крупные интерфейсы на более мелкие, ориентированные на конкретные случаи использования.
Этот принцип пожалуй самый простой для понимания, но важный при реализации. С разделением интерфейсов мы встречаемся постоянно, правительство любой страны имеет интерфейсы, которые называются министерствами, компании - интерфейсы в виде отделов, материнская плата - интерфейсы для подключения памяти, процессоров и другой периферии. Тоже самое логично делать и в программировании.
В чем суть принципа разделения интерфейсов. Если перефразировать простыми словами, не нужно делать два дела сразу. Сознание человека так и построено, вспомните детскую задачку, когда просят одновременной дотянуться пальцем до кончика носа и гладить живот по часовой стрелке.
Прежде чем создавать свой пример, давайте рассмотрим пару участков кода из интернета. Из кода удалены приватные части классов, а так же конструкторы и параметры методов. Исключительно для экономии места.
Первый пример, выдержка из огромного класса интерфейса API, весь класс содержит около 30 методов и не представляет интереса, но показанный участок, иллюстрирует проблемы которые возникли у автора кода при модификации.
Госуслуги не противодействуют сбору логинов-паролей пользователей приложений?
Недавно одно популярное приложение с Android потребовало у меня авторизация через Госуслуги. Сделало оно это очень просто - в своём окне оно запросило у меня логин-пароль от Госуслуг.
То есть, я ввожу эти данные в окне приложения, они утекают создателям приложения, которые в этот момент могут получить полный доступ к моему кабинету Госуслуг, так как мне придётся не только ввести логин-пароль в это приложение, а подтвердить это вводом кода с телефона. И у приложения будет сессия от моего имени в лк Госуслуг.
Т. е. такая система нормально работает в браузере, когда сайт перенаправляет тебя на другое окно сайта госуслуг, и там ты в Госуслугах авторизуешься на сайте. Но в случае приложения - твой лк может оказаться полностью под контролем разработчиков приложения, если они этого пожелают. Если я не прав - поправьте меня?
Обратился в поддержку Госуслуг - они сказали, что это целиком ответственность пользователя - что он сообщает третьим приложениям, и служба безопасности Госуслуг не будет этим заниматься. И ведь многие приложения требуют логин-пароль от Госуслуг. Как считаете, что делать?
Опыт отладки хитрой утечки прямой памяти
Pinterest поддерживает формирование отчётов по метрикам рекламных объявлений внешних рекламодателей и расчёт рекламных бюджетов в реальном времени. Всё это основано на потоковых конвейерах обработки данных, созданных с помощью на Apache Flink. Доступность заданий (job) Flink для пользователей находится на уровне 99-го перцентиля. Но время от времени некоторые задачи (task) «валятся» под ударами неприятных ошибок, вызванных утечками прямой памяти (Out-Of-Memory, OOM), возникающими сразу в нескольких операторах. Выглядит это примерно так:
Memory Fences и volatile в Java: низкоуровневые гарантии порядка памяти
Сегодня рассмотрим интересную тему для тех, кто сталкивается с многопоточностью в Java – это управление порядком памяти. Базовых инструментов синхронизации, например как synchronized
или блокировки, порой недостаточно. Именно здесь могут помочь низкоуровневые механизмы, такие как Memory Fences
и ключевое слово volatile
.
Эти инструменты позволяют контролировать порядок выполнения операций с памятью. В этой статье мы рассмотрим, как volatile
влияет на поведение программы, что такое Memory Fences, и как они могут помочь в сложных ситуациях с потоками.
Почему я предпочитаю исключения, а не значения ошибок
Качественная обработка ошибок — это ключ к созданию надёжных программ; но программистов она часто пугает, ведь всегда найдётся ещё один пограничный случай.
В традиционных объектно-ориентированных языках программирования используются специальные классы исключений, которые можно выбрасывать, чтобы прекратить обычный поток управления и немедленно сообщить об ошибке.
Давайте рассмотрим пример, в котором применено защищённое от ошибок целочисленное деление:
int safeDiv(int a, int b) {
if (b == 0)
throw Div0(); // Исключения передаются особым образом
return a / b; // Теперь-то всё абсолютно безопасно, ведь так?
}
Новые языки программирования склонны применять сообщения об ошибках в функциональном стиле и кодировать ошибки в возвращаемый тип. Например, Go кодирует ошибку в возвращаемый тип при помощи кортежа
(res, err)
, а Rust возвращает Result<T, E>
— тип-сумму результата и ошибки.Удивительная история развития сортировки в JDK
Как вы считаете, если выполнить java.util.Arrays.sort()
, то какая сортировка будет вызвана? Quicksort? Timsort? И та, и другая, потому что для объектов вызывается Timsort, а для примитивов (чисел int, long, float и так далее) — Dual-Pivot Quicksort. В JDK 6 для объектов использовался стандартный Merge sort, а для чисел классическая реализация Quicksort с одним опорным элементом, предложенная Джоном Бентли и Дугласом МакИлрой. В JDK 7 оба алгоритма поменялись: теперь объекты сортируются с помощью Timsort, автор Тим Петерс, а для простых типов данных используется Dual-Pivot Quicksort, предложенный мною вместе с Джоном Бентли и Джошем Блоком в 2009 году. Эта сортировка используется более 15 лет не только в JDK, но и в Android (хотя и немного устаревшая версия).
А зачем нам вообще второй алгоритм сортировки, если есть Timsort? Почему не использовать один и для объектов, и для примитивов? Сегодня я, как автор, расскажу историю Dual-Pivot Quicksort: как он начинался, как развивался и как продолжает развиваться сейчас.
Java Digest #16
Всем привет! 👋 👋 👋 👋 Мы — Java-разработчики Т-Банка: Андрей, Арсений, Константин и Константин. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и делимся этим со всем сообществом.
В этом выпуске вас ждет обновление Kora, Intellij IDEA, null-safety в Java без регистрации и СМС. Посмотрим видео с прошедшего JVM Language Summit, затронем тему исключений. Не забудем и про безопасность наших приложений, и про логи. Считаем, что этот выпуск можно считать рекордным по количеству упоминаний Project Valhalla: аж 9 упоминаний!
Как раздать модифицированный трафик с компьютера на телевизор за роутером
Бывает, что YouTube без тормозов хочется посмотреть на телевизоре. И если это телевизор на Android (либо с Android-приставкой), то тут на помощь приходят ByeDPIAndroid или PowerTunnel. Но что делать, если в наличии какой-нибудь Smart TV не на Android (например, какой-нибудь LG или Samsung)?
Очевидным решением тут будет модификация трафика на роутере. Но при всех преимуществах такой вариант может не подойти по разным причинам:
• не на каждый роутер можно установить zapret;
• не каждый человек обладает для этого нужными навыками;
• не у всех есть желание разбираться в том, как это делается и т. д.
Некоторые роутеры также прямо в родной прошивке поддерживают подключение через прокси или VPN. Но такая аппаратура есть далеко не у всех, а ютубчик смотреть всё равно хочется. А вот покупать новый роутер — не особо.
В итоге в цепочке ТВ → роутер → ПК в нашем распоряжении остаётся компьютер. Вот им мы и займёмся.
Kotlin глазами Java-разработчика
Привет, хабр! Сегодня я хочу рассказать про свой опыт взаимодействия с языком kotlin.
Представлюсь – я java разработчик, работаю в крупном банке, создаю (и поддерживаю существующие) микросервисы.
Небольшая ремарка: я не собираюсь становиться Android разработчиком, ни сейчас, ни в будущем, поэтому, когда я заинтересовался новым языком, не принимал в расчет аргументы про различные удобства мобильной разработки на нем, и руководствовался только удобством языка в целом для бэкэнда.
Итак, почему я решил изучить kotlin. Ну, во-первых, прожужали все уши, мол сокращение объема код, лаконичность, читаемость и сахар.
Про Винни-Пуха, кролика Билли и «жирные» компьютерные программы
Как странно иногда пересекаются личности сказочных героев, современные технологии и древняя философия... В лучших традициях современного приключенческого романа герои сойдутся на страницах этой статьи, чтобы переплести линии своих судеб, заставить читателя изрядно поволноваться и, наконец, привести его к захватывающему и неожиданному финалу...
Структурное логирование в Spring Boot 3.4
С выходом Spring Boot 3.4 логирование стало ещё удобнее: теперь логи можно записывать в более унифицированном формате, что упрощает их анализ и обработку.
В новом переводе от команды Spring АйО мы разберем основные шаги для настройки и использования этой технологии в проекте.
Тестирование сообщений в Kafka
Данная статья предлагает подход к написанию интеграционных тестов для приложений с Kafka, позволяющий сосредоточиться на спецификации взаимодействия, делая тесты более читаемыми и легкими для поддержки. Представленный подход не только повышает эффективность тестирования, но и способствует лучшему пониманию интеграционных процессов в приложении.
Деплой .NET приложений для самых маленьких. Часть 0
Давным-давно, когда Linux был ещё на ядре 2.6, а PHP5 был глотком свежего воздуха, я впервые заинтересовался миром веб-технологий. Читал учебники, статьи, зависал на форумах, но все равно мало мог понять как код, который я вижу на экране, превращается в волшебные сайты с кнопками, формами и анимациями. Узнал про LAMP и его аналоги для Windows, узнал, что, оказывается, есть хостинги, где такие сайты размещаются. Как только появился внешний интернет без трафика, я поспешил перенести свои локальные поделия во внешний мир, попутно узнав про замечательный протокол FTP. Просто мир волшебных открытий был для меня, особенно когда узнал, что не нужно писать свой форум с нуля, а можно использовать что-то из phpBB, vBulletin и других уже готовых движков.
И когда я много лет спустя переключился в мир .NET, перечисленные ранее умения сыграли со мной злую шутку – я долго не мог понять, как мне найти хостинг для .NET приложений. Почему все известные мне хостинги с лёгкостью предоставляли возможность развернуть PHP приложения, причём даже предлагая какие-то предустановленные версии CMS, но днём с огнём не сыщешь хостинг под .NET. Мое непонимание принципа развертывания приложений усугубляли статьи, которые предлагали их размещать в подходящих сервисах типа Heroku, Digital Ocean или Azure – ведь это так просто и дешево…
Поэтому предлагаю максимально подробно рассмотреть вопрос публикации .NET приложений в арендованном VPS.
Деплой .NET приложений для самых маленьких. Часть 1. Jenkins
В прошлой статье мы рассмотрели способы запуска наших проектов на удаленном VPS. Для этого мы арендовали хостинг, создали шаблонное приложение, перенесли его на хостинг через простое копирование через ssh и через git clone, запустили через dotnet run / dotnet publish
, а также развернули приложение в докере.
Действительно, такой подход сложно назвать правильным даже для учебных целей, уж тем более его вряд ли можно назвать хорошим для реальных рабочих проектов. Поэтому предлагаю рассмотреть сценарий развертывания контейнеризированного .NET приложения с использованием Jenkins.
Деплой .NET приложений для самых маленьких. Часть 2. Github Actions
В прошлой статье мы рассмотрели чрезвычайно популярный инструмент для выкатки приложений Jenkins. Мы подружили его через плагины с SSH, с GitHub, построили простой пайплайн с помощью Groovy. И вроде все здорово, все работает как должно, но все равно есть ощущение, что можно сделать лучше. И действительно, наш процесс можно улучшить, перестав проводить сборку на VPS.
Ранее для сборки мы использовали агент Jenkins, который был установлен на нашем хостинге, где и происходила сборка приложения и его выкатка. Конечно, в реальных проектах существует больше одного боевого сервера, существуют промежуточные серверы – тестовые, демо, стейдж. Не всегда и везде, конечно, но когда у вас несколько серверов, то и сборку приложений можно проводить на каких-то промежуточных, а после всех тестов и проверок, рабочее собранное приложение доставлять до прода. Но у нас все по простому, сразу в прод и агент был там же.
В этой статье предлагаю воспользоваться альтернативным подходом – собирать наше приложение, не покидая репозиторий, никаких дополнительных программ, и никаких агентов. Одним из таких инструментов является GithubActions, который позволяет создавать пайплайн деплоя и настроить доставку приложения на хостинг различными способами.
Information
- Rating
- Does not participate
- Registered
- Activity