Опубликовано

Вышла книга: “Программная архитектура: практика командного принятия решений”

Программная архитектура: практика командного принятия решений

В современных реалиях разработки ПО классическая модель архитектора как единоличного автора решений утрачивает эффективность. Книга предлагает практический подход к архитектуре как к непрерывному процессу принятия решений с участием всей команды. Вводится понятие архитектурно значимых решений, и даются инструменты для работы с ними. Основной метод — «процесс архитектурных советов», сочетающий скорость разработки с архитектурной целостностью через быструю обратную связь. Читатель освоит документирование решений (Architecture Decision Records), организацию архитектурных форумов, формулирование тестируемых нефункциональных требований и построение технологических радаров.

Для архитекторов программного обеспечения

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

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

С помощью этой книги вы:

  • Поймёте новую динамику, влияющую на разработку современного ПО
  • Изучите подход, объединяющий архитектуру ПО и разработку
  • Поймёте фундаментальную взаимосвязь между решениями, советами, архитектурой и обратной связью от используемых систем
  • Научитесь внедрять практики, способные максимизировать выгоду и снизить риски
  • Сформируете подход, в котором будут учитываться ваша архитектура, навыки каждого сотрудника и культура вашей организации

Эндрю интуитивно понимает архитектуру. Перед вами книга, полная практической мудрости, основанная на обширном опыте, с захватывающим повествованием и оформленная так, чтобы донести суть того, что такое архитектура, чем она не является и как воплотить ее в жизнь.
Гради Буч, член IBM Fellow

 

Лучшие архитектуры ПО создаются усилиями всего коллектива. В книге Эндрю представлена практическая реализация этого видения: вовлечение широкого круга людей и ведение точного учета принятых решений.Мартин Фаулер, главный научный сотрудник компании Thoughtworks

 

Andrew-Harmel-Law

Эндрю Хармел-Лоу — технический директор компании 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 для искусственного интеллекта и Data Science”

Прикладные API для искусственного интеллекта и Data Science

Книга рассказывает о проектировании API для обработки данных и взаимодействия с большими языковыми моделями. Рассматривается работа с языком Python и его фреймворками FastAPI, Streamlit и LangChain. Рассматривается интеграция API в имеющиеся рабочие процессы, типичные для обработки данных, вывод приложения в облако, подбор интерфейсов для обслуживания различных задач, применение больших языковых моделей класса GPT для оптимизации и ускорения проектирования API.

 

Для специалистов по проектированию API, науке о данных и машинному обучению

Навыки создания API незаменимы при работе с искусственным интеллектом и в науке о данных (Data Science). Умение проектировать и поддерживать API для искусственного интеллекта понадобится как новичкам, так и опытным профессионалам. Эта практическая книга поможет вам на собственном опыте освоить разработку и поддержку API на Python с применением популярных фреймворков этого языка —  FastAPI, LangChain и Streamlit .

Книга делится на три части и рассказывает, как разрабатывать API с нуля, интегрировать их в рабочие процессы, типичные для обработки данных, научиться использовать такие инструменты как ChatGPT и LangChain, чтобы взаимодействовать с API при помощи больших языковых моделей (LLM). Проработав книгу, вы приобретете портфолио готовых проектов с качественными API, которые в самом выгодном свете продемонстрируют ваше мастерство в работе с ИИ, машинным обучением и наукой о данных.

  • Научитесь проектировать API для различных приложений из области data science
  • Откройте для себя, как собирать и развертывать API при помощи Python и FastAPI
  • Изучите, как интегрировать API в рабочие процессы, связанные с обработкой данных, применять API для доступа к данным и их визуализации
  • Тренируйте модели машинного обучения, а затем развертывайте их в виде API
  • Освойте эффективное взаимодействие с API при помощи искусственного интеллекта и больших языковых моделей

Эта книга — потрясающая новинка для всего сообщества исследователей данных. Порадуйте себя — добавьте эту книгу в свою профессиональную библиотеку, чтобы расти, совершенствоваться и становиться всё более эффективным специалистом по data science!

 

Алекс Гутман, автор книги «Becoming a Data Head: How to Think, Speak, and Understand Data Science, Statistics, and Machine Learning»

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

 

Джеймс Гоф, заслуженный инженер в компании Morgan Stanley, автор книги «Проектирование архитектуры API»

 

rayan day

Райан Дэй — высокопрофессиональный исследователь данных, работающий в компании 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

Опубликовано

Вышла книга : “Qt 6.9. Профессиональное программирование на C++”

Qt 6.9. Профессиональное программирование на C++

Книга посвящена разработке приложений для 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.

  • Кросс-платформенная реализация приложений для Windows, macOS и Linux
  • ИИ-ассистенты, ИИ-IDE, промт-инжиниринг и агентные рабочие процессы: архитектура, код, тесты c локальными и облачными моделями
  • Разработка мобильных приложений для iOS
  • Программирование 2D- и 3D-графики, мультимедиа, веб-приложений, баз данных, сети, таймера, многопоточности, XML, QML и JavaScript
  • Среда разработки Qt Creator и работа с технологией Qt Quick
  • 240 завершенных программ и 16 практичных промптов для разработки с ИИ
Макс Шлее

Макс Шлее (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

Опубликовано

Новинка: “Алгоритмы на языке Go”

Алгоритмы на языке Go

Первая специализированная книга для алгоритмической подготовки с реализацией этих алгоритмов на языке 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

Опубликовано

Встречайте: Разработка программного обеспечения. Практическое руководство для новичков в IT-команде

Разработка программного обеспечения. Практическое руководство для новичков в IT-команде

Книга поможет начинающим специалистам сделать первые шаги в IT-индустрии и уверенно закрепиться в коммерческой разработке. Фокус — на междисциплинарном взаимодействии и системном понимании процессов, что позволяет преодолеть разрыв между теоретической базой в узкой области и реальной практикой в команде. В книге разбираются структура российского IT-рынка, специфика различных типов компаний и современные методологии разработки. Детально описаны командные процессы — от формирования требований до эксплуатации продукта — и определено место каждого участника в этом цикле. Особое внимание уделено практическому освоению инструментов искусственного интеллекта: их использованию не только для автоматизации рутины, но и как помощников в решении профессиональных задач. Значительная часть книги посвящена долгосрочному развитию и методикам построения плана карьерного роста для быстрого продвижения.

Для начинающих IT-специалистов

Системное понимание процессов разработки в российских реалиях

Работа в IT-команде требует не только профессиональных знаний, но и понимания процессов, ролей и принципов взаимодействия внутри проекта. Эта книга помогает пройти путь от первого дня в проекте до уверенного профессионального роста.

Незнакомые процессы, непонятные термины, страх задать «глупый» вопрос — всё это знакомо каждому новичку в IT. В книге нет абстрактных теорий и сложных технических терминов. Только практические навыки работы в команде.

Что внутри:

  • Как устроены российские IT-компании и доступные карьерные пути
  • Практическое руководство по процессам разработки
  • Эффективная коммуникация в команде и участие в рабочих встречах
  • Пошаговый план развития: от адаптации до оценки результатов и повышения
  • Современные инструменты и методы работы с учётом российской специфики

Для кого эта книга:

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


Книгу “Разработка программного обеспечения. Практическое руководство для новичков в IT-команде
” можно купить в нашем интенет-магазине.

Опубликовано

Вышла книга “Основы разработки приложений для iOS”

Основы разработки приложений для iOS

Книга рассказывает о практических основах разработки приложений для iOS с использованием SwiftUI, языка Swift и Xcode. Рассматривается программирование на Swift, от базовых конструкций до структурированного параллелизма и объектно-ориентированного программирования, работа со Swift Playgrounds, декларативный подход SwiftUI, построение пользовательских интерфейсов с помощью стеков, фреймов и сеток, управление состоянием и данными, навигация, анимация, графика и диаграммы. Отдельное внимание уделено созданию собственных представлений и контейнеров, разработке виджетов и Live Activities, использованию SwiftData, Core Data и CloudKit, интеграции SwiftUI и UIKit, а также подготовке и публикации приложений в App Store. В книге представлены практические примеры и пошаговые инструкции.

Для iOS-разработчиков

Эта книга — практическое руководство по созданию современных приложений для iOS с использованием SwiftUI, языка Swift и Xcode.

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

Большой раздел посвящен SwiftUI и разработке в Xcode: дается детальный обзор Xcode в режиме SwiftUI, показано создание собственных представлений, построение пользовательских интерфейсов, работа со стеками, фреймами, формами и архитектурой проектов.

Отдельно разбирается работа с данными, включая обработку данных с помощью свойств состояния и объектов observable, state и environment. Рассматриваются вопросы дизайна пользовательского интерфейса: модификаторы, списки, представления с вкладками, контекстные меню, элементы навигации по пользовательскому интерфейсу и структурные группы. В продвинутых темах охватываются графика и построение диаграмм, применение анимации в пользовательском интерфейсе, трансформация представлений и обработка жестов, WidgetKit, Live Activities, приложения на основе документов, Core Data, SwiftData и CloudKit.

Подробно рассматривается интеграция с UIKit, включая интеграцию SwiftUI-представления в существующие проекты на базе UIKit и интеграцию кода UIKit в SwiftUI. В завершающей части содержится пошаговое руководство по упаковке приложения и его размещению в App Store. Материал сопровождается практическими пошаговыми инструкциями и наглядными примерами.

• Установка и изучение Xcode
• Изучение программирования на Swift
• Эксперименты со Swift Playgrounds
• Освоение декларативного синтаксиса SwiftUI
• Проектирование интерфейсов с использованием стеков, фреймов и сеток
• Использование предиктивного автодополнения кода
• Создание графики и диаграмм
• Добавление анимации в приложения
• Создание собственных представлений и контейнеров
• Разработка виджетов и Live Activities
• Хранение данных с помощью SwiftData

Книгу “Основы разработки приложений для iOS” можно купить в нашем интенет-магазине.

Опубликовано

Встречайте: Программируем на Python с использованием искусственного интеллекта

Программируем на Python с использованием искусственного интеллекта

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

Для Python-разработчиков

Прокачайте навыки с ИИ — десятикратно умножьте эффективность разработки

Эта книга — практическое руководство по интеграции ИИ (ChatGPT и аналогичных языковых моделей) в полный цикл разработки на Python.

На примере сквозного проекта «USB T-Shirt Launcher» рассматривается применение ИИ-ассистента на всех этапах жизненного цикла ПО (SDLC).

Книга ведет читателя от планирования (формулирование OKR и сбор требований) к проектированию архитектуры.

Далее рассматривается фаза разработки: генерация кода, рефакторинг по принципам SOLID, написание модульных и интеграционных тестов. Завершается цикл развертыванием и эксплуатацией — настройкой CI/CD-пайплайнов, облачным деплоем и мониторингом производительности с помощью Grafana Cloud.Читатель освоит не работу с одним инструментом, а универсальную методологию применения ИИ для устранения рутины — от генерации документации и сообщений для фиксаций кода до автоматической отладки и анализа кода на уязвимости.

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

КЛЮЧЕВЫЕ ОСОБЕННОСТИ КНИГИ

  • Сквозной практический проект: все методики применяются шаг за шагом к единому проекту — от идеи до работающего приложения
  • Фокус на полный SDLC: выход за рамки генерации кода к комплексному улучшению всего процесса разработки
  • Переносимые навыки: принципы промт-инжиниринга и интеграции ИИ не зависят от конкретной модели и остаются актуальными

ЧТО ВЫ ОСВОИТЕ

  • Практику промт-инжиниринга для сложных задач: от декомпозиции функциональных требований до написания сообщений к коммитам
  • Автоматизацию проектирования, написания чистого кода и рефакторинга с соблюдением SOLID
  • Создание тестов, проверку безопасности и настройку пайплайнов CI/CD с помощью ИИ
  • Стратегии облачного развертывания и настройку производительности с использованием ChatGPT
  • Критическую оценку ответов ИИ и его интеграцию в ежедневный рабочий процесс

Книгу “Программируем на Python с использованием искусственного интеллекта” можно купить в нашем интенет-магазине.

Опубликовано

Новинка: “Kotlin. Краткий курс”

Kotlin. Краткий курс

Практическое введение в язык программирования Kotlin, ориентированное на быстрое и уверенное освоение современного стека разработки. Рассматриваются ключевые концепции языка, принципы объектно-ориентированного и функционального программирования, работа с коллекциями, механизмы конкурентности на корутинах и основы модульного тестирования. Книга содержит практические проекты, что позволяет сразу закреплять полученные знания и видеть их применение в реальных задачах. Особое внимание уделено надежным подходам к разработке, REST-сервисам, облачным и бессерверным решениям. Автор опирается на многолетний опыт работы с крупными облачными платформами и современными архитектурными моделями, сочетая теорию с проверенными практиками индустрии.

Для программистов

Руководство по рефакторингу

Перед вами практическое введение в Kotlin, которое поможет быстро освоить этот язык программирования и уверенно применять его возможности при создании надежных приложений. Материал изложен последовательно и охватывает ключевые темы: основы синтаксиса, объектно-ориентированное и функциональное программирование, работу с коллекциями, механизмы конкурентности и тестирование. Каждая глава построена вокруг практических задач, что делает обучение максимально приближенным к реальным рабочим ситуациям и позволяет закреплять полученные знания.

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

Книга предназначена студентам, Java-программистам, бекэнд- и фуллстек -специалистам, мобильным разработчикам, а также всем, кто хочет изучить Kotlin с нуля или актуализировать свои знания.

ВЫ ИЗУЧИТЕ:

  • синтаксис и основные соглашения Kotlin;
  • концепции объектно-ориентированного и функционального программирования;
  • эффективную работу с коллекциями Kotlin и использование стандартной библиотеки;
  • приемы конкурентного и параллельного программирования с помощью корутин;
  • подходы и лучшие практики, позволяющие создавать надежные современные приложения;

разработку различных типов решений, включая REST API и бессерверные приложения.

 

Елена Ван Энгелен - Маслова

Елена ван Энгелен – Маслова (Elena van Engelen – Maslova) — эксперт-инженер с более чем 20-летним опытом создания высоконагруженных и легко поддерживаемых программных решений. Обладая учеными степенями в области вычислительной техники и программной инженерии, а также сертификатами AWS и Azure, она специализируется на современных технологиях: Kotlin, микросервисной и событийно-ориентированной архитектуре.
Ее карьера, построенная в ведущих компаниях телекоммуникационного, финансового и e-commerce секторов, — это практическое воплощение ее убеждения: качественное программное обеспечение способно трансформировать бизнес и улучшать жизнь людей. Свои глубокие профессиональные знания, подкрепленные опытом руководства командами, она переносит на страницы книг, делая сложные концепции доступными для разработчиков.

Книгу “Kotlin. Краткий курс” можно купить в нашем интенет-магазине.

Опубликовано

Game++. Устройство и оптимизация игрового движка

Game++. Устройство и оптимизация игрового движка

Книга рассказывает о тонкостях разработки игрового движка на языке C++.  На материале компьютерных игр AAA-класса подробно разобран полный спектр работы со сложными программами на C++, способы оптимизации кода, структуры данных и их выбор для достижения максимальной производительности. Особое внимание уделено стандартной библиотеке шаблонов (STL) языка C++, многопоточной обработке, а также решению непредвиденных проблем, связанных с неопределённым поведением, поддержкой и обновлением сложнейших баз кода, а также поддержке работоспособности высоконагруженных систем.

Для программистов С++

 

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

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

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

По сути, это не академическое исследование и не руководство к действию — это личный перечень наблюдений, пожеланий и претензий к C++. В книге описаны подходы к разработке игр, выработанные автором на основе собственного опыта. Это бесценный материал, помогающий понять, как заставить сложные высоконагруженные системы работать предсказуемо, безотказно и с приемлемой скоростью.

Ключевые темы:

  • Архитектура игровых движков
  • Работа с памятью в компьютерных играх AAA-класса и других приложениях с высокими требованиями к производительности
  • Структуры данных языка С++
  • Работа со стандартной библиотекой шаблонов C++ (STL)
  • Обработка исключений
  • Неопределённое поведение и способы его предотвращения
  • Память и аллокаторы
  • Оптимизация в C++
  • Многопоточность
  • Классические паттерны проектирования применительно к разработке игр
Кушниренко Сергей Сергеевич

Сергей Кушниренко — разработчик с более чем двадцатилетним опытом программирования и создания игр. Выпускник Национального исследовательского университета ИТМО. Начинал карьеру с разработки программного обеспечения для военно-морских тренажеров, навигационных систем и сетевых решений. Последние пятнадцать лет специализируется на разработке игр: в Electronic Arts занимался оптимизацией игр The Sims и SimCity BuildIt, в Gaijin Entertainment руководил переносом игр на платформы Nintendo Switch и Apple TV. Активно участвует в проектах с открытым исходным кодом, включая библиотеку ImSpinner и проект восстановления игры Pharaoh (1999).

Книгу “Game++. Устройство и оптимизация игрового движка” можно купить в нашем интенет-магазине.

Благодарности……………………………………………………………………………………….. 11

Disclaimer……………………………………………………………………………………………….. 13

От автора……………………………………………………………………………………………….. 15

Отзыв…………………………………………………………………………………………………….. 17

Кому стоит прочитать эту книгу?…………………………………………………………… 19

Часть I. Основы……………………………………………………………………………….. 21

0x10. С++, движки и архитектуры………………………………………………………….. 23

Почему С++?………………………………………………………………………………………………………………………………. 23

Что такое игровой движок?……………………………………………………………………………………………………….. 24

Первый главный вопрос — зачем?…………………………………………………………………………………………… 25

Второй главный вопрос — а надо ли?…………………………………………………………………………………….. 28

Либы + cmake != движок……………………………………………………………………………………………………………. 28

Полезности…………………………………………………………………………………………………………………………………. 30

Программирование……………………………………………………………………………………………………………………. 31

Главное окно (Main window)…………………………………………………………………………………………………….. 31

Игровой цикл………………………………………………………………………………………………………………………………. 32

Пользовательский ввод……………………………………………………………………………………………………………… 32

Графика………………………………………………………………………………………………………………………………………. 34

Ресурсы……………………………………………………………………………………………………………………………………….. 35

Вывод звука………………………………………………………………………………………………………………………………… 37

Физика…………………………………………………………………………………………………………………………………………. 37

AI…………………………………………………………………………………………………………………………………………………. 38

…Behavior Trees (BT)………………………………………………………………………………………………………….. 39

…GOAP (Goal-Oriented Action Planning)…………………………………………………………………………….. 39

…FSM (Finite State Machine)………………………………………………………………………………………………. 39

…Utility AI……………………………………………………………………………………………………………………………. 40

…экзотика: HTN, ML, Neural Nets, RL……………………………………………………………………………….. 40

…pathfinding………………………………………………………………………………………………………………………… 41

…navmesh……………………………………………………………………………………………………………………………. 41

…AI — это не про “умных врагов”…………………………………………………………………………………….. 42

Скрипты и конфиги…………………………………………………………………………………………………………………….. 42

…это не про производительность и не про fps…………………………………………………………………. 43

…это про удобство и скорость разработки………………………………………………………………………. 43

…на удивление, это про безопасность……………………………………………………………………………… 43

…это про реконфигурабельность проекта в целом………………………………………………………….. 44

…это дверь для комьюнити………………………………………………………………………………………………… 44

…это — всем не угодишь……………………………………………………………………………………………………. 44

Сеть……………………………………………………………………………………………………………………………………………… 45

…синхронизация состояний………………………………………………………………………………………………. 45

…предсказание ввода и откат (rollback netcode)……………………………………………………………… 46

…интерполяция, экстраполяция, сглаживание………………………………………………………………… 46

…безопасный протокол общения………………………………………………………………………………………. 47

…шифрование (параноиками просто так не становятся)………………………………………………… 47

…репликация объектов………………………………………………………………………………………………………. 47

…логирование и отладка……………………………………………………………………………………………………. 48

…борьба с читерами…………………………………………………………………………………………………………… 48

UI…………………………………………………………………………………………………………………………………………………. 48

Tools…………………………………………………………………………………………………………………………………………….. 49

…конвертеры уровня………………………………………………………………………………………………………….. 50

…проверка ресурсов…………………………………………………………………………………………………………… 50

Архитектура……………………………………………………………………………………………………………………………….. 50

…нет архитектуры — тоже архитектура………………………………………………………………………….. 51

…godobject — тоже архитектура………………………………………………………………………………………. 51

…ECS — модно! Но…………………………………………………………………………………………………………….. 52

Игра-движок……………………………………………………………………………………………………………………………….. 52

0x11. Архитектуры игровых движков…………………………………………………….. 55

Unity (Unitary Architecture)………………………………………………………………………………………………………… 57

Big Ball of Mud……………………………………………………………………………………………………………………. 58

Unreal Engine (Layered Architecture)………………………………………………………………………………………….. 62

CryEngine (Microkernel Architecture)…………………………………………………………………………………………. 66

Dagor (Data-driven Architecture)………………………………………………………………………………………………… 70

X-Ray Engine (Monolith Architecture)………………………………………………………………………………………… 72

Godot (Modules/Services Architecture)……………………………………………………………………………………….. 76

Часть II. Оптимизации…………………………………………………………………. 79

0x20. Какие бывают оптимизации…………………………………………………………. 81

Оптимизации на уровне архитектуры (~50% прироста)………………………………………………………… 83

Оптимизации на уровне алгоритмов/структур (~30%)…………………………………………………………… 84

Оптимизации на уровне исходного кода (~10%)…………………………………………………………………….. 85

Игровые реплеи (~?%)……………………………………………………………………………………………………………….. 91

Изоляция компонентов (~5%)……………………………………………………………………………………………………. 91

Специфичные низкоуровневые оптимизации (<3%)……………………………………………………………….. 92

Все остальное (~10%)………………………………………………………………………………………………………………… 92

Тесты производительности (Benchmarks)……………………………………………………………………………….. 92

Измерения…………………………………………………………………………………………………………………………………… 94

Изменения и интуиция инженера……………………………………………………………………………………………… 95

“Горячие” функции и “бутылочные горлышки”………………………………………………………………………. 96

“Горячие” функции (Hotspots)…………………………………………………………………………………………… 97

“Бутылочное горлышко” (Bottlenecks)……………………………………………………………………………… 97

Заблуждения и мифы…………………………………………………………………………………………………………………. 99

Инструменты……………………………………………………………………………………………………………………………. 102

Теория и термины…………………………………………………………………………………………………………….. 103

История одной оптимизации…………………………………………………………………………………………………… 106

Упаковка булевых значений…………………………………………………………………………………………………… 111

Без упаковки……………………………………………………………………………………………………………………… 112

std::bitset……………………………………………………………………………………………………………………………. 114

сustom_bitset……………………………………………………………………………………………………………………… 114

Выводы……………………………………………………………………………………………………………………………………… 120

0x21. Оптимизации строк…………………………………………………………………….. 123

Пул строк (String interning)………………………………………………………………………………………………………. 123

Не совсем строки……………………………………………………………………………………………………………………… 126

Реализация xstring……………………………………………………………………………………………………………………. 129

Как использовать…………………………………………………………………………………………………………………….. 131

Влияние на архитектуру…………………………………………………………………………………………………………. 132

Идентификаторы (Identifiers)………………………………………………………………………………………………….. 133

Короткие строки (Short String Optimisation)…………………………………………………………………………… 135

Короткоживущие строки (Short Live String)…………………………………………………………………………… 137

Долгоживущие строки (Long Live String)……………………………………………………………………………….. 141

Арены строк……………………………………………………………………………………………………………………………… 142

0x22. Оптимизации массивов……………………………………………………………….. 145

Оптимизация массивов (Cooking vectors)………………………………………………………………………………. 145

Недостатки векторов……………………………………………………………………………………………………………….. 150

Фиксированный массив (Fixed array)……………………………………………………………………………………… 155

Размерность стека……………………………………………………………………………………………………………………. 159

Статический вектор (Static vector)………………………………………………………………………………………….. 160

Гибридный вектор (Hybrid vector)………………………………………………………………………………………….. 164

“Холодные” и “горячие” данные (Hot/Cold data layout)……………………………………………………….. 166

0x23. Оптимизации аллокаторов………………………………………………………….. 169

Такие разные аллокаторы (Dancing with allocators)……………………………………………………………… 169

Управление памятью (Memory management)……………………………………………………………………….. 170

Ручное управление памятью (Manual memory management)……………………………………………… 172

Подсчет ссылок (RC, References counting)…………………………………………………………………………….. 173

Автоматический подсчет ссылок (ARC)………………………………………………………………………………… 174

Уникальное владение (Unique ownership)………………………………………………………………………………. 177

Фрагментация (Fragmentation)……………………………………………………………………………………………….. 178

Внутренняя фрагментация (Internal fragmentation)………………………………………………………. 178

Внешняя фрагментация (External fragmentation)…………………………………………………………… 179

Блок, заголовок, время жизни (block, header, lifetime)…………………………………………………………… 180

Получение ресурса есть инициализация (RAII, Resource Acquisition Is Initialization)………. 181

Утечка памяти (Memory leak)…………………………………………………………………………………………………. 182

Повторное освобождение (Double free)………………………………………………………………………………….. 183

“Висячие” указатели (Dangling pointers)…………………………………………………………………………………. 184

Повреждения кучи (Heap corruption)……………………………………………………………………………………… 185

Оборонительное программирование (Defensive programming)……………………………………………. 186

Умные указатели (Smart pointers)…………………………………………………………………………………………… 187

Собственные менеджеры памяти (Custom allocators)…………………………………………………………… 187

Отложенное освобождение (Lazy destroy)…………………………………………………………………………….. 188

Выделенная область памяти (Мemory arena)……………………………………………………………………….. 189

Дескрипторы объектов (Object handle)………………………………………………………………………………….. 190

Зависимости (Dependencies)……………………………………………………………………………………………………. 191

Каскадная очистка (Cascade cleanup)……………………………………………………………………………………. 193

Гонки данных (Data race)………………………………………………………………………………………………………… 194

Память-безопасные алгоритмы (Memory-safe algorithms)…………………………………………………… 195

Внутренняя изменяемость (Interior mutability)………………………………………………………………………. 196

Регистры процессора (CPU registers)………………………………………………………………………………………. 197

Отображение памяти (Memory mapping)………………………………………………………………………………. 198

Динамическая оперативная память (DRAM, Dynamic Random Access Memory)………………. 199

Прямой доступ к памяти (DMA, Direct memory access)………………………………………………………… 199

Выравнивание (Alignment)………………………………………………………………………………………………………. 200

Жизненный цикл инструкций………………………………………………………………………………………………….. 201

Предвыборка данных (Prefetching)…………………………………………………………………………………………. 203

Стек и куча (Stack vs Heap)…………………………………………………………………………………………………….. 204

Линейный аллокатор (Linear allocator)………………………………………………………………………………….. 205

Линейный аллокатор с откатом (Step-back allocator)…………………………………………………………… 208

Фреймовый аллокатор (Frame allocator)……………………………………………………………………………….. 210

Двойной фреймовый аллокатор (Double-frame allocator)…………………………………………………….. 212

Пример несогласованного поведения…………………………………………………………………………….. 215

N-фреймовый аллокатор (N-Frame allocator)………………………………………………………………………… 217

Стековый аллокатор (Stack allocator)……………………………………………………………………………………. 218

Двойной стековый аллокатор (Double-stack allocator)…………………………………………………………. 223

Двойной стековый аллокатор с общим началом (Pointed Double-Stack Allocator)……………. 227

Тройной стековый аллокатор (Triple-stack allocator)……………………………………………………………. 229

Пул памяти (Pool allocator)……………………………………………………………………………………………………… 233

Аллокатор со списком свободных блоков (Free list allocator)………………………………………………. 238

Аллокатор со свободными блоками под разные размеры (Segregated free lists)………………… 243

Парадокс скорости vs фрагментации…………………………………………………………………………………….. 246

Аллокатор готовых объектов (Slab-allocator)……………………………………………………………………….. 246

Аллокатор методом близнецов (Buddy allocator)…………………………………………………………………. 248

Арена объектов (Region-Based allocator)……………………………………………………………………………….. 251

Аллокатор с локальным кэшем для потока (Thread-cache allocator)………………………………….. 257

Фибоначчи аллокатор (Fibonacci allocator)…………………………………………………………………………… 261

Сжимающий аллокатор (Compacting allocator)……………………………………………………………………. 264

Двухуровневый аллокатор с разделением по размерам (Two-Level Segregated Fit)………….. 267

“Цветной” аллокатор (Color-based allocator)…………………………………………………………………………. 271

Аллокатор с отслеживанием времени жизни
(TTL Allocator, Time-to-live, Tracked- time-live)……………………………………………………………………… 273

Аллокатор с агрессивной рандомизацией адресов (Chaos allocator)…………………………………. 273

Аллокаторы != “серебряная пуля”………………………………………………………………………………………….. 275

0x24. Оптимизации контейнеров………………………………………………………….. 277

Контейнеры………………………………………………………………………………………………………………………………. 277

Инвалидация итераторов………………………………………………………………………………………………………… 278

Фиксированный массив (Fixed array)……………………………………………………………………………………… 279

Матрица (Matrix)……………………………………………………………………………………………………………………… 281

Неравномерная матрица (Ragged matrix, jagged arrays)………………………………………………………. 282

Динамическая матрица (Dynamic matrix)……………………………………………………………………………… 285

Динамический массив (Dynamic array, vector)………………………………………………………………………. 286

Стабильный вектор (Stable vector)…………………………………………………………………………………………. 288

Разреженный массив (Sparse array/vector)…………………………………………………………………………….. 292

Парадокс “ленивой сортировки”…………………………………………………………………………………….. 294

Упакованный вектор (Packed vector)……………………………………………………………………………………… 294

Гибридный вектор (Small/Hybrid vector)……………………………………………………………………………….. 296

Парадокс малых размеров………………………………………………………………………………………………. 300

Массив с отложенным удалением (Dirty vector)……………………………………………………………………. 300

Массив с чередованием (Buddy array)…………………………………………………………………………………… 304

Двусторонняя очередь (Deque, Double Ended Queue)…………………………………………………………… 306

Двусторонняя очередь со сжатием (Block-compressed deque)…………………………………………….. 308

Двусторонняя очередь с приоритетами (Bounded priority deque)……………………………………….. 310

Интрузивная двусторонняя очередь/список (Intrusive deque/list)………………………………………… 313

Пополняемый массив (Expandable vector)…………………………………………………………………………….. 316

Структурированное дерево данных (LSM, Level structured merge)…………………………………….. 318

Октодерево (Octree)………………………………………………………………………………………………………………….. 320

Квадродерево (Quadtree/btree)……………………………………………………………………………………………….. 325

Кольцевой буфер (Circular buffer)…………………………………………………………………………………………… 326

Хеш-таблица с мемоизацией (Memoization hashtable)…………………………………………………………. 330

Массив дескрипторов (Handle array)……………………………………………………………………………………… 333

Текстурный атлас (Texture atlas)……………………………………………………………………………………………. 337

Слотовый массив (Slot array)………………………………………………………………………………………………….. 341

0x25. Нескучное программирование…………………………………………………….. 345

Что такое нескучное программирование (Heapless programming)………………………………………. 345

Стек (Stack)………………………………………………………………………………………………………………………………. 353

Динамическая память (Heap)………………………………………………………………………………………………….. 359

Статическая память (Static)…………………………………………………………………………………………………….. 365

Компромиссы динамических объектов………………………………………………………………………………….. 367

Детерминизм стека…………………………………………………………………………………………………………………… 369

Утечки и оптимизации…………………………………………………………………………………………………………….. 370

Не использовать new?……………………………………………………………………………………………………………… 371

Локальные строки……………………………………………………………………………………………………………………. 373

Локальный полиморфизм (Ad-hoc polymorphism)………………………………………………………………… 375

std::get_if…………………………………………………………………………………………………………………………… 376

std::visit……………………………………………………………………………………………………………………………… 377

std::variant::index……………………………………………………………………………………………………………… 378

Оптимизируем векторы……………………………………………………………………………………………………………. 379

Оптимизация тайловой карты………………………………………………………………………………………………… 386

Работа с размеченной памятью (Preallocations)……………………………………………………………………. 388

“Тяжелые” логи………………………………………………………………………………………………………………………… 392

Часть III. Библиотека C++…………………………………………………………… 397

0x30. STL и алгоритмы…………………………………………………………………………. 399

Нестандартные стандарты…………………………………………………………………………………………………….. 399

Использование SIMD………………………………………………………………………………………………………………. 402

Алгоритмы………………………………………………………………………………………………………………………………… 404

Ортогональность данных и алгоритмов………………………………………………………………………………… 407

Итераторы………………………………………………………………………………………………………………………………… 409

Кэширование шейдеров (практический пример)………………………………………………………………….. 413

Как сделать через алгоритмы?……………………………………………………………………………………….. 415

Часто используемые алгоритмы…………………………………………………………………………………………….. 415

all_of………………………………………………………………………………………………………………………………….. 416

all_of (вредные советы)……………………………………………………………………………………………………. 417

any_of………………………………………………………………………………………………………………………………… 418

any_of (вредные советы)………………………………………………………………………………………………….. 419

find, find_if, find_if_not……………………………………………………………………………………………………. 420

find (вредные советы)………………………………………………………………………………………………………. 420

adjacent_find…………………………………………………………………………………………………………………….. 422

adjacent_find (вредные советы)………………………………………………………………………………………. 423

move, move_backward……………………………………………………………………………………………………….. 424

move (вредные советы)…………………………………………………………………………………………………….. 425

copy, copy_n, copy_if, copy_backward…………………………………………………………………………….. 425

count, count_if…………………………………………………………………………………………………………………… 426

count (вредные советы)……………………………………………………………………………………………………. 426

mismatch…………………………………………………………………………………………………………………………….. 427

mismatch (вредные советы)………………………………………………………………………………………………. 428

equal………………………………………………………………………………………………………………………………….. 429

equal (вредные советы)……………………………………………………………………………………………………. 429

is_permutation…………………………………………………………………………………………………………………… 431

is_permutation (вредные советы)…………………………………………………………………………………….. 431

search, search_n………………………………………………………………………………………………………………… 433

search (вредные советы)…………………………………………………………………………………………………… 433

replace, replace_if, replace_copy, replace_copy_if…………………………………………………………. 434

replace (вредные советы)…………………………………………………………………………………………………. 435

transform……………………………………………………………………………………………………………………………. 436

transform (вредные советы)……………………………………………………………………………………………… 437

remove, remove_if, remove_copy, remove_copy_if……………………………………………………………. 438

remove (вредные советы)………………………………………………………………………………………………….. 439

unique, unique_copy…………………………………………………………………………………………………………. 439

unique (вредные советы)………………………………………………………………………………………………….. 440

fill, fill_n……………………………………………………………………………………………………………………………. 441

fill (вредные советы)………………………………………………………………………………………………………… 441

generate, generate_n…………………………………………………………………………………………………………. 442

generate (вредные советы)……………………………………………………………………………………………….. 443

sort, partial_sort………………………………………………………………………………………………………………… 443

partial_sort (вредные советы)………………………………………………………………………………………….. 445

nth_element……………………………………………………………………………………………………………………….. 446

nth_element (вредные советы)…………………………………………………………………………………………. 446

reverse, reverse_copy…………………………………………………………………………………………………………. 447

merge………………………………………………………………………………………………………………………………….. 448

merge (вредные советы)……………………………………………………………………………………………………. 449

Часть IV. Многопоточность…………………………………………………….. 451

0x40. Мультипоточное программирование…………………………………………… 453

Конкурентность (Concurrency)……………………………………………………………………………………………….. 453

Масштабируемость (Scalability)…………………………………………………………………………………………….. 454

Cоперничество за ресурс (Contention)…………………………………………………………………………………… 455

Изолированное состояние (Separate state)…………………………………………………………………………….. 456

Общее состояние (Shared state)………………………………………………………………………………………………. 457

Копия состояния (Shadow state)……………………………………………………………………………………………… 458

Работа с потоками…………………………………………………………………………………………………………………… 459

Аналогия с реальным миром…………………………………………………………………………………………… 460

Проблемы потоков…………………………………………………………………………………………………………… 461

История одного бага, или многопоточный AI, который всех победил……………………………….. 465

Неблокирующая логика………………………………………………………………………………………………….. 465

Как было до С++11?………………………………………………………………………………………………………………… 467

Неблокирующие алгоритмы (non-blocking, lock-free, wait-free)…………………………………………… 471

Зачем куда-то уходить от мьютексов?…………………………………………………………………………………… 473

Атомарные операции………………………………………………………………………………………………………………. 475

Спинлок…………………………………………………………………………………………………………………………………….. 476

“Голодание” потоков (Thread starvation)……………………………………………………………………………….. 477

Алгоритмическое “голодание”………………………………………………………………………………………… 478

Эффекты кэша…………………………………………………………………………………………………………………… 479

Хороший спинлок для игры…………………………………………………………………………………………………….. 495

Практические советы………………………………………………………………………………………………………………. 498

Задачи (Tasks)………………………………………………………………………………………………………………………….. 500

Подвисания, подтормаживания (Hitching, Stutters)……………………………………………………………….. 502

Обращение к системе ресурсов (I/O hitching)………………………………………………………………… 502

Неправильная работа с потоками (Thread hitching)……………………………………………………… 503

Сборка мусора (GC hitching)…………………………………………………………………………………………… 504

Проблемы железа (Graphics hitching/stutters)…………………………………………………………………. 504

Рабочие потоки (Workers)……………………………………………………………………………………………………….. 505

Схема “один поток на ядро”……………………………………………………………………………………………. 505

Схема “два потока на ядро”……………………………………………………………………………………………. 507

Модель независимых задач (Embarrassingly Parallel Model)………………………………………………… 508

Модель с выборкой данных (Stateless workers)……………………………………………………………………… 511

Цепочки задач (Workers chain)……………………………………………………………………………………………….. 512

Часть V. Паттерны………………………………………………………………………… 521

0x50. Паттерны разработки………………………………………………………………….. 523

Фреймворки умирают, математика не стареет……………………………………………………………………… 523

Cиняя книга………………………………………………………………………………………………………………………………. 525

Синдром фломастера………………………………………………………………………………………………………………. 527

Уровни паттернов……………………………………………………………………………………………………………………. 528

Команда (Command)……………………………………………………………………………………………………………….. 530

Недостатки……………………………………………………………………………………………………………………….. 533

Возможности для расширения………………………………………………………………………………………… 533

Совместимость…………………………………………………………………………………………………………………. 534

Плохие примеры внедрения…………………………………………………………………………………………….. 534

Состояние (State)……………………………………………………………………………………………………………………… 536

Конечный автомат (Finite State Machine)………………………………………………………………………………. 537

Детерминированный конечный автомат (Deterministic [basic] FSM)…………………………… 539

Недетерминированный конечный автомат (Nondeterministic FSM)…………………………….. 540

Автомат состояний со стеком (FSM + pushdown states)………………………………………………… 541

Конечный автомат на основе состояний (State-based/Object-model FSM)…………………. 542

Возможности для расширения………………………………………………………………………………………… 544

Влияние на архитектуру…………………………………………………………………………………………………. 545

Недостатки……………………………………………………………………………………………………………………….. 546

Плохие примеры использования…………………………………………………………………………………….. 547

Разделяемый объект / Приспособленец (Flyweight)………………………………………………………………. 549

Влияние на архитектуру…………………………………………………………………………………………………. 551

Недостатки……………………………………………………………………………………………………………………….. 552

Совместимость…………………………………………………………………………………………………………………. 553

Плохие примеры использования…………………………………………………………………………………….. 553

Наблюдатель (Observer)………………………………………………………………………………………………………….. 555

Возможности для расширения………………………………………………………………………………………… 559

Влияние на архитектуру…………………………………………………………………………………………………. 560

Недостатки……………………………………………………………………………………………………………………….. 560

Совместимость…………………………………………………………………………………………………………………. 561

Примеры плохого использования…………………………………………………………………………………… 562

Шина событий (Event bus)………………………………………………………………………………………………………. 564

Возможности для расширения………………………………………………………………………………………… 566

Влияние на архитектуру…………………………………………………………………………………………………. 567

Недостатки……………………………………………………………………………………………………………………….. 568

0x51. “Ленивая” логика……………………………………………………………………….. 569

Флаг изменения (Dirty flag)……………………………………………………………………………………………………… 569

Влияние на архитектуру…………………………………………………………………………………………………. 572

Недостатки……………………………………………………………………………………………………………………….. 572

Совместимость…………………………………………………………………………………………………………………. 573

Примеры плохого использования…………………………………………………………………………………… 574

Слой логики (Update layer)……………………………………………………………………………………………………… 576

Ближний слой (Close Layer)…………………………………………………………………………………………….. 576

Средний слой (Mid Layer)……………………………………………………………………………………………….. 577

Дальний слой (Far Layer)…………………………………………………………………………………………………. 577

“Замороженные” объекты (Frozen Layer)……………………………………………………………………….. 578

Реализация………………………………………………………………………………………………………………………… 579

Влияние на архитектуру…………………………………………………………………………………………………. 580

Недостатки……………………………………………………………………………………………………………………….. 580

Совместимость…………………………………………………………………………………………………………………. 581

Примеры плохого использования…………………………………………………………………………………… 581

Что дальше?……………………………………………………………………………………………………………………………… 583

0xFF. Игры — это искусство………………………………………………………………… 585

Предметный указатель…………………………………………………………………………. 587

Об авторе……………………………………………………………………………………………… 591

Опубликовано

Новинка: “Terraform. Сборник рецептов”

Terraform. Сборник рецептов

Практическое руководство по использованию Terraform для автоматизации облачной инфраструктуры. Книга построена по принципу сборника рецептов, где каждая задача рассматривается с объяснением «как» и «почему». Она подходит как для начинающих, помогая им освоить основы Terraform и концепции «инфраструктура как код», так и для опытных инженеров, предлагая продвинутые техники для работы с многооблачными средами, контейнерами и обеспечения защиты данных.  Основные темы: модули и провайдеры Terraform, управление контейнерами, централизованное управление через HCP Terraform и Terraform Enterprise, интеграция с CI/CD и реальные примеры развертывания на AWS, Kubernetes и других платформах.

Для начинающих и опытных DevOps-инженеров и архитекторов

Чтобы укротить хаос современной инфраструктуры, нужен современный и кардинальный  подход. Terraform даёт его. Эта книга — лучшее практическое руководство, которое превращает мощь инструмента в рабочие решения для реальных инженерных задач.
Крис Девер, технический специалист  компании EditShare

Эта книга — отличный настольный помощник, который поможет вам справиться с некоторыми сложными задачами.
Адам Макпартлан, ведущий консультант компании Hippo Digital

 

Инфраструктура как код

Облачные сервисы и SaaS-решения пронизывают ИТ-инфраструктуру каждой компании, требуя перехода от ручного управления услугами к более структурированному подходу, основанному на их описании в виде кода. Terraform предоставляет инструменты для управления жизненным циклом ИТ-инфраструктуры для тысяч различных облачных провайдеров и SaaS-платформ.

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

Если вы только начинаете работать с Terraform и концепцией «инфраструктура как код», эта книга поможет вам заложить прочную основу для дальнейшего развития. Опытный пользователь сможет структурировать знания и перейти к управлению более сложной, мультиоблачной инфраструктурой, распределенной между несколькими провайдерами.

Рассматриваются следующие вопросы:

  • Стратегии использования Terraform с системами контроля версий (например, Git)
  • Шаблоны валидации и тестирования инфраструктуры для проверки изменений
  • Методы импорта уже существующих ресурсов из облачных консолей
  • Преобразование сервисов в повторно используемые компоненты (готовые модули)
  • Интеграция Terraform с другими инструментами HashiCorp (Vault, Consul)
  • Развертывание контейнеризированных рабочих нагрузок в Kubernetes
Taylor Dolezal

Долезал Тейлор (Taylor Dolezal) руководит отделом экосистемы в Cloud Native Computing Foundation (CNCF), курируя направления развития и партнерских отношений в сфере облачных вычислений.
В своей карьере Тейлор всегда выступал связующим звеном между сложными системами и человеческим восприятием, будь то обеспечение надежности технических объектов, разработка программного обеспечения или совместная работа над инновационными технологическими решениями. Когда Тейлор не занят работой с облачными технологиями, он исследует тропы в окрестностях Лос-Анджелеса, погружается в хорошую книгу и оптимизирует свой процесс подачи каламбуров для максимальной окупаемости инвестиций.

 

 

Kerim Satirli

Сатирли Керим (Kerim Satirli) занимает позицию ведущего адвоката разработчиков в HashiCorp, где специализируется на обучении операторов и разработчиков по созданию надежной инфраструктуры и эффективным методам оркестрации.
Прежде чем присоединиться к HashiCorp, Керим занимался промышленным IoT (Industrial Internet of Things — промышленный Интернет вещей) для аэропорта Амстердама, а также помогал музеям в оцифровке и размещении в Интернете своих коллекций. В свободное время Керим наслаждается общением с дочерью, увлекается аэрофотосъемкой и печет торты.

Книгу “Terraform. Сборник рецептов” можно купить в нашем интенет-магазине.

Предисловие…………………………………………………………………………………………….. 9

Для кого предназначена эта книга?…………………………………………………………………………………………… 9

Почему была написана эта книга?…………………………………………………………………………………………… 10

Краткий обзор глав……………………………………………………………………………………………………………………. 10

О чем эта книга…………………………………………………………………………………………………………………………… 11

Условные обозначения и соглашения……………………………………………………………………………………… 11

Примеры применения кода……………………………………………………………………………………………………….. 11

Платформа онлайн-обучения O’Reilly……………………………………………………………………………………… 12

Контактная информация…………………………………………………………………………………………………………… 13

Благодарности…………………………………………………………………………………………………………………………… 13

Глава 1. Подготовка к работе с Terraform……………………………………………… 15

1.1.   В каких случаях используется Terraform……………………………………………………………………….. 16

1.2.   В каких случаях не используется Terraform…………………………………………………………………… 17

1.3.   Установка и настройка Terraform…………………………………………………………………………………… 18

Установка Terraform в Linux……………………………………………………………………………………………. 18

Установка Terraform в macOS…………………………………………………………………………………………. 18

Установка Terraform в Windows………………………………………………………………………………………. 19

Установка OpenTofu…………………………………………………………………………………………………………. 19

1.4.   Провайдеры Terraform……………………………………………………………………………………………………… 21

1.5.   Модули Terraform…………………………………………………………………………………………………………….. 23

1.6.   Изменение состояния Terraform с помощью консоли terraform……………………………………. 24

1.7.   Применение облачной платформы HashiCorp Terraform……………………………………………… 25

1.8.   Совместное использование Terraform и Visual Studio Code………………………………………….. 27

1.9.   Управление ограничениями версий провайдеров Terraform………………………………………… 29

1.10. Алгоритм развертывания репозиториев кода с контролем версий Terraform…………….. 31

1.11. Развертывание контейнера Docker с помощью Terraform…………………………………………….. 32

1.12. Обновление Terraform: от 0.x до 1.x и выше…………………………………………………………………… 33

1.13. Использование переменных Terraform……………………………………………………………………………. 35

1.14. Консистентность кода для согласованного пользовательского опыта……………………….. 36

Глава 2. Основы Terraform……………………………………………………………………. 39

2.1.   Форматирование и проверка кода Terraform…………………………………………………………………. 39

2.2.   Быстрое тестирование с помощью консоли Terraform………………………………………………….. 40

2.3.   Повышение качества кода с помощью TFLint………………………………………………………………… 41

2.4.   Улучшение качества кода с помощью TFSec…………………………………………………………………. 42

2.5.   Проверка кода с помощью предусловий и постусловий……………………………………………….. 43

2.6.   Проверка кода с помощью Open Policy Agent…………………………………………………………………. 45

2.7.   Документирование кода с помощью terraform-docs………………………………………………………. 47

2.8.   Автоматизация проверки кода с помощью GitHub Actions…………………………………………… 49

2.9.   Обновление версии провайдера с помощью Dependabot……………………………………………… 50

2.10. Использование GitHub Codespaces и DevContainers……………………………………………………… 52

2.11. Ограничение Blast Radius с помощью Terraform……………………………………………………………. 56

Глава 3. Шаблоны синтаксиса Terraform………………………………………………. 60

3.1.   Очистка пользовательских данных с помощью trimspace…………………………………………….. 60

3.2.   Удаление префиксов и суффиксов…………………………………………………………………………………… 61

3.3.   Работа с регулярными выражениями……………………………………………………………………………… 62

3.4.   Расширенные операции со строками………………………………………………………………………………. 64

3.5.   Обработка строк с учетом регистра с помощью методов title, upper и lower………………. 65

3.6.   Сортировка списка по алфавиту……………………………………………………………………………………… 67

3.7.   Создание подсетей на основе CIDR-блока…………………………………………………………………….. 69

3.8.   Взаимодействие с локальной файловой системой…………………………………………………………. 71

3.9.   Рендеринг шаблонов…………………………………………………………………………………………………………. 73

3.10. Валидация входных строк……………………………………………………………………………………………….. 74

3.11. Эффективное извлечение данных с помощью can и try…………………………………………………. 76

3.12. Последовательная обработка входных данных……………………………………………………………. 79

3.13. Создание информативных сообщений об ошибках при некорректном вводе…………….. 82

3.14. Использование данных в различных состояниях Terraform…………………………………………. 85

Глава 4. Модули и провайдеры Terraform……………………………………………… 88

4.1.   Использование публичных модулей для создания эластичного кластера EKS…………. 88

4.2.   Линтинг Terraform с помощью GitHub Actions……………………………………………………………….. 92

4.3.   Аутентификация у провайдеров Terraform…………………………………………………………………….. 95

4.4.   Аутентификация приватных модулей…………………………………………………………………………….. 97

4.5.   Создание модуля Terraform……………………………………………………………………………………………… 99

4.6.   Управление секретами GitHub с помощью Terraform…………………………………………………. 102

4.7.   Управление репозиториями GitHub с помощью Terraform…………………………………………. 104

4.8.   Динамическая конфигурация с Consul KV……………………………………………………………………. 106

4.9.   Настройка провайдера с оповещением о работоспособности служб……………………….. 109

4.10. Использование состояния Terraform с помощью провайдеров………………………………….. 112

4.11. Использование нескольких одинаковых провайдеров………………………………………………… 114

Глава 5. Управление контейнерами с помощью Terraform………………….. 118

5.1.   Работа с локальными и удаленными образами Docker………………………………………………. 118

5.2.   Различие между развертыванием и конфигурацией кластера……………………………………. 120

5.3.   Авторизация Terraform для кластерных операций……………………………………………………… 122

5.4.   Планирование контейнеров на Kubernetes с помощью YAML…………………………………… 123

5.5.   Планирование контейнеров в Kubernetes с помощью HCL…………………………………………. 125

5.6.   Преобразование YAML Kubernetes в HCL с помощью k2tf………………………………………… 127

5.7.   Настройка аннотаций для развертывания Kubernetes………………………………………………… 128

5.8.   Настройка конфигурации развертывания Kubernetes…………………………………………………. 129

5.9.   Применение сетевых политик Kubernetes в Terraform…………………………………………………. 132

5.10. Развертывание контейнеров с помощью Helm…………………………………………………………….. 134

5.11. Мониторинг развертываний Kubernetes с помощью Helm………………………………………….. 137

5.12. Планирование контейнеров на HashiCorp Nomad………………………………………………………. 140

Глава 6. HCP Terraform и Terraform Enterprise……………………………………. 143

6.1.   Настройки HCP Terraform……………………………………………………………………………………………… 143

6.2.   Интеграция HCP Terraform с системой управления версиями (VCS)…………………………. 148

6.3.   Применение состояний Terraform в HCP Terraform…………………………………………………….. 150

6.4.   Интеграция HCP Terraform с GitHub Actions………………………………………………………………… 152

6.5.   Совместные рабочие процессы с использованием HCP Terraform……………………………. 154

6.6.   Устранение неполадок в HCP Terraform и Terraform Enterprise…………………………………. 156

6.7.   Реализация политики как кода………………………………………………………………………………………. 158

6.8.   Управление затратами с помощью HCP Terraform……………………………………………………… 160

6.9.   Использование удаленных операций для крупномасштабных развертываний……….. 163

6.10. Расширенные функции управления состоянием и восстановления……………………………. 166

Глава 7. Управление секретами при помощи Terraform………………………. 169

7.1.   Работа с конфиденциальными данными в Terraform…………………………………………………… 169

7.2.   Извлечение пар «ключ–значение» из хранилища HashiCorp Vault……………………………. 171

7.3.   Управление секретами Kubernetes с помощью нативных функций Kubernetes…………. 173

7.4.   Управление секретами Kubernetes с помощью Vault и Terraform………………………………. 176

7.5.   Хранение секретов в переменных среды………………………………………………………………………. 179

7.6.   Аудит и ротация секретов………………………………………………………………………………………………. 181

7.7.   Управление секретами в Terraform с помощью менеджеров паролей……………………….. 183

7.8.   Комплаенс и управление секретами в Terraform…………………………………………………………. 184

7.9.   Динамические секреты с помощью HashiCorp Vault…………………………………………………… 187

7.10. Обеспечение безопасности инжектирования секретов в конвейеры CI/CD………………. 189

Глава 8. Управление конфигурацией при помощи Terraform………………. 192

8.1.   Создание сценариев командной оболочки в Terraform………………………………………………. 192

8.2.   Создание конфигурации Ansible в Terraform………………………………………………………………… 194

8.3.   Динамическая конфигурация с помощью Consul KV…………………………………………………… 196

8.4.   Использование данных из HTTP-интерфейсов…………………………………………………………….. 198

8.5.   Применение условной логики в Terraform……………………………………………………………………. 199

8.6.   Импорт существующей инфраструктуры в Terraform…………………………………………………. 201

8.7.   Использование рабочих областей Terraform……………………………………………………………….. 203

8.8.   Использование шаблонов Terraform…………………………………………………………………………….. 205

8.9.   Управление зависимостями между ресурсами Terraform…………………………………………… 207

8.10. Реализация «сине-зеленых» развертываний с помощью Terraform……………………………. 209

Глава 9. Расширенные функции Terraform………………………………………….. 211

9.1.   Написание файлов конфигурации в Terraform…………………………………………………………….. 211

9.2.   Создание конфигурации Cloud-Init……………………………………………………………………………….. 213

9.3.   Внедрение модулей Terraform в конвейеры CI/CD……………………………………………………… 216

9.4.   Расширенное управление состоянием в Terraform………………………………………………………. 218

9.5.   Terraform в контексте мультиоблачных стратегий……………………………………………………… 221

9.6.   Работа в Terraform с масштабируемыми архитектурами…………………………………………… 223

9.7.   Создание пользовательских провайдеров Terraform………………………………………………….. 226

9.8.   Интеграция Terraform с инструментами мониторинга………………………………………………… 229

9.9.   Управление безопасностью и соблюдение нормативных требований в Terraform….. 234

9.10. Расширенные методы отладки в Terraform………………………………………………………………….. 238

Глава 10. Практические примеры использования………………………………… 242

10.1. Управление несколькими средами с помощью рабочих областей Terraform…………… 242

10.2. Развертывание высокодоступного веб-приложения в нескольких регионах…………….. 245

10.3. Создание масштабируемого кластера Kubernetes в AWS EKS…………………………………… 249

10.4. Реализация «сине-зеленых» развертываний с помощью Terraform……………………………. 252

10.5.   Автоматизация миграции баз данных с помощью Terraform и AWS RDS………………. 257

10.6.   Развертывание бессерверного приложения на AWS Lambda и API Gateway…………. 260

10.7.   Реализация инфраструктуры как кода для рабочих процессов GitOps…………………… 264

10.8.   Оптимизация затрат с помощью Terraform и Spot Instances…………………………………….. 267

10.9.   Развертывание системы многооблачного мониторинга с помощью Terraform………. 270

10.10. Автоматизация аварийного восстановления с помощью Terraform и AWS……………. 274

Предметный указатель…………………………………………………………………………. 279

Об авторах……………………………………………………………………………………………. 284

Об изображении на обложке………………………………………………………………… 285