devmark_ru
223 subscribers
157 photos
121 links
Данный канал является частью проекта devmark.ru, который посвящён вопросам разработки программного обеспечения. Здесь вы найдёте полезные материалы по server-side разработке. Прежде всего по Java, Kotlin и Spring.
Download Telegram
Добавил на YouTube новое видео о том, как сохранять большие текстовые файлы на Java наиболее оптимальным образом. Текстовый вариант доступен на сайте.

Давайте сгенерируем строку из случайных символов на Java и затем сохраним её в текстовый файл. Строка должна быть очень большой (более 100 миллионов символов), чтобы мы могли легко заметить разницу во времени, которое требуется на сохранение файла.

Рассмотрим 3 варианта: обычный FileWriter, FileWriter с буферизацией и неблокирующее сохранение файла с помощью пакета java.nio. В конце подведём итоги.
👍4🔥1
Новое 📺 видео на YouTube канале!

Давайте научимся читать большой текстовый файл построчно. При этом каждую строку будем как-то обрабатывать. Например, будем искать наибольшую длину строки.

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

Также данный материал доступен в виде 📗 статьи.
👍4
Новое 📺 видео на YouTube-канале!

Во многих редакторах при работе с текстовым документом вы можете видеть, сколько всего строк содержится в этом файле. Строки между собой разделяются символом перевода строки, который в каждой операционной системе (Windows, Unix, Mac) свой.

Давайте разберёмся, как быстро подсчитать количество строк в текстовом файле независимо от той ОС, в котором выполняется наш код. Более того, текстовый файл может быть сколь угодно большим, поэтому мы будем использовать буферизацию потока, чтобы не израсходовать всю доступную оперативную память.
👍5
JetBrains анонсирует онлайн-конференцию IntelliJ IDEA Conf 2024, которая пройдёт в онлайн-формате 6 и 7 марта.

Вот некоторые темы, которые будут на ней обсуждаться:
🔹Улучшении производительности IntelliJ IDEA.
🔹Функции и классы стандартной библиотеки Kotlin.
🔹Основы безопасной разработки для защиты приложений.
🔹Изменения, грядущие в Java 22 и последующих версиях.
🔹Создание приложений с использованием ChatGPT API.
🔹Освоение Java-тестирования с использованием JUnit, Mockito и AssertJ в IntelliJ IDEA.

Участие бесплатное, требуется предварительная регистрация.
👍3
В продолжение предыдущей темы, канал YABED (мои хорошие знакомые) является информационным партнёром конференции и потому проводит розыгрыш лицензий JetBrains All Products Pack! Для участия в розыгрыше достаточно подписаться на их канал и нажать кнопку "Участвую".
👍3
🚀 Всем привет! Как вы уже знаете, наш канал выступает информационным партнёром конференции IntelliJ IDEA Conf 2024. В программе много годноты – обязательно к просмотру. Регистрируйтесь по ссылке здесь.

🏆 А мы выполняем обещание и специально к конференции проводим розыгрыш ДВУХ кодов активации для полного набора инструментов для разработки JetBrains All Products Pack!

Что нужно сделать, чтобы принимать участие?
✅ быть подписанным на наш канал
✅ нажать кнопку "Участвую"
🎯 Итоги мы подведём 29 февраля с помощью рандомайзера. Всё честно и просто.

Вперёд, за призами и присоединяйтесь к IntelliJ IDEA Conf 2024! Удачи!
#IntelliJIDEAConf
👍3
На моём YouTube-канале в комментах под видео про итераторы пользователь karakurty попросил меня рассказать также про ConcurrentModificationException в контексте данной темы.

Поэтому в статью я добавил новый раздел о том, как менять ту же коллекцию, по которой производим перебор элементов.

P.S. Мне на самом деле очень приятно, когда аудитория моего канала предлагает различные улучшения и дополнения к тому материалу, который я публикую. В своё время так уже было с видео про поиск простых чисел, когда предложенный зрителем альтернативный алгоритм оказался гораздо более быстрым, чем рассмотренная мною реализация. И это в итоге привело даже к созданию отдельной статьи.
👍5
Хочу поделиться с вами небольшой статистикой. В прошедший уик-энд количество подписчиков в этой группе перевалило за 100!

Это не может не радовать, т.к. помимо основной аудитории на моём YouTube-канале, чуть меньшей аудитории на сайте, telegram - это третья площадка, которая медленно, но верно также развивается.

Спасибо вам за те комментарии, вопросы и предложения, которые вы пишете - это позволяет создавать более качественный контент!
👍11❤1🔥1👏1
Вчера, 19 марта 2024 года, состоялся релиз Java 22! Хоть это и не LTS-версия, но она содержит несколько интересных улучшений.

✅ Из статуса preview в статус постоянной языковой конструкции перешли неименованные переменные, которые обозначаются символом нижнего подчёркивания "_".

✅ Также появилась возможность запускать и компилировать на лету через команду java имя_класса.java не только 1 указанный файл, но и все связанные между собой файлы исходников.

В статусе preview доступны следующие фичи:

➡️ Перед вызовом конструктора базового класса можно использовать инструкции, которые не ссылаются на конструируемый объект.

➡️ Упрощённая сигнатура метода main() без необходимости создания класса.

➡️ В Stream API добавлен новый интерфейс Gatherer, позволяющий создавать собственные промежуточные (отложенные) операции.

➡️ Строковые шаблоны аналогично Java 21.

Помимо изменений в самом языке и стандартной библиотеке, было произведено несколько улучшений в механизме многопоточности, сборки мусора и управления памятью.
👍3🔥2
Доработал статью про алгоритм вычисления чисел Фибоначчи в части реализации рекурсивного алгоритма.

Может показаться не очевидным, но вычисление каждого следующего элемента последовательности в рекурсивном варианте занимает в 2 раза больше времени, чем предыдущего. Хотя сам алгоритм основан на сложении двух целых чисел, уже где-то в районе 45-го элемента последовательности возникает заметная задержка в вычислении.

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

P.S. Спасибо Диме Вдовину, который является автором канала @yabed_news, за коммент о вычислительной сложности рекурсивного алгоритма.
👍3
Клиент-серверное взаимодействие через GraphQL довольно удобно, т.к. во-первых предоставляет единую точку входа, а во-вторых, позволяет грузить с сервера только те данные, которые реально нужны на клиенте.

Однако стандартный набор типов данных в GraphQL крайне мал: Int, Float, String, Boolean и ID. Но что делать, если мы хотим использовать такие типы как BigDecimal или LocalDate? В этом нам поможет библиотека graphql-java-extended-scalars.

Более подробно читайте в статье GraphQL в Spring Boot, которую я немного доработал и добавил в неё новый раздел про кастомные типы данных.

Также вы можете посмотреть пример проекта на github.
👍4
Если вы только начинаете разрабатывать под Linux или MacOS, вам может пригодиться следующая шпаргалка по консольным командам:

pwd           полный путь до текущей директории
ls список файлов в текущей директории
ls -la список скрытых файлов
cd или cd ~ перейти в домашний каталог
cd путь перейти в указанный каталог
history история выполненных команд
clear очистить консоль
exit закрыть консоль


Ещё больше команд вы сможете найти на моём сайте. А если чего-то не нашли - пишите в комментах.
👍6
Давайте сегодня поговорим о мутациях. Не волнуйтесь, мой канал не сменил тематику. Пусть картинка не вводит вас в заблуждение 😁

Мутациями в GraphQL называется изменение данных в противовес чтению данных, про которое я уже писал на прошлой неделе. Мутации - это всего лишь удобная graphql-обёртка над привычными нам методами для изменения данных.

Все методы мутаций должны быть определены в graphql-схеме в типе Mutation, а все входные параметры мутаций снабжаются ключевым словом input.
👍5
Почти через месяц, 17 мая, состоится МТС True Tech. Это IT-конференция, в которой примут участие 50 спикеров в 5 треках. Доклады будут идти весь день и закончатся вечеринкой!

Тематика докладов:
- разработка
- ИИ и машинное обучение
- облачные технологии
- наука

Возможно как онлайн-участие, так и оффлайн в Москве: МТС Live Холл (ш. Энтузиастов д. 5, стр. 2).

Регистрация на конференцию бесплатная!

Также можно принять участие в хакатоне. До 25 апреля нужно собрать команду, 26 апреля стартует хакатон. А финальный питчинг и награждение состоится на самой конференции.
👍3👎1
Сегодня, 17 апреля в 15:00 стартует онлайн-часть конференции для Java-разработчиков JPoint 2024! Также 24 и 25 апреля будет проходить офлайн-часть в Москве (Конгресс-центр «ЦМТ», Краснопресненская наб. 12). Доклады будут идти параллельно в 3 трека.

А если вы не успели купить билет, то сегодня онлайн-часть конфы можно посмотреть совершенно бесплатно в рамках Community Day.
👍2
Уже довольно давно на моём сайте есть онлайн-утилита, которая позволяет форматировать любые данные в формате XML. Например, если все элементы исходного xml записаны подряд в одну строку, то после форматирования каждый из них будет начинаться с новой строки, а вложенность будет отражена с помощью отступов.

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

Также в обеих утилитах можно настроить количество пробелов в отступах, чтобы на выходе вы получили наиболее подходящий формат.
👍8
В продолжение темы про онлайн-утилиты, я расширил существующую утилиту для вычисления SHA-хешей (Secure Hash Algorithm).

Если раньше там был единственный представитель этого семейства - SHA-256, то теперь появилось 8 новых! Добавлена поддержка хешей SHA-384, SHA-512, SHA-512/224 и SHA-512/256 из версии 2. Также добавлены хеши версии 3: SHA3-224, SHA3-256, SHA3-384, SHA3-512.

Хеш-функции предназначены для создания «отпечатков» или «дайджестов» для сообщений произвольной длины. Применяются в различных приложениях или компонентах, связанных с защитой информации.
👍5
Доработал утилиту для преобразования числа в текст, которая доступна на сайте. Эта утилита записывает число словами, правильно их склоняя с учётом правил русского языка вместе с единицами измерения.

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

Например, если выбрать "рубли и копейки" и ввести число 1234.50, то на выходе получим текст одна тысяча двести тридцать четыре рубля 50 копеек. В настройках можно выбрать также евро, доллары, метры и даже гектары! И ещё можно настроить регистр букв.

А если вас интересует сам алгоритм преобразования числа в текст, вы можете посмотреть его в исходниках моей библиотеки, написанной на Kotlin.
👍6❤1
Написал третью статью про GraphQL на Kotlin и Spring. На этот раз научимся обрабатывать исключения и менять стандартный формат ответа при ошибке.

Spring Boot Graphql предоставляет простой способ кастомизации ошибок, а наличие общего базового исключения для всех ошибок бизнес-логики позволяет избежать лишнего дублирования кода и при этом несёт дополнительную информацию.

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

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

Новичков такая задача может сбить с толку, поэтому я написал небольшую статью с разбором этой задачи и несколько вариантов её решения.
👍7
Сегодня я расскажу про интерфейсы Comparable и Comparator в Java:
📗 новая статья на сайте
📺 новое видео на YouTube

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

Если вам нужно поддерживать несколько различных вариантов сортировки, используйте интерфейс Comparator. Он позволяет объявлять отдельные классы-компараторы под каждый вид сортировки.

Но гораздо удобнее конструировать компараторы «на лету», используя статический метод comparing() интерфейса Comparator. В этом случае вы можете комбинировать несколько полей для сравнения и даже менять порядок сортировки на обратный.
👍9