Forwarded from easyoffer
🎉 easyoffer 2.0 — релиз уже в этом месяце!
Вас ждут новые фичи, о которых мы ранее даже не упоминали. Они сделают путь к офферам ещё быстрее и эффективнее. Расскажу о них чуть позже 👀
В честь запуска мы готовим ограниченную акцию:
Первые 500 покупателей получат:
🚀 PRO тариф на 1 год с 50% скидкой
Что нужно сделать:
🔔 Подпишитесь на этот Telegram-канал, чтобы первыми узнать о старте релиза. Сообщение появится в нем раньше, чем где-либо еще — вы успеете попасть в число первых 500 и получить максимальную выгоду. 🎁 А еще только для подписчиков канала ценный бонус в подарок к PRO тарифу.
📅 Официальный запуск — уже совсем скоро.
Следите за новостями и не пропустите старт!
Вас ждут новые фичи, о которых мы ранее даже не упоминали. Они сделают путь к офферам ещё быстрее и эффективнее. Расскажу о них чуть позже 👀
В честь запуска мы готовим ограниченную акцию:
Первые 500 покупателей получат:
🚀 PRO тариф на 1 год с 50% скидкой
Что нужно сделать:
🔔 Подпишитесь на этот Telegram-канал, чтобы первыми узнать о старте релиза. Сообщение появится в нем раньше, чем где-либо еще — вы успеете попасть в число первых 500 и получить максимальную выгоду. 🎁 А еще только для подписчиков канала ценный бонус в подарок к PRO тарифу.
📅 Официальный запуск — уже совсем скоро.
Следите за новостями и не пропустите старт!
Это метод горизонтального разбиения базы данных на более мелкие, более управляемые сегменты, называемые шардов (shards). Каждый шард является независимой базой данных, содержащей подмножество всех данных. Шардирование используется для повышения производительности и масштабируемости базы данных, особенно при работе с большими объемами данных и высокими нагрузками.
Шардирование распределяет строки таблицы по нескольким базам данных, а не делит таблицы на части. Это позволяет уменьшить нагрузку на одну базу данных и распределить её между несколькими серверами.
Каждый шард является автономной базой данных и может находиться на отдельном сервере. Это позволяет шардированным системам эффективно масштабироваться, добавляя новые сервера для хранения и обработки данных.
Ключ шардирования (shard key) используется для определения, в каком шарде будут храниться данные. Выбор правильного ключа шардирования имеет решающее значение для равномерного распределения данных и нагрузки.
Шардирование позволяет горизонтально масштабировать базу данных, добавляя новые шардовые серверы по мере роста объема данных и нагрузки.
Распределение данных между несколькими серверами уменьшает нагрузку на каждый сервер, что может улучшить производительность запросов и операций записи.
Шардирование может повысить устойчивость системы к отказам, так как сбой одного шарда не влияет на доступность остальных.
Меньшие по объему базы данных (шарды) легче управлять, бэкапить и восстанавливать по сравнению с одной большой базой данных.
Настройка и управление шардированной базой данных сложнее, чем управление одной большой базой данных. Это требует дополнительного усилия для настройки и мониторинга.
Транзакции, охватывающие несколько шардов, становятся сложнее и могут требовать использования распределенных транзакционных механизмов, что может негативно сказаться на производительности.
Некоторые запросы, особенно те, которые требуют объединения данных из разных шардов, становятся сложнее и могут требовать дополнительной логики на уровне приложения.
Неправильный выбор ключа шардирования может привести к неравномерному распределению данных, где одни шарды перегружены, а другие остаются недозагруженными.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
WebSockets (веб-сокеты) — это коммуникационный протокол, предоставляющий возможность устанавливать постоянное, двустороннее соединение между клиентом (обычно веб-браузером) и сервером через один TCP-соединение. Это позволяет обмениваться данными в реальном времени с минимальной задержкой и без необходимости повторного открытия соединения для каждого обмена сообщениями, как это происходит в традиционных HTTP-соединениях.
Upgrade.Upgrade: websocket на сервер, указывая на желание перейти к протоколу WebSocket. Сервер отвечает подтверждением, если поддерживает WebSockets, и соединение устанавливается.Преимущества WebSocket:
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Плохая организация кода — это один из главных факторов, который делает поддержку и развитие проекта сложными. Определить, что код плохо организован, можно по следующим признакам:
- Файлы и каталоги разбросаны хаотично.
- Код находится в одном огромном файле без логического разделения.
- Нет четкой модулярности (всё смешано в одном месте).
- Один и тот же фрагмент кода повторяется в разных местах вместо вынесения в отдельные функции или классы.
- При внесении изменений приходится исправлять одну и ту же логику в нескольких местах.
- Функции или методы слишком длинные и делают слишком много.
- Код трудно читать из-за вложенных конструкций (
if, for, while и т. д.).- Используются сложные алгоритмы там, где можно было бы обойтись более простыми.
- Один класс выполняет несколько задач (нарушение *Single Responsibility Principle*).
- Сильная зависимость между модулями (нарушение *Dependency Inversion Principle*).
- Проблемы с расширяемостью кода.
- Используются непонятные или слишком короткие названия (
a, x1, doSomething).- Название не отражает суть выполняемой операции.
- Если документации нет, код сложно понять.
- Если документации слишком много, и она не актуальна, это также мешает.
- Компоненты сильно зависят друг от друга, что усложняет тестирование и внесение изменений.
- Модули не могут использоваться независимо.
- Если код сложно протестировать, это признак плохой организации.
- Нет юнит-тестов или они покрывают только тривиальные случаи.
- Ошибки не логируются, а просто подавляются (
try...catch с пустым catch).- Ошибки обрабатываются хаотично.
- Избыточное потребление памяти или процессорных ресурсов из-за неоптимальных алгоритмов.
- Использование ненужных циклов, повторные вызовы функций.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
IP (Internet Protocol) — это основной протокол сетевого уровня, который используется для передачи данных через интернет и другие сети. IP отвечает за маршрутизацию и адресацию пакетов данных, обеспечивая их доставку от отправителя к получателю.
Адресация: IP адресация обеспечивает уникальные адреса для устройств в сети, что позволяет им взаимодействовать друг с другом. Существует две версии IP адресации:
Маршрутизация: IP отвечает за определение пути для передачи пакетов от источника к назначению через сеть, включая множество промежуточных маршрутизаторов. Это позволяет передавать данные через различные сети и соединения.
Фрагментация и сборка: IP может разделять большие пакеты данных на более мелкие фрагменты, чтобы они могли быть переданы через сети с различными ограничениями по размеру пакетов. Получатель затем собирает фрагменты обратно в исходный пакет.
Пакетная передача: IP передает данные в виде пакетов. Каждый пакет содержит заголовок с информацией об адресации и маршрутизации, а также полезную нагрузку с передаваемыми данными.
IP является стандартным протоколом для передачи данных в интернете и поддерживается всеми сетевыми устройствами.
IP может передавать данные через различные типы сетей и соединений.
IPv6 предоставляет практически неограниченное количество адресов для подключения новых устройств к сети.
IP сам по себе не предоставляет механизмов для шифрования или аутентификации данных, что делает его уязвимым для атак.
IP работает в комбинации с другими протоколами, чтобы обеспечить полное взаимодействие в сети:
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Это команда в системе управления версиями Git, которая позволяет выбрать один или несколько конкретных коммитов из одной ветки и применить их в другую ветку. Это полезно, когда нужно перенести отдельные изменения без необходимости слияния целых веток.
Позволяет выбрать конкретные изменения из истории одной ветки и перенести их в другую ветку.
В отличие от обычного слияния (merge), cherry-pick переносит только выбранные коммиты, а не всю историю изменений.
Основной синтаксис
git cherry-pick <commit_hash>
Переключитесь на ветку, в которую нужно перенести изменения.
git checkout target-branch
Используйте команду cherry-pick, чтобы применить нужный коммит.
git cherry-pick a1b2c3d4
Если во время cherry-pick возникают конфликты, Git предложит их решить. Разрешите конфликты, затем завершите процесс:
git add <resolved_files>
git cherry-pick --continue
Предположим, у вас есть коммит с хешем
a1b2c3d4 в ветке feature-branch, который вы хотите перенести в main-branch.git checkout main-branch
git cherry-pick a1b2c3d4
Когда нужно быстро перенести исправление из одной ветки в другую (например, багфикс из
develop в release).Когда нужно перенести конкретную функцию или изменение без переноса всей ветки.
Перенос коммитов может вызвать конфликты, особенно если изменяемые файлы были модифицированы в целевой ветке.
Частое использование cherry-pick может запутать историю изменений, так как один и тот же коммит будет существовать в нескольких ветках с разными хешами.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
XSS (Cross-Site Scripting) — это тип атаки на веб-приложения, при котором злоумышленник внедряет вредоносный скрипт (обычно JavaScript) в веб-страницу, которую просматривает пользователь. Это позволяет атакующему выполнять произвольный код в контексте браузера жертвы, что может привести к краже данных, угону сессий или изменению содержимого страницы.
Вредоносный код сохраняется в базе данных или другом постоянном хранилище. Например, пользователь вводит в комментарий
<script>...</script>, который сохраняется в БД и выполняется при просмотре комментариев. Вредоносный код передаётся в запросе и немедленно отображается без обработки. Например, если строка запроса
?search=<script>alert('XSS')</script> отображается на странице без фильтрации, скрипт выполнится. Возникает, когда JavaScript на клиенте изменяет DOM, используя входные данные, не проверяя их безопасность. Например, если код
document.write(location.hash); вставляет содержимое URL-хэша (#<script>alert('XSS')</script>) в страницу, скрипт выполнится. Кража cookies и сессионных данных.
Фишинг-атаки (изменение содержимого страниц).
Выполнение произвольных действий от лица пользователя.
Перенаправление на вредоносные сайты.
Используйте
htmlspecialchars() (PHP), encodeURIComponent() (JS) или аналогичные методы для предотвращения исполнения HTML-кода. Проверяйте и ограничивайте вводимые пользователем данные (например, запрещайте
<script>). CSP ограничивает выполнение скриптов только из доверенных источников.
Флаг
HttpOnly запрещает доступ к cookie через JavaScript, а Secure требует HTTPS. Эти методы позволяют вставлять HTML и JavaScript без защиты.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это термин, которым называют старый код или программное обеспечение, созданное много лет назад, но до сих пор используемое. Важно понимать, что "легаси" не обязательно означает "плохой". Этот код может быть ценным и выполнять критически важные задачи, но у него есть свои особенности и проблемы, которые делают работу с ним сложной.
Программы, написанные 5, 10 или даже 20 лет назад, продолжают работать, хотя технологии уже изменились.
Разработчики, написавшие код, могли уйти из компании, не оставив подробных объяснений.
Код, который был написан для одних задач, со временем начинает использоваться для других, часто без переработки.
Код создавался на старых версиях языков программирования, библиотек или платформ, которые сегодня уже не поддерживаются.
Код может быть сложно понять, особенно если он написан без соблюдения современных стандартов или правил.
Старый код часто создавался без автоматизированных тестов, что усложняет внесение изменений.
Код может использовать библиотеки или платформы, которые больше не обновляются или не поддерживаются.
Даже небольшие правки могут вызвать неожиданные ошибки, поскольку никто не знает всех последствий изменений.
Если код выполняет свою задачу, компании часто решают оставить его как есть.
Легаси-код может управлять банковскими системами, производственными линиями или другими системами, от которых зависит бизнес.
Полная переработка кода может занять годы и потребовать огромных ресурсов.
Исправлять ошибки и улучшать работу системы по мере необходимости.
Переходить на современные технологии частями, чтобы минимизировать риски.
Создать новую систему, если старая больше не отвечает требованиям, но это требует времени и ресурсов.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
В реляционных базах данных SQL используется несколько видов операций
JOIN для объединения строк из двух или более таблиц на основе связанных столбцов. Каждая из этих операций предназначена для определенных сценариев. Основные виды JOIN включают:INNER JOIN возвращает строки, которые имеют совпадающие значения в обеих таблицах. Это наиболее часто используемый тип
JOIN.Использование: Для извлечения данных, которые имеют соответствующие записи в обеих таблицах.
LEFT JOIN (или LEFT OUTER JOIN) возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если нет совпадения, то результаты из правой таблицы будут NULL. Использование: Когда необходимо получить все данные из одной таблицы и только соответствующие данные из другой.
RIGHT JOIN (или RIGHT OUTER JOIN) возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если нет совпадения, то результаты из левой таблицы будут NULL. Использование: Когда необходимо получить все данные из правой таблицы и только соответствующие данные из левой.
FULL JOIN (или FULL OUTER JOIN) возвращает все строки, когда есть совпадение в одной из таблиц. Если совпадения нет, то возвращаются NULL для соответствующей таблицы. Использование: Для получения всех данных из обеих таблиц, независимо от совпадений.
CROSS JOIN возвращает декартово произведение двух таблиц, то есть каждая строка из первой таблицы соединяется с каждой строкой из второй таблицы. Использование: Когда требуется комбинировать все строки из двух таблиц без учета связи.
SELF JOIN это особый случай JOIN, где таблица соединяется сама с собой. Обычно используется с псевдонимами таблиц для различения различных экземпляров одной и той же таблицы. Использование: Для сравнения строк внутри одной таблицы.
Для получения списка студентов и их курсов.
Для получения всех сотрудников и их проектов, даже если у сотрудника нет проекта.
Для получения всех проектов и сотрудников, даже если у проекта нет назначенного сотрудника.
Для получения полной информации о студентах и курсах, включая тех, кто еще не записан на курс или курсы, на которые еще никто не записан.
Для создания всех возможных комбинаций продуктов и категорий.
Для нахождения пар сотрудников из одной таблицы с одинаковыми менеджерами.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Это архитектурный шаблон, который разделяет приложение на три части: 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
Обнаружение самых затратных запросов важно для оптимизации производительности базы данных. Затратные запросы могут потреблять больше ресурсов, чем необходимо, что приводит к увеличению времени выполнения, нагрузке на сервер и замедлению работы системы. Существует несколько подходов и инструментов для выявления таких запросов.
Многие системы управления базами данных (СУБД) поддерживают логирование запросов, выполнение которых занимает больше определённого времени.
Используйте
slow_query_log. Активировать лог:SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- Время выполнения в секундах
Включите
log_min_duration_statement.SET log_min_duration_statement = 1000; -- Логировать запросы, выполняющиеся более 1 секунды
Эти команды дают подробный план выполнения запросов, показывая, как база данных интерпретирует их.
MySQL
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
PostgreSQL
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM orders WHERE status = 'pending';
Используйте таблицу
performance_schema для анализа запросов.SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
Используйте расширение
pg_stat_statements.CREATE EXTENSION pg_stat_statements;
Получите информацию
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
Проводит анализ SQL-запросов, показывая самые медленные.
Позволяет отслеживать производительность запросов в реальном времени.
Специализированный инструмент для анализа производительности баз данных.
SELECT * FROM sys.schema_unused_indexes;
Проверьте в плане выполнения запросов (
EXPLAIN), используются ли индексы.Используйте нагрузочные тесты, чтобы выявить запросы, создающие "бутылочные горлышки":
Симулирует многопоточную нагрузку на базу данных.
Анализирует производительность системы под высокой нагрузкой.
Включите трассировку (например, в MySQL —
SHOW PROFILE):SET profiling = 1;
SELECT * FROM orders WHERE status = 'pending';
SHOW PROFILE FOR QUERY 1;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Разница между SQL и NoSQL базами данных заключается в их архитектуре, структуре, методах хранения данных и использовании. Рассмотрим эти различия подробнее.
SQL (Structured Query Language) базы данных
Реляционные базы данных: SQL базы данных являются реляционными и используют таблицы для хранения данных. Каждая таблица состоит из строк и столбцов, что позволяет структурировать данные в виде отношений.
Схемы данных: SQL базы данных требуют четко определенных схем (schemas), которые строго контролируют структуру данных. Все записи в таблице должны следовать заранее определенной структуре.
Язык запросов: SQL использует структурированный язык запросов для манипуляции данными. Язык SQL стандартизирован и включает команды для создания, чтения, обновления и удаления данных (CRUD).
Нереляционные базы данных: NoSQL базы данных не обязательно используют таблицы для хранения данных. Вместо этого они могут использовать различные модели данных, такие как документы, графы, ключ-значение и столбцы
Гибкость схем: NoSQL базы данных часто не требуют фиксированных схем. Это позволяет хранить данные разной структуры в одной и той же коллекции или таблице.
Разнообразие языков запросов: В NoSQL базах данных отсутствует единый стандарт языка запросов. Они могут использовать различные методы доступа к данным, включая REST API и собственные языки запросов.
Вертикальная масштабируемость: SQL базы данных обычно масштабируются вертикально, то есть увеличивая мощность сервера (CPU, RAM, дисковое пространство).
Транзакции и консистентность: SQL базы данных поддерживают ACID транзакции (Atomicity, Consistency, Isolation, Durability), что обеспечивает высокую надежность и консистентность данных.
Горизонтальная масштабируемость: NoSQL базы данных предназначены для горизонтального масштабирования, что позволяет распределять данные по множеству серверов.
Гибкость и скорость: NoSQL базы данных обычно более гибки и могут обеспечивать высокую производительность при работе с большими объемами данных и высокими нагрузками на запись и чтение.
MySQL, PostgreSQL, Oracle, Microsoft SQL Server.
Финансовые системы, системы управления запасами, системы управления клиентами (CRM), где требуется сложные запросы и транзакции.
MongoDB, Cassandra, Redis, Couchbase.
Системы больших данных, реального времени аналитика, социальные сети, приложения для интернета вещей (IoT), где требуется высокая производительность и гибкость.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Индексы требуют дополнительного места на диске для хранения. Чем больше данных в таблице, тем больше место занимает индекс. Если таблица содержит большое количество индексов, это может значительно увеличить объем хранимых данных.
Вставка, обновление и удаление данных в таблице с индексами требует дополнительных операций для обновления индексов. Это может существенно замедлить производительность операций модификации данных, особенно в таблицах с большим количеством индексов.
Администрирование и оптимизация индексов требует дополнительных усилий. Необходимо периодически проверять и оптимизировать индексы, чтобы избежать фрагментации и падения производительности. Неэффективное использование индексов может привести к ухудшению производительности запросов.
При выполнении операций модификации данных индексы могут вызывать блокировки, что может приводить к конфликтам и снижению производительности в условиях высокой конкурентности.
Неправильный выбор колонок для индексирования может не только не улучшить, но и ухудшить производительность запросов. Индексы должны быть тщательно подобраны и настроены в соответствии с типичными запросами к базе данных.
Избыточные или дублирующие индексы могут привести к ненужному расходу ресурсов и снижению производительности операций модификации данных.
В небольших таблицах накладные расходы на поддержку индексов могут превышать выигрыш в производительности запросов. В таких случаях индексы могут быть неэффективными.
Изменение структуры таблиц (например, добавление или удаление колонок) может потребовать перестройки существующих индексов, что может быть трудоемким процессом.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Предполагает, что одновременно существуют две версии приложения: старая (синяя) и новая (зелёная). База данных при этом используется общая. Во время переключения трафика от синей версии к зелёной возникают потенциальные сложности, связанные с изменением структуры данных или логики работы с ними.
Если новая версия приложения требует изменений в структуре базы данных (например, добавление колонок, изменение типов данных или удаление полей), старая версия приложения может стать несовместимой с новой схемой.
Если новая версия изменяет способ обработки или хранения данных, это может вызвать проблемы при переключении трафика обратно на старую версию (например, в случае отката).
Выполнение миграции данных может занять время и потребовать блокировки таблиц, что может привести к снижению производительности или временному недоступности приложения.
Если переключение на новую версию произошло, но затем потребовался откат, структура или данные, изменённые новой версией, могут быть несовместимы со старой версией.
Изменения в индексации или структуре таблиц могут привести к временной деградации производительности базы данных, что затронет обе версии приложения.
Если новая версия меняет логику транзакций или порядок операций над данными, это может вызвать несогласованность в данных при выполнении параллельных операций обеими версиями.
Сначала добавить новые поля или таблицы, не удаляя старые. Убедиться, что новая версия поддерживает как старую, так и новую схему. Удалить устаревшие элементы только после полного перехода.
Обеспечить, чтобы новая версия приложения могла работать со старой схемой, а старая версия — с новой (на ограниченное время).
Тщательно тестировать миграции на копии данных в условиях, максимально близких к боевым.
Сначала внести изменения в базу данных, совместимые с обеими версиями. Затем задеплоить новую версию. Удалить устаревшие элементы только после убедительности в стабильности.
Использовать фичи-флаги, чтобы включать или отключать новую функциональность, связанной с изменениями в БД, без полной смены версии.
Выполнять резервное копирование базы данных перед началом миграции. Использовать мониторинг для раннего обнаружения проблем с производительностью или данными.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Это инструмент, который позволяет определить и управлять многоконтейнерными Docker приложениями. С помощью Docker Compose можно описать конфигурацию всех сервисов вашего приложения в одном файле и затем легко запустить их вместе с помощью одной команды.
Docker Compose использует YAML-файл (
docker-compose.yml) для описания всех контейнеров (сервисов), которые составляют ваше приложение. В этом файле можно указать образы, настройки сети, монтируемые тома и переменные окружения.Позволяет указать зависимости между сервисами, что обеспечивает правильный порядок запуска контейнеров.
С помощью простой команды
docker-compose up можно запустить все контейнеры, указанные в docker-compose.yml. Команда docker-compose down останавливает и удаляет все контейнеры, сети и тома, созданные up.Можно легко масштабировать сервисы (запускать несколько экземпляров одного контейнера) с помощью команды
docker-compose up --scale.docker-compose.yml для веб-приложения, состоящего из веб-сервера и базы данных:version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Создает и запускает все контейнеры, указанные в
docker-compose.yml.Останавливает и удаляет все контейнеры, сети и тома, созданные
docker-compose up.Показывает статус запущенных контейнеров.
Выводит логи всех контейнеров.
Выполняет команду в запущенном контейнере.
Легко настроить и запустить все необходимые сервисы для разработки.
Простота в управлении многоконтейнерными приложениями с помощью нескольких команд.
Единый файл конфигурации для разработки, тестирования и производства, что снижает вероятность ошибок из-за различий в конфигурациях.
Легко масштабировать отдельные сервисы приложения.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Это правила, которые применяются к данным в таблице для обеспечения точности и целостности данных. Эти ограничения помогают управлять данными и предотвращать вставку или обновление неверных данных. Вот основные типы ограничений:
Обеспечивает, что столбец не может содержать
NULL значения. Это ограничение гарантирует, что данные всегда будут присутствовать в этом столбце.CREATE TABLE employees (
emp_id INT,
name VARCHAR(100) NOT NULL
);
Обеспечивает, что все значения в столбце или группе столбцов уникальны. Это ограничение предотвращает дублирование данных.
CREATE TABLE employees (
emp_id INT UNIQUE,
email VARCHAR(100) UNIQUE
);
Сочетает в себе ограничения
NOT NULL и UNIQUE. Обеспечивает уникальную идентификацию каждой строки в таблице. В таблице может быть только один первичный ключ.CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
Обеспечивает ссылочную целостность между таблицами. Столбец с внешним ключом (или группа столбцов) ссылается на первичный ключ или уникальный ключ в другой таблице.
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(100)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
Обеспечивает, что значения в столбце соответствуют заданному условию. Это ограничение проверяет данные при вставке или обновлении.
CREATE TABLE employees (
emp_id INT,
name VARCHAR(100),
salary DECIMAL(10, 2),
CHECK (salary > 0)
);
Устанавливает значение по умолчанию для столбца, если при вставке строки значение для этого столбца не указано.
CREATE TABLE employees (
emp_id INT,
name VARCHAR(100),
hire_date DATE DEFAULT CURRENT_DATE
);
Создает индекс на один или несколько столбцов таблицы для ускорения поиска данных. Хотя индекс не является ограничением в строгом смысле, он помогает оптимизировать запросы к базе данных.
CREATE INDEX idx_name ON employees(name);
Пример создания таблицы с различными ограничениями
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
dept_id INT,
salary DECIMAL(10, 2) CHECK (salary > 0),
hire_date DATE DEFAULT CURRENT_DATE,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Принцип "открытости/закрытости" (Open/Closed Principle, OCP) — это один из пяти принципов SOLID, разработанных для создания устойчивого и легко поддерживаемого кода в объектно-ориентированном программировании. Принцип был предложен Бертраном Мейером в 1988 году и заключается в следующем:
Поведение класса можно расширить, добавив новый код. Это достигается путем создания новых классов, которые наследуют или композируют существующие классы, или путем использования интерфейсов и абстрактных классов.
Существующий код класса не должен изменяться. Это помогает избежать ошибок, которые могут возникнуть при изменении уже протестированного и проверенного кода.
Без соблюдения принципа OCP
public class Shape {
public void drawCircle() {
// рисуем круг
}
public void drawSquare() {
// рисуем квадрат
}
}
public class GraphicEditor {
private Shape shape;
public GraphicEditor(Shape shape) {
this.shape = shape;
}
public void draw(String shapeType) {
if (shapeType.equals("circle")) {
shape.drawCircle();
} else if (shapeType.equals("square")) {
shape.drawSquare();
}
}
}С соблюдением принципа OCP
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
// рисуем круг
}
}
public class Square implements Shape {
@Override
public void draw() {
// рисуем квадрат
}
}
public class GraphicEditor {
private Shape shape;
public GraphicEditor(Shape shape) {
this.shape = shape;
}
public void draw() {
shape.draw();
}
}Система становится более гибкой и расширяемой, так как новые функциональности добавляются без изменения существующего кода.
Снижается вероятность введения ошибок в существующий код, так как изменения сосредоточены в новых классах.
Легче тестировать новые компоненты отдельно, не затрагивая и не изменяя существующие.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это язык запросов, предназначенный для управления и манипулирования данными в реляционных базах данных. SQL используется для выполнения различных операций над данными, таких как создание, изменение, удаление и извлечение данных.
DDL (Data Definition Language): Команды, которые позволяют создавать и изменять структуру базы данных, включая таблицы, индексы, представления и другие объекты базы данных.
CREATE: Создание новых таблиц, баз данных, индексов.
ALTER: Изменение структуры существующих объектов базы данных.
DROP: Удаление объектов из базы данных.
DML (Data Manipulation Language): Команды, которые используются для управления данными в базе данных.
SELECT: Извлечение данных из таблиц.
INSERT: Вставка новых данных в таблицы.
UPDATE: Обновление существующих данных в таблицах.
DELETE: Удаление данных из таблиц.
DCL (Data Control Language): Команды, которые управляют доступом пользователей к данным в базе данных.
GRANT: Предоставление прав пользователям.
REVOKE: Отзыв ранее предоставленных прав.
TCL (Transaction Control Language): Команды, которые управляют транзакциями в базе данных.
COMMIT: Сохранение всех изменений, сделанных в транзакции.
ROLLBACK: Отмена всех изменений, сделанных в транзакции.
Создание таблицы
CREATE TABLE Employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
salary DECIMAL(10, 2)
);
Вставка данных в таблицу
INSERT INTO Employees (id, name, department_id, salary)
VALUES (1, 'John Doe', 10, 50000.00);
Извлечение данных из таблицы
SELECT name, salary
FROM Employees
WHERE department_id = 10;
Обновление данных в таблице
UPDATE Employees
SET salary = 55000.00
WHERE id = 1;
Удаление данных из таблицы
DELETE FROM Employees
WHERE id = 1;
SQL предоставляет мощные средства для извлечения, вставки, обновления и удаления данных, что позволяет эффективно управлять данными в больших объемах.
С помощью SQL можно создавать и изменять структуру базы данных, обеспечивая гибкость в управлении схемой данных.
SQL позволяет контролировать доступ к данным, обеспечивая безопасность и конфиденциальность информации.
SQL поддерживает механизмы транзакций и ограничения, которые помогают поддерживать целостность данных и предотвращать их некорректное изменение.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это легкий формат обмена данными, который легко читается и пишется человеком, а также легко парсится и генерируется компьютером. Он используется для представления структурированных данных в текстовом формате и основан на подмножестве языка программирования 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 широко используется в веб-разработке для обмена данными между клиентскими приложениями и сервером через HTTP-запросы, обычно с использованием методов
GET или POST.JSON используется для хранения конфигурационных настроек в различных приложениях, поскольку его структура легко читаема и редактируема.
В некоторых базах данных, таких как MongoDB, JSON используется как формат для хранения документов.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это два типа объединения таблиц в SQL, которые используются для получения данных из нескольких таблиц на основе условий соединения. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных.
INNER JOIN возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении. Если нет совпадения, строки не включаются в результирующий набор данных.SELECT A.*, B.*
FROM TableA A
INNER JOIN TableB B ON A.id = B.id;
RIGHT JOIN возвращает все строки из правой таблицы (TableB) и совпадающие строки из левой таблицы (TableA). Если совпадения нет, строки из правой таблицы все равно включаются в результат с NULL значениями для столбцов из левой таблицы.SELECT A.*, B.*
FROM TableA A
RIGHT JOIN TableB B ON A.id = B.id;
Возвращает только строки с совпадающими значениями в обеих таблицах. Исключает строки без совпадений.
Возвращает все строки из правой таблицы (TableB) и совпадающие строки из левой таблицы (TableA). Включает строки из правой таблицы, даже если нет совпадений, с
NULL значениями для столбцов из левой таблицы.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Позволяет компонентам обмениваться данными и выполнять задачи независимо друг от друга, не дожидаясь завершения операций. Асинхронное общение широко применяется в микросервисных архитектурах и других распределённых системах, так как повышает масштабируемость, гибкость и отказоустойчивость системы.
Очереди сообщений (например, RabbitMQ, Apache Kafka, Amazon SQS) помогают отправлять и получать сообщения асинхронно, обеспечивая буфер между отправителем и получателем. Брокеры сообщений сохраняют сообщения до тех пор, пока получатель не будет готов их обработать, что помогает управлять потоками данных и уравновешивать нагрузку. Такой подход позволяет отправителю отправить сообщение и сразу продолжить свою работу, не дожидаясь ответа, что повышает производительность системы.
В модели «издатель-подписчик» компоненты могут публиковать события, на которые подписаны другие компоненты, а брокер сообщений доставляет события всем подписчикам. Этот паттерн позволяет системе оставаться слабосвязанной, так как издатель не знает, сколько и какие конкретно сервисы получат событие. Такие системы часто применяются для уведомлений, регистрации событий, обработки данных и отправки уведомлений нескольким сервисам одновременно.
В очереди задач сообщения представляют собой задачи для выполнения, которые обрабатываются одним или несколькими исполнителями. Этот паттерн полезен для распределения нагрузки на сервисы, позволяя выполнять задачи асинхронно, когда они становятся доступны, и автоматически управлять потоками. Например, задача по отправке электронной почты может быть помещена в очередь и обработана отдельным рабочим процессом, что освобождает основной сервис от ожидания завершения отправки.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM