День системного администратора 2026
Главная - Новости

Книга создана по мотивам подлинной истории, случившейся в Якутии двести лет назад. У подножья величественных Верхоянских гор якутские охотники нашли маленькую девочку по имени Кындыкан. Она оказалась единственной выжившей в эвенском стойбище, полностью вымершем от оспы.
Спасенная Кындыкан выросла, получила церковное имя Попова Мария Андреевна и прожила долгую жизнь — больше ста лет, оставив после себя много потомков. Илаан-Маргарита Попова — одна из них — стала вдохновительницей и инициатором появления этой сказки, в которой переплелись исторические факты, древние предания и обычаи эвенов. История о силе и стойкости духа всех коренных народов уже стала этно-брендом — масштабным проектом, несущим миссию сохранить и популяризовать культуру народов Севера и Арктики.
Эта история случилась двести лет назад в эвенском стойбище. Коварная и неизвестная тогда оспа пряталась в нартах с мехами и заморскими товарами. И безобидная покупка на ярмарке обернулась бедой — болезнь вырвалась на волю и захватила всё на своем пути. В живых осталась только девочка Кындыкан, которую духи посчитали достойной продолжить свой род. Кындыкан отправляется на поиски людей, у которых надеется найти спасение и приют. Олень Гиркэ и горностай Кока становятся верными друзьями девочки на этом опасном пути.
Благодаря потомку Кындыкан Илаан-Маргарите Поповой и писательнице из Якутска Лидии Туллук эта история стала литературной сказкой. По ней вышел мультфильм и поставлено три детских спектакля.
Эта книга о чуде, силе рода, торжестве жизни. Посвящается таким малочисленным, но стойким людям — всем коренным народам Севера!
Книгу “Невероятная история Кындыкан. Эвенская сказка” можно купить в нашем интенет-магазине.

Книга представляет собой практическое руководство по интеграции искусственного интеллекта в процесс разработки на Python. Рассматривается применение ИИ-ассистентов, включая ChatGPT и аналогичные языковые модели, для повышения эффективности на всех этапах жизненного цикла ПО: от сбора требований и проектирования до написания кода, тестирования, развертывания и мониторинга. На примере сквозного проекта (USB T-Shirt Launcher) и реальных сценариев шаг за шагом показано, как использовать ИИ для автоматизации рутинных задач, генерации чистого и безопасного кода, рефакторинга по принципам SOLID, написания тестов, настройки CI/CD и развертывания в облаке. Изложенная методология универсальна и позволяет применять описанные принципы с любым доступным ИИ-инструментом, превращая его в эффективного помощника для ускорения разработки и повышения качества кода.
ИИ-агент — это программа, которая не просто рассуждает, а сама выполняет действия: ищет информацию в Интернете или локальных файлах, сохраняет данные и многое другое.
Разработка таких агентов — самое перспективное направление в программировании сегодня. А главный инструмент для их создания — библиотека LangChain.
Хотите научиться писать ИИ-агентов на Python с помощью LangChain и построить карьеру в IT? Эта книга для вас.
На трёх простых примерах вы быстро и легко освоите основы ИИ-программирования, научитесь создавать агентов, подключать любые языковые модели, доступные в России, работать с сообщениями, разрабатывать собственные инструменты.
Вы узнаете о продвинутых темах: посредники, управление состоянием и контекстом, прерывания, RAG-агенты, мультиагентные системы, протокол MCP, мультимодальные сообщения. А также реализуете агентов в виде Telegram-ботов, веб-приложений и графических интерфейсов.
Книга содержит множество примеров, листингов и готовых учебных программ, многие из которых пригодятся на практике.

Дронов Владимир Александрович, профессиональный программист, писатель и журналист, работает с компьютерами с 1987 года. Автор более 30 популярных компьютерных книг, в том числе «Django 2.1. Практика создания веб-сайтов на Python», “HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера“, «Python 3. Самое необходимое», «Python 3 и PyQt 5. Разработка приложений», “Laravel. Быстрая разработка современных динамических Web-сайтов на PHP, MySQL, HTML и CSS“, “Angular 4. Быстрая разработка сверхдинамических Web-сайтов на TypeScript и PHP” и книг по продуктам Adobe Flash и Adobe Dreamweaver различных версий. Его статьи публикуются в журналах “Мир ПК” и “ИнтерФейс” (Израиль) и интернет-порталах “IZ City” и “TheVista.ru”.
Книгу “Искусственный интеллект с LangChain. Разработка ИИ-агентов на Python” можно купить в нашем интенет-магазине.
Предисловие 13
ИИ-клиенты и ИИ-агенты. Преимущества ИИ-агентов 13
Почему LangChain? 14
Использованные программные продукты 15
Типографские соглашения 16
ЧАСТЬ I. ВВОДНЫЙ КУРС 19
Глава 1. ИИ-клиент и простой ИИ-агент 21
1.1. Выбор большой языковой модели. GigaChat 21
1.2. Регистрация в личном кабинете GigaChat API и получение ключа авторизации 21
1.3. ИИ-клиент 22
1.3.1. Установка необходимых библиотек 23
1.3.2. Написание ИИ-клиента 23
1.4. Простой ИИ-агент 25
1.4.1. Простой ИИ-агент: создание агента LangChain 25
1.4.2. Простой ИИ-агент: работа с сообщениями 26
1.4.3. Простой ИИ-агент: инструмент 27
1.4.4. Простой ИИ-агент: вводная (системный промпт) 29
1.4.5. Простой ИИ-агент: история сообщений, состояние агента и хранилище состояния 31
1.5. Что еще нужно знать о больших языковых моделях, библиотеке LangChain
и не только? 32
Глава 2. Более сложный ИИ-агент 34
2.1. Более сложный ИИ-агент: начало разработки 34
2.2. Более сложный ИИ-агент: база данных пицц 36
2.3. Более сложный ИИ-агент: инструменты 37
2.3.1. Инструменты, часть 1 37
2.3.2. Инструменты, часть 2 38
2.3.3. Инструменты, часть 3 39
2.4. Более сложный ИИ-агент: вводная 42
2.5. Более сложный ИИ-агент: очистка истории. Посредники 44
2.6. Что еще нужно знать о посредниках, очистке истории и не только? 46
ЧАСТЬ II. БИБЛИОТЕКА LANGCHAIN: ОСНОВНЫЕ ВОЗМОЖНОСТИ 49
Глава 3. Установка библиотеки LangChain. Агенты LangChain 51
3.1. Понятие и назначение агента LangChain 51
3.2. Создание агента LangChain 51
3.3. Задание вводной у агента 53
3.4. Работа агента LangChain 54
3.5. Понятия состояния, общего хранилища и контекста агента LangChain 54
Глава 4. Соединение с языковой моделью 56
4.1. Создание соединения с языковой моделью 56
4.1.1. Использование функции init_chat_model() 56
4.1.1.1. Остальные параметры соединения 58
4.1.2. Использование классов соединений 59
4.2. Поддерживаемые языковые модели и соединение с ними 60
4.2.1. Облачные языковые модели 60
4.2.1.1. «Сбер» GigaChat 60
4.2.1.2. Google Gemini 62
4.2.1.3. YandexGPT 63
4.2.1.4. DeepSeek 65
4.2.2. HuggingFace 66
4.2.3. Ollama 68
Глава 5. Сообщения 70
5.1. Классы сообщений 70
5.1.1. BaseMessage 70
5.1.2. AIMessage 71
5.1.3. ToolMessage 72
5.1.4. Примеры сообщений разных разновидностей 72
5.2. Отправка вопросов и получение ответов: обычный режим 73
5.2.1. Отправка вопроса и получение ответа целиком: обычный режим 74
5.2.1.1. Отправка вопроса с указанием выдать ответ целиком: обычный режим 74
5.2.1.2. Получение ответа целиком: обычный режим 75
5.2.2. Отправка вопроса и получение ответа чанками: обычный режим 76
5.3. Отправка вопросов и получение ответов: конкурентный режим 78
5.4. Отладочный вывод сообщений 79
5.5. Что еще нужно знать о сообщениях? 82
Глава 6. Структурированный вывод 83
6.1. Объявление структуры вывода 83
6.1.1. Типизированные словари 83
6.1.2. Датаклассы 86
6.1.3. Модели Pydantic 86
6.2. Задание структуры вывода 88
6.3. Получение структурированного вывода 88
6.4. Обработка ошибок структурирования вывода 89
6.5. Программа для обработки почтовых адресов 91
6.5.1. Обработчик почтовых адресов: соединение с моделью, вводная и структура адреса 91
6.5.2. Обработчик почтовых адресов: агент и стартовый модуль 92
6.6. Мультиструктурный вывод 95
6.7. Структурированный вывод и языковые модели GigaChat 96
6.8. Что еще нужно знать о структурированном выводе? 97
Глава 7. Инструменты, часть 1 99
7.1. Объявление инструментов 99
7.1.1. Объявление инструментов-функций 99
7.1.2. Объявление инструментов-классов 102
7.2. Указание инструментов при создании агента 103
Глава 8. Инструменты, часть 2 105
8.1. Поиск в Интернете 105
8.1.1. DuckDuckGo 105
8.1.1.1. DuckDuckGo: базовый вывод 106
8.1.1.2. DuckDuckGo: расширенный вывод 106
8.1.1.3. DuckDuckGo: настройки поиска 107
8.1.2. Tavily Search 108
8.2. Поиск на отдельных веб-сайтах 110
8.2.1. Википедия 110
8.2.2. Wikidata 111
8.2.3. Google Books 112
8.3. Работа с базами данных 113
8.3.1. Создание пула соединений с базой данных 114
8.3.2. Создание объекта самой базы данных 115
8.3.3. Создание набора инструментов для работы с базой данных 116
8.3.4. Указание инструментов при создании агента 117
8.3.5. ИИ-программа телефонного справочника 118
8.3.5.1. ИИ-телефонный справочник: соединение с языковой моделью и вводная 118
8.3.5.2. ИИ-телефонный справочник: инструменты для работы
с базой данных 119
8.3.5.3. ИИ-телефонный справочник: агент и остальные модули 119
8.4. Работа с локальными файлами 121
8.4.1. Создание набора инструментов для работы с локальными файлами 121
8.4.2. ИИ-программа для создания заготовок программного кода 122
8.5. Что еще нужно знать об инструментах? 123
Глава 9. Работа с историей сообщений 124
9.1. Доступ к истории сообщений 124
9.1.1. Доступ к истории сообщений в инструментах 124
9.1.2. Доступ к истории сообщений в посредниках 125
9.2. Работа с историей сообщений 126
9.3. Внесение изменений в историю сообщений 127
9.4. Очистка истории сообщений 128
9.4.1. Непосредственное удаление сообщений 128
9.4.2. Обрезка истории 129
9.4.2.1. Обрезка истории: делаем сами 129
9.4.2.2. Обрезка истории: используем функцию trim_messages() 129
9.4.3. Удаление результатов вызова инструментов 131
9.4.4. Подведение итогов 132
ЧАСТЬ III. БИБЛИОТЕКА LANGCHAIN:
РАСШИРЕННЫЕ ВОЗМОЖНОСТИ 135
Глава 10. Посредники, часть 1 137
10.1. Посредники однократного вызова 137
10.1.1. Объявление посредников однократного вызова 137
10.1.2. Результаты, возвращаемые посредниками однократного вызова 139
10.1.2.1. None — не делать ничего 139
10.1.2.2. Сообщения — добавить их в историю 140
10.1.2.3. Команда перехода 140
10.2. Посредники двукратного вызова 141
10.2.1. Объявление посредников двукратного вызова 141
10.2.2. Работа посредников двукратного вызова 143
10.2.3. Классы запроса к языковой модели, вызова инструмента и результата, выданного языковой моделью 143
10.2.3.1. Класс ModelRequest: обращение к языковой модели 143
10.2.3.2. Класс ToolCallRequest: обращение к инструменту 145
10.2.3.3. Класс ModelResponse: результат обращения к языковой модели 145
10.2.4. Результаты, возвращаемые посредниками двукратного вызова 146
10.2.4.1. Изначальный результат обращения к языковой модели
или вызова инструмента 146
10.2.4.2. Результат, сгенерированный посредником 147
10.3. Посредники, создающие вводные 149
10.4. Посредники-классы 150
10.5. Указание посредников при создании агента 152
10.6. Последовательность выполнения посредников 152
Глава 11. Посредники, часть 2 154
11.1. LLMToolSelectorMiddleware: выбор используемых инструментов 154
11.2. ModelCallLimitMiddleware: ограничение количества обращений
к языковой модели 155
11.3. ToolCallLimitMiddleware: ограничение количества вызовов инструмента 156
11.4. ShellToolMiddleware: выполнение команд системной консоли 157
11.5. FilesystemFileSearchMiddleware: поиск файлов 160
11.6. TodoListMiddleware: список запланированных дел 161
11.7. LLMToolEmulator: имитация вызовов инструментов 163
Глава 12. Состояние, контекст агента и общее хранилище 164
12.1. Состояние агента 164
12.1.1. Задание структуры состояния агента 164
12.1.2. Чтение данных из состояния агента 165
12.1.3. Запись данных в состояние агента 166
12.2. Контекст агента 168
12.2.1. Задание структуры контекста агента 168
12.2.2. Указание контекста агента 168
12.2.3. Чтение данных из контекста агента 168
12.3. Общее хранилище 170
12.3.1. Указание общего хранилища 170
12.3.2. Структура общего хранилища 170
12.3.3. Работа с общим хранилищем 171
12.3.3.1. Запись документов 171
12.3.3.2. Чтение документов 171
12.3.3.3. Поиск документов 172
12.3.3.4. Перечисление пространств имен 173
12.3.3.5. Удаление документов 174
12.3.4. Доступ к общему хранилищу 174
Глава 13. Хранилища 177
13.1. Хранилища состояния 177
13.1.1. InMemorySaver: оперативная память 177
13.1.2. SqliteSaver: база данных SQLite 178
13.1.3. MongoDBSaver: база данных MongoDB 179
13.1.4. PostgresSaver: база данных PostgreSQL 180
13.1.5. PyMySQLSaver: база данных MySQL 181
13.2. Общие хранилища 182
13.2.1. InMemoryStore: оперативная память 182
13.2.2. SqliteStore: база данных SQLite 182
13.2.3. MongoDBStore: база данных MongoDB 182
13.2.4. PostgresStore: база данных PostgreSQL 183
13.2.5. PyMySQLStore: база данных MySQL 184
13.3. Что еще нужно знать о хранилищах? 184
Глава 14. Прерывания и преграды 185
14.1. Прерывания 185
14.1.1. HumanInTheLoopMiddleware: встроенный посредник,
выполняющий прерывания 185
14.1.1.1. HumanInTheLoopMiddleware: создание объекта посредника 185
14.1.1.2. HumanInTheLoopMiddleware: реагирование на прерывания 188
14.1.1.2.1. HumanInTheLoopMiddleware: реагирование на прерывания при выдаче ответа целиком 188
14.1.1.2.2. HumanInTheLoopMiddleware: реагирование на прерывания при выдаче ответа чанками 192
14.1.2. Самостоятельное выполнение прерываний и реагирование на них 192
14.1.2.1. Самостоятельное выполнение прерываний 192
14.1.2.2. Реагирование на самостоятельно выполненное прерывание 193
14.2. Преграды 194
14.2.1. Встроенные преграды 194
14.2.1.1. PIIMiddleware: выявление и блокирование конфиденциальных данных 194
14.2.1.2. ShellToolMiddleware: выполнение команд системной консоли — функциональность преграды 196
14.2.2. Написание своих преград 197
Глава 15. Обработка ошибок 199
15.1. Обработка ошибок в инструментах 199
15.1.1. Самостоятельная обработка ошибок 199
15.1.1.1. Обработка ошибок в конкретном инструменте 199
15.1.1.2. Обработка критических ошибок 200
15.1.1.3. Централизованная обработка ошибок в посреднике 200
15.1.2. ToolRetryMiddleware: повторный вызов инструмента в случае ошибки 201
15.2. Обработка ошибок в посредниках 203
15.3. Обработка ошибок в агентах 203
15.4. ModelFallbackMiddleware: переключение на запасную языковую модель 204
Глава 16. Разработка RAG-агентов, часть 1 205
16.1. Первый RAG-агент, использующий программно сформированные документы 205
16.1.1. Первый RAG-агент: документы, содержащие рецепты пицц 206
16.1.2. Первый RAG-агент: сплиттер, эмбеддинг и векторное хранилище 207
16.1.3. Первый RAG-агент: ретривер 208
16.1.4. Первый RAG-агент: вводная и всякие мелочи 210
16.2. Второй RAG-агент, загружающий документ из PDF-файла 211
16.3. Документы LangChain 212
16.3.1. Программное формирование документов 212
16.3.2. Загрузка документов из сторонних файлов. Загрузчики 213
16.3.2.1. Методы загрузчиков, предназначенные для создания документов 213
16.3.2.2. PyPDFLoader: один PDF-файл 214
16.3.2.3. PyPDFDirectoryLoader: все PDF-файлы в указанной папке 214
16.3.2.4. WebBaseLoader: отдельные веб-страницы 215
16.3.2.5. RecursiveUrlLoader: заданная веб-страница и все веб-страницы, на которые она ссылается 216
16.4. Сплиттеры 218
16.4.1. RecursiveCharacterTextSplitter: разбиение с сохранением структуры текста 218
16.4.2. CharacterTextSplitter: быстрое разбиение текста 219
16.4.3. Сплиттеры веб-страниц 220
16.4.3.1. HTMLHeaderTextSplitter: быстрое разбиение по заголовкам 220
16.4.3.2. HTMLSectionSplitter: разбиение по заголовкам на чанки ограниченного размера 221
16.4.3.3. HTMLSemanticPreservingSplitter: разбиение с сохранением структуры содержимого веб-страниц 222
16.5. Что еще нужно знать о разработке RAG-агентов, описанных в этой части темы? 223
Глава 17. Разработка RAG-агентов, часть 2 225
17.1. Эмбеддинги 225
17.1.1. «Сбер» GigaChat Embeddings 225
17.1.2. Google Gemini Embeddings 226
17.1.3. YandexGPT Embeddings 226
17.1.4. Эмбеддинги, доступные на HuggingFace 226
17.1.5. Эмбеддинги, работающие под управлением Ollama 227
17.2. Векторные хранилища 228
17.3.1. Создание векторного хранилища 228
17.3.1.1. InMemoryVectorStore: оперативная память 229
17.3.1.2. Chroma: оперативная память или локальный диск 230
17.3.1.3. PGVector: база данных PostgreSQL 231
17.3.2. Работа с векторным хранилищем 232
17.3. Ретриверы 234
17.4. Инструменты для поиска в векторном хранилище 234
17.5. Что еще нужно знать о разработке RAG-агентов, описанных в этой части темы? 235
Глава 18. Мультиагентные ИИ-программы 236
18.1. Принципы разработки мультиагентных ИИ-программ 236
18.2. Пример: ИИ-программа для работы с файлами и базой данных 237
Глава 19. Глубинные агенты LangChain 241
19.1. ИИ-программа исследователя рынка, основанная на глубинном агенте 242
19.2. Возможности глубинных агентов 244
19.3. Создание глубинных агентов 245
19.4. Описание подчиненных агентов 246
19.4.1. Описание подчиненных агентов в виде словарей 246
19.4.2. Описание подчиненных агентов в виде объектов 247
19.5. Файловые системы глубинных агентов 248
19.5.1. StateBackend: виртуальная, в хранилище состояния 249
19.5.2. StoreBackend: виртуальная, в общем хранилище 250
19.5.3. FilesystemBackend: физическая, в папке с заданным путем 250
19.5.4. CompositeBackend: гибридная 251
19.6. Хранение информации в файлах 252
19.6.1. Заметки для глубинного агента 252
19.6.2. Навыки глубинного агента 254
19.6.3. Сохранение произвольных данных 256
19.7. Прерывания в глубинных агентах 257
Глава 20. Протокол MCP. Доступ к удаленным инструментам 258
20.1. Базовые средства для разработки инструмент-серверов и инструмент-клиентов. MCP-серверы и MCP-клиенты 258
20.1.1. Написание инструмент-серверов 258
20.1.1.1. Создание MCP-сервера 259
20.1.1.2. Создание инструментов 260
20.1.1.3. Активизация MCP-сервера 261
20.1.1.4. Запуск инструмент-сервера 262
20.1.2. Написание инструмент-клиентов 263
20.1.2.1. Создание MCP-клиента 263
20.1.2.2. Получение списка инструментов, предоставляемых
инструмент-серверами 265
20.1.2.3. Особенности работы с агентом в случае использования
удаленных инструментов 265
20.2. Расширенные средства для разработки инструмент-серверов
и инструмент-клиентов 266
20.2.1. Ресурсы 266
20.2.1.1. Создание ресурсов в программе инструмент-сервера 266
20.2.1.2. Загрузка ресурсов в программе инструмент-клиента 267
20.2.2. Перехватчики вызовов 269
20.2.2.1. Объявление перехватчиков вызовов 269
20.2.2.2. Класс MCPToolCallRequest: обращение к удаленному
инструменту 270
20.2.2.3. Результаты, возвращаемые перехватчиками вызовов 272
20.2.2.4. Указание перехватчиков вызовов при создании MCP-клиента 273
20.2.2.5. Последовательность выполнения перехватчиков вызовов 273
20.2.3. Доступ к HTTP-заголовкам в теле инструментов 273
20.2.4. Контекст MCP-сервера и функции обратного вызова MCP-клиента 274
20.2.4.1. Пересылка текстовых сообщений 274
20.2.4.2. Индикация хода процесса 276
20.2.4.3. Запрос у пользователя подтверждения на выполнение операции 278
Глава 21. Мультимодальные сообщения 282
21.1. Работа с мультимодальными сообщениями средствами LangChain 282
21.1.1. Отправка в мультимодальных вопросах содержимого файлов 284
21.2. Мультимодальные сообщения и языковые модели GigaChat 285
21.2.1. Создание мультимодальных вопросов 285
21.2.2. Обработка мультимодальных ответов 287
ЧАСТЬ IV. ОФОРМЛЕНИЕ ИИ-АГЕНТОВ 291
Глава 22. Оформление ИИ-агентов в виде Telegram-ботов 293
22.1. Получение бот-жетона 293
22.2. Простой Telegram-бот: ИИ-приемщик заказов 295
22.2.1. Простой Telegram-приемщик заказов: обработка сообщений 295
22.2.2. Простой Telegram-приемщик заказов: собственно бот 296
22.2.3. Простой Telegram-приемщик заказов: остальной код 299
22.3. Создание Telegram-приложения 300
22.4. Запуск Telegram-приложения 301
22.5. Обработка обновлений разных видов 301
22.5.1. Обработка поступающих команд 301
22.5.1.1. Объявление обработчиков команд 302
22.5.1.2. Update: класс сведений о последнем обновлении 302
22.5.1.3. Message: класс сообщения 303
22.5.1.4. Класс контекста обработчика 304
22.5.1.5. User: класс пользователя Telegram 305
22.5.1.6. Оформление обработчиков команд 306
22.5.1.7. Указание обработчиков у Telegram-приложения 307
22.5.2. Обработка поступающих сообщений 307
22.6. Дополнительные средства для разработки Telegram-ботов 308
22.6.1. Использование экранной клавиатуры 308
22.6.1.1. Создание и вывод экранной клавиатуры 308
22.6.1.2. Реагирование на нажатия кнопок экранной клавиатуры 309
22.6.2. Отправка пользователю изображений 311
22.6.3. Отправка пользователю видео 314
22.7. Что еще нужно знать о разработке Telegram-ботов? 315
Глава 23. Оформление ИИ-агентов в виде веб-приложений 316
23.1. Веб-ИИ-агент, версия 0.1 316
23.1.1. Веб-ИИ-агент, версия 0.1: обработка сообщений 317
23.1.2. Веб-ИИ-агент, версия 0.1: веб-интерфейс 317
23.1.3. Веб-ИИ-агент, версия 0.1: запуск и тестирование 319
23.1.4. Веб-ИИ-агент, версия 0.1: фронтенд 323
23.2. Создание приложения FastAPI 327
23.3. Объявление контроллеров 328
23.3.1. Генерирование и выдача серверных ответов 328
23.3.2. Получение данных от пользователя 329
23.3.2.1. Данные в формате JSON 329
23.3.2.2. Данные в формате Form Data 330
23.3.2.3. GET-параметры 330
23.3.2.4. URL-параметры 331
23.3.2.5. Данные из cookie 331
23.3.3. Создание cookie 332
23.4. Создание маршрутов 332
23.5. Веб-ИИ-агент, версия 1.0 333
23.6. Поддержка протокола Websockets 335
23.6.1. Объявление Websockets-контроллеров 335
23.6.2. WebSocket: класс соединения Websockets 336
23.6.3. Обработка разрыва соединения клиентом 337
23.6.4. Создание Websockets-маршрутов 338
23.7. Веб-ИИ-агент: версия 2.0 338
23.7.1. Веб-ИИ-агент, версия 2.0: бэкенд 338
23.7.1.1. Веб-ИИ-агент, версия 2.0: обработка сообщений 338
23.7.1.2. Веб-ИИ-агент, версия 2.0: веб-приложение 339
23.7.2. Веб-ИИ-агент, версия 2.0: фронтенд 341
23.8. Веб-ИИ-агент, версия 2.1: очистка истории сообщений после разрыва соединения 343
23.9. Что еще нужно знать о разработке веб-ИИ-приложений? 344
Глава 24. Оформление ИИ-агентов в виде графических приложений 346
24.1. Графический ИИ-агент, версия 1.0 346
24.1.1. Графический ИИ-агент, версия 1.0: разработка 346
24.1.2. Графический ИИ-агент, версия 1.0: запуск 349
24.2. Оконные элементы 350
24.2.1. Базовые классы оконных элементов 350
24.2.2. Элементы управления 353
24.2.2.1. Надпись 353
24.2.2.2. Поле ввода 354
24.2.2.3. Флажок 355
24.2.2.4. Группа переключателей 355
24.2.2.5. Раскрывающийся список 356
24.2.2.6. Кнопка 359
24.2.3. Дополнительные оконные элементы 359
24.2.3.1. Графический элемент 359
24.2.3.2. Текст в формате Markdown 360
24.2.4. Контейнеры 361
24.2.4.1. Базовый класс контейнеров 361
24.2.4.2. Колонка 362
24.2.4.3. Строка 363
24.2.4.4. Прокручивающийся перечень 364
24.2.4.5. Сетка 364
24.3. Графический ИИ-агент, версия 1.1 365
24.4. Обработка событий 367
24.5. Вывод оконных элементов в окне 368
24.6. Дополнительные программные инструменты 368
24.6.1. Работа с клиентской областью окна 368
24.6.2. Управление окном 369
24.6.3. Вывод стандартных файловых диалоговых окон 371
24.7. Что еще нужно знать о разработке графических приложений? 373
Заключение 374
Приложение. Описание файлового архива 376
Предметный указатель 377

В книге сделан исчерпывающий анализ низкоуровневого устройства процессоров, их архитектур, инструкций, кэша и тонких аспектов оптимизации производительности. На материале тщательно подобранных кейсов, разнообразных бенчмарков и измерений книга демонстрирует потенциально узкие места в работе процессора, устранив которые путем разумных компромиссов можно нарастить его производительность. Рассмотрены инструменты для анализа производительности CPU, средства оптимизации вычислений, доступа к памяти, компоновки памяти, а также детали работы с регистрами и машинным кодом. Особое внимание уделено оптимизации многопоточных приложений.
Книга будет полезна опытным специалистам по разработке программного обеспечения, включая разработчиков приложений, библиотек, компиляторов и операционных систем, а также исследователям и ученым-информатикам.
Современное программное обеспечение очень неэффективно. Процессоры обычно исполняют плохо оптимизированный код, который потребляет больше энергии, чем мог бы, и тем самым способствует выбросам углерода и другим экологическим проблемам. Неэффективное программное обеспечение снижает прибыль компаний и уменьшает их рыночную стоимость. В течение многих лет оптимизация производительности процессоров и чипов считалась узкоспециализированным занятием для «гиков», но сейчас она выходит в мейнстрим, поскольку поставщики программного обеспечения осознают, какое влияние плохо оптимизированный код оказывает на их финансовые показатели. Производительность кода — один из ключевых факторов успеха.
Эксперт по производительности вычислительных машин Денис Бахвалов объясняет, как делать низкоуровневые оптимизации с использованием продвинутых методов и инструментов. Прочитав эту книгу, вы сможете находить причины снижения производительности своего приложения и находить разнообразные возможности его оптимизации. Книга изобилует практическими примерами и упражнениями.
Книга посвящена низкоуровневой оптимизации производительности: от анализа архитектуры CPU до работы с регистрами и машинным кодом

Денис Бахвалов начал работу программистом в 2008 году и посвятил большую часть своей карьеры оптимизации взаимодействия между процессором и программным обеспечением. Работая в компании Intel, внедрил множество улучшений производительности в широко используемые промышленные приложения и бенчмарки. Является автором онлайн-курса «Performance Ninja» и ведет свой блог на сайте easyperf.net.
Книгу “Оптимизация производительности современных процессоров. 2-е изд.” можно купить в нашем интенет-магазине.
Предуведомление 9
От автора 11
Целевая аудитория 12
Об авторе 13
Глава 1. Введение 15
1.1. Почему программное обеспечение работает медленно? 16
1.2. Почему нужно уделять внимание производительности? 19
1.3. Что такое анализ производительности? 22
1.4. Что значит оптимизация производительности? 23
1.5. О чем рассказывается в этой книге? 24
1.6. О чем не рассказывается в этой книге? 26
1.7. Упражнения 27
Краткое содержание главы 28
ЧАСТЬ I. АНАЛИЗ ПРОИЗВОДИТЕЛЬНОСТИ
СОВРЕМЕННОГО ПРОЦЕССОРА 29
Глава 2. Анализ производительности 31
2.1. Воздействие помех на современные системы 32
2.2. Измерение производственной производительности 34
2.3. Непрерывное сравнительное тестирование 35
2.4. Ручное тестирование производительности 40
2.5. Программные и аппаратные таймеры 43
2.6. Микробенчмарки 45
2.7. Активное сравнительное тестирование 47
Вопросы и упражнения 48
Краткое содержание главы 48
Глава 3. Микроархитектура центрального процессора 51
3.1. Архитектура набора команд 51
3.2. Конвейерная обработка 52
3.3. Использование параллельного выполнения задач на уровне инструкций (ILP) 56
3.3.1. Внеочередное выполнение 56
3.3.1.1. Статическое планирование 57
3.3.1.2. Динамическое планирование 57
3.3.2. Суперскалярные процессоры 59
3.3.3. Спекулятивное исполнение 59
3.3.4. Прогнозирование ветвления 61
3.4. Мультипроцессоры SIMD 63
3.5. Использование параллельных вычислений на уровне потоков 66
3.5.1. Многоядерные системы 66
3.5.2. Одновременная многопоточная обработка 67
3.5.3. Гибридные конструкции 69
3.6. Иерархия памяти 71
3.6.1. Иерархия кеша 71
3.6.1.1. Размещение данных в кеше 72
3.6.1.2. Поиск данных в кеше 73
3.6.1.3. Управление промахами 73
3.6.1.4. Управление записями 73
3.6.1.5. Другие технологии оптимизации кеша 74
3.6.1.6. Программно-аппаратная предварительная выборка 74
3.6.2. Основная память 75
3.6.2.1. Двойная скорость передачи данных DDR 76
3.6.2.2. GDDR и HBM 79
3.7. Виртуальная память 80
3.7.1. Буфер ассоциативной трансляции (TLB) 82
3.7.2. Большие страницы 83
3.8. Конструкция современных центральных процессоров 84
3.8.1. Фронтенд центрального процессора 84
3.8.2. Бэкенд центрального процессора 87
3.8.3. Блок загрузки и записи 89
3.8.4. Иерархия буфера ассоциативной трансляции 93
3.9. Блок мониторинга производительности 94
3.9.1. Счетчики мониторинга производительности 96
Вопросы и упражнения 97
Краткое содержание главы 98
Глоссарий к рисункам главы 3 99
Глава 4. Терминология и метрики в анализе производительности 103
4.1. Завершенная и выполненная инструкция 104
4.2. Загрузка центрального процессора 104
4.3. CPI и IPC 105
4.4. Микрооперации 107
4.5. Слот конвейера 109
4.6. Такты ядра и относительные такты ядра 110
4.7. Промахи в кеше 111
4.8. Неправильное предсказание ветвления 112
4.9. Метрики производительности 113
4.10. Задержка памяти и пропускная способность 115
4.11. Практический пример. Анализ метрик производительности
для четырех приложений 120
Вопросы и упражнения 126
Краткое содержание главы 127
Глоссарий к рисункам главы 4 127
Глава 5. Методы анализа производительности 129
5.1. Инструментация кода 130
5.2. Трассировка 135
5.3. Сбор событий контроля производительности 136
5.3.1. Мультиплексирование и пересчет событий 138
5.3.2. Использование API-маркеров 140
5.4. Выборочное профилирование 144
5.4.1. Выборка в режиме пользователя и на основе аппаратных событий 145
5.4.2. Поиск горячих точек 146
5.4.3. Сбор стеков вызова 149
5.5. Модель производительности Roofline 151
5.6. Статический анализ производительности 155
5.6.1. Практический пример. Использование UICA для оптимизации
пропускной способности FMA 156
5.7. Отчеты об оптимизации компилятора 161
Вопросы и упражнения 164
Краткое содержание главы 165
Глава 6. Средства процессора для анализа производительности 167
6.1. Нисходящий анализ микроархитектуры 169
6.1.1. TMA на платформах Intel 170
Практический пример. Сокращение числа промахов кеша с помощью TMA 172
6.1.2. TMA на платформах AMD 177
6.1.3. ТМА на платформах Arm 179
6.1.4. Итоги раздела ТМА 183
6.2. Механизмы записи ветвлений 184
6.2.1. LBR на платформе Intel 186
6.2.2. LBR на платформах AMD 189
6.2.3. BRBE на платформах Arm 189
6.2.4. Сбор стека вызовов 189
6.2.5. Выявление горячих ветвей 190
6.2.6. Анализ коэффициента ошибочного предсказания ветвей 191
6.2.7. Точный тайминг машинного кода 192
6.2.8. Оценка вероятности результата ветвления 195
6.2.9. Предоставление обратной связи компилятору 196
6.3. Средства аппаратной выборки 196
6.3.1. PEBS на платформах Intel 196
6.3.2. IBS на платформах AMD 198
6.3.3. SPE на платформе Arm 200
6.3.4. Точные события 201
6.3.5. Анализ обращений к памяти 202
Вопросы и упражнения 203
Краткое содержание главы 203
Глоссарий к рисункам главы 6 204
Глава 7. Обзор инструментов анализа производительности 205
7.1. Профилировщик Intel VTune 205
7.2. AMD uProf 210
7.3. Инструменты Xcode от Apple 213
7.4. Perf для Linux 216
7.5. Диаграмма «пламени» 218
7.6. Трассировка событий в Windows 219
7.7. Специализированные и гибридные профилировщики 221
7.8. Профилирование памяти 228
7.8.1. Использование памяти 228
7.8.2. Практический пример. Анализ выделений памяти в Stockfish 230
7.8.3. Интенсивность использования и объем памяти 233
7.9. Непрерывное профилирование 236
Вопросы и упражнения 240
Краткое содержание главы 240
ЧАСТЬ II. ТЮНИНГ ИСХОДНОГО КОДА 243
Глава 8. Оптимизация доступа к памяти 249
8.1. Структуры данных, дружелюбные для кеша 250
8.1.1. Последовательный доступ к данным 250
8.1.2. Использование подходящих контейнеров 252
8.1.3. Упаковка данных 252
8.1.4. Упорядочивание полей 253
8.1.5. Другие методы реорганизации структуры данных 254
8.2. Динамическое распределение памяти 256
8.3. Устранение ограничений пропускной способности памяти 257
8.4. Уменьшение количества пропусков DTLB 259
8.4.1. Явные большие страницы 260
8.4.2. Прозрачные большие страницы 261
8.4.3. Явные и прозрачные большие страницы 263
8.5. Явная предварительная выборка памяти 264
Вопросы и упражнения 268
Краткое содержание главы 269
Глава 9. Оптимизация вычислений 271
9.1. Зависимость данных 272
9.2. Встраивание функций 278
9.2.1. Оптимизация хвостовых вызовов 280
9.3. Оптимизация циклов 281
9.3.1. Низкоуровневые оптимизации 282
9.3.2. Оптимизация высокого уровня 284
9.3.3. Поиск возможностей оптимизации циклов 287
9.4. Векторизация 288
9.4.1. Автовекторизация компилятора 289
9.4.2. Поиск возможностей векторизации 290
9.4.2.1. Векторизация недопустима 291
9.4.2.2. Векторизация неэффективна 293
9.4.2.3. Векторизованный цикл с использованием скалярной версии 294
9.4.2.4. Неоптимальная векторизация цикла 295
9.4.2.5. Языки с явной векторизацией 296
9.5. Встроенные функции компилятора 297
9.5.1. Библиотеки-обертки для внутренних функций 299
Вопросы и упражнения 301
Краткое содержание главы 302
Глава 10. Оптимизация предсказания ветвлений 303
10.1. Замена ветвлений таблицами поиска 305
10.2. Замена ветвлений арифметическими действиями 306
10.3. Замена ветвлений на условный выбор 306
10.4. Одно ветвление — несколько тестов 309
Вопросы и упражнения 311
Краткое содержание главы 312
Глава 11. Оптимизация компоновки машинного кода 313
11.1. Компоновка машинного кода 314
11.2. Базовый блок 314
11.3. Размещение базовых блоков 315
11.4. Выравнивание базовых блоков 317
11.5. Разделение функций 320
11.6. Упорядочивание функций 321
11.7. Оптимизации, управляемые профилем 323
11.8. Уменьшение промахов ITLB 326
11.9. Практический пример. Измерение размера горячего кода 328
Вопросы и упражнения 332
Краткое содержание главы 332
Глава 12. Дополнительные возможности для оптимизации 333
12.1. Оптимизация под конкретный процессор 333
12.1.1. Расширения ISA 335
12.1.2. Диспетчеризация процессоров 336
12.1.3. Задержки и пропускная способность инструкций 337
12.2. Специфические проблемы микроархитектур 340
12.2.1. Нарушения порядка операций с памятью 340
12.2.2. Невыровненный доступ к памяти 342
12.2.3. Конкуренция двух разных адресов за одну строку кеша 345
12.2.4. Замедленная арифметика со значениями с плавающей запятой 347
12.3. Методы оптимизции низкой задержки 349
12.3.1. Избегайте незначительных ошибок страниц 350
12.3.2. Разогрев кеша 352
12.3.3. Избегайте прерываний TLB 353
12.3.4. Предотвращение непреднамеренного троттлинга ядра 355
12.4. Настройка системы 355
12.5. Практический пример. Чувствительность к размеру кеша последнего уровня 357
Вопросы и упражнения 362
Краткое содержание главы 362
Глоссарий к рисункам главы 12 363
Глава 13. Оптимизация многопоточных приложений 365
13.1. Показатели эффективности работы в параллельном режиме 366
13.2. Масштабирование производительности в многопоточных программах 368
13.2.1. Пример анализа масштабирования при изменении числа потоков 370
Blender 372
Clang 373
Zstandard 375
CloverLeaf 378
CPython 380
Резюме 382
13.3. Планирование задач 383
13.4. Согласованность кеша 386
13.4.1. Протоколы согласования кеша 386
13.4.2. Истинное совместное использование 388
13.4.3. Ложное совместное использование 389
13.5. Инструменты расширенного анализа 391
13.5.1. Coz 391
13.5.2 eBPF и GAPP 392
Вопросы и упражнения 393
Краткое содержание главы 394
Эпилог 395
Благодарности 399
Глоссарий 403
Список основных микроархитектур процессоров 405
Ссылки 407
Приложение A. Уменьшение шумов при измерениях 411
Динамическое масштабирование частоты 411
Одновременная многопоточность 412
Изменение частоты 413
Привязка к ядру процессора 413
Приоритет процесса 414
Приложение B. Включение больших страниц 415
Windows 415
Linux 416
Явные большие страницы 416
Прозрачные большие страницы 417
Приложение C. Трассировка процессоров Intel 419
Процесс работы 419
Временные пакеты 421
Сбор и декодирование трасс 421
Дисковое пространство и время декодирования 423
Инструменты 424
Intel PT: ссылки и упоминания 424
Приложение D. Анализ трассировки для Windows 425
Инструменты для записи трасс ETW 425
Инструменты для просмотра и анализа трасс ETW 426
Практический пример — медленный старт программы 426
Установка 426
Захват трассы 427
Анализ в WPA 428

В современных реалиях разработки ПО классическая модель архитектора как единоличного автора решений утрачивает эффективность. Книга предлагает практический подход к архитектуре как к непрерывному процессу принятия решений с участием всей команды. Вводится понятие архитектурно значимых решений, и даются инструменты для работы с ними. Основной метод — «процесс архитектурных советов», сочетающий скорость разработки с архитектурной целостностью через быструю обратную связь. Читатель освоит документирование решений (Architecture Decision Records), организацию архитектурных форумов, формулирование тестируемых нефункциональных требований и построение технологических радаров.
Для архитекторов программного обеспечения
Роль архитектора ПО постоянно эволюционирует. Системы усложняются. Командам становится всё труднее взаимодействовать с архитектурами, которые они разрабатывают, запускают и развивают. Специалисты, традиционно выступающие в роли архитекторов, часто не успевают быть везде, где нужно. Просто слишком много работы над архитектурой, и ситуация достигла критической точки.
Но есть способ лучше. Автор книги показывает, как архитекторы и команды разработчиков могут работать сообща над созданием и развитием более эффективных архитектур систем. Благодаря представленным методам вы сможете сформировать новый образ мышления и выйти на новый уровень создания по-настоящему эффективных систем
Эндрю интуитивно понимает архитектуру. Перед вами книга, полная практической мудрости, основанная на обширном опыте, с захватывающим повествованием и оформленная так, чтобы донести суть того, что такое архитектура, чем она не является и как воплотить ее в жизнь.
Гради Буч, член IBM Fellow
Лучшие архитектуры ПО создаются усилиями всего коллектива. В книге Эндрю представлена практическая реализация этого видения: вовлечение широкого круга людей и ведение точного учета принятых решений.Мартин Фаулер, главный научный сотрудник компании Thoughtworks

Эндрю Хармел-Лоу — технический директор компании Thoughtworks, специализирующейся на предметно-ориентированном проектировании, крупномасштабной модернизации и организационных преобразованиях. Активный сторонник открытого исходного кода. Делится своим опытом через онлайн-тренинги, статьи, публичные выступления и наставничество.
Книгу “Программная архитектура: практика командного принятия решений” можно купить в нашем интенет-магазине.
Отзывы.. 15
Предисловие. 21
Введение. 23
Кому предназначена эта книга. 25
Зачем я написал эту книгу. 27
Содержание книги. 29
Условные обозначения. 29
Дополнительные материалы.. 30
Онлайн-обучение в O’Reilly. 30
Как с нами связаться. 30
Благодарности. 31
ГЛАВА 1. Централизованные практики архитектуры
в децентрализованном мире. 33
Создание успешной архитектуры ПО в равной степени зависит от практик
и конечного результата. 33
Как выглядят традиционные практики архитектуры?. 35
Архитекторы в “башне из слоновой кости”. 36
Практико-ориентированные архитекторы.. 37
Что не так с этими традиционными подходами?. 38
Пять переломных моментов, раскрывающих мощь ПО.. 39
Влияние пяти революций на практики разработки архитектуры.. 43
Рассвет децентрализации. 44
Закат практик разработки централизованной архитектуры.. 49
Что должна предлагать новая практика архитектуры?. 54
Ни один подход не защитит нас от фактора хаотичности. 55
Архитектуры должны учитывать неопределенность. 55
Архитектура должна допускать эмерджентность. 57
Вывод. 60
Часть I. Первые принципы.. 61
ГЛАВА 2. Практика создания архитектуры означает принятие решений. 63
Решения — главный компонент архитектуры ПО.. 64
Что представляет собой архитектурное решение?. 65
Структура. 65
Кросс-функциональные характеристики. 66
Зависимости. 67
Интерфейсы.. 67
Техники построения. 67
Некоторые примеры архитектурных и неархитектурных решений. 69
Кто принимает архитектурные решения?. 71
Значимые архитектурные решения. 71
Что делает архитектурное решение “значимым”?. 71
Что не следует учитывать в контексте архитектурной значимости?. 74
Архитектурная значимость в контексте развернутого ПО.. 75
Некоторые примеры значимых архитектурных решений. 77
Вывод. 79
ГЛАВА 3. Масштабные решения. 80
Процессы принятия решений. 80
Этап 1: потребность в принятии решения. 81
Этап 2: акт принятия решения. 81
Этап 3: внедрение решения. 83
Где лежит баланс сил в процессах принятия решений?. 83
При традиционных архитектурных подходах команды недостаточно
вовлечены в выбор вариантов решений. 85
Масштабные процессы принятия решений. 86
Стандартные подходы к принятию масштабных решений. 86
Процессы принятия решений в революционном мире разработки ПО.. 94
Вывод. 98
ГЛАВА 4. Процесс архитектурных консультаций. 99
Потребность в быстрых и децентрализованных процессах принятия решений. 99
Процесс архитектурных консультаций: одно правило, две группы консультантов и один контракт 100
Процесс архитектурных консультаций является быстрым.. 102
Процесс архитектурных консультаций является децентрализованным.. 103
Процесс архитектурных консультаций порождает заключение общественного договора 105
Два примера процесса архитектурных консультаций в действии. 106
История 1: команда разработки решает использовать релизные переключатели 107
История 2: архитектор решает устранить проблему с рабочим процессом.. 114
Центральная роль консультаций. 122
Совет как совокупность предполагаемого направления и аргументации. 122
Советы помогают тем, кто выбирает варианты и принимает решения. 125
Подотчетность приходит с принятием решений, а не предоставлением совета 126
Важность диалога. 128
Важность доверия. 129
Вывод. 130
ГЛАВА 5. Внедрение процесса архитектурных консультаций. 131
Первые шаги. 131
Если у нас уже есть полномочия принятия решений. 131
Если у нас нет полномочий принятия решений. 132
Следует начинать с малого, независимо от отправной точки. 134
Преодоление сложностей на ранних этапах. 136
Объяснение процесса архитектурных консультаций всем участникам.. 136
Обращение за советом к нужным людям.. 136
Вопросы следует адресовать нужным людям и искать ответ на вопрос “Почему?” 138
Следует явно объяснить, кто несет ответственность за каждое решение. 140
Недостаток уверенности относительно процесса архитектурных
консультаций. 142
Нехватка уверенности в ваших и чужих навыках принятия решений. 142
Нехватка уверенности в том, что нужно обращаться за советом
и предлагать его. 143
Нехватка уверенности в том, что мы знаем всё, что происходит. 143
Вывод. 144
ГЛАВА 6. Архитектурные записи решений. 145
Введение в архитектурные записи решений. 145
Структура архитектурных записей решений. 147
Название. 148
Метаданные. 149
Решение. 150
Контекст. 151
Варианты.. 152
Результаты.. 153
Совет. 154
Создание шаблона архитектурной записи решения. 156
Этап 1: создадим пустую архитектурную запись решения и набор связанных метаданных 156
Этап 2: внесем сведения о контексте. 157
Этап 3: сформируем список вариантов и спрогнозируем возможные результаты 161
Этап 4: предложим выбранный вариант. 165
Использование архитектурных записей решений для упрощения процесса консультаций 167
Когда и как обращаться за советами. 167
Создание раздела “Совет”. 169
Сбор советов. 170
Внесение изменений в архитектурную запись решения для отражения вклада других лиц 172
Принятие решения и итоговый вариант архитектурной записи. 177
Выбор варианта решения. 177
Составление раздела “Решение” и обновление названия. 179
Изменение статуса архитектурной записи решения на “Принято”. 180
Оглашение решения. 181
Жизненный цикл архитектурной записи решения. 181
Стандартные статусы: “Черновик”, “Предложено”, “Принято”
и “Заменено”. 181
Нестандартные статусы архитектурных записей решений. 182
Управление архитектурными записями решений. 184
Основополагающие аспекты управления архитектурными записями решений. 184
Архитектурные записи решений на вики и RTF-файлы в системе контроля версий 185
Архитектурные записи решений в тикет-системах. 186
Контроль над архитектурными записями решений. 187
Вывод. 188
Часть II . Взращивание и развитие культуры децентрализованного доверия 189
ГЛАВА 7. Децентрализация доверия вместо иерархии. 191
Перенос ответственности и подотчетности. 192
Большинство традиционных методов управления устаревают. 192
Процесс консультирования совместим с существующими структурами корпоративной архитектуры 193
Отчетность через архитектурные записи решений — сдерживающий
фактор против безрассудства. 194
Команды не обязаны принимать решения. 194
Раскрытие потенциала пространства для архитектурных практик. 195
Создание условий для формирования культуры обучения и доверия. 196
Два примера доверия (или его отсутствия) в действии. 197
Нам сложно представить возникновение культуры доверия и обучения. 197
Необходимо тщательно взращивать культуру доверия и обучения. 198
Понимание динамики изменений в организациях разного размера. 198
Использование вспомогательных элементов для защиты пространства
для доверия. 202
Защита пространства для практик архитектуры.. 202
Отсутствие стандарта для вспомогательных элементов. 203
Адаптация вспомогательных элементов под себя. 203
Netflix: пример мышления, основанного на поиске потока. 205
Опасность сирен, призывающих к определенности и предсказуемости. 206
Поиск оптимального потока для нашей организации лежит через эксперименты 207
Вывод. 207
ГЛАВА 8. Консультативный форум по архитектуре. 209
Знакомство с консультативным форумом по архитектуре. 209
Простая постоянная повестка дня. 210
Чем консультативный форум отличается от совещаний в традиционных подходах 211
Проведение консультативного форума по архитектуре. 212
Перед консультативным форумом.. 212
Обнародование программы.. 213
Открытие сессии консультативного форума по архитектуре. 213
Презентация архитектурной записи решений. 214
Предложение и получение совета. 214
Документирование совета. 215
Социальная динамика на консультационном форуме. 215
Взаимодействия по вопросам архитектуры изначально являются состязательными и иерархическими 216
Коалесцентная аргументация: альтернатива состязательной. 217
Процесс архитектурных консультаций и ADR как коалесцентный
подход. 219
Консультативные форумы создают мощную групповую динамику. 220
Опыт для предоставляющих советы.. 221
Опыт для тех, кто ищет совета. 222
Опыт для обучающихся наблюдателей. 223
Совместное участие в творческой деятельности. 224
Консультативный форум по архитектуре способствует формированию концептуальной целостности и социальной сплоченности. 225
Децентрализованное выполнение при централизованной координации. 226
Глубокая экспертиза в предметной области: когда централизация
работает лучше. 228
Повышение социальной сплоченности и доверия за счет прозрачности. 229
Ритм как ритуал усиления. 233
Запуск процесса консультаций с помощью консультативного форума. 235
Условия ведения (ToR) 235
Если вы используете консультативный форум для инициации процесса консультаций 236
Кто должен организовать первый консультативный форум?. 236
Чем первый консультативный форум будет отличаться от последующих. 237
Вывод. 238
ГЛАВА 9. Проверяемые кросс-функциональные требования и технологическая стратегия 240
Важность согласованности внутри организации. 240
Согласованность не гарантирует эффективность. 241
Выявление недостаточной организационной согласованности. 244
Четыре способа обеспечения согласованности. 246
Согласованность не оставляет места для сюрпризов. 247
Минимальное жизнеспособное соглашение. 251
Кросс-функциональные требования. 252
Технологическая стратегия. 262
Работа над формированием минимального жизнеспособного соглашения организации 269
Вывод. 269
ГЛАВА 10. Совместно разрабатываемые архитектурные принципы.. 270
Архитектурные принципы должны формировать все участники процесса. 270
Примеры архитектурных принципов. 271
Признаки хороших архитектурных принципов. 273
Признаки плохих архитектурных принципов. 274
Принципы могут оказаться замаскированными кросс-функциональными требованиями 275
Архитектурные принципы дополняют процесс консультаций
и архитектурные записи решений. 276
Фиксирование архитектурных принципов на семинаре по принципам.. 277
Подготовка материалов для вашего семинара по принципам.. 278
Организация семинара по принципам.. 282
Проведение семинара по принципам.. 286
Представление ваших готовых принципов. 295
Поддержание полезности принципов. 298
Обратная связь после принятия решений должна влиять на архитектурные принципы 298
Обновление и поддержка принципов. 300
Обратная связь после принятия решений может повлиять на техническую стратегию 302
Вывод. 303
ГЛАВА 11. Использование технологического радара. 304
Отслеживание технологических тенденций и учет рекомендаций. 304
Технологические радары как источник рекомендаций. 305
Как работает технологический радар Thoughtworks. 306
Ваш внутренний технологический радар будет иметь другую структуру. 310
Место вашего радара в процессе консультаций. 310
Создание собственного технологического радара. 313
Сбор информации об эхосигналах. 314
Сортировка и валидация эхосигналов. 317
Фокусировка эхосигнала. 319
Позиционирование эхосигналов. 322
Документирование эхосигналов. 323
Публикация радара. 323
Обновление ваших эхосигналов. 325
Периодическая развертка радара. 326
Специальные обновления, основанные на совместном опыте. 328
Фиксация предыдущих эхосигналов и их истории. 329
Вывод. 329
Часть III. Поиск собственного пути в процессе принятия решений. 331
ГЛАВА 12. Искусство принятия решений. 333
Важность более мягкой стороны.. 333
Фрейминг контекста. 333
Исключение так же важно, как и включение. 334
Вопросы, помогающие усовершенствовать фрейминг. 336
Вовлекайте правильные заинтересованные стороны.. 337
Продуманные варианты и их последствия. 338
Не позволяйте фрейму ограничить вашу креативность. 338
Поиск вдохновения. 340
Уточнение контекста и вариантов решения с помощью советов. 341
Развитие навыков метапознания. 343
Упражнение 1. Поделитесь своими идеями. 344
Упражнение 2. Вы реагируете или отвечаете?. 344
Упражнение 3. Намеренно обращайтесь за советом, который
противоречит вашим представлениям.. 345
Умение справляться с несговорчивыми личностями. 346
Выбор вариантов решения. 349
Преодоление страха. 350
Преодоление личных предубеждений. 352
Принятие решения. 353
Когда решение принимаете вы.. 353
Когда решение принимают другие. 354
Вывод. 357
ГЛАВА 13. Борьба с архитектурной изменчивостью.. 358
Влияние изменчивости на практику архитектуры.. 359
Изменчивость затрудняет разработку систем.. 359
Изменчивость как основа разработки ПО.. 362
Эффективная работа с архитектурной изменчивостью.. 363
Борьба с изменчивостью путем быстрого принятия и тестирования
решений. 365
Углубленная проверка решений с помощью функционального контекста. 365
Метод “ходячего скелета” для тестирования решений в их
функциональном контексте на самых ранних этапах. 366
Борьба с изменчивостью через небольшие решения. 368
Влияние архитектурных решений на будущий поток. 377
Хорошая техническая инфраструктура позволяет принимать небольшие решения 377
Хорошая социотехническая инфраструктура также позволяет принимать небольшие решения 378
Используйте процесс консультаций, чтобы разделить решения по потоку. 379
Использование изменчивости для борьбы с рисками и выявления ценности. 380
Лучше быстро и неправильно, чем медленно и правильно. 380
Следите за выбросами. 381
Сначала упорядочьте наиболее ценные решения. 382
Вывод. 383
ГЛАВА 14. Изменчивость и взаимосвязанность решений. 385
Противодействие изменчивости. 385
Введение в спайки. 386
Спайки помогают справиться с архитектурной изменчивостью путем меньших затрат 387
Где применяются спайки в процесс принятия решений?. 388
Использование спайков для составления архитектурных записей
решений. 388
Архитектурные записи решений на основе спайков по-прежнему должны проходить через процесс консультаций. 394
Изучение взаимосвязи между принимаемыми решениями. 395
Решение — это последовательность. 395
Решение — это обратная иерархия. 399
Атомарные решения. 409
Принятие решений оказывает двунаправленное воздействие. 412
Взаимосвязанные решения являются социально сложными. 415
Вывод. 417
Часть IV. “Социальный” аспект нашей архитектурной практики. 419
ГЛАВА 15. Передача власти и подотчетности. 421
Переход власти никогда не бывает простым.. 421
Переход власти с позиции тех, кто ее получает. 423
Все ли верят, что у них есть право решать?. 423
Все ли понимают свою подотчетность?. 426
Почему люди не пользуются доступной им властью?. 430
Важность безопасности. 431
Переход власти с позиции тех, кто должен ею поделиться. 445
Страх тех, кто отдал власть. 446
Поведение тех, кому не нравится факт разделения власти. 449
Передача власти вызывает дискомфорт. 452
Вывод. 453
ГЛАВА 16. О лидерстве. 454
Ошибочные представления о лидерстве. 454
Заблуждение 1: лидерство — это врожденное качество. 455
Заблуждение 2: лидерство неразрывно связано с иерархией. 456
Заблуждение 3: лидерство носит однонаправленный характер. 456
Заблуждение 4: лидерство — это управление. 457
Что такое лидерство. 458
14 ключевых принципов Деминга. 459
“Служащее лидерство” 460
Адаптивное лидерство. 461
Лидерство через подход “лидер – лидер”. 464
Трудности при внедрении лидерства через подход “лидер – лидер”. 466
Потребность в постоянном моральном лидерстве. 473
Реагирование на моральные вызовы.. 474
Проявляйте внимание, но не привязывайтесь ко всем культурам
в компании. 476
Отсутствие “постоянных лидеров”. 477
Вывод. 478
ГЛАВА 17. Адаптация процесса консультаций под нашу организацию.. 479
Субкультура в сфере разработки ПО.. 479
Причина 1. Разработка ПО не следует стандартным ментальным
моделям создания. 480
Причина 2. Темпы изменений в ИТ-подразделениях намного выше,
чем где-либо еще. 481
Причина 3. Точек соприкосновения между отделом разработки ПО и остальной частью организации не много, и они четко различимы.. 481
Причина 4. Культурное разделение между разработчиками ПО
и остальной частью организации уже признано. 482
“Пузыри” процесса консультаций. 483
“Пузыри” видны только тем, кто их ищет. 484
Самоорганизация “пузырей”. 485
“Пузыри” проницаемы.. 488
Внешние ожидания в отношении тех, кто находится внутри “пузыря”. 488
Очевидные ожидания. 489
Менее очевидные ожидания. 490
“Пузыри” — это интерфейс, не зависящий от реализации. 495
Контракт интерфейса “пузыря”. 495
Перевод идей для всех. 496
Рост числа “пузырей”. 498
Постепенный рост, от команды к команде. 498
Убедитесь, что вы защищаете основные цели своей архитектурной практики. 500
Разделение “пузырей” по мере их увеличения. 500
Ничто не может расширяться вечно. 501
“Пузырь” следует разделить, когда ключевые ценности практики архитектуры находятся под угрозой 501
Как разделить “пузырь”. 502
Поддержание согласованности между “пузырями”. 505
Защита и поощрение различий между “пузырями”. 505
Вывод. 506
Предметный указатель. 508
Об авторе. 510
Об изображении на обложке. 511

Книга рассказывает о проектировании API для обработки данных и взаимодействия с большими языковыми моделями. Рассматривается работа с языком Python и его фреймворками FastAPI, Streamlit и LangChain. Рассматривается интеграция API в имеющиеся рабочие процессы, типичные для обработки данных, вывод приложения в облако, подбор интерфейсов для обслуживания различных задач, применение больших языковых моделей класса GPT для оптимизации и ускорения проектирования API.
Для специалистов по проектированию API, науке о данных и машинному обучению
Навыки создания API незаменимы при работе с искусственным интеллектом и в науке о данных (Data Science). Умение проектировать и поддерживать API для искусственного интеллекта понадобится как новичкам, так и опытным профессионалам. Эта практическая книга поможет вам на собственном опыте освоить разработку и поддержку API на Python с применением популярных фреймворков этого языка — FastAPI, LangChain и Streamlit .
Книга делится на три части и рассказывает, как разрабатывать API с нуля, интегрировать их в рабочие процессы, типичные для обработки данных, научиться использовать такие инструменты как ChatGPT и LangChain, чтобы взаимодействовать с API при помощи больших языковых моделей (LLM). Проработав книгу, вы приобретете портфолио готовых проектов с качественными API, которые в самом выгодном свете продемонстрируют ваше мастерство в работе с ИИ, машинным обучением и наукой о данных.
Эта книга — потрясающая новинка для всего сообщества исследователей данных. Порадуйте себя — добавьте эту книгу в свою профессиональную библиотеку, чтобы расти, совершенствоваться и становиться всё более эффективным специалистом по data science!
Алекс Гутман, автор книги «Becoming a Data Head: How to Think, Speak, and Understand Data Science, Statistics, and Machine Learning»
Интерфейсы API становятся всё более важной составляющей в области искусственного интеллекта и исследования данных, и эта книга — ценнейший ресурс, позволяющий рассмотреть их с практической точки зрения.
Джеймс Гоф, заслуженный инженер в компании Morgan Stanley, автор книги «Проектирование архитектуры API»

Райан Дэй — высокопрофессиональный исследователь данных, работающий в компании CSBS и участвующий в разработке свободного ПО. Один из разработчиков фреймворка FastAPI, обладает опытом облачных вычислений и разработки API в государственном секторе.
Книгу “Прикладные API для искусственного интеллекта и Data Science” можно купить в нашем интенет-магазине.
Отзывы о книге……………………………………………………………………………………… 15
Предисловие…………………………………………………………………………………………… 17
Зачем вам читать эту книгу?…………………………………………………………………………………………………….. 17
Для кого эта книга……………………………………………………………………………………………………………………… 17
Для специалистов по работе с данными………………………………………………………………………. 17
Для разработчиков и проектировщиков API………………………………………………………………… 18
Для ищущих работу и желающих сменить свою роль………………………………………………… 18
Создание портфолио-проектов…………………………………………………………………………………………………. 18
Как пользоваться данной книгой……………………………………………………………………………………………… 19
Чем не является данная книга…………………………………………………………………………………………………… 19
Почему именно фэнтези-футбол?……………………………………………………………………………………………… 20
Получение дополнительных советов по API, искусственному интеллекту и науке о работе с данными 20
Соглашения, принятые в данной книге……………………………………………………………………………………. 21
Использование примеров кода…………………………………………………………………………………………………. 21
Платформа онлайн-обучения O’Reilly……………………………………………………………………………………… 22
Контактная информация…………………………………………………………………………………………………………… 22
Благодарности…………………………………………………………………………………………………………………………… 23
Часть I. Разработка API для задач Data Science…………………… 25
Глава 1. Создание API, которые понравятся специалистам по обработке данных 27
Для чего специалисты по обработке данных используют API-интерфейсы?………………………. 27
Какие инструменты используют специалисты по обработке данных?………………………………… 28
Проектирование API для специалистов по обработке данных……………………………………………… 29
Предоставление первой части вашего портфолио-проекта…………………………………………………… 30
У каждого API есть своя история……………………………………………………………………………………………… 31
Знакомьтесь с вашей компанией: SportsWorldCentral…………………………………………………. 31
SWC нуждается в API…………………………………………………………………………………………………….. 33
Выбор первых API-продуктов………………………………………………………………………………………………….. 34
Выявление потенциальных пользователей………………………………………………………………….. 34
Создание пользовательских историй……………………………………………………………………………. 36
Дополнительные источники информации……………………………………………………………………………….. 37
Резюме…………………………………………………………………………………………………………………………………………. 37
Глава 2. Выбор архитектуры, подходящей для API………………………………… 39
Архитектурные стили API…………………………………………………………………………………………………………. 39
Обмен репрезентациями ресурсов (Representational State Transfer, REST)……………….. 40
Язык графических запросов Graph Query Language (GraphQL)………………………………….. 40
gRPC…………………………………………………………………………………………………………………………………. 41
Ваш выбор: REST…………………………………………………………………………………………………………… 41
Технологическая архитектура…………………………………………………………………………………………………. 43
Программные средства, используемые в данной главе………………………………………………………….. 45
Python………………………………………………………………………………………………………………………………. 45
GitHub………………………………………………………………………………………………………………………………. 45
Начало работы с GitHub Codespace………………………………………………………………………………………… 46
Создание учетной записи в GitHub……………………………………………………………………………….. 46
Клонирование репозитория части первой……………………………………………………………………. 46
Запуск вашей среды GitHub Codespace………………………………………………………………………… 47
Знакомство с новым кодовым пространством……………………………………………………………… 47
Совершение вашего первого коммита………………………………………………………………………….. 49
Дополнительные источники информации……………………………………………………………………………….. 52
Резюме…………………………………………………………………………………………………………………………………………. 52
Глава 3. Создание базы данных…………………………………………………………….. 53
Компоненты API………………………………………………………………………………………………………………………… 53
Программные средства, используемые в данной главе………………………………………………………….. 54
SQLite……………………………………………………………………………………………………………………………….. 54
SQLAlchemy…………………………………………………………………………………………………………………….. 54
pytest………………………………………………………………………………………………………………………………… 55
Создание базы данных SQLite………………………………………………………………………………………………….. 55
Создание таблиц базы данных……………………………………………………………………………………… 56
Принципы формирования таблиц…………………………………………………………………………………. 58
Загрузка данных…………………………………………………………………………………………………………….. 59
Доступ к данным из Python……………………………………………………………………………………………………….. 61
Установка SQLAlchemy в вашу среду………………………………………………………………………….. 61
Создание Python-файлов для доступа к базе данных…………………………………………………. 62
Создание файла конфигурации базы данных……………………………………………………………… 67
Создание вспомогательных функций SQLAlchemy…………………………………………………….. 68
Установка pytest в вашу среду………………………………………………………………………………………. 72
Тестирование нашего кода SQLAchemy………………………………………………………………………. 73
Дополнительные источники информации……………………………………………………………………………….. 76
Резюме…………………………………………………………………………………………………………………………………………. 76
Глава 4. Разработка кода FastAPI………………………………………………………….. 79
Продолжение разработки портфолио-проекта……………………………………………………………………….. 79
Программные средства, используемые в данной главе………………………………………………………….. 80
FastAPI…………………………………………………………………………………………………………………………….. 80
HTTPX……………………………………………………………………………………………………………………………… 81
Pydantic……………………………………………………………………………………………………………………………. 81
Uvicorn……………………………………………………………………………………………………………………………… 82
Копирование файлов из каталога третьей главы……………………………………………………………………. 82
Установка в кодовое пространство новых библиотек……………………………………………………………. 82
Создание файлов на языке Python для нашего API………………………………………………………………… 83
Создание Pydantic-схем…………………………………………………………………………………………………. 83
Создание контроллера FastAPI…………………………………………………………………………………….. 87
Тестирование API………………………………………………………………………………………………………………………. 94
Запуск API………………………………………………………………………………………………………………………………….. 97
Дополнительные источники информации……………………………………………………………………………….. 99
Резюме………………………………………………………………………………………………………………………………………. 100
Глава 5. Документирование API…………………………………………………………… 101
Документация как сигнал доверия…………………………………………………………………………………………. 101
Создание высококачественной API-документации………………………………………………………………. 102
Основные функции……………………………………………………………………………………………………….. 102
Дополнительные функции……………………………………………………………………………………………. 103
Просмотр примеров документации по API……………………………………………………………………………. 104
Приложение Sleeper………………………………………………………………………………………………………. 104
MyFantasyLeague…………………………………………………………………………………………………………. 105
Yahoo! Фэнтези-футбол……………………………………………………………………………………………….. 105
Просмотр встроенной документации вашего API………………………………………………………………… 107
Копирование файлов из каталога четвертой главы………………………………………………….. 107
Вариант документации 1: Swagger UI………………………………………………………………………… 108
Вариант документации 2: Redoc………………………………………………………………………………… 113
Работа с файлом спецификации OpenAPI……………………………………………………………………………… 114
Продолжение разработки портфолио-проекта…………………………………………………………………….. 117
Добавление сведений к OAS-объекту info………………………………………………………………….. 118
Добавление тегов для классификации путей……………………………………………………………… 119
Добавление дополнительных сведений к конкретным конечным точкам………………. 120
Добавление описаний параметров……………………………………………………………………………… 121
Просмотр изменений в Swagger UI………………………………………………………………………………. 121
Регрессионное тестирование API………………………………………………………………………………… 123
Обновление файла README.md……………………………………………………………………………………………. 123
Дополнительные источники информации……………………………………………………………………………… 125
Резюме………………………………………………………………………………………………………………………………………. 126
Глава 6. Развертывание API в облаке…………………………………………………… 127
Преимущества и обязательства при развертывании API в облаке……………………………………… 127
Преимущества………………………………………………………………………………………………………………. 127
Обязательства……………………………………………………………………………………………………………….. 128
Выбор облачного хостинга для вашего проекта………………………………………………………………….. 129
Настройка каталога проекта………………………………………………………………………………………………….. 130
Использование GitHub Codespaces в качестве облачного хостинга…………………………………… 130
Развертывание в Render…………………………………………………………………………………………………………… 131
Регистрация на Render…………………………………………………………………………………………………. 132
Создание нового веб-сервиса………………………………………………………………………………………. 132
Автоматическое развертывание изменений в API……………………………………………………… 134
Упаковка приложения в контейнер Docker……………………………………………………………………………. 134
Проверка установки Docker…………………………………………………………………………………………. 135
Создание Dockerfile………………………………………………………………………………………………………. 135
Создание файла .dockerignore……………………………………………………………………………………… 137
Сборка образа контейнера………………………………………………………………………………………….. 137
Локальный запуск образа контейнера……………………………………………………………………….. 138
Развертывание в AWS……………………………………………………………………………………………………………… 139
Создание контейнерного Lightsail-сервиса………………………………………………………………… 139
Установка AWS CLI……………………………………………………………………………………………………… 140
Установка плагина Amazon Lightsail для работы с контейнерными сервисами…….. 140
Настройка параметров входа……………………………………………………………………………………… 140
Отправка нашего образа контейнера в Lightsail………………………………………………………… 141
Создание Lightsail-развертывания………………………………………………………………………………. 142
Обновление API-документации………………………………………………………………………………………………. 144
Дополнительные источники информации……………………………………………………………………………… 145
Резюме………………………………………………………………………………………………………………………………………. 145
Глава 7. Все включено: разработка Python SDK……………………………………. 147
SDK устраняют разрыв……………………………………………………………………………………………………………. 148
Выбор языка программирования для вашего SDK……………………………………………………………….. 151
Начнем с SDK с минимальным функционалом……………………………………………………………………… 152
Совет эксперта: упростите установку SDK……………………………………………………………….. 152
Совет эксперта: придайте SDK последовательность и идиоматичность………………… 153
Создание полнофункционального SDK…………………………………………………………………………………. 156
Совет эксперта: используйте разумные значения по умолчанию…………………………… 156
Совет эксперта: предоставьте полноценную функциональность……………………………. 159
Совет эксперта: ведите журнал событий…………………………………………………………………… 164
Совет эксперта: скрывайте сложности API……………………………………………………………….. 166
Совет эксперта: предоставляйте возможности bulk-загрузок………………………………….. 168
Совет эксперта: документируйте SDK……………………………………………………………………….. 171
Тестирование SDK………………………………………………………………………………………………………… 173
Совет эксперта: поддерживайте все задачи, реализуемые API……………………………….. 177
Завершение первой части нашего портфолио-проекта……………………………………………………….. 178
Дополнительные источники информации……………………………………………………………………………… 180
Резюме………………………………………………………………………………………………………………………………………. 180
Часть II. Использование API в проекте
по анализу данных……………………………………………………………………… 181
Глава 8. Что специалистам по анализу данных нужно знать об API…….. 183
Использование различных стилей API………………………………………………………………………………….. 183
Основы HTTP……………………………………………………………………………………………………………………………. 185
Как использовать API со всей ответственностью…………………………………………………………………. 187
Разделение ответственности: использование SDK или создание собственных клиентов для API 188
Как создаются API…………………………………………………………………………………………………………………… 190
Как тестируются API……………………………………………………………………………………………………………….. 190
Развертывание и контейнеризация API………………………………………………………………………………….. 191
Использование системы контроля версий……………………………………………………………………………… 191
Представление второй части портфолио-проекта……………………………………………………………….. 192
Приступаем к работе с GitHub Codespace…………………………………………………………………………….. 192
Клонирование репозитория части II………………………………………………………………………….. 192
Запуск вашей среды GitHub Codespace……………………………………………………………………… 193
Локальный запуск API SportsWorldCentral (SWC)………………………………………………………………… 194
Дополнительные источники информации……………………………………………………………………………… 196
Резюме………………………………………………………………………………………………………………………………………. 196
Глава 9. Использование API для аналитики данных……………………………. 197
Пользовательские метрики для спортивной аналитики……………………………………………………….. 197
Использование API в качестве источников данных для пользовательских метрик в фэнтези-аналитике 198
Создание пользовательской метрики: оценка Shark League (Лиги акул)…………………………… 199
Программные средства, используемые в данной главе……………………………………………………….. 200
httpx……………………………………………………………………………………………………………………………….. 200
Jupyter Notebooks………………………………………………………………………………………………………….. 201
pandas……………………………………………………………………………………………………………………………. 201
Установка новых библиотек в ваше кодовое пространство………………………………………………… 202
Запуск вашего API в кодовом пространстве…………………………………………………………………………. 202
Создание файла API-клиента…………………………………………………………………………………………………. 202
Создание блокнота Jupyter Notebook…………………………………………………………………………………….. 204
Добавление к блокноту общей конфигурации………………………………………………………………………. 205
Работа с данными вашего API………………………………………………………………………………………………… 207
Вычисление League Balance Score…………………………………………………………………………………………. 209
Вычисление League Juice Score………………………………………………………………………………………………. 211
Создание Shark League Score………………………………………………………………………………………………….. 212
Дополнительные источники информации……………………………………………………………………………… 213
Резюме………………………………………………………………………………………………………………………………………. 213
Глава 10. Использование API в конвейерах данных…………………………….. 215
Типы источников для конвейеров обработки данных………………………………………………………….. 215
Проектирование конвейера данных………………………………………………………………………………………. 216
Оркестрация конвейера данных с помощью Apache Airflow……………………………………………….. 217
Установка Apache Airflow в GitHub Codespaces……………………………………………………………………. 218
Создание локальной аналитической базы данных………………………………………………………………. 222
Запуск API в кодовом пространстве………………………………………………………………………………………. 222
Настройка Airflow-подключений……………………………………………………………………………………………. 222
Создание нашего первого DAG………………………………………………………………………………………………. 223
Создание совместно используемой функции………………………………………………………………………… 226
Запуск DAG………………………………………………………………………………………………………………………………. 228
Резюме………………………………………………………………………………………………………………………………………. 230
Глава 11. Обработка данных в приложениях Streamlit…………………………. 231
Привлечение пользователей с помощью интерактивной визуализации…………………………….. 231
Программные средства, используемые в данной главе……………………………………………………….. 232
nfl_data_py……………………………………………………………………………………………………………………. 232
Streamlit…………………………………………………………………………………………………………………………. 233
Установка Streamlit и nfl_data_py………………………………………………………………………………………….. 233
Запуск вашего API в кодовом пространстве…………………………………………………………………………. 233
Повторное использование файла API-клиента из главы 9…………………………………………………… 234
Создание Streamlit-приложения……………………………………………………………………………………………… 234
Обновление главного файла…………………………………………………………………………………………………… 234
Запуск Streamlit-приложения………………………………………………………………………………………………….. 235
Создание страницы с составами команд………………………………………………………………………………. 236
Создание страницы статистики команды……………………………………………………………………………… 239
Развертывание Streamlit-приложения…………………………………………………………………………………….. 242
Завершение второй части портфолио-проекта…………………………………………………………………….. 243
Дополнительные источники информации……………………………………………………………………………… 244
Резюме………………………………………………………………………………………………………………………………………. 245
Часть III. Использование API
с искусственным интеллектом……………………………………………. 247
Глава 12. Взаимосвязь API и искусственного интеллекта…………………….. 249
Точки пересечения ИИ и API…………………………………………………………………………………………………… 249
Проектирование API-интерфейсов для использования с генеративным ИИ
и большими языковыми моделями………………………………………………………………………………………….. 250
Определение искусственного интеллекта……………………………………………………………………………… 253
Генеративный ИИ и большие языковые модели……………………………………………………………………. 253
Создание агентных ИИ-приложений……………………………………………………………………………………… 254
Представление третьей части портфолио-проекта………………………………………………………………. 255
Запуск вашей среды GitHub Codespace…………………………………………………………………………………. 255
Клонирование репозитория части третьей………………………………………………………………… 255
Запуск вашей среды GitHub Codespace……………………………………………………………………… 256
Дополнительные источники информации……………………………………………………………………………… 257
Резюме………………………………………………………………………………………………………………………………………. 257
Глава 13. Развертывание API машинного обучения…………………………….. 259
Обучение моделей машинного обучения………………………………………………………………………………. 260
Программные средства, используемые в данной главе……………………………………………………….. 261
ONNX Runtime………………………………………………………………………………………………………………. 261
scikit-learn………………………………………………………………………………………………………………………. 262
sklearn-onnx…………………………………………………………………………………………………………………… 262
Установка в кодовое пространство новых библиотек…………………………………………………………. 262
Использование процесса CRISP-DM……………………………………………………………………………………… 263
Осмысление бизнес-задачи…………………………………………………………………………………………………….. 263
Анализ данных…………………………………………………………………………………………………………………………. 264
Подготовка данных…………………………………………………………………………………………………………………. 266
Моделирование……………………………………………………………………………………………………………………….. 266
Оценка………………………………………………………………………………………………………………………………………. 269
Развертывание………………………………………………………………………………………………………………………….. 269
Дополнительные источники информации……………………………………………………………………………… 277
Резюме………………………………………………………………………………………………………………………………………. 278
Глава 14. Использование API с LangChain……………………………………………. 279
Вызов искусственного интеллекта с использованием API (посредством LangChain)……….. 280
Создание LangGraph-агента…………………………………………………………………………………………………… 281
Регистрация в Anthropic……………………………………………………………………………………………….. 282
Запуск вашего кодового пространства GitHub………………………………………………………….. 283
Установка в кодовое пространство новых библиотек…………………………………………………………. 283
Создание блокнота Jupyter Notebook…………………………………………………………………………………….. 284
Общение с LangGraph-агентом……………………………………………………………………………………………….. 287
Локальный запуск API SportsWorldCentral (SWC)………………………………………………………………… 288
Установка Software Development Kit (SDK) swcpy………………………………………………………………… 289
Создание набора инструментов LangChain………………………………………………………………………….. 289
Вызов API-интерфейсов с использованием ИИ (с применением LangGraph)……………………… 293
Общение с агентом (с использованием инструментов)………………………………………………………… 295
Дополнительные источники информации……………………………………………………………………………… 297
Резюме………………………………………………………………………………………………………………………………………. 297
Глава 15. Использование ChatGPT для вызова вашего API………………….. 299
Архитектура вашего приложения………………………………………………………………………………………….. 299
Начало работы с ChatGPT……………………………………………………………………………………………………… 300
Создание специализированной GPT………………………………………………………………………………………. 300
Запуск вашего кодового пространства GitHub…………………………………………………………………….. 303
Запуск SportsWorldCentral (SWC) API в кодовом пространстве GitHub……………………………… 304
Добавление в ваш OAS-файл раздела Servers……………………………………………………………………….. 305
Создание GPT-действия…………………………………………………………………………………………………………… 306
Тестирование API в вашем GPT……………………………………………………………………………………………… 308
Общение с вашим специализированным GPT……………………………………………………………………….. 309
Завершение третьей части вашего портфолио-проекта………………………………………………………. 311
Резюме………………………………………………………………………………………………………………………………………. 313
Предметный указатель…………………………………………………………………………. 315
Об авторе……………………………………………………………………………………………… 317
Об изображении на обложке………………………………………………………………… 319

Книга представляет собой лаконичное и в то же время исчерпывающее руководство по построению языковых моделей. Рассматриваются математические основы машинного обучения, векторные представления и работа нейронных сетей. Изложены принципы моделирования языка: от мешков слов и эмбеддингов до рекуррентных сетей и архитектуры трансформеров. Приводятся полные реализации описанных моделей и методов на Python с использованием фреймворка PyTorch, включая примеры в виде Jupyter-блокнотов. Описаны методы обучения, тонкой настройки и оптимизации больших языковых моделей: LoRA, инженерия промптов, оценка качества, а также вопросы авторского права и этики. В заключительной главе даны направления для дальнейшего изучения: смесь экспертов, сжатие моделей, выравнивание на основе предпочтений, мультимодальные модели.
Для разработчиков и специалистов по языковым моделям
Эта книга развеяла для меня множество концептуальных неясностей в том, как на самом деле работает машинное обучение — она кристально ясная. Разобранные примеры и приложения в виде блокнотов Jupyter дали мне надежную отправную точку для дальнейших экспериментов. Даже если вы не планируете строить карьеру в области прикладного машинного обучения, эта книга станет прочным фундаментом для осмысления возможностей этих уникальных новых инструментов.
Винт Серф (Vint Cerf)— «отец Интернета», создатель протокола TCP/IP, лауреат премии Тьюринга, вице-президент Google.
Ключевые особенности книги:
Книгу “Языковые модели без лишних слов” можно купить в нашем интенет-магазине.

Книга посвящена разработке приложений для Windows, macOS, Linux и iOS с использованием библиотеки Qt версии 6.9. Подробно рассмотрены возможности, предоставляемые этой библиотекой, и описаны особенности, выгодно отличающие ее от других библиотек. Описана интегрированная среда разработки Qt Creator и работа с технологией Qt Quick. Книга содержит исчерпывающую информацию о классах Qt 6, и даны практические рекомендации их применения, проиллюстрированные на большом количестве подробно прокомментированных примеров. Отдельно освещена тема искусственного интеллекта и показано, как использовать Qt 6 в эпоху ИИ: от управления ИИ-агентами до промт-инжиниринга с применением облачных и локальных моделей. Проекты и примеры из книги, дополнительные и редко востребованные главы в цифровом формате размещены на сайте издательства.
Для программистов
Платформно-независимая реализация приложений — это уже сегодняшний и завтрашний день программной индустрии. И эта книга станет вашим надежным путеводителем в эру Qt 6 и ИИ-разработки.
Книга подробно знакомит с библиотекой Qt 6.9, являющейся не только средством для создания пользовательских интерфейсов, но и позволяющей разрабатывать приложения практически любой сложности.
Недаром Qt широко используется многими организациями и компаниями, такими как Adobe, Amazon, AMD, Bosch, BMW, Canon, Cisco Systems, Disney, Intel, IBM, Panasonic, Parallels, Pioneer, Philips, Oracle, HP, Google, Mercedes Benz, NASA, NEC, Neonway, Nokia, Rakuten, Samsung, Siemens, Sony, SUN, Tesla, Xerox, Xilinx, Yamaha и др.
Если вы хотите идти в ногу со временем, то вам без этой книги просто не обойтись, поскольку она является исчерпывающим пособием по созданию программ на Qt 6 с использованием C++ и QML.

Макс Шлее (Max Schlee) — закончил Университет прикладных наук в городе Кайзерлаутерн (Германия). Сооснователь компании Neonway по разработке программного обеспечения на Qt. Работал разработчиком программного обеспечения в фирмах THOMSON, Grass Valley, DigitalFilmTechnology, Goober Ltd. и Advancis. Эксперт в области объектно-ориентированного проектирования, специализирующийся на C++ и Qt. Создатель более 50 программ и приложений для Windows, macOS, iOS и Android. Увлечено занимается проектами в области программирования графики, звука и анализа финансовых рынков. Является автором ряда статей, научных докладов на международных конференциях по генеративному программированию пользовательского интерфейса. С 2022 года активно интегрирует современные ИИ-инструменты в процесс разработки: от архитектуры ПО до создания UI/UX прототипов, автоматизации тестирования и генерации контента. Автор книг «Qt 3/4/4.5/4.8/5.3/5.10. Профессиональное программирование на C++» и др. Связаться с автором можно по адресу электронной почты Max.Schlee@neonway.com или через страницу информационной поддержки книги www.qt-book.com.
Книгу “Qt 6.9. Профессиональное программирование на C++” можно купить в нашем интенет-магазине.
Предисловие Маттиаса Эттриха к первому изданию……………………………… 26
Благодарности……………………………………………………………………………………….. 28
Предисловие автора……………………………………………………………………………….. 29
Структура книги………………………………………………………………………………………………………………………… 30
Часть I. Основы Qt……………………………………………………………………………………………………………… 30
Часть II. Элементы управления………………………………………………………………………………………… 31
Часть III. События и взаимодействие с пользователем………………………………………………….. 32
Часть IV. Графика и звук…………………………………………………………………………………………………… 32
Часть V. Создание приложений………………………………………………………………………………………… 33
Часть VI. Особые возможности Qt……………………………………………………………………………………. 34
Часть VII. Язык сценариев JavaScript………………………………………………………………………………. 35
Часть VIII. Технология Qt Quick……………………………………………………………………………………….. 36
Часть IX. Мобильные приложения и Qt……………………………………………………………………………. 37
Часть X. Qt и ИИ…………………………………………………………………………………………………………………. 37
Приложения………………………………………………………………………………………………………………………… 38
Файловый архив…………………………………………………………………………………………………………………. 38
Введение………………………………………………………………………………………………… 39
Часть I. Основы Qt…………………………………………………………………………. 51
Глава 1. Обзор иерархии классов Qt………………………………………………………. 52
Первая программа на Qt……………………………………………………………………………………………………………. 52
Модули Qt…………………………………………………………………………………………………………………………………… 53
Пространство имен Qt……………………………………………………………………………………………………….. 55
Модуль QtCore…………………………………………………………………………………………………………………… 55
Модуль QtGui……………………………………………………………………………………………………………………… 56
Модуль QtWidgets………………………………………………………………………………………………………………. 56
Модули QtQuick и QtQML………………………………………………………………………………………………….. 58
Модуль QtNetwork……………………………………………………………………………………………………………… 58
Модули QtXml…………………………………………………………………………………………………………………….. 58
Модуль QtSql……………………………………………………………………………………………………………………… 58
Модули QtMultimedia и QtMultimediaWidgets…………………………………………………………………. 58
Модуль QtSvg……………………………………………………………………………………………………………………… 59
Дополнительные модули Qt……………………………………………………………………………………………………… 59
Резюме…………………………………………………………………………………………………………………………………………. 60
Глава 2. Философия объектной модели………………………………………………….. 61
Механизм сигналов и слотов……………………………………………………………………………………………………. 64
Сигналы………………………………………………………………………………………………………………………………. 67
Слоты………………………………………………………………………………………………………………………………….. 69
Соединение объектов…………………………………………………………………………………………………………. 70
Новый синтаксис соединений………………………………………………………………………………….. 70
Классический синтаксис соединений……………………………………………………………………… 70
Разъединение объектов……………………………………………………………………………………………………… 75
Переопределение сигналов……………………………………………………………………………………………….. 76
Организация объектных иерархий…………………………………………………………………………………………… 77
Метаобъектная информация…………………………………………………………………………………………………….. 80
Резюме…………………………………………………………………………………………………………………………………………. 80
Глава 3. Работа с Qt……………………………………………………………………………….. 82
Интегрированная среда разработки………………………………………………………………………………………… 82
Программа Qt Assistant……………………………………………………………………………………………………………… 82
Работа с системами сборки………………………………………………………………………………………………………. 84
Работа с CMake………………………………………………………………………………………………………………….. 84
Работа с qmake…………………………………………………………………………………………………………………… 85
Как перейти с qmake на CMake в Qt 6?……………………………………………………………………………. 87
Рекомендации для проекта с Qt………………………………………………………………………………………………… 88
Метаобъектный компилятор MOC…………………………………………………………………………………………… 89
Компилятор ресурсов RCC……………………………………………………………………………………………………….. 90
Структура Qt-проекта……………………………………………………………………………………………………………….. 91
Методы отладки………………………………………………………………………………………………………………………… 91
Прочие методы отладки…………………………………………………………………………………………………….. 92
Глобальные определения Qt…………………………………………………………………………………………………….. 96
Информация о библиотеке Qt……………………………………………………………………………………………………. 97
Резюме…………………………………………………………………………………………………………………………………………. 98
Глава 4. Библиотека контейнеров………………………………………………………… 100
Контейнерные классы……………………………………………………………………………………………………………… 101
Итераторы………………………………………………………………………………………………………………………………… 103
Итераторы в стиле Java…………………………………………………………………………………………………… 103
Итераторы в стиле STL……………………………………………………………………………………………………. 104
Современный стиль итерации с range-based for……………………………………………………………. 105
Использование алгоритмов STL с лямбдами…………………………………………………………………. 106
Ключевое слово foreach………………………………………………………………………………………………….. 106
Последовательные контейнеры……………………………………………………………………………………………… 107
Массив байтов: класс QByteArray…………………………………………………………………………. 108
Массив битов: класс QBitArray……………………………………………………………………………… 109
Списки QList<T>………………………………………………………………………………………………………………. 109
Стек: класс QStack<T>……………………………………………………………………………………………………. 110
Очередь: класс QQueue<T>…………………………………………………………………………………………….. 111
Ассоциативные контейнеры……………………………………………………………………………………………………. 112
Словари QMap<K,T> и QMultiMap<K,T>…………………………………………………………………….. 112
Хеши QHash<K,T> и QMultiHash<K,T>………………………………………………………………………… 114
Множество QSet<T>………………………………………………………………………………………………………… 115
Алгоритмы………………………………………………………………………………………………………………………………… 116
Сортировка……………………………………………………………………………………………………………………….. 117
Поиск…………………………………………………………………………………………………………………………………. 118
Сравнение…………………………………………………………………………………………………………………………. 118
Заполнение значениями…………………………………………………………………………………………………… 118
Копирование значений элементов………………………………………………………………………………….. 119
Подсчет значений…………………………………………………………………………………………………………….. 119
Строки………………………………………………………………………………………………………………………………………. 119
Регулярные выражения……………………………………………………………………………………………………. 121
Произвольный тип: класс QVariant………………………………………………………………………………………… 124
Модель общего использования данных………………………………………………………………………………… 125
Резюме………………………………………………………………………………………………………………………………………. 126
Часть II. Элементы управления………………………………………………. 127
Глава 5. С чего начинаются элементы управления?…………………………….. 128
Класс QWidget………………………………………………………………………………………………………………………….. 128
Размеры и координаты виджета……………………………………………………………………………………… 131
Механизм закулисного хранения…………………………………………………………………………………… 132
Установка фона виджета…………………………………………………………………………………………………. 132
Изменение указателя мыши…………………………………………………………………………………………….. 133
Стек виджетов………………………………………………………………………………………………………………………….. 136
Рамки…………………………………………………………………………………………………………………………………………. 136
Виджет видовой прокрутки…………………………………………………………………………………………………….. 137
Резюме………………………………………………………………………………………………………………………………………. 139
Глава 6. Управление автоматическим размещением элементов……………. 141
Менеджеры компоновки (layout managers)……………………………………………………………………………. 141
Горизонтальное и вертикальное размещение……………………………………………………………….. 143
Класс QBoxLayout…………………………………………………………………………………………………… 143
Горизонтальное размещение QHBoxLayout…………………………………………………………. 145
Вертикальное размещение QVBoxLayout……………………………………………………………… 146
Вложенные размещения………………………………………………………………………………………………….. 147
Табличное размещение QGridLayout……………………………………………………………………………… 148
Размещение в виде формы: класс QFormLayout…………………………………………………………….. 153
Порядок следования табулятора……………………………………………………………………………………………. 154
Разделители: класс QSplitter…………………………………………………………………………………………………… 155
Резюме………………………………………………………………………………………………………………………………………. 156
Глава 7. Элементы отображения…………………………………………………………… 158
Надписи……………………………………………………………………………………………………………………………………. 158
Управление выравниванием текста……………………………………………………………………………….. 158
Отображение HTML-содержимого………………………………………………………………………………… 159
Отображение графической информации……………………………………………………………………….. 160
Взаимодействие с другими виджетами………………………………………………………………………….. 161
Использование гиперссылок…………………………………………………………………………………………… 162
Отображение числовых значений………………………………………………………………………………….. 163
Выделение и копирования текста…………………………………………………………………………………… 163
Индикатор выполнения…………………………………………………………………………………………………………… 163
Индикатор бесконечного выполнения……………………………………………………………………………. 165
Электронный индикатор…………………………………………………………………………………………………………. 166
Ограничения электронного индикатора………………………………………………………………………… 168
Резюме………………………………………………………………………………………………………………………………………. 168
Глава 8. Кнопки, флажки и переключатели…………………………………………. 169
С чего начинаются кнопки? Класс QAbstractButton…………………………………………………………….. 169
Установка текста и изображения……………………………………………………………………………………. 169
Взаимодействие с пользователем…………………………………………………………………………………… 169
Опрос состояния………………………………………………………………………………………………………………. 170
Кнопки………………………………………………………………………………………………………………………………………. 170
Флажки……………………………………………………………………………………………………………………………………… 173
Переключатели………………………………………………………………………………………………………………………… 174
Группировка кнопок………………………………………………………………………………………………………………… 175
Резюме………………………………………………………………………………………………………………………………………. 178
Глава 9. Элементы настройки………………………………………………………………. 180
Класс QAbstractSlider……………………………………………………………………………………………………………… 180
Изменение положения……………………………………………………………………………………………………… 180
Установка диапазона………………………………………………………………………………………………………. 180
Установка шага………………………………………………………………………………………………………………… 181
Установка и получение значений…………………………………………………………………………………… 181
Ползунок…………………………………………………………………………………………………………………………………… 181
Полоса прокрутки……………………………………………………………………………………………………………………. 183
Установщик………………………………………………………………………………………………………………………………. 184
Резюме………………………………………………………………………………………………………………………………………. 185
Глава 10. Элементы ввода……………………………………………………………………. 187
Однострочное текстовое поле………………………………………………………………………………………………… 187
Редактор текста……………………………………………………………………………………………………………………….. 189
Запись в файл……………………………………………………………………………………………………………………. 191
Расцветка синтаксиса (syntax highlighting)…………………………………………………………………….. 192
С чего начинаются виджеты счетчиков?……………………………………………………………………………….. 198
Счетчик……………………………………………………………………………………………………………………………… 199
Элемент ввода даты и времени……………………………………………………………………………………….. 200
Проверка ввода………………………………………………………………………………………………………………………… 200
Резюме………………………………………………………………………………………………………………………………………. 202
Глава 11. Элементы выбора…………………………………………………………………. 203
Простой список………………………………………………………………………………………………………………………… 203
Вставка элементов…………………………………………………………………………………………………………… 203
Выбор элементов пользователем……………………………………………………………………………………. 205
Изменение элементов пользователем…………………………………………………………………………….. 205
Режим пиктограмм……………………………………………………………………………………………………………. 205
Сортировка элементов…………………………………………………………………………………………………….. 206
Иерархические списки…………………………………………………………………………………………………………….. 206
Сортировка элементов…………………………………………………………………………………………………….. 209
Таблицы……………………………………………………………………………………………………………………………………. 210
Выпадающий список……………………………………………………………………………………………………………….. 211
Вкладки…………………………………………………………………………………………………………………………………….. 213
Виджет панели инструментов………………………………………………………………………………………………… 214
Резюме………………………………………………………………………………………………………………………………………. 215
Глава 12. Интервью, или модель-представление…………………………………… 216
Концепция………………………………………………………………………………………………………………………………… 217
Модель………………………………………………………………………………………………………………………………. 218
Представление………………………………………………………………………………………………………………….. 219
Выделение элемента………………………………………………………………………………………………………… 220
Делегат……………………………………………………………………………………………………………………………… 222
Индексы модели……………………………………………………………………………………………………………………….. 224
Иерархические данные……………………………………………………………………………………………………………. 225
Роли элементов………………………………………………………………………………………………………………………… 229
Создание собственных моделей данных……………………………………………………………………………….. 230
Промежуточная модель данных (Proxy model)…………………………………………………………………….. 238
Модель элементно-ориентированных классов…………………………………………………………………….. 240
Резюме………………………………………………………………………………………………………………………………………. 242
Глава 13. Цветовая палитра элементов управления……………………………… 244
Поддержка тёмных тем……………………………………………………………………………………………………………. 247
Резюме………………………………………………………………………………………………………………………………………. 248
Часть III. События и взаимодействие с пользователем. 249
Глава 14. События……………………………………………………………………………….. 250
Переопределение специализированных методов обработки событий………………………………. 252
События клавиатуры……………………………………………………………………………………………………….. 252
Класс QKeyEvent…………………………………………………………………………………………………….. 252
Класс QFocusEvent…………………………………………………………………………………………………. 255
Событие обновления контекста рисования: класс QPaintEvent………………………………….. 255
События мыши…………………………………………………………………………………………………………………. 256
Класс QMouseEvent………………………………………………………………………………………………… 256
Класс QWheelEvent…………………………………………………………………………………………………. 260
Методы enterEvent() и leaveEvent()……………………………………………………………………….. 261
Событие таймера: класс QTimerEvent……………………………………………………………………………. 261
События перетаскивания (drag & drop)………………………………………………………………………….. 261
Класс QDragEnterEvent………………………………………………………………………………………….. 261
Класс QDragLeaveEvent…………………………………………………………………………………………. 262
Класс QDragMoveEvent………………………………………………………………………………………….. 262
Класс QDropEvent…………………………………………………………………………………………………… 262
Остальные классы событий…………………………………………………………………………………………….. 262
Класс QChildEvent………………………………………………………………………………………………….. 262
Класс QCloseEvent………………………………………………………………………………………………….. 262
Класс QHideEvent……………………………………………………………………………………………………. 262
Класс QMoveEvent………………………………………………………………………………………………….. 262
Класс QShowEvent………………………………………………………………………………………………….. 263
Класс QResizeEvent…………………………………………………………………………………………………. 263
Реализация собственных классов событий…………………………………………………………………………… 264
Переопределение метода event()…………………………………………………………………………………………….. 264
Мультитач………………………………………………………………………………………………………………………………… 267
Сохранение работоспособности приложения………………………………………………………………………. 272
Резюме………………………………………………………………………………………………………………………………………. 272
Глава 15. Фильтры событий…………………………………………………………………. 274
Реализация фильтров событий……………………………………………………………………………………………….. 274
Использование лямбда-выражений с фильтрами событий………………………………………………….. 277
Резюме………………………………………………………………………………………………………………………………………. 278
Глава 16. Искусственное создание событий…………………………………………. 279
Резюме………………………………………………………………………………………………………………………………………. 282
Часть IV. Графика и звук…………………………………………………………….. 285
Глава 17. Введение в компьютерную графику……………………………………… 286
Классы геометрии……………………………………………………………………………………………………………………. 286
Точка…………………………………………………………………………………………………………………………………. 286
Двумерный размер…………………………………………………………………………………………………………… 287
Прямоугольник…………………………………………………………………………………………………………………. 289
Прямая линия……………………………………………………………………………………………………………………. 289
Многоугольник…………………………………………………………………………………………………………………. 290
Цвет…………………………………………………………………………………………………………………………………………… 290
Класс QСolor……………………………………………………………………………………………………………………. 291
Цветовая модель RGB……………………………………………………………………………………………………… 291
Цветовая модель HSV………………………………………………………………………………………………………. 292
Цветовая модель HSL………………………………………………………………………………………………………. 294
Цветовая модель CMYK………………………………………………………………………………………………….. 295
Палитра…………………………………………………………………………………………………………………………….. 296
Предопределенные цвета………………………………………………………………………………………………… 296
Резюме………………………………………………………………………………………………………………………………………. 297
Глава 18. Легенда о короле Артуре и контекст рисования……………………. 299
Класс QPainter…………………………………………………………………………………………………………………………. 301
Перья и кисти……………………………………………………………………………………………………………………………. 302
Перо…………………………………………………………………………………………………………………………………… 302
Кисть…………………………………………………………………………………………………………………………………. 303
Градиенты………………………………………………………………………………………………………………………………… 304
Техника сглаживания (Anti-aliasing)………………………………………………………………………………………. 306
Рисование…………………………………………………………………………………………………………………………………. 307
Рисование точек……………………………………………………………………………………………………………….. 308
Рисование линий………………………………………………………………………………………………………………. 308
Рисование сплошных прямоугольников………………………………………………………………………… 309
Рисование заполненных фигур……………………………………………………………………………………….. 310
Запись команд рисования……………………………………………………………………………………………………….. 313
Трансформация систем координат………………………………………………………………………………………… 313
Перемещение…………………………………………………………………………………………………………………….. 314
Масштабирование…………………………………………………………………………………………………………… 314
Поворот…………………………………………………………………………………………………………………………….. 315
Скос…………………………………………………………………………………………………………………………………… 315
Трансформационные матрицы……………………………………………………………………………………….. 315
Графическая траектория (painter path)………………………………………………………………………………….. 316
Отсечения…………………………………………………………………………………………………………………………………. 317
Режим совмещения (composition mode)………………………………………………………………………………….. 318
Графические эффекты……………………………………………………………………………………………………………… 321
Диагностика проблем с рисованием………………………………………………………………………………………. 323
Резюме………………………………………………………………………………………………………………………………………. 323
Глава 19. Растровые изображения………………………………………………………… 325
Форматы графических файлов……………………………………………………………………………………………….. 325
Формат BMP…………………………………………………………………………………………………………………….. 325
Формат GIF……………………………………………………………………………………………………………………….. 326
Формат PNG……………………………………………………………………………………………………………………… 326
Формат JPEG…………………………………………………………………………………………………………………….. 326
Формат WEBP…………………………………………………………………………………………………………………… 326
Формат XPM…………………………………………………………………………………………………………………….. 326
Контекстно-независимое представление………………………………………………………………………………. 328
Класс QImage……………………………………………………………………………………………………………………. 328
Класс QImage как контекст рисования…………………………………………………………………………… 335
Контекстно-зависимое представление…………………………………………………………………………………… 337
Класс QPixmap…………………………………………………………………………………………………………………. 337
Класс QPixmapCache……………………………………………………………………………………………………….. 338
Класс QBitmap………………………………………………………………………………………………………………….. 339
Создание нестандартного окна виджета……………………………………………………………………….. 339
Резюме………………………………………………………………………………………………………………………………………. 341
Глава 20. Работа со шрифтами……………………………………………………………… 342
Отображение строки……………………………………………………………………………………………………………….. 344
Резюме………………………………………………………………………………………………………………………………………. 347
Глава 21. Графическое представление………………………………………………….. 348
Сцена………………………………………………………………………………………………………………………………………… 349
Представление…………………………………………………………………………………………………………………………. 350
Элемент…………………………………………………………………………………………………………………………………….. 350
Определение столкновений элементов…………………………………………………………………………… 353
События……………………………………………………………………………………………………………………………………. 354
Виджеты в графическом представлении……………………………………………………………………………….. 358
Резюме………………………………………………………………………………………………………………………………………. 360
Глава 22. Анимация……………………………………………………………………………… 362
Класс QMovie…………………………………………………………………………………………………………………………… 362
SVG-графика…………………………………………………………………………………………………………………………….. 363
Анимационный движок и машина состояний……………………………………………………………………….. 365
Смягчающие линии………………………………………………………………………………………………………….. 367
Настройка кривых Безье и TCB-сплайнов…………………………………………………………………….. 373
Машина состояний и переходы……………………………………………………………………………………… 373
Резюме………………………………………………………………………………………………………………………………………. 375
Глава 23. Работа с OpenGL…………………………………………………………………… 377
Основные положения OpenGL………………………………………………………………………………………………… 377
Реализация OpenGL-программы…………………………………………………………………………………………….. 379
Разворачивание OpenGL-программ во весь экран………………………………………………………………… 382
Графические примитивы OpenGL…………………………………………………………………………………………… 382
Трехмерная графика………………………………………………………………………………………………………………… 385
Резюме………………………………………………………………………………………………………………………………………. 390
Глава 24. Вывод на печать…………………………………………………………………… 391
Класс QPrinter………………………………………………………………………………………………………………………….. 391
Многостраничная печать………………………………………………………………………………………………… 396
Резюме………………………………………………………………………………………………………………………………………. 397
Глава 25. Разработка собственных элементов управления…………………… 398
Примеры создания виджетов………………………………………………………………………………………………….. 398
Лучшие практики при создании собственных виджетов……………………………………………………… 403
Резюме………………………………………………………………………………………………………………………………………. 404
Глава 26. Элементы со стилем………………………………………………………………. 405
Встроенные стили……………………………………………………………………………………………………………………. 407
Поддержка темной темы…………………………………………………………………………………………………………. 411
Создание собственных стилей……………………………………………………………………………………………….. 411
Методы рисования элементов управления……………………………………………………………………………. 412
Метод рисования простых элементов управления……………………………………………………….. 412
Метод рисования основных элементов управления…………………………………………………….. 413
Метод рисования составных элементов управления……………………………………………………. 413
Реализация стиля простого элемента управления………………………………………………………… 413
Использование каскадных стилей документа………………………………………………………………………. 417
Основные положения……………………………………………………………………………………………………….. 417
Изменение подэлементов…………………………………………………………………………………………………. 419
Управление состояниями………………………………………………………………………………………………… 420
Пример………………………………………………………………………………………………………………………………. 421
Резюме………………………………………………………………………………………………………………………………………. 425
Глава 27. Мультимедиа………………………………………………………………………… 426
Звук……………………………………………………………………………………………………………………………………………. 426
Воспроизведение звуковых эффектов: класс QSoundEffect………………………………………….. 427
Воспроизведение мультимедиа: класс QMediaPlayer………………………………………………….. 427
Создание аудиоплеера…………………………………………………………………………………………… 428
Видео и класс QMediaPlayer…………………………………………………………………………………………… 434
Обработка ошибок в мультимедийных приложениях………………………………………………….. 437
Поддержка камеры…………………………………………………………………………………………………………… 437
Запись медиаконтента…………………………………………………………………………………………………….. 438
Резюме………………………………………………………………………………………………………………………………………. 439
Часть V. Создание приложений………………………………………………. 441
Глава 28. Сохранение настроек приложения………………………………………… 442
Улучшенный доступ к данным……………………………………………………………………………………………….. 449
Резюме………………………………………………………………………………………………………………………………………. 450
Глава 29. Буфер обмена и перетаскивание…………………………………………… 451
Буфер обмена…………………………………………………………………………………………………………………………… 451
Перетаскивание……………………………………………………………………………………………………………………….. 452
Реализация drag………………………………………………………………………………………………………………… 454
Реализация drop……………………………………………………………………………………………………………….. 456
Создание собственных типов перетаскивания……………………………………………………………… 458
Практические советы по работе с буфером обмена и перетаскиванием……………………………. 463
Резюме………………………………………………………………………………………………………………………………………. 464
Глава 30. Интернационализация приложения (см. эл. архив)…………… 1
Подготовка приложения к интернационализации…………………………………………………………. 1
Утилита lupdate………………………………………………………………………………………………………………… 4
Программа Qt Linguist………………………………………………………………………………………………………. 5
Утилита lrelease. Пример программы, использующей перевод…………………………………….. 7
Смена перевода в процессе работы программы……………………………………………………………. 9
Завершающие размышления…………………………………………………………………………………………. 12
Резюме……………………………………………………………………………………………………………………………… 13
Глава 31. Создание меню……………………………………………………………………… 466
«Анатомия» меню…………………………………………………………………………………………………………………….. 466
Контекстные меню…………………………………………………………………………………………………………………… 470
Резюме………………………………………………………………………………………………………………………………………. 471
Глава 32. Диалоговые окна………………………………………………………………….. 473
Правила создания диалоговых окон……………………………………………………………………………………… 473
Класс QDialog………………………………………………………………………………………………………………………….. 474
Модальные диалоговые окна…………………………………………………………………………………………. 474
Немодальные диалоговые окна……………………………………………………………………………………… 475
Создание собственного диалогового окна…………………………………………………………………….. 476
Стандартные диалоговые окна………………………………………………………………………………………………. 479
Диалоговое окно выбора файлов……………………………………………………………………………………. 479
Диалоговое окно настройки принтера…………………………………………………………………………… 483
Диалоговое окно выбора цвета………………………………………………………………………………………. 484
Диалоговое окно выбора шрифта…………………………………………………………………………………… 485
Диалоговое окно ввода……………………………………………………………………………………………………. 486
Диалоговое окно процесса……………………………………………………………………………………………… 487
Диалоговые окна мастера……………………………………………………………………………………………….. 488
Диалоговые окна сообщений………………………………………………………………………………………………….. 489
Окно информационного сообщения……………………………………………………………………………….. 492
Окно предупреждающего сообщения…………………………………………………………………………….. 492
Окно критического сообщения……………………………………………………………………………………….. 492
Окно сообщения о программе…………………………………………………………………………………………. 493
Окно сообщения About Qt………………………………………………………………………………………………… 493
Окно сообщения об ошибке…………………………………………………………………………………………….. 493
Резюме………………………………………………………………………………………………………………………………………. 494
Глава 33. Предоставление помощи………………………………………………………. 496
Всплывающая подсказка………………………………………………………………………………………………………… 496
Система помощи (Online Help)………………………………………………………………………………………………… 498
Использование QAssistant……………………………………………………………………………………………………….. 500
Резюме………………………………………………………………………………………………………………………………………. 501
Глава 34. Главное окно, создание SDI- и MDI-приложений………………….. 503
Класс главного окна QMainWindow………………………………………………………………………………………. 503
Класс действия QAction…………………………………………………………………………………………………………… 504
Панель инструментов………………………………………………………………………………………………………………. 505
Доки…………………………………………………………………………………………………………………………………………… 507
Строка состояния…………………………………………………………………………………………………………………….. 508
Окно заставки…………………………………………………………………………………………………………………………… 509
SDI- и MDI-приложения………………………………………………………………………………………………………….. 511
SDI-приложение……………………………………………………………………………………………………………….. 512
MDI-приложение……………………………………………………………………………………………………………… 517
Резюме………………………………………………………………………………………………………………………………………. 525
Глава 35. Рабочий стол (Desktop)………………………………………………………….. 527
Область уведомлений……………………………………………………………………………………………………………… 527
Работа с экранами…………………………………………………………………………………………………………………… 532
Центрирование окна на экране………………………………………………………………………………………. 532
Получение списка экранов……………………………………………………………………………………………… 532
Работа с координатами и экранами……………………………………………………………………………….. 533
Сигналы QScreen……………………………………………………………………………………………………………… 533
Пример: приложение для захвата экрана……………………………………………………………………… 533
Класс сервиса рабочего стола……………………………………………………………………………………………….. 536
Резюме………………………………………………………………………………………………………………………………………. 536
Часть VI. Особые возможности Qt………………………………………… 537
Глава 36. Работа с файлами, каталогами и потоками ввода/вывода…….. 538
Ввод/вывод: класс QIODevice…………………………………………………………………………………………………. 538
Работа с файлами: класс QFile………………………………………………………………………………………………. 540
Класс QBuffer……………………………………………………………………………………………………………………. 542
Класс QTemporaryFile……………………………………………………………………………………………………… 542
Работа с каталогами: класс QDir…………………………………………………………………………………………… 543
Просмотр содержимого каталога…………………………………………………………………………………… 543
Получение путей к стандартным каталогам…………………………………………………………………. 546
Информация о файлах: класс QFileInfo…………………………………………………………………………………. 547
Файл или каталог?…………………………………………………………………………………………………………… 548
Путь и имя файла……………………………………………………………………………………………………………… 548
Информация о дате и времени………………………………………………………………………………………… 548
Получение атрибутов файла…………………………………………………………………………………………… 548
Определение размера файла…………………………………………………………………………………………… 549
Наблюдение за файлами и каталогами…………………………………………………………………………………. 549
Потоки ввода/вывода………………………………………………………………………………………………………………. 551
Класс QTextStream……………………………………………………………………………………………………………. 551
Класс QDataStream………………………………………………………………………………………………………….. 552
Информация о хранилищах……………………………………………………………………………………………………. 553
Резюме………………………………………………………………………………………………………………………………………. 553
Глава 37. Дата, время и таймер…………………………………………………………….. 555
Дата и время…………………………………………………………………………………………………………………………….. 555
Класс даты QDate…………………………………………………………………………………………………………….. 555
Класс времени: QTime……………………………………………………………………………………………………… 557
Класс даты и времени: QDateTime………………………………………………………………………………….. 558
Таймер………………………………………………………………………………………………………………………………………. 558
Событие таймера……………………………………………………………………………………………………………… 559
Класс QTimer…………………………………………………………………………………………………………………….. 561
Класс QBasicTimer……………………………………………………………………………………………………………. 563
Работа с временнми зонами………………………………………………………………………………………….. 563
Резюме………………………………………………………………………………………………………………………………………. 564
Глава 38. Процессы и потоки……………………………………………………………….. 565
Процессы………………………………………………………………………………………………………………………………….. 565
Потоки………………………………………………………………………………………………………………………………………. 568
Подход 1: наследование от QThread……………………………………………………………………………… 570
Подход 2: перемещение объекта в поток……………………………………………………………………….. 570
Приоритеты………………………………………………………………………………………………………………………. 571
Обмен сообщениями………………………………………………………………………………………………………… 571
Сигнально-слотовые соединения………………………………………………………………………….. 572
Отправка событий…………………………………………………………………………………………………… 577
Синхронизация…………………………………………………………………………………………………………………. 579
Мьютексы………………………………………………………………………………………………………………… 580
Семафоры………………………………………………………………………………………………………………… 581
Ожидание условий………………………………………………………………………………………………….. 582
Блокировка чтения/записи…………………………………………………………………………………….. 583
Возникновение тупиковых ситуаций…………………………………………………………………….. 583
Фреймворк QtConcurrent…………………………………………………………………………………………………………. 584
Цепочки операций……………………………………………………………………………………………………………. 586
Поддержка лямбда-выражений………………………………………………………………………………………. 586
Класс QPromise………………………………………………………………………………………………………………… 586
Резюме………………………………………………………………………………………………………………………………………. 587
Глава 39. Программирование поддержки сети……………………………………… 589
Сокетное соединение………………………………………………………………………………………………………………. 589
Модель «клиент-сервер»………………………………………………………………………………………………….. 590
Реализация TCP-сервера…………………………………………………………………………………………………. 591
Реализация TCP-клиента…………………………………………………………………………………………………. 596
Реализация UDP-сервера и UDP-клиента………………………………………………………………………………. 601
Управление доступом к сети…………………………………………………………………………………………………… 604
Блокирующий подход……………………………………………………………………………………………………………… 610
Режим прокси……………………………………………………………………………………………………………………………. 613
Информация о хосте………………………………………………………………………………………………………………… 613
Есть ли соединение с Интернетом?………………………………………………………………………………………… 614
Новый HTTP-стек…………………………………………………………………………………………………………………….. 615
Протокол WebSocket……………………………………………………………………………………………………………….. 616
Резюме………………………………………………………………………………………………………………………………………. 617
Глава 40. Работа с XML, JSON и Protobuf…………………………………………….. 619
Формат XML…………………………………………………………………………………………………………………………….. 619
Основные понятия и структура XML-документа………………………………………………………….. 619
XML и Qt…………………………………………………………………………………………………………………………… 621
Работа с DOM…………………………………………………………………………………………………………………… 621
Чтение XML-документа………………………………………………………………………………………….. 622
Создание и запись XML-документа………………………………………………………………………. 624
Работа с SAX…………………………………………………………………………………………………………………….. 626
Чтение XML-документа………………………………………………………………………………………….. 626
Классы QXmlStreamReader и QXmlStreamWriter……………………………………………………………. 629
Чтение XML с помощью QXmlStreamReader………………………………………………………… 629
Запись XML с помощью QXmlStreamWriter………………………………………………………….. 630
Формат JSON……………………………………………………………………………………………………………………………. 631
Основные классы для работы с JSON…………………………………………………………………………….. 631
Чтение JSON-файла………………………………………………………………………………………………………….. 632
Запись JSON-файла………………………………………………………………………………………………………….. 633
Формат Protobuf………………………………………………………………………………………………………………………. 635
Схема данных (proto-файл)…………………………………………………………………………………………….. 635
Создание файла с Protobuf-данными……………………………………………………………………………… 636
Чтение Protobuf-данных………………………………………………………………………………………………….. 637
Рекомендации по выбору………………………………………………………………………………………………………… 638
Резюме………………………………………………………………………………………………………………………………………. 639
Глава 41. Программирование баз данных…………………………………………….. 641
Основные положения SQL………………………………………………………………………………………………………. 641
Создание таблицы……………………………………………………………………………………………………………. 642
Операция вставки…………………………………………………………………………………………………………….. 642
Чтение данных………………………………………………………………………………………………………………….. 642
Изменение данных……………………………………………………………………………………………………………. 643
Удаление…………………………………………………………………………………………………………………………… 643
Использование языка SQL в библиотеке Qt…………………………………………………………………………… 643
Соединение с базой данных (второй уровень)………………………………………………………………. 645
Исполнение команд SQL (второй уровень)……………………………………………………………………. 646
Классы SQL-моделей для интервью (третий уровень)………………………………………………….. 649
Модель запроса………………………………………………………………………………………………………. 649
Табличная модель…………………………………………………………………………………………………… 650
Реляционная модель……………………………………………………………………………………………….. 652
Резюме………………………………………………………………………………………………………………………………………. 653
Глава 42. Динамические библиотеки и система расширений
(см. эл. архив)…………………………………………………………………………………… 1
Динамические библиотеки………………………………………………………………………………………………. 1
Динамическая загрузка и выгрузка библиотеки…………………………………………………….. 3
Особенности именования и загрузки динамических библиотек………………….. 5
Расширения (plug-ins)……………………………………………………………………………………………………….. 6
Расширения для Qt……………………………………………………………………………………………………. 7
Поддержка собственных расширений в приложениях………………………………………….. 8
Диагностика и отладка расширений……………………………………………………………. 12
Создание расширения для приложения………………………………………………………. 13
Система метаданных плагинов……………………………………………………………………. 15
Резюме……………………………………………………………………………………………………………………………… 16
Глава 43. Совместное использование Qt с платформозависимыми API
(см. эл. архив)…………………………………………………………………………………… 1
Совместное использование с Windows API…………………………………………………………………….. 3
Совместное использование с Linux…………………………………………………………………………………. 5
Совместное использование с macOS………………………………………………………………………………. 5
Системная информация……………………………………………………………………………………………………. 6
Резюме……………………………………………………………………………………………………………………………….. 8
Глава 44. Qt Designer. Быстрая разработка прототипов……………………….. 657
Создание новой формы в Qt Designer……………………………………………………………………………………… 657
Добавление виджетов……………………………………………………………………………………………………………… 660
Компоновка (layout)………………………………………………………………………………………………………………… 661
Порядок следования табулятора……………………………………………………………………………………………. 662
Сигналы и слоты……………………………………………………………………………………………………………………… 663
Использование в формах собственных виджетов…………………………………………………………………. 665
Использование форм в проектах…………………………………………………………………………………………….. 666
Компиляция………………………………………………………………………………………………………………………………. 668
Динамическая загрузка формы………………………………………………………………………………………………. 669
Резюме………………………………………………………………………………………………………………………………………. 672
Глава 45. Проведение тестов (см. эл. архив)……………………………………… 1
Создание тестов………………………………………………………………………………………………………………… 2
Тесты с передачей данных………………………………………………………………………………………. 5
Создание тестов графического интерфейса…………………………………………………………………… 7
Параметры для запуска тестов……………………………………………………………………………………….. 9
Резюме……………………………………………………………………………………………………………………………… 10
Глава 46. Qt WebEngine………………………………………………………………………… 674
А зачем?……………………………………………………………………………………………………………………………………. 675
Быстрый старт…………………………………………………………………………………………………………………………. 676
Создание простого веб-браузера…………………………………………………………………………………………… 678
Ввод адресов…………………………………………………………………………………………………………………….. 678
Управление историей………………………………………………………………………………………………………. 678
Загрузка страниц и ресурсов………………………………………………………………………………………….. 679
Пишем веб-браузер: попытка номер два……………………………………………………………………….. 679
Резюме………………………………………………………………………………………………………………………………………. 683
Глава 47. Интегрированная среда разработки Qt Creator
(см. эл. архив)…………………………………………………………………………………… 1
Первый запуск…………………………………………………………………………………………………………………… 3
Создаем проект «Hello Qt Creator»………………………………………………………………………………….. 3
Пользовательский интерфейс Qt Creator………………………………………………………………………… 8
Окна вывода………………………………………………………………………………………………………………. 8
Окно проектного обозревателя………………………………………………………………………………… 9
Секция компилирования и запуска………………………………………………………………………….. 9
Редактирование текста…………………………………………………………………………………………………… 11
Как подсвечен ваш синтаксис?……………………………………………………………………………… 11
Скрытие и отображение кода………………………………………………………………………………… 12
Автоматическое дополнение кода………………………………………………………………………… 12
Поиск и замена………………………………………………………………………………………………………… 13
Комбинации клавиш для ускорения работы………………………………………………………… 18
Вертикальное выделение текста………………………………………………………………….. 18
Автоматическое форматирование текста……………………………………………………. 18
Комментирование блоков……………………………………………………………………………… 19
Просмотр кода методов класса, их определений и атрибутов………………….. 19
Помощь, которая всегда рядом…………………………………………………………………….. 20
Интерактивный отладчик и программный экзорцизм…………………………………………………. 21
Синтаксические ошибки…………………………………………………………………………………………. 22
Ошибки компоновки……………………………………………………………………………………………….. 23
Ошибки времени исполнения…………………………………………………………………………………. 23
Логические ошибки…………………………………………………………………………………………………. 24
Трассировка…………………………………………………………………………………………………………….. 24
Команда Step Over…………………………………………………………………………………………. 25
Команда Step Into………………………………………………………………………………………….. 25
Команда Step Out…………………………………………………………………………………………… 26
Контрольные точки………………………………………………………………………………………………… 26
Окно переменных (Local and Watches)………………………………………………………………….. 27
Окно цепочки вызовов (Call Stack)………………………………………………………………………… 28
Резюме……………………………………………………………………………………………………………………………… 28
Глава 48. Рекомендации по миграции программ из Qt 5 в Qt 6…………….. 686
Основные отличия Qt 6 от Qt 5……………………………………………………………………………………………….. 686
Подробности перевода на Qt 6……………………………………………………………………………………………….. 686
Виджеты: замена устаревших классов………………………………………………………………………….. 687
Контейнерные классы……………………………………………………………………………………………………… 687
Класс QVector………………………………………………………………………………………………………….. 687
Класс QLinkedList……………………………………………………………………………………………………. 688
Функция qVariantValue()………………………………………………………………………………………… 688
Система сигналов и слотов……………………………………………………………………………………………… 688
Графика и рендеринг……………………………………………………………………………………………………….. 688
Платформозависимый код………………………………………………………………………………………………. 689
Мультимедиа……………………………………………………………………………………………………………………. 689
QML и Qt Quick………………………………………………………………………………………………………………………… 689
Управление памятью и современный C++…………………………………………………………………………….. 690
Модуль совместимости Qt5Compat……………………………………………………………………………………….. 690
Пошаговый план миграции…………………………………………………………………………………………………….. 690
Резюме………………………………………………………………………………………………………………………………………. 691
Часть VII. Язык сценариев JavaScript…………………………………… 693
Глава 49. Основы поддержки сценариев JavaScript (см. эл. архив)….. 1
Принцип взаимодействия с языком сценариев……………………………………………………………….. 2
Первый шаг использования сценария…………………………………………………………………………….. 5
Привет, сценарий………………………………………………………………………………………………………………. 6
Резюме……………………………………………………………………………………………………………………………….. 7
Глава 50. Синтаксис языка сценариев (см. эл. архив)………………………. 1
Зарезервированные ключевые слова……………………………………………………………………………… 1
Комментарии…………………………………………………………………………………………………………………….. 2
Переменные……………………………………………………………………………………………………………………….. 2
Предопределенные типы данных……………………………………………………………………………. 3
Числовой тип……………………………………………………………………………………………………. 3
Строковый тип…………………………………………………………………………………………………. 4
Логический тип………………………………………………………………………………………………… 5
Null и Undefined……………………………………………………………………………………………….. 5
Тип Symbol………………………………………………………………………………………………………… 5
Преобразование типов……………………………………………………………………………………………… 5
Операции…………………………………………………………………………………………………………………………… 6
Операторы присваивания………………………………………………………………………………………… 6
Арифметические операции………………………………………………………………………………………. 7
Поразрядные операции…………………………………………………………………………………………….. 8
Операции сравнения…………………………………………………………………………………………………. 8
Приоритет выполнения операций……………………………………………………………………………. 9
Управляющие структуры………………………………………………………………………………………………. 10
Условные операторы……………………………………………………………………………………………… 10
Оператор if … else…………………………………………………………………………………………… 10
Оператор switch……………………………………………………………………………………………… 11
Оператор условного выражения……………………………………………………………………………. 12
Циклы……………………………………………………………………………………………………………………….. 12
Операторы break и continue………………………………………………………………………….. 12
Цикл for…………………………………………………………………………………………………………… 12
Цикл while………………………………………………………………………………………………………. 13
Цикл do…while………………………………………………………………………………………………… 13
Оператор with………………………………………………………………………………………………………….. 13
Исключительные ситуации……………………………………………………………………………………. 14
Оператор try…catch……………………………………………………………………………………….. 14
Оператор throw………………………………………………………………………………………………. 15
Функции…………………………………………………………………………………………………………………………… 15
Встроенные функции………………………………………………………………………………………………. 17
Объектная ориентация…………………………………………………………………………………………………… 17
Статические классы……………………………………………………………………………………………….. 19
Наследование………………………………………………………………………………………………………….. 20
Перегрузка методов………………………………………………………………………………………………… 23
Сказание о «джейсоне»…………………………………………………………………………………………… 23
Резюме……………………………………………………………………………………………………………………………… 24
Глава 51. Встроенные объекты JavaScript (см. эл. архив)…………………. 1
Объект Global……………………………………………………………………………………………………………………. 1
Объект Number………………………………………………………………………………………………………………….. 1
Объект Boolean…………………………………………………………………………………………………………………. 2
Объект String…………………………………………………………………………………………………………………….. 2
Замена………………………………………………………………………………………………………………………… 2
Получение символов…………………………………………………………………………………………………. 2
Получение подстроки……………………………………………………………………………………………….. 2
Объект RegExp…………………………………………………………………………………………………………………… 3
Проверка строки……………………………………………………………………………………………………….. 3
Поиск позиции совпадений………………………………………………………………………………………. 3
Найденное совпадение…………………………………………………………………………………………….. 4
Получение всех совпадений…………………………………………………………………………………….. 4
Замена с использованием функции…………………………………………………………………………. 4
Разделение строки…………………………………………………………………………………………………….. 4
Объект Array……………………………………………………………………………………………………………………… 4
Дополнение массива элементами……………………………………………………………………………. 5
Адресация элементов……………………………………………………………………………………………….. 5
Изменение порядка элементов массива………………………………………………………………….. 5
Преобразование массива в строку………………………………………………………………………….. 6
Объединение массивов……………………………………………………………………………………………… 6
Упорядочивание элементов……………………………………………………………………………………… 6
Многомерные массивы…………………………………………………………………………………………….. 6
Объект Date……………………………………………………………………………………………………………………….. 7
Объект Маth………………………………………………………………………………………………………………………. 8
Модуль числа……………………………………………………………………………………………………………. 9
Округление………………………………………………………………………………………………………………… 9
Определение максимума и минимума…………………………………………………………………….. 9
Возведение в степень………………………………………………………………………………………………… 9
Вычисление квадратного корня…………………………………………………………………………….. 10
Генератор случайных чисел………………………………………………………………………………….. 10
Тригонометрические методы…………………………………………………………………………………. 10
Вычисление натурального логарифма…………………………………………………………………. 11
Объект Function………………………………………………………………………………………………………………. 11
Резюме……………………………………………………………………………………………………………………………… 11
Глава 52. Классы поддержки JavaScript и практические примеры
(см. эл. архив)…………………………………………………………………………………… 1
Класс QJSValue…………………………………………………………………………………………………………………. 1
Класс QJSEngine………………………………………………………………………………………………………………. 1
Практические примеры…………………………………………………………………………………………………….. 2
«Черепашья» графика……………………………………………………………………………………………….. 2
Сигналы, слоты и функции………………………………………………………………………………………. 8
Полезные дополнительные функции…………………………………………………………………….. 12
Резюме……………………………………………………………………………………………………………………………… 15
Часть VIII. Технология Qt Quick……………………………………………… 695
Глава 53. Знакомство с Qt Quick…………………………………………………………… 696
А зачем?……………………………………………………………………………………………………………………………………. 696
Введение в QML……………………………………………………………………………………………………………………….. 698
Быстрый старт…………………………………………………………………………………………………………………………. 700
Использование JavaScript в QML……………………………………………………………………………………………. 704
Резюме………………………………………………………………………………………………………………………………………. 706
Глава 54. Элементы……………………………………………………………………………… 707
Визуальные элементы……………………………………………………………………………………………………………… 707
Свойства элементов…………………………………………………………………………………………………………………. 709
Собственные свойства…………………………………………………………………………………………………….. 712
Создание собственных элементов………………………………………………………………………………………….. 714
Создание собственных модулей…………………………………………………………………………………………….. 716
Динамическое создание элементов………………………………………………………………………………………… 717
Элемент Flickable…………………………………………………………………………………………………………………….. 717
Готовые элементы пользовательского интерфейса……………………………………………………………… 718
Диалоговые окна……………………………………………………………………………………………………………………… 722
Резюме………………………………………………………………………………………………………………………………………. 724
Глава 55. Управление размещением элементов (см. эл. архив)…………. 1
Фиксаторы…………………………………………………………………………………………………………………………. 1
Традиционные размещения……………………………………………………………………………………………… 7
Размещение в виде потока……………………………………………………………………………………………… 11
Резюме……………………………………………………………………………………………………………………………… 12
Глава 56. Элементы графики (см. эл. архив)…………………………………….. 1
Цвета………………………………………………………………………………………………………………………………….. 1
Растровые изображения…………………………………………………………………………………………………… 2
Элемент Image…………………………………………………………………………………………………………… 2
Элемент BorderImage………………………………………………………………………………………………… 6
Градиенты…………………………………………………………………………………………………………………………. 7
Шрифты……………………………………………………………………………………………………………………………… 9
Рисование на элементах холста……………………………………………………………………………………. 10
Шейдеры и эффекты……………………………………………………………………………………………………….. 14
Резюме……………………………………………………………………………………………………………………………… 17
Глава 57. Пользовательский ввод (см. эл. архив)……………………………… 1
Область мыши…………………………………………………………………………………………………………………… 1
Сигналы…………………………………………………………………………………………………………………………….. 4
Ввод с клавиатуры……………………………………………………………………………………………………………. 8
Фокус………………………………………………………………………………………………………………………….. 8
«Сырой» ввод…………………………………………………………………………………………………………… 10
Мультитач………………………………………………………………………………………………………………………. 12
Резюме……………………………………………………………………………………………………………………………… 14
Глава 58. Анимация……………………………………………………………………………… 729
Анимация при изменении свойств………………………………………………………………………………………….. 729
Анимация для изменения числовых значений……………………………………………………………….. 731
Анимация с изменением цвета………………………………………………………………………………………… 732
Анимация с поворотом…………………………………………………………………………………………………….. 733
Анимации поведения……………………………………………………………………………………………………………….. 734
Параллельные и последовательные анимации…………………………………………………………………….. 735
Состояния и переходы…………………………………………………………………………………………………………….. 739
Состояния…………………………………………………………………………………………………………………………. 739
Переходы………………………………………………………………………………………………………………………….. 741
Модуль частиц…………………………………………………………………………………………………………………………. 743
Резюме………………………………………………………………………………………………………………………………………. 747
Глава 59. Модель/Представление…………………………………………………………. 748
Модели……………………………………………………………………………………………………………………………………… 748
Модель списка………………………………………………………………………………………………………………….. 748
JSON-модель……………………………………………………………………………………………………………………… 749
Представление данных моделей…………………………………………………………………………………………….. 750
Элемент ListView………………………………………………………………………………………………………………. 750
Элемент GridView…………………………………………………………………………………………………………….. 753
Элемент PathView…………………………………………………………………………………………………………….. 755
Визуальная модель данных……………………………………………………………………………………………………. 757
Резюме………………………………………………………………………………………………………………………………………. 759
Глава 60. Qt Quick и C++……………………………………………………………………… 760
Использование языка QML в C++…………………………………………………………………………………………… 760
Взаимодействие из C++ со свойствами QML-элементов и вызов их функций……………. 761
Соединение QML-сигналов со слотами C++…………………………………………………………………. 763
Использование компонентов языка C++ в QML……………………………………………………………………. 766
Экспорт объектов и виджетов из C++ в QML…………………………………………………………………. 767
Использование зарегистрированных объектов C++, их свойств и методов в QML……. 769
Реализация визуальных элементов QML на C++………………………………………………………….. 773
Класс QQuickImageProvider……………………………………………………………………………………………. 776
Резюме………………………………………………………………………………………………………………………………………. 780
Глава 61. 3D-графика: Qt 3D………………………………………………………………… 782
Основы………………………………………………………………………………………………………………………………………. 782
Cвет…………………………………………………………………………………………………………………………………………… 783
Камера………………………………………………………………………………………………………………………………………. 784
3D-объекты……………………………………………………………………………………………………………………………….. 785
Материалы……………………………………………………………………………………………………………………………….. 787
Трансформация………………………………………………………………………………………………………………………… 791
Анимация………………………………………………………………………………………………………………………………….. 792
Резюме………………………………………………………………………………………………………………………………………. 794
Часть IX. Мобильные приложения и Qt………………………………… 797
Глава 62. Введение в мир мобильных приложений………………………………. 798
Смартфоны изменили всё………………………………………………………………………………………………………… 799
Виртуальные магазины приложений…………………………………………………………………………………….. 800
Распространение приложений вне виртуального магазина………………………………………………… 803
Qt 6 и разработка мобильных приложений…………………………………………………………………………… 803
Резюме………………………………………………………………………………………………………………………………………. 804
Глава 63. Подготовка к работе над мобильными приложениями…………. 806
Подготовка среды для разработки iOS-приложений……………………………………………………………. 806
Резюме………………………………………………………………………………………………………………………………………. 809
Глава 64. Особенности разработки приложений
для мобильных устройств…………………………………………………………………….. 810
Анатомия свойств для iOS-приложений…………………………………………………………………………………. 811
Свойства iOS-приложений………………………………………………………………………………………………. 811
Автоматический поворот………………………………………………………………………………………………………… 813
Обработка поворота в приложениях……………………………………………………………………………………… 815
Сенсоры……………………………………………………………………………………………………………………………………. 816
Пользовательский ввод при помощи пальцев……………………………………………………………………….. 819
Положение рук…………………………………………………………………………………………………………………………. 821
Резюме………………………………………………………………………………………………………………………………………. 822
Глава 65. Пример разработки мобильного приложения (см. эл. архив) 1
Обдумывание и планирование приложения…………………………………………………………………… 1
Название приложения………………………………………………………………………………………………. 2
Значок приложения…………………………………………………………………………………………………… 2
Что будет в первой версии?……………………………………………………………………………………… 3
Пишем код…………………………………………………………………………………………………………………………. 5
Добавление к приложению значков и стартовых экранов…………………………………………. 12
Резюме……………………………………………………………………………………………………………………………… 13
Глава 66. Публикация в магазине мобильных приложений
(см. эл. архив)…………………………………………………………………………………… 1
Этапы работы…………………………………………………………………………………………………………………… 1
Регистрация……………………………………………………………………………………………………………….. 2
Настройки для запуска приложений на реальных устройствах………………………….. 3
Создание электронной подписи………………………………………………………………………………. 8
Создание страницы приложения…………………………………………………………………………….. 9
Загрузка и публикация приложения……………………………………………………………………… 15
Резюме……………………………………………………………………………………………………………………………… 17
Часть X. Qt и ИИ………………………………………………………………………………. 825
Глава 67. Разработчик Qt в эпоху искусственного интеллекта…………….. 826
От искры до пепла — знакомый путь разработчика……………………………………………………………. 826
История революций: огонь, пар, электричество и… интеллект……………………………………………. 826
Взгляд на нейросети по-человечески…………………………………………………………………………………….. 827
Страх, который стоит рядом с возможностью………………………………………………………………………. 827
Новая типология разработчиков……………………………………………………………………………………………. 827
Новый язык: диалог с машиной……………………………………………………………………………………………… 828
Неудобная правда: что действительно происходит…………………………………………………………….. 828
К чему готовиться: навыки будущего……………………………………………………………………………………. 830
Навык № 1: Архитектурное мышление………………………………………………………………………….. 830
Навык № 2: Промпт-инжиниринг — язык взаимодействия с ИИ………………………………….. 830
Навык № 3: Гибридное мышление — сила симбиоза человека и ИИ…………………………. 831
Навык № 4: Управление ИИ-агентами — оркестровка цифровой команды……………….. 831
Навык № 5: Фундаментальные знания…………………………………………………………………………… 832
Qt 6 — ваше секретное оружие в эпоху ИИ…………………………………………………………………………… 832
Почему Qt идеально подходит для ИИ-разработки?……………………………………………………. 832
Финальные мысли……………………………………………………………………………………………………………………. 833
Мир, где джуниоры исчезают…………………………………………………………………………………………. 833
Рынок ищет «сшивателей миров»……………………………………………………………………………………. 833
Что не сможет автоматизировать ни одна нейросеть?…………………………………………………. 834
Три простые истины………………………………………………………………………………………………………… 834
Мы уже проходили это……………………………………………………………………………………………………. 834
Трансформация, а не исчезновение………………………………………………………………………………… 835
Где наша настоящая ценность?……………………………………………………………………………………… 835
Резюме………………………………………………………………………………………………………………………………………. 835
Глава 68. Чат-боты в Qt-разработке……………………………………………………… 837
Почему чат-боты стали незаменимыми…………………………………………………………………………………. 837
Типы современных моделей……………………………………………………………………………………………………. 838
Reasoning-модели…………………………………………………………………………………………………………….. 838
Vision-модели и мультимодальные модели……………………………………………………………………. 838
Мультиязычные модели………………………………………………………………………………………………….. 839
Облачные чат-боты…………………………………………………………………………………………………………………. 839
ChatGPT…………………………………………………………………………………………………………………………….. 839
Генерация визуального контента и кода полноценного приложения……………….. 841
Собственные GPTs и Projects………………………………………………………………………………….. 843
Клиентские приложения ChatGPT…………………………………………………………………………. 845
Слабые стороны ChatGPT……………………………………………………………………………………… 845
Claude………………………………………………………………………………………………………………………………… 845
Экономия токенов: батчинг запросов…………………………………………………………………… 847
Генерация кода с использованием визуального контента………………………………….. 848
Клиентские приложения Claude…………………………………………………………………………….. 848
Ограничения Claude……………………………………………………………………………………………….. 849
Дополнительные облачные чат-боты……………………………………………………………………………. 849
Локальные чат-боты……………………………………………………………………………………………………………….. 851
Зачем Qt-разработчику локальные модели?…………………………………………………………………. 851
Почему это особенно важно для Qt-разработчика?……………………………………………. 851
LM Studio………………………………………………………………………………………………………………………….. 851
Ollama……………………………………………………………………………………………………………………………….. 853
Сильные стороны Ollama……………………………………………………………………………………….. 854
Недостатки Ollama…………………………………………………………………………………………………. 855
Jan……………………………………………………………………………………………………………………………………… 855
GPT4All……………………………………………………………………………………………………………………………… 856
«Железо» для локальных LLM……………………………………………………………………………………….. 857
О размере моделей………………………………………………………………………………………………….. 858
Принцип выбора……………………………………………………………………………………………………… 858
Cравнение человеческого мозга и LLM………………………………………………………………… 858
Гибридный подход………………………………………………………………………………………………………………….. 858
Резюме………………………………………………………………………………………………………………………………………. 859
Глава 69. ИИ-IDE и консольные инструменты в Qt-разработке…………… 861
Gemini CLI: ИИ-ассистент в терминале…………………………………………………………………………………. 861
Установка и начало работы……………………………………………………………………………………………. 862
Работа с кодом…………………………………………………………………………………………………………………. 863
Экосистема CLI-инструментов………………………………………………………………………………………………. 864
Cursor: ИИ-IDE следующего поколения…………………………………………………………………………………. 865
Загрузка и установка……………………………………………………………………………………………………….. 865
Архитектура и режимы работы………………………………………………………………………………………. 867
Три режима работы: выбери нужный подход……………………………………………………………….. 867
Режим Agent (агента): автопилот для сложных задач…………………………………………. 867
Режим вопросов (Ask): консультант и аналитик………………………………………………….. 868
Режим Plan (план): создание подробных планов…………………………………………………. 868
Правила проекта: обучаем ИИ вашему стилю и подходу……………………………………………. 868
«Горячие клавиши»: ваш боевой арсенал……………………………………………………………………… 870
Автодополнение на стероидах………………………………………………………………………………. 870
Встроенное редактирование………………………………………………………………………………….. 871
Чат с кодовой базой………………………………………………………………………………………………… 871
Лучшие практики работы с ИИ в Qt-проектах………………………………………………………………. 872
Работа с контекстом……………………………………………………………………………………………….. 872
Использование MCP-серверов……………………………………………………………………………….. 873
Структурирование промптов…………………………………………………………………………………. 873
Итеративная разработка………………………………………………………………………………………… 874
Проверяйте Qt-специфику………………………………………………………………………………………. 874
Рефакторинг и оптимизация…………………………………………………………………………………… 874
Используйте скриншоты для UI…………………………………………………………………………….. 875
Сравнение Gemini CLI и Cursor на примере рефакторинга плеера…………………………………….. 875
Экосистема IDE-инструментов для разработки с ИИ…………………………………………………………… 876
Резюме………………………………………………………………………………………………………………………………………. 877
Глава 70. Промпт-инжиниринг как новый навык……………………………….. 879
Что изменилось и почему это важно для Qt-разработчика?………………………………………………… 879
Анатомия современного промпта…………………………………………………………………………………………… 880
Современные типы промптов…………………………………………………………………………………………………. 881
Тип A…………………………………………………………………………………………………………………………………. 881
Тип B…………………………………………………………………………………………………………………………………. 882
Тип C…………………………………………………………………………………………………………………………………. 882
Лучшие практики эффективного взаимодействия с ИИ………………………………………………… 883
Техника 1. Декомпозиция: разделяй и властвуй………………………………………………….. 884
Техника 2. «Покажи — повтори — расширь»………………………………………………………. 884
Техника 3. Явное управление версиями и устаревшими API……………………………… 885
Техника 4. Ограничительная…………………………………………………………………………………. 885
Практическая библиотека промптов……………………………………………………………………………………… 885
Работа с различными ИИ-платформами………………………………………………………………………… 885
Особенности применения CursorIDE…………………………………………………………………….. 886
Особенности применения Gemini CLI…………………………………………………………………… 886
Особенности применения LM Studio, Ollama, Jan и GPT4All………………………………. 886
И наконец………………………………………………………………………………………………………………………….. 886
Промпты для рефакторинга…………………………………………………………………………………………….. 886
Документация: создание и обновление………………………………………………………………………….. 888
Промпты для отладки: поиск и исправление багов………………………………………………………. 890
Промпты для ревью кода: поиск потенциальных проблем………………………………………….. 893
Промпт для тестирования: автоматизация проверок……………………………………………………. 895
Промпты для портирования……………………………………………………………………………………………. 896
Заключение: ответственность разработчика в эпоху ИИ-ассистентов………………………………. 898
Юридические риски и происхождение кода………………………………………………………………….. 898
Предвзятость и дискриминация………………………………………………………………………………………. 898
Утечка интеллектуальной собственности……………………………………………………………………… 898
Деградация инженерного мышления……………………………………………………………………………… 899
Правила безопасного применения………………………………………………………………………………….. 899
Баланс между скоростью и контролем………………………………………………………………………….. 899
Резюме………………………………………………………………………………………………………………………………………. 899
Эпилог………………………………………………………………………………………………….. 901
Приложения…………………………………………………………………………………… 903
Приложение 1. Настройка среды для работы над Qt-приложениями……. 904
Настройка среды для macOS………………………………………………………………………………………………….. 904
Настройка среды для Windows………………………………………………………………………………………………. 906
Настройка среды для Ubuntu Linux……………………………………………………………………………………….. 907
Приложение 2. Таблица простых чисел………………………………………………… 909
Приложение 3. Таблицы семибитной кодировки ASCII……………………….. 912
Приложение 4. Описание сопровождающего книгу файлового архива… 915
Предметный указатель…………………………………………………………………………. 926

В книгу вошли сказки чукчей — коренных жителей Чукотского полуострова. Как и для многих народов, сказки для чукчей это не просто развлечение, а способ объяснить мир, научить детей правилам жизни, сохранить знания и обычаи. Суровые условия жизни оказали влияние на сюжеты чукотских сказок: в них главным героям приходится доказывать свое мастерство охотника или рыболова, бороться с природными силами, злыми чудовищами и дикими зверями.
Сказки, вошедшие в сборник, созданы в годы Великой Отечественной войны писателем и корреспондентом Александром Лозневым. В основу этих сказок легли сказания местных народов, которые писатель собирал и переводил на русский язык в период его работы на Чукотке.
Для младшего школьного возраста

Какие сказки рассказывают на далёкой Чукотке, и вообще, до сказок ли на полуострове, где лето заканчивается, едва начавшись, а зима — самая морозная на планете?
Ответом на эти вопросы будут удивительные сказки чукчей — коренных жителей полуострова. Непростые условия жизни добавили в чукотские сказки суровости: часто главным героям приходится доказывать свое мастерство охотника или рыболова, бороться с природными силами, злыми чудовищами кэле и дикими зверями.
Уважительное отношение к природе раскрывается в сказках о животных: оленях, птицах, медведях, и даже мошках. И во всех этих сказках мудрость народов Севера покоряет простотой и правдой жизни, а порой восхищает прямолинейностью.

Любовь Лазарева — выпускница Новосибирской художественной школы №1 и архитектурного факультета НИСИ.Почти 30 лет занимается иллюстрацией и дизайном детской книги, на данный момент оформила свыше 100 изданий. Сотрудничала с известными издательствами Новосибирска, Красноярска, Челябинска, Москвы и др. В 2003 и 2004 годах дважды занимала I место в конкурсе новогодней открытки в Токио (Япония) в разных номинациях.

Первая специализированная книга для алгоритмической подготовки с реализацией этих алгоритмов на языке Go. Содержит необходимые знания по используемым в Go структурам данных и идиомам, рассматривает алгоритмы поиска, сортировки, сжатия данных, различные аспекты обслуживания распределенных систем и недопущения конфликтов в их работе, а также криптографические алгоритмы и работу с цифровыми подписями. Книга рассчитана на разработчиков среднего уровня, а также читателей, уже знакомых с базовыми возможностями Go.
Для Go-разработчиков
.
Современный бэкенд от API баз данных до вставок на TypeScript
Современный бэкенд от API баз данных до вставок на TypeScript, от небольших утилит до криптографических модулей и процедур для ускорения ядра Linux невозможно представить себе без кода на языке Go.
В этой книге рассмотрены алгоритмы и их реализации на языке Go, относящиеся к следующим предметным областям:
Артём Михайлов — опытный программист, специалист по высоконагруженным системам, в настоящее время работает в стартапе, занятым высоконагруженными приложениями, ранее работал в научном кластере «Иннополис», компаниях «МТС» и «Тензор». Постоянно делится своим опытом на Хабре, пишет статьи для корпоративных блогов «Росатом», «ВТБ», «VK», «IBS», «OTUS».
Книгу “Алгоритмы на языке Go” можно купить в нашем интенет-магазине.
Предисловие. 7
– Глава 1 –
Алгоритмы, сложности и структуры данных. 9
Структуры данных: массивы, списки, хеш-таблицы, деревья. 11
Массивы.. 11
Связные списки. 13
Хеш-таблицы.. 14
Деревья. 15
Структуры данных в Go. 18
Массивы и срезы в Go. 18
Связные списки в Go. 20
Хеш-таблицы (отображения) в Go. 22
Деревья в Go. 24
– Глава 2 –
Поиск, сортировка и сжатие данных. 28
Алгоритмы поиска. 28
Двоичный поиск. 28
Интерполяционный поиск. 30
Поиск Фибоначчи. 31
Алгоритмы сортировки. 33
Быстрая сортировка. 34
Сортировка слиянием.. 36
Пирамидальная сортировка. 37
Поразрядная сортировка. 39
Алгоритмы сжатия данных. 42
Алгоритм Хаффмана. 42
Алгоритм LZW… 45
Алгоритм Brotli 48
Алгоритм Snappy. 50
Алгоритмы поиска подстроки. 52
Алгоритм Кнута–Морриса–Пратта. 52
Алгоритм Бойера–Мура. 54
Алгоритм Рабина–Карпа. 57
Алгоритмы кратчайших путей. 59
Алгоритм Дейкстры.. 60
Алгоритм Беллмана–Форда. 65
Алгоритм A*: эвристический поиск. 68
Примеры использования алгоритмов кратчайшего пути. 72
Сравнение алгоритмов кратчайших путей. 73
Потоки в сетях. 73
Сети и потоки. 73
Задача о максимальном потоке: найти поток наибольшей величины.. 74
Алгоритм Форда-Фалкерсона. 74
Алгоритм Диница. 76
Применения. 79
Теорема о максимальном потоке и минимальном разрезе. 79
– Глава 3 –
Распределенные алгоритмы.. 81
Что делает распределенные системы сложными?. 82
CAP-теорема: фундаментальный компромисс. 83
Три свойства. 84
Теорема. 84
Почему нельзя всё сразу?. 84
А что с CA?. 85
Примеры систем.. 85
Критика и уточнения. 86
Модели согласованности. 86
Строгая согласованность (Strong Consistency / Linearizability) 86
Последовательная согласованность (Sequential Consistency) 87
Причинная согласованность (Causal Consistency) 87
Read Your Writes (прочитайте ваши записи) 87
Eventual Consistency (согласованность в конечном счете) 88
Eventual Consistency. 88
Разрешение конфликтов. 90
Кворумы: настраиваемая согласованность. 93
Окно несогласованности. 94
Практические паттерны.. 94
Saga — для распределенных транзакций. 94
Outbox — для надежной публикации событий. 96
Idempotency key — для идемпотентных операций. 97
Circuit breaker — для устойчивости. 98
– Глава 4 –
Алгоритмы консенсуса. 101
Что такое консенсус и зачем он нужен?. 101
Формальное определение. 102
Практические применения. 102
Невозможность: почему это так сложно?. 103
Проблема двух генералов. 103
Почему это невозможно?. 103
FLP-невозможность. 104
Интуиция доказательства. 105
Как жить с невозможностью?. 105
Paxos: алгоритм, изменивший всё. 106
Одна инстанция Paxos. 106
Номера предложений (proposal numbers) 107
Протокол: две фазы.. 107
Почему это работает?. 110
Пример выполнения. 110
Сценарий 1: простой случай. 110
Сценарий 2: конкурирующие proposers. 111
Проблема прогресса: дуэль proposers. 113
Multi-Paxos: от одного значения к журналу. 114
Практические соображения. 115
Недостатки Paxos. 116
Raft: консенсус для смертных. 116
Философия Raft 116
Роли и термы.. 117
Выбор лидера. 118
Репликация журнала. 120
AppendEntries RPC.. 120
Алгоритм follower’а. 121
Алгоритм лидера. 122
Log Matching Property: свойство сопоставления с журналом.. 124
Leader Completeness Property: свойство безопасности. 124
Почему лидер не коммитит записи прошлых термов напрямую?. 125
Кластерное членство: Joint Consensus. 125
Снэпшоты и компактификация журнала. 126
Клиентское взаимодействие. 127
Полный пример: минимальный Raft на Go. 127
Системы на Raft 133
Заключение. 133
– Глава 5 –
Распределенные транзакции. 134
ACID в распределенном мире. 134
Проблема атомарного коммита. 134
Two-Phase Commit (2PC) 135
Фаза 1: Prepare (голосование) 135
Фаза 2: Commit/Abort (фиксация) 135
Проблемы 2PC.. 136
Пример: перевод денег. 137
Three-Phase Commit (3PC) 137
Saga. 138
Оркестрация. 139
Хореография. 140
TCC: Try-Confirm-Cancel 140
Outbox Pattern: надежная публикация событий. 141
Таблица outbox. 142
Идемпотентность. 142
Сравним подходы.. 143
Когда что использовать?. 143
– Глава 6 –
Криптографические алгоритмы.. 144
От Цезаря до Тьюринга: краткая история шифров. 144
Фундаментальные понятия. 146
Симметричное шифрование. 147
Одноразовый блокнот: идеал, недостижимый на практике. 148
Потоковые и блочные шифры.. 149
Реализация AES на Go. 151
Асимметричное шифрование. 153
Хеш-функции: MD5, SHA-256, Blake2, Argon2. 157
Исторический путь: от CRC до Argon2. 158
Односторонность, коллизии и эффект лавины.. 160
Зачем нужны разные хеш-функции?. 161
MD5 — эпоха надежд и коллизий. 163
SHA-256 — надежный наследник. 164
Blake2 — быстрее, сильнее, современнее. 167
Argon2 — хеширование паролей на стероидах. 169
Выбор хеш-функции. 171
– Глава 7 –
Реализация цифровых подписей и протоколов безопасности. 174
Математическая сущность цифровых подписей. 174
Схемы подписей на эллиптических кривых. 175
Реализация Ed25519 в Go. 177
– Глава 8 –
Атаки на цифровые подписи. 178
Replay-атаки и временны́е метки. 178
Подмена контекста (context substitution) 178
Слепые подписи и их применение. 179
Пороговые подписи. 179
BLS-подписи и агрегация. 180
JWT и stateless-аутентификация. 181
Идея: зашифровать сессию в токене. 181
Анатомия JWT: три части. 182
Жизненный цикл JWT.. 182
Симметричная и асимметричная подпись. 184
Распространение публичного ключа: JWKS. 185
Теперь про уязвимости. 186
Атака Algorithm substitution. 186
Уязвимость None algorithm… 187
Слабые секреты HMAC.. 187
Атаки JKU и X5U.. 188
Предметный указатель. 189