Заголовки в языках и разметки часто используются для указания ключевой информации, на которую стоит обратить внимание, и они различаются в зависимости от конкретного контекста и языка. Ниже приведены примеры синтаксиса заголовков в различных контекстах:
Поддерживает шесть уровней заголовков, от
<h1> до <h6>, где <h1> представляет самый важный заголовок, а <h6> — наименее важный.<h1>Заголовок уровня 1</h1>
<h2>Заголовок уровня 2</h2>
<h3>Заголовок уровня 3</h3>
<h4>Заголовок уровня 4</h4>
<h5>Заголовок уровня 5</h5>
<h6>Заголовок уровня 6</h6>
Это язык разметки, который упрощает форматирование текста, особенно для написания документации. Заголовки создаются с помощью символа
# перед текстом заголовка. Количество символов # определяет уровень заголовка.# Заголовок уровня 1
## Заголовок уровня 2
### Заголовок уровня 3
#### Заголовок уровня 4
##### Заголовок уровня 5
###### Заголовок уровня 6
Это система подготовки документов, широко используемая для научных и технических документов. В LaTeX заголовки создаются с помощью команд
\section, \subsection, \subsubsection и так далее.\section{Заголовок уровня 1}
\subsection{Заголовок уровня 2}
\subsubsection{Заголовок уровня 3}
\paragraph{Заголовок уровня 4}
\subparagraph{Заголовок уровня 5}Многие вики-движки (например, MediaWiki) используют свои синтаксисы для создания заголовков. В MediaWiki заголовки создаются с помощью равно (
=) вокруг текста заголовка.= Заголовок уровня 1 =
== Заголовок уровня 2 ==
=== Заголовок уровня 3 ===
==== Заголовок уровня 4 ====
===== Заголовок уровня 5 =====
====== Заголовок уровня 6 ======
Часто не используются так же, как в разметке, но комментарии могут выполнять схожую роль для организации и документирования кода. Примеры синтаксиса для комментариев-заголовков:
Python
# Заголовок уровня 1
## Заголовок уровня 2
### Заголовок уровня 3
JavaScript
// Заголовок уровня 1
// =================
// Заголовок уровня 2
// -----------------
// Заголовок уровня 3
// ~~~~~~~~~~~~~~~~~
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это принцип построения ПО, который отделяет бизнес-логику от деталей реализации.
Ключевые принципы:
- Разделение слоев – отделение логики от UI и базы данных.
- Независимость от фреймворков – можно менять базу данных или API без переписывания логики.
- Устойчивость к изменениям – легче поддерживать и тестировать код.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
При развёртывании приложения в Docker важно минимизировать время сборки и оптимизировать слои контейнера.
Не копировать лишние файлы в контейнер (например,
node_modules, .git, vendor, .env). .git
node_modules
vendor
.env
*.log
Плохо (лишние слои, без кэширования)
FROM php:8.2-cli
WORKDIR /app
COPY . . # Копирует ВСЕ файлы (долго и некэшируемо)
RUN composer install
RUN npm install
RUN npm run build
Хорошо (разделение слоёв, кэширование)
FROM php:8.2-cli
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist # Используем кэширование слоёв
COPY package.json package-lock.json ./
RUN npm install --only=production && npm cache clean --force
COPY . . # Копируем код ПОСЛЕ установки зависимостей (чтобы кэширование работало)
RUN npm run build
Позволяет уменьшить размер конечного образа, убрав ненужные файлы и инструменты.
# 1-й этап: сборка зависимостей (Node.js)
FROM node:18 as frontend
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build
# 2-й этап: финальный образ
FROM php:8.2-cli
WORKDIR /app
COPY --from=frontend /app/dist /app/public # Берём только готовые файлы
COPY . .
CMD ["php", "artisan", "serve", "--host=0.0.0.0"]
Позволяет использовать кеш из предыдущих сборок.
docker build --cache-from=myapp:latest -t myapp .
Перенести volume для
vendor и node_modules на хост, чтобы не скачивать их в контейнере. services:
app:
build: .
volumes:
- .:/app
- /app/vendor # Чтобы composer install не запускался каждый раз
- /app/node_modules # Чтобы npm install не замедлял перезапуск
Alpine – лёгкая версия Linux (~5 MB), подходит для PHP, Nginx, Node.js.
FROM php:8.2-fpm-alpine
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Это паттерн проектирования, который используется для абстрагирования процесса поиска и предоставления зависимостей объектам. Вместо того чтобы объекты сами создавали свои зависимости или получали их через конструкторы, они запрашивают их у специального объекта – локатора сервисов.
Все зависимости находятся в одном месте, что упрощает их управление и замену.
Легко менять конкретные реализации зависимостей без изменения клиентского кода.
Все зависимости зарегистрированы и управляются в одном месте.
Легко подменять зависимости на моки для проведения тестов.
Паттерн Service Locator может быть реализован через создание централизованного реестра, который хранит информацию о различных сервисах и предоставляет их по запросу.
interface Logger {
public function log($message);
}
interface PaymentProcessor {
public function processPayment($amount);
}class FileLogger implements Logger {
public function log($message) {
echo "Logging message to a file: $message";
}
}
class StripePaymentProcessor implements PaymentProcessor {
public function processPayment($amount) {
echo "Processing payment of $amount through Stripe";
}
}class ServiceLocator {
private $services = [];
public function register($serviceName, $service) {
$this->services[$serviceName] = $service;
}
public function get($serviceName) {
if (!isset($this->services[$serviceName])) {
throw new Exception("Service not found: " . $serviceName);
}
return $this->services[$serviceName];
}
}$serviceLocator = new ServiceLocator();
// Регистрация сервисов
$serviceLocator->register('logger', new FileLogger());
$serviceLocator->register('paymentProcessor', new StripePaymentProcessor());
// Использование сервисов
$logger = $serviceLocator->get('logger');
$logger->log("This is a log message."); // Вывод: Logging message to a file: This is a log message.
$paymentProcessor = $serviceLocator->get('paymentProcessor');
$paymentProcessor->processPayment(100); // Вывод: Processing payment of 100 through Stripe
Все зависимости хранятся и управляются в одном месте.
Легко изменять зависимости без изменения кода, который их использует.
Легко подменять реальные зависимости на моки для тестирования.
Зависимости не видны явно в коде, что может усложнить понимание.
Может привести к более сложной архитектуре, особенно в больших приложениях.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Выбор между Symfony, Laravel и Yii зависит от множества факторов: сложности проекта, требований к производительности, удобства работы, документации и экосистемы. Давайте разберём, почему Symfony может быть предпочтительным вариантом.
Symfony не монолитный, он построен на компонентах, которые можно использовать по отдельности.
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
$routes = new RouteCollection();
$routes->add('home', new Route('/home'));
Symfony изначально создавался с акцентом на производительность и расширяемость.
Symfony следует чистой архитектуре SOLID и DDD (Domain-Driven Design).
Что это даёт
Чистый код (меньше "магии", как в Laravel).
Удобное тестирование (
Mock объектов, KernelTestCase). Поддержка CQRS, Event-Driven, Hexagonal Architecture.
class UserService {
private UserRepository $repo;
public function __construct(UserRepository $repo) {
$this->repo = $repo;
}
public function createUser(string $email): User {
return $this->repo->save(new User($email));
}
}Symfony часто используется в крупных проектах и государственных системах.
Symfony поддерживается разработчиками из SensioLabs и сообществом Symfony.
Laravel больше зависит от одного разработчика (Taylor Otwell).
Yii меньше поддерживается и отстаёт в развитии.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🤔2👍1
1. Оно позволяет использовать внешние переменные даже после завершения их контекста.
2. Замыкания полезны для сохранения состояния и создания функций с заранее заданными параметрами.
3. Пример: функция, возвращающая другую функцию, которая использует переменные из замыкающего контекста.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Они помогают писать чистый, понятный и эффективный код.
Смысл: Избегайте дублирования кода, выносите повторяющуюся логику в функции, классы или модули.
Улучшает читаемость кода.
Упрощает поддержку: изменили код в одном месте – обновилось везде.
Исключает ошибки при дублировании кода.
Плохо (нарушение DRY)
// Дублирование кода для расчёта скидки
$price1 = 100;
$discount1 = $price1 * 0.1;
$price2 = 200;
$discount2 = $price2 * 0.1;
$price3 = 300;
$discount3 = $price3 * 0.1;
Хорошо (принцип DRY)
function calculateDiscount($price) {
return $price * 0.1;
}
$discount1 = calculateDiscount(100);
$discount2 = calculateDiscount(200);
$discount3 = calculateDiscount(300);Смысл: Не усложняйте код, он должен быть простым и понятным.
Код легче понимать и исправлять.
Простота = меньше ошибок.
Улучшает производительность (сложные конструкции могут замедлять код).
Плохо (нарушение KISS)
function isEven($num) {
if ($num % 2 == 0) {
return true;
} else {
return false;
}
}Хорошо (KISS)
function isEven($num) {
return $num % 2 == 0;
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Агрегатные функции в контексте управления базами данных и SQL — это специальные функции, которые выполняют вычисление над набором значений и возвращают единственный результат. Они часто используются для выполнения математических, статистических и других операций с данными в запросах для анализа и обобщения информации из множества записей.
Подсчитывает количество элементов в наборе. Эта функция может использоваться для подсчета количества строк в таблице или количества строк, соответствующих определенным критериям.
Пример:
SELECT COUNT(*) FROM users; — подсчитывает количество всех строк в таблице users.Суммирует числовые значения столбца. Используется для получения общей суммы числовых данных.
Пример:
SELECT SUM(salary) FROM employees; — считает общую сумму зарплат всех сотрудников.Вычисляет среднее значение числовых данных. Эта функция полезна для нахождения среднего значения определенного столбца.
Пример:
SELECT AVG(price) FROM products; — рассчитывает среднюю цену продукта.Возвращают минимальное и максимальное значения в столбце соответственно. Эти функции используются для нахождения наименьших и наибольших значений.
Пример:
SELECT MIN(age), MAX(age) FROM users; — находит минимальный и максимальный возраст среди пользователей.Склеивают строки из столбца, объединяя их в одну строку с разделителем. Пример (MySQL):
SELECT GROUP_CONCAT(username SEPARATOR ', ') FROM users WHERE city = 'New York'; — объединяет имена пользователей из Нью-Йорка через запятую.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2. Удобство обмена: не требуется передавать секретный ключ для шифрования.
3. Поддержка цифровой подписи: позволяет проверять подлинность отправителя.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
В Laravel связи между моделями реализуются через Eloquent ORM. Eloquent предоставляет удобные методы для работы с отношениями (relations) между таблицами в базе данных.
Каждая модель
User имеет один Profile. class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}
В модели
Profileclass Profile extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
Теперь можно получить профиль пользователя так
$user = User::find(1);
$profile = $user->profile; // Получаем профиль пользователя
Каждый
Post может иметь много Comment. В модели
Postclass Post extends Model
{
public function comments()
{
return $this->hasMany(Comment::class);
}
}
В модели
Commentclass Comment extends Model
{
public function post()
{
return $this->belongsTo(Post::class);
}
}
Теперь можно получить все комментарии к посту:
$post = Post::find(1);
$comments = $post->comments; // Коллекция комментариев
Каждый
User может подписаться на несколько Role, и наоборот. В Laravel для связи многие ко многим нужна промежуточная таблица
role_user (название должно быть singular_singular в алфавитном порядке). В модели
Userclass User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
В модели
Roleclass Role extends Model
{
public function users()
{
return $this->belongsToMany(User::class);
}
}
Теперь можно получить роли пользователя:
$user = User::find(1);
$roles = $user->roles;
Добавить роль:
$user->roles()->attach($roleId);
Удалить роль
$user->roles()->detach($roleId);
Синхронизировать (удалить старые и добавить новые):
$user->roles()->sync([1, 2, 3]);
Например, у нас есть
Country, User, Post. Мы хотим получить все посты в стране. class Country extends Model
{
public function posts()
{
return $this->hasManyThrough(Post::class, User::class);
}
}
Теперь можно получить все посты страны
$country = Country::find(1);
$posts = $country->posts;
Позволяет разным моделям использовать одну таблицу для хранения данных.
Пример: у нас есть
Post и Video, к которым могут быть Comment В модели
Commentclass Comment extends Model
{
public function commentable()
{
return $this->morphTo();
}
}
В модели
Postclass Post extends Model
{
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
В модели
Videoclass Video extends Model
{
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
Использование
$post = Post::find(1);
$post->comments()->create(['content' => 'Отличный пост!']);
$video = Video::find(1);
$video->comments()->create(['content' => 'Крутое видео!']);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Проектирование базы данных – это ключевой этап в создании любой системы, где хранятся данные. Если БД спроектирована плохо, это приведёт к медленной работе, избыточности данных и сложным обновлениям.
Сначала нужно понять, какие данные будут храниться и как они связаны.
Какие объекты будут в системе? (например, пользователи, заказы, товары).
Как они связаны друг с другом? (например, один пользователь может делать много заказов).
Какие поля нужны в каждой таблице? (например,
email, password, created_at). - Какие запросы будут выполняться чаще всего?
Пример: интернет-магазин
Пользователи (
users) Товары (
products) Заказы (
orders) Связь между заказами и товарами (
order_items) Разделяем данные по таблицам и определяем связи (1-к-1, 1-к-N, N-к-N).
Связи между таблицами:
1-к-1 → один профиль = один пользователь (
users → user_profiles). 1-к-N → один пользователь = много заказов (
users → orders). N-к-N → один заказ = много товаров, и один товар может быть в разных заказах (
orders ↔️ products). Users (id) --- (1:N) --- Orders (id, user_id) --- (N:M) --- Order_Items (order_id, product_id, quantity)
Products (id)
SQL-создание таблиц
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(255) UNIQUE,
password VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
price DECIMAL(10,2),
stock INT
);
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Динамическая типизация позволяет переменной менять тип во время выполнения программы. Тип определяется автоматически на основе присвоенного значения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Значение регистра заголовков может варьироваться в зависимости от конкретного контекста или системы разметки, в которой используются заголовки. Рассмотрим несколько примеров, чтобы понять, как различные системы относятся к регистру заголовков.
Регистр заголовков не имеет значения. Теги HTML не чувствительны к регистру, поэтому
<H1>Заголовок</H1> и <h1>Заголовок</h1> будут интерпретироваться одинаково.<h1>Заголовок</h1>
<H1>Заголовок</H1>
Регистр заголовков также не имеет значения для самой разметки, но обычно принято использовать заглавные буквы для первых букв слов в заголовках, чтобы улучшить читаемость.
# Заголовок
# заголовок
Регистр заголовков тоже не имеет значения с точки зрения разметки, но стандартной практикой является использование заглавных букв в начале каждого важного слова для улучшения читаемости.
\section{Заголовок}
\section{заголовок}Регистр заголовков не влияет на разметку, но для консистентности и лучшей читаемости заголовки часто оформляют с заглавными буквами
= Заголовок =
= заголовок =
Как таковые не используются, но комментарии-заголовки могут быть оформлены по-разному. Регистр здесь также не имеет значения для компилятора или интерпретатора, но для людей, читающих код, использование заглавных букв может сделать заголовки более заметными
# ЗАГОЛОВОК УРОВНЯ 1
# заголовок уровня 1
Оба варианта являются допустимыми комментариями
// ЗАГОЛОВОК УРОВНЯ 1
// заголовок уровня 1
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Кодирование обеспечивает:
1. Совместимость: преобразование данных в формат, который можно безопасно передавать или хранить.
2. Эффективность передачи: упрощение работы с различными системами и протоколами.
3. Защиту от ошибок: предотвращение искажений данных при передаче через сети.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Функции
unset() и unlink() в PHP выполняют совершенно разные задачи, несмотря на похожие названия. unset() удаляет переменную из области видимости, но не освобождает память сразу. $a = "Привет, мир!";
unset($a);
echo $a; // Ошибка: переменная не существует
unlink() удаляет файл с диска. $file = "example.txt";
if (file_exists($file)) {
unlink($file); // Удаляет файл
echo "Файл удалён";
} else {
echo "Файл не найден";
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
ELT (Extract, Load, Transform) – это процесс обработки данных, используемый в аналитике:
- Extract (Извлечение) – загрузка данных из источников (БД, API).
- Load (Загрузка) – сохранение данных в хранилище (например, в Data Warehouse).
- Transform (Преобразование) – очистка, фильтрация, агрегация данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
В SQL, когда мы используем
AVG(), мы рассчитываем среднее значение по множеству строк. Но WHERE фильтрует отдельные строки, а не группы данных. Проблема
SELECT * FROM products WHERE AVG(price) > 100; -- ❌ Ошибка!
Использовать
HAVING вместо WHERE (если есть GROUP BY) SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
HAVING AVG(price) > 100;
Использовать подзапрос (
SUBQUERY) в WHERE SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1💊1