Реактивное программирование — способ написания программ, который фокусируется на потоках данных и автоматическом обновлении программы при изменении этих данных. Вместо того чтобы программист должен был вручную отслеживать и обновлять данные, реактивная система сама следит за данными и распространяет изменения там, где это необходимо.
Основные идеи на примере:
Observables: Представьте, что у вас есть источник данных, например, лента новостей в социальной сети. В реактивном программировании этот источник данных — это наблюдаемый, то есть поток, который может эмитировать (отправлять) новые данные (например, новые посты).
Subscribers: Представьте, что вы — подписчик этой ленты новостей. Когда вы подписываетесь на наблюдаемый, вы получаете обновления каждый раз, когда появляется новый пост. Ваш телефон автоматически отображает новые новости, как только они появляются.
Operators: Допустим, вы хотите видеть только новости от ваших друзей. В реактивном программировании вы можете использовать операторы для фильтрации потока данных, чтобы получать только нужные вам сообщения.
Change Propagation: Когда в социальной сети публикуется новый пост, система автоматически уведомляет всех подписчиков, и каждый получает обновление в реальном времени.
Non-blocking: Если вы ждете новые новости, вы не хотите, чтобы ваше приложение зависало и блокировало другие действия. Реактивные приложения обрабатывают данные асинхронно, что означает, что они не блокируют выполнение других задач.
Error Handling: Если что-то идет не так (например, проблемы с сетью), реактивная система может корректно обработать эту ошибку и сообщить вам о ней, не прерывая работы приложения.
Backpressure: Если новости появляются слишком быстро, и система не успевает их обрабатывать, механизм backpressure помогает управлять потоком данных, чтобы не потерять ни одного поста и не перегрузить систему.
Hot and Cold Observables: "Холодные" наблюдаемые начинают работать только тогда, когда кто-то подписывается на них. "Горячие" наблюдаемые вещают данные всем подписчикам, независимо от того, подписаны они сейчас или нет.
Сcheduler (Планировщик): Это как расписание для реактивной системы, которое определяет, когда и как часто система должна проверять данные и отправлять обновления.
Примеры библиотек и фреймворков, поддерживающих реактивное программирование:
• ReactiveX (Reactive Extensions): Набор библиотек для реактивного программирования, включающий RxJava, RxJS, RxSwift и другие.
• RxJava: Библиотека для реактивного программирования на Java, позволяющая работать с асинхронными потоками данных.
• RxJS: Версия ReactiveX для JavaScript, часто используется в сочетании с Angular и другими фронтенд-фреймворками.
• Project Reactor: Реализация реактивного программирования для Java, полностью поддерживающая новый стандарт потоков в Java 9 и выше.
• Kotlin Flow: Встроенная в Kotlin поддержка реактивного программирования, предназначенная для работы с асинхронными потоками данных в Kotlin.
Основные идеи на примере:
Observables: Представьте, что у вас есть источник данных, например, лента новостей в социальной сети. В реактивном программировании этот источник данных — это наблюдаемый, то есть поток, который может эмитировать (отправлять) новые данные (например, новые посты).
Subscribers: Представьте, что вы — подписчик этой ленты новостей. Когда вы подписываетесь на наблюдаемый, вы получаете обновления каждый раз, когда появляется новый пост. Ваш телефон автоматически отображает новые новости, как только они появляются.
Operators: Допустим, вы хотите видеть только новости от ваших друзей. В реактивном программировании вы можете использовать операторы для фильтрации потока данных, чтобы получать только нужные вам сообщения.
Change Propagation: Когда в социальной сети публикуется новый пост, система автоматически уведомляет всех подписчиков, и каждый получает обновление в реальном времени.
Non-blocking: Если вы ждете новые новости, вы не хотите, чтобы ваше приложение зависало и блокировало другие действия. Реактивные приложения обрабатывают данные асинхронно, что означает, что они не блокируют выполнение других задач.
Error Handling: Если что-то идет не так (например, проблемы с сетью), реактивная система может корректно обработать эту ошибку и сообщить вам о ней, не прерывая работы приложения.
Backpressure: Если новости появляются слишком быстро, и система не успевает их обрабатывать, механизм backpressure помогает управлять потоком данных, чтобы не потерять ни одного поста и не перегрузить систему.
Hot and Cold Observables: "Холодные" наблюдаемые начинают работать только тогда, когда кто-то подписывается на них. "Горячие" наблюдаемые вещают данные всем подписчикам, независимо от того, подписаны они сейчас или нет.
Сcheduler (Планировщик): Это как расписание для реактивной системы, которое определяет, когда и как часто система должна проверять данные и отправлять обновления.
Примеры библиотек и фреймворков, поддерживающих реактивное программирование:
• ReactiveX (Reactive Extensions): Набор библиотек для реактивного программирования, включающий RxJava, RxJS, RxSwift и другие.
• RxJava: Библиотека для реактивного программирования на Java, позволяющая работать с асинхронными потоками данных.
• RxJS: Версия ReactiveX для JavaScript, часто используется в сочетании с Angular и другими фронтенд-фреймворками.
• Project Reactor: Реализация реактивного программирования для Java, полностью поддерживающая новый стандарт потоков в Java 9 и выше.
• Kotlin Flow: Встроенная в Kotlin поддержка реактивного программирования, предназначенная для работы с асинхронными потоками данных в Kotlin.
Архитектуры ОС реального времени
В своем развитии ОСРВ строились на основе следующих архитектур:
1) Монолитная архитектура.
ОС определяется как набор модулей, взаимодействующих между собой внутри ядра системы и предоставляющих прикладному ПО входные интерфейсы для обращений к аппаратуре. Основной недостаток этого принципа построения ОС заключается в плохой предсказуемости её поведения, вызванной сложным взаимодействием модулей между собой.
2) Уровневая архитектура.
Прикладное ПО имеет возможность получить доступ к аппаратуре не только через ядро системы и её сервисы, но и напрямую.
По сравнению с монолитной такая архитектура обеспечивает значительно большую степень предсказуемости реакций системы, а также позволяет осуществлять быстрый доступ прикладных приложений к аппаратуре. Главным недостатком таких систем является отсутствие многозадачности.
3) Архитектура «клиент-сервер».
Основной принцип заключается в вынесении сервисов ОС в виде серверов на уровень пользователя и выполнении микроядром функций диспетчера сообщений между клиентскими пользовательскими программами и серверами — системными сервисами.
В своем развитии ОСРВ строились на основе следующих архитектур:
1) Монолитная архитектура.
ОС определяется как набор модулей, взаимодействующих между собой внутри ядра системы и предоставляющих прикладному ПО входные интерфейсы для обращений к аппаратуре. Основной недостаток этого принципа построения ОС заключается в плохой предсказуемости её поведения, вызванной сложным взаимодействием модулей между собой.
2) Уровневая архитектура.
Прикладное ПО имеет возможность получить доступ к аппаратуре не только через ядро системы и её сервисы, но и напрямую.
По сравнению с монолитной такая архитектура обеспечивает значительно большую степень предсказуемости реакций системы, а также позволяет осуществлять быстрый доступ прикладных приложений к аппаратуре. Главным недостатком таких систем является отсутствие многозадачности.
3) Архитектура «клиент-сервер».
Основной принцип заключается в вынесении сервисов ОС в виде серверов на уровень пользователя и выполнении микроядром функций диспетчера сообщений между клиентскими пользовательскими программами и серверами — системными сервисами.
Векторная графика — это формат представления и создания изображений в компьютерной графике. В отличие от растровой графики, которая состоит из пикселей, векторная графика описывает изображение с помощью математических объектов, таких как линии, кривые, многоугольники и текстовые символы.
Основными преимуществами векторной графики являются:
Масштабируемость: Векторные изображения могут быть масштабированы без потери качества и деталей. Это позволяет использовать их как на небольших электронных устройствах, так и на больших печатных материалах, таких как вывески или билборды.
Редактируемость: Векторные изображения легко редактируются. Вы можете изменять цвета, формы, размер и другие атрибуты объектов в изображении без потери качества.
Компактность: Векторные файлы обычно имеют меньший размер, чем растровые. Это делает их идеальным выбором для веб-страниц и электронных документов, где важна скорость загрузки.
Более точное представление: Векторные графики обеспечивают более точное и точное представление форм и линий, чем растровые изображения.
Поддержка прозрачности: Векторные файлы могут содержать прозрачные области, что делает их удобными для создания комплексных изображений с непрямоугольными формами.
Примеры программ, позволяющих создавать и редактировать векторную графику, включают Adobe Illustrator, CorelDRAW, Inkscape, Sketch и Affinity Designer.
Основными преимуществами векторной графики являются:
Масштабируемость: Векторные изображения могут быть масштабированы без потери качества и деталей. Это позволяет использовать их как на небольших электронных устройствах, так и на больших печатных материалах, таких как вывески или билборды.
Редактируемость: Векторные изображения легко редактируются. Вы можете изменять цвета, формы, размер и другие атрибуты объектов в изображении без потери качества.
Компактность: Векторные файлы обычно имеют меньший размер, чем растровые. Это делает их идеальным выбором для веб-страниц и электронных документов, где важна скорость загрузки.
Более точное представление: Векторные графики обеспечивают более точное и точное представление форм и линий, чем растровые изображения.
Поддержка прозрачности: Векторные файлы могут содержать прозрачные области, что делает их удобными для создания комплексных изображений с непрямоугольными формами.
Примеры программ, позволяющих создавать и редактировать векторную графику, включают Adobe Illustrator, CorelDRAW, Inkscape, Sketch и Affinity Designer.
Профилирование в computer science
Профилирование - метод исследования, анализа программного кода и производительности приложения. Оно используется для выявления узких мест и оптимизации производительности приложений.
Может быть проведено на уровне процессора, операционной системы или приложения.
1) На уровне процессора - анализ инструкций процессора для выявления узких мест.
2) На уровне операционной системы - анализ системных вызовов, используемых приложением.
3) На уровне приложения - анализ времени выполнения каждого отдельного блока кода и выделение узких мест, вызывающих замедление приложения.
Профилирование - метод исследования, анализа программного кода и производительности приложения. Оно используется для выявления узких мест и оптимизации производительности приложений.
Может быть проведено на уровне процессора, операционной системы или приложения.
1) На уровне процессора - анализ инструкций процессора для выявления узких мест.
2) На уровне операционной системы - анализ системных вызовов, используемых приложением.
3) На уровне приложения - анализ времени выполнения каждого отдельного блока кода и выделение узких мест, вызывающих замедление приложения.
Количество библиотек и фреймворков для языков программирования может быть очень большим, и оно постоянно растет со временем. Ниже приведены некоторые примеры количества библиотек и фреймворков для некоторых популярных языков программирования:
Python: Python имеет большое количество библиотек и фреймворков, таких как NumPy, Pandas, Django и Flask. Официальный репозиторий пакетов Python - PyPI (Python Package Index) содержит более 300 000 пакетов.
JavaScript: JavaScript также имеет огромную экосистему библиотек и фреймворков. Некоторые из них включают React, Angular, Vue.js, jQuery и Node.js. Официальный репозиторий пакетов JavaScript - npm (Node Package Manager) содержит более 1 миллиона пакетов.
Java: В языке программирования Java существует множество библиотек и фреймворков, включая Spring, Hibernate, Apache Commons и Guava. В Maven Central Repository, одном из наиболее популярных репозиториев Java, доступно более 500 000 артефактов.
C#: C# имеет ряд популярных библиотек и фреймворков, таких как .NET Core,
Ruby: Ruby также имеет большое количество библиотек и фреймворков, таких как Ruby on Rails, Sinatra и RSpec. Официальный репозиторий пакетов Ruby - RubyGems содержит более 180 000 пакетов.
Python: Python имеет большое количество библиотек и фреймворков, таких как NumPy, Pandas, Django и Flask. Официальный репозиторий пакетов Python - PyPI (Python Package Index) содержит более 300 000 пакетов.
JavaScript: JavaScript также имеет огромную экосистему библиотек и фреймворков. Некоторые из них включают React, Angular, Vue.js, jQuery и Node.js. Официальный репозиторий пакетов JavaScript - npm (Node Package Manager) содержит более 1 миллиона пакетов.
Java: В языке программирования Java существует множество библиотек и фреймворков, включая Spring, Hibernate, Apache Commons и Guava. В Maven Central Repository, одном из наиболее популярных репозиториев Java, доступно более 500 000 артефактов.
C#: C# имеет ряд популярных библиотек и фреймворков, таких как .NET Core,
ASP.NET
, Entity Framework и Xamarin. Однако точное количество библиотек и фреймворков для C# неизвестно. (может плохо искал).Ruby: Ruby также имеет большое количество библиотек и фреймворков, таких как Ruby on Rails, Sinatra и RSpec. Официальный репозиторий пакетов Ruby - RubyGems содержит более 180 000 пакетов.
Протокол TCP
Используется для обеспечения надёжной доставки данных на транспортном уровне. Его две основные задачи: сегментация данных и адресация приложений
Но помимо этого протокол обеспечивает:
⁃ Надёжную доставку сегментов
Каждый сегмент маркируется при помощи порядкового номера. После отправки пакетов, протокол ожидает подтверждения от получателя, где находится порядковый номер следующего сегмента. В случае, если такое подтверждение не получено, отправка автоматически повторяется. После некоторого количества неудачных попыток, TCP считает, что адресат не доступен, и сессия разрывается.
⁃ Упорядочивание сегментов при получении
Иногда получатель может получить сегменты не в том порядке, в котором они отправлялись.В этом случае, TCP автоматически пересоберёт их в нужном порядке, используя всё то же поле порядковых номеров, и передаст после склейки на уровень приложений.
⁃ Работу с сессиями
Перед началом передачи пакетов, когда TCP убеждается в том, что получатель существует и готов принимать данные, тогда открывается сессия. После передачи пакетов, сессия закрывается.
⁃ Контроль за скоростью передачи
Благодаря механизму скользящего окна, TCP может корректировать скорость отправки пакетов в зависимости от возможностей получателя.
Используется для обеспечения надёжной доставки данных на транспортном уровне. Его две основные задачи: сегментация данных и адресация приложений
Но помимо этого протокол обеспечивает:
⁃ Надёжную доставку сегментов
Каждый сегмент маркируется при помощи порядкового номера. После отправки пакетов, протокол ожидает подтверждения от получателя, где находится порядковый номер следующего сегмента. В случае, если такое подтверждение не получено, отправка автоматически повторяется. После некоторого количества неудачных попыток, TCP считает, что адресат не доступен, и сессия разрывается.
⁃ Упорядочивание сегментов при получении
Иногда получатель может получить сегменты не в том порядке, в котором они отправлялись.В этом случае, TCP автоматически пересоберёт их в нужном порядке, используя всё то же поле порядковых номеров, и передаст после склейки на уровень приложений.
⁃ Работу с сессиями
Перед началом передачи пакетов, когда TCP убеждается в том, что получатель существует и готов принимать данные, тогда открывается сессия. После передачи пакетов, сессия закрывается.
⁃ Контроль за скоростью передачи
Благодаря механизму скользящего окна, TCP может корректировать скорость отправки пакетов в зависимости от возможностей получателя.
Протокол UDP
Один из основных протоколов, расположенных непосредственно над IP.Он предоставляет прикладным процессам транспортные услуги, немногим отличающиеся от услуг протокола IP.
Протокол UDP обеспечивает доставку дейтограмм, но не требует подтверждения их получения. Он не требует соединения с удаленным модулем UDP.
К заголовку IP-пакета UDP добавляет поля порт отправителя и порт получателя, которые обеспечивают мультиплексирование информации между различными прикладными процессами, а также поля длина UDP-дейтограммы и контрольная сумма байт, позволяющие поддерживать целостность данных.
Таким образом, если на уровне IP для определения места доставки пакета используется адрес, на уровне UDP - номер порта.
Один из основных протоколов, расположенных непосредственно над IP.Он предоставляет прикладным процессам транспортные услуги, немногим отличающиеся от услуг протокола IP.
Протокол UDP обеспечивает доставку дейтограмм, но не требует подтверждения их получения. Он не требует соединения с удаленным модулем UDP.
К заголовку IP-пакета UDP добавляет поля порт отправителя и порт получателя, которые обеспечивают мультиплексирование информации между различными прикладными процессами, а также поля длина UDP-дейтограммы и контрольная сумма байт, позволяющие поддерживать целостность данных.
Таким образом, если на уровне IP для определения места доставки пакета используется адрес, на уровне UDP - номер порта.
Обзор протокола HTTP
Изначально протокол передачи HTML-документов. Сейчас же он используется для передачи произвольных данных в интернете. Он является протоколом клиент-серверного взаимодействия без сохранения промежуточного состояния. В роли клиента чаще всего выступает веб-браузер, хотя может быть и, например, поисковый робот. Для обмена информацией протокол HTTP в большинстве случаев использует TCP/IP.
HTTP имеет расширение HTTPS, которое поддерживает шифрование. Данные в нём передаются поверх криптографического протокола TLS.
HTTP, как правило, прост и удобен для восприятия человеком. HTTP-сообщения могут читаться и пониматься людьми, обеспечивая более лёгкое тестирование разработчиков и уменьшенную сложность для новых пользователей.
Изначально протокол передачи HTML-документов. Сейчас же он используется для передачи произвольных данных в интернете. Он является протоколом клиент-серверного взаимодействия без сохранения промежуточного состояния. В роли клиента чаще всего выступает веб-браузер, хотя может быть и, например, поисковый робот. Для обмена информацией протокол HTTP в большинстве случаев использует TCP/IP.
HTTP имеет расширение HTTPS, которое поддерживает шифрование. Данные в нём передаются поверх криптографического протокола TLS.
HTTP, как правило, прост и удобен для восприятия человеком. HTTP-сообщения могут читаться и пониматься людьми, обеспечивая более лёгкое тестирование разработчиков и уменьшенную сложность для новых пользователей.
SSH
Протокол для удалённого управления операционной системой с использованием TCP. В SSH шифруется весь трафик, причём с возможностью выбора алгоритма шифрования. В основном это нужно для передачи паролей и другой важной информации.
Также SSH позволяет обрабатывать любые другие протоколы передачи. Это значит, что кроме удалённого управления компьютером, через протокол можно пропускать любые файлы или даже аудио/видео поток.
SSH часто применяется при работе с хостингами, когда клиент может удалённо подключиться к серверу и работать уже оттуда.
Он безопасен, поскольку оба компьютера могут шифровать и дешифровать сообщения с использованием симметричных ключей.
Протокол для удалённого управления операционной системой с использованием TCP. В SSH шифруется весь трафик, причём с возможностью выбора алгоритма шифрования. В основном это нужно для передачи паролей и другой важной информации.
Также SSH позволяет обрабатывать любые другие протоколы передачи. Это значит, что кроме удалённого управления компьютером, через протокол можно пропускать любые файлы или даже аудио/видео поток.
SSH часто применяется при работе с хостингами, когда клиент может удалённо подключиться к серверу и работать уже оттуда.
Он безопасен, поскольку оба компьютера могут шифровать и дешифровать сообщения с использованием симметричных ключей.
Протокол NTP
Не все протоколы передачи нужны для обмена классического вида информацией. NTP — протокол для синхронизации локальных часов устройства со временем в сети.
Он использует алгоритм Марзулло (алгоритм согласования данных, использующийся для выбора более точных источников для оценки точного времени из ряда источников времени, разной степени точности и усреднения времени). Благодаря нему протокол выбирает более точный источник времени.
NTP работает поверх UDP — поэтому ему удаётся достигать большой скорости передачи данных. Протокол достаточно устойчив к изменениям задержек в сети.
Последняя версия NTPv4 способна достигать точности 10мс в интернете и до 0,2мс в локальных сетях.
Не все протоколы передачи нужны для обмена классического вида информацией. NTP — протокол для синхронизации локальных часов устройства со временем в сети.
Он использует алгоритм Марзулло (алгоритм согласования данных, использующийся для выбора более точных источников для оценки точного времени из ряда источников времени, разной степени точности и усреднения времени). Благодаря нему протокол выбирает более точный источник времени.
NTP работает поверх UDP — поэтому ему удаётся достигать большой скорости передачи данных. Протокол достаточно устойчив к изменениям задержек в сети.
Последняя версия NTPv4 способна достигать точности 10мс в интернете и до 0,2мс в локальных сетях.
Краткие характеристики сетевых протоколов
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 является распределенной системой имен, состоящей из иерархически организованных серверов.
За годы были выпущены несколько стандартов Bluetooth, каждый со своими функциями и улучшениями.
Bluetooth 1.0: Первый стандарт Bluetooth, выпущенный в 1998 году, который ввел основные принципы технологии Bluetooth.
Bluetooth 1.1: 2001 год. Стандарт улучшил скорость передачи данных и добавил поддержку нешифрованной передачи данных.
Bluetooth 1.2: 2003 год. Стандарт ввел адаптивное скачкообразное хоппинг, которое улучшило устойчивость к радиопомехам.
Bluetooth 2.0: 2004 год. Стандарт ввел Улучшенный режим передачи данных (EDR), который увеличил скорость передачи данных до 3 Мбит/с.
Bluetooth 2.1: 2007 год. Стандарт ввел Безопасное простое спаривание, которое улучшило процесс спаривания между устройствами.
Bluetooth 3.0: 2009 год. Стандарт ввел Высокоскоростную передачу данных (HS), которая позволила передавать данные со скоростью до 24 Мбит/с.
Bluetooth 4.0: 2010 год. Стандарт ввел Технологию низкого энергопотребления (LE), которая уменьшила потребление энергии и позволила устройствам работать в течение лет на одном аккумуляторе.
Bluetooth 4.1: 2013 год. Стандарт улучшил скорость передачи данных и ввел поддержку устройств Bluetooth Smart и Smart Ready.
Bluetooth 4.2: 2014 год. Стандарт ввел Подключение к интернету по протоколу IP, которое позволило устройствам подключаться напрямую к интернету.
Bluetooth 5.0: 2016 год. Стандарт учетверил диапазон устройств Bluetooth, удвоил скорость и увеличил емкость вещания.
Bluetooth 5.1: 2020 год. Стандарт ввел улучшения в направлении нахождения и услугах определения местоположения.
Bluetooth 1.0: Первый стандарт Bluetooth, выпущенный в 1998 году, который ввел основные принципы технологии Bluetooth.
Bluetooth 1.1: 2001 год. Стандарт улучшил скорость передачи данных и добавил поддержку нешифрованной передачи данных.
Bluetooth 1.2: 2003 год. Стандарт ввел адаптивное скачкообразное хоппинг, которое улучшило устойчивость к радиопомехам.
Bluetooth 2.0: 2004 год. Стандарт ввел Улучшенный режим передачи данных (EDR), который увеличил скорость передачи данных до 3 Мбит/с.
Bluetooth 2.1: 2007 год. Стандарт ввел Безопасное простое спаривание, которое улучшило процесс спаривания между устройствами.
Bluetooth 3.0: 2009 год. Стандарт ввел Высокоскоростную передачу данных (HS), которая позволила передавать данные со скоростью до 24 Мбит/с.
Bluetooth 4.0: 2010 год. Стандарт ввел Технологию низкого энергопотребления (LE), которая уменьшила потребление энергии и позволила устройствам работать в течение лет на одном аккумуляторе.
Bluetooth 4.1: 2013 год. Стандарт улучшил скорость передачи данных и ввел поддержку устройств Bluetooth Smart и Smart Ready.
Bluetooth 4.2: 2014 год. Стандарт ввел Подключение к интернету по протоколу IP, которое позволило устройствам подключаться напрямую к интернету.
Bluetooth 5.0: 2016 год. Стандарт учетверил диапазон устройств Bluetooth, удвоил скорость и увеличил емкость вещания.
Bluetooth 5.1: 2020 год. Стандарт ввел улучшения в направлении нахождения и услугах определения местоположения.
Сериализация - процесс преобразования объекта или структуры данных в формат, который можно хранить или передавать по сети.
Существует несколько форматов сериализации, каждый со своими сильными и слабыми сторонами:
1. JSON (JavaScript Object Notation)
JSON - легковесный формат, который широко используется в веб-приложениях. Он легко парсится и генерируется. Поддерживается большинством языков программирования.
Пример:
2. XML (Extensible Markup Language)
XML - это язык разметки, который используется для хранения и передачи данных. Он подробный, но обеспечивает высокую степень гибкости и настройки.
Пример:
3. CSV (Comma Separated Values)
CSV - это текстовый формат, который используется для хранения табличных данных. Он прост и легко парсится, но не поддерживает сложные структуры данных.
Пример:
4. Avro
Бинарный формат сериализации, который используется в больших данных и распределенных системах. Он компактен и эффективен, но требует определения схемы заранее.
5. Protocol Buffers
Бинарный формат сериализации, разработанный Google. Он компактен и эффективен, и обеспечивает высокую степень гибкости и настройки.
6. YAML (YAML Ain't Markup Language)
Человеко-читаемый формат, который используется для конфигурационных файлов и обмена данными. Он легко читается и пишется, но может быть подробным.
Пример:
7. MessagePack
Бинарный формат сериализации, который подобен JSON, но более компактен и эффективен.
Существует несколько форматов сериализации, каждый со своими сильными и слабыми сторонами:
1. JSON (JavaScript Object Notation)
JSON - легковесный формат, который широко используется в веб-приложениях. Он легко парсится и генерируется. Поддерживается большинством языков программирования.
Пример:
{"имя": "Алиса", "возраст": 25}
2. XML (Extensible Markup Language)
XML - это язык разметки, который используется для хранения и передачи данных. Он подробный, но обеспечивает высокую степень гибкости и настройки.
Пример:
<person><имя>Алиса</имя><возраст>25</возраст></person>
3. CSV (Comma Separated Values)
CSV - это текстовый формат, который используется для хранения табличных данных. Он прост и легко парсится, но не поддерживает сложные структуры данных.
Пример:
имя,возраст\nАлиса,25\n
4. Avro
Бинарный формат сериализации, который используется в больших данных и распределенных системах. Он компактен и эффективен, но требует определения схемы заранее.
5. Protocol Buffers
Бинарный формат сериализации, разработанный Google. Он компактен и эффективен, и обеспечивает высокую степень гибкости и настройки.
6. YAML (YAML Ain't Markup Language)
Человеко-читаемый формат, который используется для конфигурационных файлов и обмена данными. Он легко читается и пишется, но может быть подробным.
Пример:
имя: Алиса\nвозраст: 25
7. MessagePack
Бинарный формат сериализации, который подобен JSON, но более компактен и эффективен.
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 Тбайт.
Wi-Fi обычно работает на двух основных частотах: 2.4 ГГц и 5 ГГц.
• 2.4 ГГц
Преимущества: Лучшее покрытие и большая дальность действия.
Недостатки: Более загруженная частота, подвержена помехам от других устройств (например, микроволновок, беспроводных телефонов).
• 5 ГГц
Преимущества: Более высокая скорость передачи данных и меньшее количество помех.
Недостатки: Меньшее покрытие и более слабое проникновение через стены.
Соответственно, если нужна скорость, лучше выбрать 5 ГГц, а для большого покрытия — 2.4 ГГц.
• 2.4 ГГц
Преимущества: Лучшее покрытие и большая дальность действия.
Недостатки: Более загруженная частота, подвержена помехам от других устройств (например, микроволновок, беспроводных телефонов).
• 5 ГГц
Преимущества: Более высокая скорость передачи данных и меньшее количество помех.
Недостатки: Меньшее покрытие и более слабое проникновение через стены.
Соответственно, если нужна скорость, лучше выбрать 5 ГГц, а для большого покрытия — 2.4 ГГц.
Web scraping
Скрапинг — стандартная процедура для сбора необходимой информации. Для этих целей применяется специализированное программное обеспечение.
С помощью веб-скрейпинга информация собирается в автоматическом режиме по заданным параметрам, структурируется и записывается в файл для дальнейшего анализа.
Такой метод подходит для сбора статистики, стоимости различных офферов, получения данных о товарах в каталогах.
Скрапинг — стандартная процедура для сбора необходимой информации. Для этих целей применяется специализированное программное обеспечение.
С помощью веб-скрейпинга информация собирается в автоматическом режиме по заданным параметрам, структурируется и записывается в файл для дальнейшего анализа.
Такой метод подходит для сбора статистики, стоимости различных офферов, получения данных о товарах в каталогах.
Законно ли это? Если боитесь собирать данные с сайтов, то лучше не стоит, но все, что находится в открытом доступе, можно собирать.
EXE (Windows Executable)
Структура:
• DOS Header: Первые 64 байта, служат для обратной совместимости с DOS. Содержит метку "MZ".
• PE Header: Заголовок Portable Executable, содержащий информацию о типе файла, секциях, размерах, точках входа и т. д.
• Секции:
• Import Table: Содержит список используемых внешних функций и библиотек.
Использование:
• EXE файлы запускаются через двойной щелчок или через командную строку Windows.
• Поддерживает графические интерфейсы и консольные приложения.
ELF (Executable and Linkable Format)
Структура:
• ELF Header: Содержит информацию о типе файла (исполняемый, объектный и т. д.), архитектуре, размере заголовка и других метаданных.
• Program Header Table: Описывает сегменты, которые будут загружены в память.
• Section Header Table: Описывает секции файла (например, .text, .data, .bss и другие).
• Секции:
Использование:
• ELF файлы запускаются через терминал в UNIX-подобных системах или через графические оболочки.
• Поддерживает динамическую линковку, позволяя использовать библиотеки во время выполнения.
Ключевые различия:
• EXE предназначен для Windows, ELF — для Linux и других UNIX-подобных систем.
• ELF более модульный и гибкий, поддерживает динамическую линковку и различные типы секций.
• ELF включает больше информации о типах данных и секциях, что упрощает работу компиляторов и отладчиков.
Структура:
• 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 включает больше информации о типах данных и секциях, что упрощает работу компиляторов и отладчиков.
Задача о максимальном потоке в сети
Основная цель таких задач — определить максимальный поток, который можно транспортировать из источника (источник) в сток (пункт назначения) через сеть, состоящую из узлов и рёбер, имеющих ограниченные пропускные способности.
Основные понятия:
• Граф: Сеть представляется в виде направленного графа, где узлы — это точки, а рёбра — это связи между ними с заданными пропускными способностями.
• Поток: Это количество "ресурса" (например, воды, информации), передаваемого от источника к стоку через сеть.
• Пропускная способность: Максимальное количество потока, которое может проходить через ребро.
Основные алгоритмы:
• Алгоритм Форда-Фалкерсона: Базовый алгоритм, который использует метод увеличивающих путей. На каждой итерации ищется путь от источника к стоку, по которому можно увеличить поток.
• Алгоритм Эдмондса-Карпа: Это улучшенная версия алгоритма Форда-Фалкерсона, использующая поиск в ширину (BFS) для нахождения увеличивающих путей, что обеспечивает полиномиальную временную сложность.
• Алгоритм Линка: Использует метод "потока по потоку" и подходит для больших и сложных сетей.
Применение:
• Логистика: Оптимизация транспортировки товаров.
• Телекоммуникации: Управление пропускной способностью сетей.
• Электросети: Оптимизация распределения электроэнергии.
Основная цель таких задач — определить максимальный поток, который можно транспортировать из источника (источник) в сток (пункт назначения) через сеть, состоящую из узлов и рёбер, имеющих ограниченные пропускные способности.
Основные понятия:
• Граф: Сеть представляется в виде направленного графа, где узлы — это точки, а рёбра — это связи между ними с заданными пропускными способностями.
• Поток: Это количество "ресурса" (например, воды, информации), передаваемого от источника к стоку через сеть.
• Пропускная способность: Максимальное количество потока, которое может проходить через ребро.
Основные алгоритмы:
• Алгоритм Форда-Фалкерсона: Базовый алгоритм, который использует метод увеличивающих путей. На каждой итерации ищется путь от источника к стоку, по которому можно увеличить поток.
• Алгоритм Эдмондса-Карпа: Это улучшенная версия алгоритма Форда-Фалкерсона, использующая поиск в ширину (BFS) для нахождения увеличивающих путей, что обеспечивает полиномиальную временную сложность.
• Алгоритм Линка: Использует метод "потока по потоку" и подходит для больших и сложных сетей.
Применение:
• Логистика: Оптимизация транспортировки товаров.
• Телекоммуникации: Управление пропускной способностью сетей.
• Электросети: Оптимизация распределения электроэнергии.
Пример задачи:
Предположим, у вас есть сеть с 4 узлами: A (источник), B, C и D (сток). Рёбра между узлами имеют следующие пропускные способности:
A → B: 3
A → C: 2
B → D: 2
C → D: 3
Необходимо определить максимальный поток из A в D.
Решение может быть найдено с использованием одного из алгоритмов, например, алгоритма Эдмондса-Карпа.
Штрих-коды — универсальный способ представления данных о товарах с помощью черных и белых полос.
Основные стандарты, такие как UPC (Universal Product Code) и EAN (European Article Number), позволяют однозначно идентифицировать продукт. Когда штрих-код сканируется, лазерный сканер считывает отражение света, преобразуя его в последовательность нулей и единиц. Эти данные отправляются в базу, где происходит сопоставление с информацией о товаре, такой как цена и описание.
Стандарты штрих-кодов различаются по формату, области применения и количеству закодированной информации. UPC, например, используется в основном в США и Канаде и состоит из 12 цифр, в то время как EAN, более распространенный в Европе, может иметь 13 цифр. ISBN (International Standard Book Number) применяется для книг и имеет уникальный формат. QR-коды, хотя и не являются традиционными штрих-кодами, могут содержать гораздо больше данных, включая ссылки и текст.
Основные стандарты, такие как UPC (Universal Product Code) и EAN (European Article Number), позволяют однозначно идентифицировать продукт. Когда штрих-код сканируется, лазерный сканер считывает отражение света, преобразуя его в последовательность нулей и единиц. Эти данные отправляются в базу, где происходит сопоставление с информацией о товаре, такой как цена и описание.
Стандарты штрих-кодов различаются по формату, области применения и количеству закодированной информации. UPC, например, используется в основном в США и Канаде и состоит из 12 цифр, в то время как EAN, более распространенный в Европе, может иметь 13 цифр. ISBN (International Standard Book Number) применяется для книг и имеет уникальный формат. QR-коды, хотя и не являются традиционными штрих-кодами, могут содержать гораздо больше данных, включая ссылки и текст.
Группы, кольца, поля и булевы алгебры — это основные структуры в абстрактной алгебре.
Кратко про каждую из них:
Группа
Это множество
1. Замкнутость:
2. Ассоциативность:
3. Наличие единичного элемента: существует элемент
4. Наличие обратного элемента: для каждого
Кольцо
Это множество
1.
2. Умножение
3. Умножение дистрибутивно относительно сложения:
Некоторые кольца имеют единичный элемент (не нулевой), а некоторые могут быть коммутативными (где
Поле
Поле — это кольцо
1.
2. Умножение в поле коммутативно.
3. Все элементы поля, кроме нуля, имеют мультипликативный обратный.
Примеры полей: рациональные числа, действительные числа, комплексные числа.
Булевы алгебры
Булева алгебра — это структура, состоящая из множества 𝐵, элементов которого можно интерпретировать как логические значения (истина и ложь), и операций
1. Ассоциативность:
2. Коммутативность:
3. Дистрибутивность:
4. Наличие нейтральных элементов: существуют элементы
5. Закон исключенного третьего: для любого 𝑎 a выполняется
Кратко про каждую из них:
Группа
Это множество
𝐺
с операцией ∗
, которая удовлетворяет четырем аксиомам: 1. Замкнутость:
𝑎, 𝑏 ∈ 𝐺 ⇒ 𝑎∗𝑏 ∈ 𝐺
2. Ассоциативность:
(𝑎∗𝑏)∗𝑐 = 𝑎∗(𝑏∗𝑐)
для всех 𝑎, 𝑏, 𝑐 ∈ 𝐺
3. Наличие единичного элемента: существует элемент
𝑒 ∈ 𝐺
, такой что 𝑒∗𝑎 = 𝑎∗𝑒 = 𝑎
для всех 𝑎 ∈ 𝐺
4. Наличие обратного элемента: для каждого
𝑎 ∈ 𝐺
существует 𝑏 ∈ 𝐺
такой, что 𝑎∗𝑏 = 𝑏∗𝑎 = 𝑒
Кольцо
Это множество
𝑅
с двумя операциями +
и ⋅
, которые удовлетворяют следующим условиям: 1.
(𝑅,+)
— абелева группа. 2. Умножение
⋅
ассоциативно: 𝑎⋅(𝑏⋅𝑐) = (𝑎⋅𝑏)⋅𝑐
. 3. Умножение дистрибутивно относительно сложения:
𝑎⋅(𝑏+𝑐) = 𝑎⋅𝑏 + 𝑎⋅𝑐 и (𝑎+𝑏) ⋅ 𝑐 = 𝑎⋅𝑐+𝑏⋅𝑐
. Некоторые кольца имеют единичный элемент (не нулевой), а некоторые могут быть коммутативными (где
𝑎⋅𝑏 = 𝑏⋅𝑎)
. Поле
Поле — это кольцо
𝐹
с дополнительными свойствами: 1.
(𝐹∖{0},⋅)
— абелева группа (каждый ненулевой элемент имеет обратный). 2. Умножение в поле коммутативно.
3. Все элементы поля, кроме нуля, имеют мультипликативный обратный.
Примеры полей: рациональные числа, действительные числа, комплексные числа.
Булевы алгебры
Булева алгебра — это структура, состоящая из множества 𝐵, элементов которого можно интерпретировать как логические значения (истина и ложь), и операций
∧
(конъюнкция), ∨
(дизъюнкция) и ¬
(отрицание), которые удовлетворяют следующим аксиомам: 1. Ассоциативность:
𝑎∧(𝑏∧𝑐) = (𝑎∧𝑏)∧𝑐
и аналогично для ∨
. 2. Коммутативность:
𝑎∧𝑏 = 𝑏∧𝑎
и аналогично для ∨
. 3. Дистрибутивность:
𝑎∧(𝑏∨𝑐) = (𝑎∧𝑏) ∨ (𝑎∧𝑐)
. 4. Наличие нейтральных элементов: существуют элементы
0
и 1
, такие что 𝑎∧1 = 𝑎 и 𝑎∨0 = 𝑎
. 5. Закон исключенного третьего: для любого 𝑎 a выполняется
𝑎∨¬𝑎 = 1
.