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

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

Некоторые из наиболее распространенных:

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-коде, зависит от его размера и уровня коррекции ошибок.
npm = Node Package Manager

Менеджер пакетов для 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 lodash
1. 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 является распределенной системой имен, состоящей из иерархически организованных серверов.
Архитектура Клиент-Сервер: Технический разбор

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

Стек технологий и протоколы
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!":

HAI 1.2
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE

HAI 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 и микроволновых печей.
HDD vs SSD

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

Так как у SSD нет механических частей, то, во-первых, это делает его прочнее, тише, но самое главное преимущество SSD в том, что они работают значительно быстрее классических жестких дисков. Благодаря этому ПК и ноутбуки с SSD запускаются примерно в два раза быстрее, чем с HDD, а файлы и программы открываются до четырех раз быстрее.

Но говорить, что SSD во всем превосходят HDD, тоже неверно. HDD все еще гораздо дешевле SSD, а также жесткие диски предлагают гораздо больше места для хранения данных. Здесь возможны объемы и 10, и 20 Тбайт, в то время как потребительские SSD в большинстве своем пока ограничиваются 8 Тбайт.
Формальные языки и грамматики
Важные концепты в теории автоматов и теории формальных языков, которые изучают структуры, используемые для описания и анализа различных типов языков, включая языки программирования, естественные языки и другие формализованные системы.



Формальные
языки:
Множество строк (или слов), составленных из алфавита. Алфавит состоит из конечного набора символов, которые называются символами. Язык — это множество слов, построенных из этих символов.

Пример:
• Алфавит: Σ={a,b} (два символа: a и b).
Язык, состоящий из всех строк, содержащих четное количество символов a: L={ϵ,aa,abba,aabaa,…}.

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

1. Бэкусовская форма (Context-Free Grammar, CFG)
Это один из самых популярных типов грамматик. В CFG правила состоят из замен, где левая часть состоит из одного нетерминала, а правая — из последовательности терминалов и нетерминалов.

Пример: Грамматика для арифметических выражений:
E → E + T
E → E - T
E → T
T → T * F
T → T / F
T → F
F → ( 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)
Самые простые грамматики, где правила имеют ограниченную форму. Например, они могут быть описаны с помощью регулярных выражений.
Виртуализация — технология, которая позволяет создавать и использовать виртуальные версии ресурсов, таких как серверы, сети и рабочие станции. Это достигается с помощью ПО, известного как гипервизор.

Гипервизор — это слой ПО, который позволяет запускать несколько операционных систем на одном физическом сервере как отдельные виртуальные машины (ВМ). Гипервизоры бывают двух типов:

Гипервизор типа 1 (или "bare-metal"): Эти гипервизоры устанавливаются непосредственно на аппаратное обеспечение. Примеры включают VMware ESXi, Microsoft Hyper-V и Xen.

Гипервизор типа 2 (или "hosted"): Эти гипервизоры работают на операционной системе хоста, как обычное приложение. Примеры включают VMware Workstation и Oracle VirtualBox.
Машина Тьюринга и машина Поста - это два различных математических моделей для описания абстрактных вычислительных устройств. Оба этих понятия являются важными для изучения теории вычислимости и алгоритмов.

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

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

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

Низкоуровневое программирование — это подход к программированию, при котором программисты взаимодействуют с аппаратным обеспечением напрямую, используя языки, близкие к машинному коду. К таким языкам относятся ассемблер и языки C/C++ (в контексте работы с системными ресурсами). В отличие от высокоуровневых языков, таких как Python или JavaScript, где программисты работают с абстракциями и готовыми библиотеками, низкоуровневое программирование требует более глубокого понимания устройства компьютера.

Ключевые особенности низкоуровневого программирования:

• Память и процессор: программист контролирует использование памяти, регистры процессора и работу с системой.

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

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

Различия с высокоуровневыми языками:

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

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