Backend
前往频道在 Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
显示更多3 747
订阅者
无数据24 小时
-77 天
-2030 天
数据加载中...
相似频道
标签云
进出提及
---
---
---
---
---
---
吸引订阅者
十月 '2610月 '26
十月 '26
+3
在0个频道中
九月 '26
+19
在0个频道中
Get PRO
八月 '26
+11
在0个频道中
Get PRO
七月 '26
+16
在0个频道中
Get PRO
六月 '26
+18
在1个频道中
Get PRO
五月 '26
+15
在0个频道中
Get PRO
四月 '26
+27
在0个频道中
Get PRO
三月 '26
+40
在0个频道中
Get PRO
二月 '26
+29
在0个频道中
Get PRO
一月 '26
+44
在0个频道中
Get PRO
十二月 '25
+30
在0个频道中
Get PRO
十一月 '25
+55
在0个频道中
Get PRO
十月 '25
+35
在0个频道中
Get PRO
九月 '25
+35
在0个频道中
Get PRO
八月 '25
+35
在0个频道中
Get PRO
七月 '25
+57
在1个频道中
Get PRO
六月 '25
+30
在0个频道中
Get PRO
五月 '25
+97
在45个频道中
Get PRO
四月 '25
+83
在0个频道中
Get PRO
三月 '25
+78
在3个频道中
Get PRO
二月 '25
+80
在0个频道中
Get PRO
一月 '25
+139
在53个频道中
Get PRO
十二月 '24
+77
在0个频道中
Get PRO
十一月 '24
+106
在0个频道中
Get PRO
十月 '24
+189
在1个频道中
Get PRO
九月 '24
+68
在25个频道中
Get PRO
八月 '24
+94
在35个频道中
Get PRO
七月 '24
+4 066
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 06 十月 | 0 | |||
| 05 十月 | 0 | |||
| 04 十月 | 0 | |||
| 03 十月 | +1 | |||
| 02 十月 | +1 | |||
| 01 十月 | +1 |
频道帖子
🤔 Каким образом можно найти "медленный запрос" и проанализировать его в PostgreSQL?
🚩Методы и инструменты.
🟠Включение журналирования медленных запросов
Настройка параметров конфигурации PostgreSQL для журналирования медленных запросов позволяет отслеживать запросы, выполнение которых занимает много времени.
1⃣Откройте файл конфигурации PostgreSQL (
postgresql.conf).
2⃣Настройте следующие параметры:
# Включить логирование всех запросов
log_statement = 'all'
# Либо логирование только медленных запросов
log_min_duration_statement = 1000 # Логировать запросы, выполнение которых заняло более 1000 мс (1 секунда)
3⃣Перезапустите сервер PostgreSQL для применения изменений:
sudo systemctl restart postgresql
🟠Использование инструмента `pg_stat_statements`
Расширение pg_stat_statements позволяет собирать статистику по выполненным запросам и предоставляет информацию о частоте, времени выполнения и других характеристиках запросов.
1⃣Включите расширение в postgresql.conf:
shared_preload_libraries = 'pg_stat_statements'
2⃣Перезапустите сервер PostgreSQL:
sudo systemctl restart postgresql
3⃣Создайте расширение в нужной базе данных:
CREATE EXTENSION pg_stat_statements;
4⃣Используйте запрос для получения информации о медленных запросах:
SELECT
query,
calls,
total_time,
mean_time,
stddev_time,
rows,
min_time,
max_time
FROM
pg_stat_statements
ORDER BY
total_time DESC
LIMIT 10;
🟠Анализ запросов с помощью `EXPLAIN` и `EXPLAIN ANALYZE`
Команды EXPLAIN и EXPLAIN ANALYZE позволяют понять, как PostgreSQL планирует и выполняет запросы, предоставляя детальную информацию о плане выполнения.
1⃣Выполните команду EXPLAIN для запроса:
EXPLAIN SELECT * FROM my_table WHERE id = 1;
2⃣Выполните команду EXPLAIN ANALYZE для запроса:
EXPLAIN ANALYZE SELECT * FROM my_table WHERE id = 1;
3⃣Анализируйте выходные данные, чтобы понять, какие операции занимают больше всего времени (например, полное сканирование таблицы, узкие места при соединении таблиц и т.д.).
🟠Использование системных представлений и утилит
pg_stat_activity: Показывает текущую активность базы данных, включая выполняемые запросы и их состояние.
SELECT
pid,
usename,
state,
query,
now() - query_start AS duration
FROM
pg_stat_activity
WHERE
state != 'idle'
ORDER BY
duration DESC;
pg_locks: Отображает информацию о текущих блокировках в базе данных.
SELECT * FROM pg_locks;
1⃣Индексы:
Убедитесь, что для часто используемых условий WHERE и JOIN существуют соответствующие индексы.
2⃣Переписывание запросов:
Попробуйте переписать запросы для улучшения их производительности.
3⃣Материализованные представления:
Используйте материализованные представления для часто выполняемых сложных запросов.
4⃣Конфигурация сервера:
Настройте параметры конфигурации PostgreSQL для оптимизации производительности (например, work_mem, shared_buffers, maintenance_work_mem).
Ставь 👍 и забирай 📚 Базу знаний| 2 | 🤔 Какие join бывают?
В реляционных базах данных, операции объединения (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;
Ставь 👍 и забирай 📚 Базу знаний | 121 |
| 3 | 🤔 Что такое CGI?
Это стандартный протокол для веб-серверов, который позволяет запускать внешние программы (скрипты) для генерации веб-страниц динамически. CGI скрипты могут быть написаны на различных языках программирования, таких как Perl, Python, PHP, C и других. Когда веб-сервер получает запрос на страницу, обрабатываемую CGI, он запускает соответствующий скрипт и передает ему данные запроса.
🚩Как работает
1⃣Запрос клиента: Клиент (например, веб-браузер) отправляет HTTP-запрос на веб-сервер.
2⃣Запуск CGI-скрипта: Веб-сервер определяет, что запрос предназначен для CGI-скрипта, и запускает его как отдельный процесс.
3⃣Передача данных: Веб-сервер передает данные запроса (например, параметры формы) в CGI-скрипт через стандартный ввод (stdin) и переменные окружения.
4⃣Выполнение скрипта: CGI-скрипт выполняет необходимые операции (например, доступ к базе данных) и генерирует HTML-страницу.
5⃣Ответ сервера: CGI-скрипт отправляет сгенерированную HTML-страницу обратно на веб-сервер через стандартный вывод (stdout), а сервер передает этот ответ клиенту.
🚩Плюсы
➕Простота и универсальность
CGI прост в реализации и не требует сложной настройки. Поддерживает множество языков программирования, что делает его универсальным решением.
➕Совместимость
CGI является стандартом и поддерживается практически всеми веб-серверами.
➕Изоляция процессов
Каждый запрос запускает новый процесс, что обеспечивает изоляцию запросов и повышает безопасность.
🚩Минусы
➖Производительность
Каждый запрос создает новый процесс, что может быть ресурсоемким и замедлять работу сервера при большом количестве запросов. Создание и завершение процессов занимает время, что увеличивает задержку ответа.
➖Масштабируемость
Плохая производительность при высоких нагрузках делает CGI плохо подходящим для масштабируемых веб-приложений. Ограниченная возможность использования пула процессов для повышения эффективности.
➖Ограниченная функциональность
Сложнее интегрироваться с современными технологиями и фреймворками. Отсутствие встроенных средств для работы с сессиями, аутентификацией и другими функциями современных веб-приложений.
🚩Современные альтернативы
🟠FastCGI
Улучшенная версия CGI, которая повторно использует процессы для обработки нескольких запросов, что повышает производительность.
🟠Server-side scripting
Языки и фреймворки, такие как PHP, ASP.NET, Node.js, Django, Ruby on Rails, которые интегрируются непосредственно с веб-серверами и обеспечивают высокую производительность.
🟠Web Server Gateway Interface (WSGI)
Стандартный интерфейс для Python-приложений, позволяющий эффективную обработку запросов.
🟠Application Servers
Серверы приложений, такие как Apache Tomcat, JBoss, которые предоставляют контейнеры для выполнения веб-приложений и управления ими.
Ставь 👍 и забирай 📚 Базу знаний | 212 |
| 4 | 🤔 Примеры систем CP, AP и CA?
В контексте CAP-теоремы(Consistency, Availability, Partition Tolerance) системы обычно делят на три группы: CP (Consistency + Partition Tolerance), AP (Availability + Partition Tolerance) и CA (Consistency + Availability).
🚩CP-системы (Consistency + Partition Tolerance)
Системы, которые обеспечивают согласованность данных и устойчивость к разделению сети, но могут временно отказаться от доступности при возникновении сетевых сбоев. Такие системы при сетевом разделении блокируют часть данных или операций, чтобы сохранить согласованное состояние.
🟠HBase и MongoDB в режиме CP
Оба эти хранилища данных поддерживают согласованность при сетевых сбоях, но могут ограничивать доступность данных, блокируя операции до восстановления связи.
🟠Zookeeper
Система координации распределённых приложений, обеспечивающая согласованность, но жертвующая доступностью в случае сетевых проблем. Она часто используется для управления конфигурацией и синхронизацией данных.
🚩AP-системы (Availability + Partition Tolerance)
Системы, которые фокусируются на доступности и устойчивости к разделению сети, но допускают временную неидеальную согласованность данных (например, данные могут быть не сразу синхронизированы между репликами).
🟠Cassandra
Эта система обеспечивает доступность и устойчивость к разделению сети, но может допускать задержки в синхронизации данных между узлами.
🟠DynamoDB (режим AP)
Поддерживает доступность и устойчивость к разделению сети, за счёт возможного отклонения в согласованности. DynamoDB был разработан Amazon для обеспечения высокой доступности даже в условиях сбоя сети.
🟠Riak
Распределённое хранилище, оптимизированное для доступности и устойчивости к разделениям сети. Оно допускает временные рассогласования данных, которые разрешаются позже.
🚩CA-системы (Consistency + Availability)
Системы, обеспечивающие согласованность и доступность данных, но не гарантирующие устойчивости к разделению сети. В реальных распределённых системах подобный подход встречается редко, так как любая сеть может столкнуться с разделением, что нарушит работу.
🟠Реляционные базы данных на одном сервере
Например, PostgreSQL или MySQL в традиционной конфигурации, работающей на одном сервере без распределения данных. Они поддерживают согласованность и доступность, так как нет сетевого разделения.
🟠Системы кэширования в локальной сети
Такие системы, как Redis, при отсутствии распределённой конфигурации и работе в пределах одного узла, могут обеспечить согласованность и доступность.
Ставь 👍 и забирай 📚 Базу знаний | 208 |
| 5 | 🤔 Что такое инкапсуляция?
Это один из основных принципов объектно-ориентированного программирования (ООП), который подразумевает скрытие внутренней реализации объекта и предоставление доступа к ней только через строго определенные методы или интерфейсы. Это помогает защитить данные от некорректного использования и обеспечивает контроль над изменением состояния объекта.
🚩Основные аспекты инкапсуляции
🟠Скрытие данных
Внутреннее состояние объекта (переменные и данные) скрыто от внешнего мира и доступно только через методы класса.
🟠Методы доступа
Класс предоставляет публичные методы для взаимодействия с его внутренним состоянием. Эти методы часто называют геттерами (для получения значений) и сеттерами (для установки значений).
🟠Контроль над данными
Инкапсуляция позволяет контролировать как данные изменяются и обеспечивать их корректное состояние. Например, можно добавить проверки или ограничения в сеттеры.
Пример инкапсуляции на языке Python
class Person:
def __init__(self, name, age):
self._name = name # Внутреннее состояние
self._age = age
# Геттер для имени
def get_name(self):
return self._name
# Сеттер для имени
def set_name(self, name):
if isinstance(name, str) and name:
self._name = name
# Геттер для возраста
def get_age(self):
return self._age
# Сеттер для возраста
def set_age(self, age):
if isinstance(age, int) and 0 <= age <= 120:
self._age = age
# Использование класса
person = Person("Alice", 30)
print(person.get_name()) # Вывод: Alice
print(person.get_age()) # Вывод: 30
person.set_name("Bob")
person.set_age(35)
print(person.get_name()) # Вывод: Bob
print(person.get_age()) # Вывод: 35
# Попытка установить некорректное значение
person.set_age(-5) # Значение не изменится из-за проверки в сеттере
print(person.get_age()) # Вывод: 35
🚩Плюсы
➕Защита данных
Скрытие внутреннего состояния объекта предотвращает его некорректное использование и изменение.
➕Упрощение поддержки
Инкапсуляция облегчает модификацию и поддержку кода, поскольку внутренние изменения объекта не влияют на внешний код, взаимодействующий с объектом.
➕Повышение гибкости
Возможность изменения внутренней реализации объекта без изменения его интерфейса.
➕Контроль доступа
Возможность добавления логики проверки и валидации данных при их установке или изменении.
Ставь 👍 и забирай 📚 Базу знаний | 179 |
| 6 | 🤔 Что такое Docker Compose?
Это инструмент, который позволяет определить и управлять многоконтейнерными 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 up
Создает и запускает все контейнеры, указанные в docker-compose.yml.
🟠docker-compose down
Останавливает и удаляет все контейнеры, сети и тома, созданные docker-compose up.
🟠docker-compose ps
Показывает статус запущенных контейнеров.
🟠docker-compose logs
Выводит логи всех контейнеров.
🟠docker-compose exec [service] [command]
Выполняет команду в запущенном контейнере.
🚩Плюсы
➕Упрощение разработки
Легко настроить и запустить все необходимые сервисы для разработки.
➕Легкость в использовании
Простота в управлении многоконтейнерными приложениями с помощью нескольких команд.
➕Унификация окружения
Единый файл конфигурации для разработки, тестирования и производства, что снижает вероятность ошибок из-за различий в конфигурациях.
➕Масштабируемость
Легко масштабировать отдельные сервисы приложения.
Ставь 👍 и забирай 📚 Базу знаний | 166 |
| 7 | 🤔 Чем отличаются LEFT JOIN от INNER JOIN?
Это два типа соединений (joins) в языке SQL, которые используются для объединения строк из двух или более таблиц на основе связанных столбцов. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных.
🚩INNER JOIN
Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении. Возвращает строки, где существует совпадение значений в обоих таблицах. Если нет совпадающих значений, строка не будет включена в результирующий набор.
SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;
🚩LEFT JOIN
Возвращает все строки из левой таблицы (первой таблицы в запросе) и соответствующие строки из правой таблицы. Если в правой таблице нет совпадающих строк, в результирующем наборе будут NULL значения для столбцов правой таблицы. Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствия, возвращаются NULL значения для правой таблицы.
SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;
🚩Сравнение
🟠INNER JOIN
Возвращает только совпадающие строки. Если нет совпадений, строки не включаются в результат.
🟠LEFT JOIN
Возвращает все строки из левой таблицы. Включает совпадающие строки из правой таблицы. Если нет совпадений, строки из правой таблицы будут заполнены NULL значениями.
Ставь 👍 и забирай 📚 Базу знаний | 185 |
| 8 | 🤔 Как работает браузер?
Это программное обеспечение, которое позволяет пользователям просматривать и взаимодействовать с информацией в Интернете. Основные функции браузера включают получение, рендеринг и отображение веб-страниц, а также выполнение веб-приложений.
🚩Этапы работы
🟠Ввод URL и запрос к серверу
Пользователь вводит URL (Uniform Resource Locator) в адресную строку браузера. Браузер определяет тип протокола (например, HTTP или HTTPS) и преобразует доменное имя в IP-адрес с помощью DNS (Domain Name System). Затем браузер отправляет HTTP-запрос к веб-серверу по указанному IP-адресу.
🟠Получение ответа от сервера
Веб-сервер получает запрос и отправляет HTTP-ответ, который обычно содержит HTML-документ, CSS-стили, JavaScript-код и другие ресурсы, такие как изображения и видео. Ответ передается обратно браузеру.
🟠Анализ и построение DOM
Браузер анализирует полученный HTML-документ и строит дерево DOM (Document Object Model), представляющее структуру страницы. Одновременно браузер загружает и обрабатывает связанные ресурсы (CSS, JavaScript, изображения).
🟠Применение CSS и построение CSSOM
Браузер анализирует CSS-файлы и строит CSSOM (CSS Object Model), описывающую, как элементы должны отображаться. DOM и CSSOM объединяются для создания render tree, которая содержит видимые элементы страницы с их стилями.
🟠Рендеринг страницы
Render tree используется для определения положения и внешнего вида элементов на экране. Браузер выполняет layout (разметку) элементов и отрисовывает их на экране.
🟠Выполнение JavaScript
Браузер интерпретирует и выполняет JavaScript-код, который может изменять DOM и CSSOM. JavaScript может также взаимодействовать с сервером через AJAX-запросы для динамического обновления страницы без перезагрузки.
🟠Интерактивность
Браузер обрабатывает взаимодействие пользователя с элементами страницы (клики, ввод текста и т.д.). Изменения, вызванные действиями пользователя или выполнением JavaScript, могут обновлять render tree и перерисовывать элементы.
Ставь 👍 и забирай 📚 Базу знаний | 207 |
| 9 | 🤔 Что такое клиент серверная архитектура?
Клиент-серверная архитектура — это модель взаимодействия в сетях, где задачи распределяются между поставщиками ресурсов или услуг, называемыми серверами, и потребителями, называемыми клиентами. Это одна из самых распространенных архитектурных моделей в разработке программного обеспечения и сетевых приложений.
🚩Основные компоненты клиент-серверной архитектуры
🟠Клиент
Это программа или устройство, которое инициирует запросы к серверу для доступа к ресурсу или услуге.
Отправка запросов к серверу.
Получение и отображение данных или выполнения действий на основе ответа от сервера.
🟠Сервер
Это программа или устройство, которое обрабатывает запросы от клиентов и предоставляет им необходимые ресурсы или услуги.
Обработка запросов от клиентов.
Управление доступом к ресурсам (например, базам данных, файлам, услугам).
Возврат соответствующих данных или результатов выполнения запросов клиентам.
🚩Принцип работы клиент-серверной архитектуры
🟠Инициация запроса
Клиент инициирует запрос к серверу. Это может быть запрос на получение данных, отправка данных для обработки, выполнение определенной задачи и т.д.
🟠Обработка запроса
Сервер получает запрос и обрабатывает его. Это может включать выполнение операций над базой данных, запуск скриптов или программ, обработку данных и т.д.
🟠Ответ на запрос
Сервер отправляет ответ клиенту. Ответ может содержать запрашиваемые данные, подтверждение успешного выполнения операции или сообщение об ошибке.
🟠Получение ответа
Клиент получает ответ от сервера и использует его для выполнения дальнейших действий, таких как отображение данных пользователю, обработка данных и т.д.
Ставь 👍 и забирай 📚 Базу знаний | 218 |
| 10 | 🤔 Что такое миксины?
Это один из способов повторного использования кода в объектно-ориентированном программировании. Они представляют собой классы или функции, которые предоставляют методы для других классов, без необходимости быть основой для этих классов. Миксины позволяют «подмешивать» функциональность в другие классы, обеспечивая гибкость и модульность кода.
🚩Характеристики
🟠Повторное использование кода
Миксины позволяют избежать дублирования кода путем инкапсуляции общих методов и свойств, которые могут быть использованы в различных классах.
🟠Множественное наследование
В языках, поддерживающих множественное наследование (например, Python), миксины могут быть использованы как базовые классы для других классов, предоставляя дополнительные методы и свойства. Это позволяет создавать классы, комбинируя несколько миксинов для расширения функциональности.
🟠Композиция
В языках, где множественное наследование не поддерживается или нежелательно (например, в JavaScript), миксины могут быть применены через композицию, где функциональность миксина добавляется к целевому объекту или классу.
🟠Изоляция поведения
Миксины позволяют изолировать и инкапсулировать определенное поведение или функциональность, что упрощает тестирование и поддержку кода.
🚩Примеры использования
🟠Python
Миксины часто используются через множественное наследование.
class LoggableMixin:
def log(self, message):
print(f"Log: {message}")
class Database(LoggableMixin):
def save(self, data):
self.log("Saving data")
# Код для сохранения данных
db = Database()
db.save({"key": "value"})
🟠JavaScript
Миксины могут быть применены через композицию.
const loggableMixin = {
log(message) {
console.log(`Log: ${message}`);
}
};
class Database {
save(data) {
this.log("Saving data");
// Код для сохранения данных
}
}
Object.assign(Database.prototype, loggableMixin);
const db = new Database();
db.save({ key: 'value' });
Ставь 👍 и забирай 📚 Базу знаний | 207 |
| 11 | 🤔 Как защитить куки от воровства и от подделки?
🟠Использование HTTPS
Передача данных через HTTPS (SSL/TLS) обеспечивает шифрование данных между клиентом и сервером, что предотвращает их перехват и чтение третьими лицами. Настройте ваш веб-сервер для использования HTTPS, получив и установив SSL/TLS сертификат.
🟠Флаг Secure
Куки передаются только по HTTPS-соединениям. Добавьте флаг Secure при установке куки.
Set-Cookie: sessionId=abc123; Secure
🟠Флаг HttpOnly
Куки недоступны через JavaScript, что предотвращает их кражу с помощью XSS (Cross-Site Scripting) атак. Добавьте флаг HttpOnly при установке куки.
Set-Cookie: sessionId=abc123; HttpOnly
🟠Флаг SameSite
Предотвращает отправку куки на другие сайты, что защищает от CSRF (Cross-Site Request Forgery) атак. Добавьте флаг SameSite при установке куки. Варианты включают Strict, Lax, и None.
Set-Cookie: sessionId=abc123; SameSite=Strict
🟠Шифрование содержимого куки
Делает данные бесполезными для злоумышленников, даже если они смогут украсть куки. Используйте серверные библиотеки для шифрования и дешифрования данных в куки перед отправкой и после получения.
🟠Подпись куки
С помощью HMAC (Hash-based Message Authentication Code) позволяет проверить целостность и подлинность данных в куки. Используйте секретный ключ для генерации HMAC подписи и добавьте её к куки.
import hmac
import hashlib
secret_key = b'secret'
cookie_value = b'sessionId=abc123'
signature = hmac.new(secret_key, cookie_value, hashlib.sha256).hexdigest()
cookie = f'{cookie_value.decode()}; Signature={signature}'
🟠Защита от XSS атак
Могут использоваться для кражи куки. Включает в себя валидацию и фильтрацию пользовательских вводов, использование Content Security Policy (CSP) и безопасное кодирование данных. Внедрите валидацию и фильтрацию вводов на стороне сервера, настройте CSP заголовки.
Content-Security-Policy: script-src 'self'
🟠Регулярное обновление и истечение срока действия куки
Значений куки и установка короткого срока действия уменьшает временное окно для атакующих. Устанавливайте короткий срок действия и обновляйте значение куки при каждой сессии.
Set-Cookie: sessionId=abc123; Max-Age=3600 # 1 час
Ставь 👍 и забирай 📚 Базу знаний | 196 |
| 12 | 🤔 Что такое SOLID?
Это акроним, представляющий пять основных принципов объектно-ориентированного программирования и дизайна, которые помогают разработчикам создавать более понятный, гибкий и поддерживаемый код. Эти принципы были предложены Робертом Мартином (известным также как Uncle Bob) и являются основополагающими в области программной инженерии.
🟠Single Responsibility Principle (Принцип единственной ответственности)
Этот принцип гласит, что у каждого класса должна быть только одна причина для изменения, то есть класс должен иметь только одну ответственность или задачу. Это помогает уменьшить сложность и повысить читаемость кода, делая его более управляемым и легким для поддержки. Когда класс выполняет лишь одну задачу, его легче тестировать и изменять без влияния на другие части системы.
🟠Open/Closed Principle (Принцип открытости/закрытости)
Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации. Это означает, что поведение классов должно быть расширяемым без изменения их исходного кода. Для реализации этого принципа часто используются абстракции и интерфейсы, которые позволяют добавлять новые функции через наследование и полиморфизм, не нарушая существующий код.
🟠Liskov Substitution Principle (Принцип подстановки Барбары Лисков)
Объекты подклассов должны быть заменяемы объектами суперклассов без нарушения правильности программы. Это означает, что если у нас есть базовый класс и его подкласс, то мы должны иметь возможность заменить экземпляры базового класса экземплярами подкласса без изменения желаемого поведения программы. Этот принцип поддерживает полиморфизм и гарантирует, что производные классы могут корректно взаимодействовать с остальным кодом.
🟠Interface Segregation Principle (Принцип разделения интерфейсов)
Клиенты не должны зависеть от интерфейсов, которые они не используют. Этот принцип направлен на создание узкоспециализированных интерфейсов, которые являются специфичными для отдельных клиентов. Таким образом, классы, реализующие эти интерфейсы, не будут обязаны реализовывать методы, которые им не нужны. Это уменьшает сложность и улучшает управляемость кода, а также способствует гибкости и повторному использованию интерфейсов.
🟠Dependency Inversion Principle (Принцип инверсии зависимостей)
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба типа модулей должны зависеть от абстракций. Этот принцип направлен на уменьшение зависимости высокоуровневого кода от низкоуровневых деталей, что позволяет легче изменять и тестировать систему. Реализация этого принципа часто включает использование инверсии управления (IoC) и внедрения зависимостей (DI), что способствует созданию более гибких и модульных архитектур.
Ставь 👍 и забирай 📚 Базу знаний | 191 |
| 13 | 🤔 Что такое XML?
XML (Extensible Markup Language) — это расширяемый язык разметки, используемый для представления структурированных данных в формате, который легко читается как человеком, так и машиной. XML разработан для хранения и обмена данными между различными системами и платформами.
🚩Основные характеристики
🟠Расширяемость
XML позволяет создавать собственные теги, что делает его гибким для различных применений и доменов.
🟠Читаемость
XML-документы легко читаются и понимаются человеком благодаря текстовому формату.
🟠Структурированность
XML-документы имеют четкую иерархическую структуру, которая делает их удобными для хранения сложных данных.
🟠Платформенная независимость
XML является текстовым форматом, что делает его совместимым с любыми операционными системами и приложениями.
🚩Структура XML-документа
🟠Пролог
Опциональная часть, которая может содержать информацию о версии XML и кодировке документа.
<?xml version="1.0" encoding="UTF-8"?>
🟠Корневой элемент
Каждый XML-документ должен иметь один корневой элемент, который содержит все остальные элементы.
<root>
<!-- Другие элементы -->
</root>
🟠Элементы (теги)
Основные строительные блоки XML-документа. Элементы могут содержать текст, другие элементы и атрибуты.
<book>
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>
🟠Атрибуты
Дополнительные данные, связанные с элементами. Атрибуты задаются внутри открывающего тега.
<book genre="fiction">
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>
Пример XML-документа
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1" genre="fiction">
<title>XML Basics</title>
<author>John Doe</author>
<year>2023</year>
</book>
<book id="2" genre="non-fiction">
<title>Learning XML</title>
<author>Jane Smith</author>
<year>2022</year>
</book>
</library>
🚩Плюсы и минусы
➕Интероперабельность
XML используется для обмена данными между различными системами и приложениями, обеспечивая совместимость.
➕Гибкость
Пользователи могут создавать собственные теги и атрибуты, что делает XML пригодным для различных областей применения.
➕Стандартизация
XML является стандартом, поддерживаемым многими технологиями и инструментами.
➕Валидация
XML-документы могут быть проверены на соответствие определенной структуре с помощью схем XML Schema (XSD) или DTD (Document Type Definition).
➖Объемность
XML может быть довольно объемным из-за избыточности тегов, что может привести к увеличению размера данных.
➖Сложность парсинга
Обработка и парсинг XML-документов может быть сложным и требовать значительных вычислительных ресурсов по сравнению с другими форматами, такими как JSON.
Ставь 👍 и забирай 📚 Базу знаний | 187 |
| 14 | 🤔 Что такое идемпотентность?
Идемпотентность — это свойство операции, при котором повторное выполнение этой операции приводит к тому же результату, что и однократное выполнение. Это понятие часто используется в контексте HTTP методов, API запросов и транзакций в системах с распределенной архитектурой.
🚩Основные аспекты идемпотентности
🟠Идемпотентные операции
GET: Получение ресурса. Повторный запрос не изменяет состояние ресурса.
PUT: Обновление или создание ресурса. Повторный запрос с одинаковыми данными приводит к одному и тому же состоянию ресурса.
DELETE: Удаление ресурса. Повторный запрос удаляет ресурс, если он существует, или не изменяет состояние, если ресурс уже удален.
🟠Неидемпотентные операции
POST: Создание нового ресурса. Повторный запрос приводит к созданию нового ресурса с новым идентификатором, что изменяет состояние системы.
🚩Примеры идемпотентности
GET запрос
GET /user/123
PUT запрос
PUT /user/123
{
"name": "John Doe",
"age": 30
}
Идемпотентная операция
UPDATE users SET name = 'John Doe' WHERE id = 123;
Неидемпотентная операция
INSERT INTO users (name, age) VALUES ('John Doe', 30);
🚩Зачем нужна идемпотентность
🟠Повышение надежности
Идемпотентные операции помогают в обеспечении надежности и устойчивости систем, особенно в условиях повторных запросов из-за сетевых сбоев или таймаутов.
🟠Упрощение обработки ошибок
При сбоях в системе легче повторно выполнить идемпотентную операцию, не беспокоясь о непредвиденных изменениях состояния.
🟠Удобство разработки
Идемпотентность упрощает разработку и тестирование, так как позволяет предсказуемо управлять состоянием системы при повторных запросах.
Ставь 👍 и забирай 📚 Базу знаний | 225 |
| 15 | 🤔 Что такое cherrypick?
Это команда в системе управления версиями Git, которая позволяет выбрать один или несколько конкретных коммитов из одной ветки и применить их в другую ветку. Это полезно, когда нужно перенести отдельные изменения без необходимости слияния целых веток.
🚩Основные аспекты cherry-pick
🟠Избирательное применение коммитов
Позволяет выбрать конкретные изменения из истории одной ветки и перенести их в другую ветку.
🟠Избежание полного слияния
В отличие от обычного слияния (merge), cherry-pick переносит только выбранные коммиты, а не всю историю изменений.
🚩Как использовать 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
🚩Когда использовать cherry-pick
🟠Перенос исправлений
Когда нужно быстро перенести исправление из одной ветки в другую (например, багфикс из develop в release).
🟠Избирательное применение новых функций
Когда нужно перенести конкретную функцию или изменение без переноса всей ветки.
🚩Ограничения и риски
🟠Конфликты
Перенос коммитов может вызвать конфликты, особенно если изменяемые файлы были модифицированы в целевой ветке.
🟠Историческая чистота
Частое использование cherry-pick может запутать историю изменений, так как один и тот же коммит будет существовать в нескольких ветках с разными хешами.
Ставь 👍 и забирай 📚 Базу знаний | 226 |
| 16 | 🤔 Почему синглтон называют антипаттерном?
Синглтон считается антипаттерном в некоторых случаях и для некоторых разработчиков, несмотря на его популярность, из-за множества потенциальных проблем, которые он может вызвать.
🟠Глобальное состояние
Синглтон представляет собой глобальное состояние, которое может изменяться из любого места в программе. Это приводит к трудностям в отслеживании и понимании изменений состояния, что усложняет отладку и тестирование.
🟠Нарушение принципов ООП
Синглтон нарушает принцип единственной ответственности (SRP - Single Responsibility Principle), так как он сочетает в себе функциональность и управление своим экземпляром. Это также нарушает принцип инверсии зависимостей (DIP - Dependency Inversion Principle), так как клиенты напрямую зависят от конкретного класса.
🟠Тестируемость
Синглтоны усложняют написание модульных тестов, так как глобальное состояние сохраняется между тестами, что может приводить к непредсказуемому поведению. Мокинг (mocking) и подмена синглтона в тестах также становятся сложными задачами.
🟠Жесткие зависимости
Использование синглтона создает жесткие зависимости между классами, что делает код менее гибким и увеличивает связность. Это затрудняет изменение и поддержку кода в будущем.
🟠Масштабируемость и многопоточность
Синглтоны могут создавать проблемы в многопоточных приложениях. Обеспечение потокобезопасности требует дополнительных усилий, а ошибки в реализации могут привести к состояниям гонки и другим проблемам.
🟠Легаси код и сложность
Синглтоны часто приводят к созданию легаси кода, который трудно модифицировать и расширять. В больших проектах синглтоны могут усложнять структуру кода и его поддержку.
Ставь 👍 и забирай 📚 Базу знаний | 240 |
| 17 | 🤔 Что такое рекурсия?
Это метод программирования, при котором функция вызывает саму себя для решения подзадачи, являющейся частью общей задачи. Такой подход применяется, когда проблему можно разделить на более мелкие аналогичные части.
🚩Как это работает?
При вызове рекурсивной функции создается новый контекст выполнения, в котором хранятся ее локальные переменные и текущий прогресс. Каждый новый вызов функции откладывается в стек вызовов, пока не будет достигнуто базовое условие (условие выхода), после чего начинается обратный процесс – возвращение значений и сворачивание стека.
🚩Где используется рекурсия?
🟠Алгоритмы обхода структур данных
например, обход деревьев (DFS) или графов.
🟠Разбиение задач
например, алгоритм "разделяй и властвуй" (быстрая сортировка, сортировка слиянием).
🟠Работа с комбинаторикой
вычисление факториала, чисел Фибоначчи, генерация перестановок.
🟠Парсинг и разбор выражений
например, в компиляторах для обработки синтаксических деревьев.
🚩Плюсы
➕Позволяет писать лаконичный и выразительный код.
➕Упрощает реализацию некоторых алгоритмов, особенно работающих с деревьями и графами.
➕Естественно подходит для задач, решаемых методом "разделяй и властвуй".
🚩Минусы
➖Использует стек вызовов, что может привести к переполнению (Stack Overflow).
➖Часто менее эффективна, чем итерация, из-за накладных расходов на создание новых контекстов выполнения.
➖Может требовать оптимизации, например, через хвостовую рекурсию (tail recursion).
Ставь 👍 и забирай 📚 Базу знаний | 235 |
| 18 | 🤔 Что в твоем понимании значит правильный код?
Это код, который не только выполняет поставленные задачи, но и соответствует ряду критериев, обеспечивающих его качество, читаемость, сопровождение и эффективность.
🚩Характеристики
🟠Читаемость
Переменные, функции, классы и другие сущности должны иметь понятные и описательные имена, которые отражают их назначение. Следование стандартам кодирования и стиля, включая правильное форматирование, отступы и использование комментариев. Использование комментариев для объяснения сложных или неочевидных частей кода, но не для очевидных вещей, которые можно понять из названий переменных и функций.
🟠Сопровождаемость
Код должен быть разбит на модули, функции или классы с чётко определёнными задачами. Это упрощает его понимание, тестирование и изменение. Избегание дублирования кода через применение принципа DRY (Don't Repeat Yourself). Код должен быть легко тестируемым. Написание автоматических тестов для проверки корректности работы помогает предотвратить ошибки.
🟠Эффективность
Код должен быть оптимизирован для выполнения задач с минимальными затратами ресурсов, таких как время выполнения и использование памяти. Использование эффективных алгоритмов и структур данных для обеспечения хорошей производительности, особенно на больших объемах данных.
🟠Надежность
Код должен корректно обрабатывать ошибки и исключительные ситуации, предотвращая неожиданные сбои. Проверка входных данных для предотвращения некорректного поведения программы.
🟠Документированность
Написание документации, описывающей основные компоненты системы, их взаимодействие и использование. Хорошо документированный код облегчает его понимание для других разработчиков.
🟠Применение принципов и паттернов проектирования
Применение принципов SOLID для создания устойчивого, гибкого и масштабируемого кода. Использование проверенных решений для общих задач проектирования.
🚩Примеры
Читаемость и сопровождаемость
def calculate_area(radius):
"""Calculate the area of a circle given its radius."""
import math
if radius < 0:
raise ValueError("Radius cannot be negative")
return math.pi * radius ** 2
Тестируемость
def add(a, b):
"""Add two numbers and return the result."""
return a + b
# Unit test for the add function
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
assert add(0, 0) == 0
test_add()
Ставь 👍 и забирай 📚 Базу знаний | 217 |
| 19 | 🤔 Назови четыре уровня изоляции транзакций?
🚩Уровни изоляции
🟠Read Uncommitted (Чтение незафиксированных данных)
Транзакция может читать данные, измененные другой транзакцией, даже если та еще не зафиксирована. Грязные чтения, неповторимые чтения и фантомные чтения. Редко используется на практике из-за высокого риска неконсистентных данных.
🟠Read Committed (Чтение зафиксированных данных)
Транзакция видит только те изменения, которые были зафиксированы другими транзакциями. Незафиксированные изменения не видны. Неповторимые чтения и фантомные чтения. Широко используется, обеспечивает баланс между производительностью и консистентностью данных.
🟠Repeatable Read (Повторяемое чтение)
Гарантирует, что если транзакция повторно читает данные, она получит те же самые значения, даже если другие транзакции изменяют данные. Фантомные чтения. Используется, когда требуется более высокий уровень консистентности данных, но допускаются фантомные чтения.
🟠Serializable (Сериализуемый)
Обеспечивает максимальный уровень изоляции. Транзакции выполняются так, как если бы они были сериализованы, то есть последовательно. Нет. Обеспечивает наивысшую консистентность данных, но может значительно снижать производительность из-за блокировок и задержек.
🚩Аномалии
🟠Грязное чтение (Dirty Read)
Происходит, когда транзакция читает данные, измененные другой транзакцией, которая еще не зафиксирована. Уровень Read Uncommitted допускает эту аномалию.
🟠Неповторимое чтение (Non-repeatable Read)
Происходит, когда транзакция читает те же данные несколько раз и получает разные значения из-за фиксации изменений другой транзакцией. Уровни Read Committed и выше предотвращают грязные чтения, но Read Committed допускает неповторимые чтения.
🟠Фантомное чтение (Phantom Read)
Происходит, когда транзакция выполняет одно и то же запрос несколько раз и видит разные наборы строк из-за вставки, обновления или удаления данных другой транзакцией. Уровень Repeatable Read предотвращает неповторимые чтения, но допускает фантомные чтения. Уровень Serializable предотвращает все три аномалии.
Ставь 👍 и забирай 📚 Базу знаний | 206 |
| 20 | 🤔 Что такое Scrum?
Это методология управления проектами и одна из наиболее популярных реализаций Agile, предназначенная для гибкой разработки программного обеспечения. Scrum помогает командам работать более эффективно и адаптироваться к изменениям в требованиях и приоритетах. Основные концепции и элементы Scrum включают следующие компоненты:
🚩Основные концепции
🟠Инкрементная и итеративная разработка
Scrum разбивает работу над проектом на небольшие итерации, называемые спринтами. Каждый спринт обычно длится от одной до четырех недель и заканчивается созданием работающего инкремента продукта.
🟠Самоорганизующиеся команды
Команды в Scrum сами управляют своей работой и распределяют задачи между участниками без вмешательства извне.
🟠Роли в Scrum
В Scrum выделяются три основных роли:
Product Owner (Владелец продукта): отвечает за создание и управление бэклогом продукта, определение приоритетов и взаимодействие с заинтересованными сторонами.
Scrum Master: помогает команде следовать принципам Scrum, устраняет препятствия и обеспечивает эффективность работы команды.
Development Team (Команда разработки): непосредственно занимается созданием продукта, включает специалистов различных профилей, необходимых для выполнения задач.
🚩Основные элементы
🟠Product Backlog (Бэклог продукта)
список всех требований и функций, которые должны быть реализованы в продукте. Элементы бэклога приоритизируются владельцем продукта.
🟠Sprint Backlog (Бэклог спринта)
список задач, которые команда обязуется выполнить в текущем спринте. Эти задачи выбираются из бэклога продукта на основе приоритетов и возможностей команды.
🟠Sprint (Спринт)
фиксированный период времени, в течение которого команда работает над выполнением задач из бэклога спринта. В конце спринта команда демонстрирует результат своей работы.
🟠Daily Scrum (Ежедневный скрам)
ежедневные короткие встречи (обычно 15 минут), на которых команда обсуждает прогресс, планирует работу на день и выявляет препятствия.
🟠Sprint Review (Обзор спринта)
встреча в конце каждого спринта, на которой команда демонстрирует результаты своей работы заинтересованным сторонам и получает обратную связь.
🟠Sprint Retrospective (Ретроспектива спринта)
встреча после завершения спринта, на которой команда анализирует свою работу, обсуждает, что было хорошо, что можно улучшить, и разрабатывает план улучшений на следующий спринт.
🚩Плюсы
➕Гибкость
Scrum позволяет быстро адаптироваться к изменяющимся требованиям и приоритетам.
➕Прозрачность
Частые демонстрации результата и обратная связь обеспечивают высокую степень прозрачности процесса разработки.
➕Повышение качества
Регулярные проверки и ретроспективы помогают команде постоянно улучшать качество продукта и процесса.
➕Улучшение взаимодействия
Scrum способствует более тесному взаимодействию между членами команды и заинтересованными сторонами.
Ставь 👍 и забирай 📚 Базу знаний | 202 |
