Друзья! Вышел новый видос, своеобразная экранизация рубрики "сам себе экосистема", где я сам разрабатываю клиенты нужных мне приложений. Пожалуйста, оцените :)
Java *
Объектно-ориентированный язык программирования
Приглашаем на бесплатный вебинар «Java Excellence: фундамент эффективного программирования».
На вебинаре поговорим, какие навыки необходимы, чтобы стать востребованным Java-разработчиком, и обсудим, как можно их получить благодаря программе «Java-разработчик. Уровень Специалист».
Дата: 16.05.2024
Время: 18:00-19:00 (МСК)
Регистрация по ссылке.
Axiom JDK заявила о выпуске Axiom JDK Express. Axiom JDK Expres представляет собой российскую среду исполнения Java c улучшенной производительностью. В новой среде была оптимизирована платформа Java. Это позволило ускорить Java‑приложения до 15% без дополнительных затрат на оборудование. По словам разработчиков, благодаря полной совместимости со стандартом миграция на Axiom JDK Express с Java SE и сборок OpenJDK происходит бесшовно.
Новая среда улучшает работу LTS‑версий Java 8 и 11 с долгосрочной поддержкой, утверждают разработчики. Как они рассказали, почти половина всех Java‑приложений использует Java 8 и 11. При переходе этих приложений на Axiom JDK Express они получат значительный прирост скорости и экономию аппаратных средств без переписывания кода.
Axiom JDK Express объединяет виртуальную машину версии JVM 17 и среду исполнения JDK 8 или 11, повышая производительность систем до 15%. При этом не нужно менять версию фреймворка или код приложения. Достаточно изменить только один компонент вместо полноценной миграции на новый релиз JDK. Среда исполнения Axiom JDK Express ускоряет системы до уровня версии JDK 17 без изменений кода, включая сервер приложений Libercat.
Среди улучшений JDK 8:
обновление механизмов сборки мусора, включая поддержку суб‑миллисекундных пауз и терабайтной кучи во всех версиях;
запуск на 10% быстрее;
скорость сжатия на 85%;
скорость распаковки на 113%.
Также Axiom JDK рассказала, что её инженеры будут поддерживать JDK 8 до марта 2031 года,
🖥 Отличный учебник по Java
Здесь раскрыты самые основные темы + много примеров кода.
Самое то, чтобы освежить какие-то моменты перед собеседованием.
🟡Оглавление
├╼ Типы данных
├╼ Литералы
├╼ Переменные и константы
├╼ Операторы
├╼ Управляющие последовательности
├╼ Модификаторы
├╼ Ввод с клавиатуры
├╼ Особенности строк
├╼ Коллекции
├╼ Дата и время
├╼ Исключения
╰╼ Интерфейсы
📚 Учебник
А здесь я собрал топ-10 репозиториев GitHub для изучения Java, для всех, кто любит этот замечательный язык.
Сегодня в 18:00 в рамках запуска новой программы «Java-разработчик. Уровень Специалист» пройдет онлайн-встреча с автором курса Судакевичем Игорем.
Обсудим:
какие навыки стоит освоить, чтобы стать востребованным Java-разработчиком;
как строится обучение на курсе «Java-разработчик. Уровень Специалист».
Дата: 22.04.2024
Время: 18:00-19:00 (МСК)
Спикер: Судакевич Игорь — преподаватель международного уровня, более 15 лет работает в IT. Уполномоченный инструктор корпорации Oracle. Магистр компьютерно-информационных технологий. Инструктор платформы Udemy.
Регистрация по ссылке.
Первый предварительный релиз порта Foreign Function & Memory API для Android.
С выпуском стабильной версии JDK 22 в конце марта, вышла окончательная версия FFM API — современного переосмысления доступа к нативной памяти и функциям. Примечательно, что его история начиналась ещё в JDK 14 несколько лет назад, тогда же я и обратил на него своё внимание. Мне стало интересно, возможно ли без поддержки со стороны платформы полноценное портирование этого API, и ответ — ДА!
На скриншоте выше - пример из официальной документации, запущенный на android 8.0. В нём происходит вызов функции qsort из libc, при этом один из параметров — указатель на функцию сравнения. С помощью метода upcallStub можно создать указатель на MethodHandle как на нативную функцию, что и демонстрирует пример. Полная документация исходного апи доступна на официальном сайте oracle
Отдельно отмечу отличия:
Полностью воссоздать API не получилось т.к. до android 9.0 отсутствует его важный компонент — класс VarHandle, поэтому был создан другой класс с теми же методами, но без полиморфного поведения (чуть хуже оптимизация)
MemoryLayout`ы нулевого размера не разрешены (в исходном варианте их поведение не совпадает с фактическим в компиляторах C и C++)
Временно не работают upcall вызовы из потоков, не подключённых к jvm. Скоро исправлю, но ещё не придумал оптимальный путь
Вернул методы MemoryLayout.valueLayout и paddedStructLayout. Не знаю почему их убрали в конечной версии
Возможно что-то ещё
Весь исходный код доступен на github
AXENIX (ex - Accenture) проводит 1day offer для Java разработчиков и Системных аналитиков с опытом работы от 2 лет.
Даты проведения: 13 и 20 апреля соответственно.
Подай заявку до 11 апреля, если ты Java разработчик.
До 18 апреля регистрируйся тут, если интересует мероприятие для Системных аналитиков
Для участия в 1day offer:
Оставь заявку на нашем сайте.
Предварительно пообщайся с рекрутером, чтобы побольше узнать о компании и получи приглашение на one day offer.
Узнай больше о нас и наших проектах от менеджеров практики кастомной разработки.
Прими участие онлайн в собеседовании с экспертами, будет два этапа – техническое и финальное интервью.
Получи оффер в тот же день, если все прошло успешно.
Немного об Axenix
Компания образовалась после локализации российского офиса Accenture.
В практике кастомной разработки мы создаем цифровые решения на микросервисной архитектуре для банков, ритейлеров, металлургических компаний, а также у нас есть команды внутренней продуктовой разработки.
В России мы работаем в офисах в Москве, Твери, Ростове-на-Дону, Краснодаре, Санкт-Петербурге, а также удаленно.
Какие преимущества кроме достойной ЗП?
Современный стек, собственные продукты, годовые бонусы и регулярное повышение по результатам Performance Review, митапы, гибридный режим работы, ДМС для тебя и твоей семьи, дополнительные дни отпуска, корпоративные программы привилегий.
Ждем тебя в команде Axenix!
Почему в java нельзя отсортировать массив интов по убыванию?
Недавно решал задачку, предполагавшую сортировку int[] arr
по убыванию.
Я пытался это сделать минут 5... Иии не отсортировал.
В джава нет вообще ни единого встроенного механизма сортировки массива примитивов по убыванию и вот почему.
Массивы сортируются с помощью метода Arrays.sort(arr), но сортирует он по возрастанию.
Для сортировки по убыванию нужно передать в него компаратор:
int[] arr = {1, 2, 3};
Arrays.sort(arr, (x, y) -> (y - x));
Не буду вдаваться в подробности работы компаратора, потому что такой код даже не скомпилируется! Компаратор не умеет работать с примитивами, ведь он использует дженерик:
public static <T> void sort(T[] a, Comparator<? super T> c);
А так выглядит sort для инта (и такой же метод есть отдельно для каждого примитива):
public static void sort(int[] a);
Невозможность использования с дженериками — одна из главных особенностей примитивов. Ну и причина, по которой массив интов нельзя отсортировать по убыванию)
Приглашаем вас на бесплатный вебинар, посвященный работе с Hibernate — самой популярной реализацией ORM-технологии. В рамках семинара поговорим о том, почему почти в каждом проекте используется Hibernate, разберемся какие плюсы и минусы у этой технологии. А также обсудим, почему Hibernate стал синонимом ORM в мире Java.
Содержание вебинара:
• ключевые принципы ORM концепции;
• связь между ООП и реляционной моделью в Hibernate;
• плюсы и минусы Hibernate;
• разработка приложения с использованием Hibernate.
Дата: 05.03.2024
Время: 16:00-17:00 по МСК
Спикер вебинара: Тарасевич Александр — ведущий разработчик с опытом коммерческой разработки на Java более 10 лет.
Регистрация доступна по ссылке.
Некоторые могут помнить, как в комментариях под одной из своих статей на тему Unsafe в Android я писал, что занимаюсь портированием FFM API на эту платформу. Не так давно API окончательно вышло из предварительного доступа и стало полноправной частью JDK 22. Я поймал за хвост вдохновение и с утроенными силами начал писать код и придумывать как перенести непереносимое. Так начались поиски способа рантайм генерации нативного кода под любую из поддерживаемых андроидом архитектур, и он был найден! Выходом стала системная библиотека libLLVM.so, которая умеет делать всё, что мне нужно. Осталось лишь подключить её к java коду без готового линкера. После серии экспериментов и кучи кода родилось это:
На данном скриншоте видно тестовый запуск генерации простенькой функции с выводом полученного машинного кода (он парсится из выходного ELF файла). Я планирую использовать что-то подобное как часть линкера для FFM API.
В общем, работа кипит, и никакие преграды не страшны, если хорошенько постараться. В будущем надеюсь осилить написание цикла статей про нюансы разработки, с которыми пришлось столкнуться.
Если вас заинтересовала тема, за процессом можно следить на github`е проекта
Проклятие дженериков 💀
Дженерики могут показаться очень простой темой.
Например, вот так в Java выглядят классные и простые методы интерфейса List
:
interface List<E> extends Collection<E> {
boolean add(E e);
E set(int index, E element);
}
Но у обобщений много нюансов: вложенность, вариантность, границы и т.д. Это сильно усложняет их использование.
Вот не менее классный, но совсем непростой flatMap
интерфейса Stream
🙈:
interface Stream<T> extends BaseStream<T, Stream<T>> {
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
}
Также, реализация дженериков - всегда трейдоф. Мы либо получаем большой исполняемый файл, из-за того, что приходится генерировать код для разных типов. Либо получаем дополнительную нагрузку в рантайме, из-за различных проверок.
Из-за таких сложностей, в языке Go (философия которого - простота и минимализм) дженерики появились аж через 12 лет после релиза языка. А первый коммент про то что нужны дженерики появился меньше чем через 24 часа🙃
Во многих популярных языках дженерики появились не с первой версии, но рано или поздно, разработчики были вынуждены их ввести:
С++ вышел в 1979, дженерики - 1986
Java - 1996, дженерики - 2004
C# - 2001, дженерики - 2005
Go - 2009, дженерики - 2021
Вы Java-программист и ищите возможность оптимизировать разработку? Тогда вебинар "Java-проекты с ChatGPT: от идеи до реализации" будет вам интересен! Узнайте, как создавать, рефакторить и тестировать код с помощью ChatGPT. Вас ждёт практический гайд и знакомство с JAIG – инструментом, упрощающим генерацию кода.
Дата: 21.02.2024
Время: 16:00 по МСК
Спикер вебинара: Игорь Судакевич – сертифицированный Java-разработчик, инструктор Oracle и Udemy, методист c 15-летним опытом, консультант-репетитор.
Как IT-директору выбрать подрядчика для усиления команды бэкенд-разработки: практический вебинар
Новость для руководителей IT-отделов, техлидов и продукт-оунеров.
Часто внутри компании не хватает компетенций или сотрудников для реализации проектов в срок. В такой ситуации выгодно обратиться за услугами внешних разработчиков для временного усиления команды.
С чего начать поиск подрядчика? Как подготовиться к выводу на проект внешнего разработчика? Как сформулировать требования к программисту и проверить удаленную команду на благонадежность — на эти и другие вопросы ответят руководители компании Programming Store на бесплатном онлайн-вебинаре.
6 февраля, 16:00 МСК
Зарегистрируйтесь, чтобы получить доступ к вебинару и напоминание накануне.
Длительность — 1 час.
5 критериев готовности команды к работе с внешними разработчиками
Как оценить благонадежность подрядчика
Кейсы из практики: ритейл, производство, медицина
Спикер — Роман Огородников, руководитель проектов по backend-разработке в Programming Store.
Также вы сможете задать вопросы и получить ответы напрямую от директора компании и руководителя backend-направления Алексея Петухова.
После мероприятия все зарегистрированные участники получат на почту инструкцию с ключевыми тезисами из вебинара для эффективного выбора подрядчика.
Programming Store — центр удаленной разработки на платформах 1С, Python, Java, MS Dynamics 365. Уже 10 лет мы работаем по всей России и за рубежом с компаниями- внедренцами и крупными клиентами
Ближайшие события
25 января 2024 года стартовала онлайн-конференция Java Champions 2024. Мероприятие продлится в виртуальной среде до 30 января. Каждый день будет состоять из 7 сессий. Они начнутся в 9:00 EST и закончатся в 17:00 EST. После каждой презентации участникам будет предоставлено время для общения с докладчиками.
Чемпионы Java — это разработчики со всего мира, получившие признание за вклад в сообщество Java. Чемпионы на конференции J Champions делятся своими знаниями с разработчиками. Аудитория проекта — 14 миллионов Java-разработчиков по всему миру.
Только что вышли две библиотеки с одним номером:
Spring for Apache Kafka 3.1
Spring AMQP (Spring for RabbitMQ) 3.1
Как следует из названия, это нативная поддержка Kafka и Rabbit в Spring.
Подробности — в релиз ноутах на GitHub. Здесь по Кафке, здесь по Рэббиту.
По сути, это минорные обновления и апгрейд до актуального Spring Framework 6.1.
Подробности должны быть в следующем дайджесте.
Только что вышел Spring Authorization Server 1.2
Это фреймворк, реализующий OAuth 2.1 and OpenID Connect 1.0 поверх Spring Security.
Подробности — в релиз ноутах на GitHub.
Как им пользоваться написано в документации, но лучше всего изучить конкретные примеры.
Java-разработчики, мы вас ждём на One day offer!
Что такое One day offer?
Мероприятие, на котором можно стать частью нашей команды: без лишних собесов, тестовых заданий и бюрократии
Кто может участвовать?
Мы ищем java-разработчиков middle+ и senior уровня. Неважно, в каком городе ты живешь, главное находиться на территории России
Когда и где?
9 ноября в онлайне
Как попасть?
Оставь заявку на участие
Пройди предварительное онлайн-интервью и получи приглашение на ивент
Подключайся на ивент, чтобы познакомиться с проектами поближе, пройти финальное собеседование и получить свой оффер
Узнать подробности и подать заявку по ссылке
❗️Последний день подачи заявки на участие — 7 ноября
Про Youtube-канал для технарей и подкаст про Java в 2023 году 📺
Привет! Пришло время познакомить вас с каналом Cloud.ru Tech. Здесь беседуем с интересными гостями в формате подкастов, делимся новостями из мира IT-технологий и обсуждаем карьеру в IT.
🎧 Сегодня предлагаем посмотреть подкаст про Java — тема будет интересна как заядлым джавистам, так и Junior-разработчикам.
Вместе с Петром Хаустовым — тимлидом из команды СБОЛ.про мы обсудили, зачем и как изучать Java в 2023 году, что делать с синдромом самозванца, а также как джавистам проходить собеседования и находить для себя лучшие условия.
Подписывайтесь на Youtube-канал Cloud.ru Tech, чтобы быть в курсе IT-трендов!
Прочитал тут заметку про красоту замыканий и у меня появились смутные сомнения по поводу того, как появилось эта, в разных смыслах, положительных и отрицательных (я не к тому, чтобы встать на какую-то сторону, я за разумное разнообразие), хитрая техника построения кода.
В большинстве языков является естественным распространение области видимости переменных из внешнего блока во все внутренние блоки кода. Приведу пример, чтобы не было сомнений (псевдо-код намеренно нарушает синтаксис известных мне языков, чтобы не быть отнесенным явно к одному из них):
Function(type par)
{//outer block(see“inner block”father)
Int X = 123;
If(par == someConst)
{//inner block
We can use X here!
}
}
Определение для Лямбда-функции тоже создает внутренний блок кода:
Action Function(type par)
{//outer block (see “inner block” father)
Int X = 123;
If(par == someConst)
goto Label; //we need goto just to escape definition of extra inner block
Return lambda=>
{// inner block
some code that uses X in the block
};
Label:
We can still use X here!
}
Интересно! Это только мне кажется, что передача переменных из окружающего кода в код Лямбда-функции, ВОЗМОЖНО, изначально была ошибкой при разработке компилятора, когда стандартный способ распространения области видимости переменных по недосмотру применили к вновь появившимся инлайн реализациям функций? Но потом кто-то нашел применение такой возможности и, как это часто бывает, «Бага»(bug) превратилась в «Фичю» (feature)?
Сезон Java — всё! Сегодня последний день приёма заявок для участия в сезоне Java one love, и совсем скоро мы узнаем победителя.
А пока встречайте последних участников со статьями о работе с байт-кодом, сборке Java-приложения, задачах фильтрации и гибридных системах мониторинга данных.
🌌 Делаем свою простейшую систему сборки для Java
👾 Перестаём бояться генерировать байт-код
👽 FizzBuzz и искусство фильтрации
🛸 FizzBuzz и искусство фильтрации: Stream API и предикаты
🔭 Ad-hoc мониторинг: сбор, хранение и визуализация данных
🔫 Компилирование «железного» бинарника Java-программы Google Closure Stylesheets с GraalVM
Если вы как раз дописываете свою статью — поторопитесь: с завтрашнего дня статьи в сезон не принимаются. Ваши голоса могут повлиять на итоговый рейтинг — голосуем и выбираем победителя сезона по ссылке 💪 → https://u.habr.com/java1love
Сезон длится до 15 сентября. Спонсор Сезона Java one love — Мир Plat.Form.
Вклад авторов
olegchir 4056.4tagir_valeev 2369.0phillennium 1481.423derevo 1271.0ARG89 1078.2igor_suhorukov 915.2dbelob 901.0doom369 826.0alizar 756.0dididididi 709.0