Computer Science
8.03K subscribers
1 photo
16 links
По всем вопросам: @altmainf

Уважаемый менеджер: @altaiface
Download Telegram
Штрих-коды — универсальный способ представления данных о товарах с помощью черных и белых полос.

Основные стандарты, такие как UPC (Universal Product Code) и EAN (European Article Number), позволяют однозначно идентифицировать продукт. Когда штрих-код сканируется, лазерный сканер считывает отражение света, преобразуя его в последовательность нулей и единиц. Эти данные отправляются в базу, где происходит сопоставление с информацией о товаре, такой как цена и описание.

Стандарты штрих-кодов различаются по формату, области применения и количеству закодированной информации. UPC, например, используется в основном в США и Канаде и состоит из 12 цифр, в то время как EAN, более распространенный в Европе, может иметь 13 цифр. ISBN (International Standard Book Number) применяется для книг и имеет уникальный формат. QR-коды, хотя и не являются традиционными штрих-кодами, могут содержать гораздо больше данных, включая ссылки и текст.
Что такое RegExp?

Regular expression, регулярные выражения или регулярки — это механизм для поиска и замены текста. В строке, файле или нескольких файлах. Их используют разработчики в коде приложения, тестировщики в автотестах, да и просто при работе в командной строке.

Они удобны тем, что позволяют создать шаблон для поиска.

Метасимволы:
. — соответствует любому одному символу
[ ] — соответствует одному символу из содержащихся в квадратных скобках
^ — соответствует началу строки
$ — соответствует концу строки
*— соответствует 0 или более предыдущих элементов
? — соответствует 0 или одному предыдущему элементу
+ — означает, что предшествующий символ присутствует и может повторяться несколько раз
{ } — кол-во повторений предыдущего символа
Принципы SOLID в ООП

SOLID — это акроним, обозначающий 5 ключевых принципов проектирования ПО в ООП. Они помогают создавать гибкий, поддерживаемый и расширяемый код. Принципы были сформулированы Робертом Мартином (Uncle Bob). Каждый принцип решает конкретные проблемы в архитектуре классов и модулей.

1. Single Responsibility Principle (SRP) — Принцип единственной ответственности
Суть: Каждый класс должен иметь только одну причину для изменения, то есть выполнять только одну задачу. Это предотвращает "божественные" классы, которые делают всё и ломаются при малейших изменениях.
Пример: Класс User должен только хранить данные пользователя (имя, email), а не отправлять письма. Для отправки создайте отдельный класс EmailService.
• Нарушение: Класс, который и сохраняет пользователя в БД, и логирует, и отправляет уведомления — изменение логики ломает всё.
• Преимущества: Легче тестировать, поддерживать и переиспользовать.

2. Open-Closed Principle (OCP) — Принцип открытости-закрытости
• Суть: Классы должны быть открыты для расширения, но закрыты для модификации. Добавляйте новую функциональность через наследование или интерфейсы, а не меняя существующий код.
• Пример: Интерфейс Shape с методом area(). Классы Circle и Rectangle реализуют его. Для нового Triangle просто добавьте класс, не трогая старые.
• Нарушение: Если в классе Calculator добавить новый тип операции прямо в код, это модификация.
• Преимущества: Минимизирует риски багов в существующем коде.

3. Liskov Substitution Principle (LSP) — Принцип подстановки Барбары Лисков
• Суть: Объекты подклассов должны быть взаимозаменяемы с объектами базового класса без нарушения корректности программы. Дочерний класс не должен ломать ожидания от родителя.
• Пример: Класс Bird с методом fly(). Подкласс Penguin не должен наследовать fly(), если пингвины не летают — лучше использовать композицию или интерфейсы.
• Нарушение: Подкласс бросает исключение в методе родителя, ломая полиморфизм.
• Преимущества: Обеспечивает правильное наследование и полиморфизм.

4. Interface Segregation Principle (ISP) — Принцип разделения интерфейсов
• Суть: Клиенты не должны зависеть от интерфейсов, которые они не используют. Разделяйте жирные интерфейсы на мелкие, специфичные.
• Пример:
Вместо одного интерфейса Worker с work() и eat(), создайте Workable и Eatable. Робот реализует только Workable.
• Нарушение: Класс, реализующий интерфейс с 10 методами, но использующий только 2, вынужден реализовывать пустышки.
• Преимущества: Уменьшает связанность и упрощает код.

5. Dependency Inversion Principle (DIP) — Принцип инверсии зависимостей
• Суть: Зависимости должны строиться на абстракциях, а не на конкретных классах. Модули верхнего уровня не должны зависеть от нижних; оба зависят от абстракций.
• Пример: Класс OrderService зависит от интерфейса PaymentProcessor, а не от конкретного PayPalProcessor. Легко заменить на StripeProcessor.
• Нарушение: Прямое создание объектов (new PayPal()) в классе.
• Преимущества: Увеличивает гибкость, облегчает тестирование (mock'и) и инверсию контроля (IoC-контейнеры).
Главная загрузочная запись (MBR)

Нулевой сектор физического жёсткого диска содержит так называемую главную загрузочную запись (MBR — Master Boot Record). При начальной загрузке компьютера с жёсткого диска BIOS считывает этот сектор в оперативную память и передаёт управление содержащемуся в нём коду начального загрузчика.

MBR логически можно разделить на три области: код начального загрузчика, таблицу разделов и сигнатуру — слово со значением AA55h, занимающее последние два байта MBR. BIOS проверяет сигнатуру, чтобы убедиться в корректности MBR; если сигнатура не равна указанному значению, загрузка не выполнения и выдаётся сообщение об ошибке. 

Начальный загрузчик, находящийся в MBR, в общем случае определяет, какой из разделов диска является активным, загружает в память первый сектор этого раздела и передаёт ему управление.
EXE (Windows Executable)

Структура:
• DOS Header: Первые 64 байта, служат для обратной совместимости с DOS. Содержит метку "MZ".
• PE Header: Заголовок Portable Executable, содержащий информацию о типе файла, секциях, размерах, точках входа и т. д.
• Секции:
.text: Код программы.
.data: Глобальные и статические переменные.
.rsrc: Ресурсы, такие как изображения и строки.
• Import Table: Содержит список используемых внешних функций и библиотек.

Использование:
• EXE файлы запускаются через двойной щелчок или через командную строку Windows.
• Поддерживает графические интерфейсы и консольные приложения.


ELF (Executable and Linkable Format)

Структура:
• ELF Header: Содержит информацию о типе файла (исполняемый, объектный и т. д.), архитектуре, размере заголовка и других метаданных.
• Program Header Table: Описывает сегменты, которые будут загружены в память.
• Section Header Table: Описывает секции файла (например, .text, .data, .bss и другие).
• Секции:
.text: Код программы.
.data: Инициализированные данные.
.bss: Неинициализированные данные.
.dynamic: Динамическая информация для линковщиков.

Использование:
• ELF файлы запускаются через терминал в UNIX-подобных системах или через графические оболочки.
• Поддерживает динамическую линковку, позволяя использовать библиотеки во время выполнения.

Ключевые различия:

• EXE предназначен для Windows, ELF — для Linux и других UNIX-подобных систем.
• ELF более модульный и гибкий, поддерживает динамическую линковку и различные типы секций.
• ELF включает больше информации о типах данных и секциях, что упрощает работу компиляторов и отладчиков.
Wi-Fi обычно работает на двух основных частотах: 2.4 ГГц и 5 ГГц.

• 2.4 ГГц
Преимущества: Лучшее покрытие и большая дальность действия.
Недостатки: Более загруженная частота, подвержена помехам от других устройств (например, микроволновок, беспроводных телефонов).

• 5 ГГц
Преимущества: Более высокая скорость передачи данных и меньшее количество помех.
Недостатки: Меньшее покрытие и более слабое проникновение через стены.

Соответственно, если нужна скорость, лучше выбрать 5 ГГц, а для большого покрытия — 2.4 ГГц.
Топологии сетей на реальных примерах

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

2. Кольцевая топология - узлы сети соединены в кольцо, где данные передаются последовательно через каждое устройство. Примером может быть локальная сеть на базе технологии Token Ring.

3. Шина - это тип топологии, где все узлы сети подключены к одной основной кабельной линии. Примером может быть Ethernet сеть, где все компьютеры подключены к одному коммутатору через один кабель.

4. Древовидная топология - узлы сети организованы в иерархию, где некоторые узлы являются подчиненными другим. Примером может быть корпоративная сеть, где филиалы компании подключены к центральному офису.

5. Сеть с полной (полукольцевой) связностью - это тип топологии, где каждый узел сети имеет прямое подключение ко всем остальным узлам. Примером может быть машинный парк, где все компьютеры между собой связаны.

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

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

Основные понятия:
Граф: Сеть представляется в виде направленного графа, где узлы — это точки, а рёбра — это связи между ними с заданными пропускными способностями.
Поток: Это количество "ресурса" (например, воды, информации), передаваемого от источника к стоку через сеть.
Пропускная способность: Максимальное количество потока, которое может проходить через ребро.

Основные алгоритмы:
Алгоритм Форда-Фалкерсона: Базовый алгоритм, который использует метод увеличивающих путей. На каждой итерации ищется путь от источника к стоку, по которому можно увеличить поток.
Алгоритм Эдмондса-Карпа: Это улучшенная версия алгоритма Форда-Фалкерсона, использующая поиск в ширину (BFS) для нахождения увеличивающих путей, что обеспечивает полиномиальную временную сложность.
Алгоритм Линка: Использует метод "потока по потоку" и подходит для больших и сложных сетей.

Применение:
Логистика: Оптимизация транспортировки товаров.
Телекоммуникации: Управление пропускной способностью сетей.
Электросети: Оптимизация распределения электроэнергии.

Пример задачи:
Предположим, у вас есть сеть с 4 узлами: A (источник), B, C и D (сток). Рёбра между узлами имеют следующие пропускные способности:
A → B: 3
A → C: 2
B → D: 2
C → D: 3
Необходимо определить максимальный поток из A в D.

Решение может быть найдено с использованием одного из алгоритмов, например, алгоритма Эдмондса-Карпа.
Делегирование домена 

Делегированием домена — передача корневым сервером зоны права размещения домена на определенном NS-сервере

Для примера, корневые сервера делегируют зону .COM на серверы, которые будут за нее отвечать, а серверы зоны .COM делегируют домен MYDOMAIN.COM на NS-сервера хостинг-провайдера или на какие-либо другие. 

Само делегирование означает, что на корневом сервере для домена присутствуют записи IN NS, указывающие на NS-сервер, на котором размещена информация по домену. 

Делегирование предполагает наличие только записей IN NS и никаких других. Поэтому домену второго уровня нельзя прописать, к примеру, запись CNAME.
Наиболее распространенные типы баз данных:

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

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

3. Сетевые базы данных: данные в них организованы в виде графа, где каждая запись может иметь несколько родителей и дочерних элементов.

4. Объектно-ориентированные базы данных: позволяют хранить объекты и их свойства, а также взаимосвязи и наследование между объектами.

5. XML базы данных: хранят данные в формате XML, что упрощает работу с структурированными данными.

6. NoSQL базы данных: этот тип баз данных не использует классическую модель таблиц и SQL для работы с данными. Вместо этого, данные хранятся в гибких и масштабируемых структурах. Некоторые подтипы NoSQL баз данных включают документоориентированные, столбцовые, графовые и ключ-значение базы данных.

7. Распределенные базы данных: данные в таких базах разделены на несколько физических узлов или серверов, что позволяет распределить нагрузку и обеспечить высокую доступность.

8. Ин-мемори базы данных: данные хранятся и обрабатываются в оперативной памяти компьютера, что позволяет получить высокую скорость доступа и обработки данных.
Принципы работы кеша:

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

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

Замена данных: Когда кеш заполняется, требуется освободить место для новых данных. Алгоритмы замены определяют, какие данные вытеснить для освобождения места.

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

1. По уровню проверки (Validation Level)

• DV (Domain Validation)
- Проверка: только право владения доменом (через e-mail, DNS-запись или файл на сервере).
- Срок выпуска: несколько минут.
- Назначение: для блогов, личных сайтов, тестовых проектов.
- Пример: https://myblog.com
- В адресной строке: только замок (без названия организации).
Плюсы: быстро, дешево.
Минусы: минимальная доверенность (проверяется только домен).

• OV (Organization Validation)
- Проверка: владелец домена и организация (через официальные документы).
- Срок выпуска: 1–3 дня.
- Назначение: корпоративные сайты, интернет-магазины.
- В адресной строке: замок + информация о компании в сертификате.
Плюсы: повышенное доверие.
Минусы: дольше оформление, дороже.

• EV (Extended Validation)
- Проверка: самая строгая — юридический статус, адрес, контактные данные.
- Срок выпуска: 3–7 дней.
- Назначение: банки, крупные компании, госорганы.
- В адресной строке: раньше показывало название компании рядом с замком (в современных браузерах убрали, но в сертификате данные остаются).
Плюсы: максимальное доверие.
Минусы: дорогой и долго оформляется.

2. По количеству защищаемых доменов

• Single Domain SSL

- Защищает только один домен, например:
example.com
(иногда вместе с www.example.com)

Wildcard SSL
- Защищает домен и все его поддомены.
*.example.com
(включая mail.example.com, shop.example.com, и т.д.)
Плюсы: удобно и экономно при множестве поддоменов.
Минусы: не защищает другие домены.

• Multi-Domain (SAN / UCC SSL)
- Защищает несколько разных доменов в одном сертификате.
example.com, example.net, myshop.org
Плюсы: удобно для компаний с несколькими сайтами.
Минусы: дороже, сложнее управлять.

3. По назначению

• Code Signing SSL — для подписания программного кода (а не сайтов).
• Email (S/MIME) — для шифрования и подписи электронной почты.
• Client Authentication — для идентификации пользователей при входе в систему.
• Document Signing — для электронной подписи документов.
Сравнение файловых систем

Файловая система - это метод организации и хранения данных на запоминающем устройстве. Существует множество различных файловых систем, каждая со своими преимуществами и недостатками.

Основные типы файловых систем:

• FAT (File Allocation Table) - простая и распространенная файловая система, используемая в ранних версиях Windows и на съемных носителях.
• NTFS (New Technology File System) - более современная файловая система, используемая в современных версиях Windows. Поддерживает большие файлы и тома, а также расширенные атрибуты и безопасность.
• ext4 - файловая система, используемая в Linux. Известна своей надежностью, производительностью и поддержкой больших файлов.
• XFS - еще одна файловая система, используемая в Linux. Оптимизирована для больших файлов и высокой производительности.
• ZFS - файловая система с открытым исходным кодом, известная своей надежностью, поддержкой больших объемов данных и расширенными функциями управления данными.

Выбор файловой системы:

- Для съемных носителей (например, USB-накопителей) подойдет FAT.
- Для настольных компьютеров и ноутбуков с Windows рекомендуется использовать NTFS.
- Для серверов и рабочих станций Linux с большими объемами данных подойдут ext4 или XFS.
- Для приложений, требующих высокой надежности и расширенных функций управления данными, рекомендуется использовать ZFS.
DevSecOps — интеграция практик безопасности в процесс разработки программного обеспечения и операционных процессов, который часто используется в рамках подхода DevOps. Термин состоит из трех частей:

Dev — разработка (Development)
Sec — безопасность (Security)
Ops — операционные процессы (Operations)

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

Основные принципы DevSecOps:

• Интеграция безопасности с самого начала: Вместо того чтобы "добавлять" безопасность в конце процесса разработки, её рассматривают как неотъемлемую часть всего жизненного цикла разработки.

• Автоматизация процессов безопасности: Использование инструментов для автоматического тестирования и проверки кода на наличие уязвимостей.

• Обратная связь в реальном времени: Разработчики получают уведомления о потенциальных проблемах безопасности во время написания и тестирования кода, что позволяет быстро их устранять.

• Совместная работа команд: DevSecOps способствует тесному взаимодействию между командами разработчиков, специалистов по безопасности и операционными командами для обеспечения качественного и безопасного ПО.

• Постоянная защита и мониторинг: Мониторинг безопасности осуществляется на всех этапах разработки и эксплуатации.
x86

• Происхождение: Разработана Intel в конце 1970-х годов.
• Особенности:
- CISC (Complex Instruction Set Computing) архитектура, что означает наличие большого набора сложных инструкций.
- Широко используется в настольных компьютерах, ноутбуках и серверах.
- Обеспечивает высокую производительность и совместимость с большим количеством программного обеспечения.
• Производители: Intel, AMD.

ARM
• Происхождение: Разработана компанией ARM Holdings в 1980-х годах.
• Особенности:
- RISC (Reduced Instruction Set Computing) архитектура, что предполагает упрощенный набор инструкций для повышения эффективности.
- Энергоэффективность, что делает её популярной в мобильных устройствах, таких как смартфоны и планшеты.
- Лицензируется другим компаниям, что позволяет широкое разнообразие реализаций.
• Производители: Qualcomm, Apple, Samsung и другие.

RISC-V
• Происхождение: Разработана в Калифорнийском университете в Беркли в 2010-х годах.
• Особенности:
- Открытая и свободная RISC архитектура, что позволяет любому использовать и модифицировать её без лицензионных отчислений.
- Высокая гибкость и возможность настройки под конкретные задачи.
- Быстро набирает популярность в научных и промышленных кругах благодаря своей открытости.
• Производители: SiFive, Western Digital и другие.
Помимо x86, ARM и RISC-V, существуют и другие архитектуры процессоров, каждая из которых имеет свои особенности и области применения:

MIPS
• Происхождение: Разработана в 1980-х годах в Стэнфордском университете.
• Особенности:
- RISC-архитектура.
- Используется в встраиваемых системах и сетевом оборудовании.
• Применение: Роутеры, игровые консоли.

PowerPC
• Происхождение: Разработана совместно IBM, Apple и Motorola в 1990-х годах.
• Особенности:
- RISC-архитектура.
- Использовалась в компьютерах Apple до перехода на Intel.
• Применение: Серверы, встраиваемые системы.

SPARC
• Происхождение: Разработана Sun Microsystems в 1980-х годах.
• Особенности:
- RISC-архитектура.
- Используется в серверах и высокопроизводительных вычислениях.
• Применение: Серверы, рабочие станции.

Itanium
• Происхождение: Разработана Intel и Hewlett-Packard.
• Особенности:
- Архитектура IA-64.
- Предназначена для серверов и рабочих станций.
• Применение: Высокопроизводительные серверы (хотя сейчас менее популярна).

Z/Architecture
• Происхождение: Разработана IBM.
• Особенности:
- Используется в мейнфреймах.
- Поддерживает высокую надежность и масштабируемость.
• Применение: Банковские системы, крупные корпоративные сети.
Если вы работаете с Qt на C++, вы наверняка видели файлы с расширением .ui

Что такое .ui файл?

.ui — файл интерфейса пользователя, создаваемый в Qt Designer.
Он описывает все виджеты (кнопки, поля ввода, метки, окна), их свойства и макеты в формате XML.

Пример содержимого .ui файла:

<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Нажми меня</string>
</property>
</widget>
</widget>
</ui>


Зачем нужен uic?

uic (User Interface Compiler) — это утилита, которая компилирует .ui файл в C++ заголовочный файл, обычно с именем ui_<имя_формы>.h.

Пример команды:
uic mainwindow.ui -o ui_mainwindow.h

После этого вы получаете класс Ui::MainWindow, который содержит все виджеты и методы для их инициализации.

Как использовать с C++

Подключаем сгенерированный заголовочный файл:
#include "ui_mainwindow.h"
#include <QMainWindow>

class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
ui.setupUi(this); // Настраивает интерфейс
}
private:
Ui::MainWindow ui;
};

Всё! Теперь у вас есть полностью рабочий GUI на C++.
Автоматическая компиляция .ui файлов

В больших проектах запускать uic вручную неудобно. Обычно это делается автоматически:

• CMake:
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON) # Автоматически компилирует .ui файлы
find_package(Qt5 COMPONENTS Widgets REQUIRED)
add_executable(MyApp main.cpp)
target_link_libraries(MyApp Qt5::Widgets)


• qmake: .pro файл автоматически обрабатывает все .ui файлы.

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

C / C++
• Make — дед всех сборщиков. Просто, но больно на больших проектах.
• CMake — стандарт для C++, генерирует подо всё, от Visual Studio до Ninja. Настроил один раз — и забыл.
• Ninja — летает. Минимализм и скорость, но без генератора не обойтись.
• Meson — современный и понятный. Пишешь конфиг, а остальное делает сам.

Java / Kotlin
• Maven — строгий, надёжный, как бухгалтер. XML, но зато стабильно.
• Gradle — гибкий и умный. Kotlin DSL, кэш, плагины — идеально для Android.
• Ant — старичок. Всё вручную, без зависимостей. Только если проект с археологических времён.

JavaScript / TypeScript
• npm scripts — минимализм. Для мелких задач — норм, для монстров — нет.
• Webpack — тяжёлый, но делает всё. Настроить — целое приключение.
• Vite — быстрый, лёгкий, без боли. Для фронтенда XXI века.
• Rollup — идеален для библиотек, чистая сборка без мусора.
• esbuild / Parcel — “включил и поехал”. Молниеносные и почти без настроек.

Python
• setuptools — классика. Работает, но старомодно.
• Poetry — современный подход: зависимости, сборка, публикация — всё в одном.

Rust
• Cargo — лучший пример, как должна выглядеть система сборки. Просто, быстро, всё встроено.

Go
• go build
— минимализм в чистом виде. Один файл — одна команда — готово.

Кросс-языковые
• Bazel — для монореп и гигантов вроде Google. Кэш, параллель, масштаб.
• Buck / Pants / Please — те же идеи, другие акценты. Подходят, если у тебя тысяча микросервисов.
Кодеки — это устройства или программы, которые сжимают и распаковывают мультимедийные данные, такие как аудио и видео. Название «кодек» происходит от слов coder-decoder — «кодер-декодер».

Вот как они работают:

1. Сжатие (кодирование)

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

Кодек уменьшает размер файла двумя основными способами:

a) Потеря информации (lossy)
• Примеры: MP3 (аудио), H.264 (видео), AAC (аудио)
• Убираются «неважные» детали, которые человеческое ухо или глаз практически не замечает.
• Преимущество: файлы маленькие
• Недостаток: при многократной перезаписи качество теряется

b) Без потерь (lossless)
• Примеры: FLAC (аудио), PNG (изображения), FFV1 (видео)
• Сжимается файл без потери качества, полностью можно восстановить оригинал
• Преимущество: качество 100%
• Недостаток: сжатие не такое сильное, как у lossy

2. Хранение

После сжатия данные сохраняются в файле или потоке, например .mp3, .mp4, .mkv.
Файл содержит кодированные данные и иногда дополнительную информацию (метаданные, субтитры, обложки и т.д.).

3. Воспроизведение (декодирование)

Когда вы воспроизводите файл, кодек раскодирует его обратно в форму, которую может обработать динамик или экран:
• Кодек читает сжатые данные
• Преобразует их в поток аудио/видео
• Отправляет на устройство вывода

Если кодек не установлен, файл не откроется, потому что система не знает, как интерпретировать данные.

4. Примеры популярных кодеков
Видео: H.264, H.265 (HEVC), VP9, AV1
Аудио: MP3, AAC, Opus, FLAC
Сигналы прерывания в зависимости от источника возникновения делятся на два основных типа:

1. Внутренние (или программные, синхронные) прерывания — возникают внутри процессора в результате выполнения инструкций программы.
Примеры:
• Деление на ноль;
• Ошибка страницы (page fault);
• Выполнение специальной инструкции программного прерывания (например, INT в x86);
• Переполнение арифметической операции.

2. Внешние (или аппаратные, асинхронные) прерывания — возникают вне процессора, от внешних устройств или по внешним сигналам.
Примеры:
• Сигнал от таймера;
• Сигнал от клавиатуры, мыши, сетевого адаптера и других периферийных устройств;
• Аппаратный сброс.

Иногда внешние прерывания дополнительно подразделяют на:


• Маскируемые — могут быть временно запрещены программно (например, с помощью флага разрешения прерываний).
• Немаскируемые (NMI — Non-Maskable Interrupts) — всегда обрабатываются, даже если остальные прерывания запрещены (обычно для сигналов аварийных состояний).