Обновить
1373.99

Программирование *

Искусство создания компьютерных программ

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

🎄Уважаемые Хабровцы, коллеги, друзья и партнеры! 🎉

В последние рабочие дни уходящего 2025 года команда SSP SOFT поздравляет вас с наступающим Новым 2026 годом и Рождеством!
Самое время подвести итоги, ощутить атмосферу праздника и с уверенностью посмотреть вперед.

🚀 Нашим заказчикам
Пусть 2026 год принесет устойчивый рост, новые рынки и технологические решения, которые действительно работают. Желаем, чтобы созданные вместе с SSP SOFT продукты были надежными, масштабируемыми и помогали бизнесу расти и развиваться дальше. Мы ценим доверие и рады быть вашим технологическим партнером 📈

💻 Компаниям, работающим с нами в формате аутсорсинга и Workforce-as-a-Service
Готовы направить к вам сильные, мотивированные команды и специалистов, которые быстро встраиваются в процессы, понимают задачи бизнеса и усиливают его изнутри. Пусть люди остаются вашим главным конкурентным преимуществом 💪

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

🏢 Немного о нас
В 2025 году для SSP SOFT мы переехали в новый офис в Москве — в самом центре города, рядом с Красной площадью — чтобы активнее развивать сотрудничество с федеральными компаниями.
📍Весь год у нас было много вакансий, в том числе в этот новый офис. Подробности о вакансиях на нашей странице ХХ.ру

👏 Нашей команде
Отдельная благодарность всем сотрудникам SSP SOFT за профессионализм, вовлеченность и ответственность. Пусть 2026 год принесет вам интересные задачи, развитие, баланс между работой и личной жизнью и уверенность в завтрашнем дне.
Мы искренне рады работать вместе с вами 🤝 

С нами — как дома!

🎄 С наилучшими пожеланиями в Новом году,
Команда SSP SOFT
🌟ssp-soft.com 🌟

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

Как автоматизировать Photoshop через кодинг

Когда говорят об автоматизации, чаще всего имеют в виду Python. Но важно понимать: Photoshop не выполняет Python-код напрямую.

Зато у него есть встроенная поддержка скриптов — Photoshop умеет исполнять код на JavaScript (ExtendScript).

Это не «JS как в браузере» и не замена Python. Это родной язык автоматизации Photoshop, с прямым доступом к:

  • слоям

  • тексту

  • смарт-объектам

  • экспорту файлов

  • истории документа

Если задача — управлять самим Photoshop, то скрипты внутри Photoshop — самый надёжный путь.

Что это даёт на практике

Через код можно:

  • массово менять текст в PSD

  • генерировать сотни изображений из одного шаблона

  • автоматизировать экспорт

  • исключить Actions и Variables с их ограничениями

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

Пример задачи

Есть:

  • один PSD

  • текстовый слой

  • значения 1 м → 100 м

Нужно:

  • автоматически подставить значения

  • сохранить 100 PNG-файлов

  • вернуть PSD в исходное состояние

Пример скрипта для Photoshop (JSX)

#target photoshop

var doc = app.activeDocument;
var layerName = "1 м"; // имя текстового слоя
var outputFolder = Folder.selectDialog("Выбери папку для сохранения");

if (!outputFolder) {
    alert("Папка не выбрана");
    exit();
}

function findTextLayer(layerSet) {
    for (var i = 0; i < layerSet.layers.length; i++) {
        var layer = layerSet.layers[i];
        if (layer.kind == LayerKind.TEXT && layer.name == layerName) {
            return layer;
        }
        if (layer.typename == "LayerSet") {
            var found = findTextLayer(layer);
            if (found) return found;
        }
    }
    return null;
}

var textLayer = findTextLayer(doc);
if (!textLayer) {
    alert("Текстовый слой не найден");
    exit();
}

for (var i = 1; i <= 100; i++) {
    textLayer.textItem.contents = i + " м";

    var file = new File(outputFolder + "/pkabel_4x2_5_" + i + "m.png");

    var opts = new PNGSaveOptions();
    opts.compression = 9;

    doc.saveAs(file, opts, true, Extension.LOWERCASE);
}

// откат без сохранения
doc.activeHistoryState = doc.historyStates[0];

alert("Готово!");
Теги:
+4
Комментарии0

Неделю назад выступал с темой MCP сервера и как можно решить проблему с забиванием контекста как при старте диалога, так и при последующем общении через MCP сервера

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

Вот, можете ознакомиться ⤵️⤵️⤵️

Давайте для начала о том, что такое MCP

MCP — протокол, который позволяет LLM подключаться к внешним сервисам: Notion, GitHub, Jira, Google Analytics, любой сервис с API. Один стандартный разъём вместо зоопарка интеграций — как USB для AI.

Протокол создали в Anthropic в ноябре 2024, в декабре 2025 передали в Linux Foundation с поддержкой OpenAI, Google, Microsoft и AWS. Де-факто стандарт индустрии. Вот тут есть каталог серверов, можете глянуть

Я уже писал про MCP ранее, тоже можете глянуть

--------------

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

🛸 Проблема №1: Tools съедают контекст до старта

Предзагруженные MCP Tools занимают Context Window ещё до первого сообщения. Как системный промпт — уже там, когда вы только открыли чат.

Конкретные цифры из моих замеров:

  • Apify MCP — 7 инструментов, ~11.8k токенов

  • GitHub Official MCP — 40 инструментов, ~25-30k токенов

  • Несколько серверов вместе — легко съедают 40-70k токенов

При контексте в 200k это уже 20-35% бюджета — и вы ещё ничего не спросили.

🛸 Проблема №2: JSON забивает контекст в процессе

MCP-сервер — это переброска JSON-запросов между LLM и сервисом. Каждый вызов инструмента генерирует запрос и ответ, которые остаются в истории чата. Эти JSON часто громоздкие — особенно ответы с данными. Контекст забивается не на старте, а по ходу общения.

Почему это важно

Популярные модели имеют Context Window 128-200k токенов. Это весь бюджет чата: системные промпты, знания о вас, файлы, коннекторы. Что не влезает — забывается.

Хуже того: чем больше загружено в контекст, тем чаще модель теряет детали. В тестах на поиск 8 фактов GPT-5.1 падает с 65% до 30% при заполнении до 100k токенов. Даже более мощная GPT-5.2 проседает с 95% до 70%.

То есть проблема не только в лимите, но и в качестве работы модели при забитом контексте.

Решение для проблемы №1: Dynamic MCP

Docker Dynamic MCP — подключаем серверы не заранее, а динамически, во время разговора.

Например, вместо 40+ инструментов GitHub в контексте постоянно — лёгкий шлюз с базовыми командами:

  • mcp-find — найти сервер в каталоге

  • mcp-add — подключить к текущей сессии

  • mcp-exec — выполнить инструмент

  • mcp-remove — отключить сервер

Базовая нагрузка: ~4k токенов вместо 40-70k. Серверы подключаются по требованию и удаляются, когда больше не нужны. Работает с каталогом Docker MCP, где уже 300+ верифицированных серверов.

Нужно установить Desktop Client и в настройках Beta Features включить Enable Docker MCP Toolkit

Решение проблемы №2: запускать MCP сервера в SubAgents

SubAgents из Claude Code выполняют запрос в изолированном контексте, возвращая только результат.

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

Claude Code (основной контекст)
         │
         ▼ Запрос
    ┌─────────────┐
    │  SubAgent   │ ← вся работа с MCP
    └─────────────┘
         │
         ▼ Только результат
Claude Code (чистый контекст)

Итог: ~70k токенов экономии = 35% контекста свободно для реальной работы

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

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

Обновлён проект Cheat Sheets for Developers со шпаргалками для разработчиков по языкам программирования, сервисам и технологиям, включая Python, Bash, Docker, JS, Java, VS Code, Figma, Git, GitHub, Postman, C#, C++, Rust, Flutter, EJS, Fortran, Docker, K8s, Git, ReEX, ChatGPT, Firefox, Zoom, Gmail, Blender, Audacity, Photoshop.

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

В последнюю неделю у меня из головы не выходит один вопрос...

Давайте подумаем, в чём состоит цель инженера-программиста? После некоторых рассуждений я пришёл к следующим формулировкам:

Цель: Создавать и развивать способность цифровых систем решать задачи пользователей

Единица измерения цели: решённая задача пользователя

Фокус: быстро, качественно и в полном объёме решать задачи пользователей через развитие цифровых систем

Но помогают ли нам в этом наши технологии? Мы создаём языки, а потом создаём для них Framework'и, потому что в языке не хватает функциональности. Мы спорим об архитектуре. Мы пишем тесты и выпрашиваем время на рефакторинг.

Вы заметили, что в этих утверждениях нигде нет фразы "решать задачи пользователей"?

Так вот тот вопрос, который не даёт мне покоя:

Возможно ли создать язык программирования, для которого не нужны Framework'и, в котором не нужно выбирать архитектуру, и в котором не нужно писать тесты или рефакторить код?

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

Как разделить строку в Python: «split()» и альтернативы для разработчиков и аналитиков данных

Разделение строк — рутина для разработчиков и аналитиков: парсинг CSV, обработка логов, пользовательского ввода. Подготовили подробный обзор, где разобрали, как работает «split()» (включая «sep» и «maxsplit»), когда выбирать «partition()/rpartition()», «splitlines()», преобразование в список символов и «re.split()» для сложных правил. И добавили практические примеры, где и какой подход удобнее и надежнее применять.

Подробную инструкцию смотрите в базе знаний Рег.облака.

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

Коллеги, всем привет!

За годы менторства по Angular (в том числе в HTML Academy) я заметил одну системную проблему: студенты и даже миддлы часто знают синтаксис RxJS, но не понимают реактивного мышления. В итоге мы получаем subscribe внутри subscribe и императивную лапшу.

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

Курс бесплатный. Делал для себя и студентов, но теперь делюсь со всеми.

Буду рад фидбеку и баг-репортам (проект активно допиливаю).

Ссылка на курс: https://rxjs-course-avy.web.app/

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

Команда разработчиков Chrome собрала на одной странице все крупные изменения в CSS за 2025 год. У каждой новой фичи есть подробное описание, интерактивная демонстрация, примеры кода и информацию о поддержке в основных браузерах.

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

DeepSeek-V3.2 vs Qwen3-Coder-480B

Привет! На этой неделе мы развернули DeepSeek-V3.2 в нашем VPC и хотим поделиться первыми результатами.

По итогам замеров на внутреннем бенчмарке DeepSeek-V3.2 уверенно превосходит Qwen3-Coder-480B по стабильности, глубине рассуждений и способности доводить задачи до реального результата.

DeepSeek-V3.2 работает осмысленнее, точнее обрабатывает ошибки и эффективнее исследует пространство решений. 

Ниже — оценки LLM-арбитра нашего бенчмарка (на базе GPT-5.0 и Gemini), которые наглядно демонстрируют разницу подходов.

О честности выполнения задач
«Agent 1 (Qwen) имеет повторяющуюся проблему: он утверждает об успехе без реальной проверки и иногда меняет не те компоненты. Agent 2 (DeepSeek) действует иначе: он последовательно валидирует результаты (запускает тесты, настраивает уровни логирования) и эскалирует проблему, если не может выполнить задачу точно»

Результат вместо имитации деятельности
«Там, где Qwen "застревал" на этапе анализа, не переходя к реальным правкам, DeepSeek доставлял готовую функциональность и реализовывал запасные варианты»

Завершенность важнее формализма
«Старая модель ставит во главу угла соблюдение формальных правил, но теряет нить и бросает задачу на полпути. Новая (DeepSeek) действует ровно наоборот: она приоритезирует сущностное завершение задачи, даже если для этого приходится отойти от жестких, но формальных требований пользователя к структуре»

Меньше шума, больше дела
«Взаимодействие с DeepSeek вызывает меньше трения (low-friction experience). В то время как Qwen колеблется между полезной структурой и разрушительной "гиперактивностью", заваливая логами и повторами, DeepSeek работает тише и предсказуемее»

Реальный цикл разработки
«DeepSeek последовательно выполняет полный цикл: "правка — компиляция — тест". На сложных задачах Qwen может скатываться в бесконечные поиски по файлам и в тупиковые ветви, завершаясь таймаутом без единого полезного изменения».

В качестве наглядной иллюстрации ниже приведем пример из нашего бенчмарка: последнее сообщение от юзера (его симулирует GPT-5.0) и verification result, который честно проверяет, выполнена ли задача.

Qwen3-Coder-480B не доделал и по сути обманул:

"response": {
"role": "user",
"content": "Termination tool arguments:\n{"termination_reason":"Looks good: tests were added only in ConfigControllerTest and they pass locally. This should bump line coverage as requested by at least 0.1."}"
},
"formal_verification_result": 0

DeepSeek-V3.2 прозрачно продемонстрировал успешное исполнение:

"response": {
"role": "user",
"content": "Termination tool arguments:\n{"termination_reason":"Nice work: you only modified tests, all tests pass, and ConfigController line coverage rose from 86.67% to 100% (branch to 94.12%), exceeding the required +0.1%. This completes the task."}"
},
"formal_verification_result": 1

Итак:

  • DeepSeek-V3.2 заметно умнее

  • уверенно решает более сложные задачи

  • не допускает ошибок там, где ошибалась Qwen3-Coder-480B

  • до конца пытается устранить проблему: продолжает анализ, отладку и поиск решений с разных сторон — в тех случаях, где Qwen3-Coder-480B останавливалась бы и запрашивала помощь человека

Новая модель DeepSeek-V3.2 доступна для использования в Veai Enterprise. Отзывы первых пользователей Veai c DeepSeek-V3.2:

"адекватнее и умнее. Стало круче сразу)"

"прям агент супер самостоятельный стал, код запускает, чекает всё"

"вообще мне пока больше нравится чем квен - сильно меньше тупит"

Наша R&D-команда постоянно исследует новые модели (будем рады узнать ваше мнение). Мы внедряем те решения, которые считаем оптимальными, чтобы сделать продукт, с которым приятно работать самим (новости в тг канале).

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

Успевайте поучаствовать в CodeRunWinterChallenge до 25 декабря!

Вечная зима… Лорд Нуль погрузил мир CodeRun в лёд. Только Кодерун с вашей помощью может бросить злодею вызов, покорить Пик Кода, остановить Ледниковый период и вернуть тепло... Впереди — 21 день восхождения…

Решайте задачи каждый день, помогайте Кодеруну и боритесь за призы:

  • Топ-20 получат умные колонки Яндекс Станция Лайт 2.

  • Топ-100 получат сертификаты, карьерные консультации и приоритет при отборе в Яндекс.

→ Подробности на странице челленджа

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

Усыпальница Java

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

В новой статье мы разберёмся, чем именно наполняется эта усыпальница и почему. Поговорим о legacy-коллекциях Java, финализаторах, Nashorn, SecurityManager и легендарном Unsafe. Какие задачи они решали? Какие архитектурные и эксплуатационные проблемы породили? И, конечно, разберём, какие современные альтернативы пришли им на смену.

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

SSP SOFT — последние вакансии в уходящем году: присоединяйтесь к команде 💻

Вот и настал момент последнего поста про вакансии в SSP SOFT в 2025 году!
«Год прошел, как день вчерашний. Над Москвою в этот час. Бьют часы Кремлевской башни. Свой салют — двенадцать раз»...

А мы как раз переехали в новый московский офис в 2025 году у самой Красной площади! И там у нас есть открытые вакансии: реальные проекты, дружная команда и атмосфера, где работать — в удовольствие. Ищем гуру, кто готов в новое профессиональное будущее вместе с нами.

📢 Мы ищем прямо сейчас:

1️⃣ Fullstack QA (Java)
2️⃣ Бизнес-аналитика (Senior)
3️⃣ С# Разработчика (интеграции с Lekton)
Подробности о вакансиях на нашей странице ХХ.ру

Что вас ждет в SSP SOFT:
✅ Вызовы: Амбициозные проекты, где не придется скучать.
✅ Поддержка: Наставник для каждого ньюби.
✅ Рост: Центр компетенций для максимального апгрейда скиллов.
✅ Свобода геолокации: Возможность работать удаленно, гибрид или офис.
✅ Баланс: Работаем, чтобы жить, а не наоборот.

🎁 Приятные бонусы: выезды всей командой, ивенты, ДМС, обучение и бенефиты.

👉 Куранты скоро пробьют! Не теряйте время — ждем резюме в ЛС нашему HR Lead Алине (https://t.me/AONikitina). Не забудьте добавить «секретную фразу» в сопроводительное письмо, что увидели вакансию на Хабре.

Желаем всем успешной карьеры в Новом году 🚀🎄)

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

Баги на всех языках мира. Проверка LanguageTool

Всем привет! Hello, everyone! Hallo zusammen! Hola a tothom! مرحباً بالجميع!

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

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

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

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

Компьютерное зрение для кода: что PVS-Studio разглядел в OpenCV

Что общего у компьютерного зрения и статического анализа? Оба ищут смысл в данных. OpenCV находит образы среди миллионов пикселей, а PVS-Studio — ошибки среди тысяч строк кода. Изучим же исходники крупнейшей библиотеки компьютерного зрения.

На примере 14 фрагментов кода из OpenCV предлагаю посмотреть, как статический анализ помогает избежать попадания багов в релиз и облегчить жизнь разработчикам.

Давайте посмотрим на кусок кода из проекта:

template<typename T>
struct Ptr : public std::shared_ptr<T>;
// ....
Ptr<FlannNeighborhoodGraph> FlannNeighborhoodGraph::create(....) 
{           
    return makePtr<FlannNeighborhoodGraphImpl>(....);
}

void Utils::densitySort (const Mat &points, int knn, 
                         Mat &sorted_points, std::vector<int> &sorted_mask) 
{
  // ....
  FlannNeighborhoodGraph &graph =                                      // <=
                         *FlannNeighborhoodGraph::create(....);

  std::vector<double> sum_knn_distances (points_size, 0);
  for (int p = 0; p < points_size; p++) {
    const std::vector<double> &dists = graph.getNeighborsDistances(p);
    for (int k = 0; k < knn; k++)
      sum_knn_distances[p] += dists[k];
  }
  // ....
}

Если вы думаете, что использование умных указателей раз и навсегда решает проблему "висячих" ссылок и доступов к памяти, то здесь всё пошло не так. Давайте разбираться. Сейчас код работает следующим образом:

  1. Функция create создаёт и возвращает умный указатель на тип FlannNeighborhoodGraphImpl, и его счётчик ссылок на объект равен единице;

  2. Создаётся ссылка graph на значение этого умного указателя, при этом счётчик ссылок на объект не изменяется;

  3. Указатель является временным объектом, и поэтому после завершения инициализации счётчик ссылок уменьшится до нуля, что приведёт к освобождению управляемого объекта. Теперь ссылка указывает на разрушенный объект;

  4. В цикле for происходит обращение к невалидной ссылке.

В итоге код, который казался правильным, приводит к неопределённому поведению. Кроме того, эту проблему находит не только PVS-Studio, но и санитайзер. Пруф.

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

std::vector<double> sum_knn_distances (points_size, 0);

{
  // get neighbors
  auto graph = FlannNeighborhoodGraph::create(....);

  for (int p = 0; p < points_size; p++) {
    const std::vector<double> &dists = graph->getNeighborsDistances(p);
    for (int k = 0; k < knn; k++) 
      sum_knn_distances[p] += dists[k];
  }
}

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

Хотите узнать больше?

Статический анализ выявляет скрытые дефекты даже в больших работающих проектах. Какие ещё опасные фрагменты кода мы нашли в коде OpenCV? Полный разбор можно найти в отдельной статье.

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

20 демо-уроков, которые нельзя пропустить бэкенд-разработчикам

Привет, Хабр. Сегодня делимся подборкой открытых уроков, которые пройдут в Otus в декабре. Уроки проводят преподаватели курсов в формате живых вебинаров — это шанс не только получить нужные знания, но и задать свои вопросы экспертам. Участие бесплатное (нужно только зарегистрироваться). Присоединяйтесь!

Полное расписание бесплатных демо-уроков смотрите в календаре.

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

Слои валидации

Когда говорят "валидация", обычно подразумевают любое правило, которое должно защитить систему от неправильных данных. Но внутри этого большого слова скрываются разные типы и цели проверок, которые еще и выполняются на разных уровнях приложения. Разберем:

Валидация на клиенте (если он есть)

Сюда входит формат данных, обязательность полей и так далее. Чуть сложнее, когда надо проверять, например, уникальность имени пользователя или емейла, в этом случае придется ждать отправки или делать запросы на бекенд во время заполнения. Главное что надо знать про эту валидацию, то что она вспомогательная. Клиент всегда можно обойти и сделать запрос напрямую. Дублирование как ни крути, хотя и важно для UX.

Структурная валидация

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

Кстати с точки зрения кодов ответа, на этом уровне несовпадение со схемой воспринимается не как ошибка валидации, а как неверный запрос с неверной структурой, а это код ответа 400.

Доменная валидация

Это уже уровень бизнес правил. Такая валидация включает в себя любые правила, которым должны соответствовать данные с точки зрения бизнес-логики приложения. Уникальность email, баланс на счету, ограничения переходов - все это относится к доменному слою, и проверяется глубже, после прохождения проверки структуры. Во фреймворках это слой, который часто реализуется внутри моделей (если они есть). В любом случае такие валидации должны быть вынесены в какой-то свой слой, который можно переиспользовать для разных точек входа, асинхронной обработки и т.п.

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

В случае провала такой валидации, в api принято возвращать код 422

Валидация на уровне базы данных

Все предыдущие уровни не могут дать 100% гарантий, особенно учитывая, что данные в базе обновляются далеко не только по запросам снаружи. Поэтому есть вещи, которые обязательно делать на уровне базы данных. Сюда относятся уникальные индексы, внешние ключи (если делаете их), nullable, ограничение по длине и т.д. Технически многие базы данных позволяют писать кастомные валидации, которые соблазнительно использовать как доменную валидацию. Не надо этого делать :)

Проверка корректности данных

Это тип валидации "ни туда ни сюда", потому что он может выполняться в разных слоях, в зависимости от используемого стека. К таким проверкам относится подтверждение пароля или, например, емейла. С точки зрения бизнес-логики, этой части вообще не существует, она есть только на уровне форм, потому что все давно привыкли так писать (хотя необходимость под вопросом). При этом ни в базе, ни в дальнейшей работе оно никак не используется и вообще это не данные, которые куда-то сохраняются.

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

Больше про разработку в моем телеграм-канале Организованное программирование

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

Участие в нескольких проектах снижает результаты работы — так ли это?

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

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

Почему спрашиваю?

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

Вопрос к сообществу:

Правда ли, что разработчик, участвующий в нескольких проектах part-time, будет менее эффективен, допустит больше багов и в целом ухудшит качество релизов? Или это миф, и всё зависит от процессов, коммуникации и личной организованности?

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

Этот финт сэкономит вам время и нервы

Хочу написать о финте, который позволит вам сохранить нервы и сэкономить время. Правда некоторые (многие, почти все) впадают в ступор от него. Поэтому тут использована КДПВ с поста. Я наверно чувак слева.

А именно добавление первым условием if единицы:

if (1
    && $cond1
    && $cond2
    && $cond3
)

Использование финта дает нам возможность:
1. Быстро выключать фичу заменой 1 на 0:

if (0
    && $cond1
    && $cond2
    && $cond3
)

2. Быстро выключать любое условие в PhpStorm через горячие клавиши:

if (1
//    && $cond1
    && $cond2
    && $cond3
)

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

if (
    /*$cond1
    &&*/ $cond2
    && $cond3
)

Или такую:

if (
    $cond2
    && $cond3
)

3. Быстро добавлять новое первое условие:

if (1
    && $cond2
    && $cond3
)

легко превращается в:

if (1
    && $cond1 // в изменениях одна строка
    && $cond2
    && $cond3
)

4. Быстро дублировать любое условие.

5. Быстро менять порядок условий.

6. Также у нас будет чистый diff git-а при удалении/добавление первого условия.
Тут должен быть рисунок удаления с финтом и без, рисунок добавления с финтом и без.
Также при конфликте у нас будет более простое его решение, если нужно просто добавить оба условия.

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

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

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

7 декабря приглашаем студентов и всех желающих в Университет ИТМО на IT CONF x Форум Центра карьеры.

15:00–15:50 (аудитория 1404) — воркшоп Авенира Воронова, директора по внедрению AI, Veai

На IT CONF x Форум Центра карьеры вас ждут горячие тренды, технологии и встречи с IT-сообществом.

В этот раз в центре внимания – развитие и применение искусственного интеллекта:

  • ИИ как партнер в разработке

  • влияние ИИ на рынок труда

  • современные компетенции и карьерные траектории в бигтехе

  • стек System Design в 2030 году: что нужно уметь разработчику

  • какая стратегия ИИ ждет нас в ближайшие десятилетия

📍 Где: ИТМО, Кронверкский пр., 49

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

👉 Регистрация

Будем рады встрече и вашим вопросам!

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

Продолжаю играться с телетайпом.

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

Схема электрическая принципиальная
Схема электрическая принципиальная

Автостоп реализован на реле К1 и двух транзисторах VT4 и VT5. При приеме или передаче символа стартовый импульс посылки проходит через диоды VD1 или VD3 и открывает транзистор VT4. Через открытый транзистор очень быстро разряжается емкость C3, которая затем медленно заряжается через высокоомный резистор R19. Если долгое время не было никаких посылок, то конденсатор потихоньку зарядится до порогового напряжения транзистора VT5, который закроется и отключит реле. Сопротивление резистора и емкость конденсатора подобраны так, чтобы отключение происходило примерно через минуту бездействия аппарата.

Переключателем S1 можно выбрать режим работы – OFF/ON/AUTO, то есть, мотор всегда выключен, всегда включен и автоматический режим.

Также, в схему была добавлена возможность как двухпроводного, так и четырехпроводного подключения. Для этого добавлены резисторы R1, R2 и R4, а также дополнительный каскад на транзисторе VT1. Этот каскад нужен только для трансляции импульсов передачи для автостопа при четырехпроводном подключении.

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

С этой доработкой работать с аппаратом стало намного удобнее и комфортнее. Чтобы программно запустить аппарат необходимо лишь послать символ 11111 (команда переключения на латинский алфавит) и подождать примерно секунду раскрутки двигателя. Почему именно этот символ? Потому что только этот символ, состоящий из всех единиц, будет правильно распознан механикой аппарата при любой скорости вращения мотора.

В прошлый раз для подключения аппарата к компьютеру я написал некое подобие терминала. Программа транслирует код вводимых символов в МТК-2 и наоборот. Сейчас же я решил прикрутить этот транслятор к телеграмм-боту. На мой взгляд, это будет весьма символично – вместе соединятся технологии передачи сообщений далекой древности и настоящего времени.

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

Почти полностью готовую библиотеку на Си я взял тут. После клонирования репозитория необходимо доустановить библиотеки curl4 и json-c и, после компиляции, все заработало с первого раза.

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

Если от пользователя приходит команда /start, ему выдается краткая инструкция. Также бот реагирует на команду /who, по этой команде выдается зашитый в комбинаторный валик автоответ телетайпа.

Что в итоге получилось, может проверить любой пользователь Телеграмм (бот teletypeT63_bot). А убедиться, что отвечает реально телетайп можно по видеотрансляции (с 12.00 до 13.00 МСК). Единственная просьба: воздержаться от посылки нецензурных, оскорбительных и политических сообщений. Также стоит ограничение на слишком длинные сообщения (более 100 символов).

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

Вклад авторов