Backend
3.95K subscribers
38 photos
716 links
Комьюнити Backend программистов.
Python, Java, Golang, PHP, C#, C/C++, DevOps

Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Download Telegram
🤔 Есть ли диалекты в SQL?

Да, в SQL есть диалекты. Это стандартный язык для управления реляционными базами данных, но каждая система управления базами данных (СУБД) может реализовывать его по-своему, добавляя собственные расширения и особенности. Эти вариации называются диалектами SQL.

🚩Почему существуют диалекты SQL?

🟠Разные стандарты SQL
хотя существуют стандарты SQL (например, SQL-92, SQL:1999, SQL:2003, SQL:2011 и другие), не все СУБД полностью их поддерживают. Вместо этого каждая СУБД адаптирует стандарт под свои нужды.

🟠Производительность и оптимизация
разработчики СУБД добавляют специфические функции и операторы, которые улучшают производительность и позволяют работать с данными эффективнее.

🟠Дополнительные возможности
каждая СУБД может предлагать уникальные функции, такие как пользовательские типы данных, расширенные индексы, собственные функции аналитики и т. д.

🚩Примеры диалектов SQL

🟠MySQL SQL
имеет специфические функции, такие как LIMIT для ограничения количества строк в запросе и специфичный синтаксис для UPSERT (INSERT ... ON DUPLICATE KEY UPDATE).
🟠PostgreSQL SQL
поддерживает сложные типы данных, такие как JSON и массивы, а также расширенные функции работы с рекурсивными запросами.
🟠Microsoft SQL Server (T-SQL)
включает процедурные расширения, такие как DECLARE, BEGIN ... END, TRY ... CATCH и другие.
🟠Oracle SQL (PL/SQL)
содержит мощный встроенный язык программирования для написания хранимых процедур и триггеров.
🟠SQLite SQL
минималистичный диалект, который не поддерживает некоторые сложные конструкции, но удобен для встраиваемых решений.

🚩Как учитывать диалекты при разработке?

Если проект должен работать на разных СУБД, следует использовать стандартный SQL (ANSI SQL) или ORM (например, SQLAlchemy, Hibernate), который может адаптировать запросы под нужный диалект. При выборе конкретной СУБД важно изучить её специфические возможности и ограничения, так как переносимость SQL-кода между разными диалектами не всегда тривиальна.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
🎉 Краудфандинг easyoffer 2.0 стартовал!

Друзья, с этого момента вы можете поддержать проект и получить существенный бонус:

🚀 PRO-тариф на 1 год, по цене месячной подписки на релизе.
Доступ к закрытому бета-тесту easyoffer 2.0 (середина–конец мая)

Поддержать проект можно здесь:
https://planeta.ru/campaigns/easyoffer

📌 Если не получается оплатить через карту РФ — напишите мне @kivaiko, и мы найдём удобный способ
Forwarded from easyoffer
Я поставил целью сбора скромные 300 тыс. рублей, но ребята, вы накидали больше млн. всего за 1 день. Это просто невероятно!

Благодаря вашей поддержке, я смогу привлечь еще больше людей для разработки сайта и обработки собеседований. Ваш вклад сделает проект качественнее и ускорит его выход! Огромное вам спасибо!

Краудфандинг будет продолжаться еще 31 день и все кто поддержать проект сейчас, до его выхода, смогут получить:

🚀 PRO-тариф на 1 год, по цене месячной подписки на релизе.
Доступ к закрытому бета-тесту easyoffer 2.0 (середина–конец мая)

Поддержать проект можно здесь:
https://planeta.ru/campaigns/easyoffer

Огромное спасибо за вашу поддержку! 🤝
🤔 Какие есть статус коды?

Статус коды HTTP используются для обозначения результата обработки запроса сервером.

🚩Информационные (100-199)

🟠100 Continue
Сервер получил начальную часть запроса клиента и ожидает продолжения.
🟠101 Switching Protocols
Клиент запросил изменение протокола, и сервер согласен выполнить это.

🚩Успешные (200-299)

🟠200 OK
Запрос успешно обработан, и сервер отправляет запрашиваемые данные.
🟠201 Created
Запрос успешно выполнен, и в результате был создан новый ресурс.
🟠202 Accepted
Запрос принят для обработки, но обработка еще не завершена.
🟠204 No Content
Запрос успешно выполнен, но сервер не возвращает никаких данных.

🚩Перенаправления (300-399)

🟠301 Moved Permanently
Запрашиваемый ресурс был окончательно перемещен на новый URI.
🟠302 Found
Запрашиваемый ресурс временно доступен по другому URI.
🟠304 Not Modified
Данные не изменились, клиент может использовать кэшированную версию.

🚩Клиентские ошибки (400-499)

🟠400 Bad Request
Сервер не может обработать запрос из-за ошибки клиента (например, неверный синтаксис).
🟠401 Unauthorized
Для доступа к запрашиваемому ресурсу требуется аутентификация.
🟠403 Forbidden
У клиента нет прав на доступ к запрашиваемому ресурсу.
🟠404 Not Found
Запрашиваемый ресурс не найден на сервере.
🟠405 Method Not Allowed
Метод, указанный в запросе, не поддерживается данным ресурсом.

🚩Ошибки сервера (500-599)

🟠500 Internal Server Error
Общая ошибка сервера, когда обработка запроса не может быть завершена.
🟠501 Not Implemented
Сервер не поддерживает функциональность, необходимую для обработки запроса.
🟠502 Bad Gateway
Сервер, выполняющий роль шлюза или прокси, получил недействительный ответ от вышестоящего сервера.
🟠503 Service Unavailable
Сервер временно не доступен (например, из-за перегрузки или технического обслуживания).
🟠504 Gateway Timeout
Сервер, выполняющий роль шлюза или прокси, не дождался ответа от вышестоящего сервера вовремя.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какие http методы могут быть?

HTTP (HyperText Transfer Protocol) методы представляют собой набор стандартных операций, которые используются для взаимодействия между клиентом и сервером в сети. Каждый метод определяет конкретное действие, которое должен выполнить сервер. Вот основные HTTP методы и их предназначение:

🟠GET
Метод GET используется для получения данных с сервера. Он запрашивает представление ресурса, не изменяя его состояния. GET запросы часто используются для запросов веб-страниц и получения данных из API.

🟠POST
Метод POST используется для отправки данных на сервер с целью создания или обновления ресурса. Это может включать отправку формы на веб-сайте или загрузку файла. POST запросы обычно содержат данные в теле запроса.

🟠PUT
Метод PUT используется для обновления существующего ресурса или создания нового ресурса на сервере. Если ресурс уже существует, он будет обновлен, если нет — будет создан.

🟠DELETE
Метод DELETE используется для удаления ресурса с сервера. Запросы DELETE могут быть небезопасными, так как они изменяют состояние сервера, удаляя данные.

🟠PATCH
Метод PATCH используется для частичного обновления ресурса. В отличие от PUT, который заменяет весь ресурс, PATCH изменяет только указанные части ресурса.

🟠HEAD
Метод HEAD аналогичен GET, но без тела ответа. Используется для получения метаданных о ресурсе, таких как заголовки, без загрузки самого ресурса.

🟠OPTIONS
Метод OPTIONS используется для запроса информации о поддерживаемых методах на сервере или на конкретном ресурсе. Это может быть полезно для определения доступных операций перед отправкой основного запроса.

🟠CONNECT
Метод CONNECT используется для установления туннеля к серверу через прокси. Обычно используется для HTTPS через прокси.

🟠TRACE
Метод TRACE выполняет тестовый запрос по маршруту до ресурса. Он возвращает запрос, полученный сервером, что может помочь в диагностике сетевых проблем или выявлении изменений в маршруте запроса.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое Docker?

Docker - это платформа для автоматизации развёртывания, масштабирования и управления контейнеризированными приложениями. Она позволяет разработчикам создавать, тестировать и разворачивать приложения в изолированных средах, называемых контейнерами.

🚩Основные компоненты Docker

🟠Docker Engine
Это серверное ПО, которое запускает и управляет контейнерами. Состоит из двух частей:
Docker Daemon: Служба, которая управляет всеми объектами Docker (контейнерами, образами и т.д.).
Docker CLI: Командная строка, через которую пользователи взаимодействуют с Docker Daemon.

🟠Образы (Images)
Это шаблоны для создания контейнеров. Образ включает в себя все зависимости, библиотеки, конфигурационные файлы, скрипты и код, необходимый для запуска приложения.

🟠Контейнеры (Containers)
Это изолированные среды, в которых выполняются приложения. Контейнеры создаются на основе образов и содержат всё необходимое для работы приложения.

🟠Docker Hub
Это облачный сервис для хранения и распределения Docker-образов. Разработчики могут загружать свои образы в Docker Hub и делиться ими с другими пользователями.

🟠Docker Compose
Это инструмент для определения и управления многоконтейнерными Docker-приложениями. С помощью файла docker-compose.yml можно описать конфигурацию всех контейнеров, сетей и томов, необходимых для работы приложения.

🚩Плюсы

Изоляция
Каждый контейнер работает в своей собственной изолированной среде, что предотвращает конфликты между приложениями.
Портативность
Образы Docker могут работать на любом сервере с установленным Docker, независимо от операционной системы.
Масштабируемость
Контейнеры можно легко масштабировать в зависимости от нагрузки.
Быстрое развёртывание
Контейнеры запускаются гораздо быстрее, чем виртуальные машины.
Упрощение CI/CD
Docker интегрируется с системами непрерывной интеграции и доставки, упрощая процессы разработки и развёртывания.

🚩Основные команды

docker build: Создание образа из Dockerfile.
docker run: Запуск нового контейнера из образа.
docker ps: Список запущенных контейнеров.
docker stop: Остановка работающего контейнера.
docker rm: Удаление остановленного контейнера.
docker pull: Загрузка образа из Docker Hub.
docker push: Загрузка образа в Docker Hub.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
🤔 Как узнать свободное место на диске в консоли Linux?

В Linux есть несколько команд для проверки свободного места на диске.

🟠`df` — информация о дисках
Эта команда отображает информацию о файловых системах, включая общий объём, использованное и свободное пространство.
  df -h


Чтобы посмотреть только свободное место на корневом (/) разделе:
df -h /


Если нужно узнать место на конкретном диске или разделе:
df -h /dev/sda1


🟠`du` — информация об использовании места каталогом
Команда du показывает, сколько места занимает конкретная директория
du -sh /путь/к/папке


lsblk — информация о дисках и разделах
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT


🟠`fdisk` и `parted` — детальная информация о разделах
Если нужно увидеть структуру разделов диска
sudo fdisk -l


или
sudo parted -l


🟠`ncdu` — удобный просмотр занятого пространства
Если 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
🤔 Что такое шардирование?

Это метод горизонтального разбиения базы данных на более мелкие, более управляемые сегменты, называемые шардов (shards). Каждый шард является независимой базой данных, содержащей подмножество всех данных. Шардирование используется для повышения производительности и масштабируемости базы данных, особенно при работе с большими объемами данных и высокими нагрузками.

🚩Аспекты

🟠Горизонтальное разбиение
Шардирование распределяет строки таблицы по нескольким базам данных, а не делит таблицы на части. Это позволяет уменьшить нагрузку на одну базу данных и распределить её между несколькими серверами.

🟠Независимость шардов
Каждый шард является автономной базой данных и может находиться на отдельном сервере. Это позволяет шардированным системам эффективно масштабироваться, добавляя новые сервера для хранения и обработки данных.

🟠Ключ шардирования
Ключ шардирования (shard key) используется для определения, в каком шарде будут храниться данные. Выбор правильного ключа шардирования имеет решающее значение для равномерного распределения данных и нагрузки.

🚩Плюсы

Масштабируемость
Шардирование позволяет горизонтально масштабировать базу данных, добавляя новые шардовые серверы по мере роста объема данных и нагрузки.

Повышение производительности
Распределение данных между несколькими серверами уменьшает нагрузку на каждый сервер, что может улучшить производительность запросов и операций записи.

Устойчивость и отказоустойчивость
Шардирование может повысить устойчивость системы к отказам, так как сбой одного шарда не влияет на доступность остальных.

Улучшенное управление
Меньшие по объему базы данных (шарды) легче управлять, бэкапить и восстанавливать по сравнению с одной большой базой данных.

🚩Минусы

Сложность управления
Настройка и управление шардированной базой данных сложнее, чем управление одной большой базой данных. Это требует дополнительного усилия для настройки и мониторинга.

Распределенные транзакции
Транзакции, охватывающие несколько шардов, становятся сложнее и могут требовать использования распределенных транзакционных механизмов, что может негативно сказаться на производительности.

Сложность запросов
Некоторые запросы, особенно те, которые требуют объединения данных из разных шардов, становятся сложнее и могут требовать дополнительной логики на уровне приложения.

Неравномерное распределение данных
Неправильный выбор ключа шардирования может привести к неравномерному распределению данных, где одни шарды перегружены, а другие остаются недозагруженными.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое модульное программирование?

Это подход к разработке программного обеспечения, при котором приложение разбивается на независимые, взаимосвязанные части, называемые модулями. Каждый модуль отвечает за выполнение определенной функции или набора функций, что делает программу более структурированной, управляемой и легко поддерживаемой.

🚩Характеристики

🟠Инкапсуляция
Каждый модуль скрывает свою внутреннюю реализацию и предоставляет четко определенный интерфейс для взаимодействия с другими модулями. Это уменьшает зависимость между модулями и улучшает устойчивость к изменениям.

🟠Разделение ответственности
Принцип единственной ответственности применяется к модулям, что означает, что каждый модуль отвечает за выполнение одной конкретной задачи или группы тесно связанных задач.

🟠Повторное использование
Модули могут быть повторно использованы в других частях программы или в других проектах, что уменьшает дублирование кода и облегчает его поддержку.

🟠Управляемость и масштабируемость
Разделение программы на модули облегчает управление проектом и его масштабирование. Изменения в одном модуле обычно не требуют изменений в других модулях, что ускоряет разработку и тестирование.

🚩Плюсы

Упрощенная отладка и тестирование
Так как модули изолированы друг от друга, их можно тестировать и отлаживать независимо. Это облегчает нахождение и исправление ошибок.
Повышенная читаемость и поддерживаемость кода
Разделение кода на небольшие, управляемые части улучшает его структуру и упрощает понимание и поддержку.
Ускорение разработки
Разные команды могут работать над разными модулями параллельно, что ускоряет процесс разработки.
Легкость вносить изменения и улучшения
Изменения в одном модуле не оказывают значительного влияния на другие модули, что облегчает внедрение новых функций и улучшений.

🚩Примеры применения

🟠Функциональные библиотеки
Модули могут быть оформлены как библиотеки функций, которые предоставляют определенные функциональные возможности, например, работа с файлами, обработка строк или взаимодействие с базами данных.

🟠Классы и объекты в ООП
В объектно-ориентированном программировании классы и объекты можно рассматривать как модули, инкапсулирующие данные и методы.

🟠Модули и пакеты в языках программирования
Многие языки программирования поддерживают концепцию модулей и пакетов, например, модули в Python, пакеты в Java и модули в ECMAScript (JavaScript).

На Python
# file: math_operations.py
def add(a, b):
return a + b

def subtract(a, b):
return a - b

# file: main.py
import math_operations

x = 10
y = 5

print("Addition:", math_operations.add(x, y))
print("Subtraction:", math_operations.subtract(x, y))


На JavaScript
// file: mathOperations.js
export function add(a, b) {
return a + b;
}

export function subtract(a, b) {
return a - b;
}

// file: main.js
import { add, subtract } from './mathOperations.js';

const x = 10;
const y = 5;

console.log('Addition:', add(x, y));
console.log('Subtraction:', subtract(x, y));


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое 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.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что такое столп "наследование" ?

Наследование — это ключевой принцип объектно-ориентированного программирования, позволяющий создавать новый класс (наследник), который заимствует свойства и методы существующего класса (родителя). Это способствует:

🟠Повторному использованию кода
Общие функции и данные определяются один раз в родительском классе и могут быть использованы во всех классах-наследниках.
🟠Упрощению расширения функциональности
Наследники могут добавлять новые свойства и методы или изменять существующие, не затрагивая код родительского класса.
🟠Созданию иерархий классов
Помогает структурировать и организовать код в виде дерева классов, отражающего реальные отношения иерархии.

class Animal {
void eat() {
System.out.println("This animal eats.");
}
}

class Dog extends Animal {
void bark() {
System.out.println("The dog barks.");
}
}

public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // Наследованный метод
dog.bark(); // Метод класса Dog
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Расскажи про https

HTTPS (HyperText Transfer Protocol Secure) — это расширение протокола HTTP, используемое для безопасного обмена данными между веб-браузером и веб-сервером. HTTPS обеспечивает конфиденциальность, целостность и аутентичность передаваемых данных, используя шифрование, аутентификацию и проверку целостности.

🚩Основные аспекты HTTPS

🟠Шифрование: HTTPS использует шифрование для защиты данных, передаваемых между клиентом и сервером. Шифрование делает данные нечитаемыми для посторонних, предотвращая их перехват и кражу. Это достигается с помощью протоколов SSL (Secure Sockets Layer) и его преемника TLS (Transport Layer Security).

🟠Аутентификация: Аутентификация подтверждает, что клиент и сервер являются теми, за кого они себя выдают. Это предотвращает атаки типа "человек посередине" (man-in-the-middle attacks). Аутентификация осуществляется с помощью цифровых сертификатов, которые выдаются доверенными центрами сертификации (Certificate Authorities, CA).

🟠Целостность данных: Целостность данных гарантирует, что данные не были изменены во время передачи. Это достигается с помощью хеш-функций и контрольных сумм, которые проверяются на каждой стороне соединения.

🚩Как работает HTTPS

🟠Инициация соединения: Клиент (например, веб-браузер) инициирует соединение с сервером, отправляя HTTPS-запрос.

🟠Обмен сертификатами: Сервер отправляет клиенту свой цифровой сертификат. Сертификат содержит публичный ключ сервера и информацию о центре сертификации.

🟠Проверка сертификата: Клиент проверяет подлинность сертификата, используя список доверенных центров сертификации. Если сертификат действителен, клиент продолжает установку защищённого соединения.

🟠Установка сеансового ключа: Клиент и сервер договариваются о сеансовом ключе, используя асимметричное шифрование. Этот ключ будет использоваться для шифрования данных в течение сеанса.

🟠Шифрование данных: Данные передаются между клиентом и сервером в зашифрованном виде, что обеспечивает их конфиденциальность и целостность.

🚩Преимущества HTTPS

🟠Безопасность: HTTPS защищает данные от перехвата и подделки, что особенно важно для передачи конфиденциальной информации, такой как пароли и номера кредитных карт.

🟠Доверие пользователей: Наличие HTTPS повышает доверие пользователей к веб-сайту, так как современные браузеры отмечают сайты с HTTPS как безопасные.

🟠SEO (Поисковая оптимизация): Поисковые системы, такие как Google, отдают предпочтение сайтам с HTTPS и могут ранжировать их выше в результатах поиска.

🟠Соответствие стандартам: Многие нормативные акты и стандарты требуют использования HTTPS для защиты данных, например, GDPR в Европейском Союзе.

🚩Как настроить HTTPS

🟠Получение сертификата: Приобретите SSL/TLS сертификат у доверенного центра сертификации (CA) или используйте бесплатные сертификаты, такие как Let's Encrypt.

🟠Установка сертификата: Установите полученный сертификат на веб-сервер. Процесс установки зависит от используемого веб-сервера (например, Apache, Nginx, IIS).

🟠Настройка перенаправлений:Настройте сервер так, чтобы все HTTP-запросы перенаправлялись на HTTPS.

🟠Обновление ссылок и ресурсов: Убедитесь, что все ссылки и ресурсы на сайте используют HTTPS, чтобы избежать смешанного контента (mixed content), когда части страницы загружаются по HTTP.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
🤔 Как с помощью одного запроса можно выбрать данные из двух таблиц?

Чтобы выбрать данные из двух таблиц в одном запросе, используется оператор JOIN. Например, INNER JOIN объединяет строки, где есть совпадения в обеих таблицах, а LEFT JOIN возвращает все строки из первой таблицы и соответствующие строки из второй, заполняя NULL там, где данных нет.

🚩Отличия между видами JOIN в SQL

В SQL существует несколько видов операторов JOIN, которые позволяют объединять данные из двух или более таблиц на основе определенных условий. Основные типы JOIN включают INNER JOIN, LEFT JOIN, RIGHT JOIN, и каждый из них имеет свои особенности и использование. Рассмотрим их различия на примере двух таблиц:

Таблица A:
id | name
-----------
1 | Alice
2 | Bob
3 | Charlie


Таблица B:
id | city
-----------
1 | New York
3 | Los Angeles
4 | Chicago


🟠INNER JOIN
INNER JOIN возвращает только те строки, которые имеют совпадения в обеих таблицах. Если нет совпадающих строк, такие строки не включаются в результат.
SELECT A.id, A.name, B.city
FROM A
INNER JOIN B ON A.id = B.id;


Результат:
id | name    | city
------------------------
1 | Alice | New York
3 | Charlie | Los Angeles


🟠LEFT JOIN (или LEFT OUTER JOIN)
LEFT JOIN возвращает все строки из левой таблицы (A) и совпадающие строки из правой таблицы (B). Если совпадения не найдено, в результате будут строки из левой таблицы с NULL значениями для столбцов из правой таблицы.
SELECT A.id, A.name, B.city
FROM A
LEFT JOIN B ON A.id = B.id;


Результат:
id | name    | city
------------------------
1 | Alice | New York
2 | Bob | NULL
3 | Charlie | Los Angeles


🟠RIGHT JOIN (или RIGHT OUTER JOIN)
RIGHT JOIN возвращает все строки из правой таблицы (B) и совпадающие строки из левой таблицы (A). Если совпадения не найдено, в результате будут строки из правой таблицы с NULL значениями для столбцов из левой таблицы.
SELECT A.id, A.name, B.city
FROM A
RIGHT JOIN B ON A.id = B.id;


Результат:
id | name    | city
------------------------
1 | Alice | New York
3 | Charlie | Los Angeles
4 | NULL | Chicago


🟠FULL JOIN (или FULL OUTER JOIN)
FULL JOIN возвращает все строки, когда есть совпадение в одной из таблиц. Это объединение LEFT JOIN и RIGHT JOIN. Если совпадения не найдено, результат будет содержать NULL значения для столбцов из другой таблицы.
SELECT A.id, A.name, B.city
FROM A
FULL JOIN B ON A.id = B.id;
id | name | city
------------------------
1 | Alice | New York
2 | Bob | NULL
3 | Charlie | Los Angeles
4 | NULL | Chicago


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что такое полиморфизм?

Это один из фундаментальных принципов объектно-ориентированного программирования (ООП), который позволяет объектам разного типа обрабатывать данные по-разному, используя один и тот же интерфейс. Основная идея полиморфизма заключается в том, что метод или функция могут принимать объекты разных классов и корректно выполнять для них свою работу, не зная их конкретного типа заранее.

🚩Основные виды полиморфизма

🟠Полиморфизм подтипов (ад-хок полиморфизм)
Это форма полиморфизма, при которой функция или метод могут быть применены к аргументам разных типов. В ООП это достигается через наследование и интерфейсы. Классический пример – это использование базового класса или интерфейса, когда конкретная реализация определяется в дочерних классах. Пример: метод draw() может быть определен в интерфейсе Shape, а конкретная реализация этого метода – в классах Circle, Square, Triangle.

🟠Параметрический полиморфизм (универсальный полиморфизм)
Это форма полиморфизма, при которой функции или методы могут работать с любыми типами данных. Обычно это реализуется через использование обобщенных типов (generics). Например, в языке Java или C# можно создать класс или метод, который работает с любым типом данных, используя синтаксис шаблонов (generics).

🟠Полиморфизм времени выполнения (динамический полиморфизм)
Это форма полиморфизма, при которой метод конкретного объекта выбирается во время выполнения программы. Обычно это достигается с помощью виртуальных функций и механизма позднего связывания (late binding). Пример: вызов метода move() у объекта, который может быть как автомобилем, так и самолетом. Виртуальная функция обеспечивает вызов правильной реализации метода в зависимости от реального типа объекта.

🚩Зачем нужен полиморфизм

🟠Упрощение кода и повышение его гибкости
Полиморфизм позволяет писать более общий и абстрактный код. Вместо работы с конкретными типами, программист может работать с более абстрактными интерфейсами или базовыми классами, что упрощает расширение системы и поддержку кода.

🟠Повышение уровня абстракции
Полиморфизм позволяет программистам думать о более высокоуровневых концепциях, не углубляясь в детали реализации конкретных классов. Это делает код более понятным и легким для восприятия.

🟠Поддержка принципа "открытости/закрытости" (Open/Closed Principle)
Полиморфизм помогает следовать этому принципу, который гласит, что "программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для изменения". То есть, для добавления новых функциональностей не нужно изменять существующий код, достаточно создать новый подкласс или реализовать новый интерфейс.

🟠Снижение дублирования кода:
Благодаря полиморфизму, можно избежать дублирования кода, создавая более общие решения и переиспользуя их в разных частях программы.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
Я боялся, что провалю собеседование. Так появился easyoffer

Когда я только начинал искать первую работу программистом, меня пугала мысль, что я просто не смогу ответить на вопросы на собеседовании.

Типа… ты потратил месяцы на то, чтобы учиться, писал pet-проекты, собирал резюме, рассылаешь отклики — и всё может закончиться на одном-единственном вопросе, на который ты не знаешь ответ.

Я реально боялся.
Я смотрел видео mock-собеседований на YouTube, останавливал каждое, выписывал вопросы в Notion. Потом вручную писал к ним ответы. И потом ещё по нескольку раз перечитывал. Такой вот "тренажёр" на коленке.

📎 (там на картинке — один из моих реальных списков в Notion, ставь 🔥 если тоже так делал)

В какой-то момент я посчитал — у меня уже было выписано больше 500 вопросов. Я почувствовал ужас.
Потому что невозможно всё это зазубрить. А что, если спросят как раз тот, к которому я не успел подготовиться?..

Тогда и пришла идея

А что если понять, какие из вопросов встречаются чаще всего? Чтобы не учить всё подряд, а сфокусироваться на главном.

Так родился easyoffer.

Сначала — просто как пет-проект, чтобы показать в резюме и подготовиться к собесам. А потом оказалось, что он реально помогает людям. За первые месяцы его посетили сотни тысяч человек. И я понял: это больше, чем просто пет-проект.

Сейчас я делаю EasyOffer 2.0
И уже не один, а вместе с вами.

В новой версии будут:
– вопросы из реальных собесов, с фильтрацией по грейду, компании, типу интервью
– тренажёр с карточками (по принципу интервальных повторений — как в Anki)
– база задач с интервью
– тренажёр «реальное собеседование», чтобы отрепетировать как в жизни

Каждая фича упрощает и сокращает время на подготовку. Все эти штуки я бы мечтал иметь, когда сам готовился к собеседованиям.

Я делаю всё на свои деньги. Никаких инвесторов. Только вы и я.

Если вы хотите помочь — сейчас самое важное время.
Краудфандинг уже стартовал. Благодаря нему я смогу привлечь больше людей для разработки, сбору и обработки собеседований.

Все, кто поддержат проект до релиза, получат:

🚀 1 год PRO-доступа по цене месячной подписки. Его можно активировать в любое время, например когда начнете готовится к собесам.
Доступ к закрытому бета-тесту

Поддержать 👉 https://planeta.ru/campaigns/easyoffer

Спасибо, что верите в этот проект 🙌
🎉1
🤔 Что такое нормализация баз данных?

Нормализация баз данных - это процесс организации данных в базе данных для минимизации избыточности данных и обеспечения их целостности. Цель нормализации - структурировать таблицы таким образом, чтобы устранить аномалии обновления, вставки и удаления данных. Нормализация достигается путем разбиения больших таблиц на более мелкие, связанных между собой отношениями, что упрощает управление данными и делает их более логически связанными.

🚩Зачем нужна нормализация

🟠Устранение избыточности данных
Нормализация позволяет минимизировать дублирование данных, что экономит пространство и упрощает управление базой данных.
🟠Обеспечение целостности данных
Нормализация помогает поддерживать целостность данных, обеспечивая правильное и единообразное хранение данных.
🟠Упрощение структуры базы данных
Разделение данных на логические таблицы делает структуру базы данных более понятной и удобной для использования.
🟠Избежание аномалий данных
Нормализация предотвращает возникновение аномалий при обновлении, вставке и удалении данных.

🚩Основные формы нормализации

🟠Первая нормальная форма (1NF)
Удаление повторяющихся групп в таблице. Каждый столбец должен содержать только атомарные (неделимые) значения. Все записи в таблице должны быть уникальными.

🟠Вторая нормальная форма (2NF)
Таблица должна быть в 1NF. Удаление частичной функциональной зависимости: каждый неключевой атрибут должен быть полностью зависим от первичного ключа.

🟠Третья нормальная форма (3NF)
Таблица должна быть в 2NF. Удаление транзитивной зависимости: все неключевые атрибуты должны быть напрямую зависимы от первичного ключа, а не от других неключевых атрибутов.

🟠Бойс-Кодд нормальная форма (BCNF)
Усиление 3NF: каждая детерминанта должна быть кандидатом на ключ, что означает, что в любой нетривиальной функциональной зависимости X -> Y, X должно быть суперключом.

🟠Четвертая нормальная форма (4NF)
Таблица должна быть в BCNF. Устранение многозначных зависимостей: таблица не должна содержать многозначных зависимостей, когда один атрибут зависит от нескольких значений другого атрибута.

🟠Пятая нормальная форма (5NF)
Таблица должна быть в 4NF. Устранение соединительных зависимостей: данные должны быть разбиты так, чтобы каждая зависимость сохранялась.

🚩Примеры применения нормализации

🟠Первая нормальная форма
Если у вас есть таблица с повторяющимися группами, такими как несколько телефонных номеров для одного клиента, вы создаете отдельную таблицу для телефонов и связываете ее с таблицей клиентов.

🟠Вторая нормальная форма
Если у вас есть таблица заказов с колонками "номер заказа", "название товара" и "цена товара", вы можете создать отдельные таблицы для заказов и товаров, чтобы цена товара зависела только от товара, а не от комбинации заказа и товара.

🟠Третья нормальная форма
Если у вас есть таблица сотрудников с колонками "идентификатор сотрудника", "название отдела" и "имя начальника отдела", вы можете создать отдельные таблицы для сотрудников и отделов, чтобы имя начальника отдела зависело только от отдела, а не от сотрудника.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какие 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;


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое Web Sockets (веб сокет)?

WebSockets (веб-сокеты) — это коммуникационный протокол, предоставляющий возможность устанавливать постоянное, двустороннее соединение между клиентом (обычно веб-браузером) и сервером через один TCP-соединение. Это позволяет обмениваться данными в реальном времени с минимальной задержкой и без необходимости повторного открытия соединения для каждого обмена сообщениями, как это происходит в традиционных HTTP-соединениях.

🚩Основные характеристики WebSockets:

🟠Двусторонняя коммуникация: WebSockets поддерживают полноценную двустороннюю (или full-duplex) коммуникацию, что позволяет как клиенту, так и серверу отправлять данные в любое время без необходимости инициирования запроса.
🟠Постоянное соединение: После установления WebSocket-соединение остается открытым, что значительно уменьшает задержки, связанные с установлением новых соединений, характерных для HTTP-запросов.
🟠Меньший накладной расход: WebSockets используют меньше заголовков по сравнению с HTTP-запросами, что делает передачу данных более эффективной и менее затратной по времени и ресурсам.
🟠Протокол: WebSocket протокол стандартизирован в RFC 6455 и поддерживается большинством современных веб-браузеров. Соединение начинается с обычного HTTP-запроса, который затем "обновляется" до WebSocket-соединения через HTTP-заголовок Upgrade.

🚩Как работает WebSocket:

🟠Установление соединения: Клиент отправляет HTTP-запрос с заголовком Upgrade: websocket на сервер, указывая на желание перейти к протоколу WebSocket. Сервер отвечает подтверждением, если поддерживает WebSockets, и соединение устанавливается.
🟠Передача данных: После установления соединения клиент и сервер могут обмениваться данными в обе стороны по мере необходимости. Сообщения передаются как фреймы (frames), которые могут содержать текстовые или бинарные данные.
🟠Закрытие соединения: Соединение может быть закрыто любой стороной в любой момент времени с отправкой соответствующего фрейма закрытия.

🚩Применения WebSocket:

🟠Реальное время: Приложения, требующие обновлений в реальном времени, такие как чаты, системы обмена сообщениями, онлайн-игры, торги на биржах.
🟠Потоковая передача данных: Веб-сокеты идеально подходят для приложений, передающих данные в реальном времени, таких как спортивные трансляции или финансовые данные.
🟠Уведомления и оповещения: Приложения, отправляющие мгновенные уведомления пользователям, например, социальные сети или системы мониторинга.
🟠Коллаборативные инструменты: Инструменты для совместной работы, такие как совместное редактирование документов или доски с заметками.

Преимущества WebSocket:
🟠Эффективность: Меньший накладной расход и постоянное соединение делают WebSockets более эффективными для приложений, требующих частого обмена данными.
🟠Скорость: WebSockets обеспечивают более низкую задержку, что делает их идеальными для приложений, работающих в реальном времени.
🟠Простота использования: WebSockets имеют простой API, который легко интегрируется с современными веб-приложениями.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1