Обновить

Бэкенд

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

В наше время операционные системы повсюду — пора выбрать свою и стать в ней крутым спецом!

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

IOS. Создаем приложения в экосистеме Apple.

Android. Осваиваем разработку самой массовой мобильной платформы.

Windows. Привычный выбор для работы, игр и офисных задач.

Linux. Надежная система для программирования, администрирования и экспериментов с технологиями.

→ Еще больше разнообразных курсов тут

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Подборка бесплатных обучающих материалов о PostgreSQL

Привет, Хабр! Новая пятница — новая порция обучающих статей. Сегодня собрал публикации, которые помогут тем, кто хочет лучше разобраться в PostgreSQL. По классике: все бесплатно. Чтобы прочитать подборки, даже регистрироваться нигде не нужно. Бонусом в конце поста будет ссылка на курс. Он тоже не стоит ни копейки, но там все же нужно зарегистрироваться. Итак, поехали.

PostgreSQL для новичков

В подборке 14 статей на два с половиной часа чтения. Здесь база: установка и настройка PostgreSQL, нюансы управления, резервного копирования и репликации. Для ленивых — что делать, если администрировать самим БД не хочется.

Средний уровень

В девяти статьях за полтора с небольшим часа рассматриваем настройку PostgreSQL в Docker и для работы с 1С. Вы разберетесь в командах, триггерах, индексах и организации мониторинга.

PostgreSQL на максималках: практикум по расширениям

Пять статей и чуть больше часа на их изучение. Эта подборка — ваш гид по расширениям PostgreSQL: от безопасности и оптимизации до работы с геоданными. Вы познакомитесь со всеми этими pgcrypto, jsquery и т. д., а заодно научитесь применять их без лишней теории.

Бонус. Бесплатный онлайн-курс для новичков «Погружение в PostgreSQL»

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

Теги:
Всего голосов 7: ↑7 и ↓0+11
Комментарии0

Пока вы спали (или допиливали фичу), в «Стартап-кранче» случился новый дроп!

Вчера, 30 сентября, в колоду добавились незаменимые спецы: Максим Схемкин, который нарисует архитектуру на любой салфетке, и Сергей Багов, который найдёт в ней все уязвимости. А ещё подъехали бустеры — Кубик Рубика для разминки мозга и, конечно, Кофемашина. Срочно нанимайте, без неё вообще ничего не работает.

Но главная новость — в игру вошли титаны! Теперь вашу команду могут усилить легендарные Дональд Кнутов, автор священных текстов по искусству программирования, и Ричард Столлманович, который проследит, чтобы ваш код был по-настоящему свободным.

Хватайте новых спецов и готовьтесь, это был предпоследний дроп. Финальное и самое таинственное пополнение колоды — уже 7 октября.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии2

RAG: технология, которая меняет работу с данными. Открытый вебинар для DevOps-инженеров

Приглашаем на открытый вебинар «Что такое RAG и с чем его едят», который пройдет 8 октября в 19:00 мск

Мы готовим этот вебинар совместно с GenAI LAB — одной из ведущих команд в русскоязычном AI-сообществе с портфолио из 100+ реализованных проектов и 50+ собственных моделей

Вместе с экспертом GenAI LAB разберем одну из самых актуальных технологий 2025 года — Retrieval-Augmented Generation — на практических кейсах, понятных DevOps-инженерам

Программа вебинара:

✔️ Базовые понятия — что такое RAG, эмбеддинги и векторные базы данных

✔️ Практический разбор — сборка работающего RAG на примере телеграм-канала: выгрузка данных, векторизация и интеграция с ботом

✔️ Автоматизация через n8n — построение пайплайна без написания кода

✔️ Проблемы и решения — что может пойти не так в продакшене и как это избежать

✔️ Развитие технологии — графовый RAG и подходы без использования векторов

Спикер: Андрей Богомолов — co-founder и CTO GenAI LAB, CTO Nlogic, эксперт Сколково с более чем 10-летним опытом в AI-разработке

Почему это важно для DevOps-инженеров:

• RAG позволяет создавать интеллектуальные системы для работы с документацией, логами и базой знаний

• Технология уже используется в современных DevOps-стэках

• Полученные знания можно сразу применять в реальных проектах

➡️ Занять место на вебинаре — через бота

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

Всегда ли наследование должно идти от родителя к потомкам?

Возможно, этот вопрос уже давно обсосан кучей способов, но я дошел до него только сейчас: всегда ли наследование должно идти от родителя к потомкам?

Стандартно во всяких учебниках для начинающих рассказывают, что наследование является аналогом связи «Является». Например, яблоко является фруктом, поэтому в коде класс Яблока должен наследоваться от класса Фрукт.

Что еще нужно учитывать, чтобы усомниться в утвердительном ответе на вопрос в заголовке?

  1. Наследник может изменять методы родителя

  2. Наследник может хранить больше полей, чем родитель

  3. Наследник не может удалять поля родителя

Что получается тогда? Возьмем пример с геометрическими фигурами. Есть у нас прямоугольник, площадь которого вычисляется по формуле S=ab. Получается, что в прямоугольнике нам нужно два поля — стороны a и b. Но есть квадрат, который является прямоугольником, поэтому и класс Квадрат должен наследоваться от класса Прямоугольник. Проблемы, с учетом правил выше, возникают уже на этом этапе: если формула площади квадрата S=a^2, то зачем нам хранить дополнительно сторону b, которая равна стороне a? Получается, что мы впустую тратим память.

Если пойти еще выше по родителям, то прямоугольник является параллелограммом. Площадь параллелограмма вычисляется по формуле S=ab*sinQ, где Q - угол между сторонами. Получается, что в прямоугольнике и, следовательно, в квадрате нам тоже нужно хранить этот угол, а использовать его мы никак не будем. Снова тратим память впустую.

Другим видом параллелограмма является ромб (S=a^2*sinQ), в котором мы снова бесполезно храним размерность второй стороны.

И если так подумать, то параллелограмм является выпуклым прямоугольником, который вписывается в окружность. В общем случае S = sqrt[(p-a)(p-b)(p-c)(p-d)], где p = (a + b + c + d) / 2. Получается, что в параллелограмме нужно хранить не только две стороны и угол, которые затем тянутся выше, но и еще две стороны, которые также тянутся выше. Вот и получается, что в квадрате у нас хранятся отдельно все четыре стороны и угол между двумя из них.

Рассматривая наследование как метод расширения функционала, здесь гораздо «правильнее» в качестве родителя выбрать квадрат. Он хранит всего лишь одну сторону.

Далее от него потомки идут в две стороны.

Сторона первая: квадрат ->  ромб (добавляем угол) -> параллелограмм (добавляем вторую сторону)
Сторона вторая: квадрат -> прямоугольник (добавляем вторую сторону) -> выпуклый четырехугольник (добавляем еще две стороны)

Как будто, это выглядит более логично? Или я где-то ошибся? Очень жду профессионального мнения в комментариях

Теги:
Всего голосов 5: ↑4 и ↓1+5
Комментарии4

Всех приветствую! Видел ТГ бота который присылает аварии(инциденты, ДТП) сразу как то их создали на яндекс картах в определенных городах! Попытался сделать такого же, опыт в разработке ботов имеется, но увы я ни как не могу достать из яндекса инфо о ДТП, перерыл все их АПИ, отрисовать на карте слой с ДТП могу, а вот получить данные для обработки ни как вообще! Может кто знает какой то секрет? Буду благодарен любой помощи!

Теги:
Всего голосов 6: ↑2 и ↓4-1
Комментарии5

Подборка обучающих материалов по Docker и Kubernetes

Привет, Хабр! Сегодня пятница, поэтому я снова со своей нерегулярной подборкой полезных материалов для начинающих специалистов. На этот раз несу статьи о Docker и Kubernetes. Как обычно: все бесплатно, без регистрации и смс. Читайте и практикуйте.

Первые шаги в Kubernetes

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

Docker с нуля: как работают контейнеры и зачем они нужны

Эта подборка из шести статей — ваш гид в мир контейнеризации. Вы узнаете, что такое Docker, как запускать контейнеры, собирать образы и использовать Docker Compose, а еще разберетесь, чем эта технология отличается от Kubernetes. Все материалы подкреплены практическими примерами и будут понятны начинающим. На полное изучение уйдет менее двух часов.

Основы безопасности в Docker-контейнерах

Если вы прочитали предыдущую подборку и почувствовали в себе силы начать работу с контейнерами, не спешите. Изоляция, которую они обеспечивают, может вызывать ложное чувство безопасности. Чтобы вы могли погрузиться в вопросы защиты своего Docker, есть еще одна мини-подборка из трех исчерпывающих материалов. Изучение — чуть больше часа, а эффект — бесценен.

Теги:
Всего голосов 6: ↑6 и ↓0+7
Комментарии1

Вышел NATS.go 1.46 - Go-клиент для системы обмена сообщениями NATS.

Ключевые изменения:

  • Появились параметры конфигурации счетчиков стримов

  • Новые поля в ClusterInfo

  • Контекст и таймаут опции для Messages.Next() а также появился в Fetch поддержка контекста

  • Поддержка пользовательских префиксов имен для консумеров

  • Добавлена ​​поддержка метаданных для KeyValue бакета.

  • Ошибка добавления максимального лимита потребителей (код=10026).

  • Возвращает более конкретную информацию об ошибке при проблемах пересоздания потребителя

GitHub: https://github.com/nats-io/nats.go

ChangeLog: https://github.com/nats-io/nats.go/releases/tag/v1.46.0

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

RCS (Rich Communication Services) — это эволюция SMS/MMS, протокол, который мобильные операторы и Google продвигают как «мессенджер по умолчанию». Если SMS = plain text, то RCS = полноценные интерактивные сообщения с кнопками, каруселями, картинками, видео, QR-кодами и встроенной аналитикой.

Ключевые моменты

  • Протокол: работает поверх IP, а не через старую SMS-сеть, но доставляется в «стоковое» приложение сообщений (Google Messages, Samsung Messages).

  • API: доступ через Google Jibe Hub (фактически, центр маршрутизации), плюс нужно согласование с операторами. Прямо в код «в лоб» не залезешь — всё через провайдеров/агрегаторов.

  • Безопасность и доверие: каждая компания-отправитель проходит верификацию бренда, чтобы на экране у пользователя сообщения выглядели не как «спам», а с логотипом и цветами бренда.

  • UX: разработчик не отправляет просто текст, а собирает карточку или интерактив через шаблон/SDK → пользователю приходит сообщение, похожее на push или мини-приложение внутри SMS.

То есть RCS = «SMS на стероидах», но с кучей бизнес- и бюрократических ограничений. Главная боль — доступ к API и вся регуляторка, поэтому на рынок вышли «коробочные» сервисы (как Smobi), которые берут эти сложности на себя

Кодик и ссылки у меня в канале

——————
Менеджер? Давай сюда!
Ищи работу здесь
Технологии и архитектура

Теги:
Всего голосов 2: ↑0 и ↓2-2
Комментарии0

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

Хорошие новости: для IT-специалистов это не мечта, а обычная практика. А у нас тут как раз есть крутая подборка профессий: выбирайте, чему хотите научиться, и вперёд — к удалёнке.

Программист на Python. Один из самых популярных языков для новичков.

Программист на Java. Фундаментальное направление для создания надёжных корпоративных систем и приложений.

Тестировщик программного обеспечения. Чтобы всё работало корректно и без багов.

→  Ещё больше полезных курсов

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

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

Разговорный английский. Свободное общение в повседневных ситуациях.

Деловой английский. Переписка и переговоры для работы.

Английский для IT. Лексика и термины в сфере технологий.

Финансовый английский. Язык отчетов и международных сделок.

Английский для путешествий. База для поездок и общения за границей.

Ещё больше курсов по английскому найдете тут

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Короче, учиться — это классно, главное — курс выбрать толковый. Особенно когда речь идёт о сфере, которая в топе востребованных профессий — DevOps. А чтобы было проще стартануть, держите список самых нужных инструментов для изучения.

Docker. Упаковываем приложения в контейнеры и запускаем их где угодно.

Kubernetes. Управляем кластерами контейнеров и автоматизируем их работу.

CI/CD. Обеспечиваем быстрые и стабильные релизы с помощью автоматизированных пайплайнов.

А если хочется изучить что-то ещё, то заглядывайте на нашу витрину с крутыми курсами

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

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

Новый поток DevOps Upgrade стартует в понедельник. Рассказываем про ключевое обновление курса

Рынок DevOps продолжает активно расти, а требования к специалистам — повышаться. Чтобы оставаться востребованным, важно постоянно актуализировать свои знания. Почему сейчас — лучшее время для этого?

В понедельник стартует новый поток DevOps Upgrade, и вот, какое обновление мы внедрили на курсе:

У каждого, кто присоединится к тарифу «Комфорт» до 29 сентября, будет свой личный консультант. Это персональный наставник, который фокусируется на образовательной стратегии студента. Его ключевые задачи:

✅ Индивидуальный подход
Помощь в постановке персональных учебных целей и контроль их достижения.

✅ Мониторинг прогресса
Тьютор следит за соблюдением дедлайнов и помогает сохранить мотивацию на протяжении всего курса.

✅ Разработка карьерной стратегии
Совместно со студентом он выстраивает план развития в DevOps с учетом личных амбиций и целей.

✅ Всесторонняя поддержка
Проведение 2-4 индивидуальных встреч для рефлексии и корректировки учебного процесса под ритм жизни студента.

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

DevOps Upgrade — это инвестиция в карьеру, которая теперь включает не только актуальные технические знания, но и персональную поддержку на всех этапах обучения.

Старт потока — уже в понедельник. Успейте присоединиться!

⏩ Узнать подробности о курсе и зарегистрироваться можно на сайте

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

Чувствуете, что вашему стартапу чего-то не хватает для рывка на Луну? Возможно, легендарного Хабраслизня.

В «Стартап-кранче» — пополнение колоды! Теперь вашу команду мечты могут усилить:

Денис Продакшенов — тот самый человек, который донесёт фичу до прода.

Дэйли Ремайндер — от его напоминания о стендапе не скрыться.

Легендарные Ада Лавлейсовна и, конечно же, Хабраслизень.

А бустер Хабракатышек добавит проекту немного непредсказуемой магии.

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

И готовьтесь: следующие дропы карточек — 30 сентября и 7 октября!

Теги:
Всего голосов 3: ↑2 и ↓1+5
Комментарии0

Немного лекций с нашего митапа питонистов в Новосибирске - PythoNSK (https://t.me/python_in_nsk приходите, в ноябре планируем вторую встречу организовать).

У нас на митапе было несколько лекций, вот они:

Python Desktop Development (Роман Черкасов) - Программирование на QT + PySide: https://youtu.be/Xmh74WNheRM?si=mR9ecx3KzTxA4tWF
Как работает greenlet в async-реализации SQLAlchemy (Любимов Алексей) - https://youtu.be/zPXf9NJc5qA?si=VyosK69QPdtDivAY
Лекция от Никита Соболева ("Как коммитить в питон, если вы очень хотели, но не знали как?") - https://t.me/opensource_findings_chat/115827

Я хочу также отдельно поблагодарить:

  1. ТГ snppg - инициатор всего нашего действия, он изначально создал эту группу, а я просто подхватил и организовал людей

  2. ТГ duntssov - за интересную и хорошую лекцию, помощь

  3. ТГ THEDAN320 - за помощь в организации

  4. ТГ masian4eg

  5. ТГ RnChe - за проведение лекции

  6. ТГ sobolev_nikita - за проведение онлайн лекции

  7. И конечно же вам все за то что пришли. Вместе мы - сила, и кто знает, может митапы перельются во что то большее

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии1

Как облако помогает нанимать людей

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

В статье рассматривается кейс SkillGigs, сервиса для подбора специалистов в сфере здравоохранения и технологий. Управляемые облачные сервисы позволили внедрить 3D-резюме, выстроить мультиоблачную архитектуру, обеспечить безопасность и упростить интерфейс для пользователей. Результат: поиск стал быстрее, рекомендации — точнее, а процесс найма удобнее. Этот пример хорошо показывает, что облако — это уже не просто «поддержка инфраструктуры», а реальный драйвер бизнеса.

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

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

Привет, коллеги! 👋

Снова с вами рубрика "вечерний вайбкодер", и сегодня я принёс вам MyRepETL (Ссылка на github)— инструмент для ETL через MySQL репликацию.

Зачем это нужно?

Задача: у вас куча MySQL баз в микросервисах, нужно всё это затащить в Metabase для красивых отчетов.

Проблема в том, что:

  • В каждой базе своя схема и структура

  • Данные нужно объединить и нормализовать

  • Metabase любит когда всё в одном месте

  • Ручной экспорт/импорт — это боль

MyRepETL решает это: берёт данные из всех ваших баз, трансформирует их на лету и складывает в единую аналитическую базу для Metabase.

Что умеет MyRepETL

🚀 Основные фишки

Многопоточность из коробки

  • Каждый источник работает в своём потоке

  • Не блокирует друг друга

  • Автоматически восстанавливается при сбоях

Гибкие трансформации

  • Переименование таблиц и колонок

  • Вычисляемые поля

  • Фильтрация данных

  • Кастомные Python-функции

JSON-конфигурация

  • Всё настраивается через конфиг

Как использовать

Простая синхронизация

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

{
  "sources": {
    "prod_db": {
      "host": "prod-mysql",
      "user": "repl_user", 
      "password": "repl_pass",
      "database": "production"
    }
  },
  "targets": {
    "backup_db": {
      "host": "backup-mysql",
      "user": "backup_user",
      "password": "backup_pass", 
      "database": "backup"
    }
  },
  "mapping": {
    "prod_db.users": {
      "source": "prod_db",
      "target": "backup_db",
      "source_table": "users",
      "target_table": "users"
    }
  }
}

С трансформациями

А теперь добавим магию — переименуем таблицу, добавим вычисляемые поля:

{
  "mapping": {
    "prod_db.customers": {
      "source": "prod_db",
      "target": "analytics_db",
      "source_table": "customers",
      "target_table": "users",
      "column_mapping": {
        "id": {"column": "user_id"},
        "name": {"column": "full_name"},
        "email": {"column": "email"},
        "birth_date": {"column": "age", "transform": "transform.calculate_age"},
        "phone": {"column": "formatted_phone", "transform": "transform.format_phone"},
        "created_at": {"column": "registration_date"},
        "source": {"column": "source_system", "value": "production"}
      }
    }
  }
}

Создайте файл transform.py с вашими функциями:

# transform.py
def calculate_age(birth_date, row_data, table):
    from datetime import datetime
    if not birth_date:
        return None
    birth = datetime.strptime(birth_date, '%Y-%m-%d')
    return (datetime.now() - birth).days // 365

def format_phone(phone, row_data, table):
    if not phone:
        return None
    # 79991234567 -> +7 (999) 123-45-67
    return f"+7 ({phone[1:4]}) {phone[4:7]}-{phone[7:9]}-{phone[9:11]}"

Запуск

# Установка с GitHub
pip install git+https://github.com/tumurzakov/myrepetl.git

# Или клонировать и установить локально
git clone https://github.com/tumurzakov/myrepetl.git
cd myrepetl
pip install -e .

# Запуск с конфигом
myrepetl run config.json

# Или через Docker
docker run -v ./config.json:/app/config.json myrepetl:latest

На этом всё, удачного кодинга! 👨‍💻

Теги:
Всего голосов 2: ↑0 и ↓2-2
Комментарии0

Хеш-таблица с транзакциями на Go

Привет, продолжим удивительное. Смех смехом, но на Go стали доступны:

  1. Хеш-таблица с транзакциями.

  2. Структуры данных второго порядка.

И в отличие от C++, они еще не создают проблемы для Garbage Collector. Вы угадайте почему, а я немного процитирую:

------------------8<------------------

Все выглядит примерно так:

func NewMemDb() MemDb { /* ... */ }

type MemDb interface {
    Close() error
    StartTrn() Transaction
}

type Transaction interface {
    Close() error

    Get(key Ptrsz) (Ptrsz, bool)
    All(getKeys bool, getVals bool) (keys []Ptrsz, vals []Ptrsz)

    Set(key Ptrsz, val Ptrsz)
    Del(key Ptrsz)

    DependVal(key Ptrsz, val Ptrsz)
    DependDel(key Ptrsz)

    Commit() error
    Rollback() error
}

А именно:

  • Объект MemDb создается с помощью функции NewMemDb().

  • У MemDb есть функция Close() -- мы ОБЯЗАНЫ ее вызвать!!!

  • Объект Transaction создается с помощью функции StartTrn().

  • У Transaction тоже есть функция Close(). Да, мы ОБЯЗАНЫ!

  • Transaction работает с данными через lib.Ptrsz. Точно также, как и mdb.BlobMap.

  • Чтение данных выполняется посредством функций Get() и All(). Возвращаемые ими Ptrsz указывают на внутренние структуры MemDb. Они остаются валидными пока не завершена транзакция и не было вызовов Set() и Del(), инвалидирующих указатели.

  • Изменение данных выполняется посредством функций Set() и Del()MemDb копирует себе байты, на которые указывают key и val.

  • Функции DependVal() и DependDel() устанавливают зависимости. Их проверяет Commit().

  • Функции Commit() и Rollback() завершают транзакцию. Завершают, но не закрывают! Мы ОБЯЗАНЫ вызвать Close()!!

  • Просто Close() означает Rollback().

------------------8<------------------

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

Теги:
Всего голосов 3: ↑1 и ↓2-1
Комментарии0

Игра с огнём, или нулевой байт

В одном проекте заказчик потребовалось различать (и делать поиск) по трем состояниям текстового поля в Lucene индексе:

  1. непустое значение (работает из коробки)

  2. пустая строка "" (не поддерживается люсин)

  3. null (не поддерживается люсин)

Lucene не хранит null и пустые строки "" - значения просто не индексируется. Для бизнес-логики, где нужно различать все три состояния, стандартных механизмов Lucene недостаточно.

Создание "специальных" замен в виде комбинаций типа "_null_" текста и спецсимволов - ломается тестерами которые пропускали различный мусор через индекс.

Был выбран компромиссный подход:

  • "\0" (строка из нулевого байта) используется как маркер null

  • "\0\0" (строка из двух нулевых байтов) используется как маркер ""

Пробило в холодный пот? Правильно, и меня тоже. Тем не менее, это рабочий способ.

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

Плюсы:

  • \0 — это валидный символ в Java-строке, который практически не встречается в реальных данных.

  • Символ \0 невозможно ввести напрямую из внешних систем, редакторов или форм без явного кодирования. Это защищает от случайных коллизий, даже если тестировщики пробуют «мусорные» символы.

  • Таким образом достигается стабильное различие между null, "" и содержимыми строками.

Риски:

  • Утечки наружу. Маркеры \0 могут попасть в API-ответы, логи, сериализацию. В нашем случае lucene был в обертке и поиск напрямую не использовался внешними системами - обработчик вызовов был инкапсулирован в прокси сервис.

Использование \0 и \0\0 как маркеров — это баланс между «желанием клиента» и технической безопасностью. Работает, но требует дисциплины: любая утечка этих символов превращает решение в источник трудноуловимых багов снаружи индекса.

Теги:
Всего голосов 3: ↑3 и ↓0+4
Комментарии0