Подписи Лампорта — криптография без «магии»
RSA и ECDSA держатся на сложности факторизации. А подписи Лампорта — только на хэш-функциях (например, SHA-256). Они post-quantum по умолчанию.
Минимальная реализация на Python:
Ключи огромные, но принцип работает. Для реального использования берите SPHINCS+.
RSA и ECDSA держатся на сложности факторизации. А подписи Лампорта — только на хэш-функциях (например, SHA-256). Они post-quantum по умолчанию.
Минимальная реализация на Python:
import os
import hashlib
def generate_key():
private_key = [os.urandom(32) for _ in range(256 * 2)]
public_key = [hashlib.sha256(x).digest() for x in private_key]
return private_key, public_key
def sign(message, private_key):
h = hashlib.sha256(message).digest()
signature = []
for i in range(256):
bit = (h[i // 8] >> (i % 8)) & 1
signature.append(private_key[i + bit * 256])
return signature
def verify(message, signature, public_key):
h = hashlib.sha256(message).digest()
for i in range(256):
bit = (h[i // 8] >> (i % 8)) & 1
computed = hashlib.sha256(signature[i]).digest()
if computed != public_key[i + bit * 256]:
return False
return True
# Пример использования
priv, pub = generate_key()
msg = b"Hello, Lamport!"
sig = sign(msg, priv)
print(verify(msg, sig, pub)) # True
Ключи огромные, но принцип работает. Для реального использования берите SPHINCS+.
Нейронные сети и мозг: больше различий, чем сходства
Многие думают, что нейросети копируют мозг. На деле:
• биологические нейроны — аналоговые, асинхронные, с химическими сигналами
• backpropagation в мозге не обнаружен
• мозг использует крайне разреженное кодирование и тратит ~20 Вт
Различия помогают: спайковые сети и neuromorphic чипы вроде Intel Loihi уже эффективнее обычных NN на edge-устройствах.
ИИ не повторяет биологию, а идёт своим путём — и это хорошо.
Многие думают, что нейросети копируют мозг. На деле:
• биологические нейроны — аналоговые, асинхронные, с химическими сигналами
• backpropagation в мозге не обнаружен
• мозг использует крайне разреженное кодирование и тратит ~20 Вт
Различия помогают: спайковые сети и neuromorphic чипы вроде Intel Loihi уже эффективнее обычных NN на edge-устройствах.
ИИ не повторяет биологию, а идёт своим путём — и это хорошо.
Хэш-функции везде, где не ждёшь
Кроме таблиц, хэши используют:
• LSH для поиска похожих векторов
• MinHash для сравнения геномов и документов
• Merkle trees в Git и блокчейнах
Быстрая не крипто хэш-функция — xxHash. Установка:
Быстрее
Кроме таблиц, хэши используют:
• LSH для поиска похожих векторов
• MinHash для сравнения геномов и документов
• Merkle trees в Git и блокчейнах
Быстрая не крипто хэш-функция — xxHash. Установка:
pip install xxhashimport xxhash
data = b"очень длинная строка или большой файл"
hash_value = xxhash.xxh64(data).digest()
print(hash_value.hex())
# Для стриминга больших данных
h = xxhash.xxh64()
with open("big_file.bin", "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
h.update(chunk)
print(h.digest().hex())
Быстрее
MurmurHash, коллизий почти нет. Отлично для кэшей и bloom-фильтров.Формальная верификация уже спасает миллиарды
Amazon доказал корректность частей S3 и DynamoDB с помощью TLA+. Microsoft верифицирует гипервизор в Dafny.
Простейший пример в PlusCal (транслируется в TLA+):
Этот алгоритм НЕ корректный (возможен deadlock). TLC (model checker) найдёт ошибку за секунды.
Начать легко: установите Toolbox, попробуйте на простых примерах mutual exclusion.
Amazon доказал корректность частей S3 и DynamoDB с помощью TLA+. Microsoft верифицирует гипервизор в Dafny.
Простейший пример в PlusCal (транслируется в TLA+):
(*--algorithm mutex
variables flag = [i \in {1,2} |-> FALSE];
process proc \in {1,2}
begin
A: flag[self] := TRUE;
B: await flag[3-self] = FALSE;
C: skip; (* critical section *)
D: flag[self] := FALSE;
E: goto A;
end process;
end algorithm;*)
Этот алгоритм НЕ корректный (возможен deadlock). TLC (model checker) найдёт ошибку за секунды.
Начать легко: установите Toolbox, попробуйте на простых примерах mutual exclusion.
Теория формальных языков изучает структуры и свойства языков, описанных формальными системами.
Основные аспекты:
1, Грамматики: Формальные правила, которые определяют синтаксис языка. Основные типы:
- Контекстно-свободные грамматики (КС-грамматики): Определяют синтаксис языков, которые можно описать с помощью синтаксических деревьев (например, язык программирования C).
- Контекстно-зависимые грамматики: Более мощные и сложные, позволяют описывать языки с контекстуальными зависимостями (например, естественные языки).
2. Автоматы: Математические модели для описания и распознавания языков.
- Конечные автоматы: Описание языков с помощью простых состояний и переходов (например, регулярные языки).
- Стековые автоматы: Модели с использованием стека, применимые к контекстно-свободным языкам.
3. Языки:
- Регулярные языки: Определяются регулярными выражениями и распознаются конечными автоматами.
- Контекстно-свободные языки: Определяются контекстно-свободными грамматиками и распознаются стековыми автоматами.
- Контекстно-зависимые языки: Определяются контекстно-зависимыми грамматиками и распознаются более мощными машинами.
4. Классы языков: Иерархия языков в зависимости от сложности грамматик и автоматов, таких как регулярные, контекстно-свободные, контекстно-зависимые и рекурсивно перечисляемые языки.
5. Операции над языками: Способы объединения, пересечения, дополнения и другие операции для работы с языками.
Основные аспекты:
1, Грамматики: Формальные правила, которые определяют синтаксис языка. Основные типы:
- Контекстно-свободные грамматики (КС-грамматики): Определяют синтаксис языков, которые можно описать с помощью синтаксических деревьев (например, язык программирования C).
- Контекстно-зависимые грамматики: Более мощные и сложные, позволяют описывать языки с контекстуальными зависимостями (например, естественные языки).
2. Автоматы: Математические модели для описания и распознавания языков.
- Конечные автоматы: Описание языков с помощью простых состояний и переходов (например, регулярные языки).
- Стековые автоматы: Модели с использованием стека, применимые к контекстно-свободным языкам.
3. Языки:
- Регулярные языки: Определяются регулярными выражениями и распознаются конечными автоматами.
- Контекстно-свободные языки: Определяются контекстно-свободными грамматиками и распознаются стековыми автоматами.
- Контекстно-зависимые языки: Определяются контекстно-зависимыми грамматиками и распознаются более мощными машинами.
4. Классы языков: Иерархия языков в зависимости от сложности грамматик и автоматов, таких как регулярные, контекстно-свободные, контекстно-зависимые и рекурсивно перечисляемые языки.
5. Операции над языками: Способы объединения, пересечения, дополнения и другие операции для работы с языками.
Стоимость операций: CPU, кэш и память
Асимптотическая сложность не отражает реальную стоимость операций.
Современный процессор выполняет инструкции за наносекунды, но доступ к:
• L1 кэшу — ~1–4 такта
• L3 — десятки тактов
• RAM — сотни тактов
Алгоритмы с линейным проходом по памяти часто выигрывают у «умных» алгоритмов со случайным доступом.
Пример:
Поиск минимума в массиве —
Причина — предвыборка и кэш-линейность.
Асимптотическая сложность не отражает реальную стоимость операций.
Современный процессор выполняет инструкции за наносекунды, но доступ к:
• L1 кэшу — ~1–4 такта
• L3 — десятки тактов
• RAM — сотни тактов
Алгоритмы с линейным проходом по памяти часто выигрывают у «умных» алгоритмов со случайным доступом.
Пример:
Поиск минимума в массиве —
O(n) — почти всегда быстрее бинарного поиска в несмежных структурах, несмотря на худшую формальную сложность.Причина — предвыборка и кэш-линейность.
Хеширование, коллизии и деградация
Хеш-таблицы зависят от:
• качества хеш-функции
• стратегии разрешения коллизий
• коэффициента заполнения
Открытая адресация страдает от кластеризации, цепочки — от неравномерного распределения.
Пример:
При нагрузке > 0.75 среднее число проб резко растёт.
Рехеширование — операция O(n) и может стать латентным пиком в продакшене, если не контролировать рост.
Реальность:
Хеш-таблицы зависят от:
• качества хеш-функции
• стратегии разрешения коллизий
• коэффициента заполнения
Открытая адресация страдает от кластеризации, цепочки — от неравномерного распределения.
Пример:
При нагрузке > 0.75 среднее число проб резко растёт.
Рехеширование — операция O(n) и может стать латентным пиком в продакшене, если не контролировать рост.
Реальность:
O(1) — это статистическое обещание, а не гарантия.Таблица разделов
Таблица разделов — часть главной загрузочной записи (
Для создания на диске более
Адреса начала и конца раздела задаются в формате
Таблица разделов — часть главной загрузочной записи (
MBR), состоящая из четырёх записей по 16 байт. Каждая запись описывает один из разделов жёсткого диска. Первая запись находится по смещению 1BEh от начала сектора, содержащего MBR, каждая последующая запись вплотную примыкает к предыдущей.Для создания на диске более
4 разделов используются расширенные разделы, позволяющие создать неограниченное количество логических дисков внутри себя.Адреса начала и конца раздела задаются в формате
CHS, используемом традиционными функциями дискового сервиса BIOS, из-за чего номер цилиндра разорван на две части: старшие два бита хранятся в двух старших битах слова, отведённого под номера цилиндра и сектора; за ними следуют шесть бит номера сектора, а младшие восемь бит номера цилиндра занимают весь младший байт слова. Если задать корректный адрес с помощью формата CHS невозможно, все три байта полей начала и конца раздела должны содержать FFhИнструменты для управления политиками безопасности
Эти инструменты помогают контролировать соблюдение политик безопасности в процессе разработки и эксплуатации.
• OPA (Open Policy Agent): Открытый агент для управления политиками, который можно интегрировать в разные этапы DevOps-пайплайнов.
• Kubernetes RBAC: Управление доступом на основе ролей (Role-Based Access Control) в Kubernetes для контроля безопасности.
Эти инструменты ([1], [2], [3], [4], [5], [6], [7], [8], [9]), в сочетании с процессами DevOps и практиками безопасности, помогают создавать безопасные и надежные программные решения, снижая риски и улучшая общую безопасность на всех этапах разработки и эксплуатации.
Эти инструменты помогают контролировать соблюдение политик безопасности в процессе разработки и эксплуатации.
• OPA (Open Policy Agent): Открытый агент для управления политиками, который можно интегрировать в разные этапы DevOps-пайплайнов.
• Kubernetes RBAC: Управление доступом на основе ролей (Role-Based Access Control) в Kubernetes для контроля безопасности.
Эти инструменты ([1], [2], [3], [4], [5], [6], [7], [8], [9]), в сочетании с процессами DevOps и практиками безопасности, помогают создавать безопасные и надежные программные решения, снижая риски и улучшая общую безопасность на всех этапах разработки и эксплуатации.
DLL файлы, и для чего они нужны?
Аббревиатура DLL – обозначает «Динамически Подключаемую Библиотеку». Она установлена, во всех операционных системах Windows, и практически каждая программа или игра на компьютере пользуется данной библиотекой. В ней содержится информация о конфигурации системы, совместимости устройств, наборе команд для правильной работы и многое другое.
DLL файлы – это компоненты библиотеки, а нужна она для запуска программ, приложений и игр. Компьютер включился, и система работает исправно. Вы еще ничего не запускали и не открывали, а уже десятки DLL файлов используются. Простые часы, информация о конфигурации системы, порядок запуска программ, оформление и многое другое используют библиотеку.
Для того чтобы в текстовом документе начали появляться символы, соответствующие вашему вводу, нужна библиотека. По умолчанию система не знает, что означает нажатая вами клавиша,─ в этом его помогают компоненты DLL.
Аналогичная ситуация со всеми подключаемыми устройствами: принтером, мышью, клавиатурой, флеш-картой. Именно библиотека DLL файлов «рассказывает» им, как работать с параметрами вашей системы.
Аббревиатура DLL – обозначает «Динамически Подключаемую Библиотеку». Она установлена, во всех операционных системах Windows, и практически каждая программа или игра на компьютере пользуется данной библиотекой. В ней содержится информация о конфигурации системы, совместимости устройств, наборе команд для правильной работы и многое другое.
DLL файлы – это компоненты библиотеки, а нужна она для запуска программ, приложений и игр. Компьютер включился, и система работает исправно. Вы еще ничего не запускали и не открывали, а уже десятки DLL файлов используются. Простые часы, информация о конфигурации системы, порядок запуска программ, оформление и многое другое используют библиотеку.
Для того чтобы в текстовом документе начали появляться символы, соответствующие вашему вводу, нужна библиотека. По умолчанию система не знает, что означает нажатая вами клавиша,─ в этом его помогают компоненты DLL.
Аналогичная ситуация со всеми подключаемыми устройствами: принтером, мышью, клавиатурой, флеш-картой. Именно библиотека DLL файлов «рассказывает» им, как работать с параметрами вашей системы.
Кодирование графической и видеоинформации — процесс преобразования аналоговых или цифровых данных изображений и видео в специальный формат, который занимает меньше места, сохраняя при этом необходимое качество.
Кодирование графической информации:
JPEG (Joint Photographic Experts Group):
• Стандарт для сжатия статических изображений.
• Позволяет настроить уровень сжатия, что влияет на баланс между качеством и размером файла.
• Часто используется для фотографий и изображений с непрерывными тональными переходами.
PNG (Portable Network Graphics):
• Формат без потерь, хорошо подходит для изображений с прозрачностью.
• Предоставляет поддержку 24-битной палитры и альфа-канала.
GIF (Graphics Interchange Format):
• Широко используется для анимированных изображений.
• Поддерживает до 256 цветов, что делает его менее подходящим для фотографий, но хорошим для простых изображений с ограниченной цветовой палитрой.
Кодирование видеоинформации:
H.264 (MPEG-4 Part 10 AVC):
• Один из наиболее широко используемых стандартов видеокодирования.
• Обеспечивает высокое качество при сравнительно низкой пропускной способности.
H.265 (High Efficiency Video Coding - HEVC):
• Преемник H.264, обеспечивает еще более эффективное сжатие видео без ущерба для качества.
VP9:
• Открытый стандарт, разработанный Google.
• Предназначен для сжатия видео с высоким разрешением при более низкой пропускной способности.
AV1:
• Еще один открытый стандарт, разрабатываемый Alliance for Open Media.
• Предназначен для достижения высокого качества при сжатии видео и конкурирует с H.265.
Кодирование графической информации:
JPEG (Joint Photographic Experts Group):
• Стандарт для сжатия статических изображений.
• Позволяет настроить уровень сжатия, что влияет на баланс между качеством и размером файла.
• Часто используется для фотографий и изображений с непрерывными тональными переходами.
PNG (Portable Network Graphics):
• Формат без потерь, хорошо подходит для изображений с прозрачностью.
• Предоставляет поддержку 24-битной палитры и альфа-канала.
GIF (Graphics Interchange Format):
• Широко используется для анимированных изображений.
• Поддерживает до 256 цветов, что делает его менее подходящим для фотографий, но хорошим для простых изображений с ограниченной цветовой палитрой.
Кодирование видеоинформации:
H.264 (MPEG-4 Part 10 AVC):
• Один из наиболее широко используемых стандартов видеокодирования.
• Обеспечивает высокое качество при сравнительно низкой пропускной способности.
H.265 (High Efficiency Video Coding - HEVC):
• Преемник H.264, обеспечивает еще более эффективное сжатие видео без ущерба для качества.
VP9:
• Открытый стандарт, разработанный Google.
• Предназначен для сжатия видео с высоким разрешением при более низкой пропускной способности.
AV1:
• Еще один открытый стандарт, разрабатываемый Alliance for Open Media.
• Предназначен для достижения высокого качества при сжатии видео и конкурирует с H.265.
Методы кодирования символов указывают на способы представления символов в компьютерных системах.
Некоторые из наиболее распространенных:
ASCII (American Standard Code for Information Interchange): Это стандартное кодирование символов для компьютеров, основанное на английском алфавите. Он представляет каждый символ одним байтом (8 битами) и может быть использован для представления 128 различных символов.
Unicode: Это международный стандарт для кодирования символов. Unicode расширяет ASCII, чтобы включить символы различных языков и символы, которые не входят в английский алфавит. Unicode может быть представлен различными способами, такими как UTF-8, UTF-16 и UTF-32, которые используют разное количество байтов для кодирования символов.
UTF-8 (Unicode Transformation Format 8-bit): Это переменная длина кодирование символов Unicode, которое использует от 1 до 4 байтов для представления символов в зависимости от их кодового значения. UTF-8 обычно используется в Интернете и в большинстве современных компьютерных систем, так как он эффективно представляет широкий набор символов и поддерживает обратную совместимость с ASCII.
UTF-16: Это кодирование символов Unicode с использованием 16-битных блоков данных. Оно может быть использовано для представления всех символов Unicode, но требует больше памяти, чем UTF-8.
ISO-8859: Это набор стандартных кодировок символов, разработанных Международной организацией по стандартизации. Каждая кодировка ISO-8859 предназначена для определенного набора символов, таких как ISO-8859-1 для латинского алфавита.
Некоторые из наиболее распространенных:
ASCII (American Standard Code for Information Interchange): Это стандартное кодирование символов для компьютеров, основанное на английском алфавите. Он представляет каждый символ одним байтом (8 битами) и может быть использован для представления 128 различных символов.
Unicode: Это международный стандарт для кодирования символов. Unicode расширяет ASCII, чтобы включить символы различных языков и символы, которые не входят в английский алфавит. Unicode может быть представлен различными способами, такими как UTF-8, UTF-16 и UTF-32, которые используют разное количество байтов для кодирования символов.
UTF-8 (Unicode Transformation Format 8-bit): Это переменная длина кодирование символов Unicode, которое использует от 1 до 4 байтов для представления символов в зависимости от их кодового значения. UTF-8 обычно используется в Интернете и в большинстве современных компьютерных систем, так как он эффективно представляет широкий набор символов и поддерживает обратную совместимость с ASCII.
UTF-16: Это кодирование символов Unicode с использованием 16-битных блоков данных. Оно может быть использовано для представления всех символов Unicode, но требует больше памяти, чем UTF-8.
ISO-8859: Это набор стандартных кодировок символов, разработанных Международной организацией по стандартизации. Каждая кодировка ISO-8859 предназначена для определенного набора символов, таких как ISO-8859-1 для латинского алфавита.
Магнитный принцип чтения информации
Запись информации происходит на магнитно-чувствительный материал. Магнитное покрытие толщиной в несколько миллиметров нанесено на немагнитный каркас и имеет доменную структуру (состоит из множества микроскопических намагниченных частиц - доменов)
Магнитные поля доменов, попав под воздействие внешнего магнитного поля, ориентируются в соответствии с направлением магнитных силовых линий. Когда внешнее поле перестает воздействовать на магнитные поля доменов, на поверхности этих микроскопических частиц образуются зоны остаточной намагниченности, то есть сохраняется информация о подействовавшем на диск магнитном поле.
При чтении информации магнитные головки проходят над дорожками. При считывании намагниченные ранее участки направляют ЭДС в головке, проходящей над таким участком. Изменение направления ЭДС за определённое время характеризует двоичную единицу, неизменность – нуль. При этом, указанный промежуток времени изменения ЭДС называют битовым элементом.
Запись информации происходит на магнитно-чувствительный материал. Магнитное покрытие толщиной в несколько миллиметров нанесено на немагнитный каркас и имеет доменную структуру (состоит из множества микроскопических намагниченных частиц - доменов)
Магнитные поля доменов, попав под воздействие внешнего магнитного поля, ориентируются в соответствии с направлением магнитных силовых линий. Когда внешнее поле перестает воздействовать на магнитные поля доменов, на поверхности этих микроскопических частиц образуются зоны остаточной намагниченности, то есть сохраняется информация о подействовавшем на диск магнитном поле.
При чтении информации магнитные головки проходят над дорожками. При считывании намагниченные ранее участки направляют ЭДС в головке, проходящей над таким участком. Изменение направления ЭДС за определённое время характеризует двоичную единицу, неизменность – нуль. При этом, указанный промежуток времени изменения ЭДС называют битовым элементом.
QR-код представляет собой двухмерный матричный штрих-код, состоящий из черных и белых квадратных модулей, размещенных на белом фоне. Он содержит информацию в виде набора байтов, которая может быть расшифрована специальным сканером или мобильным устройством.
QR-код состоит из следующих элементов:
Поисковая позиция (англ. Finder pattern) - три квадрата в углах QR-кода, служат для автоматической коррекции, поиска и выравнивания кода.
Калибровочные полосы (англ. Alignment pattern) - несколько квадратов, расположенных на определенном расстоянии друг от друга внутри QR-кода, необходимы для расчета размеров и положения символов.
Синхронизационные строки (англ. Timing pattern) - вертикальные и горизонтальные полосы, определяющие размер и форму кода.
Данные - байты информации, которую необходимо закодировать в QR-коде, которые представлены в бинарном или текстовом формате.
Информационные области - области, заполняемые модулями, отображающими данные.
Коррекционные биты - блоки данных, используемые для коррекции ошибок, которые возникают при считывании QR-кода.
QR-код может содержать различные типы информации, включая текст, URL-адреса, контактные данные, номера телефонов и прочее. Количество информации, которое может быть закодировано в QR-коде, зависит от его размера и уровня коррекции ошибок.
QR-код состоит из следующих элементов:
Поисковая позиция (англ. Finder pattern) - три квадрата в углах QR-кода, служат для автоматической коррекции, поиска и выравнивания кода.
Калибровочные полосы (англ. Alignment pattern) - несколько квадратов, расположенных на определенном расстоянии друг от друга внутри QR-кода, необходимы для расчета размеров и положения символов.
Синхронизационные строки (англ. Timing pattern) - вертикальные и горизонтальные полосы, определяющие размер и форму кода.
Данные - байты информации, которую необходимо закодировать в QR-коде, которые представлены в бинарном или текстовом формате.
Информационные области - области, заполняемые модулями, отображающими данные.
Коррекционные биты - блоки данных, используемые для коррекции ошибок, которые возникают при считывании QR-кода.
QR-код может содержать различные типы информации, включая текст, URL-адреса, контактные данные, номера телефонов и прочее. Количество информации, которое может быть закодировано в QR-коде, зависит от его размера и уровня коррекции ошибок.
npm = Node Package Manager
Менеджер пакетов для Node.js.
Основная цель: управлять библиотеками (пакетами) для JavaScript/Node-проектов.
С его помощью можно:
• Устанавливать готовые пакеты (
• Создавать свои пакеты (
• Обновлять пакеты (
• Управлять зависимостями проекта через
Как работает npm:
npm состоит из трёх ключевых компонентов:
1. Командная строка (npm CLI)
• Ты вводишь команды: npm install express
• CLI обрабатывает запрос и общается с реестром npm.
2. npm Registry (репозиторий пакетов)
• Онлайн-хранилище всех пакетов:
• Когда ты устанавливаешь пакет, CLI загружает его с этого репозитория.
3. node_modules и package.json
• Установленные пакеты хранятся в папке node_modules.
• Файл package.json фиксирует, какие пакеты и версии нужны для проекта.
Принцип работы установки пакета:
Пример:
1. CLI проверяет локальный кэш (
2. Если нет — скачивает пакет из npm Registry.
3. Устанавливает пакет в
4. Добавляет запись о пакете в package.json и package-lock.json.
Разновидности установки:
Локально: для конкретного проекта
Глобально: доступно в системе для всех проектов
Основные файлы npm-проекта:
1.
2.
3.
Менеджер пакетов для Node.js.
Основная цель: управлять библиотеками (пакетами) для JavaScript/Node-проектов.
С его помощью можно:
• Устанавливать готовые пакеты (
npm install)• Создавать свои пакеты (
npm init)• Обновлять пакеты (
npm update)• Управлять зависимостями проекта через
package.jsonКак работает npm:
npm состоит из трёх ключевых компонентов:
1. Командная строка (npm CLI)
• Ты вводишь команды: npm install express
• CLI обрабатывает запрос и общается с реестром npm.
2. npm Registry (репозиторий пакетов)
• Онлайн-хранилище всех пакетов:
https://www.npmjs.com/• Когда ты устанавливаешь пакет, CLI загружает его с этого репозитория.
3. node_modules и package.json
• Установленные пакеты хранятся в папке node_modules.
• Файл package.json фиксирует, какие пакеты и версии нужны для проекта.
Принцип работы установки пакета:
Пример:
npm install lodash1. CLI проверяет локальный кэш (
~/.npm) — есть ли пакет уже скачан.2. Если нет — скачивает пакет из npm Registry.
3. Устанавливает пакет в
node_modules проекта.4. Добавляет запись о пакете в package.json и package-lock.json.
Разновидности установки:
Локально: для конкретного проекта
npm install lodashГлобально: доступно в системе для всех проектов
npm install -g nodemonОсновные файлы npm-проекта:
1.
package.json — список зависимостей и скриптов проекта.2.
package-lock.json — фиксирует точные версии всех зависимостей для стабильности.3.
node_modules/ — физическое место хранения всех пакетов.Краткие характеристики сетевых протоколов
TCP (Transmission Control Protocol):
• Обеспечивает надежную передачу данных через сетевые протоколы.
• Устанавливает соединение (TCP handshake) перед передачей данных.
• Гарантирует доставку данных в правильном порядке и без ошибок.
• Используется для передачи данных в приложениях, требующих надежности, таких как веб-браузеры и клиенты электронной почты.
UDP (User Datagram Protocol):
• Протокол без соединения, не гарантирует доставку данных.
• Быстрый и легкий протокол, используемый для передачи небольших пакетов данных.
• Часто используется в приложениях, требующих быстрой передачи данных, таких как потоковая передача видео и аудио.
HTTP (Hypertext Transfer Protocol):
• Протокол передачи гипертекста, используемый для передачи данных между веб-сервером и веб-клиентом (браузером).
• Работает поверх TCP и использует порт 80 по умолчанию.
• Использует методы GET и POST для получения и отправки данных.
HTTPS (HTTP Secure):
• Защищенная версия HTTP, использующая протокол SSL/TLS для шифрования данных.
• Используется для обеспечения безопасности передачи данных между веб-сервером и клиентом.
• Работает поверх TCP и использует порт 443 по умолчанию.
FTP (File Transfer Protocol):
• Протокол передачи файлов, используемый для передачи файлов между клиентом и сервером.
• Работает поверх TCP и использует порты 20 (для данных) и 21 (для управления) по умолчанию.
• FTP не шифрует данные, поэтому для защиты конфиденциальных данных рекомендуется использовать FTP через SSL (FTPS) или SFTP.
SMTP (Simple Mail Transfer Protocol):
• Протокол простой передачи почты, используемый для передачи электронных писем между почтовыми серверами.
• Работает поверх TCP и использует порт 25 по умолчанию.
• SMTP не шифрует данные, поэтому для защиты конфиденциальных данных рекомендуется использовать STARTTLS или SMTPS.
DNS (Domain Name System):
• Протокол, используемый для преобразования доменных имен в IP-адреса.
• Работает поверх UDP и использует порт 53 по умолчанию.
• DNS является распределенной системой имен, состоящей из иерархически организованных серверов.
TCP (Transmission Control Protocol):
• Обеспечивает надежную передачу данных через сетевые протоколы.
• Устанавливает соединение (TCP handshake) перед передачей данных.
• Гарантирует доставку данных в правильном порядке и без ошибок.
• Используется для передачи данных в приложениях, требующих надежности, таких как веб-браузеры и клиенты электронной почты.
UDP (User Datagram Protocol):
• Протокол без соединения, не гарантирует доставку данных.
• Быстрый и легкий протокол, используемый для передачи небольших пакетов данных.
• Часто используется в приложениях, требующих быстрой передачи данных, таких как потоковая передача видео и аудио.
HTTP (Hypertext Transfer Protocol):
• Протокол передачи гипертекста, используемый для передачи данных между веб-сервером и веб-клиентом (браузером).
• Работает поверх TCP и использует порт 80 по умолчанию.
• Использует методы GET и POST для получения и отправки данных.
HTTPS (HTTP Secure):
• Защищенная версия HTTP, использующая протокол SSL/TLS для шифрования данных.
• Используется для обеспечения безопасности передачи данных между веб-сервером и клиентом.
• Работает поверх TCP и использует порт 443 по умолчанию.
FTP (File Transfer Protocol):
• Протокол передачи файлов, используемый для передачи файлов между клиентом и сервером.
• Работает поверх TCP и использует порты 20 (для данных) и 21 (для управления) по умолчанию.
• FTP не шифрует данные, поэтому для защиты конфиденциальных данных рекомендуется использовать FTP через SSL (FTPS) или SFTP.
SMTP (Simple Mail Transfer Protocol):
• Протокол простой передачи почты, используемый для передачи электронных писем между почтовыми серверами.
• Работает поверх TCP и использует порт 25 по умолчанию.
• SMTP не шифрует данные, поэтому для защиты конфиденциальных данных рекомендуется использовать STARTTLS или SMTPS.
DNS (Domain Name System):
• Протокол, используемый для преобразования доменных имен в IP-адреса.
• Работает поверх UDP и использует порт 53 по умолчанию.
• DNS является распределенной системой имен, состоящей из иерархически организованных серверов.
Архитектура Клиент-Сервер: Технический разбор
Стек технологий и протоколы
1. Транспортный уровень: TCP/IP (гарантирует доставку пакетов).
2. Прикладной уровень: HTTP/HTTPS (правила обмена данными).
3. Форматы данных: JSON, XML, HTML, Protobuf.
4. Порты: 80 (HTTP), 443 (HTTPS), 22 (SSH), 3306 (MySQL) и др.
Жизненный цикл запроса (Request-Response Cycle)
• DNS Resolution: Клиент преобразует домен (
• TCP Handshake: Установление соединения (SYN → SYN-ACK → ACK).
• HTTP Request: Клиент отправляет запрос.
• Server Processing: Бэкенд обрабатывает логику, делает запросы к БД (SQL/NoSQL).
• HTTP Response: Сервер возвращает статус и данные.
• Rendering/Parsing: Клиент обрабатывает ответ (рендеринг HTML или парсинг JSON).
• Connection Termination: Закрытие соединения (TCP FIN).
Структура HTTP-запроса и ответа:
Запрос (Client → Server):
• Method: GET, POST, PUT, DELETE.
• Headers: Метаданные (cookies, auth, content-type).
• Body: Полезная нагрузка (payload).
Ответ (Server → Client):
• Status Code: Результат обработки (200, 404, 500).
• Headers: Информация о сервере, кэшировании, куки.
• Body: Данные или сообщение об ошибке.
Коды состояния HTTP (Status Codes)
• 2xx (Success):
-
-
-
• 3xx (Redirection):
-
-
• 4xx (Client Error):
-
-
-
-
• 5xx (Server Error):
-
-
-
Клиент-сервер — это распределенная структура приложения, где задачи разделены между поставщиком услуг (сервер) и потребителем (клиент). Взаимодействие строится на запросах и ответах через сеть.
Стек технологий и протоколы
1. Транспортный уровень: TCP/IP (гарантирует доставку пакетов).
2. Прикладной уровень: HTTP/HTTPS (правила обмена данными).
3. Форматы данных: JSON, XML, HTML, Protobuf.
4. Порты: 80 (HTTP), 443 (HTTPS), 22 (SSH), 3306 (MySQL) и др.
Жизненный цикл запроса (Request-Response Cycle)
• DNS Resolution: Клиент преобразует домен (
example.com) в IP-адрес сервера через DNS-запрос.• TCP Handshake: Установление соединения (SYN → SYN-ACK → ACK).
• HTTP Request: Клиент отправляет запрос.
• Server Processing: Бэкенд обрабатывает логику, делает запросы к БД (SQL/NoSQL).
• HTTP Response: Сервер возвращает статус и данные.
• Rendering/Parsing: Клиент обрабатывает ответ (рендеринг HTML или парсинг JSON).
• Connection Termination: Закрытие соединения (TCP FIN).
Структура HTTP-запроса и ответа:
Запрос (Client → Server):
POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer <token>
{
"username": "user1",
"password": "secure_pass"
}• Method: GET, POST, PUT, DELETE.
• Headers: Метаданные (cookies, auth, content-type).
• Body: Полезная нагрузка (payload).
Ответ (Server → Client):
HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: session_id=abc123
{
"status": "success",
"user_id": 456,
"token": "eyJhbGci..."
}• Status Code: Результат обработки (200, 404, 500).
• Headers: Информация о сервере, кэшировании, куки.
• Body: Данные или сообщение об ошибке.
Коды состояния HTTP (Status Codes)
• 2xx (Success):
-
200 OK — запрос успешен.-
201 Created — ресурс создан.-
204 No Content — успешно, но без тела ответа.• 3xx (Redirection):
-
301 Moved Permanently — постоянный редирект.-
302 Found — временный редирект.• 4xx (Client Error):
-
400 Bad Request — ошибка в синтаксисе запроса.-
401 Unauthorized — нужна авторизация.-
403 Forbidden — доступ запрещен.-
404 Not Found — ресурс не найден.• 5xx (Server Error):
-
500 Internal Server Error — ошибка на стороне сервера.-
502 Bad Gateway — шлюз получил неверный ответ.-
503 Service Unavailable — сервер перегружен.LOLCODE — это уникальный язык программирования, основанный на интернет-меме "LOLcats". Программы на LOLCODE выглядят как текст на "языке" LOLcats.
Пример простой программы на LOLCODE, которая выводит "Hello World!":
Пример простой программы на LOLCODE, которая выводит "Hello World!":
HAI 1.2CAN HAS STDIO?VISIBLE "HAI WORLD!"KTHXBYEHAI 1.2 — начало программы, указывающее версию языка.CAN HAS STDIO? — импорт стандартной библиотеки ввода-вывода.VISIBLE "HAI WORLD!" — вывод строки "HAI WORLD!" на экран.KTHXBYE — завершение программы.Текст на "языке" LOLcats обычно выглядит как забавные и искаженные фразы, часто сопровождаемые изображениями кошек.
I CAN HAS CHEEZBURGER?
OH HAI! U CAN HAS CHEEZBURGER!
Cтиль письма стал популярен благодаря интернет-мемам с изображениями кошек и смешными подписями.
Радиоволны — вид электромагнитных волн, которые переносят энергию через пространство без необходимости в физической среде.
Основы работы радиоволн
Создание радиоволн:
• Радиоволны создаются генератором электромагнитных колебаний, например, в радиопередатчике. Когда электрический ток проходит через антенну, он создает переменное магнитное и электрическое поле, которое распространяется наружу в виде радиоволн.
Передача радиоволн:
• Радиоволны распространяются в пространстве со скоростью света (примерно 300,000 км/с). Они могут проходить через атмосферу, отражаться от различных поверхностей и ионизированных слоев атмосферы (например, ионосферы), что позволяет им достигать удаленных точек на Земле.
Прием радиоволн:
• Когда радиоволны достигают антенны приемника, они создают в ней переменный электрический ток, аналогичный тому, что был создан в передающей антенне. Этот ток затем усиливается и обрабатывается для извлечения передаваемой информации, например, звука или изображения.
Модуляция радиоволн:
• Информация (например, аудио или данные) передается с помощью модуляции радиоволн. Существует два основных метода модуляции:
- Амплитудная модуляция: изменение амплитуды волны в зависимости от передаваемого сигнала.
- Частотная модуляция: изменение частоты волны в зависимости от сигнала.
• Также существуют и другие методы модуляции, такие как фазовая модуляция (PM), цифровая модуляция (QAM, PSK) и другие.
Частоты радиоволн:
• Радиоволны охватывают широкий диапазон частот, от нескольких килогерц (КГц) до нескольких гигагерц (ГГц) и выше. Различные частоты используются для разных целей:
- Низкие частоты (КГц и МГц) — для длинноволнового и средневолнового вещания.
- Высокие частоты (МГц и ГГц) — для мобильной связи, спутниковых систем, Wi-Fi и микроволновых печей.
Используются для передачи информации на большие расстояния, например, в радио- и телевизионных вещаниях, сотовой связи, навигационных системах и других технологиях.
Основы работы радиоволн
Создание радиоволн:
• Радиоволны создаются генератором электромагнитных колебаний, например, в радиопередатчике. Когда электрический ток проходит через антенну, он создает переменное магнитное и электрическое поле, которое распространяется наружу в виде радиоволн.
Передача радиоволн:
• Радиоволны распространяются в пространстве со скоростью света (примерно 300,000 км/с). Они могут проходить через атмосферу, отражаться от различных поверхностей и ионизированных слоев атмосферы (например, ионосферы), что позволяет им достигать удаленных точек на Земле.
Прием радиоволн:
• Когда радиоволны достигают антенны приемника, они создают в ней переменный электрический ток, аналогичный тому, что был создан в передающей антенне. Этот ток затем усиливается и обрабатывается для извлечения передаваемой информации, например, звука или изображения.
Модуляция радиоволн:
• Информация (например, аудио или данные) передается с помощью модуляции радиоволн. Существует два основных метода модуляции:
- Амплитудная модуляция: изменение амплитуды волны в зависимости от передаваемого сигнала.
- Частотная модуляция: изменение частоты волны в зависимости от сигнала.
• Также существуют и другие методы модуляции, такие как фазовая модуляция (PM), цифровая модуляция (QAM, PSK) и другие.
Частоты радиоволн:
• Радиоволны охватывают широкий диапазон частот, от нескольких килогерц (КГц) до нескольких гигагерц (ГГц) и выше. Различные частоты используются для разных целей:
- Низкие частоты (КГц и МГц) — для длинноволнового и средневолнового вещания.
- Высокие частоты (МГц и ГГц) — для мобильной связи, спутниковых систем, Wi-Fi и микроволновых печей.
HDD vs SSD
Принцип работы HDD и SSD кардинально отличается. Классические HDD состоят из одного или нескольких магнитных дисков и считывающих головок. SSD, наоборот, состоит из большого количества отдельных чипов Flash-памяти, которые встроены в диск по тому же принципу, что и в USB-флешках.
Так как у SSD нет механических частей, то, во-первых, это делает его прочнее, тише, но самое главное преимущество SSD в том, что они работают значительно быстрее классических жестких дисков. Благодаря этому ПК и ноутбуки с SSD запускаются примерно в два раза быстрее, чем с HDD, а файлы и программы открываются до четырех раз быстрее.
Но говорить, что SSD во всем превосходят HDD, тоже неверно. HDD все еще гораздо дешевле SSD, а также жесткие диски предлагают гораздо больше места для хранения данных. Здесь возможны объемы и 10, и 20 Тбайт, в то время как потребительские SSD в большинстве своем пока ограничиваются 8 Тбайт.
Принцип работы HDD и SSD кардинально отличается. Классические HDD состоят из одного или нескольких магнитных дисков и считывающих головок. SSD, наоборот, состоит из большого количества отдельных чипов Flash-памяти, которые встроены в диск по тому же принципу, что и в USB-флешках.
Так как у SSD нет механических частей, то, во-первых, это делает его прочнее, тише, но самое главное преимущество SSD в том, что они работают значительно быстрее классических жестких дисков. Благодаря этому ПК и ноутбуки с SSD запускаются примерно в два раза быстрее, чем с HDD, а файлы и программы открываются до четырех раз быстрее.
Но говорить, что SSD во всем превосходят HDD, тоже неверно. HDD все еще гораздо дешевле SSD, а также жесткие диски предлагают гораздо больше места для хранения данных. Здесь возможны объемы и 10, и 20 Тбайт, в то время как потребительские SSD в большинстве своем пока ограничиваются 8 Тбайт.
Формальные языки и грамматики
Формальные языки:
Множество строк (или слов), составленных из алфавита. Алфавит состоит из конечного набора символов, которые называются символами. Язык — это множество слов, построенных из этих символов.
Пример:
• Алфавит:
Язык, состоящий из всех строк, содержащих четное количество символов
Грамматики
Набор правил, которые определяют, как можно строить строки формального языка из символов алфавита. Грамматики обычно делятся на несколько типов, в зависимости от их мощности и применимости.
1. Бэкусовская форма (Context-Free Grammar, CFG)
Это один из самых популярных типов грамматик. В CFG правила состоят из замен, где левая часть состоит из одного нетерминала, а правая — из последовательности терминалов и нетерминалов.
Пример: Грамматика для арифметических выражений:
Здесь:
•
•
• Применяя эти правила, мы можем строить выражения, такие как
2. Грамматики типа 0 (Rug grammar)
Это самая общая форма грамматик, где правила могут быть произвольными, и левые части правил могут содержать несколько символов, в том числе нетерминалы.
3. Грамматики типа 1 (Context-sensitive grammar)
Правила грамматики могут заменять строку, состоящую из нескольких символов, только если на определенной позиции в строке находится подходящий контекст.
4. Грамматики типа 2 (Context-free grammar)
В этих грамматиках правила заменяют один нетерминал на строку из терминалов и нетерминалов, не завися от контекста. Это наиболее популярный тип грамматик, применяемых в компиляторах и других системах.
5. Грамматики типа 3 (Regular grammar)
Самые простые грамматики, где правила имеют ограниченную форму. Например, они могут быть описаны с помощью регулярных выражений.
Важные концепты в теории автоматов и теории формальных языков, которые изучают структуры, используемые для описания и анализа различных типов языков, включая языки программирования, естественные языки и другие формализованные системы.
Формальные языки:
Множество строк (или слов), составленных из алфавита. Алфавит состоит из конечного набора символов, которые называются символами. Язык — это множество слов, построенных из этих символов.
Пример:
• Алфавит:
Σ={a,b} (два символа: a и b).Язык, состоящий из всех строк, содержащих четное количество символов
a: L={ϵ,aa,abba,aabaa,…}.Грамматики
Набор правил, которые определяют, как можно строить строки формального языка из символов алфавита. Грамматики обычно делятся на несколько типов, в зависимости от их мощности и применимости.
1. Бэкусовская форма (Context-Free Grammar, CFG)
Это один из самых популярных типов грамматик. В CFG правила состоят из замен, где левая часть состоит из одного нетерминала, а правая — из последовательности терминалов и нетерминалов.
Пример: Грамматика для арифметических выражений:
E → E + TE → E - TE → TT → T * FT → T / FT → FF → ( E )F → numberЗдесь:
•
E,T,F — нетерминалы.•
+,−,∗,/,(,),number — терминалы.• Применяя эти правила, мы можем строить выражения, такие как
number+number∗number.2. Грамматики типа 0 (Rug grammar)
Это самая общая форма грамматик, где правила могут быть произвольными, и левые части правил могут содержать несколько символов, в том числе нетерминалы.
3. Грамматики типа 1 (Context-sensitive grammar)
Правила грамматики могут заменять строку, состоящую из нескольких символов, только если на определенной позиции в строке находится подходящий контекст.
4. Грамматики типа 2 (Context-free grammar)
В этих грамматиках правила заменяют один нетерминал на строку из терминалов и нетерминалов, не завися от контекста. Это наиболее популярный тип грамматик, применяемых в компиляторах и других системах.
5. Грамматики типа 3 (Regular grammar)
Самые простые грамматики, где правила имеют ограниченную форму. Например, они могут быть описаны с помощью регулярных выражений.