Обновить

Разработка

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

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

Достойный внимания proof-of-concept с GitHub: превращаем обычный ноутбук в устройство с сенсорным экраном без какой-либо электроники.

Что понадобится: маленькое зеркало, картон, клей. Бюджет — около 100 рублей

Как это работает:

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

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

  3. Алгоритм анализирует расстояние между пальцем и отражением: если они соприкоснулись — регистрируется клик, есть зазор — курсор следует за пальцем без нажатия

Ограничения очевидны: зависимость от освещения, калибровка, точность. Но как демонстрация принципа — отлично

Репозиторий проекта: github.com/bijection/sistine

Ещё больше интересного и полезного из мира IT — в моём Telegram-канале

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

Проект Pentaract позволяет сделать Telegram бесконечное хранилище файлов и превратить мессенджер в личное облако. Основа — PostgreSQL. Технология максимально экономит место, не создаёт лишний мусор, таблицы или списки. Работает без ограничений и без нарушений политики и целостности Telegram.

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

Представлена мойка для обуви с искусственным интеллектом. Модель Brolan ClearX использует «датчики» (хотя производитель не пояснил, какие именно) и ИИ для определения материала, из которого сделана ваша обувь, и выбора соответствующего цикла очистки и сушки, а также «технологию микро- и нанопузырьков» для дополнительной очистки. В ClearX планируют начать продажи мойки в середине 2026 года по цене от $500 до $800.

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

💀 Когда диаграмма - источник истины, архитектура умирает первой.

📝 Аналитики, использующие PlantUML, Miro, Draw.io, Visio, Structurizer и прочее, забывают что знания в диаграммах - всё равно что код в скриншотах.

Знания должны храниться в виде взаимосвязанных элементов Модели, а диаграммы должны быть лишь их Проекциями. Разработчики ArchiVision.org это прекрасно понимают. Именно это делает систему ArchiVision значительно более эффективным инструментом для хранения знаний об ИТ системах чем все вышеназванные сервисы. При этом, генерируемые ею диаграммы живые, интерактивные и редактируемые. Система также поддерживает горячие клавиши для эффективной работы с моделью и диаграммами. Горячие клавиши позволяют рисовать быстрее, чем большинство перечисленных сервисов, тем более чем писать в PlantUML, Structurizer и аналогичных.

⚡ Ключевое отличия:
- 👎 в названных выше инструментах вы редактируете диаграммы;
- 👍 в ArchiVision вы работаете с моделью, а диаграммы - это её визуальная проекция, через которую тоже можно развивать модель.

🔄 За счет этого:
- 🧠 модель становится единственным источником истины;
- 🧱 диаграммы перестают быть хрупким артефактом;
- 🧩 структура модели позволяет устранять разночтения, дублирование и рассинхронизацию;
- ✅ система способна контролировать ввод и проверять полноту данных;
- 🧼 архитектура перестаёт расползаться по версиям и интерпретациям;
- ⌨️ навигация и горячие клавиши — это часть работы с моделью, а не удобство интерфейса.

🎥 Это видео - пример того, как сочетание модели, интерактивных диаграмм и горячих клавиш меняет процесс проектирования.

Ну а вот сам канал с видеоинструкциями находится здесь.

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

Как я пошел на курсы ALT Linux и что из этого вышло.

Привет! Решил поделиться личным опытом — от импульсивного желания «прокачаться» с сертификатом до суровой реальности вендорных экзаменов. Если вы тоже раздумываете о сертификации по отечественным дистрибутивам, мой путь, надеюсь, поможет избежать подводных камней.

Часть 1: Выбор пути. ALT против Astra и шок от цен.

Всё началось с желания проверить и структурировать знания по отечественным Linux-системам, с которыми приходится работать. Изначально смотрел в сторону Astra Linux, но глазам сразу бросилась разница в цене. ALT Linux предлагал обучение на более доступных условиях, а поскольку в работе я касаюсь обеих ОС, выбор стал очевидным. Начал изучать предложения на официальном сайте. И вот тут — первый удар. Стоимость курсов в некоторых учебных центрах заставила меня серьезно задуматься: «А нужна ли мне эта подготовка, если вроде бы и так всё знаю?» Но любопытство победило. Я решил тестировать, попробовать .

Часть 2: Организация. Поиск курсов и «неспешные» менеджеры.

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

Совет №1: настройтесь на ожидание. Ответ пришел далеко не сразу, прошло несколько дней. Видимо, такова специфика. Но как только контакт состоялся, всё пошло быстро: договор, оплата, зачисление — и вот я уже студент.

Часть 3: Учёба.

Проверенный университетский формат. Мне прислали ссылку и дату старта. Формат напомнил университет: · Лекции — в записи. Смотрел в свободное время, очень удобно. Практика — раз в неделю, онлайн с преподавателем. На ней разбирали лабораторные и отвечали на вопросы. Первая ступень — это два курса: «Альтадмин 1» и «Альтадмин 2». Каждый длится около 4 недель и включает лекции, 4 лабы и итоговый тест. Всё прозрачно и понятно. Обратная связь и преподаватель: Здесь мне повезло. Преподаватель отвечал на вопросы на учебной платформе молниеносно. Чувство юмора у него было своеобразное, но это мелочь. Главное — экспертиза и готовность помочь были на высоте.

Часть 4: Впечатления и нюансы. Кому стоит идти?

В целом курсы «зашли», и я их рекомендую, но с важными оговорками.

Плюсы:

1. Структурированный, практический материал.

2. Быстрая обратная связь.

3. Гибкий формат (запись + живая практика).

Нюансы (о которых стоит знать):

1. Для полного новичка может быть мало теории. Если никогда не работали с Linux, придется активно гуглить. Но все ключевые задачи на практиках разбираются.

2. В лабах встречаются «подводные камни». Иногда в условиях всплывают неочевидные ошибки или недоговоренности. Но иногда о них предупреждают. Если у вас есть даже небольшой опыт, вы с ними справитесь. Для меня это даже стало плюсом — пришлось глубже копать.Иногда версии virtual box показывали сюрпризы,то версии дистрибутивов Linux. Воооообщем разбирался.

Часть 5: Разочарование в сертификации.

После успешного окончания курсов и получения сертификатов учебного центра я собрался финализировать путь — сдать официальный экзамен от вендора. И здесь меня ждало главное открытие и разочарование: оказалось, что сдать экзамен на сертификат могут только представители юридических лиц. Для частных лиц эта дверь закрыта. Этот разочаравало.

Итоги и выводы

1. Качество обучения — на хорошем уровне. Если нужны структура и практика, курсы отличные.

2. Целевая аудитория — не абсолютные новички, а те, кто хочет систематизировать опыт и разобрать задачи с экспертом.

3. Главный минус — невозможность для физлица получить полноценный вендорный сертификат после обучения. Уточняйте этот момент ДО оплаты курсов. Мой опыт получился познавательным, но с послевкусием. Надеюсь, мой рассказ поможет вам сделать выбор.

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

Представлен открытый сервис SmartImage, который проверяет ресурсы в сети и ищет первоисточник картинки на базе нескольких алгоритмов поиска: SauceNao, IQDB, Ascii2D, trаce.mоe и других. Можно искать через перетаскивание и загрузку изображений, в текстовом поле, через буфер обмена, а также через командную строку.

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

Представлен открытый бесплатный сервис Maltrail для анализа входящего и исходящего трафика и вредоносов в нём. Проект умеет:

  • обнаруживать опасные домены, URL и IP;

  • распознавать вредительские HTTP User‑Agent‑строки;

  • выявлять актуальные инструменты атак на ПК;

  • высокий уровень сетевой безопасности без сложного развёртывания — сервис ставится за один клик;

  • может помочь найти вирусы, майнеры и прочий мусор, который обращается в сети.

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

polluSensWeb теперь поддерживает 26 датчиков и веб-хуки

polluSensWeb
polluSensWeb

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

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

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

  • Пересылать измерения в базы данных.

  • Запускать оповещения или автоматизацию.

  • Отсылать данные в панели мониторинга, такие как Grafana.

  • Интегрироваться с платформами сообществ или пользовательскими API.

Открытый деплоймент
Проект на GitHub

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

Клиент YouTube для Android под названием Download YT PRO весит всего 60 кБ (48 кБ в архиве). Приложение не требует Root-прав, убирает рекламу, даже спонсорскую. Видео не ставится на паузу, если свернуть приложение или заблокировать экран. Есть встроенный загрузчик видео и шортсов. Добавлен ИИ Gemini, который сразу сделает саммари даже часовых лекций и выдаст факты и советы по контенту.

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

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

Podman, OCI и HEALTHCHECK.

Восстанавливал работоспособность одной репы и столкнулся с забавной особенностью.

Compose файлы, которые там есть — предельно простые. Есть цепочка сервисов, которые запускаются друг за другом. Первым стартует БД, никаких проблем. Вторым — сервис с API для загрузки данных в БД. Опять никаких проблем. Третьим — контейнер с wrk для нагрузочного тестирования. И вот тут загвоздка. Контейнер зависал в бесконечном состоянии "Created".

Подебажил. Оказалось, что при сборке образа API никак не фиксировался HEALTHCHECK! Podman по-умолчанию использует именно OCI спеку контейнеров, а не Docker, и там нет поддержки HEALTHCHECK. Из-за этого не срабатывал condition: service_healthy в Compose-файле, подвешивая контейнер с wrk.

Чтобы решить эту проблему, нужно явно указать формат спеки как Docker при сборке Dockerfile/Containerfile. У Podman это выглядит так:

podman build --format docker .

А вот так для Podman Compose:

podman-compose --podman-build-args='--format docker' build

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

export BUILDAH_FORMAT=docker

Вот такие пироги :)

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

Почему стоит использовать protected в Angular компонентах?

Если вы используете в своих компонентах только public и private, вы упускаете возможность сделать архитектуру чище. Я предлагаю четко разделять ответственность членов класса.

Часто мы по инерции делаем public любые методы и свойства, которые нужны в шаблоне (HTML). Но public в TypeScript означает, что это публичный API компонента - к этим методам может получить доступ любой родительский компонент через @ViewChild.

Почему стоит использовать protected:

1. Явное намерение: protected сигнализирует, что метод предназначен для использования внутри класса или в его шаблоне, но не должен вызываться извне.

2. Защита от регрессии: Если другой разработчик попытается вызвать такой метод через @ViewChild, TypeScript выдаст ошибку. Это заставит его задуматься: «Действительно ли мне нужно делать этот метод публичным?» или «Может, стоит создать отдельный метод для API?».

3. Читаемость: Открывая код, вы сразу видите: public - для внешнего мира, protected - для шаблона, private - для внутренней логики сервисов и подписок.

Разделяйте Public API и внутреннюю логику шаблона - ваш код станет надежнее и понятнее.

@Component({
  selector: 'app-user-profile',
  template: `
    <!-- В шаблоне мы без проблем обращаемся к protected свойствам -->
    <div class="card">
      <h3>{{ userName() }}</h3>
      <button (click)="onUpdateClick()">Обновить</button>
        @if(isLoading()) {
          <div>Загрузка...</div>
        }
    </div>
  `
})
export class UserProfileComponent {
  // PRIVATE: Внутренняя логика. 
  // Не доступно ни в шаблоне, ни родительскому компоненту.
  private _userId = 123;

  // PROTECTED: Доступно только внутри класса и в ШАБЛОНЕ.
  // Идеально для переменных состояния UI и обработчиков событий.
  protected userName = signal('Алексей');
  protected isLoading = signal(false);

  protected onUpdateClick(): void {
    this.logAction();
    console.log('Кнопку нажали в шаблоне');
  }

  // PUBLIC: Публичный API компонента.
  // Только эти методы мы разрешаем вызывать родительскому компоненту.
  public resetState(): void {
    this.userName.set('Гость');
    this.isLoading.set(false);
  }

  private logAction(): void {
    console.log(`Action logged for userId: ${this._userId}`);
  }
}
Теги:
+2
Комментарии1

ChatGPT запускает Health сервис. 2 года, 260+ врачей. На базе того, что 230+М человек в неделю задают вопросы связанные со здоровьем. 

В начале прошлого года уже публиковали исследование сравнения GPT-4+ prompt engineering (без fine-tuning) и лицензированных терапевтов на 18 терапевтических виньетках (коротких кейсах) - Hatch et al. PLOS Mental Health. Оценивали не клинический эффект, а поддерживающие ответы. Ответы терапевтов писали 13 специалистов и 9 из них с PhD/PsyD. Далее 830 участников (широкая выборка, не только клиницисты) оценивали тексты вслепую.

В тесте Тьюринга на Угадай Кто Ответил различимость почти на уровне случайного выбора: 56,1% терапевта vs 51,2% ChatGPT

В post-hoc анализах модель чаще выглядела более “connecting”, более эмпатичной. И в целом по шкале общих факторов терапии (эмпатия, поддержка и т.д..) средняя оценка модели была немного выше (27,72 vs 26,12). Понятно, что тест на виньетках и это оставляет большие риски при обобщении модели и переводе в практику

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

Также любопытно будет влияние на статистику в ранней диагностике, запущенных случаях и ложных обращениях. AI-Health не новость, но ChatGPT имеет тот охват и соотвенно потенциальное влияние, которые могут влиять на крупные цифры

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

Получаем доступ к нейросетям Google бесплатно на один месяц, включая Gemini 3, Nano Banana и Veo 3.1:

  • Заходим на сайт Google по этой ссылке.

  • Выбираем опцию «Choose your edition».

  • Выбираем «Start 30-day trial».

  • Заходим на сайт через свой Gmail.

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

Учим Python — представлен интерактивный учебник, который работает прямо в браузере. Он поможет освоить базу буквально за пару месяцев:

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

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

  • Есть текстовые материалы, вшитые YouTube-уроки, задачи, дополнительные лекции и контрольные вопросы.

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

Энтузиаст добавил ИИ в умную камеру безопасности с помощью Raspberry Pi и протестировал её работу, переодевшись в вора.

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

Нативный драйвер OLED-дисплеев для RP2040

Только что в один из своих проектов на микроконтроллере RP2040 понадобилось интегрировать графический дисплей для отображения погодной информации. Выбор пал на распространенные монохромные OLED-дисплеи разрешением 128х64 точки.

Из плюсов этих дисплеев для меня: высокая яркость и контрастность, простота интерфейса, дешевизна и высокая плотность информации в небольшом размере.

Контроллер у всех этих дисплеев стандартный - SH1106.

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

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

Библиотека позволяет задать разрешение экрана а разворачивать экран на 90/180/270 градусов.

Изначально библиотека включала в 2 шрифта с размерами знакомест 5х7 и 7х10 точек.

Для своих целей я самостоятельно разработал большой шрифт 12х16 точек (на фото он).

Репозиторий проекта: https://gitflic.ru/project/svperchenko/sh1106_for_rp2040. Всем, кому надо, можно пользоваться.

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