На GitHub представлен проект OpenTTY Java Edition. Это эмулятор терминала OpenTTY для старых телефонов с поддержкой J2ME (Java ME, ранее — Java 2 Micro Edition).
Исходный код проекта OpenTTY Java Edition написан на Java, в нём доступны основные команды, есть поддержка Debug Tool, shell script, Xorg server, htop (show memory usage), netstat (verify network), nano (temporary notepad), wget (save website html) и tty (show console path).
Важнейшая проблема при разработке реактивных приложений — передача реактивного стрима по сети. В рамках семинара разберем реализацию поверх протокола GRPC. Изучим место этой реализации среди остальных, поймем как устроено это решение, разберёмся в некоторых допущениях, которые оно использует, и обсудим практические примеры использования данной технологии.
📅 Дата: 19.07.2024
⏰ Время: 17:00-19:00 (Мск)
На вебинаре:
✔️ Сетевые реактивные стримы
✔️ GRPC
✔️ Реактивный GRPC
✔️ Особенности Flow Control в реактивном GRPC
✔️ Практические примеры использования реактивного GRPC
👨🎓 Спикер: Кузнецов Николай — Java-разработчик в компании АО «Синхро» (проект «Столото» ex СБЕР). Обладает опытом разработки высоконагруженных систем более 5 лет. Автор ряда научных публикаций в области распределённых и децентрализованных систем.
Наш летний ИТ-фестиваль «Сезон кода» проведем 13 июля. Будем делиться опытом, говорить про технологии, танцевать и уже по доброй традиции помогать «Семейному дому» в Казани.
Сезон кода: ИТ-фест в Казани
Что по программе:
— доклады по Java, Scala, QA, Mobile и Data от инженеров Т-Банка, Сбера, VK и Магнит Маркет; — квиз и кастомные настолки, чтобы поиграть в перерывах; — спорт-, лаундж- и фотозоны, где можно размяться, отдохнуть и сделать пару снимков на память.
Стать участником ИТ-феста просто: нужно зарегистрироваться и внести пожертвование от 1000 ₽. Подробности на этой странице.
Какие компиляторы есть в Java? Простой ответ - javac. Компилирует исходники в байт-код, который исполняет JVM. Исполняет и оптимизирует. И основные оптимизации происходят именно runtime, а javac является "примитивным". Идея в том, что собирается статистика использования кода, часто используемый код компилируется в "нативный" для конкретного процессора, а неиспользуемый удаляется. Получаем плюс один компилятор - JIT (Just in Time). Только исторически компиляторов два: С1 - быстрый, но оптимизирующий не оптимально))), второй C2 - медленный и хорошо оптимизирующий. Сейчас они используются в паре, см. https://for-each.dev/lessons/b/-jvm-tiered-compilation
адаптер - предоставляет API, которое вызывается из кода. Их всего 3 - SL4J, JCL (Apache Common Logging) и JBoss Logging. Самый распространенный и рекомендуемый - SLF4J
bridge - нужен, когда какая-то библиотека использует не тот адаптер, что мы хотим. По сути адаптер на адаптер, который эмулирует API, вызываемое из кода, и пробрасывает вызовы в нужный адаптер, как правило SLF4J. Понятно, что когда у нас есть адаптер на адаптер, есть риск бесконечной рекурсии. Про это надо помнить)
движок логгера - компонента, которая пишет логи. Примеры: log4j, log4j2, logback, JUL\JDK (встроенный в JDK)
фильтры и конверторы - позволяют отфильтровать или преобразовать сообщения на клиенте
Плюс 3 хороших совета:
соблюдать гигиену classpath - чистить его от лишних библиотек
логи могут стать основой мониторинга. Мы отбрасываем специальным образом размеченную запись в лог, которая после обработки становится событием мониторинга
не добавлять в свои библиотеки как зависимость движок логгера. Пусть его выберет потребитель, а не разбирается с транзитивными зависимостями
И 2 полезные утилиты - миграторы на logback и SLF4J с альтернативных библиотек.
Краткий конспект, не влияющий на рекомендацию посмотреть видео:
затраты на выбрасывание исключений конечно же есть, но если исключение в вашем сервисе = ошибке, то проблем с производительностью не будет. Т.к. частота ошибок сильно меньше RPS.
если ваши исключение выбрасывается в строго определенном месте кода - можно убрать из него stacktrace, это неплохо увеличит производительность. На самом деле если просто не обращаться к stacktrace, то она уже увеличится, но для надежности лучше вообще не прикреплять stacktrace. Или использовать StackWalking API https://www.baeldung.com/java-9-stackwalking-api
самый спорный и опасный совет для предыдущего кейса - закэшировать исключение, так его выброс будет еще быстрее. Но по сути это старый добрый "go to". Использовать с осторожностью!)
исключение должно содержать весь контекст ошибки, в идеале с предложениями по ее исправлению. Чтобы структурировать информацию об ошибке есть библиотека https://github.com/melix/jdoctor Активность в репозитории слабенькая, но сама идея мне нравится.
как известно, есть исключения, которые не стоит ловить - например, OOM и StackOverflow. А если очень хочется OOM поймать?) Тогда нужно заранее создать необходимые для сохранения информации о проблеме объекты, ведь после OOM памяти уже не будет.
А еще из интересного - после просмотра видео станет понятно, как работает SneakyThrows в Lombok
В таких случаях, чтобы избавиться от хардкода, нужно написать константы с именами полей. Вручную это делать долго, но оказывается, это умеет ломбок! Вот так выглядит код с ломбоком:
@FieldNameConstants
public class FieldNameConstantsExample {
private final String iAmAField;
private final int andSoAmI;
@FieldNameConstants.Exclude private final int asAmI;
}
и вот во что он превратится:
public class FieldNameConstantsExample {
private final String iAmAField;
private final int andSoAmI;
private final int asAmI;
public static final class Fields {
public static final String iAmAField = "iAmAField";
public static final String andSoAmI = "andSoAmI";
}
}
Учим Java: с жёстким тестовым, зато бесплатно и с приглашением на стажировку
Надеюсь, это был достаточно вовлекающий заголовок. Переходим к делу.
Уже 5 лет Clevertec проводит внешние курсы по бэку, чтобы растить разработчиков с нужным стеком и компетенциями под финтех-проекты. В последние пару лет в каждом наборе получаем 1000+ заявок, после тестовых отбираем 30-40 человек и погнали.
Это классический курс с лекциями, домашками (с дедлайном) и промежуточными собесами. Длится 4-5 месяцев. Онлайн.
Тема не для новичков. Обычно отбор по тестовым проходят те, кто уже учил Java сам или на других курсах. Но есть бонус: если хорошо справляешься, то можешь получить приглашение на стажировку до окончания курса. Поэтому если давно в теме и хочешь ускориться с первой работой в айти – надо пробовать.
Курс всегда получает крутой фидбек за обратную связь и поддержку.
Сами удивляемся, как ребята находят время и силы менторить студентов и писать подробные комменты к домашкам.
Наши бэки работают в финтехе и учат стеку, который практикуют сами. Прокачаешь Core, Spring и CI/CD и научишься работать в команде. Это тоже важно для погружения.
Хочешь с нами?
До 1 июля заполни анкету предзаписи. После 1 июля жди в почте тестовое и инструкции.
Друзья! Вышел новый видос, своеобразная экранизация рубрики "сам себе экосистема", где я сам разрабатываю клиенты нужных мне приложений. Пожалуйста, оцените :)
Приглашаем на бесплатный вебинар «Java Excellence: фундамент эффективного программирования». На вебинаре поговорим, какие навыки необходимы, чтобы стать востребованным Java-разработчиком, и обсудим, как можно их получить благодаря программе «Java-разработчик. Уровень Специалист».
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 года,
Сегодня в 18:00 в рамках запуска новой программы «Java-разработчик. Уровень Специалист» пройдет онлайн-встреча с автором курса Судакевичем Игорем.
Обсудим: какие навыки стоит освоить, чтобы стать востребованным Java-разработчиком; как строится обучение на курсе «Java-разработчик. Уровень Специалист».
Дата: 22.04.2024 Время: 18:00-19:00 (МСК)
Спикер: Судакевич Игорь — преподаватель международного уровня, более 15 лет работает в IT. Уполномоченный инструктор корпорации Oracle. Магистр компьютерно-информационных технологий. Инструктор платформы Udemy.
С выпуском стабильной версии 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. Не знаю почему их убрали в конечной версии
AXENIX (ex - Accenture) проводит 1day offer для Java разработчиков и Системных аналитиков с опытом работы от 2 лет.
Даты проведения: 13 и 20 апреля соответственно.
Подай заявку до 11 апреля, если ты Java разработчик.
До 18 апреля регистрируйся тут, если интересует мероприятие для Системных аналитиков
Для участия в 1day offer:
Оставь заявку на нашем сайте.
Предварительно пообщайся с рекрутером, чтобы побольше узнать о компании и получи приглашение на one day offer.
Узнай больше о нас и наших проектах от менеджеров практики кастомной разработки.
Прими участие онлайн в собеседовании с экспертами, будет два этапа – техническое и финальное интервью.
Получи оффер в тот же день, если все прошло успешно.
Немного об Axenix
Компания образовалась после локализации российского офиса Accenture.
В практике кастомной разработки мы создаем цифровые решения на микросервисной архитектуре для банков, ритейлеров, металлургических компаний, а также у нас есть команды внутренней продуктовой разработки.
В России мы работаем в офисах в Москве, Твери, Ростове-на-Дону, Краснодаре, Санкт-Петербурге, а также удаленно.
Какие преимущества кроме достойной ЗП?
Современный стек, собственные продукты, годовые бонусы и регулярное повышение по результатам Performance Review, митапы, гибридный режим работы, ДМС для тебя и твоей семьи, дополнительные дни отпуска, корпоративные программы привилегий.
Не буду вдаваться в подробности работы компаратора, потому что такой код даже не скомпилируется! Компаратор не умеет работать с примитивами, ведь он использует дженерик:
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🙈:
Также, реализация дженериков - всегда трейдоф. Мы либо получаем большой исполняемый файл, из-за того, что приходится генерировать код для разных типов. Либо получаем дополнительную нагрузку в рантайме, из-за различных проверок.
Из-за таких сложностей, в языке Go (философия которого - простота и минимализм) дженерики появились аж через 12 лет после релиза языка. А первый коммент про то что нужны дженерики появился меньше чем через 24 часа🙃
Во многих популярных языках дженерики появились не с первой версии, но рано или поздно, разработчики были вынуждены их ввести:
Вы Java-программист и ищите возможность оптимизировать разработку? Тогда вебинар "Java-проекты с ChatGPT: от идеи до реализации" будет вам интересен! Узнайте, как создавать, рефакторить и тестировать код с помощью ChatGPT. Вас ждёт практический гайд и знакомство с JAIG – инструментом, упрощающим генерацию кода.
Дата: 21.02.2024 Время: 16:00 по МСК
Спикер вебинара: Игорь Судакевич – сертифицированный Java-разработчик, инструктор Oracle и Udemy, методист c 15-летним опытом, консультант-репетитор.
Как IT-директору выбрать подрядчика для усиления команды бэкенд-разработки: практический вебинар
Новость для руководителей IT-отделов, техлидов и продукт-оунеров.
Часто внутри компании не хватает компетенций или сотрудников для реализации проектов в срок. В такой ситуации выгодно обратиться за услугами внешних разработчиков для временного усиления команды.
С чего начать поиск подрядчика? Как подготовиться к выводу на проект внешнего разработчика? Как сформулировать требования к программисту и проверить удаленную команду на благонадежность — на эти и другие вопросы ответят руководители компании Programming Store на бесплатном онлайн-вебинаре.
6 февраля, 16:00 МСК
Зарегистрируйтесь, чтобы получить доступ к вебинару и напоминание накануне.
5 критериев готовности команды к работе с внешними разработчиками
Как оценить благонадежность подрядчика
Кейсы из практики: ритейл, производство, медицина
Спикер — Роман Огородников, руководитель проектов по backend-разработке в Programming Store.
Также вы сможете задать вопросы и получить ответы напрямую от директора компании и руководителя backend-направления Алексея Петухова.
После мероприятия все зарегистрированные участники получат на почту инструкцию с ключевыми тезисами из вебинара для эффективного выбора подрядчика.
Programming Store — центр удаленной разработки на платформах 1С, Python, Java, MS Dynamics 365. Уже 10 лет мы работаем по всей России и за рубежом с компаниями- внедренцами и крупными клиентами