Обновить

Разработка

Сначала показывать
Порог рейтинга

Kotlin и Hyperskill: как я искал курс и что получил в итоге.

Когда я решил изучать Kotlin, ожидал, что найти хороший курс будет просто: язык популярный, используется в Android и бэкенде, вокруг много материалов. Искал менторов и упирался в людей которые знаю java и вроде как используют в работе Kotlin. Это одновременно пугало и заинтересовывало, я решил поступить как мне казалось правильным, найти готовый курс  — особенно если хочется не “смотреть видео”, а именно учиться через практику и задачи.

Я перепробовал разные форматы обучения (платные и бесплатные), поэтому в этот раз подход был простой: найти платформу, где есть структурированная программа и много практики. В итоге я добрался до Hyperskill (hyperskill.org). Это не реклама — просто личный опыт, кому-то он может сэкономить время.

Как я пришёл к ресурсу.

Изначально искал курсы по Kotlin на привычных площадках. На Stepik в тот момент не нашёл того, что мне подходило по структуре (возможно, сейчас ситуация лучше). Видео-курсы на крупных “известных сайтах” сознательно не рассматривал: мне удобнее формат “прочитал → сделал → получил проверку”.

Дальше — обычный путь через поисковик и сравнение нескольких платформ. Из того, что выглядело цельно и практично, больше всего зацепил Hyperskill. Отдельно сыграло роль то, что платформа связана с JetBra…. (то есть ребята явно понимают, как устроена экосистема вокруг Kotlin и IDE).После регистрации быстро становится понятно: платформа активно ведёт к подписке.Раньше в сети встречались статьи про возможность оформить бесплатную подписку на полгода, но это устаревшая информация — сейчас такой опции нет (по крайней мере, в том виде, в каком её описывают старые гайды).

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

Что я проходил: Introduction to Kotlin.

На платформе несколько треков по Kotlin, я начал с Introduction to Kotlin. По ощущениям, это “введение с практикой”:

  • около 9 учебных проектов

  • порядка 60–70 тем

  • внутри тем — задачи/тренажёры с автоматической проверкой

В целом структура понравилась: материал подаётся дозировано, и почти сразу закрепляется практикой. Похожая на Степик.

Система “кристаллов” и лимиты.

Самая спорная часть бесплатного режима — ограничения на попытки.

У Hyperskill есть внутренняя валюта (“кристаллы”): ошибаешься в заданиях — кристаллы списываются. Когда кристаллы заканчиваются, обучение может блокироваться на 12–24 часа. Да, кристаллы можно зарабатывать активностью и выполнением некоторых задач, но при активном обучении и регулярных ошибках (что нормально) этого может не хватать.

Подписка проблему снимает, но именно этот момент сильнее всего влияет на комфорт обучения в бесплатном режиме.

Проекты: что внутри и зачем это полезно.

Сильная сторона Hyperskill — проекты. Они не выглядят как “игрушки ради галочки”, а позволяют постепенно потрогать основные конструкции языка.

Из того, что запомнилось:

  • “Сапёр”

  • “Крестики-нолики”

  • “Чат-бот”

  • “Кофемашина”

Например, в проекте “кофемашина” уже нормально используются циклы, классы и базовые элементы ООП. В таком формате проще понять, “зачем оно нужно”, чем на изолированных задачках.

Минус: часть проектов закрыта платной подпиской, и это немного обидно — именно проекты дают максимальную пользу и ощущение прогресса.

Проверка решений: не всегда понятно, почему “не принято”

Ещё один недостаток — качество обратной связи в тестах. Иногда тесты “падают” так, что ты видишь только факт ошибки, но не понимаешь причину: что именно ожидалось, на каком кейсе сломалось, где расхождение.Часть проектов проверяется через IntelliJ IDEA, и здесь иногда всплывают технические нюансы: несовпадение версий, необходимость обновить IDE или компилятор, странные падения на конкретном проекте.

Хороший момент: поддержка отвечает. По моему опыту, вопросы не игнорируют, и проблемы реально разбирают.

Итоги:

  • бесплатный режим может раздражать лимитами на ошибки (кристаллы и блокировки)

  • часть контента (включая проекты) закрыта подпиской

  • обратная связь тестов местами недостаточно информативная

    Если готовы, то вперед!

Теги:
0
Комментарии0

Периодически наталкиваюсь на разработчиков, которые думают, что они незаменимы, потому что знают в каком-то месте кода прям всё на свете. И поэтому их-то точно никогда не уволят - слишком опасно и долго обучать новичка.

Но это, конечно, не так. За свою 20-летнюю карьеру видел пяток увольнений самых-пресамых незаменимых. 

Во-первых, незаменимость часто преувеличивается (особенно с учетом ИИ, который и разберется, и нарисует, и расскажет всё, что важно знать). На практике обычно через 3-4 месяца уже никто и не вспоминает о Васе, который где-то там всё знал. А чаще скорее просто ругают его за странные решения, переписывая запутанные куски с нуля.

Во-вторых, даже если человек реально приносит огромную пользу и по-своему незаменим, то порой руководство просто поступает нелогично и увольняет всё равно. Иногда последствия бывают совсем неочевидны и отложены во времени (медленнее пилятся фичи, вылезают непонятные критические баги на проде), их никто никогда с Васей уже и не свяжет. Даже если объективное расследование бы показало, что денег в итоге потрачено больше. Короче, это или неправильная системная оценка или просто банальная глупость/лень менеджмента.

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

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

Cross-пост из tg-канала Cross Join

Теги:
+1
Комментарии0

Call for Pioneers: Launching the StarRocks Russian Community

Hello, Russian Developers!

We are the team behind StarRocks, a next-generation, high-performance analytical database (OLAP) widely adopted by leading tech companies globally for its blazing-fast query speeds and unified architecture.

We have always admired the Russian tech community. From ClickHouse to Nginx, Russia has a legendary reputation for engineering excellence and database innovation. We believe StarRocks has a lot to offer to this vibrant ecosystem, but we face a challenge: Language.

To bridge this gap, we are launching the StarRocks Russia Localization Program. We are looking for 3-5 technical experts to become the founding contributors of our Russian community.

The Mission

We don't just need translators; we need technical evangelists. Your goal is to help us localize high-quality technical content (Architecture deep dives, Benchmarks, User Cases) from English/Chinese into native, professional Russian, ensuring the local community can access the best resources.

Who We Are Looking For

- Native Russian Speaker: You have a high command of technical writing.

- Tech Savvy: You have mastered SQL, OLAP, and Data Warehousing, and your current job involves working with OLAP databases.(Experience with ClickHouse or PostgreSQL is a huge plus).

- Language Skills: You have a good understanding of English (or Chinese).

- Passion: You are active on Habr, Reddit or Telegram tech groups, or GitHub.

What You Will Get

- Competitive Bounties: We pay for every high-quality article translated or proofread.

- Official Recognition: We will be launching an official website in Russia, where you will be certified and listed as a Community Evangelist (subject to your consent for public disclosure).

- Inner Circle Access: Direct communication with our core R&D team and early access to new features.

- Exclusive Swag: Limited edition StarRocks geek gear.

Теги:
0
Комментарии4

Привет, с новым годом!)
Тоже корежит что в kubectl get pods нельзя добавить дополнительные поля? Конечно есть -o=custom-columns но оно же не добавляет поля а выводит вот те поля которые ты попросишь. При этом полезное поле READY через custom-columns не вывести. А -o wide слишком wide. Жри что дают. Это не наш метод. Давно собирался что-то с этим сделать но руки не доходили. И вот праздники, обнулился, сразу пришло решение как сделать. Добавил это в kui, теперь выбор стрючков выглядит так:

kubectl get pods с доп. полями NODE и IP
kubectl get pods с доп. полями NODE и IP

Вся необходимая информация сразу на одном экране и все влезает т.к. не wide, ура)

Творите, выдумывайте, пробуйте!)

Теги:
0
Комментарии0

О тактике киберпреступников и трендах 2026 года

Главный аналитик экспертно-аналитического центра InfoWatch Сергей Слепцов рассказал Cyber Media о ключевых тенденциях в киберпреступлениях, которые определили 2025 год и будут развиваться в 2026 году.

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

Кроме этого, злоумышленники все чаще проводят комбинированные атаки на гибридные инфраструктуры, как на on-premise-сегмент, так и на облачное размещение. Растет доля атак с целью вымогательства, в том числе широко распространяется услуга даркнета — вымогательство как сервис (Ransomware as a service)».

Теги:
+1
Комментарии0

When to Make a Type.

Мартин Фаулер размышляет о ярких преимуществах выделения новых типов и мастерски формулирует лаконичный ответ на этот вопрос.

Использование специализированных типов для бизнес-домена всегда предпочтительнее, нежели использование общих типов вроде строки или целого числа.

В деталях об этой идее, но немного с другого ракурса, пишет Эрик Эванс в книге "Предметно-ориентированное проектирование" (Domain-Driven Design).

Книга Эванса требует глубокого погружения в концепты DDD. Что такое доменный объект? Как он связан с реальными бизнес-сущностями? Что такое объект-значение? И т.д.

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

Рекомендую к ознакомлению!

Статья на сайте Мартина Фаулера: https://martinfowler.com/ieeeSoftware/whenType.pdf

Теги:
0
Комментарии0

В прошлом году было много разговоров о том, что найти работу в ИТ стало намного сложнее. Мол, количество вакансий уменьшается, а откликов - наоборот, только растёт. Как специалист, который старается чувствовать пульс индустрии (в том числе на рынке труда), я решил не полагаться исключительно на общественное мнение и проверить утверждения на цифрах (правда, исключительно аспект с вакансиями).

Используя API HH, я в течение последних 3,5 месяцев отслеживал изменения в количестве открытых вакансий на позиции "системный аналитик" и "бизнес-аналитик" (в соответствии с моей специализацией). Результаты, впрочем, подтвердили озвучиваемый в постах тренд, и поэтому вряд ли кого-либо должны удивить. Однако я всё же решил поделиться с сообществом накопленной статистикой (пусть и небольшой).

Для справки, привожу параметры запроса для выборки:

  • регион: Россия

  • период публикации: 30 дней

  • поле для поиска: в названии вакансии

Теги:
+1
Комментарии1

Обновлён открытый ИБ-проект на Go под названием cariddi для поиска уязвимостей и проблемных мест на любых сайтах, включая спрятанные API‑ключи и токены, забытые админки, файлы, которые не должны были быть в открытом доступе.

Теги:
+2
Комментарии0

В честь 50-летия уже ретро ПК MOS Technology KIM-1 (проект этого компьютеров появился в продаже в январе 1976 года — за три месяца до Apple I) энтузиаст представил демо KIM-1 Demo Project на Ассемблере и пригласил разработчиков внести свои идеи, добавить модули, демонстрации или улучшения и помочь этому проекту расти..

Теги:
+2
Комментарии1

Интерактивность в разработке.

Брэт Виктор отлично презентует своё видение мира. Попутно он затрагивает вопрос о необходимости моментального визуального отклика на изменения в исходном коде. Рассказывает о том, как интерактивность позволяет получить совсем иной опыт разработки. Более динамичный.

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

Поменял параметр, прогнал цепочку событий, посмотрел на результат. Конечно, это не по-настоящему моментальный отклик, но уже достаточно близко.

Впрочем, всегда есть, куда стремиться.

Презентация на Vimeo: https://vimeo.com/906418692

Теги:
0
Комментарии0

Поиск по вкладкам

В моём браузере постоянно открыто 20-30 вкладок, связанных с текущими проектами. И это не какие-то мусорные вкладки, которые я забыл закрыть, а рабочие документы: планы, отчёты, задачи. При таком количестве вкладок названия уже не влезают, и панель превращается в ряд безымянных квадратиков.

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

  1. Нажимаю какое-то сочетание клавиш.

  2. Начинаю вводить любое слово из заголовка вкладки.

  3. Жму Enter — переключаюсь на эту вкладку.

Выяснилось, что первые два пункта в том или ином виде реализованы во всех популярных браузерах. Правда, сочетания клавиш для активации поиска у всех разные:

  • Chrome, Edge: Shift + Ctrl + A (Shift + ⌘ + A)

  • Яндекс Браузер: Shift + Ctrl + E (Shift + ⌘ + E)

  • Safari: Shift + ⌘ + \

  • Firefox: Ctrl + L (⌘ + L), далее ввести знак процента и пробел

А вот с третьим (казалось бы, самым логичным) пунктом не так всё просто. Из перечисленных браузеров только Chrome переключается на найденную вкладку по нажатию Enter. В остальных браузерах приходится использовать мышку. Впрочем, проблема решается плагинами вроде Lightweight Tab Search и Tab Search.

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

Теги:
0
Комментарии8

Открытый проект iCloud Photos Downloader на Python позволяет в командной строке выполнять загрузку фотографий из iCloud. Работает в Linux, Windows и macOS; на ноутбуках, настольных компьютерах и сетевых накопителях. Решение доступно в виде исполняемого файла для прямой загрузки и через менеджеры пакетов /экосистемы (Docker, PyPI, AUR, npm).

Возможности решения:

  • три режима работы:

    • копирование - загрузка новых фотографий из iCloud (режим по умолчанию);

    • синхронизировать - загружать новые фотографии из iCloud и удалять локальные файлы, которые были удалены в iCloud (опция автоматического удаления);

    • переместить - загружать новые фотографии из iCloud и удалять фотографии в iCloud (опция сохранить в icloud за последние дни).

  • поддержка Live Photos (изображения и видео в виде отдельных файлов) и RAW-изображений (включая RAW + JPEG);

  • автоматическое удаление копий фотографий с одинаковыми названиями;

  • однократная загрузка и возможность постоянного отслеживания изменений в iCloud;

  • оптимизация для инкрементных запусков (параметры --until-found и --recent);

  • обновления метаданных фотографий (EXIF) (опция --set-exif-datetime).

Теги:
0
Комментарии0

Апскейлим видео без регистрации через сервис video2x. Проект использует модели Super-Resolution и не требуют больших мощностей. Можно запускать на слабом компе. Устанавливается за один клик. Никаких лишних сервисов и программ — только апскейлер. Работает только локально, никто не получит доступ к сведениям о видео.

Теги:
+2
Комментарии0

Ближайшие события

Энтузиаст запустил игру Doom на умной мультиварке Krups Cook4Me с сенсорным дисплеем, 128 МБ встроенной и оперативной памяти, Wi-Fi-модулем ESP32 и микропроцессором Renesas R7S721031VZ. Доступ к основному процессору мультиварки исследователь получил через интерфейс SWD. Подключив программатор к сервисным контактам, энтузиаст скопировал содержимое встроенной памяти и на его основе собрал модифицированную прошивку, позволившую запустить Doom. Из-за нестандартного расположения сенсорных элементов управления играть на скороварке в Doom оказалось не особо неудобно.

Теги:
-1
Комментарии0

Демо Smalltalk-76.

Иногда просто поражает масштаб того, что разрабатывали в Xerox PARC.

На этом видео Дэн Инголлс презентует Smalltalk-76, объединённую интерактивную среду исполнения и сам язык программирования. Два в одном! И это в 1976 году!

Smalltalk исторически повлияет на большое количество современных ЯП с ООП. Отдельно стоит отметить яркое влияние на ЯП, где в основе лежит модель акторов.

В то время ООП было не столь про термины "инкапсуляция", "полиморфизм" и "наследование". Скорее про то, что всё есть "объект", а объекты общаются между собой исключительно путём обмена сообщениями.

Это — основа современной акторной модели.

Да, Smalltalk сейчас — довольно нишевый и редкий язык, но в прошлом это был аналог и прямой конкурент молодого, только появившегося Java...

Презентация на YouTube: https://youtu.be/NqKyHEJe9_w

Теги:
+1
Комментарии8

Решил сегодня почитать, что пишут в Ангуляр комьюнити Хабра, и увидел сильно популярный пост с аж 51 лайком и 71 закладкой.

Начал читать и был удивлен примерами. Автор с уверенностью говорит, как писать на Ангуляр грамотно, и при этом приводит плохие практики в качестве примеров. Я дошел до примера с RxJS, который меня немного триггернул.

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

Автор условно говорит, что у нас есть плохой пример использования:

this.http.get('/api/data').subscribe((data) =>; {
  this.data = data; // Что если запрос не вернётся?
});

и затем приводит хороший пример с сигналами и RxJs:

readonly data = signal([]);
readonly error = signal(null);

loadData() {
  this.http.get('/api/data').pipe(
    tap(() =>; this.error.set(null)), // Сбрасываем предыдущую ошибку перед загрузкой
    catchError((err) =>; {
      this.error.set('Не удалось загрузить данные');
      return of([]); // Возвращаем пустой массив, чтобы поток не прерывался
    })
  ).subscribe((result) =>; {
    this.data.set(result);
  });
}

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

interface State<T = object> {
  data: T[];
  error: string | null;
}

@Component({...})
export class BestRxJs {
  private http = inject(HttpClient);
  private loadDataAction$ = new Subject<void>();

  private state$ = this.loadDataAction$.pipe(
    switchMap(() => 
      this.http.get<State[]>('/api/data').pipe(
        map((result) => ({ data: result, error: null })),
        catchError(() => of({ data: [], error: 'Не удалось загрузить данные' })),
        startWith({ data: [], error: null })
      )
    ),
    shareReplay({ bufferSize: 1, refCount: true })
  );

  readonly private state = toSignal(this.state$, {
    initialValue: { data: [], error: null } 
  });

  readonly protected data = computed(() => this.state().data);
  readonly protected error = computed(() => this.state().error);

  protected loadData(): void {
    this.loadDataAction$.next();
  }
}

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

Теги:
+2
Комментарии6

HR, простите, но у меня не было выбора - Как я потратил несколько сотен часов на ИИ-ассистента для поиска работы

Привет, Хабр.

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

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

В какой-то момент я понял, что трачу больше времени на клики и формальные действия, чем на развитие как инженера. Это и стало отправной точкой.

Что не так с процессом поиска

Проблема не в самом поиске, а в том, как он реализован.

1. Массовая рассылка вместо выбора.
Осознанный подбор вакансий быстро превращается в пролистывание списков и надежду на статистику.

2. Отклики как механика.
Сопроводительные письма отличаются формально: поменять название компании, чуть переписать вводную — и так десятки раз.

3. Неэффективные затраты времени.
Квалифицированный специалист тратит часы на задачи с минимальной ценностью, причём этот цикл повторяется при каждом новом поиске.

Инженерный взгляд

Если абстрагироваться, поиск работы — это:

  • входные данные (резюме, требования вакансии),

  • правила сопоставления,

  • повторяемые действия,

  • измеримые результаты.

С инженерной точки зрения — кандидат на автоматизацию.
Так появилась идея проекта OfferMate, который берёт на себя рутинную часть процесса.

Коротко о разработке

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

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

За 4+ месяца разработки мы:

  • несколько раз пересобрали архитектуру,

  • получили жёсткий фидбек,

  • убедились, что это не история про «просто прикрутить LLM».

Технические детали осознанно опускаю — при интересе разберу отдельно.

Что получилось в итоге

Сейчас OfferMate — это ассистент, который:

  • ищет релевантные вакансии на hh.ru и в Telegram,

  • автоматизирует отклики,

  • формирует сопроводительные письма под конкретные вакансии,

  • работает в фоне, минимально вовлекая пользователя.

Им пользуются кандидаты разного уровня — от начинающих до опытных специалистов.

Про сопроводительные письма

Корректнее говорить не «ИИ пишет письма», а что система:

  • анализирует резюме,

  • разбирает требования вакансии,

  • ищет пересечения,

  • и на их основе формирует текст.

Это не делает письмо идеальным, но делает его релевантным, что на практике влияет на отклик.

Куда дальше

Сейчас мы работаем над следующей версией проекта.

Рынок нестабилен: ограничения и API меняются, поэтому тестируем архитектуру без жёсткой зависимости от официальных интерфейсов и с упором на устойчивость.

Вместо вывода

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

Если интересно последить за проектом, все новости публикуем в этом Tg-канале:

👉 https://t.me/offermatecrew

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

Теги:
-3
Комментарии11

Эти три открытый проекта по ИБ позволяют анализировать и изучать беспроводные сети Wi‑Fi:

  • Wi‑Fi‑autopwner — моделирование взлома сетей Wi‑Fi с простой защитой. Работает в консоли.

  • Wi‑Fi Exploitation Framework — сервис, который поможет проверить и пробить безопасность беспроводной сети, а также протестировать на ней различные виды тестовых атак: от простых до комплексных.

  • Freeway — Python‑сервис, который показывает механизм работы беспроводных сетей и их уязвимостей, помогает выявить способы перегрузки сети и смоделировать атаки с нарушением аутентификации.

Теги:
-2
Комментарии0

Шаблонный сервис

Я всячески люблю, когда разработка идёт предсказуемо – и многое для этого делаю.  

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

Так зачем же нужен шаблонный сервис?

Легко ориентироваться в других сервисах. Иногда нужно залезть в сервис коллег, или поддерживаешь несколько сервисов. Никаких проблем – структура везде одинаковая, всё знакомо, не нужно тратить время на раскопки.

Быстрый старт. Стартуете новый сервис? Полчаса – и он готов. Никаких лишних приседаний.

Единые практики. Шаблон определяет, не только структуру, но и то, как мы, например, делаем ретраи, какие у нас зависимости. как устроен circuit breaker, обработка ошибок и т.д.    

Лучшие практики – в одном месте. Если появляется что-то классное, мы добавляем это в шаблон и новые сервисы сразу это наследуют.     

Обсервабилити, логирование, работа с секретами – готово из коробки. И меньше шансов, что кто-то забьёт на логирование до лучших времён»:)    

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

Просто экспериментировать. Создал веточку от шаблона – и прикручиваешь свою новую махарайку, не тратя время на базовую структуру.

Унификация линтинга. Конфиги линтеров лежат в шаблоне. Ничего настраивать не нужно, а код-ревью идёт быстрее – обо всём уже однажды договорились и зафиксировали.

Базовый CI/CD. Для шаблонного сервиса существует шаблонный ci/cd – и это очень удобно.

Мы активно использовали шаблонный сервис в микросервисной архитектуре, но и для монолитных решений он тоже отлично зашёл – стартовали с ним несколько проектов.

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

В общем – заходите, смотрите, ставьте звездочки. И если с чем-то не согласны – пишите в комменты, автор обязательно ответит 🙂

Теги:
+1
Комментарии0

Работаем из Java с устройствами с serial-интерфейсом (COM и USB) без JNI — по TCP.

Раньше пользовались rxtx, затем jssc. После очередных крэшей JVM в коде нативных библиотек решил не выбирать замену, а отказаться от них полностью.

В качестве прокси serial-TCP можно взять ser2net или поэкспериментировать с socat, но я запилил свое простое (Rust, mio), под конкретную задачу:

  1. Запускается из основного приложения, свой процесс для каждого устройства

  2. Конфигурация через аргументы запуска и переменные окружения

  3. Завершает работу при отсутствии или отключении устройства (для USB), отключении или отсутствия подключения TCP-клиента

В качестве TCP-клиента Netty. Для интеграции с легаси данные читаются в кольцевой буфер ( OneToOneRingBuffer из agrona), а оттуда уже используются по месту в удобное время.

За счет неблокирующего чтения и использования epoll в mio и Netty минимальные задержки, моментальное оповещение о наличии данных (без Thread.sleep) и об отключении USB-устройства.

Задержки настолько меньше, что пришлось адаптировать кривой код, который не был готов к тому, что драйвер железного serial-порта в Linux отдает данные порциями по 8 байт. Решилось реализацией ByteToMessageDecoder, где возможно, а где нет — буферизацией на стороне прокси и отправкой по таймеру.

Для надежной работы уменьшаем и выравниваем буферы записи, пишем через writeAndFlush с ожиданием завершения, чтобы устройство успевало читать.

Бонус: можно работать с устройством, подключенным к другому системному блоку (например, для разработки) и использовать TCP-эмуляторы вместо реальных устройств без изменения кода интеграции.

Теги:
+2
Комментарии0
1
23 ...