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

Новинка: “Объектно-ориентированное программирование: с нуля к SOLID и MVC””

Объектно-ориентированное программирование: с нуля к SOLID и MVC

Базовая книга по приёмам объектно-ориентированного программирования (ООП) с примерами на языке C++. Разобраны основные принципы и техники разработки объектно-ориентированных программ, объяснены шаблоны проектирования (паттерны), особое внимание уделено принципам SOLID, архитектуре MVC (модель-представление-контроллер) и особенностям работы с ООП в С++.

Для начинающих разработчиков, специалистов по C++, студентов вузов

MVC и SOLID для уверенного понимания паттернов проектирования

Вот уже более 30 лет объектно-ориентированное программирование (ООП) остаётся основной парадигмой разработки программного обеспечения, доминирующей в академической информатике и в прикладном программировании на C++, Java, C#, Python и других языках, лидирующих в рейтинге TIOBE. При этом многие современные книги по ООП представляют собой огромные фолианты и не подходят для базового изучения этой темы.

Данная книга, написанная на основе многолетних наработок автора в преподавании и индустрии программного обеспечения, раскрывает тему ООП максимально доступно и просто. Кроме базовых основ ООП, книга описывает паттерны проектирования, принципы SOLID, архитектуру MVC (модель-представление-контроллер), а также затрагивает особенности ООП в языке С++.
Материал подходит в качестве вводной книги по ООП. Книга будет интересна студентам, осваивающим C++ и ООП, но и опытные специалисты тоже найдут в ней интересные детали об использовании паттернов проектирования.

Вы узнаете, как:

– инкапсулировать данные и код в объекты,
– работать с объектами в С++ и других востребованных языках,
– управлять композицией и взаимодействием объектов,
– управлять временем жизни объектов,
– использовать паттерны проектирования,
– применять принципы SOLID,
– создавать событийно-ориентированные приложения,
– решать задачи с помощью архитектуры MVC.

Книгу “Объектно-ориентированное программирование: с нуля к SOLID и MVC” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Посвящения и благодарности……………………………………………………………… 5

Введение……………………………………………………………………………………………… 7

Некоторые обозначения и сокращения………………………………………………………………………………… 7

Что это и для кого…………………………………………………………………………………………………………………… 7

Зачем это всё…………………………………………………………………………………………………………………………… 8

Методическая проблема……………………………………………………………………………………………………….. 9

Глава 1. Основы ООП……………………………………………………………………….. 11

1.1. Основные понятия…………………………………………………………………………………………………………. 11

1.2. Хватит бла-бла-бла, давайте уже код!………………………………………………………………………… 16

1.3. Определение классов и создание объектов…………………………………………………………………. 17

1.4. Работа с объектами……………………………………………………………………………………………………….. 20

1.5. Методы…………………………………………………………………………………………………………………………… 23

1.6. Сокрытие свойств и методов………………………………………………………………………………………… 26

1.7. Конструкторы и деструкторы, жизненный цикл объектов………………………………………… 29

1.8. Наследование………………………………………………………………………………………………………………… 38

1.9. Расширение и изменение объектов при наследовании………………………………………………. 45

1.10. Композиция………………………………………………………………………………………………………………….. 46

1.11. Глубокое и поверхностное копирование, value- и reference-семантика…………………. 51

1.12. Наследование, композиция, агрегация, ассоциация, зависимость…………………………. 52

1.13. Диаграммы классов, последовательностей, состояний и прочий UML…………………. 55

1.14. Композиция или наследование?………………………………………………………………………………… 60

1.15. Помещение объектов в переменные различных типов…………………………………………….. 63

1.16. Полиморфизм……………………………………………………………………………………………………………….. 66

1.17. Приведение типов………………………………………………………………………………………………………… 74

1.18. Передача и возврат объектов из функций в C++………………………………………………………. 83

1.19. Проблемы работы с памятью и не только, в C++ и не только…………………………………. 87

1.20. Технологии и практики управления долгоживущими объектами в C++………………… 90

Глава 2. Приемы ООП……………………………………………………………………….. 99

2.1. Демистификация паттернов ООП…………………………………………………………………………………. 99

2.2. Обычные приемы и антиприемы ООП, паттерны и антипаттерны…………………………. 100

2.3. Template Method………………………………………………………………………………………………………….. 103

2.4. Prototype……………………………………………………………………………………………………………………….. 106

2.5. Бесклассовое (прототипно-ориентированное) ООП………………………………………………… 109

2.6. Интерфейсы………………………………………………………………………………………………………………….. 110

2.7. Множественное наследование…………………………………………………………………………………… 113

2.8. Примеси (миксины, mixins)…………………………………………………………………………………………. 115

2.9. Singleton………………………………………………………………………………………………………………………… 116

2.10. Chain of Responsibility……………………………………………………………………………………………….. 119

2.11. Делегирование, объектная шизофрения………………………………………………………………….. 126

2.12. Strategy……………………………………………………………………………………………………………………….. 130

2.13. Adapter……………………………………………………………………………………………………………………….. 135

2.14. Iterator………………………………………………………………………………………………………………………… 142

2.15. Шаблоны C++. Осторожно по минному полю………………………………………………………… 150

2.16. Стандартные контейнеры STL…………………………………………………………………………………. 152

2.17. Decorator…………………………………………………………………………………………………………………….. 154

2.18. Proxy…………………………………………………………………………………………………………………………… 160

2.19. Composite…………………………………………………………………………………………………………………… 163

2.20. Observer сам по себе и как пример mixin…………………………………………………………………. 167

2.21. Command…………………………………………………………………………………………………………………… 171

2.22. Factory Method, Abstract Factory……………………………………………………………………………… 179

2.23. Abstract Factory еще раз……………………………………………………………………………………………. 187

2.24. Memento…………………………………………………………………………………………………………………….. 190

2.25. Bridge………………………………………………………………………………………………………………………….. 193

2.26. Visitor………………………………………………………………………………………………………………………….. 201

2.27. Одинарная и двойная диспетчеризация………………………………………………………………….. 209

2.28. SOLID-принципы……………………………………………………………………………………………………….. 211

2.29. Объектная интроспекция и рефлексия…………………………………………………………………….. 221

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

2.31. Архитектура Model-View-Controller (MVC) и ее варианты.
Самый простой способ ее нарушить и исправить………………………………………………….. 237

Приложение. Ликбез по переменным и указателям в C++………………… 249

П.1. Обозначения………………………………………………………………………………………………………………… 249

П.2. Краткое описание объявления и примеры использования……………………………………… 249

П.3. Полное описание………………………………………………………………………………………………………… 250

П.3.1. Переменная………………………………………………………………………………………………………. 250

П.3.2. Память………………………………………………………………………………………………………………. 251

П.3.3. Адрес переменной……………………………………………………………………………………………. 252

П.3.4. Переменные-указатели……………………………………………………………………………………. 253

П.3.5. Операции с указателями…………………………………………………………………………………. 256

П.3.6. Массивы……………………………………………………………………………………………………………. 257

П.3.7. Ссылки………………………………………………………………………………………………………………. 259

П.4. Вопросы для самоконтроля……………………………………………………………………………………….. 262

Список литературы………………………………………………………………………….. 265

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

Макеев Григорий Анатольевич

Макеев Григорий Анатольевич, кандидат технических наук, практикующий инженер-программист, руководитель группы разработчиков, занимающейся разработкой наукоёмкого инженерного ПО, преподаватель Уфимского университета науки и технологий. Обладает почти 20-летним профессиональным стажем. На протяжении преподавательской карьеры вел дисциплины, связанные с объектно-ориентированным и функциональным программированием, а также с базами данных.

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

Встречайте 2-е издание книги: “Программирование инфраструктуры”

Программирование инфраструктуры. 2-е издание

Впервые на русском языке  книга об управлении облачной IT-инфраструктурой. Показаны методы контроля и развития версий инфраструктуры, аналогичные применяемым при работе с исходным кодом. Рассказано  об управлении облачными серверами, их стеками и кластерами через Terraform-подобный инфраструктурный код. Описано, как получать, поддерживать и масштабировать облачные ресурсы, как управлять облачными серверами, их стеками и кластерами, как организовать непрерывное развертывание и масштабирование облачных инфраструктур.

Для системных администраторов, инженеров по облачным сервисам, программистов,  DevOps-специалистов

Практики IaC постепенно развивались от поддержки серверов до управления полнофункциональными стеками. Но за новые возможности приходится расплачиваться усложнением систем. Эта книга позволит вам не только освоить паттерны проектирования облачных систем, но и вывести автоматизацию серверов на новый уровень.
Патрик Дебуа, основатель конференции DevOpsDays

Как создаются адаптивные облачные системы

Ещё несколько лет назад тема программируемой инфраструктуры (Infrastructure as Code – IaC) была в новинку. Но сегодня даже самые консервативные организации, например крупные банки, постепенно переносят инфраструктуру в облака, и становится важно поддерживать её конфигурацию в виде обширных баз кода.

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

В книге рассмотрены:

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

Книгу “Программирование инфраструктуры. 2-е издание” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 18

Зачем я написал эту книгу………………………………………………………………………………………………………… 19

Что нового и особенного во втором издании…………………………………………………………………………… 19

Что дальше…………………………………………………………………………………………………………………………………. 21

Чего ожидать и чего не стоит ожидать от этой книги…………………………………………………………….. 21

Исторический контекст программирования инфраструктуры………………………………………………. 22

Для кого эта книга……………………………………………………………………………………………………………………… 22

Принципы, практики, паттерны………………………………………………………………………………………………… 23

Примеры с ShopSpinner……………………………………………………………………………………………………………… 24

Соглашения, используемые в книге………………………………………………………………………………………….. 24

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

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

Глава 1. Что такое программирование инфраструктуры………………………… 29

Из железного века в облачный………………………………………………………………………………………………….. 30

Программирование инфраструктуры………………………………………………………………………………………. 31

Достоинства программирования инфраструктуры………………………………………………………………… 32

Программирование инфраструктуры как оптимизация в расчете на изменения…………………. 32

Возражение: «мы не так часто вносим изменения, поэтому их автоматизация не столь нужна»            33

Возражение: «сначала систему нужно построить, а уже потом автоматизировать». 34

Возражение: «приходится выбирать между скоростью и качеством»………………………. 35

Четыре ключевые метрики………………………………………………………………………………………………………… 37

Три ключевые практики для программирования инфраструктуры………………………………………. 37

Ключевая практика: все определяется как код……………………………………………………………. 38

Ключевая практика: вся текущая работа непрерывно тестируется и сдается…………. 38

Ключевая практика: создаются небольшие простые фрагменты, которые поддаются изменениям независимо друг от друга………………………………………………………………………………………………………………………………… 39

Заключение………………………………………………………………………………………………………………………………… 39

Глава 2. Инфраструктурные принципы для облачного века………………….. 40

Принцип: исходим из того, что системы ненадежны……………………………………………………………… 40

Принцип: все нужно делать воспроизводимым………………………………………………………………………. 41

Западня: системы-снежинки……………………………………………………………………………………………………… 42

Принцип: создавайте такие компоненты, которые легко пустить в расход…………………………. 43

Принцип: минимизируем вариативность…………………………………………………………………………………. 44

Конфигурационная энтропия………………………………………………………………………………………… 45

Принцип: убедитесь, что любой процесс сможете повторить……………………………………………….. 47

Заключение………………………………………………………………………………………………………………………………… 48

Глава 3. Инфраструктурные платформы………………………………………………… 49

Из каких частей состоит инфраструктурная система…………………………………………………………….. 49

Инфраструктурные платформы……………………………………………………………………………………………….. 51

Инфраструктурные ресурсы…………………………………………………………………………………………………….. 53

Вычислительные ресурсы……………………………………………………………………………………………… 54

Ресурсы для хранения данных………………………………………………………………………………………. 55

Сетевые ресурсы…………………………………………………………………………………………………………….. 56

Заключение………………………………………………………………………………………………………………………………… 59

Глава 4. Ключевая практика: все определяется как код………………………… 60

Зачем следует определять инфраструктуру так, чтобы ее можно было программировать.. 60

Что можно определить как код…………………………………………………………………………………………………. 61

Выбирайте инструменты, конфигурация которых вынесена наружу……………………….. 61

Управление вашим кодом в системе контроля версий………………………………………………… 62

Языки для программирования инфраструктуры…………………………………………………………………….. 63

Скрипты для обслуживания инфраструктуры…………………………………………………………….. 64

Декларативные инфраструктурные языки…………………………………………………………………… 66

Программируемые императивные инфраструктурные языки…………………………………….. 68

Сравнение декларативных и императивных языков в контексте инфраструктуры…. 69

Предметно-ориентированные инфраструктурные языки……………………………………………. 69

Языки общего назначения в сравнении с инфраструктурными DSL…………………………. 71

Принципы реализации при определении инфраструктуры, которую планируется программировать              71

Разделяем декларативный и императивный код………………………………………………………….. 72

Обращайтесь с инфраструктурным кодом точно как с «настоящим»……………………….. 72

Заключение………………………………………………………………………………………………………………………………… 73

Часть II. Работа с инфраструктурными стеками………………. 75

Глава 5. Программирование инфраструктурных стеков………………………… 77

Что такое инфраструктурный стек…………………………………………………………………………………………… 77

Код стека…………………………………………………………………………………………………………………………. 78

Инстанс стека………………………………………………………………………………………………………………….. 79

Конфигурирование серверов в стеке…………………………………………………………………………….. 79

Низкоуровневые инфраструктурные языки…………………………………………………………………. 80

Высокоуровневые инфраструктурные языки………………………………………………………………. 81

Паттерны и антипаттерны структурирования стеков……………………………………………………………. 82

Антипаттерн: монолитный стек…………………………………………………………………………………….. 82

Зачем это нужно…………………………………………………………………………………………………….. 82

Применимость…………………………………………………………………………………………………………. 83

Последствия……………………………………………………………………………………………………………. 83

Внедрение……………………………………………………………………………………………………………….. 84

Смежные паттерны………………………………………………………………………………………………… 84

Паттерн: стек группы приложений……………………………………………………………………………….. 84

Зачем это нужно…………………………………………………………………………………………………….. 85

Применимость…………………………………………………………………………………………………………. 85

Последствия……………………………………………………………………………………………………………. 85

Внедрение……………………………………………………………………………………………………………….. 86

Смежные паттерны………………………………………………………………………………………………… 86

Паттерн: сервисный стек……………………………………………………………………………………………….. 86

Зачем это нужно…………………………………………………………………………………………………….. 86

Применимость…………………………………………………………………………………………………………. 87

Последствия……………………………………………………………………………………………………………. 87

Внедрение……………………………………………………………………………………………………………….. 87

Смежные паттерны………………………………………………………………………………………………… 87

Паттерн: микростек………………………………………………………………………………………………………… 87

Зачем это нужно…………………………………………………………………………………………………….. 88

Последствия……………………………………………………………………………………………………………. 88

Внедрение……………………………………………………………………………………………………………….. 88

Смежные паттерны………………………………………………………………………………………………… 88

Заключение………………………………………………………………………………………………………………………………… 88

Глава 6. Создание окружений с помощью стеков…………………………………… 89

Зачем вообще нужны окружения……………………………………………………………………………………………… 89

Окружения для доставки………………………………………………………………………………………………… 89

Множество продакшен-окружений………………………………………………………………………………. 90

Окружения, согласованность и конфигурация…………………………………………………………….. 91

Паттерны построения окружений…………………………………………………………………………………………….. 92

Антипаттерн: один стек на несколько окружений………………………………………………………. 92

Зачем это нужно…………………………………………………………………………………………………….. 92

Последствия……………………………………………………………………………………………………………. 93

Смежные паттерны………………………………………………………………………………………………… 93

Антипаттерн: копирование и вставка окружения……………………………………………………….. 94

Зачем это нужно…………………………………………………………………………………………………….. 94

Применимость…………………………………………………………………………………………………………. 94

Последствия……………………………………………………………………………………………………………. 94

Внедрение……………………………………………………………………………………………………………….. 95

Смежные паттерны………………………………………………………………………………………………… 95

Паттерн: переиспользуемый стек………………………………………………………………………………….. 95

Зачем это нужно…………………………………………………………………………………………………….. 96

Применимость…………………………………………………………………………………………………………. 97

Последствия……………………………………………………………………………………………………………. 97

Внедрение……………………………………………………………………………………………………………….. 97

Смежные паттерны………………………………………………………………………………………………… 97

Построение окружений с использованием множества стеков……………………………………………….. 98

Заключение………………………………………………………………………………………………………………………………… 99

Глава 7. Конфигурирование инстансов стеков…………………………………….. 100

Использование параметров стека для создания уникальных идентификаторов………………. 101

Пример параметров стека……………………………………………………………………………………………………….. 102

Паттерны конфигурирования стеков……………………………………………………………………………………… 103

Антипаттерн: установка параметров стека вручную……………………………………………….. 103

Зачем это нужно…………………………………………………………………………………………………… 103

Последствия………………………………………………………………………………………………………….. 104

Внедрение……………………………………………………………………………………………………………… 104

Смежные паттерны………………………………………………………………………………………………. 104

Паттерн: переменные окружения стека……………………………………………………………………… 105

Зачем это нужно…………………………………………………………………………………………………… 105

Применимость………………………………………………………………………………………………………. 105

Последствия………………………………………………………………………………………………………….. 105

Внедрение……………………………………………………………………………………………………………… 106

Смежные паттерны………………………………………………………………………………………………. 107

Паттерн: скрипты для ввода параметров…………………………………………………………………… 107

Зачем это нужно…………………………………………………………………………………………………… 107

Применимость………………………………………………………………………………………………………. 107

Последствия………………………………………………………………………………………………………….. 108

Внедрение……………………………………………………………………………………………………………… 108

Смежные паттерны………………………………………………………………………………………………. 110

Паттерн: конфигурационные файлы стека………………………………………………………………… 110

Зачем это нужно…………………………………………………………………………………………………… 110

Применимость………………………………………………………………………………………………………. 111

Последствия………………………………………………………………………………………………………….. 111

Внедрение……………………………………………………………………………………………………………… 111

Смежные паттерны………………………………………………………………………………………………. 113

Паттерн: стек-обертка………………………………………………………………………………………………….. 113

Зачем это нужно…………………………………………………………………………………………………… 114

Последствия………………………………………………………………………………………………………….. 114

Внедрение……………………………………………………………………………………………………………… 115

Смежные паттерны………………………………………………………………………………………………. 116

Паттерн: конвейеризация параметров стека……………………………………………………………… 116

Зачем это нужно…………………………………………………………………………………………………… 117

Применимость………………………………………………………………………………………………………. 117

Последствия………………………………………………………………………………………………………….. 117

Внедрение……………………………………………………………………………………………………………… 118

Смежные паттерны………………………………………………………………………………………………. 119

Паттерн: реестр параметров стека……………………………………………………………………………… 119

Зачем это нужно…………………………………………………………………………………………………… 120

Применимость………………………………………………………………………………………………………. 120

Последствия………………………………………………………………………………………………………….. 120

Внедрение……………………………………………………………………………………………………………… 121

Смежные паттерны………………………………………………………………………………………………. 122

Конфигурационный реестр…………………………………………………………………………………………………….. 122

Внедрение конфигурационного реестра…………………………………………………………………….. 123

Реестры инструмента, предназначенного для автоматизации инфраструктуры 123

Продукты, которые могут послужить конфигурационным реестром
общего назначения………………………………………………………………………………………………. 123

Сервисы реестра, предоставляемые на платформе………………………………………….. 124

Конфигурационные реестры «сделай сам»……………………………………………………….. 124

Один или множество конфигурационных реестров…………………………………………………… 125

Обращение с секретами как с параметрами………………………………………………………………………….. 125

Шифрование секретов………………………………………………………………………………………………….. 126

Несекретная авторизация……………………………………………………………………………………………. 126

Инъекция секретов во время выполнения…………………………………………………………………… 127

Одноразовые секреты…………………………………………………………………………………………………… 127

Заключение………………………………………………………………………………………………………………………………. 128

Глава 8. Ключевая практика: непрерывное тестирование и доставка….. 129

Зачем непрерывно тестировать инфраструктурный код……………………………………………………… 130

Что такое непрерывное тестирование………………………………………………………………………… 130

Что следует тестировать на уровне инфраструктуры………………………………………………. 132

Сложности с тестированием инфраструктурного кода……………………………………………………….. 134

Проблема: тесты для декларативного кода обычно не слишком ценны…………………. 135

Тестирование изменчивого декларативного кода…………………………………………….. 136

Тестирование сочетаний декларативного кода………………………………………………… 137

Проблема: тестирование инфраструктурного кода идет медленно………………………… 137

Проблема: зависимости усложняют тестовую инфраструктуру……………………………… 139

Прогрессивное тестирование………………………………………………………………………………………………….. 140

Тестовая пирамида………………………………………………………………………………………………………. 141

Модель тестирования по принципу швейцарского сыра………………………………………….. 143

Конвейеры доставки для работы с инфраструктурой………………………………………………………….. 144

Этапы работы конвейера…………………………………………………………………………………………….. 145

Масштаб компонентов, тестируемых на этапе…………………………………………………………. 146

Масштаб зависимостей, используемых на этапе конвейера……………………………………. 146

Платформенные элементы, требуемые на этапе конвейера…………………………………….. 147

Программы и сервисы для организации конвейера доставки………………………………….. 148

Тестирование в продакшене…………………………………………………………………………………………………… 150

Что невозможно воспроизвести вне продакшена………………………………………………………. 151

Управление рисками тестирования в продакшене……………………………………………………. 152

Заключение………………………………………………………………………………………………………………………………. 153

Глава 9. Тестирование инфраструктурных стеков……………………………….. 154

Пример инфраструктуры………………………………………………………………………………………………………… 154

Пример стека…………………………………………………………………………………………………………………. 155

Пример стека и конвейер для него………………………………………………………………………………. 156

Офлайновые этапы тестирования стеков………………………………………………………………………………. 156

Проверка синтаксиса……………………………………………………………………………………………………. 157

Офлайновый статический анализ кода………………………………………………………………………. 157

Статический анализ кода с применением API…………………………………………………………… 158

Тестирование с применением имитационного API……………………………………………………. 158

Онлайновые этапы тестирования стеков………………………………………………………………………………. 159

Предпросмотр: проверяем, какие изменения могут быть внесены…………………………… 160

Верификация: выдвижение гипотез об инфраструктурных ресурсах……………………… 161

Результаты: убеждаемся, что инфраструктура работает корректно………………………. 162

Использование тестовых контекстов для обращения с зависимостями……………………………… 163

Тестовые двойники для восходящих зависимостей…………………………………………………… 164

Тестовые контексты для нисходящих зависимостей…………………………………………………. 165

Проводим рефакторинг компонентов так, чтобы их легко было изолировать……….. 167

Паттерны жизненного цикла для тестовых инстансов стеков…………………………………………….. 167

Паттерн: персистентный тестовый стек……………………………………………………………………… 168

Зачем это нужно…………………………………………………………………………………………………… 168

Применимость………………………………………………………………………………………………………. 168

Последствия………………………………………………………………………………………………………….. 168

Внедрение……………………………………………………………………………………………………………… 169

Смежные паттерны………………………………………………………………………………………………. 169

Паттерн: эфемерный тестовый стек……………………………………………………………………………. 169

Зачем это нужно…………………………………………………………………………………………………… 170

Применимость………………………………………………………………………………………………………. 170

Последствия………………………………………………………………………………………………………….. 170

Внедрение……………………………………………………………………………………………………………… 170

Смежные паттерны………………………………………………………………………………………………. 170

Антипаттерн: сдвоенные этапы с персистентными и эфемерными стеками…………… 170

Зачем это нужно…………………………………………………………………………………………………… 171

Применимость………………………………………………………………………………………………………. 171

Последствия………………………………………………………………………………………………………….. 171

Внедрение……………………………………………………………………………………………………………… 171

Смежные паттерны………………………………………………………………………………………………. 172

Паттерн: периодическая пересборка стека……………………………………………………………….. 172

Зачем это нужно…………………………………………………………………………………………………… 172

Применимость………………………………………………………………………………………………………. 172

Последствия………………………………………………………………………………………………………….. 172

Внедрение……………………………………………………………………………………………………………… 173

Смежные паттерны………………………………………………………………………………………………. 173

Паттерн: серийный сброс стека………………………………………………………………………………….. 173

Зачем это нужно…………………………………………………………………………………………………… 174

Применимость………………………………………………………………………………………………………. 174

Последствия………………………………………………………………………………………………………….. 174

Внедрение……………………………………………………………………………………………………………… 174

Смежные паттерны………………………………………………………………………………………………. 174

Оркестрация тестов…………………………………………………………………………………………………………………. 175

Поддержка локального тестирования………………………………………………………………………… 175

Избегайте плотного связывания с инструментами конвейера………………………………….. 176

Инструменты оркестрации тестов………………………………………………………………………………. 176

Заключение………………………………………………………………………………………………………………………………. 177

Часть III. Работа с серверами и другими платформами исполнения приложений…………………………………………………………………………………… 179

Глава 10. Среды выполнения приложений…………………………………………… 181

Исходно облачная инфраструктура под потребности приложений…………………………………… 182

Цели для сред исполнения приложений………………………………………………………………………………… 183

Развертываемые части приложения……………………………………………………………………………. 183

Пакеты для развертывания………………………………………………………………………………………….. 184

Развертывание приложений на серверах………………………………………………………………………………. 185

Упаковка приложений в контейнерах………………………………………………………………………… 185

Развертывание приложений в серверных кластерах………………………………………………… 186

Развертывание приложений в кластерах приложений…………………………………………………………. 187

Пакеты для развертывания приложений в кластерах………………………………………………………….. 188

Развертывание серверного приложения по модели FaaS…………………………………………………….. 190

Данные приложений………………………………………………………………………………………………………………… 190

Структуры и схемы данных………………………………………………………………………………………… 191

Исходно облачная инфраструктура для хранения приложений……………………………… 192

Соединяемость приложений…………………………………………………………………………………………………… 192

Обнаружение сервисов……………………………………………………………………………………………………………. 193

Заключение………………………………………………………………………………………………………………………………. 195

Глава 11. Сборка серверов в коде…………………………………………………………. 196

Что на сервере………………………………………………………………………………………………………………………….. 197

Откуда что берется………………………………………………………………………………………………………………….. 198

Код для конфигурации сервера………………………………………………………………………………………………. 199

Модули кода для конфигурации сервера…………………………………………………………………… 200

Проектирование модулей для конфигурации серверного кода……………………………….. 201

Версионирование и продвижение серверного кода………………………………………………….. 202

Серверные роли……………………………………………………………………………………………………………. 203

Тестирование серверного кода………………………………………………………………………………………………. 204

Прогрессивное тестирование серверного кода………………………………………………………….. 204

Что тестировать в серверном коде………………………………………………………………………………. 205

Как тестировать серверный код………………………………………………………………………………….. 206

Создание нового серверного инстанса………………………………………………………………………………….. 207

Сборка нового серверного инстанса вручную………………………………………………………….. 208

Создаем сервер с помощью скрипта…………………………………………………………………………… 209

Создание сервера с помощью инструмента управления стеком……………………………… 209

Конфигурирование платформы для автоматического создания серверов……………… 210

Как собрать сервер с помощью сетевого инструмента предоставления ресурсов… 211

Заблаговременная сборка серверов………………………………………………………………………………………. 212

Горячее клонирование сервера…………………………………………………………………………………… 212

Использование серверного снимка……………………………………………………………………………… 213

Создание чистого серверного образа…………………………………………………………………………. 213

Конфигурирование нового серверного инстанса…………………………………………………………………. 214

Зажаривание серверного инстанса…………………………………………………………………………….. 215

Выпекание серверных образов……………………………………………………………………………………. 216

Комбинируем выпекание и зажаривание…………………………………………………………………… 216

Применение серверной конфигурации при создании сервера………………………………….. 217

Заключение………………………………………………………………………………………………………………………………. 218

Глава 12. Управление изменениями, поступающими на серверы…………. 219

Паттерны управления изменениями: когда применять изменения………………………………………. 220

Антипаттерн: применять по факту изменений…………………………………………………………… 220

Зачем это нужно…………………………………………………………………………………………………… 220

Применимость………………………………………………………………………………………………………. 221

Последствия………………………………………………………………………………………………………….. 221

Внедрение……………………………………………………………………………………………………………… 221

Смежные паттерны………………………………………………………………………………………………. 221

Паттерн: непрерывная синхронизация конфигурации……………………………………………… 222

Зачем это нужно…………………………………………………………………………………………………… 222

Применимость………………………………………………………………………………………………………. 223

Последствия………………………………………………………………………………………………………….. 223

Внедрение……………………………………………………………………………………………………………… 223

Смежные паттерны………………………………………………………………………………………………. 223

Паттерн: неизменяемый сервер…………………………………………………………………………………… 224

Зачем это нужно…………………………………………………………………………………………………… 224

Применимость………………………………………………………………………………………………………. 224

Последствия………………………………………………………………………………………………………….. 224

Внедрение……………………………………………………………………………………………………………… 225

Смежные паттерны………………………………………………………………………………………………. 225

Как применять код конфигурации сервера……………………………………………………………………………. 226

Паттерн: конфигурация сервера методом push…………………………………………………………. 226

Зачем это нужно…………………………………………………………………………………………………… 226

Применимость………………………………………………………………………………………………………. 226

Последствия………………………………………………………………………………………………………….. 227

Внедрение……………………………………………………………………………………………………………… 227

Смежные паттерны………………………………………………………………………………………………. 228

Паттерн: конфигурация сервера методом pull…………………………………………………………… 228

Зачем это нужно…………………………………………………………………………………………………… 228

Применимость………………………………………………………………………………………………………. 229

Внедрение……………………………………………………………………………………………………………… 229

Смежные паттерны………………………………………………………………………………………………. 230

Другие события серверного жизненного цикла…………………………………………………………………….. 230

Останов и перезапуск серверного инстанса………………………………………………………………. 231

Замена серверного инстанса……………………………………………………………………………………….. 232

Восстановление отказавшего сервера……………………………………………………………………….. 233

Заключение………………………………………………………………………………………………………………………………. 234

Глава 13. Образы серверов как код……………………………………………………… 235

Сборка серверного образа……………………………………………………………………………………………………… 235

Зачем собирать серверный образ……………………………………………………………………………….. 236

Как собрать серверный образ……………………………………………………………………………………… 237

Инструменты для сборки серверных образов……………………………………………………………. 237

Процесс онлайновой сборки образа…………………………………………………………………………… 238

Инфраструктура для сборочного инстанса………………………………………………………. 239

Конфигурирование сборочного инстанса…………………………………………………………. 239

Процесс офлайновой сборки образа…………………………………………………………………………… 241

Исходное содержимое для серверного образа……………………………………………………………………… 242

Сборка на основе стандартного серверного образа…………………………………………………. 243

Сборка серверного образа с нуля……………………………………………………………………………….. 243

Происхождение серверного образа и его содержимое……………………………………………… 243

Изменение серверного образа………………………………………………………………………………………………… 244

Разогреть или испечь свежий?…………………………………………………………………………………….. 244

Версионирование серверного образа…………………………………………………………………………. 245

Обновление серверных инстансов при изменении образа……………………………………….. 247

Предоставление серверного образа для совместного использования несколькими командами              248

Как работать с крупными изменениями, вносимыми в образ…………………………………… 249

Использование конвейера для тестирования и доставки серверного образа…………………….. 250

Стадия сборки серверного образа………………………………………………………………………………. 250

Стадия тестирования серверного образа…………………………………………………………………… 252

Стадии доставки серверного образа………………………………………………………………………….. 253

Использование множества серверных образов…………………………………………………………………….. 253

Серверные образы для разных инфраструктурных платформ………………………………… 254

Серверные образы для разных операционных систем……………………………………………… 254

Серверные образы для разных аппаратных архитектур…………………………………………. 254

Серверные образы для разных ролей…………………………………………………………………………. 255

Многослойное расположение серверных образов……………………………………………………. 255

Совместное использование кода в разных серверных образах……………………………….. 256

Заключение………………………………………………………………………………………………………………………………. 257

Глава 14. Сборка кластеров в коде………………………………………………………. 258

Решения с кластерами приложений……………………………………………………………………………………….. 259

Кластер как услуга………………………………………………………………………………………………………. 259

Распространение кластеров в упакованном виде……………………………………………………… 260

Топологии стеков для кластеров приложений………………………………………………………………………. 261

Монолитный стек, использующий кластер как услугу…………………………………………….. 262

Монолитный стек для упакованного кластерного решения…………………………………….. 263

Конвейер для стека, в котором реализован монолитный кластер приложений……… 264

Пример: множество стеков в одном кластере…………………………………………………………….. 267

Стратегии совместного использования кластеров приложений…………………………………………. 269

Один большой кластер на все случаи жизни……………………………………………………………… 270

Отдельные кластеры для стадий доставки………………………………………………………………… 271

Кластеры для управления……………………………………………………………………………………………. 272

Кластеры для команд…………………………………………………………………………………………………… 273

Сервисная сеть……………………………………………………………………………………………………………… 273

Инфраструктура для бессерверных FaaS-сервисов……………………………………………………………… 275

Заключение………………………………………………………………………………………………………………………………. 277

Часть IV. Проектирование инфраструктуры……………………… 279

Глава 15. Ключевая практика: небольшие простые фрагменты…………… 281

Модульное проектирование…………………………………………………………………………………………………… 281

Характеристики хорошо спроектированных компонентов……………………………………… 282

Правила проектирования компонентов……………………………………………………………………… 283

Избегайте дублирования……………………………………………………………………………………… 283

Правило композиции……………………………………………………………………………………………. 284

Принцип единственной ответственности…………………………………………………………… 284

Проектируйте компоненты на основе концепций предметной области,
а не на основе технических концепций………………………………………………………………. 284

Закон Деметры……………………………………………………………………………………………………… 285

Никаких циклических зависимостей………………………………………………………………….. 285

Используйте тестирование для принятия проектных решений………………………………… 286

Модульная инфраструктура…………………………………………………………………………………………………… 286

Компоненты стека по сравнению со стеками в качестве компонентов…………………… 286

Использование сервера в стеке……………………………………………………………………………………. 288

Проведение границ между компонентами…………………………………………………………………………….. 291

Устанавливайте границы по паттернам естественных изменений………………………….. 292

Устанавливайте границы по жизненным циклам компонентов……………………………….. 292

Устанавливайте границы по организационным структурам…………………………………… 294

Создавайте границы, поддерживающие устойчивость…………………………………………….. 295

Создавайте границы, поддерживающие масштабирование…………………………………….. 295

Устанавливайте границы по проблемам безопасности и управления……………………. 298

Заключение………………………………………………………………………………………………………………………………. 299

Глава 16. Построение стеков из компонентов………………………………………. 300

Языки инфраструктуры для компонентов стека…………………………………………………………………… 301

Повторное использование декларативного кода с модулями………………………………….. 301

Динамическое создание элементов стека с применением библиотек……………………… 302

Паттерны для компонентов стека…………………………………………………………………………………………… 303

Паттерн: фасадный модуль…………………………………………………………………………………………. 303

Зачем это нужно…………………………………………………………………………………………………… 304

Применимость………………………………………………………………………………………………………. 304

Последствия………………………………………………………………………………………………………….. 304

Внедрение……………………………………………………………………………………………………………… 305

Смежные паттерны………………………………………………………………………………………………. 305

Антипаттерн: модуль обфускации……………………………………………………………………………… 305

Зачем это нужно…………………………………………………………………………………………………… 306

Применимость………………………………………………………………………………………………………. 306

Последствия………………………………………………………………………………………………………….. 306

Внедрение……………………………………………………………………………………………………………… 306

Смежные паттерны………………………………………………………………………………………………. 306

Антипаттерн: неразделяемый модуль………………………………………………………………………… 306

Зачем это нужно…………………………………………………………………………………………………… 307

Применимость………………………………………………………………………………………………………. 307

Последствия………………………………………………………………………………………………………….. 307

Внедрение……………………………………………………………………………………………………………… 307

Смежные паттерны………………………………………………………………………………………………. 307

Паттерн: модуль бандла……………………………………………………………………………………………… 308

Зачем это нужно…………………………………………………………………………………………………… 309

Применимость………………………………………………………………………………………………………. 309

Последствия………………………………………………………………………………………………………….. 309

Внедрение……………………………………………………………………………………………………………… 309

Смежные паттерны………………………………………………………………………………………………. 309

Антипаттерн: спагетти-модуль…………………………………………………………………………………… 309

Зачем это нужно…………………………………………………………………………………………………… 311

Последствия………………………………………………………………………………………………………….. 311

Внедрение……………………………………………………………………………………………………………… 311

Смежные паттерны………………………………………………………………………………………………. 312

Паттерн: сущность домена инфраструктуры…………………………………………………………….. 312

Зачем это нужно…………………………………………………………………………………………………… 313

Применимость………………………………………………………………………………………………………. 313

Внедрение……………………………………………………………………………………………………………… 313

Смежные паттерны………………………………………………………………………………………………. 313

Построение уровня абстрагирования……………………………………………………………………………………. 314

Заключение………………………………………………………………………………………………………………………………. 315

Глава 17. Использование стеков в качестве компонентов……………………. 316

Обнаружение зависимостей между стеками…………………………………………………………………………. 316

Паттерн: сопоставление ресурсов………………………………………………………………………………. 317

Зачем это нужно…………………………………………………………………………………………………… 318

Применимость………………………………………………………………………………………………………. 318

Последствия………………………………………………………………………………………………………….. 318

Внедрение……………………………………………………………………………………………………………… 319

Смежные паттерны………………………………………………………………………………………………. 319

Паттерн: поиск данных в стеке……………………………………………………………………………………. 320

Зачем это нужно…………………………………………………………………………………………………… 320

Применимость………………………………………………………………………………………………………. 320

Последствия………………………………………………………………………………………………………….. 321

Внедрение……………………………………………………………………………………………………………… 321

Смежные паттерны………………………………………………………………………………………………. 322

Паттерн: поиск по реестру интеграции………………………………………………………………………. 322

Зачем это нужно…………………………………………………………………………………………………… 323

Применимость………………………………………………………………………………………………………. 324

Последствия………………………………………………………………………………………………………….. 324

Внедрение……………………………………………………………………………………………………………… 324

Смежные паттерны………………………………………………………………………………………………. 325

Внедрение зависимости……………………………………………………………………………………………….. 325

Проблемы со смешиванием зависимости и кода определения………………………… 326

Отделение зависимостей от их обнаружения……………………………………………………. 326

Заключение………………………………………………………………………………………………………………………………. 328

Часть V. Доставка инфраструктуры……………………………………… 329

Глава 18. Организация кода инфраструктуры……………………………………… 331

Организация проектов и репозиториев………………………………………………………………………………….. 331

Один репозиторий или много?…………………………………………………………………………………….. 332

Один репозиторий для всего………………………………………………………………………………………… 332

Один репозиторий, несколько сборок………………………………………………………………… 333

Отдельный репозиторий для каждого проекта (микрорепозиторий)………………………. 334

Несколько репозиториев с несколькими проектами………………………………………………….. 335

Организация различных типов кода………………………………………………………………………………………. 336

Файлы поддержки проекта………………………………………………………………………………………….. 336

Межпроектные тесты…………………………………………………………………………………………………… 337

Хранение интеграционных тестов в проекте…………………………………………………….. 338

Отдельные проекты интеграционных тестов…………………………………………………………….. 338

Организация кода по концепции предметной области……………………………………………… 339

Организация файлов конфигурационных значений………………………………………………….. 340

Управление инфраструктурным кодом и кодом приложения……………………………………………… 341

Доставка инфраструктуры и приложений…………………………………………………………………. 341

Тестирование приложений с инфраструктурой………………………………………………………… 342

Тестирование инфраструктуры перед интеграцией………………………………………………….. 343

Использование инфраструктурного кода для развертывания приложений……………. 344

Заключение………………………………………………………………………………………………………………………………. 346

Глава 19. Доставка инфраструктурного кода……………………………………….. 347

Доставка инфраструктурного кода……………………………………………………………………………………….. 347

Сборка инфраструктурного проекта………………………………………………………………………….. 348

Инфраструктурный код упаковки как артефакт………………………………………………………… 349

Использование репозитория для доставки инфраструктурного кода……………………… 349

Специализированный репозиторий артефактов……………………………………………….. 350

Репозиторий инструмента…………………………………………………………………………………… 350

Общий репозиторий для хранения файлов………………………………………………………… 351

Доставка кода из репозитория исходного кода………………………………………………… 351

Интеграция проектов……………………………………………………………………………………………………………….. 351

Паттерн: интеграция проекта во время сборки………………………………………………………….. 353

Зачем это нужно…………………………………………………………………………………………………… 353

Применимость………………………………………………………………………………………………………. 354

Последствия………………………………………………………………………………………………………….. 354

Внедрение……………………………………………………………………………………………………………… 354

Смежные паттерны………………………………………………………………………………………………. 355

Паттерн: интеграция проекта во время доставки………………………………………………………. 355

Зачем это нужно…………………………………………………………………………………………………… 356

Применимость………………………………………………………………………………………………………. 357

Последствия………………………………………………………………………………………………………….. 357

Внедрение……………………………………………………………………………………………………………… 357

Смежные паттерны………………………………………………………………………………………………. 358

Паттерн: интеграция проекта во время применения…………………………………………………. 358

Зачем это нужно…………………………………………………………………………………………………… 359

Применимость………………………………………………………………………………………………………. 359

Последствия………………………………………………………………………………………………………….. 359

Внедрение……………………………………………………………………………………………………………… 359

Смежные паттерны………………………………………………………………………………………………. 360

Использование скриптов для обертывания инструментов инфраструктуры…………………….. 361

Сборка значений конфигурации…………………………………………………………………………………. 361

Упрощение скриптов-оболочек…………………………………………………………………………………… 362

Заключение………………………………………………………………………………………………………………………………. 363

Глава 20. Командные рабочие процессы………………………………………………. 364

Люди…………………………………………………………………………………………………………………………………………. 365

Кто пишет инфраструктурный код?………………………………………………………………………………………. 367

Применение кода к инфраструктуре………………………………………………………………………………………. 369

Применение кода с вашей локальной рабочей станции…………………………………………… 369

Применение кода из централизованной службы……………………………………………………….. 370

Персональные инфраструктурные инстансы…………………………………………………………….. 371

Ветви исходного кода в рабочих процессах……………………………………………………………… 373

Предотвращение конфигурационной энтропии……………………………………………………………………. 374

Сведите к минимуму задержку автоматизации…………………………………………………………. 374

Избегайте непродуманного применения изменений………………………………………………….. 375

Применяйте код непрерывно……………………………………………………………………………………….. 375

Неизменяемая инфраструктура…………………………………………………………………………………… 375

Управление в конвейерно-ориентированном потоке задач…………………………………………………. 376

Перетасовка обязанностей………………………………………………………………………………………….. 377

Сдвиг влево……………………………………………………………………………………………………………………. 378

Пример процесса для инфраструктуры как кода с управлением…………………………….. 378

Заключение………………………………………………………………………………………………………………………………. 379

Глава 21. Безопасное изменение инфраструктуры……………………………….. 380

Уменьшите объем изменений………………………………………………………………………………………………….. 380

Небольшие изменения………………………………………………………………………………………………….. 382

Пример рефакторинга………………………………………………………………………………………………….. 384

Отправка неполных изменений в продакшен………………………………………………………………………… 385

Параллельные инстансы……………………………………………………………………………………………… 386

Обратно совместимые преобразования……………………………………………………………………… 389

Переключатели функций……………………………………………………………………………………………… 390

Изменение действующей инфраструктуры……………………………………………………………………………. 392

Инфраструктурная хирургия………………………………………………………………………………………. 394

Расширение и сжатие…………………………………………………………………………………………………… 396

Изменения нулевого времени простоя………………………………………………………………………… 399

Сине-зеленые изменения……………………………………………………………………………………… 400

Преемственность……………………………………………………………………………………………………………………… 400

Преемственность за счет предотвращения ошибок…………………………………………………… 401

Непрерывность за счет быстрого восстановления……………………………………………………. 402

Непрерывное аварийное восстановление………………………………………………………………….. 403

Хаос-инжиниринг…………………………………………………………………………………………………………. 404

Планирование неудач………………………………………………………………………………………………….. 404

Непрерывность данных в меняющейся системе……………………………………………………………………. 406

Блокировка……………………………………………………………………………………………………………………. 407

Разделение…………………………………………………………………………………………………………………….. 407

Репликация……………………………………………………………………………………………………………………. 407

Перезагрузка…………………………………………………………………………………………………………………. 407

Смешение подходов к обеспечению непрерывности данных………………………………….. 408

Заключение………………………………………………………………………………………………………………………………. 408

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

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

Kief Morris

Киф Моррис (Kief Morris) – директор по облачной инженерии в компании ThoughtWorks, помогает организациям развивать облачную и внутрикорпоративную IT-инфраструктуру. Более 20 лет занимается проектированием, выстраиванием и эксплуатацией автоматизированной серверной инфраструктуры. На заре карьеры занимался сценариями командной строки и языком Perl, а затем осваивал CFengine, Puppet, Chef, Terraform и многие другие технологии, как только они появлялись.

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

Удивительная книга для детей: “Мама, не отвлекай. Я Python учу!”

Мама, не отвлекай. Я Python учу!

Эта книга + телефон – все, что нужно ребенку, чтобы полностью самостоятельно без помощи взрослых освоить основы программирования на языке Python, написать десятки игр, интерактивных программ и поделиться ими в любых привычных мессенджерах и соцсетях.
Книгу отличает сверхбыстрый старт, удобство обучения, легкость изложения и авторский юмор, .
При этом новички узнают о командах, циклах, типах данных, переменных, условных выражениях, графических примитивах и координатах. Освоят игры и анимацию, работу со строками, комментарии, методы (функции), операторы сравнения, случайные числа, условные выражения и многое другое. Электронный архив на сайте издательства содержит коды примеров и изображения эмодзи.

Для детей младшего и среднего школьного возраста

Читать и программировать можно весело и непринужденно

Телефон есть практически у каждого ребенка 10+ лет. Осталось только купить эту книгу, чтобы ребенок полностью самостоятельно смог изучить основы самого популярного языка программирования Python.

Читать и программировать можно весело и непринужденно: сидя на диване, на даче у бабушки, на прогулке или на переменках в школе – в одной руке телефон, в другой эта книга.

Первую программу на Python можно выполнить за пару минут, еще даже не открыв книгу, а только считав телефоном QR-код с ее обложки!

Прочитав всю книгу, ребенок

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

Книгу “Мама, не отвлекай. Я Python учу!” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Лазаревский Игорь Вадимович

Лазаревский Игорь Вадимович – программист, автор книг и курсов, преподаватель Американского университета в Центральной Азии, основатель онлайн-школы по программированию Khasang со стажем преподавания современных языков программирования более 10 лет, вырастивший десятки высококлассных Senior-разработчиков с полного нуля. Ведет личный блог igor.kg.

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

Изучаем программирование на Kotlin для Android

Программирование на Kotlin для Android

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

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

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

Авторы приводят реализацию наиболее распространенных задач в нативной разработке для Android и показывают, как Kotlin помогает решить проблему параллелизма. Делая акцент на структурированном параллелизме, новой парадигме асинхронного программирования, книга помогает освоить одну из самых мощных конструкций Kotlin — сопрограммы.

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

Книгу “Программирование на Kotlin для Android” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Об авторах. 11

Предисловие. 13

Кому адресована эта книга. 14

Почему мы написали эту книгу. 15

Как организована эта книга. 15

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

Примеры кода. 17

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

ГЛАВА 1. Основы языка Kotlin. 19

Система типов Kotlin. 20

Примитивные типы. 20

Null-безопасность. 21

Тип Unit 23

Функциональные типы. 24

Обобщенные типы. 25

Переменные и функции. 25

Переменные. 26

Лямбда-выражения. 26

Функции-расширения. 27

Классы. 29

Инициализация класса. 29

Свойства. 31

Модификатор lateinit 32

Свойства с отложенной инициализацией. 34

Делегаты. 35

Объекты-компаньоны. 36

Классы данных. 37

Классы перечислений. 38

Запечатанные классы. 40

Модификаторы видимости. 41

Резюме. 42

ГЛАВА 2. Фреймворк коллекций Kotlin. 45

Основные понятия. 45

Совместимость с Java. 46

Изменяемость. 46

Перегруженные операторы. 48

Создание контейнеров. 49

Функциональное программирование. 50

Сравнение функционального и процедурного программирования:
простой пример. 50

Функциональное программирование в Android. 51

Функции-преобразователи. 52

Булевы функции. 52

Фильтры. 53

Функция map. 53

Функция flatMap. 55

Группировка. 56

Сравнение итераторов и последовательностей. 57

Пример. 59

Проблема. 59

Реализация. 60

Резюме. 66

ГЛАВА 3. Основы Android. 67

Стек Android. 67

Аппаратное обеспечение. 67

Ядро. 68

Системные службы. 68

Среда выполнения Android. 69

Приложения. 69

Прикладное окружение Android. 69

Намерения и фильтры намерений. 70

Контекст. 73

Компоненты приложения Android: строительные блоки. 75

Компонент Activity и его друзья. 76

Службы. 80

Провайдеры контента. 85

BroadcastReceiver 86

Архитектуры приложений Android. 88

MVC: основы. 88

Виджеты. 89

Локальная модель. 89

Паттерны Android. 90

Model-View-Intent 90

Model-View-Presenter 90

Model-View-ViewModel 91

Резюме. 92

ГЛАВА 4. Параллельное программирование в Android. 94

Потокобезопасность. 95

Атомарность. 95

Видимость. 96

Модель многопоточного выполнения Android. 97

Пропуск кадров. 98

Утечка памяти. 101

Инструменты для управления потоками. 103

Looper/Handler 104

Исполнители Executors и объекты ExecutorService. 106

Инструменты для управления заданиями. 107

JobScheduler 109

WorkManager 111

Резюме. 112

ГЛАВА 5. Потокобезопасность. 113

Пример проблемы, связанной с потокобезопасностью.. 113

Инварианты. 115

Мьютексы. 116

Потокобезопасные коллекции. 116

Привязка к потоку. 119

Конфликт потоков. 120

Сравнение блокирующего и неблокирующего вызовов. 121

Очереди работ. 122

Противодавление. 123

Резюме. 125

ГЛАВА 6. Организация параллелизма с использованием обратных вызовов. 127

Пример: функция обработки покупок. 128

Создание приложения. 130

Компонент ViewModel 130

Представление. 131

Реализация логики. 135

Обсуждение. 136

Ограничения модели многопоточного выполнения. 138

Резюме. 139

ГЛАВА 7. Сопрограммы.. 141

Что такое сопрограмма?. 141

Наша первая сопрограмма. 142

Функция async. 144

Краткий обзор структурированного параллелизма. 146

Связь “родитель — потомок” в структурированном параллелизме. 148

CoroutineScope и CoroutineContext 150

Функции, поддерживающие возможность приостановки. 155

Функции, поддерживающие возможность приостановки, “под капотом”. 156

Использование сопрограмм и функций, поддерживающих возможность
приостановки: практический пример. 160

Не ошибитесь с модификатором suspend. 163

Резюме. 164

ГЛАВА 8. Структурированный параллелизм и сопрограммы.. 166

Функции, поддерживающие возможность приостановки. 166

Настройка места действия. 167

Традиционный подход с использованием java.util.concurrent.ExecutorService. 168

Вспомним, что такое HandlerThread. 172

Использование приостанавливаемых функций и сопрограмм. 175

Сравнение приостанавливаемых и традиционной многопоточности: итоги. 179

Отмена. 179

Жизненный цикл сопрограмм. 180

Отмена сопрограммы. 182

Отмена задачи, делегированной сторонней библиотеке. 184

Сопрограммы, которые действуют согласованно, чтобы их можно было отменить. 188

Функцию delay() можно отменить. 190

Обработка отмены. 191

Причины отмены. 192

Супервизия. 195

Функция supervisorScope. 197

Параллельная декомпозиция. 197

Автоматическая отмена. 199

Обработка исключений. 199

Необработанные и открытые исключения. 199

Открытые исключения. 201

Необработанные исключения. 204

Резюме. 207

Размышления напоследок. 208

ГЛАВА 9. Каналы.. 209

Обзор каналов. 209

Рандеву-канал. 211

Неограниченный канал. 215

Объединенный канал. 216

Буферизованный канал. 217

Функция produce. 218

Взаимодействующие последовательные процессы. 219

Модель и архитектура. 219

Первая реализация. 220

Выражение select 225

Собираем все воедино. 227

Мультиплексор и демультиплексор. 228

Проверка производительности. 229

Противодавление. 231

Сходства с моделью акторов. 232

Последовательное выполнение внутри процесса. 232

Размышления напоследок. 233

Взаимоблокировки в CSP. 233

Каналы и взаимоблокировки. 236

Ограничения каналов. 236

“Горячие” каналы. 238

Резюме. 239

ГЛАВА 10. Потоки. 241

Введение в потоки. 241

Более реалистичный пример. 242

Операторы. 244

Терминальные операторы. 245

Примеры использования холодного потока. 246

Вариант 1: интерфейс с API на базе функции обратного вызова. 246

Вариант 2: параллельное преобразование потока значений. 251

Вариант 3: создание собственного оператора. 253

Обработка ошибок. 257

Блок try/catch. 257

Разделение ответственности важно. 260

Нарушение прозрачности исключения. 260

Оператор catch. 261

Материализация исключений. 264

Горячие потоки и SharedFlow. 267

Создаем SharedFlow. 268

Регистрируем подписчика. 268

Отправляем значения в SharedFlow. 269

Использование SharedFlow для потоковой передачи данных. 269

Использование SharedFlow в качестве шины событий. 275

StateFlow: специализированная версия SharedFlow. 276

Пример использования StateFlow. 277

Резюме. 279

ГЛАВА 11. Вопросы производительности и инструменты
профилирования Android. 280

Android Profiler 282

Network Profiler 285

CPU Profiler 291

Energy Profiler 301

Memory Profiler 303

Обнаружение утечек памяти с помощью LeakCanary. 308

Резюме. 312

ГЛАВА 12. Снижение потребления ресурсов за счет оптимизации производительности  314

Достижение плоской иерархии представлений с помощью ConstraintLayout 315

Сокращение количества операций рисования с помощью экземпляров
класса Drawable. 319

Минимизация данных в сетевых вызовах. 324

Организация пула и кэширование объектов Bitmap. 324

Избавляемся от ненужной работы. 326

Использование статических функций. 329

Минификация и обфускация с R8 и ProGuard. 329

Резюме. 331

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

Нет фото

Майк Данн (Mike Dunn) работал ведущим инженером по мобильным технологиям в издательстве O’Reilly Media.Один из авторов книги «Нативная разработка мобильных приложений. Перекрестный справочник для iOS и Android».

 

 

Лоранс Пьер-Оливье

Пьер-Оливье Лоранс (Pierre-Olivier Laurence) — ведущий инженер-программист компании Safran Aircraft Engines, со штаб-квартирой в окрестностях Парижа.

 

 

G.Blake_Meike

Дж. Блейк Мик (G. Blake Meike) — старший инженер-программист компании Couchbase и автор нескольких книг, среди которых «Программирование под Android».

 

 

Amanda Hinchman-Dominguez

Аманда Хинчман-Домингес (Amanda Hinchman-Dominguez) — эксперт по языку Kotlin в программе Google Developer Expert. Работает разработчиком для Android в компании Groupon и является активным участником глобального сообщества Kotlin.

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

Новая книга: “Python, Django и Bootstrap для начинающих”

Python, Django и Bootstrap для начинающих

Книга посвящена вопросам разработки веб-приложений с использованием языка Python, фреймворков Django, Bootstrap и интерактивной среды разработки PyCharm. Рассмотрены основные технологии и рабочие инструменты создания веб-приложений. Описаны фреймворки Django, Bootsrtap и структура создаваемых веб-приложений. На простых примерах показана обработка и маршрутизация запросов пользователей, формирование ответных веб-страниц. Рассмотрено создание шаблонов веб-страниц и форм для пользователей. Показано взаимодействие пользователей с различными типами баз данных через модели. Описана работа с базами данных через встроенные в Django классы без использования SQL-запросов. Приведен пошаговый пример создания сайта от его проектирования, до формирования программных модулей и развертывания сайта в Интернете с базами данных SQLite и MySQL. Электронный архив на сайте издательства содержит коды всех примеров.

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

ОСВАИВАЕМ СОВРЕМЕННЫЙ И УДОБНЫЙ ИНСТРУМЕНТАРИЙ ДЛЯ СОЗДАНИЯ ВЕБ-ПРИЛОЖЕНИЙ

• Веб-технологии
• Инструментальные средства для разработки веб-приложений
• Знакомство с фреймворком Django
• Знакомство с фреймворком Bootstrap
• Интерактивная среда разработки PyCharm
• Обработка и маршрутизация запросов
• Шаблоны веб-страниц
• Формы и модели данных
• Веб-сайт и веб-интерфейс для пользователей
• Встроенная панель для администрирования сайта
• Пользовательские формы
• Публикация сайта в Интернете

Книгу “Python, Django и Bootstrap для начинающих” можно купить со скидкой в интернет-магазине издательства “БХВ“.

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

Глава 1. Инструментальные средства для разработки веб-приложений…. 15

1.1. Интерпретатор Python………………………………………………………………………………………………………… 16

1.1.1. Установка Python в Windows…………………………………………………………………………………… 17

1.1.2. Установка Python в Linux………………………………………………………………………………………… 20

1.1.3. Проверка интерпретатора Python…………………………………………………………………………… 20

1.2. Интерактивная среда разработки программного кода PyCharm…………………………………… 21

1.2.1. Установка PyCharm в Windows……………………………………………………………………………….. 22

1.2.2. Установка PyCharm в Linux…………………………………………………………………………………….. 24

1.2.3. Проверка PyCharm……………………………………………………………………………………………………. 25

1.3. Установка пакетов в Python с использованием менеджера пакетов pip………………………… 28

1.3.1. Репозиторий пакетов программных средств PyPI…………………………………………………. 28

1.3.2. pip — менеджер пакетов в Python……………………………………………………………………………. 29

1.3.3. Использование менеджера пакетов pip…………………………………………………………………… 30

1.4. Фреймворк Django для разработки веб-приложений………………………………………………………. 31

1.5. Менеджер баз данных SQLiteStudio………………………………………………………………………………….. 35

1.6. Краткие итоги……………………………………………………………………………………………………………………… 37

Глава 2. Веб-технологии и базовые сведения об HTML………………………….. 39

2.1. Базовые сведения о веб-технологиях………………………………………………………………………………… 39

2.1.1. Технологии клиентского программирования…………………………………………………………. 41

2.1.2. Технологии серверного программирования…………………………………………………………… 42

2.1.3. Фреймворки Django и Bootstrap для разработки веб-приложений………………………. 43

2.2. Базовые сведения о HTML…………………………………………………………………………………………………. 45

2.2.1. Теги для представления текста на HTML-страницах…………………………………………… 47

2.2.2. Списки……………………………………………………………………………………………………………………….. 49

2.2.3. Таблицы…………………………………………………………………………………………………………………….. 51

2.2.4. Тег div………………………………………………………………………………………………………………………… 55

2.2.5. Гиперссылки……………………………………………………………………………………………………………… 56

2.3. Каскадные таблицы стилей (CSS)……………………………………………………………………………………… 56

2.4. Возможности использования JavaScript……………………………………………………………………………. 58

2.5. Краткие итоги……………………………………………………………………………………………………………………… 60

Глава 3. Макетирование HTML-страниц с фреймворком Bootstrap……….. 61

3.1. Технологические возможности фреймворка Bootstrap……………………………………………………. 61

3.2. Получение файлов фреймворка Bootstrap………………………………………………………………………… 63

3.3. Контейнеры и сетка Bootstrap……………………………………………………………………………………………. 66

3.3.1. Адаптивные контейнеры………………………………………………………………………………………….. 67

3.3.2. Ряды или строки (row)………………………………………………………………………………………………. 69

3.3.3. Адаптивные блоки (col)……………………………………………………………………………………………. 69

3.3.4. Адаптивные блоки без указания числа колонок……………………………………………………. 71

3.3.5. Расположение адаптивных блоков…………………………………………………………………………. 71

3.4. Верстка макета HTML-страниц………………………………………………………………………………………… 72

3.5. Подключение файлов фреймворка Bootstrap к проекту………………………………………………….. 75

3.6. Задание цвета элементам HTML-страниц……………………………………………………………………….. 77

3.7. Задание отступов элементам макета HTML-страниц…………………………………………………….. 80

3.8. Выравнивание содержимого в адаптивных блоках HTML-страниц……………………………… 84

3.9. Обозначение границ элементов макета HTML-страниц…………………………………………………. 86

3.10. Пример использования адаптивных контейнеров…………………………………………………………. 93

3.11. Таблицы Bootstrap……………………………………………………………………………………………………………. 97

3.12. Краткие итоги………………………………………………………………………………………………………………….. 102

Глава 4. Знакомимся с фреймворком Django………………………………………… 103

4.1. Общие представления о Django……………………………………………………………………………………….. 103

4.2. Структура приложений на Django………………………………………………………………………………….. 105

4.3. Первый проект на Django…………………………………………………………………………………………………. 107

4.4. Первое приложение на Django…………………………………………………………………………………………. 115

4.5. Краткие итоги……………………………………………………………………………………………………………………. 121

Глава 5. Представления и маршрутизация…………………………………………… 123

5.1. Обработка запросов пользователей……………………………………………………………………………….. 123

5.2. Маршрутизация запросов пользователей в функциях path и re_path…………………………. 126

5.3. Очередность маршрутов………………………………………………………………………………………………….. 129

5.4. Основные элементы синтаксиса регулярных выражений…………………………………………….. 129

5.5. Параметры представлений………………………………………………………………………………………………. 130

5.5.1. Определение параметров через функцию re_path()…………………………………………….. 130

5.5.2. Определение параметров через функцию path()………………………………………………….. 134

5.5.3. Определение параметров по умолчанию в функции path()………………………………… 136

5.6. Параметры строки запроса пользователя………………………………………………………………………. 137

5.7. Переадресация и отправка пользователю статусных кодов………………………………………… 140

5.7.1. Переадресация………………………………………………………………………………………………………… 140

5.7.2. Отправка пользователю статусных кодов…………………………………………………………… 142

5.8. Краткие итоги……………………………………………………………………………………………………………………. 144

Глава 6. Шаблоны в Django…………………………………………………………………. 145

6.1. Создание простейшего шаблона…………………………………………………………………………………….. 145

6.2. Создание каталога для шаблонов приложений…………………………………………………………….. 152

6.3. Класс TemplateResponse…………………………………………………………………………………………………… 155

6.4. Язык шаблонов (DTL)……………………………………………………………………………………………………….. 156

6.5. Передача данных в шаблоны через переменные…………………………………………………………… 158

6.6. Передача в шаблон сложных данных……………………………………………………………………………. 161

6.7. Использование тегов в шаблонах Django……………………………………………………………………….. 163

6.8. Статические файлы в шаблонах Django…………………………………………………………………………. 172

6.8.1. Основы каскадных таблиц стилей………………………………………………………………………… 172

6.8.2. Использование статических файлов в шаблонах Django…………………………………… 176

6.9. Использование класса TemplateView для вызова шаблонов HTML-страниц……………… 182

6.10. Наследование шаблонов……………………………………………………………………………………………….. 187

6.11. Создание многостраничного сайта на основе шаблонов Django………………………………. 190

6.12. Формирование URL-адресов в шаблонах Django……………………………………………………….. 197

6.13. Интеграция шаблонов Django с фреймворком Bootstrap…………………………………………….. 200

6.14. Использование специальных тегов в шаблонах Django……………………………………………… 203

6.14.1. Тег для вывода текущей даты и времени……………………………………………………………. 203

6.14.2. Теги Bootstrap для вывода информации в адаптивных блоках……………………….. 205

6.14.3. Теги Bootstrap и Django для представления списков в виде таблицы……………… 207

6.15. Краткие итоги………………………………………………………………………………………………………………….. 209

Глава 7. Формы……………………………………………………………………………………. 211

7.1. Процесс управления формами в Django………………………………………………………………………….. 211

7.2. Определение форм…………………………………………………………………………………………………………….. 214

7.3. Использование полей в формах Django………………………………………………………………………….. 220

7.3.1. Настройка среды для изучения полей разных типов………………………………………….. 220

7.3.2. Типы полей в формах Django и их общие параметры…………………………………………. 222

7.3.3. Поле BooleanField для выбора решения: да/нет…………………………………………………. 225

7.3.4. Поле CharField для ввода текста………………………………………………………………………….. 226

7.3.5. Поле ChoiceField для выбора данных из списка…………………………………………………. 228

7.3.6. Поле DateField для ввода даты……………………………………………………………………………… 229

7.3.7. Поле DateTimeField для ввода даты и времени……………………………………………………. 230

7.3.8. Поле DecimalField для ввода десятичных чисел…………………………………………………. 230

7.3.9. Поле DurationField для ввода промежутка времени…………………………………………… 232

7.3.10. Поле EmailField для ввода электронного адреса………………………………………………. 233

7.3.11. Поле FileField для выбора файлов……………………………………………………………………… 234

7.3.12. Поле FilePathField для создания списка файлов………………………………………………. 235

7.3.13. Поле FloatField для ввода чисел с плавающей точкой…………………………………….. 238

7.3.14. Поле GenericIPAddressField для ввода IP-адреса……………………………………………… 238

7.3.15. Поле ImageField для выбора файлов изображений…………………………………………… 239

7.3.16. Поле IntegerField для ввода целых чисел…………………………………………………………… 240

7.3.17. Поле JsonField для данных формата JSON………………………………………………………… 241

7.3.18. Поле MultipleChoiceField для выбора данных из списка…………………………………. 243

7.3.19. Поле NullBooleanField для выбора решения: да/нет………………………………………… 244

7.3.20. Поле RegexField для ввода текста………………………………………………………………………. 245

7.3.21. Поле SlugField для ввода текста…………………………………………………………………………. 246

7.3.22. Поле TimeField для ввода времени……………………………………………………………………… 246

7.3.23. Поле TypedChoiceField для выбора данных из списка……………………………………… 247

7.3.24. Поле TypedMultipleChoiceField для выбора данных из списка……………………….. 248

7.3.25. Поле URLField для ввода универсального указателя ресурса (URL)……………… 250

7.3.26. Поле UUIDField для ввода универсального уникального идентификатора UUID 251

7.4. Встроенные классы для создания сложных полей………………………………………………………… 252

7.4.1. Поле ComboField для ввода текста с проверкой соответствия заданным форматам……….. 252

7.4.2. Поле MultiValueField для создания сложных компоновок из нескольких полей 253

7.4.3. Поле SplitDateTimeField для раздельного ввода даты и времени………………………. 254

7.5. Настройка формы и ее полей…………………………………………………………………………………………… 255

7.5.1. Изменение внешнего вида поля с помощью параметра widget………………………….. 255

7.5.2. Задание начальных значений полей с помощью свойства initial……………………… 257

7.5.3. Задание порядка следования полей на форме…………………………………………………….. 258

7.5.4. Задание подсказок к полям формы……………………………………………………………………….. 259

7.5.5. Настройки вида формы………………………………………………………………………………………….. 260

7.5.6. Проверка (валидация) данных………………………………………………………………………………. 262

7.5.7. Детальная настройка полей формы……………………………………………………………………… 267

7.5.8. Присвоение стилей полям формы………………………………………………………………………….. 270

7.6. Использование в формах POST-запросов для отправки данных на сервер…………………. 275

7.7. Краткие итоги……………………………………………………………………………………………………………………. 278

Глава 8. Модели данных Django…………………………………………………………… 279

8.1. Создание моделей и миграции базы данных………………………………………………………………….. 280

8.2. Типы полей в модели данных Django……………………………………………………………………………… 284

8.3. Манипуляция с данными в Django на основе CRUD……………………………………………………… 287

8.3.1. Добавление данных в БД……………………………………………………………………………………….. 287

8.3.2. Чтение данных из БД……………………………………………………………………………………………… 288

Метод get()……………………………………………………………………………………………………………… 288

Метод get_or_create()……………………………………………………………………………………………. 288

Метод all()………………………………………………………………………………………………………………. 289

Метод count()………………………………………………………………………………………………………….. 289

Метод filter()…………………………………………………………………………………………………………… 289

Метод exclude()………………………………………………………………………………………………………. 289

Метод in_bulk()………………………………………………………………………………………………………. 289

8.3.3. Обновление данных в БД……………………………………………………………………………………….. 290

8.3.4. Удаление данных из БД…………………………………………………………………………………………. 291

8.3.5. Просмотр строки SQL-запроса к базе данных…………………………………………………….. 291

8.4. Общие принципы взаимодействия форм с моделями данных и шаблонами Django…… 292

8.4.1. Создание форм на основе классов Form и ModelForm………………………………………… 293

8.4.2. Связывание форм с представлениями (view)………………………………………………………… 294

8.4.3. Связывание представлений (view) с шаблонами форм……………………………………….. 295

8.5. Организация связей между таблицами в БД через модели данных……………………………… 296

8.5.1. Организация связей между таблицами «один ко многим»………………………………….. 296

8.5.2. Организация связей между таблицами «многие ко многим»………………………………. 301

8.5.3. Организация связей между таблицами «один к одному»……………………………………. 305

8.6. Пример работы с объектами модели данных (чтение и запись информации в БД)……. 308

8.7. Пример работы с объектами модели данных: редактирование и удаление информации из БД   315

8.8. Работа с изображениями и файлами в формах Django………………………………………………….. 321

8.8.1. Загрузка изображений……………………………………………………………………………………………. 321

8.8.2. Загрузка и отображение файлов PDF в формах Django………………………………………. 332

8.8.3. Загрузка и отображение видеофайлов в формах Django……………………………………. 339

8.8.4. Загрузка и озвучивание аудиофайлов в формах Django…………………………………….. 348

8.9. Краткие итоги……………………………………………………………………………………………………………………. 356

Глава 9. Пример создания веб-сайта на Django…………………………………….. 357

9.1. Создание структуры сайта при помощи Django……………………………………………………………. 357

9.2. Установка дополнительных пакетов и настройка параметров сайта «Мир книг»…….. 366

9.3. Разработка структуры моделей данных сайта «Мир книг»………………………………………….. 370

9.4. Основные элементы моделей данных в Django……………………………………………………………… 373

9.4.1. Поля и их аргументы в моделях данных………………………………………………………………. 373

9.4.2. Метаданные в моделях Django……………………………………………………………………………… 376

9.4.3. Методы в моделях Django……………………………………………………………………………………… 377

9.4.4. Методы работы с данными в моделях Django…………………………………………………….. 377

9.5. Формирование моделей данных для сайта «Мир книг»………………………………………………… 379

9.5.1. Модель для хранения жанров книг……………………………………………………………………….. 380

9.5.2. Модель для хранения языков книг………………………………………………………………………… 381

9.5.3. Модель для хранения наименования издательства…………………………………………….. 381

9.5.4. Модель для хранения авторов книг………………………………………………………………………. 382

9.5.5. Модель для хранения книг…………………………………………………………………………………….. 382

9.5.6. Модель для хранения отдельных экземпляров книг и их статуса……………………… 387

9.6. Административная панель Django Admin………………………………………………………………………. 391

9.6.1. Регистрация моделей данных в Django Admin…………………………………………………….. 391

9.6.2. Работа с данными в Django Admin……………………………………………………………………….. 392

9.7. Изменение конфигурации административной панели Django………………………………………. 402

9.7.1. Регистрация класса ModelAdmin…………………………………………………………………………… 403

9.7.2. Настройка отображения списков………………………………………………………………………….. 404

9.7.3. Добавление фильтров к спискам…………………………………………………………………………… 407

9.7.4. Формирование макета с подробным представлением элемента списка…………… 409

9.7.5. Разделение страницы на секции с отображением связанной информации……….. 411

9.7.6. Встроенное редактирование связанных записей………………………………………………… 412

9.8. Работа с файлами и изображениями в административной панели Django…………………. 416

9.9. Краткие итоги……………………………………………………………………………………………………………………. 422

Глава 10. Пример создания веб-интерфейса для пользователей сайта
«Мир книг»………………………………………………………………………………………….. 423

10.1. Последовательность создания пользовательских страниц сайта «Мир книг»…………. 423

10.2. Определение перечня и URL-адресов страниц сайта «Мир книг»……………………………… 424

10.3. Создание главной страницы сайта «Мир книг»…………………………………………………………… 425

10.3.1. Создание URL-преобразования………………………………………………………………………… 425

10.3.2. Создание упрощенного представления (view)…………………………………………………. 427

10.3.3. Изменение представления (view) главной страницы сайта…………………………….. 432

10.3.4. Модификация шаблона главной страницы сайта «Мир книг»………………………. 433

10.4. Создание страницы со списком книг на основе класса ListView………………………………… 438

10.5. Создание страницы с детальной информацией о книге на основе класса DetailView 443

10.6. Постраничный вывод большого числа записей из БД (класс Paginator)………………….. 448

10.7. Создание страницы со списком авторов на основе класса ListView………………………….. 453

10.8. Создание страницы с детальной информацией об авторе книги на основе
класса DetailView……………………………………………………………………………………………………………. 456

10.9. Создание страниц О компании и Контакты…………………………………………………………………. 460

10.10. Краткие итоги……………………………………………………………………………………………………………….. 468

Глава 11. Расширение возможностей администрирования сайта
«Мир книг» и создание пользовательских форм…………………………………… 469

11.1. Сессии в Django………………………………………………………………………………………………………………. 470

11.2. Аутентификация и авторизация пользователей в Django……………………………………………. 474

11.2.1. Немного об аутентификации пользователей в Django……………………………………. 474

11.2.2. Создание отдельных пользователей и групп пользователей…………………………. 475

11.2.3. Создание страницы регистрации пользователя при входе на сайт………………. 481

11.2.4. Создание страницы для сброса пароля пользователя……………………………………. 486

11.3. Настройка почты для отправки сообщения о смене пароля на реальный электронный адрес  494

11.4. Поверка подлинности входа пользователя в систему…………………………………………………. 499

11.5. Формирование страниц сайта для создания заказов на книги…………………………………… 502

11.6. Работа с формами…………………………………………………………………………………………………………… 512

11.6.1. Краткий обзор форм в Django……………………………………………………………………………. 512

11.6.2. Управление формами в Django………………………………………………………………………….. 514

11.6.3. Форма для ввода и обновления информации об авторах книг на основе класса Form() 515

11.6.4. Форма для обновления информации об авторах книг на основе класса ModelForm()     527

11.6.5. Форма для ввода и обновления информации о книгах на основе класса ModelForm()    533

11.7. Краткие итоги………………………………………………………………………………………………………………….. 545

Глава 12. Публикация сайта в сети Интернет………………………………………. 547

12.1. Подготовка инфраструктуры сайта перед публикацией в сети Интернет………………… 547

12.1.1. Окружение развертывания сайта в сети Интернет………………………………………….. 548

12.1.2. Выбор хостинг-провайдера………………………………………………………………………………. 549

12.2. Подготовка веб-сайта к публикации…………………………………………………………………………….. 550

12.3. Размещение веб-сайта на хостинге timeweb…………………………………………………………………. 552

12.3.1. Регистрация аккаунта пользователя………………………………………………………………… 552

12.3.2. Административная панель хостинга timeweb………………………………………………….. 555

12.3.3. Создание на сервере папки для нового сайта………………………………………………….. 559

12.3.4. Создание на сервере виртуального окружения и приложения Django для нового сайта               567

12.3.5. Перенос сайта с рабочего компьютера на удаленный сервер……………………….. 574

12.3.6. Смена временного доменного имени на постоянное………………………………………. 579

12.4. Краткие итоги………………………………………………………………………………………………………………….. 581

Глава 13. Приложения Django и MySQL………………………………………………. 583

13.1. Подготовка инфраструктуры сайта для перехода на MySQL……………………………………. 583

13.2. Инсталляция сервера MySQL………………………………………………………………………………………… 584

13.3. Создание базы данных…………………………………………………………………………………………………… 584

13.4. Создание проекта Django с базой данных MySQL на локальном компьютере………… 588

13.5. Создание инфраструктуры на удаленном сервере для сайта с базой данных на MySQL……….. 591

13.6. Создание базы данных MySQL на удаленном сервере………………………………………………. 599

13.7. Перенос сайта с локального компьютера на публичный сервер……………………………….. 603

13.8. Краткие итоги………………………………………………………………………………………………………………….. 611

Послесловие…………………………………………………………………………………………. 613

Список источников и литературы………………………………………………………… 614

Приложение. Описание электронного архива………………………………………. 617

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

Постолит

Постолит Анатолий Владимирович – доктор технических наук, профессор, академик Российской академии транспорта, лауреат Всероссийского конкурса «Инженер года». Профессиональный программист, автор книг компьютерной тематики, в том числе «Python, Django и PyCharm для начинающих», и более 100 научных публикаций. Преподавал в Московском государственном автомобильно-дорожном техническом университете  (МАДИ). Занимался разработкой и внедрением информационных систем для транспортного комплекса Москвы и Московской области,  для транспортного обслуживания зимних Олимпийских игр в г. Сочи, систем оплаты проезда и информирования пассажиров городского общественного транспорта. Специализируется на создании информационных систем на основе MS SQL Server, MS Visual Studio, Bluetooth-технологий, а также систем искусственного интеллекта, обработки изображений и компьютерного зрения.

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

Встречайте новинку: “Python. 12 уроков для начинающих”

Python. 12 уроков для начинающих

В 12 уроках показаны основы программирования и базовые конструкции языка Python. Изложены принципы различных стилей программирования. Даны понятия ввода-вывода, переменных, условий, потока чисел, циклов и списков, массивов, функций и рекурсий. Рассмотрены особенности структурного, объектно-ориентированного и функционального программирования. В каждой главе предложены практические задачи и дано их пошаговое решение с подробным описанием алгоритма.

Для начинающих программистов

Основы программирования и базовые конструкции языка Python.

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

  • Изучите основные языковые конструкции языка Pyhon
  • Освойте программирование в ходе 12 наглядных уроков
  • Научитесь понимать и писать код в различных стилях программирования
  • Прокачайте алгоритмическое мышление

Книгу “Python. 12 уроков для начинающих” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Введение………………………………………………………………………………………………….. 5

Как обучают языкам программирования?………………………………………………………………………………… 5

И вот появился язык Python…………………………………………………………………………………………………………. 7

Структура книги…………………………………………………………………………………………………………………………… 7

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

Об авторе………………………………………………………………………………………………………………………………………. 9

Урок 1. Ввод/вывод, переменные, условия……………………………………………… 10

1.1. Привет, мир!…………………………………………………………………………………………………………………………. 10

1.2. Как тебя зовут?……………………………………………………………………………………………………………………. 13

1.3. Чему равно 12 + 34?……………………………………………………………………………………………………………. 15

1.4. Линейное уравнение…………………………………………………………………………………………………………… 18

1.5. Тип треугольника………………………………………………………………………………………………………………… 26

1.6. Стакан чая и кружка кофе………………………………………………………………………………………………….. 29

Урок 2. Поток чисел, циклы и списки……………………………………………………. 34

2.1. Поток чисел, рекуррентные формулы……………………………………………………………………………….. 34

2.2. Поток чисел, списки……………………………………………………………………………………………………………. 40

2.3. Векторы: длина, сумма, скалярное произведение……………………………………………………………. 46

Урок 3. Флаги. Структурное программирование и стиль Python…………….. 51

3.1. Эпидемия на корабле………………………………………………………………………………………………………….. 51

3.2. Является ли слово палиндромом?……………………………………………………………………………………… 55

3.3. Поиск и замена подстроки в строке…………………………………………………………………………………… 59

3.4. Сравнение чисел между собой. Множества……………………………………………………………………… 62

Урок 4. Словари, рекуррентный индекс в списке…………………………………… 76

4.1. Палиндром путем перестановки букв……………………………………………………………………………….. 76

4.2. Подстановки………………………………………………………………………………………………………………………… 83

Урок 5. Двумерные списки…………………………………………………………………….. 88

5.1. Сложение, транспонирование и умножение матриц……………………………………………………….. 88

5.2. Магический квадрат…………………………………………………………………………………………………………… 98

Итоги уроков 1–5……………………………………………………………………………………………………………………… 105

Урок 6. Декомпозиция программы в функции……………………………………… 106

6.1. Математические формулы как функции…………………………………………………………………………. 106

6.2. Функция факториал с циклом………………………………………………………………………………………….. 108

6.3. Библиотека формул комбинаторики……………………………………………………………………………….. 110

6.4. Декомпозиция магического квадрата в функции……………………………………………………………. 114

Урок 7. Рекурсии………………………………………………………………………………….. 117

7.1. Рекурсивный факториал…………………………………………………………………………………………………… 117

7.2. Числа Фибоначчи без списка, списком, с рекурсией……………………………………………………… 119

7.3. Быстрое возведение в степень………………………………………………………………………………………….. 125

7.4. Мемоизация чисел Фибоначчи………………………………………………………………………………………… 128

7.5. Генерация слов и перестановок………………………………………………………………………………………. 132

Урок 8. Динамика по подотрезкам……………………………………………………….. 139

8.1. Палиндром максимальной длины вычеркиванием букв……………………………………………….. 139

8.2. Максимальный квадрат в матрице………………………………………………………………………………….. 155

Урок 9. Функциональное программирование………………………………………. 163

9.1. Сумма факториалов в функциональном стиле………………………………………………………………. 163

9.2. Стандартные функционалы Python………………………………………………………………………………… 170

9.3. Стандартные функционалы для «Эпидемии на корабле»…………………………………………….. 173

9.4. Стандартные функционалы Python для суммы факториалов………………………………………. 175

9.5. Частичное применение функции на примере степени……………………………………………………. 178

9.6. Универсальный мемоизатор…………………………………………………………………………………………….. 184

9.7. Декораторы……………………………………………………………………………………………………………………….. 191

9.8. Генераторы……………………………………………………………………………………………………………………….. 199

Итоги уроков 6–9……………………………………………………………………………………………………………………… 202

Урок 10. Объектно-ориентированное программирование
предметной области «Геометрия»…………………………………………………………. 204

10.1. Класс «точка»………………………………………………………………………………………………………………….. 204

10.2. Предметная область «Геометрия»…………………………………………………………………………………. 211

10.3. Геометрическая фигура «многоугольник»……………………………………………………………………. 222

10.4. Составные фигуры………………………………………………………………………………………………………….. 227

Урок 11. Матрица в объектно-ориентированном стиле………………………… 231

11.1. Конструктор, индексатор………………………………………………………………………………………………. 231

11.2. Транспонирование, сложение, умножение…………………………………………………………………… 233

11.3. Определитель, обратная матрица, возведение в степень……………………………………………. 235

Урок 12. Программирование сложных коллекций……………………………….. 246

12.1. Функторы…………………………………………………………………………………………………………………………. 246

12.2. Коллекция «кольцо» и задача Иосифа Флавия…………………………………………………………….. 253

12.3. Мемоизация максимального квадрата матрицы в словаре………………………………………… 260

Итоги уроков 10–12…………………………………………………………………………………………………………………. 268

Заключение………………………………………………………………………………………….. 270

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

Добряк Павел Вадимович

Добряк Павел Вадимович — кандидат технических наук, преподаватель Уральского федерального университета. Проводит занятия по различным языкам программирования, базам данных, искусственному интеллекту и проектированию информационных систем. Репетитор по математике и информатике.

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

Представляем книгу “С++ — это просто”

С++ это просто

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

Для начинающих программистов

Вы изучите:

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

Книгу “С++ — это просто” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Об авторе……………………………………………………………………………………………….. 13

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

Предисловие к третьему изданию…………………………………………………………… 17

Предисловие к первому изданию……………………………………………………………. 19

Глава 1. Введение в ООП……………………………………………………………………….. 21

Истоки…………………………………………………………………………………………………………………………………………. 23

Структурное программирование……………………………………………………………………………………………… 24

Объектно-ориентированное программирование…………………………………………………………………….. 26

Характеристики объектно-ориентированных языков…………………………………………………………….. 28

Объекты………………………………………………………………………………………………………………………………. 28

Классы………………………………………………………………………………………………………………………………… 29

Инкапсуляция……………………………………………………………………………………………………………………… 29

Скрытие данных…………………………………………………………………………………………………………………. 29

Наследование…………………………………………………………………………………………………………………….. 30

Полиморфизм……………………………………………………………………………………………………………………… 31

Отношения включения……………………………………………………………………………………………………….. 31

Шаблоны…………………………………………………………………………………………………………………………….. 32

Обработка исключений……………………………………………………………………………………………………… 32

Многократное использование…………………………………………………………………………………………… 32

Упражнения………………………………………………………………………………………………………………………………… 33

Важное………………………………………………………………………………………………………………………………………… 35

Глава 2. Переходим на C++……………………………………………………………………. 37

Комментарии……………………………………………………………………………………………………………………………… 39

Ввод и вывод в C++……………………………………………………………………………………………………………………. 40

Динамическое объявление переменных…………………………………………………………………………………… 42

Динамическая инициализация………………………………………………………………………………………………….. 43

Вывод типов……………………………………………………………………………………………………………………………….. 43

Синтаксис структуры (struct), объединения (union) и перечисления (enum)………………………… 43

Неименованные объединения и перечисления……………………………………………………………………….. 44

Приведение типов………………………………………………………………………………………………………………………. 45

Пустой указатель (void)…………………………………………………………………………………………………………….. 46

Оператор ::………………………………………………………………………………………………………………………………….. 46

Ссылки………………………………………………………………………………………………………………………………………… 47

Типы обращений к функциям……………………………………………………………………………………………………. 48

Возвращение значения по ссылке…………………………………………………………………………………………….. 51

Спецификатор const…………………………………………………………………………………………………………………… 52

Const-указатели………………………………………………………………………………………………………………….. 53

Const-ссылки………………………………………………………………………………………………………………………. 54

Возврат значений const-переменных……………………………………………………………………………….. 57

Функции-члены типа const………………………………………………………………………………………………… 57

Логический тип данных (bool)………………………………………………………………………………………………….. 58

Упражнения………………………………………………………………………………………………………………………………… 59

Важное………………………………………………………………………………………………………………………………………… 65

Глава 3. Функции………………………………………………………………………………….. 69

Строгая проверка типов……………………………………………………………………………………………………………. 71

Исходные значения для аргументов функции…………………………………………………………………………. 72

Перегрузка функции…………………………………………………………………………………………………………………… 73

Разница в типе возвращаемого значения…………………………………………………………………………. 74

Можно ли задать разные типы данных при помощи typedef?……………………………………….. 75

Можно ли задать разные типы данных при помощи const?…………………………………………… 75

Разные задачи, одно имя……………………………………………………………………………………………………. 76

Перегрузка операторов……………………………………………………………………………………………………………… 76

FAQ по перегрузке операторов…………………………………………………………………………………………. 79

Встраиваемые функции…………………………………………………………………………………………………………….. 79

Зачем полагаться на компилятор?……………………………………………………………………………………. 80

А где гарантия?…………………………………………………………………………………………………………………… 80

Когда ими пользоваться?…………………………………………………………………………………………………… 81

Новый синтаксис возвращаемого типа……………………………………………………………………………………. 81

Функции instance, static, virtual и friend…………………………………………………………………………………… 81

Упражнения………………………………………………………………………………………………………………………………… 82

Важное………………………………………………………………………………………………………………………………………… 85

Глава 4. Классы и объекты……………………………………………………………………. 87

Структуры и классы………………………………………………………………………………………………………………….. 89

Классы и конструкторы…………………………………………………………………………………………………………….. 92

Деструкторы………………………………………………………………………………………………………………………………. 94

Класс Complex……………………………………………………………………………………………………………………………. 95

Указатель this…………………………………………………………………………………………………………………………….. 97

Перегрузка унарных операторов……………………………………………………………………………………………… 98

Объекты и память…………………………………………………………………………………………………………………….. 100

Еще раз о структурах и классах…………………………………………………………………………………………….. 101

Идеальная организация программы………………………………………………………………………………………. 102

Упражнения……………………………………………………………………………………………………………………………… 106

Важное……………………………………………………………………………………………………………………………………… 112

Глава 5. Премудрости классов……………………………………………………………… 115

Статическое и динамическое выделение памяти………………………………………………………………….. 117

Выделение памяти для массивов и структур…………………………………………………………………. 118

Выделение памяти для объектов…………………………………………………………………………………….. 120

Статические члены класса……………………………………………………………………………………………………… 122

Универсальный спецификатор const……………………………………………………………………………………… 124

Перегруженный оператор присваивания и конструктор копирования………………………………. 126

Преобразование данных…………………………………………………………………………………………………………. 129

Преобразование между встроенными типами………………………………………………………………. 129

Преобразование между встроенными и пользовательскими типами………………………….. 130

Преобразование между различными пользовательскими типами данных………………… 132

Процедура преобразования в исходном объекте………………………………………………………….. 132

Процедура преобразования в целевом объекте…………………………………………………………….. 134

Упражнения……………………………………………………………………………………………………………………………… 137

Важное……………………………………………………………………………………………………………………………………… 139

Глава 6. Наследование…………………………………………………………………………. 141

Наследование…………………………………………………………………………………………………………………………… 143

Еще один пример наследования…………………………………………………………………………………………….. 147

Варианты применения наследования……………………………………………………………………………………. 149

Наследование и конструкторы………………………………………………………………………………………………. 151

Виды наследования…………………………………………………………………………………………………………………. 154

Одиночное наследование………………………………………………………………………………………………… 154

Многоуровневое наследование………………………………………………………………………………………. 155

Множественное наследование……………………………………………………………………………………….. 156

Предупреждение………………………………………………………………………………………………………………………. 157

Поэтапная разработка…………………………………………………………………………………………………………….. 158

Упражнения……………………………………………………………………………………………………………………………… 158

Важное……………………………………………………………………………………………………………………………………… 160

Глава 7. Полиморфизм…………………………………………………………………………. 163

Виртуальная функция……………………………………………………………………………………………………………… 165

Чистая виртуальная функция………………………………………………………………………………………………….. 167

Абстрактный класс………………………………………………………………………………………………………………….. 168

Связывание функций……………………………………………………………………………………………………………….. 168

Анатомия виртуальных функций……………………………………………………………………………………………. 170

Для чего применять виртуальные функции?…………………………………………………………………………. 177

Срезание объекта…………………………………………………………………………………………………………………….. 177

Виртуальные деструкторы……………………………………………………………………………………………………… 179

Вызов виртуальных функций из конструкторов/деструкторов…………………………………… 181

Виртуальные базовые классы………………………………………………………………………………………………… 181

Упражнения……………………………………………………………………………………………………………………………… 183

Важное……………………………………………………………………………………………………………………………………… 184

Глава 8. Система ввода-вывода в C++………………………………………………….. 187

Требования к системе ввода-вывода……………………………………………………………………………………… 189

Решение с использованием потоков в C++…………………………………………………………………………….. 190

Предопределенные потоковые объекты………………………………………………………………………………… 191

Библиотека iostream………………………………………………………………………………………………………………… 191

Класс istream……………………………………………………………………………………………………………………………. 192

Класс ostream…………………………………………………………………………………………………………………………… 194

Вывод символов в кодировке Unicode……………………………………………………………………………. 195

Класс iostream………………………………………………………………………………………………………………………….. 196

Манипуляторы потока……………………………………………………………………………………………………………. 196

Пользовательские манипуляторы………………………………………………………………………………………….. 199

Пользовательские манипуляторы с аргументами…………………………………………………………. 200

Работа с потоками ввода-вывода в файл………………………………………………………………………………. 202

Символьный ввод-вывод…………………………………………………………………………………………………………. 203

Открытие файла……………………………………………………………………………………………………………….. 203

Чтение данных………………………………………………………………………………………………………………….. 204

Обнаружение конца файла (EOF)…………………………………………………………………………………… 204

Закрытие файла……………………………………………………………………………………………………………….. 204

Программа копирования файлов……………………………………………………………………………………………. 204

Ввод-вывод строк…………………………………………………………………………………………………………………….. 205

Ввод-вывод записей…………………………………………………………………………………………………………………. 206

Прямой доступ…………………………………………………………………………………………………………………………. 208

Режимы открытия файла…………………………………………………………………………………………………………. 210

Строковые потоки……………………………………………………………………………………………………………………. 211

Работа с istrstream……………………………………………………………………………………………………………. 212

Ввод-вывод объектов………………………………………………………………………………………………………………. 213

Сериализация…………………………………………………………………………………………………………………………… 214

Обработка ошибок ввода-вывода………………………………………………………………………………………….. 215

Взаимодействие с файловой системой…………………………………………………………………………………… 217

Упражнения……………………………………………………………………………………………………………………………… 220

Важное……………………………………………………………………………………………………………………………………… 222

Глава 9. Расширенные возможности C++…………………………………………….. 225

Отношения включения…………………………………………………………………………………………………………….. 227

Дружественные (friend) функции и классы……………………………………………………………………………. 229

Еще одно применение дружественной функции……………………………………………………………………. 231

Предупреждение………………………………………………………………………………………………………………………. 234

Ключевое слово explicit………………………………………………………………………………………………………….. 234

Ключевое слово mutable…………………………………………………………………………………………………………. 236

Пространство имен………………………………………………………………………………………………………………….. 237

Способы применения пространства имен……………………………………………………………………………… 240

Использование оператора разрешения контекста………………………………………………………… 240

Ключевое слово using……………………………………………………………………………………………………… 241

Динамическая идентификация типа (RTTI)…………………………………………………………………………… 242

Приведение типов в C++………………………………………………………………………………………………………….. 244

static_cast………………………………………………………………………………………………………………………….. 245

dynamic_cast……………………………………………………………………………………………………………………… 246

const_cast………………………………………………………………………………………………………………………….. 248

reinterpret_cast…………………………………………………………………………………………………………………. 248

Предупреждение………………………………………………………………………………………………………………. 249

Указатели на члены классов…………………………………………………………………………………………………… 249

Упражнения……………………………………………………………………………………………………………………………… 253

Важное……………………………………………………………………………………………………………………………………… 254

Глава 10. Шаблоны……………………………………………………………………………… 257

Шаблоны функций…………………………………………………………………………………………………………………… 259

Что происходит во время компиляции?………………………………………………………………………….. 261

Шаблоны функций для пользовательских типов………………………………………………………………….. 261

Еще одна шаблонная функция……………………………………………………………………………………………….. 262

Явная специализация обобщенной функции…………………………………………………………………. 264

Функция с набором обобщенных типов………………………………………………………………………………… 264

Шаблоны и макросы……………………………………………………………………………………………………………….. 265

Сортировка на основе шаблона…………………………………………………………………………………………….. 266

Шаблоны классов……………………………………………………………………………………………………………………. 267

Шаблон класса связного списка…………………………………………………………………………………………….. 271

Полезные советы по шаблонам………………………………………………………………………………………………. 273

Вариативные шаблоны…………………………………………………………………………………………………………… 275

Области применения шаблонов……………………………………………………………………………………………… 276

Упражнения……………………………………………………………………………………………………………………………… 276

Важное……………………………………………………………………………………………………………………………………… 278

Глава 11. Обработка исключений………………………………………………………… 279

Обработка исключений в C++………………………………………………………………………………………………… 281

Работа с библиотечными классами исключений………………………………………………………………….. 284

Библиотечные исключения при создании очереди………………………………………………………. 286

Еще один пример……………………………………………………………………………………………………………… 288

Работа с пользовательскими классами исключений……………………………………………………………. 290

Полезные советы……………………………………………………………………………………………………………………… 292

Спецификация исключений…………………………………………………………………………………………………….. 293

Необработанные исключения………………………………………………………………………………………………… 294

Интеллектуальные указатели и динамические контейнеры………………………………………………… 295

Упражнения……………………………………………………………………………………………………………………………… 297

Важное……………………………………………………………………………………………………………………………………… 298

Глава 12. Стандартная библиотека шаблонов……………………………………… 301

Стандартная библиотека шаблонов……………………………………………………………………………………… 303

Компоненты STL……………………………………………………………………………………………………………………… 304

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

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

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

Вектор (vector)………………………………………………………………………………………………………………………….. 307

Другие операции………………………………………………………………………………………………………………. 308

Вектор объектов класса Point…………………………………………………………………………………………………. 309

Список (list)………………………………………………………………………………………………………………………………. 311

Множество (set) и мультимножество (multi-set)…………………………………………………………………….. 313

Отображение (map) и мультиотображение (multi-map)………………………………………………………… 317

Стек (stack)……………………………………………………………………………………………………………………………….. 319

Очередь (queue)………………………………………………………………………………………………………………………… 320

Объект-функция………………………………………………………………………………………………………………… 322

Упражнения……………………………………………………………………………………………………………………………… 323

Важное……………………………………………………………………………………………………………………………………… 324

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

Яшавант Канеткар

Яшавант Канеткар — автор книг и курсов по языкам C, C++, Java, Python, структурам данных, .NET, IoT. Его книги переведены на хинди, гуджарати, японский, корейский и китайский языки. Получил степень бакалавра в Технологическом институте имени Веермата Джиджабая (VJTI, Мумбаи) и магистра технических наук в Индийском Институте Технологий (IIT, Канпур). В настоящее время является директором нескольких IT-компаний. Был удостоен множества престижных наград за свои предпринимательские, профессиональные и академические достижения, а также за вклад в IT-образование Индии.

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

Новинка: Django 4. Практика создания веб-сайтов на Python

Django 4. Практика создания веб-сайтов на Python

Описание

Книга посвящена разработке веб-сайтов на языке Python с применением веб-фреймворка Django. Представлены новинки Django 4 и дано наиболее полное описание его инструментов: моделей, контролеров, шаблонов, средств обработки пользовательского ввода, включая выгруженные файлы, разграничения доступа, посредников, сигналов, инструментов для отправки электронной почты, кэширования и пр. Рассмотрены дополнительные библиотеки, производящие обработку BBCode, CAPTCHA, вывод графических миниатюр, аутентификацию через социальные сети (в частности, “ВКонтакте”), интеграцию с Bootstrap. Рассказано о программировании веб-служб REST, использовании и настройке административного веб-сайта Django, публикации сайтов с помощью веб-сервера Uvicorn, работе с базами данных PostgreSQL, локализации строк, форматов и временных зон. Подробно описано создание полнофункционального веб-сайта — электронной доски объявлений.

Электронное приложение-архив на сайте издательства содержит коды всех примеров.

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

Python и Django — команда мечты!

Что такое веб-фреймворк?

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

  • взаимодействие с базой данных — посредством единых инструментов, независимых от конкретной СУБД;
  • обработка клиентских запросов — в частности, определение, какая страница запрашивается;
  • генерирование запрашиваемых веб-страниц на основе шаблонов;
  • разграничение доступа — допуск к закрытым страницам только зарегистрированных пользователей и только после выполнения ими входа;
  • обработка данных, занесенных посетителями в веб-формы, — в частности, проверка их на корректность;
  • получение и сохранение файлов, выгруженных пользователями;
  • рассылка электронных писем;
  • кеширование сгенерированных страниц на стороне сервера — для повышения производительности;
  • локализация — перевод сайта на другие языки.

Внимание

Автор предполагает, что читатели этой книги знакомы с языками HTML, CSS, JavaScript, Python, принципами работы СУБД и имеют базовые навыки в веб-разработке. В книге все это описываться не будет.

Django — популярнейший в мире веб-фреймворк, написанный на языке Python, и один из наиболее распространенных веб-фреймворков в мире. Появившись в 2005 году — именно тогда вышла его первая версия, — он до сих пор остается «на коне».

Фреймвок получил название в честь французского джазового гитариста-виртуоза Джанго Рейнхардт (цыг. Django Reinhardt; настоящее имя Жан Ренарт, фр. Jean Reinhardt; 23 января 1910 — 16 мая 1953). Прозвище Рейнхардта «Django» на цыганском языке означает «я проснулся».

Книгу “Django 4. Практика создания веб-сайтов на Python” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 19

Что такое веб-фреймворк?…………………………………………………………………………………………………………. 19

Почему Django?………………………………………………………………………………………………………………………….. 20

Что нового в Django 4.1 и новой книге?……………………………………………………………………………………. 21

Использованные программные продукты……………………………………………………………………………….. 21

Типографские соглашения………………………………………………………………………………………………………… 22

Часть I. Вводный курс…………………………………………………………………… 25

Глава 1. Основные понятия Django. Вывод данных………………………………. 27

1.1. Установка фреймворка……………………………………………………………………………………………………….. 27

1.2. Проект Django……………………………………………………………………………………………………………………… 28

1.3. Отладочный веб-сервер Django…………………………………………………………………………………………. 29

1.4. Приложения…………………………………………………………………………………………………………………………. 30

1.5. Контроллеры……………………………………………………………………………………………………………………….. 32

1.6. Маршруты и маршрутизатор…………………………………………………………………………………………….. 33

1.7. Модели…………………………………………………………………………………………………………………………………. 36

1.8. Миграции…………………………………………………………………………………………………………………………….. 38

1.9. Консоль Django…………………………………………………………………………………………………………………… 40

1.10. Работа с моделями……………………………………………………………………………………………………………. 40

1.11. Шаблоны……………………………………………………………………………………………………………………………. 44

1.12. Контекст шаблона, рендеринг и сокращения…………………………………………………………………. 46

1.13. Административный веб-сайт Django………………………………………………………………………………. 47

1.14. Параметры полей и моделей……………………………………………………………………………………………. 52

1.15. Редактор модели……………………………………………………………………………………………………………….. 53

Глава 2. Связи. Ввод данных. Статические файлы………………………………… 56

2.1. Связи между моделями……………………………………………………………………………………………………….. 56

2.2. Строковое представление модели…………………………………………………………………………………….. 58

2.3. URL-параметры и параметризованные запросы……………………………………………………………… 59

2.4. Обратное разрешение интернет-адресов………………………………………………………………………….. 63

2.5. Формы, связанные с моделями…………………………………………………………………………………………… 65

2.6. Контроллеры-классы………………………………………………………………………………………………………….. 65

2.7. Наследование шаблонов……………………………………………………………………………………………………. 68

2.8. Статические файлы…………………………………………………………………………………………………………….. 71

Часть II. Базовые инструменты Django………………………………… 75

Глава 3. Создание и настройка проекта…………………………………………………. 77

3.1. Подготовка к работе…………………………………………………………………………………………………………… 77

3.2. Создание проекта Django…………………………………………………………………………………………………… 79

3.3. Настройки проекта……………………………………………………………………………………………………………… 79

3.3.1. Основные настройки…………………………………………………………………………………………………….. 79

3.3.2. Параметры баз данных………………………………………………………………………………………………… 80

3.3.3. Список зарегистрированных приложений………………………………………………………………….. 83

3.3.4. Список зарегистрированных посредников…………………………………………………………………. 84

3.3.5. Языковые настройки…………………………………………………………………………………………………….. 85

3.3.6. Доступ к настройкам проекта из программного кода……………………………………………….. 88

3.3.7. Создание собственных настроек проекта…………………………………………………………………… 88

3.4. Создание, настройка и регистрация приложений……………………………………………………………. 89

3.4.1. Создание приложений………………………………………………………………………………………………….. 89

3.4.2. Настройки приложений………………………………………………………………………………………………… 89

3.4.3. Регистрация приложений в проекте…………………………………………………………………………….. 90

3.5. Средства отладки……………………………………………………………………………………………………………….. 91

3.5.1. Отладочный веб-сервер Django…………………………………………………………………………………… 91

3.5.2. Веб-страница сообщения об ошибке…………………………………………………………………………… 92

3.6. Работа с несколькими базами данных………………………………………………………………………………. 94

3.6.1. Регистрация используемых баз данных……………………………………………………………………… 94

3.6.2. Диспетчеризация данных…………………………………………………………………………………………….. 95

3.6.2.1. Автоматическая диспетчеризация данных……………………………………………………… 95

3.6.2.2. Указание базы данных в административных командах………………………………… 98

3.6.2.3. Ручная диспетчеризация данных…………………………………………………………………….. 99

Глава 4. Модели: базовые инструменты……………………………………………….. 100

4.1. Объявление моделей…………………………………………………………………………………………………………. 100

4.2. Объявление полей модели………………………………………………………………………………………………… 101

4.2.1. Параметры, поддерживаемые полями всех типов……………………………………………………. 101

4.2.2. Классы полей моделей……………………………………………………………………………………………….. 103

4.2.3. Создание полей со списком……………………………………………………………………………………….. 107

4.3. Создание связей между моделями…………………………………………………………………………………… 110

4.3.1. Связь «один-со-многими»……………………………………………………………………………………………. 110

4.3.2. Связь «один-с-одним»…………………………………………………………………………………………………. 114

4.3.3. Связь «многие-со-многими»………………………………………………………………………………………… 115

4.4. Параметры самой модели………………………………………………………………………………………………… 117

4.4.1. Получение доступа к параметрам модели из программного кода…………………………. 124

4.5. Интернет-адрес модели и его формирование…………………………………………………………………. 124

4.6. Методы модели…………………………………………………………………………………………………………………. 125

4.7. Валидация модели. Валидаторы…………………………………………………………………………………….. 127

4.7.1. Стандартные валидаторы Django…………………………………………………………………………….. 127

4.7.2. Вывод собственных сообщений об ошибках……………………………………………………………. 131

4.7.3. Написание своих валидаторов………………………………………………………………………………….. 133

4.7.4. Валидация модели………………………………………………………………………………………………………. 134

4.8. Создание моделей на основе существующих баз данных……………………………………………. 136

Глава 5. Миграции……………………………………………………………………………….. 137

5.1. Генерирование миграций…………………………………………………………………………………………………. 137

5.2. Модули миграций……………………………………………………………………………………………………………… 139

5.3. Выполнение миграций……………………………………………………………………………………………………… 139

5.4. Вывод списка миграций……………………………………………………………………………………………………. 141

5.5. Оптимизация миграций…………………………………………………………………………………………………….. 141

5.6. Слияние миграций…………………………………………………………………………………………………………….. 142

5.7. Очистка моделей……………………………………………………………………………………………………………….. 143

5.8. Отмена миграций………………………………………………………………………………………………………………. 144

Глава 6. Запись данных……………………………………………………………………….. 145

6.1. Правка записей………………………………………………………………………………………………………………….. 145

6.2. Создание записей……………………………………………………………………………………………………………… 146

6.3. Занесение значений в поля разных типов………………………………………………………………………. 147

6.4. Сохранение записей…………………………………………………………………………………………………………. 149

6.4.1. Сохранение копий записей в разных базах данных………………………………………………… 150

6.5. Удаление записей……………………………………………………………………………………………………………… 151

6.6. Обработка связанных записей…………………………………………………………………………………………. 151

6.6.1. Обработка связи «один-со-многими»………………………………………………………………………… 152

6.6.2. Обработка связи «один-с-одним»………………………………………………………………………………. 153

6.6.3. Обработка связи «многие-со-многими»…………………………………………………………………….. 154

6.7. Произвольное переупорядочивание записей…………………………………………………………………. 156

6.8. Массовые добавление, правка и удаление записей………………………………………………………. 156

6.9. Выполнение валидации модели………………………………………………………………………………………. 159

6.10. Асинхронная запись данных…………………………………………………………………………………………. 160

Глава 7. Выборка данных…………………………………………………………………….. 161

7.1. Извлечение значений из полей записи…………………………………………………………………………….. 161

7.1.1. Получение значений из полей разных типов……………………………………………………………. 161

7.2. Доступ к связанным записям……………………………………………………………………………………………. 162

7.3. Выборка записей………………………………………………………………………………………………………………. 164

7.3.1. Выборка всех записей………………………………………………………………………………………………… 164

7.3.2. Извлечение одной записи…………………………………………………………………………………………… 165

7.3.3. Получение числа записей в наборе…………………………………………………………………………… 166

7.3.4. Поиск одной записи…………………………………………………………………………………………………….. 167

7.3.5. Фильтрация записей……………………………………………………………………………………………………. 168

7.3.6. Написание условий фильтрации……………………………………………………………………………….. 169

7.3.6.1. Написание условий фильтрации по значениям полей связанных записей… 172

7.3.6.2. Написание условий фильтрации по значениям полей типа JSON………………. 173

7.3.6.3. Сравнение со значениями других полей. Функциональные выражения……. 175

7.3.6.4. Сложные условия фильтрации. Выражения сравнения……………………………….. 176

7.3.7. Выборка уникальных записей…………………………………………………………………………………… 177

7.3.8. Выборка указанного числа записей………………………………………………………………………….. 178

7.3.9. Экономная выборка записей……………………………………………………………………………………… 178

7.4. Сортировка записей………………………………………………………………………………………………………….. 179

7.5. Агрегатные вычисления……………………………………………………………………………………………………. 181

7.5.1. Агрегатные вычисления по всем записям набора……………………………………………………. 181

7.5.2. Агрегатные вычисления по связанным записям……………………………………………………….. 182

7.5.3. Агрегатные функции…………………………………………………………………………………………………… 184

7.6. Вычисляемые поля……………………………………………………………………………………………………………. 186

7.7. Функциональные выражения: расширенные инструменты………………………………………….. 187

7.7.1. Функции СУБД……………………………………………………………………………………………………………. 187

7.7.1.1. Функции для работы со строками………………………………………………………………….. 187

7.7.1.2. Функции для работы с числами……………………………………………………………………… 190

7.7.1.3. Функции для работы с датой и временем……………………………………………………… 192

7.7.1.4. Функции для сравнения и преобразования значений…………………………………… 193

7.7.2. Условные выражения СУБД………………………………………………………………………………………. 195

7.7.3. Вложенные запросы……………………………………………………………………………………………………. 196

7.8. Объединение наборов записей………………………………………………………………………………………… 198

7.9. Извлечение значений только из заданных полей…………………………………………………………… 198

7.10. Указание базы данных для выборки записей………………………………………………………………. 201

7.11. Асинхронная выборка данных………………………………………………………………………………………. 201

Глава 8. Маршрутизация……………………………………………………………………… 203

8.1. Как работает маршрутизатор?……………………………………………………………………………………….. 203

8.1.1. Списки маршрутов уровня проекта и уровня приложения……………………………………… 204

8.2. Объявление маршрутов……………………………………………………………………………………………………. 205

8.3. Передача данных в контроллеры……………………………………………………………………………………. 207

8.4. Именованные маршруты………………………………………………………………………………………………….. 208

8.5. Имена приложений……………………………………………………………………………………………………………. 208

8.6. Псевдонимы приложений…………………………………………………………………………………………………. 209

8.7. Указание шаблонных путей в виде регулярных выражений………………………………………… 210

8.8. Настройки маршрутизатора……………………………………………………………………………………………. 211

Глава 9. Контроллеры-функции…………………………………………………………… 212

9.1. Написание контроллеров-функций…………………………………………………………………………………. 212

9.1.1. Контроллеры, выполняющие одну задачу……………………………………………………………….. 213

9.1.2. Контроллеры, выполняющие несколько задач………………………………………………………… 214

9.2. Получение сведений о запросе………………………………………………………………………………………… 215

9.3. Формирование ответа………………………………………………………………………………………………………. 218

9.3.1. Низкоуровневые средства для формирования ответа……………………………………………… 218

9.3.2. Формирование ответа на основе шаблона……………………………………………………………….. 220

9.3.3. Класс TemplateResponse: отложенный рендеринг шаблонов…………………………………. 221

9.4. Перенаправление………………………………………………………………………………………………………………. 222

9.5. Обратное разрешение интернет-адресов……………………………………………………………………….. 223

9.6. Уведомление об ошибках и особых ситуациях……………………………………………………………… 224

9.7. Специальные ответы………………………………………………………………………………………………………… 226

9.7.1. Потоковый ответ…………………………………………………………………………………………………………. 226

9.7.2. Отправка файлов…………………………………………………………………………………………………………. 227

9.7.3. Отправка данных в формате JSON…………………………………………………………………………….. 227

9.8. Сокращения Django………………………………………………………………………………………………………….. 228

9.9. Программное разрешение интернет-адресов…………………………………………………………………. 229

9.10. Дополнительные настройки контроллеров………………………………………………………………….. 231

9.11. Асинхронные контроллеры-функции……………………………………………………………………………. 232

Глава 10. Контроллеры-классы……………………………………………………………. 235

10.1. Введение в контроллеры-классы…………………………………………………………………………………… 235

10.2. Базовые контроллеры-классы……………………………………………………………………………………….. 236

10.2.1. Контроллер View: диспетчеризация по HTTP-методу…………………………………………… 236

10.2.2. Примесь ContextMixin: создание контекста шаблона…………………………………………… 238

10.2.3. Примесь TemplateResponseMixin: рендеринг шаблона………………………………………….. 238

10.2.4. Контроллер TemplateView: все вместе…………………………………………………………………….. 239

10.3. Классы, выводящие одну запись…………………………………………………………………………………… 240

10.3.1. Примесь SingleObjectMixin: поиск записи………………………………………………………………. 240

10.3.2. Примесь SingleObjectTemplateResponseMixin: рендеринг шаблона
на основе найденной записи………………………………………………………………………………………………… 241

10.3.3. Контроллер DetailView: все вместе…………………………………………………………………………. 242

10.4. Классы, выводящие наборы записей…………………………………………………………………………….. 243

10.4.1. Примесь MultipleObjectMixin: извлечение набора записей………………………………….. 243

10.4.2. Примесь MultipleObjectTemplateResponseMixin: рендеринг шаблона
на основе набора записей……………………………………………………………………………………………………. 246

10.4.3. Контроллер ListView: все вместе……………………………………………………………………………… 246

10.5. Классы, работающие с формами…………………………………………………………………………………… 247

10.5.1. Классы для вывода и валидации форм…………………………………………………………………… 247

10.5.1.1. Примесь FormMixin: создание формы…………………………………………………………. 247

10.5.1.2. Контроллер ProcessFormView: вывод и обработка формы……………………….. 249

10.5.1.3. Контроллер-класс FormView: создание, вывод и обработка формы………… 249

10.5.2. Классы для добавления, правки и удаления записей……………………………………………. 250

10.5.2.1. Примесь ModelFormMixin: создание формы, связанной с моделью…………. 251

10.5.2.2. Контроллер CreateView: создание новой записи……………………………………….. 252

10.5.2.3. Контроллер UpdateView: исправление записи…………………………………………… 252

10.5.2.4. Примесь DeletionMixin: удаление записи……………………………………………………. 253

10.5.2.5. Контроллер DeleteView: удаление записи с подтверждением………………….. 254

10.6. Классы для вывода хронологических списков…………………………………………………………….. 256

10.6.1. Вывод последних записей………………………………………………………………………………………… 256

10.6.1.1. Примесь DateMixin: фильтрация записей по дате………………………………………. 256

10.6.1.2. Контроллер BaseDateListView: базовый класс…………………………………………… 256

10.6.1.3. Контроллер ArchiveIndexView: вывод последних записей………………………… 257

10.6.2. Вывод записей по годам…………………………………………………………………………………………… 258

10.6.2.1. Примесь YearMixin: извлечение года…………………………………………………………… 258

10.6.2.2. Контроллер YearArchiveView: вывод записей за год………………………………….. 259

10.6.3. Вывод записей по месяцам………………………………………………………………………………………. 260

10.6.3.1. Примесь MonthMixin: извлечение месяца……………………………………………………. 260

10.6.3.2. Контроллер MonthArchiveView: вывод записей за месяц………………………….. 260

10.6.4. Вывод записей по неделям……………………………………………………………………………………….. 261

10.6.4.1. Примесь WeekMixin: извлечение номера недели………………………………………… 261

10.6.4.2. Контроллер WeekArchiveView: вывод записей за неделю…………………………. 262

10.6.5. Вывод записей по дням…………………………………………………………………………………………….. 262

10.6.5.1. Примесь DayMixin: извлечение заданного числа……………………………………….. 263

10.6.5.2. Контроллер DayArchiveView: вывод записей за день………………………………… 263

10.6.6. Контроллер TodayArchiveView: вывод записей за текущее число……………………….. 264

10.6.7. Контроллер DateDetailView: вывод одной записи за указанное число……………….. 264

10.7. Контроллер RedirectView: перенаправление……………………………………………………………….. 265

10.8. Контроллеры-классы смешанной функциональности………………………………………………… 267

10.9. Асинхронные контроллеры-классы………………………………………………………………………………. 268

Глава 11. Шаблоны и статические файлы: базовые инструменты……….. 270

11.1. Настройки проекта, касающиеся шаблонов………………………………………………………………… 270

11.2. Вывод данных. Директивы…………………………………………………………………………………………….. 275

11.3. Теги шаблонизатора………………………………………………………………………………………………………. 276

11.4. Фильтры…………………………………………………………………………………………………………………………… 283

11.5. Наследование шаблонов……………………………………………………………………………………………….. 292

11.6. Включение шаблонов…………………………………………………………………………………………………….. 294

11.7. Обработка статических файлов…………………………………………………………………………………….. 295

11.7.1. Настройка подсистемы статических файлов…………………………………………………………. 295

11.7.2. Формирование интернет-адресов статических файлов………………………………………… 297

Глава 12. Пагинатор…………………………………………………………………………….. 299

12.1. Класс Paginator: сам пагинатор. Создание пагинатора…………………………………………….. 299

12.2. Класс Page: часть пагинатора. Вывод пагинатора…………………………………………………….. 302

Глава 13. Формы, связанные с моделями……………………………………………… 303

13.1. Создание форм, связанных с моделями………………………………………………………………………… 303

13.1.1. Создание форм с помощью фабрики классов…………………………………………………………. 303

13.1.2. Создание форм путем быстрого объявления………………………………………………………….. 305

13.1.3. Создание форм путем полного объявления……………………………………………………………. 306

13.1.3.1. Как выполняется полное объявление?………………………………………………………… 306

13.1.3.2. Параметры, поддерживаемые всеми типами полей…………………………………… 308

13.1.3.3. Классы полей форм……………………………………………………………………………………….. 309

13.1.3.4. Классы полей форм, применяемые по умолчанию…………………………………….. 313

13.1.4. Задание элементов управления……………………………………………………………………………….. 314

13.1.4.1. Классы элементов управления…………………………………………………………………….. 314

13.1.4.2. Элементы управления, применяемые по умолчанию………………………………… 317

13.2. Обработка форм……………………………………………………………………………………………………………… 318

13.2.1. Добавление записи посредством формы………………………………………………………………… 318

13.2.1.1. Создание формы для добавления записи……………………………………………………. 318

13.2.1.2. Повторное создание формы………………………………………………………………………….. 318

13.2.1.3. Валидация данных, занесенных в форму……………………………………………………. 319

13.2.1.4. Сохранение данных, занесенных в форму………………………………………………….. 320

13.2.1.5. Доступ к данным, занесенным в форму……………………………………………………….. 321

13.2.2. Правка записи посредством формы………………………………………………………………………… 321

13.2.3. Некоторые соображения касательно удаления записей………………………………………. 322

13.3. Вывод форм на экран……………………………………………………………………………………………………… 323

13.3.1. Быстрый вывод форм………………………………………………………………………………………………… 323

13.3.2. Расширенный вывод форм……………………………………………………………………………………….. 325

13.4. Валидация в формах………………………………………………………………………………………………………. 327

13.4.1. Валидация полей формы………………………………………………………………………………………….. 327

13.4.1.1. Валидация с применением валидаторов…………………………………………………….. 327

13.4.1.2. Валидация путем переопределения методов формы…………………………………. 328

13.4.2. Валидация формы…………………………………………………………………………………………………….. 328

Глава 14. Наборы форм, связанные с моделями……………………………………. 330

14.1. Создание наборов форм, связанных с моделями…………………………………………………………. 330

14.2. Обработка наборов форм, связанных с моделями……………………………………………………….. 334

14.2.1. Создание набора форм, связанного с моделью……………………………………………………… 334

14.2.2. Повторное создание набора форм…………………………………………………………………………… 334

14.2.3. Валидация и сохранение набора форм…………………………………………………………………… 335

14.2.4. Доступ к данным, занесенным в набор форм…………………………………………………………. 336

14.2.5. Реализация переупорядочивания записей……………………………………………………………… 337

14.3. Вывод наборов форм на экран………………………………………………………………………………………. 338

14.3.1. Быстрый вывод наборов форм…………………………………………………………………………………. 338

14.3.2. Расширенный вывод наборов форм………………………………………………………………………… 339

14.4. Валидация в наборах форм……………………………………………………………………………………………. 341

14.5. Встроенные наборы форм……………………………………………………………………………………………… 342

14.5.1. Создание встроенных наборов форм………………………………………………………………………. 342

14.5.2. Обработка встроенных наборов форм……………………………………………………………………. 342

Глава 15. Разграничение доступа: базовые инструменты…………………….. 344

15.1. Как работает подсистема разграничения доступа?……………………………………………………. 344

15.2. Подготовка подсистемы разграничения доступа………………………………………………………… 345

15.2.1. Настройка подсистемы разграничения доступа……………………………………………………. 345

15.2.2. Создание суперпользователя…………………………………………………………………………………… 346

15.2.3. Смена пароля пользователя…………………………………………………………………………………….. 347

15.3. Работа со списками пользователей и групп…………………………………………………………………. 347

15.3.1. Список пользователей………………………………………………………………………………………………. 347

15.3.2. Группы пользователей. Список групп…………………………………………………………………….. 349

15.4. Вход, выход и служебные процедуры………………………………………………………………………….. 350

15.4.1. Контроллер LoginView: вход на сайт……………………………………………………………………… 350

15.4.2. Контроллер LogoutView: выход с сайта…………………………………………………………………. 352

15.4.3. Контроллер PasswordChangeView: смена пароля…………………………………………………. 354

15.4.4. Контроллер PasswordChangeDoneView: уведомление об успешной смене пароля 355

15.4.5. Контроллер PasswordResetView: отправка письма для сброса пароля……………….. 355

15.4.6. Контроллер PasswordResetDoneView: уведомление об отправке письма для сброса пароля              357

15.4.7. Контроллер PasswordResetConfirmView: собственно сброс пароля……………………. 358

15.4.8. Контроллер PasswordResetCompleteView: уведомление об успешном сбросе пароля……….. 359

15.5. Получение сведений о пользователях…………………………………………………………………………… 360

15.5.1. Получение сведений о текущем пользователе……………………………………………………….. 360

15.5.2. Получение пользователей, обладающих заданным правом………………………………… 363

15.6. Авторизация…………………………………………………………………………………………………………………….. 364

15.6.1. Авторизация в контроллерах…………………………………………………………………………………… 364

15.6.1.1. Авторизация в контроллерах-функциях: непосредственные проверки……. 364

15.6.1.2. Авторизация в контроллерах-функциях: применение декораторов…………. 365

15.6.1.3. Авторизация в контроллерах-классах………………………………………………………… 367

15.6.2. Авторизация в шаблонах…………………………………………………………………………………………. 369

Часть III. Расширенные инструменты
и дополнительные библиотеки…………………………………………….. 371

Глава 16. Модели: расширенные инструменты…………………………………….. 373

16.1. Управление выборкой полей…………………………………………………………………………………………. 373

16.2. Связи «многие-со-многими» с дополнительными данными………………………………………… 377

16.3. Полиморфные связи………………………………………………………………………………………………………… 380

16.4. Наследование моделей…………………………………………………………………………………………………… 384

16.4.1. Прямое наследование моделей………………………………………………………………………………… 384

16.4.2. Абстрактные модели………………………………………………………………………………………………… 386

16.4.3. Прокси-модели………………………………………………………………………………………………………….. 387

16.5. Создание своих диспетчеров записей…………………………………………………………………………… 388

16.5.1. Создание диспетчеров записей……………………………………………………………………………….. 388

16.5.2. Создание диспетчеров обратной связи…………………………………………………………………… 390

16.6. Создание своих наборов записей………………………………………………………………………………….. 391

16.7. Управление транзакциями……………………………………………………………………………………………… 393

16.7.1. Автоматическое управление транзакциями…………………………………………………………… 393

16.7.1.1. Режим по умолчанию: каждая операция — в отдельной транзакции………. 394

16.7.1.2. Режим атомарных запросов…………………………………………………………………………. 394

16.7.1.3. Режим по умолчанию на уровне контроллера……………………………………………. 395

16.7.1.4. Режим атомарных запросов на уровне контроллера…………………………………. 395

16.7.2. Ручное управление транзакциями…………………………………………………………………………… 397

16.7.3. Обработка подтверждения транзакции………………………………………………………………….. 399

Глава 17. Формы и наборы форм: расширенные инструменты и дополнительная библиотека  400

17.1. Формы, не связанные с моделями………………………………………………………………………………….. 400

17.2. Наборы форм, не связанные с моделями………………………………………………………………………. 401

17.3. Расширенные средства для вывода форм и наборов форм…………………………………………. 403

17.3.1. Указание CSS-стилей у форм…………………………………………………………………………………… 403

17.3.2. Настройка выводимых форм……………………………………………………………………………………. 403

17.3.3. Настройка наборов форм…………………………………………………………………………………………. 404

17.3.4. Шаблоны форм, наборов форм и элементов управления……………………………………… 405

17.3.4.1. Шаблоны форм………………………………………………………………………………………………. 406

17.3.4.2. Шаблоны наборов форм……………………………………………………………………………….. 408

17.3.4.3. Шаблоны элементов управления…………………………………………………………………. 408

17.4. Библиотека Django Simple Captcha: поддержка CAPTCHA……………………………………….. 410

17.4.1. Установка Django Simple Captcha…………………………………………………………………………… 411

17.4.2. Использование Django Simple Captcha…………………………………………………………………… 411

17.4.3. Настройка Django Simple Captcha………………………………………………………………………….. 413

17.4.4. Дополнительные команды captcha_clean и captcha_create_pool………………………… 414

17.5. Дополнительные настройки проекта, имеющие отношение к формам……………………… 415

Глава 18. Поддержка баз данных PostgreSQL
и библиотека django-localflavor…………………………………………………………….. 416

18.1. Дополнительные инструменты для поддержки PostgreSQL………………………………………… 416

18.1.1. Объявление моделей для работы с PostgreSQL………………………………………………………. 416

18.1.1.1. Поля, специфические для PostgreSQL…………………………………………………………… 416

18.1.1.2. Индексы PostgreSQL………………………………………………………………………………………. 419

18.1.1.3. Операционные выражения……………………………………………………………………………. 421

18.1.1.4. Условие ExclusionConstraint………………………………………………………………………… 422

18.1.1.5. Расширения PostgreSQL………………………………………………………………………………… 424

18.1.1.6. Валидаторы PostgreSQL……………………………………………………………………………….. 425

18.1.2. Запись и выборка данных в PostgreSQL………………………………………………………………….. 427

18.1.2.1. Запись и выборка значений полей в PostgreSQL…………………………………………. 427

18.1.2.2. Фильтрация записей в PostgreSQL……………………………………………………………….. 430

18.1.3. Агрегатные функции PostgreSQL……………………………………………………………………………… 435

18.1.4. Функции СУБД, специфичные для PostgreSQL……………………………………………………….. 438

18.1.5. Вложенные запросы PostgreSQL……………………………………………………………………………… 438

18.1.6. Полнотекстовая фильтрация PostgreSQL………………………………………………………………… 439

18.1.6.1. Модификатор search……………………………………………………………………………………… 439

18.1.6.2. Функции СУБД для полнотекстовой фильтрации………………………………………. 440

18.1.6.3. Функции СУБД для фильтрации по похожим словам………………………………… 445

18.1.7. Создание форм для работы с PostgreSQL……………………………………………………………….. 447

18.1.7.1. Поля форм, специфические для PostgreSQL…………………………………………………. 447

18.1.7.2. Элементы управления, специфические для PostgreSQL……………………………… 449

18.2. Библиотека django-localflavor: дополнительные поля для моделей и форм……………… 449

18.2.1. Установка django-localflavor……………………………………………………………………………………. 450

18.2.2. Поля модели, предоставляемые django-localflavor………………………………………………… 450

18.2.3. Поля формы, предоставляемые django-localflavor…………………………………………………. 451

18.2.4. Элементы управления, предоставляемые django-localflavor………………………………… 451

Глава 19. Шаблоны: расширенные инструменты
и дополнительные библиотеки…………………………………………………………….. 452

19.1. Библиотека django-precise-bbcode: поддержка BBCode……………………………………………… 452

19.1.1. Установка django-precise-bbcode…………………………………………………………………………….. 452

19.1.2. Поддерживаемые BBCode-теги……………………………………………………………………………….. 453

19.1.3. Обработка BBCode…………………………………………………………………………………………………… 454

19.1.3.1. Обработка BBCode при выводе…………………………………………………………………… 454

19.1.3.2. Хранение BBCode в модели…………………………………………………………………………. 455

19.1.4. Создание дополнительных BBCode-тегов……………………………………………………………… 456

19.1.5. Создание графических смайликов…………………………………………………………………………… 458

19.1.6. Настройка django-precise-bbcode…………………………………………………………………………….. 458

19.2. Библиотека django-bootstrap5: интеграция с Bootstrap 5……………………………………………. 459

19.2.1. Установка django-bootstrap5……………………………………………………………………………………. 460

19.2.2. Использование django-bootstrap5……………………………………………………………………………. 460

19.2.3. Настройка django-bootstrap5…………………………………………………………………………………… 465

19.3. Написание своих фильтров и тегов……………………………………………………………………………….. 467

19.3.1. Организация исходного кода…………………………………………………………………………………… 467

19.3.2. Написание фильтров………………………………………………………………………………………………… 467

19.3.2.1. Написание и использование простейших фильтров………………………………….. 467

19.3.2.2. Управление заменой недопустимых знаков HTML……………………………………. 469

19.3.3. Написание тегов……………………………………………………………………………………………………….. 470

19.3.3.1. Написание тегов, выводящих элементарные значения……………………………… 470

19.3.3.2. Написание шаблонных тегов……………………………………………………………………….. 472

19.3.4. Регистрация фильтров и тегов………………………………………………………………………………….. 473

19.4. Переопределение шаблонов………………………………………………………………………………………….. 474

Глава 20. Обработка выгруженных файлов…………………………………………. 476

20.1. Подготовка подсистемы обработки выгруженных файлов………………………………………… 476

20.1.1. Настройка подсистемы обработки выгруженных файлов……………………………………. 476

20.1.2. Указание маршрута для выгруженных файлов……………………………………………………… 478

20.2. Хранение файлов в моделях…………………………………………………………………………………………… 479

20.2.1. Типы полей модели, предназначенные для хранения файлов……………………………… 479

20.2.2. Поля форм, валидаторы и элементы управления, служащие для указания файлов 481

20.2.3. Обработка выгруженных файлов……………………………………………………………………………. 482

20.2.4. Вывод выгруженных файлов……………………………………………………………………………………. 484

20.2.5. Удаление выгруженного файла……………………………………………………………………………….. 485

20.3. Хранение путей к файлам в моделях…………………………………………………………………………….. 485

20.4. Низкоуровневые средства для сохранения выгруженных файлов…………………………….. 486

20.4.1. Класс UploadedFile: выгруженный файл. Сохранение выгруженных файлов……. 486

20.4.2. Вывод выгруженных файлов низкоуровневыми средствами………………………………… 488

20.5. Библиотека django-cleanup: автоматическое удаление ненужных файлов………………. 489

20.6. Библиотека easy-thumbnails: вывод миниатюр……………………………………………………………. 490

20.6.1. Установка easy-thumbnails………………………………………………………………………………………. 490

20.6.2. Настройка easy-thumbnails………………………………………………………………………………………. 491

20.6.2.1. Пресеты миниатюр………………………………………………………………………………………… 491

20.6.2.2. Остальные настройки библиотеки………………………………………………………………. 493

20.6.3. Вывод миниатюр в шаблонах………………………………………………………………………………….. 495

20.6.4. Хранение миниатюр в моделях……………………………………………………………………………….. 496

20.6.5. Дополнительная команда thumbnail_cleanup………………………………………………………… 497

Глава 21. Разграничение доступа: расширенные инструменты и дополнительная библиотека  498

21.1. Настройки проекта, касающиеся разграничения доступа…………………………………………. 498

21.2. Работа с пользователями……………………………………………………………………………………………….. 499

21.2.1. Создание пользователей………………………………………………………………………………………….. 499

21.2.2. Работа с паролями……………………………………………………………………………………………………. 499

21.3. Вход и выход…………………………………………………………………………………………………………………… 500

21.4. Валидация паролей………………………………………………………………………………………………………… 501

21.4.1. Стандартные валидаторы паролей………………………………………………………………………… 501

21.4.2. Написание своих валидаторов паролей…………………………………………………………………. 503

21.4.3. Выполнение валидации паролей…………………………………………………………………………….. 504

21.5. Библиотека Python Social Auth: регистрация и вход через социальные сети……………. 505

21.5.1. Создание приложения «ВКонтакте»……………………………………………………………………….. 505

21.5.2. Установка и настройка Python Social Auth…………………………………………………………….. 506

21.5.3. Использование Python Social Auth…………………………………………………………………………… 508

21.6. Создание своей модели пользователя…………………………………………………………………………… 508

21.7. Создание своих прав пользователя………………………………………………………………………………. 510

Глава 22. Посредники и обработчики контекста………………………………….. 511

22.1. Посредники……………………………………………………………………………………………………………………… 511

22.1.1. Стандартные посредники………………………………………………………………………………………… 511

22.1.2. Порядок выполнения посредников………………………………………………………………………….. 512

22.1.3. Написание своих посредников………………………………………………………………………………… 513

22.1.3.1. Посредники-функции…………………………………………………………………………………….. 513

22.1.3.2. Посредники-классы……………………………………………………………………………………….. 514

22.1.3.3. Асинхронные и универсальные посредники………………………………………………. 516

22.2. Обработчики контекста………………………………………………………………………………………………….. 519

Глава 23. Cookie, сессии, всплывающие сообщения
и подписывание данных………………………………………………………………………. 521

23.1. Cookie………………………………………………………………………………………………………………………………. 521

23.2. Сессии………………………………………………………………………………………………………………………………. 524

23.2.1. Настройка сессий……………………………………………………………………………………………………… 524

23.2.2. Использование сессий………………………………………………………………………………………………. 526

23.2.3. Дополнительная команда clearsessions………………………………………………………………….. 528

23.3. Всплывающие сообщения……………………………………………………………………………………………… 528

23.3.1. Настройка всплывающих сообщений…………………………………………………………………….. 528

23.3.2. Уровни всплывающих сообщений…………………………………………………………………………… 529

23.3.3. Создание всплывающих сообщений……………………………………………………………………….. 530

23.3.4. Вывод всплывающих сообщений……………………………………………………………………………. 531

23.3.5. Объявление своих уровней всплывающих сообщений………………………………………….. 533

23.4. Подписывание данных…………………………………………………………………………………………………… 533

Глава 24. Сигналы……………………………………………………………………………….. 537

24.1. Обработка сигналов……………………………………………………………………………………………………….. 537

24.1.1. Объявление обработчиков сигналов……………………………………………………………………….. 537

24.1.2. Явная привязка обработчиков к сигналам……………………………………………………………… 538

24.1.3. Неявная привязка обработчиков к сигналам………………………………………………………….. 539

24.1.4. Отмена привязки обработчиков к сигналам…………………………………………………………… 540

24.2. Встроенные сигналы Django………………………………………………………………………………………….. 540

24.3. Объявление своих сигналов…………………………………………………………………………………………… 545

Глава 25. Отправка электронных писем………………………………………………. 547

25.1. Настройка подсистемы отправки электронных писем……………………………………………….. 547

25.2. Низкоуровневые инструменты для отправки писем……………………………………………………. 549

25.2.1. Класс EmailMessage: обычное электронное письмо……………………………………………… 549

25.2.2. Формирование писем на основе шаблонов…………………………………………………………….. 551

25.2.3. Использование соединений. Массовая рассылка писем……………………………………….. 551

25.2.4. Класс EmailMultiAlternatives: составное письмо…………………………………………………… 552

25.3. Высокоуровневые инструменты для отправки писем…………………………………………………. 553

25.3.1. Отправка писем по произвольным адресам……………………………………………………………. 553

25.3.2. Отправка писем зарегистрированным пользователям………………………………………….. 554

25.3.3. Отправка писем администраторам и редакторам сайта………………………………………. 555

25.4. Отправка тестового электронного письма……………………………………………………………………. 556

Глава 26. Кеширование………………………………………………………………………… 557

26.1. Кеширование на стороне сервера…………………………………………………………………………………. 557

26.1.1. Подготовка подсистемы кеширования на стороне сервера………………………………….. 557

26.1.1.1. Настройка подсистемы кеширования на стороне сервера……………………….. 557

26.1.1.2. Создание таблицы для хранения кеша……………………………………………………….. 562

26.1.2. Высокоуровневые средства кеширования……………………………………………………………… 562

26.1.2.1. Кеширование всего веб-сайта………………………………………………………………………. 562

26.1.2.2. Кеширование на уровне отдельных контроллеров……………………………………. 564

26.1.2.3. Управление кешированием…………………………………………………………………………… 564

26.1.3. Низкоуровневые средства кеширования………………………………………………………………… 565

26.1.3.1. Кеширование фрагментов веб-страниц……………………………………………………….. 566

26.1.3.2. Кеширование произвольных значений……………………………………………………….. 567

26.1.3.3. Асинхронные инструменты для кеширования произвольных значений….. 570

26.2. Кеширование на стороне клиента…………………………………………………………………………………. 570

26.2.1. Автоматическая обработка заголовков………………………………………………………………….. 570

26.2.2. Управление кешированием в контроллерах…………………………………………………………… 571

26.2.2.1. Условная обработка запросов……………………………………………………………………… 571

26.2.2.2. Прямое указание параметров кеширования……………………………………………….. 573

26.2.2.3. Запрет кеширования……………………………………………………………………………………… 573

26.2.3. Управление кешированием в посредниках…………………………………………………………….. 574

Глава 27. Локализация…………………………………………………………………………. 576

27.1. Локализация строк………………………………………………………………………………………………………….. 576

27.1.1. Пометка локализуемых строк………………………………………………………………………………….. 576

27.1.1.1. Пометка локализуемых строк в коде шаблонов…………………………………………. 577

27.1.1.2. Пометка локализуемых строк в Python-коде………………………………………………. 579

27.1.2. Создание языковых модулей……………………………………………………………………………………. 582

27.1.2.1. Генерирование языковых модулей………………………………………………………………. 582

27.1.2.2. Перевод локализуемых строк………………………………………………………………………. 583

27.1.2.3. Компиляция языковых модулей…………………………………………………………………… 585

27.1.3. Переключение веб-сайта на требуемый язык…………………………………………………………. 586

27.1.3.1. Автоматическое переключение на требуемый язык…………………………………… 586

27.1.3.2. Вывод сведений о поддерживаемых языках……………………………………………….. 587

27.1.3.3. Создание языковых редакций веб-сайта…………………………………………………….. 589

27.1.3.4. Переключение на требуемый язык без создания языковых редакций
веб-сайта……………………………………………………………………………………………………………………….. 591

27.1.4. Дополнительные инструменты для локализации строк………………………………………… 593

27.1.5. Настройка локализации строк………………………………………………………………………………… 593

27.2. Локализация форматов…………………………………………………………………………………………………… 595

27.3. Локализация временнх зон………………………………………………………………………………………….. 596

27.3.1. Реализация переключения веб-сайта на требуемую временню зону…………………. 596

27.3.2. Вывод значений времени и временнх отметок в разных временнх зонах………. 598

Глава 28. Административный веб-сайт Django…………………………………….. 601

28.1. Подготовка административного веб-сайта к работе…………………………………………………… 601

28.2. Регистрация моделей на административном веб-сайте………………………………………………. 602

28.3. Редакторы моделей…………………………………………………………………………………………………………. 603

28.3.1. Параметры списка записей………………………………………………………………………………………. 603

28.3.1.1. Параметры списка записей: состав выводимого списка……………………………. 603

28.3.1.2. Параметры списка записей: фильтрация и сортировка…………………………….. 608

28.3.1.3. Параметры списка записей: прочие…………………………………………………………….. 612

28.3.2. Параметры страниц добавления и правки записей……………………………………………….. 614

28.3.2.1. Параметры страниц добавления и правки записей:
набор выводимых полей……………………………………………………………………………………………… 614

28.3.2.2. Параметры страниц добавления и правки записей: элементы управления 617

28.3.2.3. Параметры страниц добавления и правки записей: прочие……………………… 620

28.3.3. Регистрация редакторов на административном веб-сайте…………………………………… 621

28.4. Встроенные редакторы………………………………………………………………………………………………….. 622

28.4.1. Объявление встроенного редактора……………………………………………………………………….. 622

28.4.2. Параметры встроенного редактора………………………………………………………………………… 622

28.4.3. Регистрация встроенного редактора………………………………………………………………………. 624

28.5. Действия…………………………………………………………………………………………………………………………… 625

Глава 29. Разработка веб-служб REST.
Библиотека Django REST framework…………………………………………………….. 628

29.1. Установка и подготовка к работе Django REST framework………………………………………… 629

29.2. Введение в Django REST framework. Вывод данных…………………………………………………… 631

29.2.1. Сериализаторы…………………………………………………………………………………………………………. 631

29.2.2. Веб-представление JSON………………………………………………………………………………………….. 632

29.2.3. Вывод данных на стороне клиента…………………………………………………………………………. 634

29.2.4. Первый принцип REST: идентификация ресурса по интернет-адресу………………… 635

29.3. Ввод и правка данных……………………………………………………………………………………………………. 637

29.3.1. Второй принцип REST: идентификация действия по HTTP-методу…………………….. 637

29.3.2. Парсеры веб-форм…………………………………………………………………………………………………….. 641

29.4. Контроллеры-классы Django REST framework……………………………………………………………. 642

29.4.1. Контроллер-класс низкого уровня………………………………………………………………………….. 642

29.4.2. Контроллеры-классы высокого уровня: комбинированные и простые……………….. 643

29.5. Метаконтроллеры…………………………………………………………………………………………………………… 644

29.6. Разграничение доступа в Django REST framework……………………………………………………… 646

29.6.1. Третий принцип REST: данные клиента хранятся на стороне клиента………………. 646

29.6.2. Классы разграничения доступа………………………………………………………………………………. 647

Глава 30. Средства журналирования……………………………………………………. 649

30.1. Настройка подсистемы журналирования…………………………………………………………………….. 649

30.2. Объект сообщения…………………………………………………………………………………………………………… 650

30.3. Форматировщики……………………………………………………………………………………………………………. 651

30.4. Фильтры…………………………………………………………………………………………………………………………… 652

30.5. Обработчики……………………………………………………………………………………………………………………. 653

30.6. Регистраторы…………………………………………………………………………………………………………………… 658

30.7. Пример настройки подсистемы журналирования……………………………………………………….. 660

Глава 31. Публикация веб-сайта………………………………………………………….. 663

31.1. Подготовка веб-сайта к публикации…………………………………………………………………………….. 663

31.1.1. Написание шаблонов веб-страниц с сообщениями об ошибках………………………….. 663

31.1.2. Указание настроек эксплуатационного режима……………………………………………………. 664

31.1.3. Удаление ненужных данных……………………………………………………………………………………. 666

31.1.4. Окончательная проверка веб-сайта………………………………………………………………………… 666

31.1.5. Настройка веб-сайта для работы по протоколу HTTPS……………………………………….. 668

31.2. Публикация веб-сайта……………………………………………………………………………………………………. 672

31.2.1. Публикация посредством Uvicorn……………………………………………………………………………. 672

31.2.1.1. Подготовка веб-сайта к публикации посредством Uvicorn……………………….. 673

31.2.1.2. Запуск и остановка Uvicorn………………………………………………………………………….. 674

31.2.2. Другие варианты публикации…………………………………………………………………………………. 675

Часть IV. Практическое занятие: разработка веб-сайта.. 677

Глава 32. Дизайн. Вспомогательные веб-страницы………………………………. 679

32.1. План веб-сайта………………………………………………………………………………………………………………… 679

32.2. Подготовка проекта и приложения main………………………………………………………………………. 680

32.2.1. Создание и настройка проекта………………………………………………………………………………… 680

32.2.2. Создание и настройка приложения main………………………………………………………………… 681

32.3. Базовый шаблон……………………………………………………………………………………………………………… 681

32.4. Главная веб-страница…………………………………………………………………………………………………….. 688

32.5. Вспомогательные веб-страницы……………………………………………………………………………………. 690

Глава 33. Работа с пользователями и разграничение доступа………………. 693

33.1. Модель пользователя……………………………………………………………………………………………………… 693

33.2. Основные веб-страницы: входа, профиля и выхода……………………………………………………. 695

33.2.1. Веб-страница входа………………………………………………………………………………………………….. 695

33.2.2. Веб-страница пользовательского профиля…………………………………………………………….. 697

33.2.3. Реализация выхода…………………………………………………………………………………………………… 698

33.3. Веб-страницы правки личных данных пользователя………………………………………………….. 699

33.3.1. Веб-страница правки основных сведений………………………………………………………………. 699

33.3.2. Веб-страница правки пароля…………………………………………………………………………………… 702

33.4. Веб-страницы регистрации и активации пользователей…………………………………………….. 703

33.4.1. Веб-страницы регистрации нового пользователя………………………………………………….. 703

33.4.1.1. Форма для занесения сведений о новом пользователе………………………………. 703

33.4.1.2. Средства для регистрации пользователя……………………………………………………. 705

33.4.1.3. Средства для отправки писем с требованиями активации………………………… 707

33.4.2. Веб-страницы активации пользователя………………………………………………………………….. 709

33.5. Веб-страница удаления пользователя………………………………………………………………………….. 711

33.6. Инструменты для администрирования пользователей……………………………………………….. 713

Глава 34. Рубрики………………………………………………………………………………… 715

34.1. Модели рубрик……………………………………………………………………………………………………………….. 715

34.1.1. Базовая модель рубрик…………………………………………………………………………………………….. 715

34.1.2. Модель надрубрик……………………………………………………………………………………………………. 716

34.1.3. Модель подрубрик……………………………………………………………………………………………………. 717

34.2. Инструменты для администрирования рубрик……………………………………………………………. 718

34.3. Вывод списка рубрик в вертикальной панели навигации…………………………………………… 719

Глава 35. Объявления………………………………………………………………………….. 722

35.1. Подготовка к обработке выгруженных файлов……………………………………………………………. 722

35.2. Модели объявлений и дополнительных иллюстраций……………………………………………….. 723

35.2.1. Модель самих объявлений……………………………………………………………………………………….. 723

35.2.2. Модель дополнительных иллюстраций…………………………………………………………………. 726

35.2.3. Реализация удаления объявлений в модели пользователя……………………………………. 726

35.3. Инструменты для администрирования объявлений…………………………………………………….. 727

35.4. Вывод объявлений………………………………………………………………………………………………………….. 727

35.4.1. Вывод списка объявлений………………………………………………………………………………………… 728

35.4.1.1. Форма поиска и контроллер списка объявлений……………………………………….. 728

35.4.1.2. Реализация корректного возврата……………………………………………………………….. 729

35.4.1.3. Шаблон веб-страницы списка объявлений…………………………………………………. 731

35.4.2. Веб-страница сведений о выбранном объявлении………………………………………………… 734

35.4.3. Вывод последних 10 объявлений на главной веб-странице…………………………………. 738

35.5. Работа с объявлениями…………………………………………………………………………………………………… 738

35.5.1. Вывод объявлений, оставленных текущим пользователем…………………………………… 738

35.5.2. Добавление, правка и удаление объявлений………………………………………………………….. 739

Глава 36. Комментарии………………………………………………………………………… 743

36.1. Подготовка к выводу CAPTCHA……………………………………………………………………………………. 743

36.2. Модель комментария……………………………………………………………………………………………………… 744

36.3. Вывод и добавление комментариев………………………………………………………………………………. 745

36.4. Отправка уведомлений о новых комментариях…………………………………………………………… 748

Глава 37. Веб-служба REST………………………………………………………………….. 750

37.1. Веб-служба……………………………………………………………………………………………………………………… 750

37.1.1. Подготовка к разработке веб-службы…………………………………………………………………….. 750

37.1.2. Список объявлений…………………………………………………………………………………………………… 751

37.1.3. Сведения о выбранном объявлении………………………………………………………………………… 752

37.1.4. Вывод и добавление комментариев………………………………………………………………………… 753

37.2. Тестовый фронтенд…………………………………………………………………………………………………………. 755

37.2.1. Введение в Angular……………………………………………………………………………………………………. 755

37.2.2. Подготовка к разработке фронтенда………………………………………………………………………. 756

37.2.3. Метамодуль приложения AppModule. Маршрутизация в Angular……………………….. 757

37.2.4. Компонент приложения AppComponent………………………………………………………………….. 761

37.2.5. Служба BbService. Внедрение зависимостей. Объекты-обещания………………………. 762

37.2.6. Компонент списка объявлений BbListComponent. Директивы. Фильтры. Связывание данных            766

37.2.7. Компонент сведений об объявлении BbDetailComponent.
Двустороннее связывание данных………………………………………………………………………………………. 770

Заключение………………………………………………………………………………………….. 775

Приложение. Описание электронного архива………………………………………. 777

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

 

Дронов Владимир Александрович, профессиональный программист, писатель и журналист, работает с компьютерами с 1987 года. Автор более 30 популярных компьютерных книг, в том числе «Django 2.1. Практика создания веб-сайтов на Python», “HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера“, «Python 3. Самое необходимое», «Python 3 и PyQt 5. Разработка приложений», “Laravel. Быстрая разработка современных динамических Web-сайтов на PHP, MySQL, HTML и CSS“, “Angular 4. Быстрая разработка сверхдинамических Web-сайтов на TypeScript и PHP” и книг по продуктам Adobe Flash и Adobe Dreamweaver различных версий. Его статьи публикуются в журналах “Мир ПК” и “ИнтерФейс” (Израиль) и интернет-порталах “IZ City” и “TheVista.ru”.

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

Представляем книгу “Практическая робототехника. C++ и Raspberry Pi”

Практическая робототехника. C++ и Raspberry Pi

Рассказано о технологии создания автономных роботов на базе одноплатного компьютера Raspberry Pi и о разработке программ для них на языке С++. Показаны принципы написания и даны примеры кода для контроллера привода двигателя, продемонстрированы способы использования датчиков для обнаружения препятствий и построения карт на основе данных лидара. Описаны методы разработки собственных алгоритмов автономного планирования траектории движения, приведен код для автоматической отправки путевых точек контроллеру привода. Рассмотрены библиотеки С++ для написания программ картографии и навигации автономных роботов, даны сведения об использовании контактов аппаратного интерфейса Raspberry Pi GPIO.
Электронный архив на сайте издательства содержит код описанных в книге программ.

Для интересующихся робототехникой

 

В книге представлены исчерпывающие знания по электронике, аппаратному и программному обеспечению для создания настоящих роботов на базе одноплатного компьютера Raspberry Pi.

Вы узнаете как:

  •  использовать датчики для обнаружения препятствий;
  • обучить робота строить карту и планировать траекторию движения;
  • структурировать код на С++, чтобы он получился модульным и взаимозаменяемым с другими проектами по созданию роботов.
  • использовать контакты аппаратного интерфейса Raspberry Pi GPIO и существующие библиотеки С++, чтобы создать полностью автономного программируемого робота на самой доступной компьютерной платформе.

Вы научитесь:

• Писать код для контроллера привода двигателя
• Строить карты на основе данных лидара
• Создавать собственные алгоритмы автономного планирования траектории движения
• Писать код для автоматической отправки путевых точек контроллеру привода
• Создавать программы картографии и навигации для автономных роботов

Книгу “Практическая робототехника. C++ и Raspberry Pi” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Об авторе……………………………………………………………………………………………….. 16

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

Предисловие…………………………………………………………………………………………… 18

Вступительное слово………………………………………………………………………………. 21

Введение………………………………………………………………………………………………… 23

Часть I. Введение в компьютеры для робототехники…….. 25

Глава 1. Выбор и настройка компьютера для робота……………………………… 27

Что такое Raspberry Pi?……………………………………………………………………………………………………………… 27

В чем же разница?……………………………………………………………………………………………………………… 28

Значит, Raspberry Pi — единственный вариант контроллера для управления роботом?    28

Разве Raspberry Pi не предназначен для школ, энтузиастов-электронщиков и игрушек? Я хотел узнать о настоящей робототехнике…………………………………………………………………………………………………………… 29

Какие модели Raspberry Pi существуют и почему не все из них подходят
для наших целей?………………………………………………………………………………………………………………………. 29

Raspberry Pi Zero и Raspberry Pi ZeroW…………………………………………………………………………….. 31

Raspberry Pi 2B……………………………………………………………………………………………………………………. 31

Raspberry Pi 3B — лучший выбор!……………………………………………………………………………………. 32

Raspberry Pi 3B+…………………………………………………………………………………………………………………. 32

Новая модель Raspberry Pi 4……………………………………………………………………………………………… 33

Выбор операционной системы…………………………………………………………………………………………………. 33

Raspbian………………………………………………………………………………………………………………………………. 34

Ubuntu…………………………………………………………………………………………………………………………………. 34

Установка и настройка операционной системы…………………………………………………………………….. 35

Установка полной Ubuntu Desktop на ноутбук или настольный ПК…………………………….. 36

Установка Lubuntu на Raspberry Pi………………………………………………………………………………….. 36

Установка и настройка интегрированной среды разработки (IDE)……………………………………… 40

Visual studio Code для ноутбука или настольного ПК……………………………………………………. 40

Code Blocks для Raspberry Pi…………………………………………………………………………………………….. 41

Заключение………………………………………………………………………………………………………………………………… 42

Вопросы……………………………………………………………………………………………………………………………………… 42

Глава 2. Назначение и использование контактов интерфейса GPIO………. 43

Общие сведения о GPIO…………………………………………………………………………………………………………….. 43

Что такое интерфейс GPIO………………………………………………………………………………………………………… 43

Какие же именно функции выполняет GPIO?…………………………………………………………………… 45

Электроника для программистов…………………………………………………………………………….. 45

Типы выходных данных…………………………………………………………………………………………… 50

Типы входных данных……………………………………………………………………………………………… 52

Некоторые распространенные радиодетали…………………………………………………………. 53

Контакты GPIO в качестве выходов………………………………………………………………………… 57

Две системы нумерации контактов GPIO……………………………………………………………….. 58

Контакты GPIO в качестве входов…………………………………………………………………………… 59

Как получить доступ к контактам GPIO Raspberry Pi с помощью программ на C++…………… 61

Библиотека PIGPIO……………………………………………………………………………………………………………………. 62

Установка и настройка библиотеки PIGPIO……………………………………………………………………. 62

Удостоверимся, что Code::Blocks может обращаться к PIGPIO…………………………… 63

Запуск программ PIGPIO………………………………………………………………………………………….. 64

Наш первый проект — hello_blink…………………………………………………………………………… 64

Цифровой вход, управляющий цифровым выходом — hello_button……………………. 67

Функции обратного вызова для обработки событий GPIO…………………………………… 68

Заключение………………………………………………………………………………………………………………………………… 71

Часть II. Начинаем проектировать робота………………………….. 73

Глава 3. Платформа для робота……………………………………………………………… 75

Общие сведения………………………………………………………………………………………………………………………….. 75

Габаритные размеры и режим эксплуатации…………………………………………………………………………. 76

Что лучше — дифференциальный рулевой привод или привод Аккермана?………………………. 78

Дифференциальный рулевой привод……………………………………………………………………………….. 78

Рулевой привод Аккермана……………………………………………………………………………………………….. 79

Готовые платформы для роботов…………………………………………………………………………………………….. 79

Большие готовые платформы……………………………………………………………………………………………. 79

Маленькие готовые роботы………………………………………………………………………………………………. 80

Советы по созданию собственного робота……………………………………………………………………………… 82

Материалы для конструирования……………………………………………………………………………………. 82

Аккумуляторы…………………………………………………………………………………………………………… 83

Ходовая часть……………………………………………………………………………………………………………. 83

Где найти детали для роботов…………………………………………………………………………………. 84

Перепрофилирование роботов-пылесосов или автомобилей с дистанционным управлением 85

Роботы-пылесосы с интерфейсом…………………………………………………………………………………….. 86

Взаимодействие с Roomba………………………………………………………………………………………. 87

“Разморозка” Roomba………………………………………………………………………………………………. 90

Роботы-пылесосы без интерфейса……………………………………………………………………………………. 91

Перепрофилирование автомобилей и грузовиков с дистанционным управлением…………….. 92

Заключение………………………………………………………………………………………………………………………………… 94

Вопросы……………………………………………………………………………………………………………………………………… 94

Глава 4. Типы двигателей для роботов и управление двигателями………… 95

Общие сведения………………………………………………………………………………………………………………………….. 95

Типы двигателей………………………………………………………………………………………………………………………… 95

Сравнение двигателей переменного (AC) и постоянного (DC) токов……………………………. 96

Щеточные двигатели постоянного тока…………………………………………………………………………… 97

Сервоприводы…………………………………………………………………………………………………………………….. 98

Шаговые двигатели……………………………………………………………………………………………………………. 99

Бесщеточные двигатели постоянного тока (BLDC)……………………………………………………… 100

Принципы работы транзистора и контроллеры двигателей……………………………………………….. 100

Простейший способ управления: включено/выключено……………………………………………… 101

Транзисторы…………………………………………………………………………………………………………………….. 102

Широтно-импульсная модуляция (ШИМ)……………………………………………………………………… 105

ШИМ для создания аналоговых напряжений………………………………………………………. 105

ШИМ в качестве управляющего сигнала……………………………………………………………… 106

Драйверы и контроллеры двигателей……………………………………………………………………………. 107

Драйверы двигателей……………………………………………………………………………………………… 108

Управление двигателями с помощью драйвера двигателя на основе
двойного Н-моста L298N……………………………………………………………………………………….. 109

Контроллеры двигателей……………………………………………………………………………………….. 112

Заключение………………………………………………………………………………………………………………………………. 113

Вопросы……………………………………………………………………………………………………………………………………. 114

Бонусное задание…………………………………………………………………………………………………………………….. 114

Глава 5. Связь с датчиками и другими устройствами…………………………… 115

Общие сведения……………………………………………………………………………………………………………………….. 115

Двоичные (логические) сигналы…………………………………………………………………………………………….. 115

Выключатели с защитой от дребезга контактов…………………………………………………………………… 116

Колесные энкодеры…………………………………………………………………………………………………………………. 117

Двоичные сигналы от аналоговых датчиков………………………………………………………………………… 118

Сводная информация о передаче данных с помощью двоичных сигналов……………………….. 119

Передача данных через последовательный интерфейс……………………………………………………….. 119

Последовательная передача данных с помощью UART……………………………………………………… 119

Настройка Raspberry Pi и тестирование последовательной передачи данных
через UART………………………………………………………………………………………………………………………………. 121

Устранение ошибки при открытии последовательного порта…………………………………….. 124

Передача данных через последовательную шину I2C………………………………………………………… 124

Настройка и использование устройства I2C с Raspberry Pi………………………………………… 126

Пример и тестовая программа: hello_i2c_lsm303…………………………………………………………………. 127

Заключение………………………………………………………………………………………………………………………………. 130

Вопросы……………………………………………………………………………………………………………………………………. 131

Глава 6. Дополнительное оборудование……………………………………………….. 132

Общие сведения……………………………………………………………………………………………………………………….. 132

Источники питания………………………………………………………………………………………………………………….. 132

Источники питания напряжением 5 В……………………………………………………………………………. 133

Регулируемые источники питания………………………………………………………………………………….. 133

Релейные блоки………………………………………………………………………………………………………………………… 134

Преобразователи логических уровней………………………………………………………………………………….. 135

Преобразователи интерфейса (FTDI)…………………………………………………………………………………….. 136

Микроконтроллеры Arduino…………………………………………………………………………………………………… 137

Микроконтроллеры Digispark…………………………………………………………………………………………………. 137

Заключение………………………………………………………………………………………………………………………………. 138

Вопросы……………………………………………………………………………………………………………………………………. 138

Глава 7. Установка компьютера, управляющего роботом……………………. 139

Общие сведения……………………………………………………………………………………………………………………….. 139

Последовательность шагов…………………………………………………………………………………………………….. 140

Установка компьютера и подача питания на него……………………………………………………………….. 140

Соединение компьютера с остальными частями робота…………………………………………………….. 141

Заключение………………………………………………………………………………………………………………………………. 143

Вопросы……………………………………………………………………………………………………………………………………. 144

Часть III. Логика функционирования робота…………………… 145

Глава 8. Стратегия управления роботом………………………………………………. 147

Общие сведения……………………………………………………………………………………………………………………….. 147

Управление роботом: верхний и нижний уровни…………………………………………………………………. 147

Основной контур управления…………………………………………………………………………………………………. 149

Наблюдение и сравнение………………………………………………………………………………………………………… 149

Реагирование……………………………………………………………………………………………………………………. 150

Воздействие………………………………………………………………………………………………………………………. 150

Контроллеры с разомкнутым и замкнутым контуром управления…………………………………….. 153

Разработка контроллеров верхнего уровня (главных контроллеров)………………………………… 154

Разработка контроллеров нижнего уровня (технологических контроллеров)………………….. 156

Двухпозиционные контроллеры (регуляторы типа включено-выключено)……………….. 157

Пропорциональные контроллеры………………………………………………………………………………….. 157

Проектирование контроллеров, допускающих некоторую погрешность…………………… 161

Установка минимального значения выходного сигнала……………………………………………… 161

За рамками пропорциональных контроллеров…………………………………………………………….. 162

Заключение………………………………………………………………………………………………………………………………. 163

Вопросы……………………………………………………………………………………………………………………………………. 163

Глава 9. Организация совместной работы компонентов………………………. 164

Общие сведения……………………………………………………………………………………………………………………….. 164

Что такое операционная система для роботов?……………………………………………………………………. 165

ROS или создание собственного ПО для управления роботами?……………………………………….. 165

ROS и область коммерческой робототехники………………………………………………………………………. 166

Установка ROS…………………………………………………………………………………………………………………………. 167

Установка ROS Melodic на ноутбуке или настольном компьютере……………………………. 167

Установка ROS Kinetic на Raspberry Pi 3B…………………………………………………………………….. 168

Быстрое тестирование ROS…………………………………………………………………………………………….. 170

Краткий экскурс в ROS……………………………………………………………………………………………………………. 171

Пакеты, узлы, издатели, подписчики, топики и сообщения…………………………………………. 171

Полезные приемы…………………………………………………………………………………………………………………….. 177

Создание и написание пакетов и узлов ROS…………………………………………………………………………. 178

Файловая система ROS……………………………………………………………………………………………………. 178

Создание пакетов ROS…………………………………………………………………………………………………….. 178

Написание программ ROS (узлов)………………………………………………………………………………….. 180

Загрузка, просмотр и запуск программ, скачанных для этой главы…………………………… 186

Как облегчить жизнь с помощью файлов roslaunch и .launch……………………………………………… 187

Заключение………………………………………………………………………………………………………………………………. 188

Вопросы……………………………………………………………………………………………………………………………………. 189

Глава 10. Карты для определения местоположения робота…………………… 190

Общие сведения……………………………………………………………………………………………………………………….. 190

Угол, курс, расстояние: общепринятые соглашения……………………………………………………………. 191

Получение данных с датчиков……………………………………………………………………………………………….. 193

Сетчатая карта занятости………………………………………………………………………………………………………. 194

Построение сетчатых карт занятости (OGM) с помощью данных, получаемых с датчиков 196

Маркировка занятых ячеек…………………………………………………………………………………………………….. 199

Маркировка свободных ячеек………………………………………………………………………………………………… 202

Заключительные шаги при составлении карты……………………………………………………………………. 202

Публикация карты в виде сообщения ROS……………………………………………………………………………. 203

Преобразования в ROS……………………………………………………………………………………………………………. 204

Для чего нужны преобразования……………………………………………………………………………………. 205

Использование преобразований в ROS………………………………………………………………………….. 206

Публикация преобразований с помощью static transform publisher……………………………. 207

Публикация сообщений от узлов с помощью транслятора преобразований (transform broadcaster)        208

Получение данных о преобразованиях в узлах……………………………………………………………. 209

Просмотр данных о преобразовании из командной строки………………………………………… 211

Упрощение картографирования с помощью Gmapping……………………………………………………….. 211

Общие сведения о Gmapping…………………………………………………………………………………………… 212

Установка Gmapping……………………………………………………………………………………………………….. 212

Запуск Gmapping и задание параметров в файлах запуска…………………………………………. 212

Этапы создания карты…………………………………………………………………………………………………………….. 214

Визуализация создания карты в реальном времени…………………………………………………………….. 214

Сохранение карты и ее последующее использование…………………………………………………………. 216

Сохранение карт………………………………………………………………………………………………………………. 216

Загрузка ранее сохраненной карты……………………………………………………………………………….. 217

Заключение………………………………………………………………………………………………………………………………. 217

Вопросы……………………………………………………………………………………………………………………………………. 217

Глава 11. Отслеживание перемещений и локализация робота……………… 219

Общие сведения……………………………………………………………………………………………………………………….. 219

Поза робота……………………………………………………………………………………………………………………………… 220

Преобразование углов Эйлера в кватернионы……………………………………………………………… 221

Преобразование кватернионов в углы Эйлера……………………………………………………………… 223

Одометрия и точный расчет траектории……………………………………………………………………………….. 223

Колесная одометрия………………………………………………………………………………………………………… 224

Расчет расстояния, пройденного каждым колесом………………………………………………………. 227

Расчет общего расстояния, пройденного роботом……………………………………………………….. 228

Расчет изменения угла поворота тета……………………………………………………………………………. 228

Сложение величины изменения угла поворота с предыдущим значением угла поворота тета   229

Расчет расстояния, пройденного по осям x и y (преобразование координат)……………. 229

Прибавление полученных расстояний к соответствующим значениям предыдущей оценки позы            230

Публикация сообщения одометрии о новой позе для других узлов…………………… 230

Сохранение данных новой позы для использования в следующем цикле………… 230

Точный расчет траектории……………………………………………………………………………………………… 230

Публикация данных одометрии в ROS………………………………………………………………………………….. 232

Издатель сообщений о преобразованиях одометрии…………………………………………………… 234

Дальнейшее отслеживание перемещений робота и его локализация в пространстве………. 236

Инструмент для коррекции позы вручную…………………………………………………………………….. 236

Фидуциальные маркеры………………………………………………………………………………………………………….. 237

Локализация с помощью лазерного сканера………………………………………………………………………… 238

GPS и GNSS……………………………………………………………………………………………………………………………….. 239

Системы локализации на основе радиомаяков…………………………………………………………………….. 239

Заключение………………………………………………………………………………………………………………………………. 240

Вопросы……………………………………………………………………………………………………………………………………. 240

Глава 12. Автономное движение…………………………………………………………… 241

Общие сведения……………………………………………………………………………………………………………………….. 241

Обзор движения роботов в ROS……………………………………………………………………………………………… 241

Контроллер двигателя — simple_diff_drive.cpp……………………………………………………………………. 242

Шаги по созданию контроллера двигателя simple_diff_drive……………………………………… 243

Код контроллера двигателя дифференциального рулевого привода,
представленный в общем виде………………………………………………………………………………………… 244

Код контроллера двигателя дифференциального рулевого привода…………………………. 245

Контроллер привода — simple_drive_controller.cpp……………………………………………………………… 251

Шаги по созданию контроллера привода……………………………………………………………………… 251

Заключение………………………………………………………………………………………………………………………………. 256

Вопросы……………………………………………………………………………………………………………………………………. 256

Глава 13. Автономное планирование маршрута…………………………………… 257

Общие сведения……………………………………………………………………………………………………………………….. 257

Методы планирования маршрута и сопутствующие проблемы…………………………………………. 257

Проблемы………………………………………………………………………………………………………………………….. 258

Методы планирования маршрута………………………………………………………………………………….. 258

Увеличение границ вокруг препятствий………………………………………………………………………… 259

Карты затрат (costmap)…………………………………………………………………………………………………… 260

Пакет costmap_2d…………………………………………………………………………………………………………….. 260

Планирование маршрута с помощью алгоритма A*……………………………………………………. 263

Как работает алгоритм А*……………………………………………………………………………………………… 264

Пошаговый разбор алгоритма A*………………………………………………………………………………….. 266

Разбор процедуры А*………………………………………………………………………………………………………. 268

Написание программы A* как узла ROS……………………………………………………………………………….. 273

Стандартные вещи, вспомогательные функции и main()……………………………………………… 274

Сердце узла A*: функция find_path()……………………………………………………………………………… 284

Заключение………………………………………………………………………………………………………………………………. 289

Вопросы……………………………………………………………………………………………………………………………………. 289

Часть IV. Интерпретация данных,
поступающих с датчиков……………………………………………………….. 291

Глава 14. Колесные энкодеры для одометрии………………………………………. 293

Общие сведения……………………………………………………………………………………………………………………….. 293

Колесные энкодеры…………………………………………………………………………………………………………………. 293

Оптические энкодеры………………………………………………………………………………………………………………. 294

Энкодеры на датчиках Холла………………………………………………………………………………………………… 294

Подключение энкодеров…………………………………………………………………………………………………………. 295

Издатель сообщений об импульсах: tick_publisher.cpp………………………………………………………… 297

Код издателя сообщений об импульсах энкодера……………………………………………………………….. 298

Заключение………………………………………………………………………………………………………………………………. 302

Вопросы……………………………………………………………………………………………………………………………………. 302

Глава 15. Ультразвуковые датчики расстояния……………………………………. 303

Общие сведения……………………………………………………………………………………………………………………….. 303

Основная информация об ультразвуковом дальномере HC-SR04………………………………………. 304

Считывание показаний HC-SR04…………………………………………………………………………………… 304

Подключение HC-SR04…………………………………………………………………………………………………………… 304

Издатель данных ультразвукового измерения расстояния: ultrasonic_publisher.cpp………… 305

Издатель сообщений об ультразвуковом измерении расстояния:
пошаговый разбор……………………………………………………………………………………………………………. 305

Обзор кода издателя сообщений об ультразвуковом измерении расстояния…………….. 306

Использование данных ультразвукового измерения расстояния при обнаружении объектов 309

Заключение………………………………………………………………………………………………………………………………. 310

Вопросы……………………………………………………………………………………………………………………………………. 311

Глава 16. Инерциальные измерительные блоки (IMU) — акселерометры, гироскопы и магнитометры…………………………………………………………………………………………………………….. 312

Общие сведения……………………………………………………………………………………………………………………….. 312

Акселерометры………………………………………………………………………………………………………………………… 313

Недостатки акселерометра…………………………………………………………………………………………….. 314

Публикация данных IMU в ROS……………………………………………………………………………………… 314

Тип данных sensor_msgs::Imu в ROS………………………………………………………………………………. 315

Код издателя сообщений IMU………………………………………………………………………………………… 316

Гироскопы………………………………………………………………………………………………………………………………… 320

Недостатки гироскопа…………………………………………………………………………………………………….. 321

Добавление данных гироскопа в узел IMU…………………………………………………………………… 321

Магнитометры…………………………………………………………………………………………………………………………. 322

Недостатки магнитометра………………………………………………………………………………………………. 322

Добавление данных магнитометра………………………………………………………………………………… 323

Установка IMU………………………………………………………………………………………………………………………… 325

Заключение………………………………………………………………………………………………………………………………. 325

Вопросы……………………………………………………………………………………………………………………………………. 326

Глава 17. GPS и системы на основе внешних радиомаяков………………….. 327

Общие сведения……………………………………………………………………………………………………………………….. 327

Как работают системы на основе радиомаяков…………………………………………………………………… 327

Основные сведения о GPS и GNSS………………………………………………………………………………………….. 329

Точность GPS/GNSS…………………………………………………………………………………………………………. 329

Определение местоположения с помощью GPS/GNSS-RTK с точностью до 2 см……… 330

Ограничения GPS/GNSS…………………………………………………………………………………………………… 331

Данные GPS/GNSS……………………………………………………………………………………………………………. 332

Строки с данными NMEA………………………………………………………………………………………………… 332

Некоторые основные представления данных о широте и долготе……………………………… 334

Публикация данных GPS/GNSS в ROS…………………………………………………………………………………… 335

Пакет ROS: nmea_navsat_driver……………………………………………………………………………………… 335

Установка пакета nmea_navsat_driver…………………………………………………………………………… 336

Изучение документации к пакетам ROS………………………………………………………………………… 337

Запуск узла nmea_serial_driver с параметрами……………………………………………………………. 338

Заключение………………………………………………………………………………………………………………………………. 339

Вопросы……………………………………………………………………………………………………………………………………. 339

Глава 18. Устройства LIDAR и данные, которые они предоставляют…… 340

Общие сведения……………………………………………………………………………………………………………………….. 340

Основные сведения об устройствах LIDAR………………………………………………………………………….. 340

Ограничения LIDAR………………………………………………………………………………………………………………… 341

Типы LIDAR……………………………………………………………………………………………………………………………… 342

Однонаправленный (одноточечный) LIDAR…………………………………………………………………. 342

2D-LIDAR………………………………………………………………………………………………………………………….. 343

3D-LIDAR………………………………………………………………………………………………………………………….. 344

LIDAR, установленный на роботе-пылесосе………………………………………………………………… 344

Критерии выбора LIDAR………………………………………………………………………………………………………… 346

Данные LIDAR: сообщение sensor_msgs::LaserScan……………………………………………………………. 347

Факторы, которые необходимо учитывать при монтаже устройств LIDAR……………………… 349

Установка, запуск и испытание распространенной модели LIDAR…………………………………… 350

Действия по настройке RPLIDAR…………………………………………………………………………………… 351

Визуализация сообщения LaserScan……………………………………………………………………………………… 353

Заключение………………………………………………………………………………………………………………………………. 356

Вопросы……………………………………………………………………………………………………………………………………. 356

Глава 19. Реальное зрение с помощью видеокамер………………………………. 357

Общие сведения……………………………………………………………………………………………………………………….. 357

Что такое изображение?………………………………………………………………………………………………………….. 358

Атрибуты изображения…………………………………………………………………………………………………… 359

Координаты пиксела……………………………………………………………………………………………………….. 359

Проверка наличия или установка необходимого программного обеспечения………………….. 360

ROS Kinetic………………………………………………………………………………………………………………………… 360

ROS Melodic………………………………………………………………………………………………………………………. 361

Тестирование OpenCV в ROS………………………………………………………………………………………………….. 362

Программное обеспечение для обработки изображений (OpenCV) и ROS………………………… 363

Шаг 1. Публикация изображений в ROS………………………………………………………………………………… 364

Установка usb_cam_node………………………………………………………………………………………………… 364

Запуск usb_cam_node………………………………………………………………………………………………………. 364

Тестирование выходного сигнала камеры…………………………………………………………………….. 366

Шаг 2. Подпишитесь на сообщение об изображении в другом узле…………………………………… 367

Создайте свой пакет ROS для видеонаблюдения………………………………………………………….. 367

Написание кода для подписчика на сообщения с изображением……………………………….. 368

Шаг 3. С помощью cv-bridge преобразуйте изображение RGB, которое использует ROS, в изображение BGR, с которым может работать OpenCV…………………………………………………………………………………………………………………….. 369

Шаг 4. Выполните необходимые операции с изображением………………………………………………. 369

Шаг 5. Публикуйте любые данные, не относящиеся к изображению,
в виде отдельного сообщения ROS…………………………………………………………………………………………. 370

Шаг 6. Преобразуйте измененное изображение обратно в формат RGB…………………………… 370

Шаг 7. Опубликуйте итоговое изображение в отдельном топике……………………………………….. 371

Еще немного про обработку изображений……………………………………………………………………………. 371

Ядра, диафрагмы и блоки……………………………………………………………………………………………….. 371

Важность работы с копиями вместо оригинальных изображений……………………………… 372

Несколько слов об освещении………………………………………………………………………………………… 373

Ревизия шага 4 с включением большего количества операций OpenCV……………………………. 373

Преобразование цветового формата: cvtColor()…………………………………………………………… 374

Размытие изображений: blur(), medianBlur(), GaussianBlur()……………………………………….. 374

Выделение краев: Canny()……………………………………………………………………………………………….. 375

От определения краев на изображении к числовым значениям: HoughLinesP()………… 376

Маскирование изображения: bitwise_and()…………………………………………………………………… 380

Фильтрация по цвету: cvtColor() и inRange()………………………………………………………………………… 383

Полезные инструменты ROS…………………………………………………………………………………………………… 387

Расширенные функции OpenCV и не только…………………………………………………………………………. 387

Распознавание изображений с помощью облачных технологий………………………………………… 388

Заключение………………………………………………………………………………………………………………………………. 389

Вопросы……………………………………………………………………………………………………………………………………. 389

Глава 20. Совместное использование различных датчиков………………….. 390

Общие сведения……………………………………………………………………………………………………………………….. 390

Доступно о совместном использовании датчиков………………………………………………………………… 391

Датчик абсолютной ориентации Bosch BN0055………………………………………………………………….. 391

Предоставляемые данные……………………………………………………………………………………………….. 392

Улучшенная одометрия…………………………………………………………………………………………………… 392

Интеграция BN0055: оборудование и издатель ROS……………………………………………………. 393

Интеграция BN0055: узел одометрии…………………………………………………………………………….. 394

Шаг 1. Подписаться на сообщение IMU………………………………………………………………………… 395

Шаг 2. Проверить, что поле ориентации не помечено как “do not use” (не использовать) 395

Шаг 3. Преобразовать кватернионы в углы Эйлера…………………………………………………….. 396

Шаг 4. Сохранить информацию о смещении, если это первое сообщение IMU………… 396

Шаг 5.1. Если это НЕ первое сообщение IMU, сохранить курс IMU………………………….. 397

Шаг 5.2. Передать новое значение курса IMU в функцию расчета параметров одометрии         397

Комплексный подход к совместному использованию датчиков…………………………………………. 398

Фильтр Калмана………………………………………………………………………………………………………………. 398

Ковариационная матрица……………………………………………………………………………………………….. 401

Ковариационные матрицы в сообщениях ROS……………………………………………………………… 402

Узел robot_pose_ekf node………………………………………………………………………………………………………… 403

Установка robot_pose_ekf……………………………………………………………………………………………….. 404

Запуск robot_pose_ekf……………………………………………………………………………………………………… 404

Последнее замечание о преобразованиях и roslaunch………………………………………………….. 405

Заключение………………………………………………………………………………………………………………………………. 406

Вопросы……………………………………………………………………………………………………………………………………. 406

Часть V. Разработка автономного робота…………………………. 407

Глава 21. Сборка и программирование автономного робота………………… 409

Общие сведения……………………………………………………………………………………………………………………….. 409

Раздел 1. Создание физической платформы для робота……………………………………………………… 410

Платформа для робота: общий обзор и список деталей……………………………………………………… 411

Модули, объединяющие в себе колесо и двигатель……………………………………………………… 413

Драйвер(ы) двигателя………………………………………………………………………………………………………. 414

Ролик (третье колесо робота)………………………………………………………………………………………….. 414

Аккумуляторы и зарядное устройство…………………………………………………………………………… 414

Шасси/основание…………………………………………………………………………………………………………….. 415

Компьютеры……………………………………………………………………………………………………………………… 416

LIDAR или другой датчик расстояния…………………………………………………………………………… 416

Колесные энкодеры…………………………………………………………………………………………………………. 417

IMU (инерциальный измерительный блок)……………………………………………………………………. 417

Преобразователь напряжения для компьютера……………………………………………………………. 417

Коммутационная плата для колодки GPIO……………………………………………………………………. 418

Видеокамера…………………………………………………………………………………………………………………….. 418

Вольтметр для контроля напряжения аккумулятора……………………………………………………. 419

Различные материалы……………………………………………………………………………………………………… 420

Сборка платформы для робота………………………………………………………………………………………………. 420

Подготовьте компьютер…………………………………………………………………………………………………… 421

Подготовьте колесные модули……………………………………………………………………………………….. 421

Продумайте схему расположения компонентов…………………………………………………………… 422

Подготовьте шасси…………………………………………………………………………………………………………… 422

Установите колесные модули и ролик…………………………………………………………………………… 422

Установите драйвер двигателя, клеммные колодки и источник питания для компьютера……….. 424

Подготовьте коммутационную плату для колодки GPIO…………………………………………….. 424

Установите компьютер, коммутационную плату для колодки GPIO и IMU………………. 424

Соедините все блоки проводами и установите аккумулятор………………………………………. 425

Установите LIDAR и видеокамеру…………………………………………………………………………………. 425

Еще несколько советов……………………………………………………………………………………………………………. 427

Раздел 2. Программирование робота…………………………………………………………………………………….. 428

Программирование: общие замечания…………………………………………………………………………… 428

Программирование робота: подробная инструкция…………………………………………………….. 429

  1. Создать папку проекта……………………………………………………………………………………….. 430
  2. Получить данные датчиков для публикации……………………………………………………. 430
  3. Настроить управление платформой с помощью пульта ДУ…………………………… 432
  4. Отслеживать перемещение робота и публиковать данные о местоположении 435
  5. Обеспечить перемещение робота по путевым точкам
    (без обхода препятствий)……………………………………………………………………………………….. 436
  6. Составьте карту окружения робота………………………………………………………………….. 438
  7. Загрузить сохраненную карту с помощью файлов запуска……………………………. 439
  8. Добиться автономной навигации робота в пределах карты…………………………… 440

Запуск автономного робота!………………………………………………………………………………………………….. 441

Некоторые советы по устранению неполадок………………………………………………………………. 441

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

Обход динамических препятствий…………………………………………………………………………………. 442

ПИД-регуляторы………………………………………………………………………………………………………………. 443

Главный контроллер, который управляет различными процедурами или задачами.. 443

Реализация преобразования map в odom (полная локализация)………………………………… 443

Следите за новостями в Интернете…………………………………………………………………………………. 443

Заключение………………………………………………………………………………………………………………………………. 444

Приложение. Описание электронного архива………………………………………. 445

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

Lloyd Brombach

Ллойд Бромбах — инженер, программист и энтузиаст электроники и робототехники. Участвовал в соревнованиях по робототехнике, таких как финансируемый НАСА конкурс Lunar Regolith Excavation Challenge 2007 и 27-й конкурс Intelligent Ground Vehicle Challenge.

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

Новая книга: “Хороший код, плохой код”

Хороший код, плохой код

В книге изложены приемы и методы, обязательные при грамотном объектно-ориентированном программировании. Следование приведенным паттернам проектирования  защитит программу от ошибок, проблем с совместимостью, неожиданных и непонятных отказов, а также обеспечит модульность кода. Рассмотрены примеры на языке Java, легко адаптируемые для C#, пояснены приёмы тестирования, развития и адаптации кода с учётом меняющихся требований.

Книга адресована программистам на языках Java и C# и руководителям команд, практикующих объектно-ориентированное программирование.

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

 

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

  • Как писать код, который сложно использовать ненадлежащим образом
  • Как правильно организовать обработку ошибок в приложениях
  • Как обеспечить модульность кода, оптимизировав его для повторного использования
  • Как при необходимости переводить примеры кода с Java на C#
  • Как правильно организовать тестирование кода и внедрение зависимостей

В наибольшей степени книга подойдёт разработчикам, специализирующимся на Java и C#, но также пригодится более широкому кругу программистов, желающих повысить качество объектно-ориентированного кода.

Отзывы

Практичная и информативная книга, которая поможет вам создавать высококачественный и эффективный код.
Кристофер Виллануэва, независимый консультант

Умная, хорошо написанная, практичная книга о том, как писать хороший код, который удобно поддерживать.
Хоули Уолдмен, консультант

Я преподаватель программирования, и мне понравилось, что рассматривает и чему учит эта книга. Она становится в один ряд с такими шедеврами, как «Совершенный код» Стива Макконнелла. В ней в мельчайших деталях показано, каким должен быть «хороший код», почему для приобретения мастерства нужно не только знать, что и как пишется, но и уметь думать как программист.
Ховард Дайнер, отзыв с Amazon

Книгу “Хороший код, плохой код” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Глава 1. Введение………………………………………… 7

1.1. Для кого эта книга……………………………………….. 7

1.2. Что понадобится…………………………………………. 7

1.3. Первая программа………………………………………. 8

1.4. Задания…………………………………………………… 11

Глава 2. Переменные…………………………………. 11

2.1. Типы переменных……………………………………… 11

2.2. Соглашение об именовании переменных…………. 13

2.3. Типы данных……………………………………………. 13

2.4. Значения по умолчанию………………………………. 14

2.5. Литералы………………………………………………… 15

2.6. Целочисленные литералы……………………………. 15

2.7. Литералы с плавающей точкой……………………… 16

2.8. Символьные и строковые литералы……………….. 17

2.9. Другие литералы……………………………………….. 18

2.10. Массивы……………………………………………….. 19

2.11. Задания…………………………………………………. 20

Глава 3. Операции……………………………………… 21

3.1. Операция присваивания……………………………… 21

3.2. Преобразование примитивных типов………………. 22

3.3. Расширяющее преобразование примитивов……… 22

3.4. Сужающее преобразование примитивов………….. 23

3.5. Арифметические операции…………………………… 24

3.6. Унарные операции…………………………………….. 26

3.7. Отличие постфиксного и префиксного инкремента и декремента            27

3.8. Операции сравнения………………………………….. 28

3.9. Логические И и ИЛИ…………………………………… 29

3.10. Операция instanceof…………………………………. 29

3.11. Тернарная операция…………………………………. 31

3.12. Битовые операции……………………………………. 31

3.13. Присвоение с выполнением другой операции….. 32

3.14. Приоритеты операций……………………………….. 33

3.15. Задания…………………………………………………. 34

Глава 4. Выражения, инструкции и блоки……. 35

4.1. Операторы управления порядком выполнения….. 36

4.2. Операторы if-then и if-then-else……………………… 37

4.3. Оператор switch………………………………………… 39

4.4. Оператор while………………………………………….. 43

4.5. Оператор do-while……………………………………… 45

4.6. Оператор for…………………………………………….. 45

4.7. Оператор break…………………………………………. 47

4.8. Оператор continue……………………………………… 48

4.9. Оператор return…………………………………………. 49

4.10. Задания…………………………………………………. 50

Глава 5. Классы и объекты………………………… 50

5.1. Классы……………………………………………………. 50

5.2. Поля………………………………………………………. 51

5.3. Объявление методов………………………………….. 53

5.4. Конструкторы……………………………………………. 56

5.5. Передача параметров…………………………………. 58

5.6. Сборка мусора………………………………………….. 61

5.7. Ключевое слово this…………………………………… 61

5.8. Ключевое слово static………………………………… 63

5.9. Ключевое слово final………………………………….. 64

5.10. Инициализация полей……………………………….. 66

5.11. Задания…………………………………………………. 68

Глава 6. Аннотации…………………………………….. 69

6.1. Объявление аннотаций……………………………….. 69

6.2. Предопределенные аннотации………………………. 72

6.3. Мета-аннотации………………………………………… 73

6.4. Задания…………………………………………………… 75

Глава 7. Вложенные классы
и лямбда-выражения………………………………….. 75

7.1. Что такое вложенные классы……………………….. 75

7.2. Для чего использовать вложенные классы………. 76

7.3. Статические вложенные классы……………………. 77

7.4. Внутренние классы……………………………………. 79

7.5. Внутренний класс, являющийся нестатическим членом класса              80

7.6. Локальные классы…………………………………….. 81

7.7. Анонимные классы…………………………………….. 82

7.8. Затенение переменных……………………………….. 84

7.9. Лямбда-выражения…………………………………….. 85

7.10. Ссылки на методы……………………………………. 89

7.11. Когда использовать вложенные классы, локальные классы, анонимные классы
и лямбда-выражения……………………………………… 91

7.12. Задания…………………………………………………. 92

Глава 8. Интерфейсы…………………………………. 93

8.1. Теория……………………………………………………. 93

8.2. Задания…………………………………………………… 99

Глава 9. Наследование……………………………….. 99

9.1. Введение…………………………………………………. 99

9.2. Приведение типов……………………………………. 101

9.3. Переопределение (overriding) и скрытие (hiding) методов       102

9.4. Использование ключевого слова super………….. 106

9.5. Общий предок Object и его методы……………….. 109

9.6. Ключевое слово final и неизменяемые классы…. 112

9.7. Абстрактные методы и классы…………………….. 112

9.8. Задания…………………………………………………. 113

Глава 10. Пакеты……………………………………… 114

10.1. Теория…………………………………………………. 114

10.2. Задания……………………………………………….. 118

Глава 11. Перечисления……………………………. 118

11.1. Теория…………………………………………………. 118

11.2. Задания……………………………………………….. 123

Глава 12. Записи………………………………………. 123

12.1. Теория…………………………………………………. 123

12.2. Задания……………………………………………….. 125

Глава 13. Числа………………………………………… 126

13.1. Введение……………………………………………… 126

13.2. BigInteger……………………………………………… 128

13.3. BigDecimal……………………………………………. 130

13.4. Math……………………………………………………. 132

13.5. Задания……………………………………………….. 133

Глава 14. Строки………………………………………. 134

14.1. Класс String…………………………………………… 134

14.2. Методы класса String………………………………. 140

14.3. StringBuilder и StringBuffer…………………………. 143

14.4. Задания……………………………………………….. 145

Глава 15. Автоупаковка и распаковка……….. 146

15.1. Теория…………………………………………………. 146

15.2. Задания……………………………………………….. 148

Глава 16. Optional…………………………………….. 149

16.1. Теория…………………………………………………. 149

16.2. Задания……………………………………………….. 154

Глава 17. Модули……………………………………… 154

17.1. Теория…………………………………………………. 154

17.2. Задания……………………………………………….. 159

Глава 18. Обобщения………………………………… 160

18.1. Введение……………………………………………… 160

18.2. Класс Lair……………………………………………… 160

18.3. Обобщенная версия класса Lair…………………. 161

18.4. Соглашение об именовании переменных типа.. 162

18.5. Создание экземпляра обобщенного типа и обращение к нему              162

18.6. Бриллиантовая операция (Diamond operator)…. 163

18.7. Несколько параметров типа………………………. 164

18.8. Сырой тип (Raw type)……………………………… 164

18.9. Сообщения об ошибках “unchecked”……………. 165

18.10. Обобщенные методы……………………………… 166

18.11. Ограниченные параметры типа…………………. 167

18.12. Обобщения, наследование и дочерние типы… 169

18.13. Выведение типов………………………………….. 171

18.14. Выведение типов и обобщенные методы…….. 172

18.15. Выведение типов и создание экземпляра обобщенного класса           173

18.16. Выведение типа и обобщенные конструкторы обобщенных и необобщенных классов          174

18.17. Целевые типы……………………………………… 175

18.18. Подстановочный символ (wildcard)……………. 176

18.19. Подстановочный символ, ограниченный сверху (Upper bounded wildcard)           176

18.20. Неограниченный подстановочный символ (Unbounded wildcard)         177

18.21. Подстановочные символы и дочерние типы… 179

18.22. Захват символа подстановки (Wildcard Capture) и вспомогательные методы       180

18.23. Руководство по использованию подстановочного символа 182

18.24. Стирание типа (Type Erasure)…………………… 184

18.25. Стирание типа в обобщенных типах…………… 184

18.26. Стирание типа в обобщенных методах……….. 185

18.27. Получение аргумента типа родительского класса 185

18.28. Влияние стирания типа и методы-мосты
(bridge methods)………………………………………….. 186

18.29. Методы-мосты (Bridge Methods)……………….. 187

18.30. Загрязнение кучи (Heap pollution)………………. 188

18.31. Подавление предупреждений для методов с произвольным количеством параметров с нематериализуемыми формальными
параметрами………………………………………………. 191

18.32. Ограничения обобщений…………………………. 192

18.33. Задания………………………………………………. 195

Глава 19. Исключения………………………………. 195

19.1. Введение……………………………………………… 195

19.2. Перехватывание и обработка исключений…….. 197

19.3. Указание типов исключений, бросаемых методом 202

19.4. Как бросить исключение…………………………… 203

19.5. Цепочки исключений……………………………….. 203

19.6. Создание своих объектов-исключений…………. 204

19.7. Преимущества исключений……………………….. 205

19.8. Задания……………………………………………….. 205

Глава 20. Потоки ввода/вывода………………… 206

20.1. Введение……………………………………………… 206

20.2. Потоки байт…………………………………………… 206

20.3. InputStream…………………………………………… 206

20.4. OutputStream…………………………………………. 208

20.5. FileInputStream и FileOutputStream……………… 209

20.6. ByteArrayInputStream и ByteArrayOutputStream. 210

20.7. FilterInputStream и FilterOutputStream………….. 210

20.8. DataInputStream и DataOutputStream…………… 210

20.9. BufferedInputStream и BufferedOutputStream….. 210

20.10. PipedInputStream и PipedOutputStream……….. 211

20.11. ObjectInputStream и ObjectOutputStream…….. 211

20.12. Потоки символов…………………………………… 211

20.13. Scanner и PrintStream…………………………….. 212

20.14. Задания………………………………………………. 212

Глава 21. Сериализация……………………………. 213

21.1. Теория…………………………………………………. 213

21.2. Задания……………………………………………….. 216

Глава 22. Файлы (NIO.2)……………………………. 216

22.1. Path…………………………………………………….. 216

22.2. Что такое Glob?……………………………………… 219

22.3. Класс Files……………………………………………. 219

22.4. Проверка существования файла или каталога.. 219

22.5. Проверка прав доступа к файлу или каталогу… 220

22.6. Один и тот же файл…………………………………. 220

22.7. Удаление файла или каталога……………………. 220

22.8. Копирование файла или каталога………………… 221

22.9. Перемещение файла или каталога………………. 221

22.10. Управление метаданными……………………….. 221

22.11. OpenOption………………………………………….. 223

22.12. Наиболее часто используемые методы для небольших файлов         224

22.13. Буферизированный ввод и вывод в текстовые файлы       225

22.14. Небуферизированный ввод и вывод………….. 225

22.15. Создание файлов………………………………….. 225

22.16. Создание временных файлов…………………… 225

22.17. Java NIO.2 Channels……………………………… 226

22.18. Перечисление корневых каталогов файловой системы      228

22.19. Создание каталога…………………………………. 228

22.20. Создание временного каталога…………………. 228

22.21. Перечисление содержимого каталога…………. 229

22.22. Символические и другие ссылки……………….. 231

22.23. Создание символических ссылок………………. 231

22.24. Создание жестких ссылок……………………….. 231

22.25. Определение символической ссылки…………. 232

22.26. Нахождение цели ссылки………………………… 232

22.27. Обход дерева файлов с FileVisitor…………….. 232

22.28. Поиск файлов………………………………………. 235

22.29. Подписываемся на изменения в каталоге……. 235

22.30. Задания………………………………………………. 237

Глава 23. Многопоточность……………………….. 237

23.1. Класс Thread…………………………………………. 237

23.2. Синхронизация………………………………………. 243

23.3. Вмешательство в поток (thread interference)….. 243

23.4. Ошибки согласованности памяти (memory consistency errors)              245

23.5. Синхронизированные (synchronized) методы…. 245

23.6. Внутренние мониторы и синхронизация……….. 247

23.7. Атомарный доступ………………………………….. 248

23.8. Атомарные переменные…………………………… 249

23.9. Взаимная блокировка (Deadlock)………………… 251

23.10. Голодание (starvation)…………………………….. 253

23.11. Активная блокировка (livelock)………………….. 253

23.12. Защищенные блокировки (guarded blocks)……. 253

23.13. Неизменяемые объекты (immutable objects)… 257

23.14. Объекты Lock………………………………………. 258

23.15. Executors……………………………………………. 259

23.16. CompletableFuture…………………………………. 260

23.17. Пулы потоков………………………………………. 263

23.18. Fork/Join Framework………………………………. 264

23.19. Java Memory Model……………………………….. 266

23.20. Задания………………………………………………. 270

Глава 24. Настройки и окружение……………… 270

24.1. Properties……………………………………………… 270

24.2. Аргументы командной строки…………………….. 273

24.3. Переменные окружения……………………………. 274

24.4. Методы класса System……………………………. 275

24.5. Переменная CLASSPATH…………………………. 275

24.6. Задания……………………………………………….. 275

Глава 25. Регулярные выражения…………….. 276

25.1. Теория…………………………………………………. 276

25.2. Задания……………………………………………….. 277

Глава 26. Коллекции…………………………………. 278

26.1. Введение……………………………………………… 278

26.2. Интерфейс Collection………………………………. 278

26.3. Интерфейс Set………………………………………. 280

26.4. Интерфейс List………………………………………. 281

26.5. Интерфейс Queue…………………………………… 283

26.6. Интерфейс Deque…………………………………… 284

26.7. Интерфейс Map……………………………………… 285

26.8. Интерфейс ConcurrentMap………………………… 286

26.9. Класс Dictionary и его наследник Hashtable…… 287

26.10. Сортировка объектов……………………………… 287

26.11. Интерфейс SortedSet……………………………… 292

26.12. Интерфейс SortedMap……………………………. 294

26.13. Другие реализации интерфейсов коллекций…. 295

26.14. Java Stream API……………………………………. 296

26.15. Алгоритмы…………………………………………… 303

26.16. Задания………………………………………………. 304

Глава 27. Дата и время……………………………… 305

27.1. Введение……………………………………………… 305

27.2. Класс Date……………………………………………. 305

27.3. Класс Calendar………………………………………. 306

27.4. Пакет java.time………………………………………. 308

27.5. Перечисление DayOfWeek……………………….. 308

27.6. Перечисление Month……………………………….. 309

27.7. Класс LocalDate……………………………………… 311

27.8. Класс LocalTime…………………………………….. 311

27.9. Класс LocalDateTime……………………………….. 311

27.10. Класс YearMonth…………………………………… 312

27.11. Класс MonthDay……………………………………. 313

27.12. Класс Year…………………………………………… 313

27.13. Классы ZoneId и ZoneOffset…………………….. 313

27.14. Класс ZonedDateTime…………………………….. 315

27.15. Класс OffsetDateTime…………………………….. 315

27.16. Класс OffsetTime………………………………….. 316

27.17. Класс Instant……………………………………….. 316

27.18. Форматирование и преобразование из строки. 317

27.19. Интерфейс TemporalAdjuster……………………. 318

27.20. Интерфейс TemporalQuery………………………. 319

27.21. Класс Duration……………………………………… 319

27.22. Перечисление ChronoUnit……………………….. 320

27.23. Класс Period………………………………………… 320

27.24. Класс Clock…………………………………………. 321

27.25. Задания………………………………………………. 321

Глава 28. Форматирование и парсинг………… 322

28.1. Введение……………………………………………… 322

28.2. Класс NumberFormat……………………………….. 323

28.3. Класс DecimalFormat………………………………. 324

28.4. Класс DateFormat…………………………………… 325

28.5. Класс DateTimeFormatter…………………………. 326

28.6. Класс SimpleDateFormat…………………………… 326

28.7. Класс PrintStream…………………………………… 328

28.8. Класс Formatter……………………………………… 328

28.9. Класс Scanner……………………………………….. 333

28.10. Задания………………………………………………. 335

Глава 29. Работа с консолью…………………….. 336

29.1. Теория…………………………………………………. 336

29.2. Задание……………………………………………….. 338

Глава 30. Локализация……………………………… 339

30.1. Теория…………………………………………………. 339

30.2. Задание……………………………………………….. 341

Глава 31. Пример сервиса со Spring………….. 342

31.1. Что за сервис мы напишем……………………….. 342

31.2. Spring Initializr………………………………………… 343

31.3. Разбор сгенерированного скелета приложения.. 346

31.4. Добавление конечных точек………………………. 349

31.5. Слой бизнес-сервисов……………………………… 351

31.6. Работа с базой данных…………………………….. 357

31.7. Вызов методов с Postman………………………… 360

31.8. Docker…………………………………………………. 360

31.9. Kubernetes……………………………………………. 363

31.10. Задания………………………………………………. 366

Глава 32. Заключение……………………………….. 367

Том Лонг – программист корпорации Google, техлид. Наряду с решением производственных задач постоянно обучает начинающих программистов секретам профессионального мастерства.