
На майских в Telegram — больше читателей и отклика
Планируйте посты со скидкой 3,5% по промокоду HAPPYMAY с 28 апреля по 15 мая
Получить скидку
42.9

BackendQuiz - задачи с собеседований по бэкенду
4.8
17
Задачки на алгоритмы, на понимание HTTP и сетевого стека вцелом, так же базы данных и хранилища. Подойдет как для начинающих так и для опытных. Языки и технологии: Java, PHP, Ruby, Javascript, SQL
Поделиться
В избранное
Канал временно
не принимает заявки
не принимает заявки
Выберите другой из рекомендаций или получите готовую корзину под ваш бюджет с помощью AI
Персональный AI-подбор
Последние посты канала
🤔 В чем разница между rebase и merge?
В Git команды rebase и merge применяются для объединения изменений из разных веток, но делают это по-разному. Главное отличие состоит в том, как они сохраняют историю коммитов и влияют на структуру репозитория.
🚩Основные различия
🟠Merge (Слияние)
Объединяет две ветки, создавая новый коммит слияния (merge commit), который имеет двух родителей. При этом сохраняется вся история коммитов обеих веток без изменений. История ветвления и слияния остаётся видимой. Если возникают конфликты, Git предложит их решить перед созданием коммита слияния.
git merge
git checkout main
git merge feature-branch
🟠Rebase (Перебазирование)
Переносит все коммиты текущей ветки на вершину целевой ветки. Это делает историю линейной, как будто изменения выполнялись последовательно. История коммитов изменяется, так как создаются новые коммиты для каждого из текущей ветки. История ветвления исчезает. При конфликтах Git предложит их разрешать по очереди для каждого коммита.
git rebase
git checkout feature-branch
git rebase main
🚩Преимущества и недостатки
🟠Merge
➕Простота
Процесс слияния легок и понятен.
➕Сохранение истории
Вся история коммитов остаётся, включая информацию о ветвлении и слиянии.
➖Коммиты слияния
Появляются дополнительные коммиты слияния, что может усложнить историю.
🟠Rebase
➕Чистая история
История становится линейной и более удобной для чтения.
➕Упрощение навигации
Проще отслеживать последовательность изменений.
➖Изменение истории
Изменение коммитов может вызвать проблемы, если кто-то уже работает на основе этих коммитов.
➖Конфликты
Разрешение конфликтов может потребовать больше усилий, особенно при большом количестве коммитов.
🚩Когда применять
🟠Merge
Если важно сохранить полную историю изменений, включая ветвление и слияние. Это актуально в больших командных проектах, где нужна подробная история.
🟠Rebase
Если требуется иметь чистую и линейную историю изменений. Обычно применяется для интеграции изменений из основной ветки в рабочую перед отправкой в основную ветку.
Ставь 👍 и 📚
@backendquiz
В Git команды rebase и merge применяются для объединения изменений из разных веток, но делают это по-разному. Главное отличие состоит в том, как они сохраняют историю коммитов и влияют на структуру репозитория.
🚩Основные различия
🟠Merge (Слияние)
Объединяет две ветки, создавая новый коммит слияния (merge commit), который имеет двух родителей. При этом сохраняется вся история коммитов обеих веток без изменений. История ветвления и слияния остаётся видимой. Если возникают конфликты, Git предложит их решить перед созданием коммита слияния.
git merge
git checkout main
git merge feature-branch
🟠Rebase (Перебазирование)
Переносит все коммиты текущей ветки на вершину целевой ветки. Это делает историю линейной, как будто изменения выполнялись последовательно. История коммитов изменяется, так как создаются новые коммиты для каждого из текущей ветки. История ветвления исчезает. При конфликтах Git предложит их разрешать по очереди для каждого коммита.
git rebase
git checkout feature-branch
git rebase main
🚩Преимущества и недостатки
🟠Merge
➕Простота
Процесс слияния легок и понятен.
➕Сохранение истории
Вся история коммитов остаётся, включая информацию о ветвлении и слиянии.
➖Коммиты слияния
Появляются дополнительные коммиты слияния, что может усложнить историю.
🟠Rebase
➕Чистая история
История становится линейной и более удобной для чтения.
➕Упрощение навигации
Проще отслеживать последовательность изменений.
➖Изменение истории
Изменение коммитов может вызвать проблемы, если кто-то уже работает на основе этих коммитов.
➖Конфликты
Разрешение конфликтов может потребовать больше усилий, особенно при большом количестве коммитов.
🚩Когда применять
🟠Merge
Если важно сохранить полную историю изменений, включая ветвление и слияние. Это актуально в больших командных проектах, где нужна подробная история.
🟠Rebase
Если требуется иметь чистую и линейную историю изменений. Обычно применяется для интеграции изменений из основной ветки в рабочую перед отправкой в основную ветку.
Ставь 👍 и 📚
@backendquiz
110
10:22
04.05.2025
🤔 Что такое Docker?
Docker представляет собой платформу, которая автоматизирует развёртывание, масштабирование и управление приложениями в контейнерах. Она даёт возможность разработчикам создавать, тестировать и запускать приложения в изолированных средах — контейнерах.
🚩Основные элементы Docker
🟠Docker Engine
Это серверная программа, управляющая контейнерами. Состоит из двух частей:
Docker Daemon: служба, которая контролирует все объекты Docker (контейнеры, образы и прочее).
Docker CLI: командная строка, с помощью которой пользователи взаимодействуют с Docker Daemon.
🟠Образы (Images)
Это шаблоны для создания контейнеров. Образ содержит все необходимые зависимости, библиотеки, настройки, скрипты и код для запуска приложения.
🟠Контейнеры (Containers)
Это отдельные среды, где работают приложения. Контейнеры создаются на базе образов и включают всё, что нужно для работы приложения.
🟠Docker Hub
Это облачный сервис для хранения и обмена Docker-образами. Разработчики могут загружать свои образы в Docker Hub и делиться ими с другими.
🟠Docker Compose
Инструмент для описания и управления приложениями, состоящими из нескольких контейнеров. Через файл 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.
Ставь 👍 и 📚
@backendquiz
Docker представляет собой платформу, которая автоматизирует развёртывание, масштабирование и управление приложениями в контейнерах. Она даёт возможность разработчикам создавать, тестировать и запускать приложения в изолированных средах — контейнерах.
🚩Основные элементы Docker
🟠Docker Engine
Это серверная программа, управляющая контейнерами. Состоит из двух частей:
Docker Daemon: служба, которая контролирует все объекты Docker (контейнеры, образы и прочее).
Docker CLI: командная строка, с помощью которой пользователи взаимодействуют с Docker Daemon.
🟠Образы (Images)
Это шаблоны для создания контейнеров. Образ содержит все необходимые зависимости, библиотеки, настройки, скрипты и код для запуска приложения.
🟠Контейнеры (Containers)
Это отдельные среды, где работают приложения. Контейнеры создаются на базе образов и включают всё, что нужно для работы приложения.
🟠Docker Hub
Это облачный сервис для хранения и обмена Docker-образами. Разработчики могут загружать свои образы в Docker Hub и делиться ими с другими.
🟠Docker Compose
Инструмент для описания и управления приложениями, состоящими из нескольких контейнеров. Через файл 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.
Ставь 👍 и 📚
@backendquiz
104
10:27
03.05.2025
🤔 Что ты знаешь о бинарном дереве?
Это структура данных, в которой каждый узел может иметь не более двух потомков. Эти потомки называются левым и правым дочерними узлами. В бинарном дереве может быть несколько уровней узлов, начиная с корневого узла, который служит отправной точкой дерева.
🚩Основные понятия
🟠Узел (Node)
Главный элемент бинарного дерева, содержащий данные и ссылки на дочерние узлы.
🟠Корень (Root)
Верхний узел дерева, у которого нет родительских узлов.
🟠Лист (Leaf)
Узел, не имеющий дочерних узлов.
🟠Ветвь (Branch)
Путь от корня к любому другому узлу.
🟠Высота дерева
Максимальное число уровней от корня до самого нижнего листа.
🟠Глубина узла
Расстояние от корня до конкретного узла.
🚩Типы
🟠Полное бинарное дерево
Все уровни, кроме, возможно, последнего, полностью заполнены, и все узлы последнего уровня расположены слева.
🟠Совершенное бинарное дерево
Все уровни полностью заполнены, и каждый узел, кроме листьев, имеет два дочерних узла.
🟠Двоичное дерево поиска (Binary Search Tree, BST)
Для каждого узла все значения в левом поддереве меньше значения узла, а в правом поддереве — больше.
🚩Основные операции
🟠Добавление узла (Insertion)
Вставка нового узла в дерево. В двоичном дереве поиска новый узел помещается на место, которое сохраняет порядок элементов.
🟠Удаление узла (Deletion)
Удаление узла из дерева, что может потребовать перестройки дерева для сохранения его свойств.
🟠Поиск (Search)
Поиск узла с заданным значением. В двоичном дереве поиска этот процесс ускоряется благодаря упорядоченности узлов.
🟠Обход дерева (Traversal)
Процесс посещения всех узлов дерева в определённом порядке. Основные способы обхода:
🚩Применение
🟠Хранение отсортированных данных
Двоичное дерево поиска эффективно хранит и извлекает упорядоченные данные.
🟠Поисковые системы
Деревья применяются для организации и поиска информации.
🟠Алгоритмы и структуры данных
Основная структура для многих алгоритмов, включая сортировки, балансировки и другие операции с данными.
🟠Компиляторы и интерпретаторы
Используются для создания и обработки синтаксических деревьев при анализе кода.
Ставь 👍 и 📚
@backendquiz
Это структура данных, в которой каждый узел может иметь не более двух потомков. Эти потомки называются левым и правым дочерними узлами. В бинарном дереве может быть несколько уровней узлов, начиная с корневого узла, который служит отправной точкой дерева.
🚩Основные понятия
🟠Узел (Node)
Главный элемент бинарного дерева, содержащий данные и ссылки на дочерние узлы.
🟠Корень (Root)
Верхний узел дерева, у которого нет родительских узлов.
🟠Лист (Leaf)
Узел, не имеющий дочерних узлов.
🟠Ветвь (Branch)
Путь от корня к любому другому узлу.
🟠Высота дерева
Максимальное число уровней от корня до самого нижнего листа.
🟠Глубина узла
Расстояние от корня до конкретного узла.
🚩Типы
🟠Полное бинарное дерево
Все уровни, кроме, возможно, последнего, полностью заполнены, и все узлы последнего уровня расположены слева.
🟠Совершенное бинарное дерево
Все уровни полностью заполнены, и каждый узел, кроме листьев, имеет два дочерних узла.
🟠Двоичное дерево поиска (Binary Search Tree, BST)
Для каждого узла все значения в левом поддереве меньше значения узла, а в правом поддереве — больше.
🚩Основные операции
🟠Добавление узла (Insertion)
Вставка нового узла в дерево. В двоичном дереве поиска новый узел помещается на место, которое сохраняет порядок элементов.
🟠Удаление узла (Deletion)
Удаление узла из дерева, что может потребовать перестройки дерева для сохранения его свойств.
🟠Поиск (Search)
Поиск узла с заданным значением. В двоичном дереве поиска этот процесс ускоряется благодаря упорядоченности узлов.
🟠Обход дерева (Traversal)
Процесс посещения всех узлов дерева в определённом порядке. Основные способы обхода:
🚩Применение
🟠Хранение отсортированных данных
Двоичное дерево поиска эффективно хранит и извлекает упорядоченные данные.
🟠Поисковые системы
Деревья применяются для организации и поиска информации.
🟠Алгоритмы и структуры данных
Основная структура для многих алгоритмов, включая сортировки, балансировки и другие операции с данными.
🟠Компиляторы и интерпретаторы
Используются для создания и обработки синтаксических деревьев при анализе кода.
Ставь 👍 и 📚
@backendquiz
107
10:34
02.05.2025
🤔 Что такое нотация BigO?
Нотация Big O (О-большое) — это математический способ, который применяется в информатике для описания эффективности алгоритма. Она показывает, как время выполнения или объем используемой памяти увеличивается с ростом размера входных данных. Нотация Big O рассматривает самый неблагоприятный вариант, что позволяет оценить наихудший сценарий работы алгоритма.
🚩Основные понятия нотации Big O
🟠Асимптотический анализ:
Big O используется для описания поведения алгоритмов при стремлении размера входных данных к бесконечности. Внимание уделяется главным слагаемым, а константы и менее значимые части игнорируются, так как они влияют меньше всего при больших объемах данных.
🟠Оценка худшего случая:
Big O показывает максимально возможное время выполнения алгоритма, что дает надежные гарантии его производительности.
🚩Основные уровни сложности
🟠O(1) — Константная сложность:
Время выполнения не зависит от размера входных данных. Например, доступ к элементу массива по индексу.
🟠O(log n) — Логарифмическая сложность:
Время увеличивается логарифмически с ростом входных данных. Например, бинарный поиск.
🟠O(n) — Линейная сложность:
Время растет прямо пропорционально размеру входных данных. Например, линейный поиск.
🟠O(n log n) — Линейно-логарифмическая сложность:
Время увеличивается линейно с логарифмическим множителем. Например, быстрая сортировка и сортировка слиянием.
🟠O(n^2) — Квадратичная сложность:
Время растет пропорционально квадрату размера входных данных. Например, сортировка пузырьком и сортировка вставками.
🟠O(2^n) — Экспоненциальная сложность:
Время удваивается с добавлением каждого нового элемента. Например, решение задачи коммивояжера перебором.
🟠O(n!) — Факториальная сложность:
Время растет факториально с увеличением размера данных. Например, полный перебор всех перестановок.
🚩Примеры применения
1⃣Поиск и сортировка:
Оценка эффективности разных алгоритмов сортировки (например, быстрая сортировка против сортировки пузырьком).
2⃣Анализ алгоритмов и структур данных:
Определение времени доступа, вставки и удаления в различных структурах (массивы, списки, деревья).
3⃣Оптимизация программ:
Помогает выбрать наиболее эффективные алгоритмы и структуры данных для конкретных задач.
Ставь 👍 и 📚
@backendquiz
Нотация Big O (О-большое) — это математический способ, который применяется в информатике для описания эффективности алгоритма. Она показывает, как время выполнения или объем используемой памяти увеличивается с ростом размера входных данных. Нотация Big O рассматривает самый неблагоприятный вариант, что позволяет оценить наихудший сценарий работы алгоритма.
🚩Основные понятия нотации Big O
🟠Асимптотический анализ:
Big O используется для описания поведения алгоритмов при стремлении размера входных данных к бесконечности. Внимание уделяется главным слагаемым, а константы и менее значимые части игнорируются, так как они влияют меньше всего при больших объемах данных.
🟠Оценка худшего случая:
Big O показывает максимально возможное время выполнения алгоритма, что дает надежные гарантии его производительности.
🚩Основные уровни сложности
🟠O(1) — Константная сложность:
Время выполнения не зависит от размера входных данных. Например, доступ к элементу массива по индексу.
🟠O(log n) — Логарифмическая сложность:
Время увеличивается логарифмически с ростом входных данных. Например, бинарный поиск.
🟠O(n) — Линейная сложность:
Время растет прямо пропорционально размеру входных данных. Например, линейный поиск.
🟠O(n log n) — Линейно-логарифмическая сложность:
Время увеличивается линейно с логарифмическим множителем. Например, быстрая сортировка и сортировка слиянием.
🟠O(n^2) — Квадратичная сложность:
Время растет пропорционально квадрату размера входных данных. Например, сортировка пузырьком и сортировка вставками.
🟠O(2^n) — Экспоненциальная сложность:
Время удваивается с добавлением каждого нового элемента. Например, решение задачи коммивояжера перебором.
🟠O(n!) — Факториальная сложность:
Время растет факториально с увеличением размера данных. Например, полный перебор всех перестановок.
🚩Примеры применения
1⃣Поиск и сортировка:
Оценка эффективности разных алгоритмов сортировки (например, быстрая сортировка против сортировки пузырьком).
2⃣Анализ алгоритмов и структур данных:
Определение времени доступа, вставки и удаления в различных структурах (массивы, списки, деревья).
3⃣Оптимизация программ:
Помогает выбрать наиболее эффективные алгоритмы и структуры данных для конкретных задач.
Ставь 👍 и 📚
@backendquiz
118
10:39
01.05.2025
🤔 Какие типы блокировок существуют в PostgreSQL?
В PostgreSQL применяются разные виды блокировок, которые помогают контролировать одновременный доступ к данным и гарантируют целостность транзакций.
🚩Блокировки на уровне таблиц (Table-Level Locks)
Эти блокировки охватывают целые таблицы и необходимы для операций, требующих эксклюзивного доступа к таблице.
🟠ACCESS SHARE:
Блокировка, разрешающая чтение данных из таблицы (например, при выполнении SELECT). Не препятствует выполнению других SELECT.
🟠ROW SHARE:
Блокировка на уровне строки, позволяющая другим транзакциям использовать команды SELECT FOR UPDATE и SELECT FOR SHARE.
🟠ROW EXCLUSIVE:
Блокировка, возникающая при вставке, обновлении или удалении строк (INSERT, UPDATE, DELETE). Блокирует блокировки SHARE и EXCLUSIVE.
🟠SHARE UPDATE EXCLUSIVE:
Применяется для операций, которые обновляют индексы, но не меняют данные (например, VACUUM). Блокирует другие блокировки SHARE UPDATE EXCLUSIVE и более строгие.
🟠SHARE:
Блокировка для чтения таблицы с ограничением на изменения. Используется в операциях, которые требуют просмотра согласованного состояния данных (например, ANALYZE).
🟠SHARE ROW EXCLUSIVE:
Используется в командах, которые читают данные и препятствуют последующим изменениям, например, CREATE INDEX CONCURRENTLY.
🟠EXCLUSIVE:
Блокирует таблицу для всех операций, кроме SELECT и команд с блокировкой ACCESS SHARE.
🟠ACCESS EXCLUSIVE:
Самая строгая блокировка, которая блокирует все остальные операции. Применяется при структурных изменениях таблицы (например, ALTER TABLE, DROP TABLE).
🚩Блокировки на уровне строк (Row-Level Locks)
Эти блокировки касаются отдельных строк и контролируют доступ к данным на более детальном уровне.
🟠SELECT FOR UPDATE:
Блокирует выбранные строки для обновления другими транзакциями. Такие строки могут изменяться только текущей транзакцией.
🟠SELECT FOR SHARE:
Блокирует строки для чтения, но не для изменений. Другие транзакции могут читать эти строки, но не изменять.
🟠SELECT FOR NO KEY UPDATE:
Похожа на SELECT FOR UPDATE, но позволяет другим транзакциям выполнять операции, которые не затрагивают ключи.
🟠SELECT FOR KEY SHARE:
Похожа на SELECT FOR SHARE, но разрешает другим транзакциям выполнять операции, не изменяющие строки.
🚩Блокировки на уровне индексов (Index-Level Locks)
Эти блокировки используются для управления доступом к индексам и обеспечивают целостность индексированных данных.
🟠Блокировки индексов:
Автоматически применяются при работе с индексами для защиты данных. Включают блокировки при обновлении или чтении индексов.
🚩Дедлоки (Deadlocks)
Дедлоки возникают, когда две или более транзакций взаимно блокируют друг друга, ожидая освобождения ресурсов. PostgreSQL самостоятельно обнаруживает дедлоки и прерывает одну из транзакций, чтобы решить проблему.
🚩Примеры использования
🟠Обеспечение целостности данных:
Применение блокировок для предотвращения одновременных изменений данных.
🟠Управление одновременным доступом:
Использование блокировок для контроля доступа к ресурсам в многопользовательских системах.
🟠Оптимизация работы:
Выбор подходящих видов блокировок для баланса между целостностью данных и производительностью.
Ставь 👍 и 📚
@backendquiz
В PostgreSQL применяются разные виды блокировок, которые помогают контролировать одновременный доступ к данным и гарантируют целостность транзакций.
🚩Блокировки на уровне таблиц (Table-Level Locks)
Эти блокировки охватывают целые таблицы и необходимы для операций, требующих эксклюзивного доступа к таблице.
🟠ACCESS SHARE:
Блокировка, разрешающая чтение данных из таблицы (например, при выполнении SELECT). Не препятствует выполнению других SELECT.
🟠ROW SHARE:
Блокировка на уровне строки, позволяющая другим транзакциям использовать команды SELECT FOR UPDATE и SELECT FOR SHARE.
🟠ROW EXCLUSIVE:
Блокировка, возникающая при вставке, обновлении или удалении строк (INSERT, UPDATE, DELETE). Блокирует блокировки SHARE и EXCLUSIVE.
🟠SHARE UPDATE EXCLUSIVE:
Применяется для операций, которые обновляют индексы, но не меняют данные (например, VACUUM). Блокирует другие блокировки SHARE UPDATE EXCLUSIVE и более строгие.
🟠SHARE:
Блокировка для чтения таблицы с ограничением на изменения. Используется в операциях, которые требуют просмотра согласованного состояния данных (например, ANALYZE).
🟠SHARE ROW EXCLUSIVE:
Используется в командах, которые читают данные и препятствуют последующим изменениям, например, CREATE INDEX CONCURRENTLY.
🟠EXCLUSIVE:
Блокирует таблицу для всех операций, кроме SELECT и команд с блокировкой ACCESS SHARE.
🟠ACCESS EXCLUSIVE:
Самая строгая блокировка, которая блокирует все остальные операции. Применяется при структурных изменениях таблицы (например, ALTER TABLE, DROP TABLE).
🚩Блокировки на уровне строк (Row-Level Locks)
Эти блокировки касаются отдельных строк и контролируют доступ к данным на более детальном уровне.
🟠SELECT FOR UPDATE:
Блокирует выбранные строки для обновления другими транзакциями. Такие строки могут изменяться только текущей транзакцией.
🟠SELECT FOR SHARE:
Блокирует строки для чтения, но не для изменений. Другие транзакции могут читать эти строки, но не изменять.
🟠SELECT FOR NO KEY UPDATE:
Похожа на SELECT FOR UPDATE, но позволяет другим транзакциям выполнять операции, которые не затрагивают ключи.
🟠SELECT FOR KEY SHARE:
Похожа на SELECT FOR SHARE, но разрешает другим транзакциям выполнять операции, не изменяющие строки.
🚩Блокировки на уровне индексов (Index-Level Locks)
Эти блокировки используются для управления доступом к индексам и обеспечивают целостность индексированных данных.
🟠Блокировки индексов:
Автоматически применяются при работе с индексами для защиты данных. Включают блокировки при обновлении или чтении индексов.
🚩Дедлоки (Deadlocks)
Дедлоки возникают, когда две или более транзакций взаимно блокируют друг друга, ожидая освобождения ресурсов. PostgreSQL самостоятельно обнаруживает дедлоки и прерывает одну из транзакций, чтобы решить проблему.
🚩Примеры использования
🟠Обеспечение целостности данных:
Применение блокировок для предотвращения одновременных изменений данных.
🟠Управление одновременным доступом:
Использование блокировок для контроля доступа к ресурсам в многопользовательских системах.
🟠Оптимизация работы:
Выбор подходящих видов блокировок для баланса между целостностью данных и производительностью.
Ставь 👍 и 📚
@backendquiz
105
10:43
30.04.2025
🤔 Каковы различия между RIGHT, LEFT, INNER и JOIN?
JOIN в SQL применяется для объединения строк из двух таблиц на основе связанного столбца. Существует несколько типов JOIN, и каждый из них определяет, какие строки из таблиц будут в итоговом результате.
🟠INNER JOIN
Выбирает только те строки, которые имеют совпадения в обеих таблицах. Если в одной из таблиц отсутствует соответствующее значение, строка не будет включена в результат.
🟠LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы, а из правой – только совпадающие. Если в правой таблице нет совпадения, в итоговом наборе будут NULL-значения.
🟠RIGHT JOIN (или RIGHT OUTER JOIN)
Возвращает все строки из правой таблицы, а из левой – только совпадающие. Если в левой таблице нет соответствующего значения, в результате будут NULL.
🟠FULL JOIN (или FULL OUTER JOIN)
Возвращает все строки из обеих таблиц. Если в одной из таблиц нет соответствующей записи, подставляются NULL.
Ставь 👍 и 📚
@backendquiz
JOIN в SQL применяется для объединения строк из двух таблиц на основе связанного столбца. Существует несколько типов JOIN, и каждый из них определяет, какие строки из таблиц будут в итоговом результате.
🟠INNER JOIN
Выбирает только те строки, которые имеют совпадения в обеих таблицах. Если в одной из таблиц отсутствует соответствующее значение, строка не будет включена в результат.
🟠LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы, а из правой – только совпадающие. Если в правой таблице нет совпадения, в итоговом наборе будут NULL-значения.
🟠RIGHT JOIN (или RIGHT OUTER JOIN)
Возвращает все строки из правой таблицы, а из левой – только совпадающие. Если в левой таблице нет соответствующего значения, в результате будут NULL.
🟠FULL JOIN (или FULL OUTER JOIN)
Возвращает все строки из обеих таблиц. Если в одной из таблиц нет соответствующей записи, подставляются NULL.
Ставь 👍 и 📚
@backendquiz
129
10:47
29.04.2025
🤔 Какие существуют типы объединений (JOIN)?
В реляционных базах данных операции объединения позволяют соединить строки из двух или более таблиц на основе связанных столбцов. Существует несколько типов JOIN, каждый из которых имеет свои особенности и применяется в разных ситуациях. Рассмотрим основные типы JOIN:
🟠INNER JOIN
Объединяет строки из обеих таблиц, если они соответствуют условию объединения. Это необходимо, когда нужно выбрать только те строки, которые имеют совпадающие значения в обеих таблицах.
SELECT *
FROM таблица1
INNER JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
🟠LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствующей строки, то в результирующем наборе данных для столбцов правой таблицы будут значения NULL. Это нужно, когда необходимо выбрать все строки из одной таблицы и соответствующие данные из другой таблицы, если таковые имеются.
SELECT *
FROM таблица1
LEFT JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
🟠RIGHT JOIN (или RIGHT OUTER JOIN)
Возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если в левой таблице нет соответствующей строки, то в результирующем наборе данных для столбцов левой таблицы будут значения NULL. Это необходимо, когда нужно выбрать все строки из одной таблицы (правой) и соответствующие данные из другой таблицы (левой), если они существуют.
SELECT *
FROM таблица1
RIGHT JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
🟠FULL JOIN (или FULL OUTER JOIN)
Возвращает все строки, когда есть совпадения либо в левой, либо в правой таблице. Если строки не соответствуют в одной из таблиц, для этой таблицы будут значения NULL. Это нужно, когда необходимо выбрать все строки из обеих таблиц, независимо от наличия соответствующих строк в другой таблице.
SELECT *
FROM таблица1
FULL JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
🟠CROSS JOIN
Возвращает декартово произведение двух таблиц, то есть все возможные комбинации строк из обеих таблиц. Это нужно, когда необходимо создать все возможные комбинации строк из обеих таблиц. Используется редко и с осторожностью, так как может привести к очень большому количеству строк.
SELECT *
FROM таблица1
CROSS JOIN таблица2;
🟠SELF JOIN
Применяется для объединения таблицы самой с собой. Обычно используется для сравнения строк внутри одной и той же таблицы. Это необходимо, когда нужно сопоставить строки одной таблицы друг с другом, например, для анализа иерархий или поиска парных записей.
SELECT A.*
FROM таблица A, таблица B
WHERE A.ключ = B.ключ;
🟠NATURAL JOIN
Автоматически объединяет таблицы по всем столбцам с одинаковыми именами и типами данных. Это нужно, когда у таблиц есть столбцы с одинаковыми именами и нужно объединить их без явного указания условий объединения.
SELECT *
FROM таблица1
NATURAL JOIN таблица2;
Ставь 👍 и 📚
@backendquiz
В реляционных базах данных операции объединения позволяют соединить строки из двух или более таблиц на основе связанных столбцов. Существует несколько типов JOIN, каждый из которых имеет свои особенности и применяется в разных ситуациях. Рассмотрим основные типы JOIN:
🟠INNER JOIN
Объединяет строки из обеих таблиц, если они соответствуют условию объединения. Это необходимо, когда нужно выбрать только те строки, которые имеют совпадающие значения в обеих таблицах.
SELECT *
FROM таблица1
INNER JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
🟠LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствующей строки, то в результирующем наборе данных для столбцов правой таблицы будут значения NULL. Это нужно, когда необходимо выбрать все строки из одной таблицы и соответствующие данные из другой таблицы, если таковые имеются.
SELECT *
FROM таблица1
LEFT JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
🟠RIGHT JOIN (или RIGHT OUTER JOIN)
Возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если в левой таблице нет соответствующей строки, то в результирующем наборе данных для столбцов левой таблицы будут значения NULL. Это необходимо, когда нужно выбрать все строки из одной таблицы (правой) и соответствующие данные из другой таблицы (левой), если они существуют.
SELECT *
FROM таблица1
RIGHT JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
🟠FULL JOIN (или FULL OUTER JOIN)
Возвращает все строки, когда есть совпадения либо в левой, либо в правой таблице. Если строки не соответствуют в одной из таблиц, для этой таблицы будут значения NULL. Это нужно, когда необходимо выбрать все строки из обеих таблиц, независимо от наличия соответствующих строк в другой таблице.
SELECT *
FROM таблица1
FULL JOIN таблица2
ON таблица1.ключ = таблица2.ключ;
🟠CROSS JOIN
Возвращает декартово произведение двух таблиц, то есть все возможные комбинации строк из обеих таблиц. Это нужно, когда необходимо создать все возможные комбинации строк из обеих таблиц. Используется редко и с осторожностью, так как может привести к очень большому количеству строк.
SELECT *
FROM таблица1
CROSS JOIN таблица2;
🟠SELF JOIN
Применяется для объединения таблицы самой с собой. Обычно используется для сравнения строк внутри одной и той же таблицы. Это необходимо, когда нужно сопоставить строки одной таблицы друг с другом, например, для анализа иерархий или поиска парных записей.
SELECT A.*
FROM таблица A, таблица B
WHERE A.ключ = B.ключ;
🟠NATURAL JOIN
Автоматически объединяет таблицы по всем столбцам с одинаковыми именами и типами данных. Это нужно, когда у таблиц есть столбцы с одинаковыми именами и нужно объединить их без явного указания условий объединения.
SELECT *
FROM таблица1
NATURAL JOIN таблица2;
Ставь 👍 и 📚
@backendquiz
124
10:52
28.04.2025
imageИзображение не доступно для предпросмотра
Напоминание: вебинар OTUS «Распараллеливаем задачи в C#» уже 30 апреля 📢
Старт: 30 апреля, 20:00 МСК
Что разберём
— Parallel.For и Parallel.ForEach — когда стоит распараллеливать циклы
— AsParallel() и PLINQ — ускоряем LINQ‑запросы и управляем степенью параллелизма
— потокобезопасные коллекции .NET — выбираем ConcurrentDictionary, Bag, Queue на практическом кейсе
Спикер — Виктор Дзицкий, Senior .NET Engineer с опытом оптимизации высоконагруженных сервисов.
Кому будет полезно
— разработчикам C#, желающим выжать максимум из параллелизма
— инженерам, работающим с Big Data или ресурсоёмкими расчётами
— всем, кто строит высокопроизводительные приложения
После вебинара вы сможете
— уверенно применять Parallel и PLINQ в продуктивном коде
— выбирать подходящую коллекцию для потокобезопасного доступа к данным
— повышать производительность сервисов без лишних блокировок
Участие бесплатное, ещё можно успеть.
→ Регистрируйтесь
Реклама. ООО «Отус онлайн‑образование», ОГРН 1177746618576
Старт: 30 апреля, 20:00 МСК
Что разберём
— Parallel.For и Parallel.ForEach — когда стоит распараллеливать циклы
— AsParallel() и PLINQ — ускоряем LINQ‑запросы и управляем степенью параллелизма
— потокобезопасные коллекции .NET — выбираем ConcurrentDictionary, Bag, Queue на практическом кейсе
Спикер — Виктор Дзицкий, Senior .NET Engineer с опытом оптимизации высоконагруженных сервисов.
Кому будет полезно
— разработчикам C#, желающим выжать максимум из параллелизма
— инженерам, работающим с Big Data или ресурсоёмкими расчётами
— всем, кто строит высокопроизводительные приложения
После вебинара вы сможете
— уверенно применять Parallel и PLINQ в продуктивном коде
— выбирать подходящую коллекцию для потокобезопасного доступа к данным
— повышать производительность сервисов без лишних блокировок
Участие бесплатное, ещё можно успеть.
→ Регистрируйтесь
Реклама. ООО «Отус онлайн‑образование», ОГРН 1177746618576
114
07:41
28.04.2025
🤔 Что такое http?
Это протокол прикладного уровня, который является основой передачи данных в Интернете. Он был разработан для передачи гипертекста и других типов медиа между клиентами и серверами. Основные функции HTTP включают инициализацию соединения, запрос ресурсов и получение ответов от сервера.
🚩Основные компоненты HTTP:
🟠Клиент и сервер
HTTP работает по модели клиент-сервер. Клиент, например, веб-браузер, инициирует запросы к серверу, который предоставляет доступ к запрашиваемым ресурсам.
🟠URI (Uniform Resource Identifier)
Используется для идентификации ресурсов. Наиболее распространенным типом URI является URL (Uniform Resource Locator).
🟠Методы HTTP
Определяют действия, которые клиент хочет выполнить над ресурсом. Основные методы включают:
GET: Запрос данных с сервера.
POST: Отправка данных на сервер для обработки.
PUT: Обновление ресурса на сервере.
DELETE: Удаление ресурса с сервера.
🟠Статус-коды
Серверы возвращают клиентам статус-коды, чтобы сообщить о результате обработки запроса. Например, 200 (OK) означает успешное выполнение запроса, а 404 (Not Found) — что ресурс не найден.
🟠Заголовки HTTP
Несут метаданные о запросе или ответе, такие как тип содержимого (Content-Type), длина содержимого (Content-Length), информация об авторизации и так далее.
🟠Сообщения HTTP
Состоят из запроса от клиента и ответа от сервера, каждый из которых включает стартовую строку, заголовки и тело сообщения.
🚩Как это используется:
🟠Веб-серфинг
Каждый раз, когда пользователь вводит URL в адресной строке браузера или нажимает на ссылку, браузер отправляет HTTP-запрос к серверу, который возвращает HTML-страницу.
🟠API
HTTP широко используется для взаимодействия между различными системами через RESTful API. Программы могут отправлять HTTP-запросы для получения данных или выполнения действий на удаленных серверах.
🟠Мобильные приложения
Большинство мобильных приложений взаимодействуют с серверными частями через HTTP, запрашивая и отправляя данные, которые отображаются пользователю.
🟠Загрузка файлов
HTTP используется для скачивания файлов из Интернета.
Ставь 👍 и 📚
@backendquiz
Это протокол прикладного уровня, который является основой передачи данных в Интернете. Он был разработан для передачи гипертекста и других типов медиа между клиентами и серверами. Основные функции HTTP включают инициализацию соединения, запрос ресурсов и получение ответов от сервера.
🚩Основные компоненты HTTP:
🟠Клиент и сервер
HTTP работает по модели клиент-сервер. Клиент, например, веб-браузер, инициирует запросы к серверу, который предоставляет доступ к запрашиваемым ресурсам.
🟠URI (Uniform Resource Identifier)
Используется для идентификации ресурсов. Наиболее распространенным типом URI является URL (Uniform Resource Locator).
🟠Методы HTTP
Определяют действия, которые клиент хочет выполнить над ресурсом. Основные методы включают:
GET: Запрос данных с сервера.
POST: Отправка данных на сервер для обработки.
PUT: Обновление ресурса на сервере.
DELETE: Удаление ресурса с сервера.
🟠Статус-коды
Серверы возвращают клиентам статус-коды, чтобы сообщить о результате обработки запроса. Например, 200 (OK) означает успешное выполнение запроса, а 404 (Not Found) — что ресурс не найден.
🟠Заголовки HTTP
Несут метаданные о запросе или ответе, такие как тип содержимого (Content-Type), длина содержимого (Content-Length), информация об авторизации и так далее.
🟠Сообщения HTTP
Состоят из запроса от клиента и ответа от сервера, каждый из которых включает стартовую строку, заголовки и тело сообщения.
🚩Как это используется:
🟠Веб-серфинг
Каждый раз, когда пользователь вводит URL в адресной строке браузера или нажимает на ссылку, браузер отправляет HTTP-запрос к серверу, который возвращает HTML-страницу.
🟠API
HTTP широко используется для взаимодействия между различными системами через RESTful API. Программы могут отправлять HTTP-запросы для получения данных или выполнения действий на удаленных серверах.
🟠Мобильные приложения
Большинство мобильных приложений взаимодействуют с серверными частями через HTTP, запрашивая и отправляя данные, которые отображаются пользователю.
🟠Загрузка файлов
HTTP используется для скачивания файлов из Интернета.
Ставь 👍 и 📚
@backendquiz
137
10:56
27.04.2025
🤔 Что такое легаси-код для людей, не знакомых с программированием?
Этот термин описывает старый код или программное обеспечение, которое было создано много лет назад, но все еще используется. Важно отметить, что "легаси" не всегда означает "плохой". Этот код может быть ценным и выполнять важные функции, но у него есть свои особенности и проблемы, которые усложняют работу с ним.
🚩Почему возникает легаси-код?
🟠Возраст программного обеспечения.
Программы, написанные 5, 10 или даже 20 лет назад, продолжают функционировать, несмотря на изменения в технологиях.
🟠Отсутствие документации.
Разработчики, создавшие код, могли покинуть компанию, не оставив детальных объяснений.
🟠Эволюция требований.
Код, который был написан для одних задач, со временем может использоваться для других, часто без доработки.
🟠Изменения технологий.
Код создавался на устаревших версиях языков программирования, библиотек или платформ, которые сейчас уже не поддерживаются.
🚩Проблемы легаси-кода
🟠Плохая читаемость.
Код может быть трудным для понимания, особенно если он написан без соблюдения современных стандартов или правил.
🟠Отсутствие тестов.
Старый код часто создавался без автоматизированных тестов, что усложняет внесение изменений.
🟠Зависимость от устаревших технологий.
Код может использовать библиотеки или платформы, которые больше не обновляются или не поддерживаются.
🟠Сложность изменений.
Даже небольшие правки могут привести к неожиданным ошибкам, так как никто не знает всех последствий изменений.
🚩Зачем сохранять легаси-код?
🟠Работает — не трогай.
Если код выполняет свои функции, компании часто решают оставить его без изменений.
🟠Критически важные задачи.
Легаси-код может управлять банковскими системами, производственными линиями или другими системами, от которых зависит бизнес.
🟠Высокая стоимость переписывания.
Полная переработка кода может занять годы и потребовать значительных ресурсов.
🚩Что с ним делать?
🟠Поддерживать.
Исправлять ошибки и улучшать работу системы по мере необходимости.
🟠Обновлять.
Переходить на современные технологии постепенно, чтобы минимизировать риски.
🟠Переписывать.
Создать новую систему, если старая больше не отвечает требованиям, но это требует времени и ресурсов.
Ставь 👍 и 📚
@backendquiz
Этот термин описывает старый код или программное обеспечение, которое было создано много лет назад, но все еще используется. Важно отметить, что "легаси" не всегда означает "плохой". Этот код может быть ценным и выполнять важные функции, но у него есть свои особенности и проблемы, которые усложняют работу с ним.
🚩Почему возникает легаси-код?
🟠Возраст программного обеспечения.
Программы, написанные 5, 10 или даже 20 лет назад, продолжают функционировать, несмотря на изменения в технологиях.
🟠Отсутствие документации.
Разработчики, создавшие код, могли покинуть компанию, не оставив детальных объяснений.
🟠Эволюция требований.
Код, который был написан для одних задач, со временем может использоваться для других, часто без доработки.
🟠Изменения технологий.
Код создавался на устаревших версиях языков программирования, библиотек или платформ, которые сейчас уже не поддерживаются.
🚩Проблемы легаси-кода
🟠Плохая читаемость.
Код может быть трудным для понимания, особенно если он написан без соблюдения современных стандартов или правил.
🟠Отсутствие тестов.
Старый код часто создавался без автоматизированных тестов, что усложняет внесение изменений.
🟠Зависимость от устаревших технологий.
Код может использовать библиотеки или платформы, которые больше не обновляются или не поддерживаются.
🟠Сложность изменений.
Даже небольшие правки могут привести к неожиданным ошибкам, так как никто не знает всех последствий изменений.
🚩Зачем сохранять легаси-код?
🟠Работает — не трогай.
Если код выполняет свои функции, компании часто решают оставить его без изменений.
🟠Критически важные задачи.
Легаси-код может управлять банковскими системами, производственными линиями или другими системами, от которых зависит бизнес.
🟠Высокая стоимость переписывания.
Полная переработка кода может занять годы и потребовать значительных ресурсов.
🚩Что с ним делать?
🟠Поддерживать.
Исправлять ошибки и улучшать работу системы по мере необходимости.
🟠Обновлять.
Переходить на современные технологии постепенно, чтобы минимизировать риски.
🟠Переписывать.
Создать новую систему, если старая больше не отвечает требованиям, но это требует времени и ресурсов.
Ставь 👍 и 📚
@backendquiz
118
11:01
26.04.2025
close
С этим каналом часто покупают
Новинки в тематике
Лучшие в тематике
Выбрано
0
каналов на сумму:0.00₽
Подписчики:
0
Просмотры:
lock_outline
Перейти в корзинуКупить за:0.00₽
Комментарий