Как стать автором
Поиск
Написать публикацию
Обновить

Бэкенд

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

Топ 3 ошибок новичка в System Design Interview. Лайфхаки от практика

⭐️ бесплатный вебинар 6 августа в 19:00 мск. 

На вебинаре:

Узнаем, зачем SRE специалисту System Design?

Научимся проходить System Design на необходимом для SRE уровне

Расширим знания по прохождению System Design 

Разберём интервью для SRE специалистов

Усилим System Design экспертизу для SRE специалистов

Спикер: Владимир Невзоров, Senior backend developer HighLoad системы в направлении кибербезопасности, компания Servicepipe

Ведущий: Кирилл Борисов, SRE в VK

Занять место на вебинаре по ссылке.

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

Хотите подтянуть свои знания Go?

Тогда новый бесплатный курс для вас!

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

Если вы уже знакомы с Go, но не хватает практики, приглашаем пройти новый курс в Академии Selectel. С ним вы научитесь писать простые сервисы на Go и использовать его в некоторых рабочих задачах, а еще получите большую подборку ресурсов для погружения в этот язык. 

Несколько материалов для старта.

Открыть курс →

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

Находки на рыбалке: FastStream! Сходили с автором половить рыбу и пожарить всякое вкусное на углях. И пока было время – говорили про программирование.

Для тех, кто еще не успел познакомиться с новинкой, рассказываю: FastStream – аналог FastAPI, но для работы с событиями в брокерах / очередях.

Пример:

from faststream import FastStream
from faststream.kafka import KafkaBroker

broker = KafkaBroker("localhost:9092")
app = FastStream(broker)

@publisher("another-topic")
@subscriber("first-topic")
async def handle(user: str) -> str:
     return f"Hi, {user}!"

Что делает данный код? Читает сообщения из first-topic, парсит из них поле user типа str, выполняет вашу логику обработки, отправляет новое сообщение в another-topic. Просто? Удобно? Да!

Что нам дает такой подход?

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

  • AsyncAPI документацию (аналог OpenAPI в вебе)

  • Удобное тестирование

  • Кучу других плюшек!

Внутри видео обсудили:

  • Детали работы DI фастстрима

  • Встроенное Observability

  • Open Tracing

  • Сообщество фреймворка (тут не будет проблемы "одного автора", сообщество живет!)

  • Отличия от Celery: почему интструменты совсем разные?

Репозиторий: https://github.com/ag2ai/faststream
Документация: https://faststream.ag2.ai

Обсуждение: используется ли в ваших проектах асинхронная архитектура? Как вы работаете с событиями?

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

Шардирование в базах данных: зачем это нужно

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

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

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

Читайте подробный гайд по методам распределения данных в базе знаний Облака Рег.ру.

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

Где учиться программированию

Привет! Мы на Хабр Карьере собираем сотни онлайн-курсов в IT или digital на маркетплейсе курсов, и каждую неделю делаем подборки обучений для тех, кто хочет учиться какой-то специализации с нуля или для тех, кто уже в профессии, но чувствует, что хочет прокачать навыки. Сегодня — про программирование.

Вообще все курсы по специализации можно посмотреть здесь, а ниже оставляем ссылки по ключевым навыкам:

Python

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

Java

Объектно-ориентированный язык. Применяется в корпоративных системах, Android-разработке, высоконагруженных и распределённых приложениях.

Backend-разработка

Разработка серверной логики, API, работы с базами данных, авторизации, обработки запросов. Основные технологии — Python, Java, Go, Node.js и др.

Fullstack-разработка

Разработка и клиентской, и серверной части. Обычно включает знание одного backend-языка, JavaScript/TypeScript и одного из фреймворков (React, Vue, Angular).

Тестирование

Проверка функциональности и стабильности продукта. Включает ручное и автоматизированное тестирование, написание тест-кейсов, работу с CI/CD.

Frontend-разработка

Разработка интерфейса пользователя. HTML, CSS, JavaScript, современные фреймворки (React, Vue, Svelte), взаимодействие с API.

Сегодня вместе с хардами важно прокачивать и софты — такие курсы на маркетплейсе тоже есть.

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

→ Смотреть курсы по всем специализациям

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

Быстрые сборки с функцией Rollback в Amvera Cloud

Ранее в Amvera Cloud, были возможны откаты только путём новой сборки из нужного коммита в Git-репозитории. Помимо этого, использовалась медленная технология сборки.

Мы ускорили сборки до 10 раз и сделали возможность быстрого отката к предыдущим версиям!

Стало легче откатывать приложение, в случае ошибок.

Подключить быстрые сборки можно в разделе проекта «Контроль версий».

Интерфейс управления версиями сборок
Интерфейс управления версиями сборок

Новые сборки

  1. Быстрее старых до 10 раз.

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

Amvera Cloud – облако для простого запуска проектов со встроенным CI/CD (деплой идёт через Git или загрузку файлов в интерфейсе), бесплатными https-доменами, мониторингом работы приложений, встроенным проксированием до ведущих LLM и собственным инференсом LLaMA.

Вам не нужно думать о настройке инфраструктуры. Git push amvera master и ваш проект запущен. Зарегистрируйтесь и получите 111 рублей на тест. 

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

В PEP 798 предлагается расширить возможности коллекций (списки, словари, множества) и генераторов, разрешив операции распаковки (* и **) внутри выражения.

Способ позволит лаконично в одну строку объединять произвольное количество итерируемых объектов в одну коллекцию:

[*it for it in its]  # список с объединением итерируемых элементов в 'its'
{*it for it in its}  # множество с объединением итерируемых элементов в 'its'
{**d for d in dicts} # словарь с комбинацией словарей в 'dicts'
(*it for it in its)  # генератор с объединением итерируемых элементов в 'its'

В данный момент объединение списков мы осуществляем с помощью циклов:

# с помощью генератора
its = [[1, 2], [3, 4], [5]]
new_list = [x for it in its for x in it]

# с помощью метода extend
new_list = []
for it in its:
    new_list.extend(it)

# для множеств и словарей с помощью метода update
new_set = set()
for it in its:
    new_set.update(it)

new_dict = {}
for d in dicts:
    new_dict.update(d)

# также возможно использовать генераторную функцию (yield)
def new_generator():
  for it in its:
      yield from it

Предложение распространяется также на асинхронные выражения.

В данный момент предложение находится на стадии черновика.

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

Как создать мультиаккаунт-ферму для любых целей: от TikTok до Amazon

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

1. Зачем нужна мультиаккаунт-ферма

Массовое создание и управление аккаунтами востребовано в:

  • TikTok / Instagram / YouTube (SMM, продвижение, фарм, масслайкинг)

  • Amazon / eBay / Etsy (отзывы, возвраты, seller support)

  • Tinder / Badoo / Facebook (фарм профилей, трафик, лидогенерация)

  • Финансовые сервисы (регистрация, чекапы, симуляция пользовательской активности)

2. Инфраструктура: из чего состоит ферма

Управляющий скрипт / панель

  • Язык: Python + SQLite / Redis

  • Задачи: управление профилями, логами, заданиями

Эмуляторы / браузеры

  • Android: MEmu, LDPlayer, Anbox (Linux)

  • Браузерные: Puppeteer, Playwright, Selenium, антидетект-браузеры (Dolphin{anty}, AdsPower, Incogniton)

Прокси-серверы

  • Mobile / Residential — лучшее для trust-оценки

  • Автоматическая ротация, логика GEO под задачу

Серверная часть

  • VPS / VDS с Linux или Windows

  • Docker-контейнеры под каждое окружение

  • Балансировка нагрузки

3. Создание аккаунтов: подходы

Ручной полуавтомат (через Android-эмулятор)

  • Эмуляция касаний (ADB, Auto.js)

  • Работа через антидетект-образы

Полностью автоматический (браузер + API)

  • Использование Playwright + обфускация fingerprint

  • Капча-решатели: 2Captcha, CapMonster, hCaptcha API

4. Управление и автоматизация

  • Отслеживание статуса аккаунта: валидация, блок, SMS

  • Система задания задач (task scheduler)

  • Импорт/экспорт сессий и cookies

  • Telegram-бот для уведомлений

5. Масштабирование

  • Запуск десятков сессий в docker-контейнерах

  • Использование headless-режима с обходом защиты

  • Съём логов и дебаг-интерфейсы

6. Безопасность и устойчивость

  • Разделение трафика по подпроектам

  • Автоматическое обновление fingerprint’ов

  • Логирование и автоотключение забаненных узлов

  • Мониторинг прокси и доступов

Пример архитектуры

[ Telegram Bot ] <- уведомления / команды
       |
[ Flask API ] <-> [ SQLite / Redis ]
       |
[ Управляющий скрипт ] -> [ Docker / Android VM ]
                                |
                         [ Браузер / Эмулятор ]
                                |
                            [ Прокси-сервер ]
Теги:
Всего голосов 10: ↑4 и ↓60
Комментарии0

Огромное спасибо: Поддержка ChatGPT на sqlize.online восстановлена! 🎉

Привет, сообщество!

У меня есть невероятно крутые новости!

Благодаря вашей потрясающей щедрости и пожертвованиям, которые мы получили, мы собрали средства, необходимые для восстановления и продолжения интеграции ChatGPT на нашей платформе! 🥳

Ваша поддержка значит для меня очень много. Она напрямую покрывает расходы на API OpenAI, гарантируя, что такие функции, как генерация запросов на естественном языке и умная помощь по SQL, остаются доступными для всех.

Мы запустили sqlize.online как доступный инструмент для изучения и работы с SQL, и возможности ИИ являются ключевой частью этого проекта. Знание того, что многие из вас ценят этот сервис и помогли поддерживать его работу, по-настоящему мотивирует.

Это доказательство силы сообщества! Спасибо вам за веру в sqlize.online и за помощь в поддержке ресурсов для блага всех энтузиастов и профессионалов SQL.

Мы обязуемся продолжать совершенствовать sqlize.online и расширять ваши возможности в работе с данными.

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

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

Что же мы, простые труженики клавиатуры, можем противопоставить этому нагнетающему инфополю?

Наш ответ — система ГУС: «Готов к увольнению и собеседованиям».

Комплексная система технико-психологической подготовки, которая включает:

  • Подкладывание подушки — накопить 3–6 окладов и не потратить.

  • Спринт по собеседованиям — пройти 5 созвонов за неделю и не сгореть.

  • Удержание оффера — получить оффер с +10% к текущей ЗП на фоне «мы все держимся».

Будь готов! Всегда готов!

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

Пытаясь выжать максимум из локально запущенной LLM, обнаружил, что модель Qwen2.5 14b неплохо справляется с задачей саммаризации текста. Решил таким образом немного автоматизировать ежедневный утренний процесс просмотра новостных материалов.

Что потребуется:

  • LM Studio - удобная GUI тулза для локального запуска моделей. В ней надо включить на вкладке Developer http сервер (ctrl+R)

  • ai chat - консольная утилита для работы с LLM

  • аналогичный этому конфиг для aichat

Пока никакие MCP инструменты я не прикрутил, часть работы придется сделать "руками", а именно - открыть страницы с новостями, скопировать из них текст, создать текстовые файлы и вставить в эти файлы скопированный текст. Например, хотим сделать саммари к 3 статьям: создаем 3 файла 1.txt 2.txt 3.txt и копируем в них текст соответственно из 1, 2, и 3 статей.

Все, теперь запускаем:

cat 1.txt |  aichat -m deepseek сделай саммари текста: > out1.txt && \
cat 2.txt |  aichat -m deepseek сделай саммари текста: > out2.txt && \
cat 3.txt |  aichat -m deepseek сделай саммари текста: > out3.txt

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

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

Вот тут еще пример с другим инструментом автоматизации работы с текстом при помощи LLM.

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

Топ 5 ошибок в работе с подписью на смарт-контрактах

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

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

1️⃣ Отсутствие поля TYPE_HASH в составе подписи

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

2️⃣ Пропуск полей в TYPE_HASH при кодировании

TYPE_HASH добавили, но описали не все поля.


// Забыли поле expiredTime, но ниже поле используется
bytes32 private constant TYPE_HASH = keccak256("Order(address user,uint256 nonce)");

...

// recoverSignature(user, nonce, expiredTime);

Часто бывает и наоборот, TYPE_HASH описан правильно, но при восстановление подписи пропустили пару полей.

3️⃣ Ошибка кодирования динамических типов

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


keccak256(args.data) // encode bytes
keccak256(abi.encodePacked(args.str)) encode string

4️⃣ Ошибка кодирования ссылочных типов

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

В кодировании массивов разработчики часто забывают, что это должен быть хеш от набора байт всех элементов массива keccak256(abi.encodePacked(array)).

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


keccak256(abi.encode(
    PARENT_TYPE_HASH,
    keccak256(abi.encode(
        CHILD_TYPE_HASH, 
         ... // chield fields
     )),
      ... // parent fields
))

5️⃣ Подпись не защищена от повторного использования

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

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

Вывод

Я сам помню на сколько мне тяжело давалось чтение спецификации стандарта EIP-712, когда я был молодым. Я тоже допускал ошибки, поэтому призываю не осуждать).

Копнуть EIP-712 поглубже можно со мной в нашем wiki.

@pnaydanovgoo

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

Из чего состоит MeyerSAN — решение для имитации ошибок в СХД

Проект MeyerSAN — это программно-аппаратный комплекс на основе сервера VEGMAN. Комплекс имитирует неисправность SAS HDD и SSD и позволяет автоматически тестировать реакцию системы хранения данных на ошибки. Решение необходимо для тестирования и валидации работы подсистем, которые находятся в составе СХД и определяют проблемные диски. 

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

  1. Мы подключаем сервер к системе хранения данных. 

  2. С помощью ПО и драйверов заставляем СХД видеть сервер как диск или несколько дисков.

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

Задача MeyerSAN — эмулировать проблемы с дисками: задержки, ошибки, порчу данных и метаданных.

Архитектура MeyerSAN состоит из трех больших блоков: 

  1. REST, так называемый MRSNMGMT. Позволяет конфигурировать систему в соответствии с пожеланиями.

  2. MRSNLib. Cодержит бизнес-логику приложения: обработку и модификацию команд.

  3. Драйверы низкого уровня. Они предоставляют нам механизмы транспорта и позволяют соответствовать всем протоколам.

Средний компонент, MRSNLib, команда разработчиков написала на современном С++ 23. Как именно инженерам удалось интегрировать новейший стандарт, а также паттерны объектно-ориентированного программирования в проект MeyerSAN, рассказывает один из создателей проекта Константин Крюков в новой статье.

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

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

Обновлён бесплатный обучающий Python репозиторий «Think Python, 3rd edition» на GitHub, где есть вся база от основ синтаксиса до продвинутых концепций ООП. Материалы четко структурированы, множество примеров кода. Все оформлено в Jupyter‑notebook — материал легко читается, а по содержанию легко найти нужный раздел.

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

АГЕНТЫ И АГЕНТНАЯ ЭКОНОМИКА. 17.07.25.

Микро-дайджест недели.

=> Если мы будем следить за ходом их мысли (рассуждениями ИИ-агентов), то мы сможем лучше их понимать и управлять ими. Этот манифест за безопасность Chain of Thought Monitorability подписали вчера ведущие исследователи индустрии.

Но по факту весь ризонинг, демонстрируемый пользователю, может оказаться внешней декорацией, а решение LLM может принимать исходя из совершенно другой логики и других связей, то есть не тех, которые они демонстрируют в цепочках рассуждений. Другое дело с мультиагентными системами, там есть возможность сохранить прозрачность, даже в случае деградации "честного" Chain-of-Thought у отдельных моделей.

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

=> Не любите вайб дебаггинг также как и я? На подходе инженер Azimov, и его ключевое отличие от текущих код-генераторов в том, что он не только генерит код, по словам разработчика он его будет "понимать".

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

=> Деньги любят тишину. Я попробовал угадать, что за продукт выкатит бывшая CTO Open AI Мира Мурати, которая недавно подняла еще 2 млрд $ на seed-раунде при оценке 12 млрд $, при этом никто не знает, а чем собственно занимается ее стартап Thinking Machines Lab AI. Читайте в новой статье

=> Open Deep Research это агент для глубоких исследований с открытым исходным кодом, созданный на основе LangGraph и совместимый с вашими источниками данных, LLM и MCP-серверами. Подробно в блоге

И краткий обзор на YT демонстрирующий архитектуру такого агента и принципы разработки, как запустить агента локально с помощью LangGraph Studio и как быстро протестировать его с помощью Open Agent Platform.

=> AWS стремится стать универсальным центром для ИИ-агентов от Anthropic, IBM, Perplexity и других. Amazon Bedrock AgentCore - ожидаемый релиз комплексного подхода AWS для создания и развертывания различных ИИ-агентов. Одно место, любые агенты, все под рукой. Иначе бизнес начинает сходить с ума от разнообразия выбора, в котором он в общей массе не очень то пока разбирается.

AWS представил комплексный набор сервисов корпоративного уровня, которые помогают разработчикам быстро и безопасно развертывать и эксплуатировать ИИ-агенты в любом масштабе, используя любую платформу и модель, размещенную на Amazon Bedrock или в другом месте. Здесь все подробности. А здесь коротко в видео на YT.

=> Хотите собирать низко висящие фрукты лиды? Есть такое решение Orange Slice. Они собирают разные рыночные сигналы по вашим ICP и определяют тех, кто заинтересуется вашим продуктом, а затем преподносят вам их словно "на блюдечке", с различными нюансами и деталями, так что остается только продать 😉

=> Посмотрите на Runway Act-Two - я впечатлен, модель захвата движения нового поколения с существенным улучшением качества и поддержкой отслеживания головы, лица, тела и рук. Для Act-Two требуется только видеозапись движения и референсный персонаж.

Lionsgate и AMC Networks уже участвуют в проекте, изучая модель будущих производственных процессов для Голливуда.

=> И напоследок, вот такой фреймворк, эмулирующий функциональность Grok Heavy с помощью мультиагентной оркестровки. И никаких $300

***

Предыдущие материалы и выпуски дайджеста, там до сих пор много интересных инсайтов. Более 50% из них имеют длинный горизонт актуальности. О новых бизнес-моделях и ИИ-стартапах: Айвентор и Фред

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

Сегодня у нас задачка с подвохом для тех, кто пишет на Java. Какой результат будет выведен в консоль? Пишите в комментариях!

import java.util.stream.Stream;
public class Main {
    public static void main(String[] args) {
        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
        Integer result = prepareStream(stream);
        System.out.printf("Result after stream processing: %s%n", result);
    }

    private static Integer prepareStream(Stream<Integer> stream) {
        System.out.printf("Incoming stream with: %d elements%n", stream.count());
        return stream
                .map(integer -> integer++ + ++integer)
                .filter(integer -> integer % 3 == 0)
                .reduce(0, Integer::sum);
    }
}

Дальше будет решение, поэтому если не хотите спойлеров — не читайте!

.

.

.

Подвох в том, что будет выброшено исключение:

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
 at java.base/java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
 at java.base/java.util.stream.ReferencePipeline.<init>(ReferencePipeline.java:96)
 at java.base/java.util.stream.ReferencePipeline$StatelessOp.<init>(ReferencePipeline.java:800)
 at java.base/java.util.stream.ReferencePipeline$3.<init>(ReferencePipeline.java:191)
 at java.base/java.util.stream.ReferencePipeline.map(ReferencePipeline.java:190)
 at Main.prepareStream(Main.java:16)
 at Main.main(Main.java:7)

Исключение выбрасывается из-за того, что при выводе в консоль лога с количеством элементов стрима мы использовали операцию stream.count(), которая является терминальной и делает дальнейшее использование стрима невозможным.

System.out.printf("Incoming stream with: %d elements%n", stream.count());

Ну а после того, как мы избавимся от лога, который нам все ломает, правильный ответ будет — 18.

С учетом postfix и prefix инкремента числа в каждой итерации мы получаем:
.map(1 → 1 + 3)...(5 → 5 + 7)

Потом после фильтрации по делению на 3 без остатка в стриме остаются числа 6 и 12. И при помощи операции reduce() находим сумму этих чисел.

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

Автоматическое добавление номера задачи в коммит

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

В своей работе я придерживаюсь структурированного подхода к именованию веток и сообщений коммитов. Подробнее об этом можно почитать здесь:
📎 https://habr.com/ru/articles/820547/

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

Почему это удобно?

Указание номера задачи позволяет быстро понять, какие именно тикеты попадают в релиз. Особенно это помогает при ревью и при деплое.

Пример структуры ветки:

feat/dev-123_filter или fix/dev-432_filter

Сообщения коммитов я пишу в следующем формате:

dev-123 | настроил сортировку в фильтре

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

Скрипт prepare-commit-msg

#!/bin/sh

COMMIT_MSG_FILE=".git/COMMIT_EDITMSG"
BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)

if echo "$BRANCH_NAME" | grep -qE 'dev-[0-9]+'; then
  TASK_ID=$(echo "$BRANCH_NAME" | grep -oE 'dev-[0-9]+')

  if ! grep -q "$TASK_ID" "$COMMIT_MSG_FILE"; then
    sed -i.bak "1s/^/$TASK_ID | /" "$COMMIT_MSG_FILE"
    rm -f "$COMMIT_MSG_FILE.bak"
  fi
fi

Скрипт нужно сохранить как .git/hooks/prepare-commit-msg и сделать исполняемым:

chmod +x .git/hooks/prepare-commit-msg

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

  • COMMIT_MSG_FILE — путь до файла, в который Git записывает текст коммита.

  • BRANCH_NAME — название текущей ветки.

  • Сначала проверяется, есть ли в названии ветки номер задачи (dev-123).

  • Если он найден и ещё не указан в коммите — скрипт добавляет его в начало первой строки сообщения.

Таким образом, ваш коммит автоматически будет выглядеть так:

dev-123 | добавил пагинацию в список товаров

Вроде мелочь, а приятно — экономит время и упрощает навигацию по истории коммитов.

Если будет интересно — это и другие полезные скрипты, на моём GitHub

https://github.com/prog-time

Спасибо за внимание! ✌️

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

Откровения евангелистов БЯМ (LLM) для целей софтостроения генерируются публикуются с высокой скоростью. Не только на хабре, LinkedIn заполнен ими "под завязку". Прочитывать всё невозможно, да и не нужно, но некоторый тренд в изложении присутствует.

К сожалению, авторы много пишут о процессе, забывая собственно цели. Упоминание о функциональной сложности программы, как правило, отсутствует. Длина описаний процесса может создать ложное впечатление о развесистой функциональности, хотя большинство примеров находятся на уровне "записная книжка". В этом нет ничего плохого, просто не забываем, что 30 лет назад RAD типа Delphi умели создавать такие же "книжки" без написания кода вообще: достаточно было "накидать" компонентов на форму, настроить, связать их, и нажать "Run".

Накидали, и что дальше?

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

Размер спецификаций псевдокода вкупе с описаниями контекста среды могут превзойти собственно размеры генерируемого кода, написанного программистом на формальном ЯВУ. Спецификации придется так же хранить в Git, и нервно просматривать, что же изменилось в сценариях, почему, ***, вместо слова "опять" кто-то написал "снова".

Для детерминированности процесса желательно, чтобы моделька была в том же состоянии, что и на предыдущем этапе генерации, но для внешних БЯМ-сервисов это недостижимо. Напомню, что компиляторы и классические генераторы кода (CASE, MDD) - детерминированные.

На первый план выходят тесты, их нужно писать "больше и лучше", потому что под капотом теперь только "черный ящик", "белого" больше нет. Тесты нужно постоянно обновлять в зависимости от объема изменений. Если ваши новые спецификации меняют 20% существующей кодовой базы, то тестов придется менять вдвое больше, принимая 2:1 за стандартное соотношение тестов к коду. Для языков без статической типизации тестирование еще более усложняется.

В реальных проектах написание сотен строк в день - это режим стартапа, причем на "нулевом цикле". Достаточно быстро программист приходит к естественной норме десятков строк в день, остальное время занимает понимание текущего потока проблем, поиск ошибок, интеграция и стабилизация. Хороший программист минимизирует объем порождаемого кода. Нужно ли включать БЯМ для написания 50 строк в день - вопрос.

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

Напоследок накину немного философского. Евангелисты любят упоминать, что человеческий мозг и БЯМы работают на одних и тех же принципах. Часто выясняется, что курса "Аналоговые ЭВМ" на их потоке уже не было, что несколько удручает. Еще более простой вопрос на примере несуществующей (пока?) телепортации: "Человек на входе телепортера и на выходе - это одна и та же личность?"

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

One Day Offer для разработчиков, аналитиков, тестировщиков 1С от Ozon Tech

Сразу 9 команд в поиске специалистов, которые уже проектировали и внедряли 1С-решения в крупных IT-компаниях. Получить оффер в Ozon Tech можно всего в 3 шага.
1С в Ozon — не просто ещё одна платформа. Это система учёта ведущего e-com России с охватом в 10 стран. В ней всё — от тарифов для селлеров из Еревана до графика работы ПВЗ в Караганде. 

Кто нам нужен? 
Опытные специалисты с глубокой экспертизой — разработчики, тестировщики, аналитики.
Вакансии открыты в 9 команд, и во всех — нешаблонные задачи на пределе возможностей 1С.
Подать заявку до 15 июля. 

Как всё пройдёт?
Онлайн и по расписанию. Даты интервью можно изменить по договорённости.
17.07 — знакомство с командами в формате презентации и Q&A — до 30 минут.
18.07 — техническое интервью, основанное на реальных задачах — 60-90 минут.
19.07 — финальное интервью с тимлидом — до 60 минут.

Почему стоит участвовать?
Во-первых, потому что мы — Ozon Tech, наши проекты вдохновляющие и перспективные, а условия — на высшем уровне бигтеха.

Во-вторых, в таком формате вы получаете максимум результата при минимальных затратах, как временных, так и эмоциональных: мы сократили 1 этап интервью и с оффером вернемся в день проведения финального интервью. 

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

Присылайте его сюда, как закончите: https://s.ozon.ru/WfnJy67

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