BackendQuiz - задачи с собеседований по бэкенду
СтатистикаЗадачки на алгоритмы, на понимание HTTP и сетевого стека вцелом, так же базы данных и хранилища. Подойдет как для начинающих так и для опытных. Языки и технологии: Java, PHP, Ruby, Javascript, SQL Контакт: @cyberJohnny
- Последний пост
- 12:05
- Последнее чтение
- 16:53
- Постов за неделю
- 7
- Всего постов
- 24
- Тип
- открытый
- Язык
- русский
- Категория
- Технологии
- В каталоге с
- 13 авг.
- 1/24сутки в ленте
- 75
- 1/48двое суток
- 85
- 1/72трое суток
- 92
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
🤔 Что такое join'ы? Это операции в языке SQL, которые позволяют объединять строки из двух или более таблиц на основе логических связей между ними. Существует несколько типов JOIN'ов, каждый из которых используется для разных сценариев объединения данных. 🚩Основные типы JOIN'ов 🟠INNER JOIN Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах. SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.id; 🟠LEFT JOIN (LEFT OUTER JOIN) Возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадений нет, то в столбцах правой таблицы будут NULL. SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id; 🟠RIGHT JOIN (RIGHT OUTER JOIN) Возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если совпадений нет, то в столбцах левой таблицы будут NULL. SELECT employees.name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id; 🟠FULL JOIN (FULL OUTER JOIN) Возвращает все строки, когда есть совпадения в одной из таблиц. Если совпадений нет, то в соответствующих столбцах будут NULL. SELECT employees.name, departments.department_name FROM employees FULL JOIN departments ON employees.department_id = departments.id; 🟠CROSS JOIN Возвращает декартово произведение строк из двух таблиц. Каждая строка из первой таблицы соединяется со всеми строками из второй таблицы. SELECT employees.name, departments.department_name FROM employees CROSS JOIN departments; 🟠SELF JOIN Использует JOIN для объединения таблицы с самой собой. Это полезно, когда нужно сравнить строки внутри одной таблицы. SELECT e1.name AS Employee1, e2.name AS Employee2 FROM employees e1 INNER JOIN employees e2 ON e1.manager_id = e2.id; Ставь 👍 и 📚 @backendquiz
🤔 Основные подводные камни удалённых вызовов? Это технология, позволяющая приложениям вызывать функции или процедуры, которые выполняются на удалённом сервере, как если бы они были локальными. Несмотря на удобство, такая модель имеет ряд подводных камней, которые необходимо учитывать при проектировании и разработке распределённых систем. 🟠Скрытие распределённости Удалённые вызовы маскируют тот факт, что операция выполняется через сеть. Это может создать ложное чувство локальности у разработчиков, которые не учитывают: Сетевую задержку: вызовы занимают больше времени, чем локальные операции, особенно при медленных сетях. Сетевые сбои: соединение может быть потеряно, что приведёт к ошибкам выполнения или длительным тайм-аутам. Изменение задержки: время выполнения одного и того же вызова может существенно варьироваться в зависимости от сетевых условий. 🟠Обработка ошибок Обработка ошибок в распределённых системах сложнее, чем при локальных вызовах: Необходимо обрабатывать такие ошибки, как потеря соединения, тайм-ауты, отказ сервера. В некоторых случаях может возникнуть "проблема повторного вызова" (например, запрос был выполнен, но подтверждение потерялось), что приводит к возможной идемпотентности операций. 🟠Сериализация и десериализация данных Для передачи данных через сеть они должны быть преобразованы в сериализованный формат. Это может: Увеличивать задержки из-за времени, необходимого на преобразование. Создавать проблемы совместимости, если клиент и сервер используют разные версии протокола. Усложнять отладку и диагностику ошибок в данных. 🟠Распределённая согласованность Взаимодействие между распределёнными компонентами приводит к необходимости поддерживать согласованность данных: Проблема согласованности особенно актуальна при частичных отказах системы. Может потребоваться использование распределённых транзакций, что усложняет архитектуру. 🟠Проблемы безопасности Удалённые вызовы подвержены угрозам: Необходимо обеспечивать шифрование данных, чтобы избежать утечек. Аутентификация и авторизация играют ключевую роль в защите системы. Возможны атаки на уровень сети или использование слабостей в протоколах передачи данных. 🟠Балансировка нагрузки и масштабирование При большом числе клиентов сервер может стать узким местом: Нагрузка на сервер может привести к деградации производительности. Требуется правильная стратегия масштабирования и балансировки нагрузки, например, использование нескольких серверов или очередей сообщений. 🟠Выбор протокола и технологий Различные протоколы (например, HTTP, gRPC, Thrift) обладают своими особенностями: Протокол может накладывать ограничения на производительность и возможности. Ошибки конфигурации или несоответствие версий могут вызвать проблемы. 🚩Как это используется 🟠Для создания распределённых систем Микросервисные архитектуры. Взаимодействие клиент-сервер (например, мобильное приложение и API). Системы с тяжёлой серверной логикой. 🟠Чтобы избежать подводных камней Чётко проектировать архитектуру, учитывая особенности сети. Использовать идемпотентные операции. Обеспечивать надёжные стратегии обработки ошибок. Применять мониторинг и трассировку (например, OpenTelemetry) для отслеживания поведения системы. Ставь 👍 и 📚 @backendquiz
🤔 Как работает хеш таблица? Это структура данных, которая позволяет эффективно хранить и извлекать пары "ключ-значение". Она использует хеш-функцию для преобразования ключа в индекс массива, где хранится соответствующее значение. 🚩Основные концепции 🟠Хеш-функция Это функция, которая принимает ключ и возвращает индекс массива, где должно храниться значение. Хорошая хеш-функция должна равномерно распределять ключи по всему пространству индексов, чтобы минимизировать количество коллизий. 🟠Коллизии Это ситуации, когда два разных ключа хешируются в один и тот же индекс. Существуют различные методы разрешения коллизий: Метод цепочек (chaining): В каждой ячейке массива хранится список (или другая структура данных), содержащий все значения, соответствующие этому индексу. Открытая адресация (open addressing): При коллизии ищется другая свободная ячейка по определённому алгоритму (например, линейное пробирование, квадратичное пробирование или двойное хеширование). 🟠Размер хеш-таблицы Количество ячеек (бакетов) в массиве. Оптимальный размер зависит от количества ключей и используемой хеш-функции. Обычно размер выбирается простым числом для уменьшения вероятности коллизий. 🚩Как работает хеш-таблица 🟠Вставка элемента Хеш-функция вычисляет индекс для ключа. Если ячейка пуста, значение записывается в неё. Если ячейка занята (коллизия), применяется выбранный метод разрешения коллизий. 🟠Поиск элемента Хеш-функция вычисляет индекс для ключа. Проверяется ячейка по этому индексу. Если ключи совпадают, возвращается значение. Если ключи не совпадают (коллизия), применяется метод разрешения коллизий до нахождения нужного ключа или пустой ячейки (что означает отсутствие ключа). 🟠Удаление элемента Хеш-функция вычисляет индекс для ключа. Элемент удаляется, после чего может потребоваться перемещение других элементов для предотвращения разрыва цепочек или нарушения последовательности в открытой адресации. Ставь 👍 и 📚 @backendquiz
🤔 В чём различие между LeftJoin , RightJoin и InnerJoin ? В SQL, JOIN операторы используются для объединения строк из двух или более таблиц на основе логического отношения между ними. Вот различия между LEFT JOIN, RIGHT JOIN и INNER JOIN: 🟠`INNER JOIN` INNER JOIN возвращает только те строки, которые имеют совпадения в обеих таблицах, участвующих в соединении. SELECT A.*, B.* FROM TableA A INNER JOIN TableB B ON A.id = B.id; 🟠`LEFT JOIN` (или `LEFT OUTER JOIN`) LEFT JOIN возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадений нет, результат всё равно будет включать строки из левой таблицы с NULL значениями для столбцов из правой таблицы. SELECT A.*, B.* FROM TableA A LEFT JOIN TableB B ON A.id = B.id; 🟠RIGHT JOIN (или RIGHT OUTER JOIN) RIGHT JOIN возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если совпадений нет, результат всё равно будет включать строки из правой таблицы с NULL значениями для столбцов из левой таблицы. SELECT A.*, B.* FROM TableA A RIGHT JOIN TableB B ON A.id = B.id; INNER JOIN SELECT Employees.name, Departments.dept_name FROM Employees INNER JOIN Departments ON Employees.dept_id = Departments.dept_id; LEFT JOIN SELECT Employees.name, Departments.dept_name FROM Employees LEFT JOIN Departments ON Employees.dept_id = Departments.dept_id; RIGHT JOIN SELECT Employees.name, Departments.dept_name FROM Employees RIGHT JOIN Departments ON Employees.dept_id = Departments.dept_id; Ставь 👍 и 📚 @backendquiz
🤔 Какие минусы есть у индекса? ➖Дополнительное пространство на диске Индексы требуют дополнительного места на диске для хранения. Чем больше данных в таблице, тем больше место занимает индекс. Если таблица содержит большое количество индексов, это может значительно увеличить объем хранимых данных. ➖Замедление операций записи Вставка, обновление и удаление данных в таблице с индексами требует дополнительных операций для обновления индексов. Это может существенно замедлить производительность операций модификации данных, особенно в таблицах с большим количеством индексов. ➖Сложность управления Администрирование и оптимизация индексов требует дополнительных усилий. Необходимо периодически проверять и оптимизировать индексы, чтобы избежать фрагментации и падения производительности. Неэффективное использование индексов может привести к ухудшению производительности запросов. ➖Проблемы с блокировками При выполнении операций модификации данных индексы могут вызывать блокировки, что может приводить к конфликтам и снижению производительности в условиях высокой конкурентности. ➖Проблемы с выбором индексов Неправильный выбор колонок для индексирования может не только не улучшить, но и ухудшить производительность запросов. Индексы должны быть тщательно подобраны и настроены в соответствии с типичными запросами к базе данных. ➖Риск избыточности Избыточные или дублирующие индексы могут привести к ненужному расходу ресурсов и снижению производительности операций модификации данных. ➖Неэффективность для малых таблиц В небольших таблицах накладные расходы на поддержку индексов могут превышать выигрыш в производительности запросов. В таких случаях индексы могут быть неэффективными. ➖Сложность при изменении структуры данных Изменение структуры таблиц (например, добавление или удаление колонок) может потребовать перестройки существующих индексов, что может быть трудоемким процессом. Ставь 👍 и 📚 @backendquiz
🤔 Что такое нормализация баз данных? Нормализация баз данных - это процесс организации данных в базе данных для минимизации избыточности данных и обеспечения их целостности. Цель нормализации - структурировать таблицы таким образом, чтобы устранить аномалии обновления, вставки и удаления данных. Нормализация достигается путем разбиения больших таблиц на более мелкие, связанных между собой отношениями, что упрощает управление данными и делает их более логически связанными. 🚩Зачем нужна нормализация 🟠Устранение избыточности данных Нормализация позволяет минимизировать дублирование данных, что экономит пространство и упрощает управление базой данных. 🟠Обеспечение целостности данных Нормализация помогает поддерживать целостность данных, обеспечивая правильное и единообразное хранение данных. 🟠Упрощение структуры базы данных Разделение данных на логические таблицы делает структуру базы данных более понятной и удобной для использования. 🟠Избежание аномалий данных Нормализация предотвращает возникновение аномалий при обновлении, вставке и удалении данных. 🚩Основные формы нормализации 🟠Первая нормальная форма (1NF) Удаление повторяющихся групп в таблице. Каждый столбец должен содержать только атомарные (неделимые) значения. Все записи в таблице должны быть уникальными. 🟠Вторая нормальная форма (2NF) Таблица должна быть в 1NF. Удаление частичной функциональной зависимости: каждый неключевой атрибут должен быть полностью зависим от первичного ключа. 🟠Третья нормальная форма (3NF) Таблица должна быть в 2NF. Удаление транзитивной зависимости: все неключевые атрибуты должны быть напрямую зависимы от первичного ключа, а не от других неключевых атрибутов. 🟠Бойс-Кодд нормальная форма (BCNF) Усиление 3NF: каждая детерминанта должна быть кандидатом на ключ, что означает, что в любой нетривиальной функциональной зависимости X -> Y, X должно быть суперключом. 🟠Четвертая нормальная форма (4NF) Таблица должна быть в BCNF. Устранение многозначных зависимостей: таблица не должна содержать многозначных зависимостей, когда один атрибут зависит от нескольких значений другого атрибута. 🟠Пятая нормальная форма (5NF) Таблица должна быть в 4NF. Устранение соединительных зависимостей: данные должны быть разбиты так, чтобы каждая зависимость сохранялась. 🚩Примеры применения нормализации 🟠Первая нормальная форма Если у вас есть таблица с повторяющимися группами, такими как несколько телефонных номеров для одного клиента, вы создаете отдельную таблицу для телефонов и связываете ее с таблицей клиентов. 🟠Вторая нормальная форма Если у вас есть таблица заказов с колонками "номер заказа", "название товара" и "цена товара", вы можете создать отдельные таблицы для заказов и товаров, чтобы цена товара зависела только от товара, а не от комбинации заказа и товара. 🟠Третья нормальная форма Если у вас есть таблица сотрудников с колонками "идентификатор сотрудника", "название отдела" и "имя начальника отдела", вы можете создать отдельные таблицы для сотрудников и отделов, чтобы имя начальника отдела зависело только от отдела, а не от сотрудника. Ставь 👍 и 📚 @backendquiz
🤔 Что такое git ? Это распределённая система контроля версий, разработанная Линусом Торвальдсом в 2005 году. Она предназначена для отслеживания изменений в исходном коде во время разработки программного обеспечения. Git позволяет нескольким разработчикам работать над одним и тем же проектом одновременно, не опасаясь потерять работу или перезаписать изменения друг друга. 🚩Основные понятия и функции 🟠Репозиторий (Repository) Это хранилище для проекта, в котором хранятся все файлы и история их изменений. 🟠Коммит (Commit) Зафиксированный снимок текущего состояния файлов в репозитории. Коммиты образуют историю изменений проекта. 🟠Ветвь (Branch) Отдельная линия разработки. Ветви позволяют параллельно работать над разными функциями или исправлениями без вмешательства в основную кодовую базу. 🟠Слияние (Merge) Процесс объединения изменений из одной ветви в другую. Обычно используется для интеграции новых функций или исправлений из отдельных ветвей в основную ветвь. 🟠Клон (Clone) Создание копии удалённого репозитория на локальной машине разработчика. 🟠Форк (Fork) Создание копии чужого репозитория (обычно на платформе вроде GitHub) для внесения собственных изменений без воздействия на оригинальный проект. 🟠Запрос на слияние (Pull Request или Merge Request) Запрос на включение изменений из одной ветви в другую, часто используемый в коллаборативных платформах (например, GitHub, GitLab). 🟠Ремот (Remote) Удалённый репозиторий, который может быть связан с локальным репозиторием. Основные команды взаимодействуют с ним для синхронизации данных. 🚩Основные команды 🟠git init Создание нового локального репозитория. 🟠git clone [URL] Клонирование удалённого репозитория на локальную машину. 🟠git add [файл/папка] Добавление изменений в индекс (стадия подготовки к коммиту). 🟠git commit -m "Сообщение" Создание коммита с заданным сообщением. 🟠git status Проверка состояния файлов в рабочем каталоге и индексе. 🟠git log Просмотр истории коммитов. 🟠git branch Управление ветвями (создание, просмотр, удаление). 🟠git checkout [ветка/коммит] Переключение между ветвями или возврат к определённому коммиту. 🟠git merge [ветка] Слияние указанной ветки с текущей. 🟠git pull Получение изменений из удалённого репозитория и слияние с текущей веткой. 🟠git push Отправка изменений из локального репозитория в удалённый. Ставь 👍 и 📚 @backendquiz
🤔 В чём разница InnerJoin и RightJoin ? Это два типа объединения таблиц в SQL, которые используются для получения данных из нескольких таблиц на основе условий соединения. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных. 🚩`INNER JOIN` INNER JOIN возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении. Если нет совпадения, строки не включаются в результирующий набор данных. SELECT A.*, B.* FROM TableA A INNER JOIN TableB B ON A.id = B.id; 🚩`RIGHT JOIN` (или `RIGHT OUTER JOIN`) RIGHT JOIN возвращает все строки из правой таблицы (TableB) и совпадающие строки из левой таблицы (TableA). Если совпадения нет, строки из правой таблицы все равно включаются в результат с NULL значениями для столбцов из левой таблицы. SELECT A.*, B.* FROM TableA A RIGHT JOIN TableB B ON A.id = B.id; 🚩Основные различия 🟠INNER JOIN Возвращает только строки с совпадающими значениями в обеих таблицах. Исключает строки без совпадений. 🟠RIGHT JOIN Возвращает все строки из правой таблицы (TableB) и совпадающие строки из левой таблицы (TableA). Включает строки из правой таблицы, даже если нет совпадений, с NULL значениями для столбцов из левой таблицы. Ставь 👍 и 📚 @backendquiz
🤔 Что такое XSS. Примеры. Как защитить приложение? XSS (Cross-Site Scripting) — это тип атаки на веб-приложения, при котором злоумышленник внедряет вредоносный скрипт (обычно JavaScript) в веб-страницу, которую просматривает пользователь. Это позволяет атакующему выполнять произвольный код в контексте браузера жертвы, что может привести к краже данных, угону сессий или изменению содержимого страницы. 🚩Виды XSS-атак 🟠Stored XSS (Хранимый XSS) Вредоносный код сохраняется в базе данных или другом постоянном хранилище. Например, пользователь вводит в комментарий ..., который сохраняется в БД и выполняется при просмотре комментариев. 🟠Reflected XSS (Отражённый XSS) Вредоносный код передаётся в запросе и немедленно отображается без обработки. Например, если строка запроса ?search=alert('XSS') отображается на странице без фильтрации, скрипт выполнится. 🟠DOM-based XSS Возникает, когда JavaScript на клиенте изменяет DOM, используя входные данные, не проверяя их безопасность. Например, если код document.write(location.hash); вставляет содержимое URL-хэша (#alert('XSS')) в страницу, скрипт выполнится. 🚩Последствия XSS Кража cookies и сессионных данных. Фишинг-атаки (изменение содержимого страниц). Выполнение произвольных действий от лица пользователя. Перенаправление на вредоносные сайты. 🚩Как защитить приложение от XSS 🟠Экранирование (escaping) выходных данных Используйте htmlspecialchars() (PHP), encodeURIComponent() (JS) или аналогичные методы для предотвращения исполнения HTML-кода. 🟠Фильтрация и валидация входных данных Проверяйте и ограничивайте вводимые пользователем данные (например, запрещайте ). 🟠Использование Content Security Policy (CSP) CSP ограничивает выполнение скриптов только из доверенных источников. 🟠HttpOnly и Secure cookies Флаг HttpOnly запрещает доступ к cookie через JavaScript, а Secure требует HTTPS. 🟠Не используйте `eval()`, `innerHTML`, `document.write()` Эти методы позволяют вставлять HTML и JavaScript без защиты. Ставь 👍 и 📚 @backendquiz
🤔 Что такое JSON? Это легкий формат обмена данными, который легко читается и пишется человеком, а также легко парсится и генерируется компьютером. Он используется для представления структурированных данных в текстовом формате и основан на подмножестве языка программирования JavaScript, но независим от него. JSON часто используется для передачи данных между сервером и веб-приложением в формате, который легко обрабатывается. 🚩Основные характеристики 🟠Простота JSON имеет простой и понятный синтаксис, состоящий из двух основных структур: коллекций пар "ключ-значение" (объектов) и упорядоченных списков значений (массивов). Это делает его легким для понимания и работы как для людей, так и для машин. 🟠Легковесность В отличие от более сложных форматов, таких как XML, JSON занимает меньше места благодаря лаконичному синтаксису, что делает его идеальным для передачи данных по сети, особенно в веб-приложениях. 🟠Язык-независимость Хотя JSON основан на синтаксисе JavaScript, он поддерживается практически всеми языками программирования. В большинстве современных языков существуют библиотеки для парсинга и генерации JSON, что облегчает его интеграцию в различные системы. 🟠Читаемость человеком JSON форматы легко читаются человеком благодаря своей структурированности и использованию простой текстовой нотации. 🚩Структура 🟠Объекты Представляют собой коллекции пар "ключ-значение", заключенные в фигурные скобки {}. Ключи являются строками, а значения могут быть любыми допустимыми типами данных JSON (строки, числа, массивы, объекты, логические значения, null). { "name": "John", "age": 30, "isStudent": false, "address": { "street": "123 Main St", "city": "Anytown" }, "courses": ["Math", "Science", "History"] } 🟠Массивы Представляют собой упорядоченные списки значений, заключенные в квадратные скобки []. Значения могут быть любого типа данных JSON. ["apple", "banana", "cherry"] 🟠Примитивные типы данных Включают строки, числа, логические значения (true или false), и null. { "stringExample": "Hello, World!", "numberExample": 42, "booleanExample": true, "nullExample": null } 🚩Использование JSON 🟠Передача данных между клиентом и сервером JSON широко используется в веб-разработке для обмена данными между клиентскими приложениями и сервером через HTTP-запросы, обычно с использованием методов GET или POST. 🟠Конфигурационные файлы JSON используется для хранения конфигурационных настроек в различных приложениях, поскольку его структура легко читаема и редактируема. 🟠Хранение данных В некоторых базах данных, таких как MongoDB, JSON используется как формат для хранения документов. Ставь 👍 и 📚 @backendquiz
🤔 Что знаешь о принципах программирования DRY? Это принцип программирования, который гласит, что информация или логика в коде не должны дублироваться. Каждый фрагмент знаний должен иметь одно, однозначное и авторитетное представление в системе. Этот принцип был введен в книге "The Pragmatic Programmer" Эндрю Хантом и Дэвидом Томасом. 🚩Аспекты 🟠Избежание дублирования кода Код должен быть написан так, чтобы не повторяться. Если одно и то же действие или информация используются в нескольких местах, они должны быть вынесены в одно место и использоваться повторно. 🟠Легкость сопровождения Изменения в коде нужно вносить в одном месте, что упрощает его сопровождение и уменьшает вероятность ошибок. 🟠Чистота и ясность кода Код становится более понятным и структурированным, что облегчает его чтение и понимание. 🚩Примеры применения 🟠Функции и методы Вынос общих операций в функции или методы, которые затем можно вызывать в различных частях программы. 🟠Модули и библиотеки Создание модулей или библиотек, которые содержат повторяющуюся логику и могут быть переиспользованы в различных проектах. 🟠Константы Объявление констант вместо использования "магических чисел" или строковых литералов в нескольких местах кода. 🟠Шаблоны Использование шаблонов в HTML, XML или других языках разметки для генерации повторяющихся структур. 🟠Конфигурационные файлы Хранение конфигурационных данных в одном месте, а не встраивание их в код. 🚩Плюсы ➕Снижение сложности Меньшее количество кода и дублирования упрощает понимание системы и снижает её сложность. ➕Улучшение сопровождения Легче поддерживать и обновлять код, так как изменения нужно вносить в одном месте. ➕Меньше ошибок Снижается вероятность ошибок, поскольку одно и то же изменение не нужно делать в нескольких местах. ➕Повышение производительности разработки Переиспользование кода ускоряет разработку, так как не нужно повторно писать уже существующий функционал. 🚩Примеры нарушений 🟠Дублирование логики Одинаковые блоки кода, выполняющие одну и ту же задачу, размещены в разных частях программы. 🟠Повторяющиеся данные Те же самые данные (например, настройки или конфигурации) хранятся в нескольких местах. 🟠Дублирование структур данных Одни и те же структуры данных определены в разных местах программы. Ставь 👍 и 📚 @backendquiz
🤔 Расскажи об отличиях MVC от MVP? MVC (Model-View-Controller) и MVP (Model-View-Presenter) – это архитектурные шаблоны, используемые в разработке программного обеспечения для разделения логики приложения на отдельные компоненты. Хотя обе архитектуры помогают улучшить структуру и поддерживаемость кода, между ними существуют важные различия. 🚩MVC (Model-View-Controller) 🟠Model (Модель) Отвечает за управление данными и бизнес-логикой приложения. Она не знает о существовании View и Controller. 🟠View (Представление) Отображает данные, полученные от Model, и отправляет пользовательский ввод в Controller. 🟠Controller (Контроллер) Получает ввод от View, обновляет Model и выбирает, какое View должно быть обновлено. 🚩MVP (Model-View-Presenter) 🟠Model (Модель) Отвечает за управление данными и бизнес-логикой приложения. 🟠View (Представление) Отображает данные и передает пользовательский ввод Presenter'у. 🟠Presenter (Презентер) Получает ввод от View, обновляет Model и передает данные обратно в View для отображения. 🚩Основные отличия 🟠Взаимодействие View и других компонентов В MVC View взаимодействует напрямую с Model. В MVP View взаимодействует только с Presenter, а Presenter уже работает с Model. 🟠Уведомления об изменениях В MVC Model уведомляет View об изменениях напрямую. В MVP Model уведомляет Presenter, а Presenter обновляет View. 🟠Роль Controller и Presenter В MVC Controller отвечает за определение, какое View отображать. В MVP Presenter отвечает за всю логику взаимодействия между Model и View, а также за обновление View. Ставь 👍 и 📚 @backendquiz
🤔 В чем разница между SQL lite и Express SQL? Это две разные системы управления базами данных (СУБД), каждая из которых имеет свои уникальные особенности, применения и случаи использования. 🟠Архитектура SQLite Встраиваемая СУБД: SQLite - это библиотека, которая встраивается непосредственно в приложение. Она не требует отдельного сервера для работы. Без сервера: Работает без необходимости запуска серверного процесса, что упрощает установку и настройку. Файловая система: Все данные хранятся в одном файле базы данных на диске. SQL Server Express Серверная СУБД: SQL Server Express - это урезанная версия Microsoft SQL Server, требующая установки и запуска серверного процесса. Клиент-серверная архитектура: Клиенты подключаются к серверу базы данных через сеть. Разделенные файлы данных и логов: Данные и логи хранятся в отдельных файлах. 🟠Производительность и масштабируемость SQLite Легковесная и быстрая: Подходит для приложений с небольшими или средними объемами данных и низкими требованиями к многопользовательскому доступу. Ограниченная многопользовательская поддержка: Поддерживает ограниченное количество одновременных пользователей, так как блокировки осуществляются на уровне файла. SQL Server Express Масштабируемость: Подходит для приложений с высокими требованиями к производительности и поддерживает значительное количество одновременных пользователей. Многопользовательская поддержка: Обеспечивает управление многопользовательским доступом и параллельностью транзакций. 🟠Функциональные возможности SQLite: Основные возможности SQL: Поддерживает основные команды SQL, такие как SELECT, INSERT, UPDATE, DELETE. Ограниченные возможности: Отсутствие многих расширенных функций, таких как триггеры, хранимые процедуры, сложные типы данных и транзакции с несколькими заявлениями. SQL Server Express: Расширенные возможности: Поддержка триггеров, хранимых процедур, полнотекстового поиска, транзакций и других продвинутых функций. Ограничения по сравнению с полной версией: SQL Server Express имеет ограничения по объему базы данных (до 10 ГБ на одну базу данных) и по использованию ресурсов (до 1 ГБ ОЗУ и 1 процессор). 🟠Установка и развертывание SQLite: Простота установки: Не требует установки, просто включается как библиотека в приложение. Легкость развертывания: Так как данные хранятся в одном файле, перемещение базы данных сводится к копированию этого файла. SQL Server Express: Требует установки: Необходимо установить серверную часть, что может включать несколько шагов настройки. Администрирование: Требует определенного уровня администрирования для настройки безопасности, резервного копирования и восстановления данных. 🟠Случаи использования SQLite: Мобильные приложения: Часто используется в мобильных приложениях (например, Android и iOS) для локального хранения данных. Встроенные системы: Подходит для встроенных систем и IoT устройств. Прототипирование и тестирование: Удобен для быстрого создания прототипов и тестирования. SQL Server Express: Веб-приложения: Хорошо подходит для небольших веб-приложений и сервисов, особенно на платформе Windows. Настольные приложения: Используется в настольных приложениях, требующих мощной базы данных. Учебные цели: Часто используется в образовательных целях для обучения работе с SQL Server. Ставь 👍 и 📚 @backendquiz
🤔 Что такое IP? IP (Internet Protocol) — это основной протокол сетевого уровня, который используется для передачи данных через интернет и другие сети. IP отвечает за маршрутизацию и адресацию пакетов данных, обеспечивая их доставку от отправителя к получателю. 🚩Основные аспекты IP: Адресация: IP адресация обеспечивает уникальные адреса для устройств в сети, что позволяет им взаимодействовать друг с другом. Существует две версии IP адресации: 🟠Использует 32-битные адреса, что позволяет создать около 4,3 миллиарда уникальных адресов. 🟠Пример IPv4 адреса: 192.168.0.1 🟠IPv6 (Internet Protocol version 6): 🟠Использует 128-битные адреса, что позволяет создать около 340 ундециллионов (3,4×10^38) уникальных адресов. 🟠Пример IPv6 адреса: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 Маршрутизация: IP отвечает за определение пути для передачи пакетов от источника к назначению через сеть, включая множество промежуточных маршрутизаторов. Это позволяет передавать данные через различные сети и соединения. Фрагментация и сборка: IP может разделять большие пакеты данных на более мелкие фрагменты, чтобы они могли быть переданы через сети с различными ограничениями по размеру пакетов. Получатель затем собирает фрагменты обратно в исходный пакет. Пакетная передача: IP передает данные в виде пакетов. Каждый пакет содержит заголовок с информацией об адресации и маршрутизации, а также полезную нагрузку с передаваемыми данными. 🚩Основные функции IP: 🟠Адресация устройств: IP предоставляет уникальные адреса для каждого устройства в сети, что позволяет им идентифицировать и находить друг друга. 🟠Маршрутизация пакетов: IP определяет маршрут для пакетов данных через различные сети и маршрутизаторы до их конечного назначения. 🟠Фрагментация и сборка: IP разбивает большие пакеты на более мелкие фрагменты для передачи через сеть и собирает их обратно у получателя. 🟠Проверка целостности: IP включает контрольные суммы для проверки целостности заголовка пакета, но не обеспечивает контроль целостности данных. 🚩Преимущества IP 🟠Универсальность IP является стандартным протоколом для передачи данных в интернете и поддерживается всеми сетевыми устройствами. 🟠Гибкость IP может передавать данные через различные типы сетей и соединений. 🟠Масштабируемость IPv6 предоставляет практически неограниченное количество адресов для подключения новых устройств к сети. 🚩Недостатки IP 🟠Безопасность IP сам по себе не предоставляет механизмов для шифрования или аутентификации данных, что делает его уязвимым для атак. 🟠Отсутствие гарантии доставки: IP не гарантирует доставку пакетов, их последовательность или целостность данных, полагаясь на протоколы более высокого уровня, такие как TCP, для обеспечения надежности. 🚩Взаимодействие с другими протоколами IP работает в комбинации с другими протоколами, чтобы обеспечить полное взаимодействие в сети: 🟠TCP (Transmission Control Protocol): Работает поверх IP и обеспечивает надежную передачу данных, проверку ошибок и управление потоком. 🟠UDP (User Datagram Protocol): Также работает поверх IP, но не обеспечивает надежность, что делает его подходящим для приложений, требующих высокой скорости и низкой задержки, таких как потоковая передача и игры. 🟠ICMP (Internet Control Message Protocol): Используется для передачи диагностических и управляющих сообщений, таких как запросы ping. Ставь 👍 и 📚 @backendquiz
🤔 Что такое столп "наследование" ? Наследование — это ключевой принцип объектно-ориентированного программирования, позволяющий создавать новый класс (наследник), который заимствует свойства и методы существующего класса (родителя). Это способствует: 🟠Повторному использованию кода Общие функции и данные определяются один раз в родительском классе и могут быть использованы во всех классах-наследниках. 🟠Упрощению расширения функциональности Наследники могут добавлять новые свойства и методы или изменять существующие, не затрагивая код родительского класса. 🟠Созданию иерархий классов Помогает структурировать и организовать код в виде дерева классов, отражающего реальные отношения иерархии. class Animal { void eat() { System.out.println("This animal eats."); } } class Dog extends Animal { void bark() { System.out.println("The dog barks."); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); // Наследованный метод dog.bark(); // Метод класса Dog } } Ставь 👍 и 📚 @backendquiz
🤔 Когда ROC AUC будет плохо определять качество классификатора ? ROC AUC (Receiver Operating Characteristic - Area Under Curve) является популярной метрикой для оценки качества бинарного классификатора. Однако, в некоторых ситуациях использование ROC AUC может быть неэффективным или вводящим в заблуждение. 🟠Сильно несбалансированные данные При сильном дисбалансе классов, где один класс существенно преобладает над другим, ROC AUC может давать завышенные оценки качества модели. Это происходит потому, что ROC AUC учитывает как истинно положительные, так и ложно положительные сработки, но при этом не всегда отражает способность модели предсказывать редкий класс. 🟠Различная стоимость ошибок Если ошибки различных типов (ложно положительные и ложно отрицательные) имеют разную стоимость, ROC AUC может неадекватно отражать качество модели. В таких случаях более подходящей метрикой может быть Precision-Recall Curve или специфическая метрика, учитывающая стоимость ошибок. 🟠Малое количество положительных примеров При малом количестве положительных примеров (класса 1), ROC AUC может стать менее надежной, так как небольшое изменение в предсказаниях может существенно повлиять на значение метрики. В таких случаях Precision-Recall Curve и PR AUC могут предоставить более надежную оценку. 🟠Нестабильность при малых выборках Может быть нестабильной и сильно зависеть от конкретного набора данных, особенно при небольших выборках. Это может привести к значительным колебаниям в оценках качества модели. import numpy as np import pandas as pd from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score, precision_recall_curve, auc # Создание несбалансированного набора данных X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=42) # Разделение на обучающую и тестовую выборки X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Обучение модели логистической регрессии model = LogisticRegression() model.fit(X_train, y_train) # Предсказание вероятностей y_scores = model.predict_proba(X_test)[:, 1] # Вычисление ROC AUC roc_auc = roc_auc_score(y_test, y_scores) # Вычисление Precision-Recall AUC precision, recall, _ = precision_recall_curve(y_test, y_scores) pr_auc = auc(recall, precision) print(f"ROC AUC: {roc_auc}") print(f"Precision-Recall AUC: {pr_auc}") Ставь 👍 и 📚 @backendquiz
🤔 Что такое ACID? Это акроним, представляющий четыре ключевых свойства транзакций в системах управления базами данных (СУБД), которые гарантируют надежность и согласованность при выполнении операций с данными. Эти свойства необходимы для обеспечения целостности данных в многопользовательских и распределенных системах. 🟠Atomicity (Атомарность) Атомарность гарантирует, что каждая транзакция выполняется полностью или не выполняется вовсе. Если любая часть транзакции завершается с ошибкой, то все изменения, внесенные в ходе этой транзакции, отменяются. Это свойство обеспечивает целостность данных, предотвращая частичные обновления. Пример: Если транзакция состоит из двух операций (перевод денег с одного счета на другой), то обе операции должны быть выполнены успешно или ни одна из них не должна быть выполнена. 🟠Consistency (Согласованность) Согласованность обеспечивает, что транзакция переводит базу данных из одного согласованного состояния в другое согласованное состояние. Это означает, что все правила и ограничения, заданные в базе данных (такие как целостность ссылок, уникальность и т.д.), должны быть соблюдены до и после выполнения транзакции. Пример: В базе данных учетных записей баланс счета не может быть отрицательным. Транзакция должна гарантировать, что это правило не будет нарушено. 🟠Isolation (Изолированность) Изолированность гарантирует, что результаты выполнения транзакции невидимы для других транзакций, пока она не будет завершена. Это свойство предотвращает проблемы, связанные с параллельным выполнением транзакций, такие как "грязные" чтения, неповторяемые чтения и фантомные чтения. Пример: Если одна транзакция читает данные, то она не увидит изменения, сделанные другой параллельно выполняющейся транзакцией, до тех пор, пока вторая транзакция не будет завершена. 🟠Durability (Долговечность) Долговечность гарантирует, что после завершения транзакции ее результаты будут сохранены и останутся в базе данных даже в случае сбоя системы или потери питания. Это достигается путем записи изменений на диск и использования механизмов резервного копирования. Пример: После успешного выполнения транзакции, фиксирующей покупку товаров, информация о покупке останется в базе данных, даже если система сразу после этого выйдет из строя. Ставь 👍 и 📚 @backendquiz
🤔 В чём разница между сцеплением и связанностью? Это два ключевых свойства модульной архитектуры программного обеспечения, которые помогают оценить качество кода и архитектурных решений. 🚩Отличия 🟠Сцепление (Coupling) Описывает степень зависимости одного модуля от других. Высокое сцепление означает, что модули сильно зависят друг от друга, что затрудняет их изменение, тестирование и повторное использование, так как изменения в одном модуле требуют изменений в зависимых модулях. Идеально стремиться к слабому сцеплению, чтобы модули были максимально независимыми. Это позволяет изменять или заменять один модуль без необходимости изменения других. 🟠Связанность (Cohesion) Описывает, насколько тесно связанные и объединённые общей задачей элементы внутри одного модуля. Высокая связанность означает, что все функции и данные модуля логически связаны и выполняют одну задачу. Это упрощает понимание кода и делает модуль более автономным.Высокая связанность считается хорошей практикой, так как модуль с высокой связанностью проще в обслуживании, его легче изменить или заменить. 🚩Пример Представьте модуль, который управляет пользователями: если в модуле только функции для работы с пользователями (например, добавление и удаление), он обладает высокой связанностью, так как его функции направлены на одну задачу. Если модуль при этом минимально зависит от других частей системы, это говорит о слабом сцеплении. 🚩 Сравнение 🟠Слабое сцепление и высокая связанность Это желательные качества. Они помогают создать более гибкую и поддерживаемую систему. 🟠Сцепление Лучше, когда оно слабое, так как снижает зависимость между модулями. 🟠Связанность Лучше, когда она высокая, так как все функции модуля работают на достижение одной цели. Ставь 👍 и 📚 @backendquiz
🤔 Из чего состоит ответ на сервере? Ответ на сервере, особенно в контексте HTTP, состоит из нескольких ключевых компонентов. Эти компоненты обеспечивают клиенту информацию о результате запроса, статусе обработки, а также предоставляют сами данные, если это необходимо. Основные части ответа включают: 🟠Стартовая линия (Status Line) Стартовая линия содержит информацию о статусе ответа и состоит из следующих частей: Версия протокола HTTP: Например, HTTP/1.1. Код состояния (Status Code): Числовой код, который указывает результат обработки запроса. Примеры включают 200 (OK), 404 (Not Found), 500 (Internal Server Error). Причинная фраза (Reason Phrase): Человеко-читаемое описание статуса. Например, OK, Not Found, Internal Server Error. HTTP/1.1 200 OK 🟠Заголовки (Headers) Заголовки предоставляют метаданные о ответе. Они состоят из пар "ключ-значение" и могут включать: Date: Дата и время отправки ответа. Content-Type: Тип содержимого ответа (например, text/html, application/json). Content-Length: Размер тела ответа в байтах. Server: Информация о сервере, отправившем ответ. Set-Cookie: Установка cookies. Content-Type: application/json Content-Length: 85 Server: Apache/2.4.1 (Unix) Set-Cookie: sessionId=abc123; Path=/; HttpOnly 🟠Тело ответа (Body) Тело ответа содержит данные, которые сервер отправляет клиенту. Формат и содержание тела зависят от типа ответа и могут включать: HTML-страницы JSON-объекты XML-данные Файлы (например, изображения, документы) { "id": 123, "name": "John Doe", "email": "john.doe@example.com" } Пример полного HTTP-ответа HTTP/1.1 200 OK Date: Tue, 27 Jul 2024 12:28:53 GMT Content-Type: application/json Content-Length: 85 Server: Apache/2.4.1 (Unix) Set-Cookie: sessionId=abc123; Path=/; HttpOnly { "id": 123, "name": "John Doe", "email": "john.doe@example.com" } Ставь 👍 и 📚 @backendquiz
🤔 Что такое виртуальное окружение? Это изолированная среда для выполнения программного кода, которая позволяет создавать независимые друг от друга пространства для различных проектов. В каждом таком окружении могут быть установлены специфические для проекта зависимости (библиотеки, пакеты), которые не будут пересекаться с зависимостями других проектов. 🚩Зачем нужно 🟠Изоляция зависимостей В разных проектах могут использоваться различные версии одних и тех же библиотек. Виртуальные окружения позволяют избежать конфликтов версий, создавая изолированные пространства для каждого проекта. 🟠Упрощение управления зависимостями Легко установить, обновить или удалить зависимости без риска повлиять на другие проекты. Это особенно полезно при работе над проектами с долгим жизненным циклом, где могут возникать проблемы совместимости. 🟠Повышение безопасности Изоляция окружения помогает ограничить доступ к критически важным системным ресурсам и защищает основную систему от потенциально вредоносного кода. 🟠Удобство разработки и тестирования Виртуальные окружения позволяют разработчикам легко переключаться между проектами и их зависимостями, что упрощает процесс тестирования и отладки. 🟠Совместимость и переносимость Проекты с виртуальными окружениями легче перенести на другие системы или передать другим разработчикам. Достаточно скопировать окружение вместе с проектом, чтобы получить полностью функционирующую копию. 🚩Как используется 🟠venv Встроенный модуль в Python, позволяющий создавать легковесные виртуальные окружения. 🟠virtualenv Более функциональный инструмент, особенно полезный для старых версий Python. 🟠conda Инструмент, который управляет как пакетами, так и виртуальными окружениями, поддерживающий не только Python, но и другие языки программирования. 1⃣Создание окружения Команда для создания нового окружения (например, python -m venv env для venv). 2⃣Активация окружения Команда для активации окружения (например, source env/bin/activate на Unix-подобных системах или .\env\Scripts\activate на Windows). 3⃣Установка зависимостей Использование менеджера пакетов (например, pip) для установки необходимых библиотек. 4⃣Деактивация окружения Команда для выхода из окружения (например, deactivate). Ставь 👍 и 📚 @backendquiz