1. Используется для выполнения фоновых задач, таких как отправка писем или обработка данных.
2. Поддерживает распределённую архитектуру, масштабируемость и повторное выполнение задач.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
HTTP-методы (или глаголы) определяют тип действия, которое клиент хочет выполнить с ресурсом на сервере.
Назначение: Получение данных с сервера. Используется для чтения информации, не изменяя состояние сервера. Безопасный и идемпотентный метод (выполнение одного и того же запроса несколько раз даёт одинаковый результат).
Запрос страницы или API-ресурса
GET /users/123
Назначение: Создание нового ресурса или выполнение действий на сервере. Может изменять состояние сервера (например, добавлять новые данные). Не идемпотентен (повторный запрос создаёт новый ресурс или дублирует операцию).
Создание нового пользователя
POST /users
Назначение: Полное обновление ресурса на сервере. Идемпотентен (повторный запрос с одинаковыми данными не изменяет результат).
Обновление профиля пользователя:
PUT /users/123
Назначение: Частичное обновление ресурса. Обновляет только указанные поля, не затрагивая остальные. Не всегда идемпотентен (зависит от реализации).
Обновление только имени пользователя
PATCH /users/123
Назначение: Удаление ресурса с сервера. Идемпотентен (повторный запрос удаления того же ресурса не вызывает ошибку).
Удаление пользователя
DELETE /users/123
Назначение: Получение метаинформации о ресурсе без передачи его содержимого. Аналогичен GET, но сервер возвращает только заголовки ответа. Полезен для проверки существования ресурса или его свойств (например, размера).
HEAD /users/123
Назначение: Запрос информации о поддерживаемых сервером методах или возможностях ресурса. Используется, например, в CORS для проверки, какие методы доступны для клиента.
OPTIONS /users
Назначение: Диагностика и отладка соединения между клиентом и сервером. Возвращает запрос клиента в теле ответа, позволяя понять, какие изменения произошли на пути от клиента до сервера. Редко используется из-за риска безопасности.
TRACE /users/123
Назначение: Установка туннеля для защищённого соединения (например, через прокси). Чаще всего используется для создания HTTPS-соединений.
CONNECT www.example.com:443
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
1. Оно используется для эффективного поиска, вставки и удаления элементов.
2. Частные случаи: бинарное дерево поиска (BST) и сбалансированное дерево (например, AVL, красно-чёрное дерево).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Программирование включает множество принципов, которые помогают разработчикам создавать эффективный, читаемый и поддерживаемый код.
Каждый класс должен иметь одну единственную ответственность. Пример: Класс
Invoice должен обрабатывать только логику, связанную с инвойсами, а не управление базой данных или пользовательский интерфейс.Классы должны быть открыты для расширения, но закрыты для модификации. Пример: Добавление нового типа фигуры без изменения существующего кода классов фигур.
Объекты базового класса должны быть заменяемыми объектами подклассов без изменения правильности программы. Пример: Если класс
Bird имеет метод fly, то подкласс Penguin не должен его нарушать.Клиенты не должны быть вынуждены зависеть от интерфейсов, которые они не используют. Пример: Разделение крупного интерфейса на несколько специфичных интерфейсов.
Модули верхнего уровня не должны зависеть от модулей нижнего уровня; оба должны зависеть от абстракций. Пример: Использование интерфейсов для взаимодействия между классами вместо конкретных реализаций.
Избегайте дублирования кода, вынеся повторяющиеся части в отдельные функции или классы. Пример: Использование функций для повторяющихся блоков кода.
Держите код простым и избегайте сложных решений, когда более простое решение будет работать. Пример: Не используйте сложные алгоритмы там, где достаточно простого цикла.
Не реализовывайте функциональность, которая не нужна прямо сейчас. Пример: Добавляйте новые функции только тогда, когда в них есть необходимость.
Разделяйте разные аспекты программы, чтобы каждый модуль решал отдельную задачу. Пример: Отдельные модули для бизнес-логики, пользовательского интерфейса и доступа к данным.
Объект должен общаться только с непосредственными "друзьями" и не тянуть цепочку вызовов. Пример: Использование методов класса без вызова методов через несколько объектов.
Ошибки должны быть выявлены как можно раньше. Пример: Проверка входных данных на валидность в начале функции.
Предпочтение композиции перед наследованием для достижения гибкости. Пример: Использование объектов других классов для расширения функциональности вместо создания подклассов.
Сотрудничество с заказчиком важнее согласования условий контракта. Пример: Регулярные встречи с заказчиком для обсуждения прогресса и изменений.
Готовность к изменениям важнее следования плану. Пример: Внедрение новых требований, даже если они появились на поздних стадиях разработки.
Управление инфраструктурой с помощью кода и автоматизации. Пример: Использование Terraform или Ansible для развертывания серверов.
Автоматизация сборки, тестирования и развертывания приложений. Пример: Использование Jenkins или GitHub Actions для автоматизации процессов разработки.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Асинхронные операции позволяют выполнять задачи без блокировки основного потока.
1. Они полезны для работы с сетевыми запросами, ввода/вывода и долгих вычислений.
2. Асинхронность повышает производительность и отзывчивость приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это практика автоматизации и оптимизации процессов доставки приложений и их обновлений в рабочую среду. Она является частью DevOps-подхода и тесно связана с CI (Continuous Integration).
Continuous Delivery подразумевает автоматизацию процессов сборки, тестирования и подготовки приложения к выпуску в продакшн. Однако процесс развертывания остаётся ручным, чтобы команда могла контролировать его выполнение. Ключевые особенности:
Автоматическое развертывание приложения в тестовые и предрелизные среды.
Возможность развернуть приложение в продакшн в любой момент с минимальными усилиями.
Финальное решение о развертывании принимает человек.
Цель: Быть готовым к безопасному и быстрому выпуску обновлений в любой момент.
Пример использования:
В интернет-магазине обновление функционала сначала разворачивается в тестовой среде. После успешной проверки QA-командой или бизнес-менеджером приложение вручную переносится в продакшн.
Continuous Deployment идёт дальше Continuous Delivery, автоматически развертывая обновления в продакшн после успешного прохождения всех тестов. Процесс полностью автоматизирован и исключает ручное вмешательство. Ключевые особенности:
Абсолютная автоматизация — каждый подтверждённый код (коммит) автоматически попадает в продакшн.
Постоянный выпуск обновлений, минимизирующий разницу между разработкой и рабочей средой.
Цель: Сократить время доставки функционала и исправлений до продакшна, обеспечивая быстрые релизы.
Пример использования:
В приложении социальной сети любые изменения (например, исправление ошибки или добавление нового поста) автоматически проходят через CI/CD pipeline и попадают в продакшн.
Автоматизированный процесс, включающий сборку, тестирование, развертывание.
Юнит-тесты.
Интеграционные тесты.
Нагрузочные тесты.
Проверка безопасности.
Использование инструментов (Jenkins, GitLab CI/CD, CircleCI, GitHub Actions). Контейнеризация (Docker, Kubernetes).
Автоматическое отслеживание работоспособности приложений (Prometheus, Grafana).
Ускоряет доставку новых функций и исправлений.
Раннее выявление ошибок благодаря автоматическим тестам.
Процесс развертывания становится понятным для всей команды.
Возможность быстро реагировать на изменения требований.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это принцип, предполагающий минимизацию дублирования кода.
1. Код, повторяющийся в нескольких местах, должен быть вынесен в одну общую функцию или модуль.
2. Применение DRY улучшает читаемость, тестируемость и уменьшает вероятность ошибок.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Это архитектурный шаблон, который разделяет приложение на три части: Model (данные и логика), View (интерфейс) и ViewModel (связь между Model и View).
Model
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
ViewModel
public class UserViewModel : INotifyPropertyChanged
{
private ObservableCollection<User> _users;
public ObservableCollection<User> Users
{
get { return _users; }
set
{
_users = value;
OnPropertyChanged(nameof(Users));
}
}
public UserViewModel()
{
Users = new ObservableCollection<User>
{
new User { Name = "John Doe", Age = 30 },
new User { Name = "Jane Doe", Age = 25 }
};
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
View (XAML)
<Window x:Class="MVVMExample.MainWindow"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox ItemsSource="{Binding Users}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
Код за View (Code-behind)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new UserViewModel();
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Он решает задачу эффективно, минимизируя использование ресурсов.
2. Код должен быть модульным, тестируемым и легко расширяемым.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Уровни изоляции транзакций в SQL определяют, как взаимодействуют параллельные транзакции и какие аномалии данных они предотвращают.
Видит изменения, даже если они не зафиксированы. Аномалии: грязное чтение.
Видит только зафиксированные изменения. Аномалии: неповторяющееся чтение.
Сохраняет консистентность чтения данных в пределах одной транзакции. Аномалии: фантомные чтения.
Полная изоляция транзакций, как если бы они выполнялись последовательно. Аномалии: никаких.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Применяется для кэширования, управления сессиями, очередей сообщений и анализа данных.
2. Поддерживает сложные структуры данных (например, списки, множества, хэши).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Хеш-функция — это функция, которая принимает входные данные (ключ) и возвращает фиксированное число, называемое хешем (или хеш-значением). Основная цель хеш-функции — преобразовать произвольные данные в числовое значение определенного диапазона.
def simple_hash(key, table_size):
return len(key) % table_size
def djb2_hash(key):
hash_value = 5381
for char in key:
hash_value = ((hash_value << 5) + hash_value) + ord(char) # hash_value * 33 + ord(char)
return hash_value
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
2. Применить триггеры для контроля операций INSERT и UPDATE.
3. Настроить вьюхи (VIEW) для скрытия определённых столбцов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Уровни изоляции транзакций определяют степень видимости изменений, сделанных одной транзакцией, для других параллельно выполняющихся транзакций. Они помогают контролировать влияние транзакций друг на друга и управляют различными типами аномалий, такими как "грязное" чтение, неповторяющееся чтение и фантомные чтения. В стандарте SQL-92 определены четыре уровня изоляции транзакций:
Транзакция может видеть изменения, сделанные другими транзакциями, даже если эти изменения еще не были зафиксированы (не подтверждены).
Транзакция может прочитать данные, которые были изменены другой транзакцией, но не были зафиксированы.
Транзакция может видеть разные значения данных при повторном чтении, если другая транзакция изменила эти данные и зафиксировала изменения.
Транзакция может видеть новые строки, добавленные другой транзакцией, при повторном выполнении запроса.
Транзакция может видеть только изменения, которые были зафиксированы другими транзакциями. Неподтвержденные изменения не видны.
Транзакция может видеть разные значения данных при повторном чтении, если другая транзакция изменила и зафиксировала эти данные.
Транзакция может видеть новые строки, добавленные другой транзакцией, при повторном выполнении запроса.
Транзакция гарантирует, что если она прочитала данные в начале транзакции, эти данные останутся неизменными до конца транзакции. Транзакция не видит изменения данных, сделанные другими транзакциями после начала текущей транзакции.
Фантомные чтения (Phantom Read): Транзакция может видеть новые строки, добавленные другой транзакцией, при повторном выполнении запроса.
Транзакция выполняется так, как если бы она была единственной, работающей в системе. Другие транзакции не могут добавлять, изменять или удалять данные, пока текущая транзакция не завершится. Это самый строгий уровень изоляции. Все аномалии (грязное чтение, неповторяющееся чтение, фантомные чтения) предотвращаются.
-- Установка уровня изоляции
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Пример на Java (использование JDBC)
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
- MySQL: LIMIT для ограничения результатов.
- PostgreSQL: поддержка RETURNING и продвинутых функций работы с JSON.
- SQL Server: использует TOP вместо LIMIT.
- SQLite: минималистичный и поддерживает только базовые функции.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
то протокол прикладного уровня, который является основой передачи данных в Интернете. Он был разработан для передачи гипертекста и других типов медиа между клиентами и серверами. Основные функции HTTP включают инициализацию соединения, запрос ресурсов и получение ответов от сервера.
HTTP работает по модели клиент-сервер. Клиент, например, веб-браузер, инициирует запросы к серверу, который предоставляет доступ к запрашиваемым ресурсам.
Используется для идентификации ресурсов. Наиболее распространенным типом URI является URL (Uniform Resource Locator).
Определяют действия, которые клиент хочет выполнить над ресурсом. Основные методы включают:
GET: Запрос данных с сервера.
POST: Отправка данных на сервер для обработки.
PUT: Обновление ресурса на сервере.
DELETE: Удаление ресурса с сервера.
Серверы возвращают клиентам статус-коды, чтобы сообщить о результате обработки запроса. Например, 200 (OK) означает успешное выполнение запроса, а 404 (Not Found) — что ресурс не найден.
Несут метаданные о запросе или ответе, такие как тип содержимого (Content-Type), длина содержимого (Content-Length), информация об авторизации и так далее.
Состоят из запроса от клиента и ответа от сервера, каждый из которых включает стартовую строку, заголовки и тело сообщения.
Каждый раз, когда пользователь вводит URL в адресной строке браузера или нажимает на ссылку, браузер отправляет HTTP-запрос к серверу, который возвращает HTML-страницу.
HTTP широко используется для взаимодействия между различными системами через RESTful API. Программы могут отправлять HTTP-запросы для получения данных или выполнения действий на удаленных серверах.
Большинство мобильных приложений взаимодействуют с серверными частями через HTTP, запрашивая и отправляя данные, которые отображаются пользователю.
HTTP используется для скачивания файлов из Интернета.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
2. One-to-Many (Один ко многим): связь, где одна запись связана с несколькими записями из другой таблицы.
3. Many-to-Many (Многие ко многим): связь между таблицами через промежуточную таблицу.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Это процесс организации данных для минимизации избыточности и избегания аномалий при внесении данных. Нормальные формы (NF) — это набор правил, которые помогают в нормализации баз данных.
Таблица находится в 1NF, если: Все столбцы содержат атомарные значения, то есть каждое значение в столбце неделимо. Все строки уникальны, нет повторяющихся строк.
Пример: Если у вас есть таблица с заказами, и каждый заказ может содержать несколько продуктов, вместо хранения всех продуктов в одном столбце, нужно разбить их на отдельные строки.
Таблица находится во 2NF, если: Она находится в 1NF. Все неключевые столбцы полностью зависят от всего первичного ключа, а не от его части.
Пример
Если в таблице "Заказы" у вас есть составной ключ (OrderID, ProductID), то столбцы, зависящие только от OrderID (например, OrderDate), должны быть вынесены в отдельную таблицу.
Таблица находится в 3NF, если: Она находится во 2NF. Все неключевые столбцы зависят только от первичного ключа, а не от других неключевых столбцов.
Пример
Если в таблице "Сотрудники" у вас есть столбцы EmployeeID, DepartmentID и DepartmentName, нужно вынести DepartmentName в отдельную таблицу "Департаменты", чтобы избежать зависимости между неключевыми столбцами.
Таблица находится в BCNF, если: Она находится в 3NF. Для каждой функциональной зависимости X -> Y, X является суперключом.
Пример:
Если в таблице "Курс" есть зависимости (Professor, Course) -> Room и Room -> Capacity, необходимо реструктурировать таблицу так, чтобы не было зависимостей, где детерминанты не являются суперключами.
Таблица находится в 4NF, если: Она находится в BCNF. В ней нет многозначных зависимостей (Multivalued Dependencies).
Пример:
Если студент может записаться на несколько курсов и участвовать в нескольких клубах, то эти зависимости должны быть вынесены в отдельные таблицы.
Таблица находится в 5NF, если: Она находится в 4NF. В ней нет соединительных зависимостей (Join Dependencies), которые нельзя разделить без потери данных.
Пример:
Если у вас есть сложные зависимости между несколькими таблицами, то нужно убедиться, что все соединения этих таблиц могут быть разложены обратно без потери информации.
Таблица находится в DKNF, если: Все ограничения и зависимости выражаются только через домены и ключи таблицы, и отсутствуют аномалии при вставке, обновлении или удалении данных.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
- NoSQL (нереляционная): предназначена для работы с неструктурированными данными, более гибкая, поддерживает горизонтальное масштабирование.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В Git команды
rebase и merge используются для объединения изменений из разных веток, но делают это по-разному. Основное различие между ними заключается в том, как они сохраняют историю коммитов и как они влияют на структуру репозитория.Объединяет две ветки, создавая новый коммит слияния (merge commit), который имеет две родительских ветки. Сохраняет всю историю коммитов обеих веток без изменений. История ветвления и слияния сохраняется. Если есть конфликты, Git предложит их разрешить перед созданием коммита слияния.
git merge <branch>git checkout main
git merge feature-branch
Переносит все коммиты текущей ветки на вершину целевой ветки. Это делает историю линейной, как если бы изменения были сделаны последовательно. Изменяет историю коммитов, создавая новые коммиты для каждого коммита из текущей ветки. История ветвления исчезает. Если есть конфликты, Git предложит их разрешить по мере переноса каждого коммита.
git rebase <branch>git checkout feature-branch
git rebase main
Процесс слияния прост и понятен.
Вся история коммитов сохраняется, включая информацию о ветвлении и слиянии.
Создаются дополнительные коммиты слияния, что может усложнить историю.
История линейная и более читабельная.
Проще следить за последовательностью изменений.
Изменение коммитов может привести к проблемам, если кто-то уже основывается на этих коммитах.
Может потребоваться больше усилий для разрешения конфликтов, особенно если коммитов много.
Когда важно сохранить полную историю изменений, включая ветвление и слияние. В крупных командных проектах, где история изменений важна для отслеживания.
Когда важно иметь чистую и линейную историю изменений. Для интеграции изменений из основной ветки в текущую рабочую ветку перед отправкой изменений в основную ветку.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM