и посмотреть медиа
Backend - программисты
и посмотреть медиа
Backend разработчики.
AI бот для озвучки текста и клонирования голоса в Telegram. Создавай аудио с помощью нейросети быстро и просто.
Комьюнити backend-программистов: Python, Java, Golang, PHP, DevOps.
🤔 Как "под капотом" работает аннотация transactional ? 🟠Создание прокси Spring обнаруживает @Transactional и создает прокси для класса или метода. 🟠Перехват вызова Прокси перехватывает вызов метода, аннотированного @Transactional. 🟠Начало транзакции Прокси делегирует управление TransactionInterceptor, который начинает транзакцию через PlatformTransactionManager. 🟠Выполнение метода Исходный метод выполняется. 🟠Фиксация или откат транзакции Если метод завершился успешно, транзакция фиксируется (commit). Если метод выбросил исключение, транзакция откатывается (rollback). Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что знаешь о хеш функции? Хеш-функция — это функция, которая принимает входные данные (ключ) и возвращает фиксированное число, называемое хешем (или хеш-значением). Основная цель хеш-функции — преобразовать произвольные данные в числовое значение определенного диапазона. 🚩Основные свойства хеш-функции: 🟠 Детерминированность: Хеш-функция всегда должна возвращать одно и то же хеш-значение для одного и того же входного значения. 🟠Равномерное распределение: Хорошая хеш-функция должна равномерно распределять хеш-значения по всему диапазону, чтобы минимизировать количество коллизий. 🟠Быстрота вычисления: Хеш-функция должна быть достаточно быстрой, чтобы не замедлять общую производительность алгоритмов, которые её используют. 🟠Минимизация коллизий: Коллизия возникает, когда два разных входных значения дают одно и то же хеш-значение. Хорошая хеш-функция должна минимизировать вероятность таких случаев. 🚩Применение хеш-функций: 🟠Хеш-таблицы: Используются для вычисления индекса массива, где будет храниться значение, связанное с ключом. Это позволяет быстро выполнять операции вставки, удаления и поиска. 🟠Криптография: Криптографические хеш-функции (например, SHA-256, MD5) используются для обеспечения целостности данных, создания цифровых подписей и безопасного хранения паролей. 🟠Контроль целостности данных: Хеш-функции применяются для проверки целостности данных при передаче или хранении, позволяя выявлять ошибки или изменения в данных. 🟠Генерация уникальных идентификаторов: Хеш-функции используются для генерации уникальных идентификаторов (например, UUID), основываясь на входных данных. 🚩Примеры хеш-функций 🟠Простая хеш-функция: Эта функция возвращает остаток от деления длины ключа на размер таблицы. Она проста, но не обеспечивает равномерное распределение. def simple_hash(key, table_size): return len(key) % table_size 🟠Хеш-функция для строк (например, DJB2): def djb2_hash(key): hash_value = 5381 for char in key: hash_value = ((hash_value
Открыть канал и посмотреть медиа🤔 Из чего состоит запрос на сервере? Запрос на сервере состоит из нескольких ключевых компонентов, которые обеспечивают передачу данных и инструкций от клиента к серверу. 🟠Стартовая линия (Request Line) Метод: Определяет тип запроса и действия, которые должен выполнить сервер. Основные методы включают: GET: Запрос на получение данных с сервера. POST: Отправка данных на сервер для обработки (например, форма). PUT: Замена существующего ресурса на сервере. DELETE: Удаление ресурса с сервера. PATCH: Частичное обновление ресурса. URI (Uniform Resource Identifier): Указывает путь к ресурсу на сервере. Версия протокола HTTP: Определяет используемую версию HTTP, например, HTTP/1.1. 🟠Заголовки (Headers) Метаданные, которые предоставляют дополнительную информацию о запросе. Примеры заголовков: Host: Указывает имя хоста и, возможно, номер порта сервера (например, Ссылка скрыта User-Agent: Информация о клиентском приложении, совершающем запрос (например, браузер). Accept: Типы данных, которые клиент готов принять (например, text/html, application/json). Content-Type: Тип данных, передаваемых в теле запроса (например, application/json для JSON данных). Authorization: Информация для аутентификации, если запрос требует авторизации. 🟠Тело запроса (Body) Содержит данные, отправляемые на сервер. Тело запроса используется в методах POST, PUT, PATCH для передачи данных, таких как формы, файлы или JSON-объекты. Для методов GET и DELETE тело запроса обычно не используется. 🚩Зачем нужны эти компоненты 🟠Метод и URI Метод определяет действие, которое клиент хочет выполнить, а URI указывает конкретный ресурс, к которому это действие применяется. Это основа понимания сервером того, что именно клиент запрашивает. 🟠Заголовки Заголовки предоставляют контекст и дополнительную информацию, необходимую для корректной обработки запроса. Они могут содержать данные о клиенте, указывать формат передаваемых данных, управлять кэшированием и аутентификацией. 🟠Тело запроса Тело запроса содержит основное содержание, которое клиент хочет передать на сервер. Например, данные формы, JSON-объекты или файлы. Без тела запроса невозможно передать на сервер данные, которые необходимо обработать. POST /submit-form HTTP/1.1 Host: Ссылка скрыта User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: 27 name=John+Doe&age=30 Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что делает код хорошим? Это код, который легко читать, понимать, поддерживать и расширять. Он эффективно решает поставленные задачи и соответствует требованиям качества, которые важны для конкретного проекта и команды. 🟠 Читаемость Код должен быть понятным для других разработчиков, даже если они не знакомы с проектом. Использование осмысленных имён для переменных, функций и классов, а также наличие чётких комментариев помогают быстрее понять логику программы. Читаемый код снижает риск ошибок при поддержке и улучшении, упрощает ревью и обучение новых участников команды. 🟠Поддерживаемость Код должен легко поддаваться изменениям, чтобы можно было адаптировать его под новые требования или исправлять ошибки. Это достигается за счёт модульности, изолирования логики и избегания «жёсткого» связывания частей кода. Хорошая структура и стандартизация, такие как следование принципам SOLID или архитектурным шаблонам (например, MVC), делают код более устойчивым. 🟠 Простота Хороший код решает задачи самым простым и прямым способом. Простой код легче читать, тестировать и отлаживать. Он избегает ненужных усложнений и излишних абстракций, но при этом остаётся гибким. Следование принципу KISS (Keep It Simple, Stupid) и принципу YAGNI (You Aren't Gonna Need It) помогает держать код простым. 🟠Эффективность Код должен быть оптимизирован для выполнения задачи без избыточного потребления ресурсов, таких как время выполнения и память. Хотя преждевременная оптимизация нежелательна, хороший код учитывает производительность и избегает явных узких мест. Понимание алгоритмов и структур данных помогает писать эффективный и быстрый код. 🟠 Тестируемость Хороший код легко тестировать. Это означает, что его можно покрыть модульными, интеграционными и системными тестами. Тестируемость обеспечивается за счёт слабого сцепления и высокой связанности, а также соблюдения принципов инверсии зависимостей. Код, который легко тестировать, позволяет быстрее находить и исправлять ошибки, что повышает общую надёжность. 🟠 Гибкость и расширяемость Хороший код легко адаптируется к изменяющимся требованиям. Новые функции можно добавлять без значительных изменений существующей логики. Это достигается благодаря слабому сцеплению и высокой связанности, применению шаблонов проектирования и принципов SOLID. 🟠Документированность Хотя код должен быть самодокументируемым, иногда необходимы комментарии и документация, чтобы объяснить сложную логику, архитектурные решения или нюансы реализации. Хорошая документация помогает быстрее разобраться в коде и понять его использование. 🟠Соответствие стилю и стандартам Код должен соответствовать общим стандартам стиля, принятым в проекте или языке. Это делает его единообразным и легко читаемым для других участников команды. Использование линтеров, форматтеров и следование общеотраслевым стандартам (например, PEP8 для Python) помогает поддерживать единый стиль. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что знаешь про нормализацию? Это процесс организации данных в реляционной базе данных для минимизации избыточности и предотвращения аномалий при обновлении данных. 🟠1NF (Первая нормальная форма) Каждое поле содержит только одно значение, и все записи уникальны. 🟠2NF (Вторая нормальная форма)Данные находятся в 1NF, и все неключевые атрибуты полностью зависят от первичного ключа. 🟠3NF (Третья нормальная форма) Данные находятся в 2NF, и нет транзитивных зависимостей между неключевыми атрибутами. 🟠BCNF (Бойс-Кодд нормальная форма) Данные находятся в 3NF, и каждый детерминант является суперключом. 🟠4NF (Четвертая нормальная форма) Данные находятся в BCNF, и нет многозначных зависимостей. 🟠5NF (Пятая нормальная форма) Данные находятся в 4NF, и каждая зависимость выражается через проекции. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Для чего можно использовать celery? Celery поддерживает различные брокеры сообщений, включая RabbitMQ и Redis, для управления очередями задач. 🚩Основные возможности 🟠Асинхронное выполнение задач Позволяет запускать длительные операции в фоновом режиме, освобождая основной поток выполнения приложения для других задач. 🟠Планирование задач Поддержка периодических и плановых заданий, что позволяет автоматизировать повторяющиеся процессы. 🟠Управление распределёнными системами Способен управлять задачами в распределенной системе, используя несколько рабочих узлов (workers) для параллельного выполнения задач. 🟠Масштабируемость Легко масштабируется, добавляя больше рабочих узлов для увеличения производительности. 🚩Основные задачи 🟠Фоновые задачи Отправка электронной почты: Асинхронная отправка писем для улучшения производительности веб-приложений. Обработка данных: Включает такие задачи, как анализ данных, обработка изображений или видео, преобразование форматов и другие ресурсоемкие операции. Взаимодействие с API: Выполнение запросов к внешним API, которое может быть долгим или неэффективным при синхронном выполнении. 🟠Периодические задачи Обновление данных: Регулярное обновление кэшей, индексов поиска или других данных в базе данных. Мониторинг и сбор метрик: Периодический сбор и обработка метрик для мониторинга состояния системы. Очистка данных: Периодическая очистка устаревших или временных данных из базы данных. 🟠Уведомления и оповещения Уведомления в реальном времени: Отправка уведомлений пользователям через различные каналы (email, SMS, push-уведомления). Событийное оповещение: Реагирование на события и триггеры, такие как изменения в базе данных или действия пользователя. 🟠Работа с большими данными и машинным обучением Параллельная обработка данных: Выполнение параллельных вычислений для обработки больших объемов данных. Машинное обучение: Асинхронное обучение моделей и выполнение предсказаний на больших наборах данных. 🟠Веб-скрейпинг и интеграция данных Веб-скрейпинг: Асинхронный сбор данных с веб-сайтов для агрегации или анализа. Интеграция данных: Асинхронная интеграция данных из различных источников и API. 🚩Примеры использования 🟠Веб-приложения Улучшение производительности веб-приложений за счет выполнения долгих операций в фоне. 🟠Электронная коммерция Обработка заказов, обновление статусов заказов и управление инвентарем в фоновом режиме. 🟠Социальные сети Обработка пользовательских данных, отправка уведомлений и обновление лент новостей. 🟠Научные исследования Выполнение сложных вычислений и обработка больших объемов данных в распределенной среде. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Обеспечение отказоустойчивости веб-приложения Это процесс создания системы, которая продолжает корректно работать даже при частичных сбоях. Отказоустойчивость позволяет приложению оставаться доступным, минимизировать потери данных и поддерживать положительный пользовательский опыт в случае непредвиденных ситуаций. 🚩Методы 🟠Использование балансировщиков нагрузки Балансировщики нагрузки распределяют входящий трафик между несколькими серверами, чтобы снизить нагрузку на отдельные серверы и избежать перегрузок. В случае сбоя одного сервера запросы автоматически перенаправляются на работающие экземпляры. Использование балансировщика повышает масштабируемость системы, поскольку позволяет легко добавлять или убирать серверы по мере необходимости. 🟠Горизонтальное масштабирование и кластеризация Развертывание приложения на нескольких серверах (в кластере) позволяет избежать единой точки отказа (SPOF — Single Point of Failure). Горизонтальное масштабирование даёт возможность добавлять дополнительные серверы при увеличении нагрузки, что повышает отказоустойчивость и общую производительность системы. Сервисы, такие как Kubernetes и Docker Swarm, упрощают управление и оркестрацию контейнеров в кластере, автоматизируя процесс развертывания, обновлений и балансировки нагрузки. 🟠Механизмы резервного копирования и репликации данных Важные данные должны регулярно сохраняться в резервных копиях и реплицироваться на несколько узлов или в несколько дата-центров. Репликация базы данных (например, master-slave или master-master репликация) обеспечивает доступность данных, даже если один из узлов выходит из строя. Для обеспечения целостности данных реплики могут быть синхронными (обеспечивают актуальность данных на всех узлах, но добавляют задержку) или асинхронными (с меньшей задержкой, но возможностью устаревания данных). 🟠Кеширование и использование CDN Использование кешей (Redis, Memcached) снижает нагрузку на базу данных и позволяет быстрее обрабатывать запросы, снижая риски сбоев из-за высокой нагрузки. Content Delivery Network (CDN) распределяет контент по серверам, находящимся близко к пользователю. Это снижает нагрузку на основной сервер и обеспечивает доступность контента в случае перегрузки или отказа в одном из центров обработки данных. 🟠Автоматическое восстановление и мониторинг системы Настройка систем мониторинга (например, Prometheus, Grafana, New Relic) позволяет оперативно выявлять сбои и реагировать на проблемы. Системы автоматического восстановления могут перезапускать упавшие серверы или контейнеры. Например, инструменты оркестрации, такие как Kubernetes, могут автоматически восстанавливать неработающие контейнеры. Настройка системы оповещений для обнаружения потенциальных проблем (например, медленного ответа сервера) позволяет вовремя реагировать на них и предотвращать крупные сбои. 🟠Использование очередей сообщений Для работы с критически важными задачами, которые могут быть временно отложены, целесообразно использовать системы очередей сообщений (например, RabbitMQ, Kafka). Очереди позволяют обрабатывать запросы асинхронно, обеспечивая бесперебойную работу системы при перегрузках. Если один компонент выходит из строя, другой может продолжить обработку сообщений из очереди после восстановления. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что означает принцип open closed? Принцип "открытости/закрытости" (Open/Closed Principle, OCP) — это один из пяти принципов SOLID, разработанных для создания устойчивого и легко поддерживаемого кода в объектно-ориентированном программировании. Принцип был предложен Бертраном Мейером в 1988 году и заключается в следующем: 🚩Что это означает 🟠Открыты для расширения Поведение класса можно расширить, добавив новый код. Это достигается путем создания новых классов, которые наследуют или композируют существующие классы, или путем использования интерфейсов и абстрактных классов. 🟠Закрыты для модификации Существующий код класса не должен изменяться. Это помогает избежать ошибок, которые могут возникнуть при изменении уже протестированного и проверенного кода. Без соблюдения принципа OCP public class Shape { public void drawCircle() { // рисуем круг } public void drawSquare() { // рисуем квадрат } } public class GraphicEditor { private Shape shape; public GraphicEditor(Shape shape) { this.shape = shape; } public void draw(String shapeType) { if (shapeType.equals("circle")) { shape.drawCircle(); } else if (shapeType.equals("square")) { shape.drawSquare(); } } } С соблюдением принципа OCP public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { // рисуем круг } } public class Square implements Shape { @Override public void draw() { // рисуем квадрат } } public class GraphicEditor { private Shape shape; public GraphicEditor(Shape shape) { this.shape = shape; } public void draw() { shape.draw(); } } 🚩Плюсы ➕Повышение гибкости Система становится более гибкой и расширяемой, так как новые функциональности добавляются без изменения существующего кода. ➕Уменьшение количества ошибок Снижается вероятность введения ошибок в существующий код, так как изменения сосредоточены в новых классах. ➕Упрощение тестирования Легче тестировать новые компоненты отдельно, не затрагивая и не изменяя существующие. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое Docker? Docker - это платформа для автоматизации развёртывания, масштабирования и управления контейнеризированными приложениями. Она позволяет разработчикам создавать, тестировать и разворачивать приложения в изолированных средах, называемых контейнерами. 🚩Основные компоненты Docker 🟠Docker Engine Это серверное ПО, которое запускает и управляет контейнерами. Состоит из двух частей: Docker Daemon: Служба, которая управляет всеми объектами Docker (контейнерами, образами и т.д.). Docker CLI: Командная строка, через которую пользователи взаимодействуют с Docker Daemon. 🟠Образы (Images) Это шаблоны для создания контейнеров. Образ включает в себя все зависимости, библиотеки, конфигурационные файлы, скрипты и код, необходимый для запуска приложения. 🟠Контейнеры (Containers) Это изолированные среды, в которых выполняются приложения. Контейнеры создаются на основе образов и содержат всё необходимое для работы приложения. 🟠Docker Hub Это облачный сервис для хранения и распределения Docker-образов. Разработчики могут загружать свои образы в Docker Hub и делиться ими с другими пользователями. 🟠Docker Compose Это инструмент для определения и управления многоконтейнерными Docker-приложениями. С помощью файла docker-compose.yml можно описать конфигурацию всех контейнеров, сетей и томов, необходимых для работы приложения. 🚩Плюсы ➕Изоляция Каждый контейнер работает в своей собственной изолированной среде, что предотвращает конфликты между приложениями. ➕Портативность Образы Docker могут работать на любом сервере с установленным Docker, независимо от операционной системы. ➕Масштабируемость Контейнеры можно легко масштабировать в зависимости от нагрузки. ➕Быстрое развёртывание Контейнеры запускаются гораздо быстрее, чем виртуальные машины. ➕Упрощение CI/CD Docker интегрируется с системами непрерывной интеграции и доставки, упрощая процессы разработки и развёртывания. 🚩Основные команды docker build: Создание образа из Dockerfile. docker run: Запуск нового контейнера из образа. docker ps: Список запущенных контейнеров. docker stop: Остановка работающего контейнера. docker rm: Удаление остановленного контейнера. docker pull: Загрузка образа из Docker Hub. docker push: Загрузка образа в Docker Hub. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаТолько зарегистрированные пользователи могут делиться своим мнением.
Станьте первым, кто поделится своим впечатлением об этом ресурсе!