Это два типа объединения таблиц в 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
Передача данных через HTTPS (SSL/TLS) обеспечивает шифрование данных между клиентом и сервером, что предотвращает их перехват и чтение третьими лицами. Настройте ваш веб-сервер для использования HTTPS, получив и установив SSL/TLS сертификат.
Куки передаются только по HTTPS-соединениям. Добавьте флаг Secure при установке куки.
Set-Cookie: sessionId=abc123; Secure
Куки недоступны через JavaScript, что предотвращает их кражу с помощью XSS (Cross-Site Scripting) атак. Добавьте флаг HttpOnly при установке куки.
Set-Cookie: sessionId=abc123; HttpOnly
Предотвращает отправку куки на другие сайты, что защищает от 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}'
Могут использоваться для кражи куки. Включает в себя валидацию и фильтрацию пользовательских вводов, использование Content Security Policy (CSP) и безопасное кодирование данных. Внедрите валидацию и фильтрацию вводов на стороне сервера, настройте CSP заголовки.
Content-Security-Policy: script-src 'self'
Значений куки и установка короткого срока действия уменьшает временное окно для атакующих. Устанавливайте короткий срок действия и обновляйте значение куки при каждой сессии.
Set-Cookie: sessionId=abc123; Max-Age=3600 # 1 час
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Это программное обеспечение, которое позволяет пользователям просматривать и взаимодействовать с информацией в Интернете. Основные функции браузера включают получение, рендеринг и отображение веб-страниц, а также выполнение веб-приложений.
Пользователь вводит URL (Uniform Resource Locator) в адресную строку браузера. Браузер определяет тип протокола (например, HTTP или HTTPS) и преобразует доменное имя в IP-адрес с помощью DNS (Domain Name System). Затем браузер отправляет HTTP-запрос к веб-серверу по указанному IP-адресу.
Веб-сервер получает запрос и отправляет HTTP-ответ, который обычно содержит HTML-документ, CSS-стили, JavaScript-код и другие ресурсы, такие как изображения и видео. Ответ передается обратно браузеру.
Браузер анализирует полученный HTML-документ и строит дерево DOM (Document Object Model), представляющее структуру страницы. Одновременно браузер загружает и обрабатывает связанные ресурсы (CSS, JavaScript, изображения).
Браузер анализирует CSS-файлы и строит CSSOM (CSS Object Model), описывающую, как элементы должны отображаться. DOM и CSSOM объединяются для создания render tree, которая содержит видимые элементы страницы с их стилями.
Render tree используется для определения положения и внешнего вида элементов на экране. Браузер выполняет layout (разметку) элементов и отрисовывает их на экране.
Браузер интерпретирует и выполняет JavaScript-код, который может изменять DOM и CSSOM. JavaScript может также взаимодействовать с сервером через AJAX-запросы для динамического обновления страницы без перезагрузки.
Браузер обрабатывает взаимодействие пользователя с элементами страницы (клики, ввод текста и т.д.). Изменения, вызванные действиями пользователя или выполнением JavaScript, могут обновлять render tree и перерисовывать элементы.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Транзакция в контексте баз данных - это последовательность операций, выполняемых как единое целое. Она должна быть полностью выполнена или полностью отменена, чтобы обеспечить целостность и консистентность данных. Основные свойства транзакции определяются набором правил, известных как ACID:
Транзакция либо выполняется полностью, либо не выполняется вовсе. Если происходит ошибка, все операции транзакции откатываются. Например, в банковской системе перевод денег между счетами требует списания суммы с одного счета и зачисления на другой. Если одна из операций не выполнится, другая также должна быть отменена.
После завершения транзакции данные должны оставаться в согласованном состоянии, соответствующем всем определенным правилам и ограничениям. В инвентарной системе при добавлении нового товара должна проверяться допустимость всех значений, таких как положительное количество и правильная категория.
Выполнение транзакций изолировано друг от друга, так что параллельные транзакции не влияют на промежуточные состояния друг друга. Если две транзакции пытаются изменить одни и те же данные, одна из них должна завершиться до того, как другая начнет свои изменения, чтобы избежать конфликтов.
После завершения транзакции её результаты сохраняются даже в случае сбоя системы. Если транзакция по записи данных в базу данных завершилась успешно, данные останутся сохраненными даже после перезагрузки сервера.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Основное различие между протоколами HTTP (HyperText Transfer Protocol) и HTTPS (HyperText Transfer Protocol Secure) заключается в уровне безопасности, который они обеспечивают при передаче данных между клиентом (например, веб-браузером) и сервером.
HTTP: Данные передаются в открытом виде, что делает их уязвимыми для перехвата и чтения злоумышленниками.
HTTPS: Данные передаются в зашифрованном виде с использованием SSL/TLS (Secure Sockets Layer/Transport Layer Security). Это обеспечивает защиту данных от перехвата и несанкционированного доступа.
HTTP: Отсутствует механизм аутентификации, что затрудняет проверку подлинности веб-сайта.
HTTPS: Использует сертификаты SSL/TLS, которые удостоверяют подлинность веб-сайта, подтверждая, что соединение установлено с тем сервером, с которым намеревался связаться пользователь.
HTTP: Данные могут быть изменены или повреждены во время передачи, и это не будет обнаружено.
HTTPS: Гарантирует целостность данных, так как любые изменения данных при передаче будут обнаружены, и соединение будет разорвано.
HTTP: Использует порт 80 по умолчанию.
HTTPS: Использует порт 443 по умолчанию.
Обеспечивает защиту конфиденциальной информации, такой как логины, пароли, номера кредитных карт.
Пользователи склонны больше доверять веб-сайтам, использующим HTTPS, так как это указывает на то, что сайт заботится о безопасности данных.
Поисковые системы, такие как Google, предпочитают сайты, использующие HTTPS, и ранжируют их выше по сравнению с сайтами, использующими HTTP.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Принципы разделения ответственности (Separation of Concerns, SoC) предполагают разделение логики программы на отдельные части, каждая из которых выполняет строго определённую функцию. Это позволяет сделать код более структурированным, гибким и легче сопровождаемым. Популярные паттерны проектирования, основанные на разделении ответственности, включают MVC, MVP, MVVM и другие. Они применяются в разработке приложений для чёткого разграничения пользовательского интерфейса, бизнес-логики и работы с данными.
Хранит данные и логику их обработки. Отвечает за взаимодействие с базой данных или другими источниками данных. Уведомляет представление об изменениях данных.
Отображает данные пользователю. Реагирует на обновления данных от модели. Не содержит логики обработки данных.
Обрабатывает пользовательский ввод (например, нажатия кнопок, ввод текста). Вызывает соответствующие методы модели и обновляет представление.
Работает с данными и бизнес-логикой.
Интерфейс пользователя. Не содержит логики, только вызывает методы презентера.
Посредник между моделью и представлением. Получает данные из модели и передаёт их в представление. Не знает деталей реализации интерфейса (только абстракция).
Плюсы и минусы
Управляет данными и бизнес-логикой.
Отображает данные и предоставляет интерфейс для взаимодействия.
Посредник между моделью и представлением. Содержит логику преобразования данных для представления. Часто использует привязку данных (data binding), что позволяет автоматически обновлять UI при изменении данных.
Плюсы и минусы
Централизованное состояние приложения.
Компоненты, которые отображают состояние.
Описывают, какие изменения должны произойти в состоянии.
Функции, описывающие, как изменяется состояние на основе действий.
Плюсы и минусы
можно тестировать компоненты независимо друг от друга.
код проще понять и сопровождать.
компоненты можно использовать в других частях приложения.
команда может работать над разными частями параллельно.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это операции в языке SQL, которые позволяют объединять строки из двух или более таблиц на основе логических связей между ними. Существует несколько типов JOIN'ов, каждый из которых используется для разных сценариев объединения данных.
Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах.
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
Возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадений нет, то в столбцах правой таблицы будут NULL.
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
Возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если совпадений нет, то в столбцах левой таблицы будут NULL.
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
Возвращает все строки, когда есть совпадения в одной из таблиц. Если совпадений нет, то в соответствующих столбцах будут NULL.
SELECT employees.name, departments.department_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.id;
Возвращает декартово произведение строк из двух таблиц. Каждая строка из первой таблицы соединяется со всеми строками из второй таблицы.
SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;
Использует JOIN для объединения таблицы с самой собой. Это полезно, когда нужно сравнить строки внутри одной таблицы.
SELECT e1.name AS Employee1, e2.name AS Employee2
FROM employees e1
INNER JOIN employees e2 ON e1.manager_id = e2.id;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это конструкция SQL, используемая для группировки строк в таблице на основе значений одного или нескольких столбцов. Она часто используется в сочетании с агрегатными функциями (такими как
COUNT, SUM, AVG, MAX, MIN), чтобы выполнять вычисления для каждой группы в результате запроса.Операция
GROUP BY группирует строки, имеющие одинаковые значения в указанных столбцах, в одну группу.В сочетании с
GROUP BY часто используются агрегатные функции для выполнения вычислений на уровне групп, а не отдельных строк.SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ на сервере, особенно в контексте HTTP, состоит из нескольких ключевых компонентов. Эти компоненты обеспечивают клиенту информацию о результате запроса, статусе обработки, а также предоставляют сами данные, если это необходимо. Основные части ответа включают:
Стартовая линия содержит информацию о статусе ответа и состоит из следующих частей:
Версия протокола HTTP: Например, HTTP/1.1.
Код состояния (Status Code): Числовой код, который указывает результат обработки запроса. Примеры включают 200 (OK), 404 (Not Found), 500 (Internal Server Error).
Причинная фраза (Reason Phrase): Человеко-читаемое описание статуса. Например, OK, Not Found, Internal Server Error.
HTTP/1.1 200 OK
Заголовки предоставляют метаданные о ответе. Они состоят из пар "ключ-значение" и могут включать:
Date: Дата и время отправки ответа.
Content-Type: Тип содержимого ответа (например, text/html, application/json).
Content-Length: Размер тела ответа в байтах.
Server: Информация о сервере, отправившем ответ.
Set-Cookie: Установка cookies.
Content-Type: application/json
Content-Length: 85
Server: Apache/2.4.1 (Unix)
Set-Cookie: sessionId=abc123; Path=/; HttpOnly
Тело ответа содержит данные, которые сервер отправляет клиенту. Формат и содержание тела зависят от типа ответа и могут включать:
HTML-страницы
JSON-объекты
XML-данные
Файлы (например, изображения, документы)
{
"id": 123,
"name": "John Doe",
"email": "[email protected]"
}Пример полного HTTP-ответа
HTTP/1.1 200 OK
Date: Tue, 27 Jul 2024 12:28:53 GMT
Content-Type: application/json
Content-Length: 85
Server: Apache/2.4.1 (Unix)
Set-Cookie: sessionId=abc123; Path=/; HttpOnly
{
"id": 123,
"name": "John Doe",
"email": "[email protected]"
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
Напоминаю, что в честь релиза запускаем акцию.
Первые 500 покупателей получат:
🚀 Скидку 50% на PRO тариф на 1 год
🎁 Подарок ценностью 5000₽ для тех, кто подписан на этот канал
🔔 Подпишитесь на этот канал: https://t.iss.one/+b2fZN17A9OQ3ZmJi
В нем мы опубликуем сообщение о релизе в первую очередь
Please open Telegram to view this post
VIEW IN TELEGRAM
Один из основных принципов объектно-ориентированного программирования (ООП), наряду с наследованием и полиморфизмом. Смысл инкапсуляции заключается в объединении данных и методов, работающих с этими данными, в одном объекте, а также в ограничении доступа к этим данным из внешнего мира.
В инкапсуляции данные (свойства) объекта скрываются от внешнего доступа и защищаются от некорректных изменений. Это достигается путем использования модификаторов доступа (например,
private, protected, public).Вместо прямого доступа к данным, предоставляются методы (геттеры и сеттеры) для чтения и изменения значений свойств. Это позволяет контролировать, каким образом данные могут быть изменены или получены.
Инкапсуляция помогает защитить внутреннее состояние объекта от некорректных или неожиданных изменений, обеспечивая целостность данных и уменьшая вероятность ошибок.
На Java
public class Person {
private String name;
private int age;
// Конструктор
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Геттер для имени
public String getName() {
return name;
}
// Сеттер для имени
public void setName(String name) {
this.name = name;
}
// Геттер для возраста
public int getAge() {
return age;
}
// Сеттер для возраста
public void setAge(int age) {
if (age > 0) {
this.age = age;
} else {
System.out.println("Возраст должен быть положительным числом.");
}
}
}На Python
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
# Геттер для имени
@property
def name(self):
return self._name
# Сеттер для имени
@name.setter
def name(self, name):
self._name = name
# Геттер для возраста
@property
def age(self):
return self._age
# Сеттер для возраста
@age.setter
def age(self, age):
if age > 0:
self._age = age
else:
print("Возраст должен быть положительным числом.")
# Пример использования
person = Person("John", 30)
print(person.name) # John
person.age = -5 # Возраст должен быть положительным числом.
print(person.age) # 30
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Транзакция может читать данные, измененные другой транзакцией, даже если та еще не зафиксирована. Грязные чтения, неповторимые чтения и фантомные чтения. Редко используется на практике из-за высокого риска неконсистентных данных.
Транзакция видит только те изменения, которые были зафиксированы другими транзакциями. Незафиксированные изменения не видны. Неповторимые чтения и фантомные чтения. Широко используется, обеспечивает баланс между производительностью и консистентностью данных.
Гарантирует, что если транзакция повторно читает данные, она получит те же самые значения, даже если другие транзакции изменяют данные. Фантомные чтения. Используется, когда требуется более высокий уровень консистентности данных, но допускаются фантомные чтения.
Обеспечивает максимальный уровень изоляции. Транзакции выполняются так, как если бы они были сериализованы, то есть последовательно. Нет. Обеспечивает наивысшую консистентность данных, но может значительно снижать производительность из-за блокировок и задержек.
Происходит, когда транзакция читает данные, измененные другой транзакцией, которая еще не зафиксирована. Уровень Read Uncommitted допускает эту аномалию.
Происходит, когда транзакция читает те же данные несколько раз и получает разные значения из-за фиксации изменений другой транзакцией. Уровни Read Committed и выше предотвращают грязные чтения, но Read Committed допускает неповторимые чтения.
Происходит, когда транзакция выполняет одно и то же запрос несколько раз и видит разные наборы строк из-за вставки, обновления или удаления данных другой транзакцией. Уровень Repeatable Read предотвращает неповторимые чтения, но допускает фантомные чтения. Уровень Serializable предотвращает все три аномалии.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это принцип проектирования и разработки, который предполагает, что системы и решения должны быть максимально простыми и избегать ненужной сложности. Этот принцип особенно важен в программировании и инженерии, так как помогает создавать более понятные, поддерживаемые и надежные системы.
Системы должны быть простыми в понимании и использовании. Чем проще система, тем меньше вероятность возникновения ошибок. Простота достигается за счет минимизации количества компонентов и взаимодействий между ними.
Код должен быть понятным и легко читаемым. Это облегчает его поддержку и модификацию. Использование понятных имен переменных, функций и классов, а также понятная структура кода способствуют ясности.
Компоненты или функциональность следует избегать. Если какой-то элемент системы не добавляет реальной ценности, его следует убрать. Это включает в себя как аппаратное, так и программное обеспечение.
Системы должны быть разбиты на небольшие, независимые модули, каждый из которых выполняет свою четко определенную задачу. Модульность помогает в тестировании, повторном использовании и поддержке кода.
При разработке функций или методов следует избегать создания слишком сложных алгоритмов, если можно использовать более простые и понятные решения. Использование стандартных библиотек и инструментов вместо написания собственного кода с нуля, когда это возможно.
В системной архитектуре следует избегать излишнего усложнения связей между компонентами системы. Использование простых и проверенных шаблонов проектирования вместо сложных и экспериментальных решений.
Документация должна быть простой и понятной, избегая излишне технических или сложных объяснений. Хорошо структурированная и лаконичная документация помогает пользователям и разработчикам быстрее понять систему.
Простые системы легче понимать и поддерживать, что снижает затраты на обучение и поддержку.
Чем проще система, тем меньше вероятность возникновения ошибок и проблем при её использовании.
Простые решения часто требуют меньше ресурсов и могут работать быстрее и эффективнее.
Простые и модульные системы легче масштабировать и расширять по мере необходимости.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Методы GET и POST являются двумя наиболее часто используемыми HTTP-методами для передачи данных между клиентом и сервером. Они выполняют разные задачи и имеют свои особенности и случаи применения.
Метод GET используется для получения данных с сервера. Это наиболее часто используемый метод для запросов, которые не изменяют состояние сервера.
Данные передаются через URL в строке запроса (query string). Это делает данные видимыми и ограничивает их размер.
Запросы GET могут кэшироваться браузерами, серверами и прокси-серверами. Это позволяет ускорить повторные запросы и снизить нагрузку на сервер.
GET-запросы являются идемпотентными, что означает, что повторное выполнение одного и того же GET-запроса приведет к одному и тому же результату, не изменяя состояние ресурса.
GET-запросы считаются безопасными, так как они не изменяют данные на сервере.
Метод POST используется для отправки данных на сервер, чтобы создать или изменить ресурсы. Это подходящий метод для операций, которые изменяют состояние сервера.
Данные передаются в теле запроса. Это позволяет отправлять большие объемы данных и сохранять конфиденциальность данных, поскольку они не видны в URL.
Запросы POST не кэшируются браузерами и прокси-серверами по умолчанию. Это обеспечивает, что данные будут отправлены на сервер каждый раз при выполнении запроса.
POST-запросы не являются идемпотентными. Каждый новый POST-запрос может привести к созданию новых ресурсов или изменению существующих, что делает их выполнение неоднозначным при повторении.
POST-запросы более безопасны в плане передачи данных, так как информация передается в теле запроса и не видна в URL.
Получение информации о пользователе, загрузка страницы или получение данных с API.
Отправка формы с данными регистрации, добавление нового товара в базу данных, обновление информации о пользователе.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это изолированная среда для выполнения программного кода, которая позволяет создавать независимые друг от друга пространства для различных проектов. В каждом таком окружении могут быть установлены специфические для проекта зависимости (библиотеки, пакеты), которые не будут пересекаться с зависимостями других проектов.
В разных проектах могут использоваться различные версии одних и тех же библиотек. Виртуальные окружения позволяют избежать конфликтов версий, создавая изолированные пространства для каждого проекта.
Легко установить, обновить или удалить зависимости без риска повлиять на другие проекты. Это особенно полезно при работе над проектами с долгим жизненным циклом, где могут возникать проблемы совместимости.
Изоляция окружения помогает ограничить доступ к критически важным системным ресурсам и защищает основную систему от потенциально вредоносного кода.
Виртуальные окружения позволяют разработчикам легко переключаться между проектами и их зависимостями, что упрощает процесс тестирования и отладки.
Проекты с виртуальными окружениями легче перенести на другие системы или передать другим разработчикам. Достаточно скопировать окружение вместе с проектом, чтобы получить полностью функционирующую копию.
Встроенный модуль в Python, позволяющий создавать легковесные виртуальные окружения.
Более функциональный инструмент, особенно полезный для старых версий Python.
Инструмент, который управляет как пакетами, так и виртуальными окружениями, поддерживающий не только Python, но и другие языки программирования.
Команда для создания нового окружения (например,
python -m venv env для venv).Команда для активации окружения (например,
source env/bin/activate на Unix-подобных системах или .\env\Scripts\activate на Windows).Использование менеджера пакетов (например, pip) для установки необходимых библиотек.
Команда для выхода из окружения (например,
deactivate).Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Это архитектурный стиль для создания веб-сервисов, который использует стандартные HTTP методы и принципы для взаимодействия между клиентом и сервером. REST API предоставляет набор операций для создания, чтения, обновления и удаления ресурсов, представленных в виде URL.
Клиент и сервер отделены друг от друга. Клиент запрашивает ресурсы, сервер обрабатывает запросы и возвращает ресурсы или статус операции.
Каждое взаимодействие между клиентом и сервером независимое. Сервер не хранит состояние клиента между запросами. Вся необходимая информация для выполнения запроса должна быть предоставлена в каждом запросе.
Ответы сервера могут быть кешированы клиентом или промежуточными звеньями (прокси-серверами) для повышения производительности и снижения нагрузки на сервер.
Универсальный интерфейс упрощает взаимодействие между клиентом и сервером. Основные методы HTTP (GET, POST, PUT, DELETE) используются для выполнения операций с ресурсами.
REST API может быть организован в виде многоуровневой системы, где компоненты выполняют разные задачи (например, балансировка нагрузки, кеширование, защита и т.д.).
Ресурсы представляются в виде различных форматов (обычно JSON или XML). Клиент и сервер могут договариваться о формате данных через заголовки HTTP (например,
Content-Type и Accept).Извлечение данных с сервера. Например, получение информации о пользователе.
Отправка данных на сервер для создания нового ресурса. Например, создание новой учетной записи пользователя.
Обновление существующего ресурса на сервере. Например, обновление информации о пользователе.
Удаление ресурса с сервера. Например, удаление учетной записи пользователя.
Частичное обновление ресурса на сервере. Например, изменение только email пользователя.
Запрос на создание нового пользователя (POST /users)
POST /users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "[email protected]"
}
Ответ на успешное создание пользователя
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 1,
"name": "John Doe",
"email": "[email protected]"
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
Ура, друзья! Изиоффер переходит в публичное бета-тестирование!
🎉 Что нового:
🟢 Анализ IT собеседований на основе 4500+ реальных интервью
🟢 Вопросы из собеседований с вероятностью встречи
🟢 Видео-примеры ответов на вопросы от Senior, Middle, Junior грейдов
🟢 Пример лучшего ответа
🟢 Задачи из собеседований
🟢 Тестовые задания
🟢 Примеры собеседований
🟢 Фильтрация всего контента по грейдам, компаниям
🟢 Тренажер подготовки к собеседованию на основе интервальных повторений и флеш карточек
🟡 Тренажер "Реальное собеседование" с сценарием вопросов из реальных собеседований (скоро)
🟢 Автоотклики на HeadHunter
🟢 Закрытое сообщество easyoffer
💎 Акция в честь открытия для первых 500 покупателей:
🚀 Скидка 50% на PRO тариф на 1 год (15000₽ → 7500₽)
🔥 Акция уже стартовала! 👉 https://easyoffer.ru/pro
🎉 Что нового:
💎 Акция в честь открытия для первых 500 покупателей:
🚀 Скидка 50% на PRO тариф на 1 год (
🔥 Акция уже стартовала! 👉 https://easyoffer.ru/pro
Please open Telegram to view this post
VIEW IN TELEGRAM
Индексы в базе данных - это структуры, которые улучшают скорость операций поиска данных в таблице базы данных. Они работают по принципу, аналогичному указателю в книге, который позволяет быстро находить нужную информацию. Индексы создаются на одном или нескольких столбцах таблицы и позволяют значительно ускорить выполнение запросов, особенно при работе с большими объемами данных.
Основная функция индексов - это сокращение времени, необходимого для поиска записей в таблице. Без индексов база данных должна бы была проверять каждую запись, чтобы найти нужные данные.
Индексы могут значительно повысить производительность запросов SELECT, особенно тех, которые часто выполняются.
Индексы могут использоваться для ускорения операций сортировки, так как данные в индексе могут быть отсортированы.
Индексы также используются для обеспечения уникальности значений в столбцах. Например, уникальный индекс гарантирует, что в столбце не будет повторяющихся значений.
Индексы создаются с помощью SQL-запросов, таких как
CREATE INDEX. Можно создавать индексы на один столбец или на несколько столбцов (составные индексы).Существует несколько типов индексов, включая B-дерево, хеш-индексы, битмап-индексы и другие. Каждый тип имеет свои особенности и применяется в зависимости от конкретных задач.
При выполнении запросов база данных автоматически использует индексы для оптимизации поиска данных. Это не требует дополнительных действий со стороны пользователя.
Важно понимать, что индексы требуют дополнительного пространства на диске и могут замедлять операции вставки, обновления и удаления данных, так как индексы нужно поддерживать в актуальном состоянии. Поэтому следует тщательно продумывать, какие индексы необходимы.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В Linux есть несколько команд для проверки свободного места на диске.
Эта команда отображает информацию о файловых системах, включая общий объём, использованное и свободное пространство.
df -h
Чтобы посмотреть только свободное место на корневом (
/) разделе: df -h /
Если нужно узнать место на конкретном диске или разделе:
df -h /dev/sda1
Команда
du показывает, сколько места занимает конкретная директория du -sh /путь/к/папке
lsblk — информация о дисках и разделах lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
Если нужно увидеть структуру разделов диска
sudo fdisk -l
или
sudo parted -l
Если
du неудобен, можно установить и использовать ncdu: sudo apt install ncdu # Для Debian/Ubuntu
sudo yum install ncdu # Для CentOS/RHEL
ncdu
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Это понятие в программировании, обозначающее код, который легко читать, понимать и поддерживать. Принципы чистого кода помогают разработчикам создавать качественные и устойчивые к изменениям программы. Вот основные характеристики и принципы чистого кода:
Код должен быть понятным и легким для чтения другими разработчиками. Имена переменных, функций и классов должны быть осмысленными и описательными.
Код должен быть простым и ясным, избегая излишней сложности. Это делает его более понятным и легким в поддержке.
Следование единому стилю кодирования и соглашениям по наименованию. Это упрощает чтение и понимание кода.
Избегание дублирования кода, что способствует его упрощению и уменьшению ошибок.
Разделение кода на независимые модули или компоненты, которые можно разрабатывать, тестировать и поддерживать отдельно.
Код должен быть легким для тестирования. Хорошо написанный код обычно легко покрыть юнит-тестами.
Имена переменных, функций и классов должны быть осмысленными и описывать их назначение.
int age; // Понятно, что переменная хранит возраст
Функции должны быть короткими и выполнять одну задачу.
void calculateAndPrintTotal() {
int total = calculateTotal();
printTotal(total);
}Комментарии должны объяснять, почему был написан определенный код, а не что он делает. Хорошо написанный код должен быть самодокументируемым.
// Calculate the total price including tax
int totalPrice = calculateTotalPrice();
Единый стиль форматирования делает код более читабельным. Используйте отступы, пробелы и пустые строки для улучшения структуры кода.
if (isValid) {
process();
} else {
handleError();
}Обработка ошибок должна быть понятной и не загромождать основной код.
try {
processFile(file);
} catch (IOException e) {
logError(e);
}Избегайте использования магических чисел и строк. Вместо этого используйте константы с осмысленными именами.
static final int MAX_USERS = 100;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM