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

Представляем книгу “С++ — это просто”

С++ это просто

Доступно изложены основы синтаксиса языка 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, техлид. Наряду с решением производственных задач постоянно обучает начинающих программистов секретам профессионального мастерства.

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

Представляем 3-е издание книги “Мобильные роботы на базе Arduino”

Мобильные роботы на базе Arduino, 3-е изд.

Представляем третье издание книги Михаила Момота “Мобильные роботы на базе Arduino”.

Руководство для начинающих конструкторов написано в форме практических проектов по построению мобильных роботов. Для их реализации выбрана популярная платформа Arduino и четырехколесная конструкция. Рассказано, как управлять моторами, осуществлять сборку механики и электроники, программировать основные функции и управлять роботом. Роботы смогут обходить препятствия, выбираться из запутанных лабиринтов,

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

Электронный архив на сайте издательства содержит детали робота для печати на 3d-принтере, векторные рисунки для резки лазером, листинги, дополнительные библиотеки и программы.

Для читателей, интересующихся электроникой и робототехникой

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

— Михаил Момот, автор книги


Книгу “Мобильные роботы на базе Arduino, 3-е изд.” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Содержание

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

Глава 1. Основные составные части робота………………………………………. 13
Информационно-измерительная система………………………………………………………. 13
Датчик касания…………………………………………………………………………………….. 14
Датчик температуры……………………………………………………………………………… 14
Датчик освещенности……………………………………………………………………………. 15
Датчик препятствия………………………………………………………………………………. 15
Ультразвуковой датчик расстояния………………………………………………………… 16
Оптический рефлекторный датчик расстояния………………………………………….. 16
Детектор шума…………………………………………………………………………………….. 17
Энкодер……………………………………………………………………………………………… 17
Датчик движения………………………………………………………………………………….. 18
Датчик газа………………………………………………………………………………………….. 18
Датчик влажности………………………………………………………………………………… 18
Видеокамера……………………………………………………………………………………….. 19
Система принятия решений………………………………………………………………………….. 20
Контроллер Arduino……………………………………………………………………………… 20
Система связи…………………………………………………………………………………………… 22
Инфракрасный приемник……………………………………………………………………….. 22
Канал Bluetooth……………………………………………………………………………………. 23
Канал Wi-Fi………………………………………………………………………………………….. 23
Устройства отображения информации (дисплеи)………………………………………. 24
Исполнительная система…………………………………………………………………………….. 24
Электрический двигатель постоянного тока……………………………………………… 25
Сервомотор………………………………………………………………………………………… 26
Шаговый двигатель………………………………………………………………………………. 26
Система энергоснабжения…………………………………………………………………………… 27
Механика робота……………………………………………………………………………………….. 27
Элементы электрической схемы…………………………………………………………………… 27
Резистор…………………………………………………………………………………………….. 27
Светодиод………………………………………………………………………………………….. 28
Выключатель………………………………………………………………………………………. 28
Сервисные платы……………………………………………………………………………………….. 28
Arduino Sensor Shield v5.0……………………………………………………………………… 28
Макетная плата……………………………………………………………………………………. 29
Выводы……………………………………………………………………………………………………. 30

Глава 2. Провода и их соединения………………………………………………………. 31
Виды проводов…………………………………………………………………………………………. 31
Одножильные………………………………………………………………………………………. 31
Многожильные…………………………………………………………………………………….. 31
Тип изоляции……………………………………………………………………………………….. 32
Способы соединений проводов……………………………………………………………………. 32
Скрутка………………………………………………………………………………………………. 32
Разъемные соединения…………………………………………………………………………. 33
Пайка и ее основы………………………………………………………………………………… 35
Оборудование и материалы……………………………………………………………. 35
Этапы пайки………………………………………………………………………………….. 36
Выбор паяльника………………………………………………………………………….. 37
Уход за паяльником………………………………………………………………………. 38
Припои………………………………………………………………………………………… 38
Флюсы…………………………………………………………………………………………. 39
Выводы……………………………………………………………………………………………………. 39

Глава 3. Электропитание……………………………………………………………………… 40
Закон Ома………………………………………………………………………………………………… 40
Электрическая мощность……………………………………………………………………………. 40
Характеристики элементов питания………………………………………………………………. 40
Номинальное напряжение……………………………………………………………………… 40
Номинальный ток…………………………………………………………………………………. 41
Внутреннее сопротивление источника питания…………………………………………. 41
Емкость батареи или аккумулятора………………………………………………………… 41
Форм-фактор………………………………………………………………………………………. 41
Типы элементов электрического питания……………………………………………………….. 41
Солевые батареи…………………………………………………………………………………. 42
Алкалиновые батареи…………………………………………………………………………… 42
Никель-металлогидридные аккумуляторы………………………………………………… 42
Литий-ионные и литий-полимерные аккумуляторы…………………………………….. 42
Стабилизация электропитания……………………………………………………………………… 43
Стабилизация напряжения……………………………………………………………………… 44
Стабилизация электрического тока…………………………………………………………. 46
Измерение электрического тока, напряжения и сопротивления…………………………. 46
Защита от короткого замыкания по питанию………………………………………………….. 48
Защита от неверной установки элементов питания (переполюсовки)…………………. 50
Зарядка аккумуляторов на примере Li-ion и Li-pol…………………………………………… 51
Выводы……………………………………………………………………………………………………. 52

Глава 4. Основы программирования Arduino…………………………………….. 53
Компьютерная программа…………………………………………………………………………… 53
Алгоритм………………………………………………………………………………………………….. 54
Среда разработки Arduino IDE…………………………………………………………………….. 55
Установка Arduino IDE…………………………………………………………………………… 55
Начало работы с Arduino IDE…………………………………………………………………. 56
Подключение контроллера Arduino к ПК………………………………………………….. 56
Мигаем светодиодом………………………………………………………………………………….. 60
Мониторинг работы программы…………………………………………………………………… 61
Переменные………………………………………………………………………………………………. 62
Условные операторы………………………………………………………………………………….. 64
Оператор if … else……………………………………………………………………………….. 64
Оператор switch … case………………………………………………………………………… 67
Операторы циклов while и for……………………………………………………………………….. 68
Функции……………………………………………………………………………………………………. 70
Элементы объектно-ориентированного программирования……………………………… 71
Разделение программы (внутренние библиотеки)……………………………………………. 72
Выводы……………………………………………………………………………………………………. 73

Глава 5. Ходовая часть………………………………………………………………………… 74
Типы ходовых частей………………………………………………………………………………….. 74
Гусеницы…………………………………………………………………………………………….. 74
Колеса с дифференциалом…………………………………………………………………… 75
Колеса на моторах………………………………………………………………………………. 75
Летающие роботы………………………………………………………………………………… 76
Выбор двигателей……………………………………………………………………………………… 76
Драйверы двигателей…………………………………………………………………………………. 78
Сборка макета…………………………………………………………………………………………… 80
Управляем двигателем без Arduino…………………………………………………………. 80
Широтно-импульсная модуляция……………………………………………………………. 82
Подключаем контроллер Arduino……………………………………………………………. 83
Подключаем библиотеку mobrob3.zip и пишем тестовую программу…………….. 86
Добавляем регулирование на основе ШИМ……………………………………………… 87
Тестовая программа управления двигателями
с регуляцией на основе ШИМ…………………………………………………………………. 87
Выводы……………………………………………………………………………………………………. 89

Глава 6. Сборка базовой модели…………………………………………………………. 90
Минимальный комплект………………………………………………………………………………. 90
Двигатели…………………………………………………………………………………………………. 92
Система электропитания…………………………………………………………………………….. 93
Подбираем компоненты………………………………………………………………………………. 96
Схемы………………………………………………………………………………………………………. 98
Проверка правильности подключения платы драйвера и двигателей……………….. 102
Пример использования платы Arduino Sensor Shield……………………………………… 103
Установка устройств обратной связи………………………………………………………….. 104
Укладка проводов……………………………………………………………………………………. 107
Выводы…………………………………………………………………………………………………… 107

Глава 7. Схема управления движением…………………………………………….. 108
Переменные и функции управления моторами………………………………………………. 108
Подключение управления моторами……………………………………………………… 108
Управление мощностью………………………………………………………………………. 108
Движение в нужном направлении………………………………………………………….. 109
Первая поездка………………………………………………………………………………………… 109
Алгоритм…………………………………………………………………………………………… 109
Программа………………………………………………………………………………………… 110
Сигнал светодиодом…………………………………………………………………………………. 111
Выводы…………………………………………………………………………………………………… 112

Глава 8. Дистанционное управление роботом………………………………….. 113
Способы дистанционного управления…………………………………………………………. 113
Управление роботом по каналу инфракрасной связи…………………………………….. 114
Схема подключения……………………………………………………………………………. 114
Рекомендации по установке…………………………………………………………………. 116
Установка библиотеки IRremote…………………………………………………………….. 117
Получение кодов кнопок для используемого пульта……………………………….. 117
Программа………………………………………………………………………………………… 120
Управление роботом по каналу Bluetooth…………………………………………………….. 123
Подбор элементной базы…………………………………………………………………….. 124
Подключение к Arduino………………………………………………………………………… 125
Смена имени контроллера Bluetooth и робота………………………………………… 126
Настройка смартфона…………………………………………………………………………. 127
Устранение радиопомех………………………………………………………………………. 129
Программа………………………………………………………………………………………… 129
Управляем роботом по Wi-Fi (ESP-01)…………………………………………………………. 133
Выводы…………………………………………………………………………………………………… 138

Глава 9. Робот, держащий направление по электронному гироскопу-акселерометру……………………………………… 139
Гироскоп…………………………………………………………………………………………………. 139
Акселерометр………………………………………………………………………………………….. 141
Электронный гироскоп………………………………………………………………………………. 142
Подключение гироскопа-акселерометра MPU-6050……………………………………….. 143
Получение данных с MPU-6050…………………………………………………………………… 145
Шкала значений MPU-6050…………………………………………………………………………. 148
Модернизация робота………………………………………………………………………………. 148
Монтаж устройства…………………………………………………………………………….. 148
Программирование…………………………………………………………………………….. 148
Основные функции для получения углов…………………………………………. 148
Стабилизация поворотов: ПИД-регулятор……………………………………….. 150
Добавляем функцию движения………………………………………………………. 153
Выводы…………………………………………………………………………………………………… 157

Глава 10. Движение по черной линии………………………………………………… 158
Обнаружение черной линии……………………………………………………………………….. 159
Фотодиод………………………………………………………………………………………….. 159
Фоторезистор……………………………………………………………………………………. 160
Фототранзистор…………………………………………………………………………………. 161
Инфракрасный датчик отражения TCRT 5000…………………………………………… 161
Подготовка робота: установка датчиков……………………………………………………… 163
Упрощенная программа движения………………………………………………………………. 166
Используем аналоговые данные «на всю катушку»………………………………………… 169
Выводы…………………………………………………………………………………………………… 173

Глава 11. Измерение расстояния и поворотная голова……………………. 174
Измеряем расстояние……………………………………………………………………………….. 174
Инфракрасный датчик расстояния GP2Y0A021YK0F………………………………………. 175
Лазерный датчик расстояния VL53L1X…………………………………………………………. 176
Ультразвуковые дальномеры HC-SR04 и US-026/25……………………………………….. 177
Поиск препятствия……………………………………………………………………………………. 179
Поворотная голова…………………………………………………………………………………… 184
Схемы подключения……………………………………………………………………………. 185
Управление сервомашинкой…………………………………………………………………. 187
Монтаж головы………………………………………………………………………………….. 189
Тестовая программа «Ведение цели»…………………………………………………….. 190
Если что-то пошло не так………………………………………………………………………….. 191
Выводы…………………………………………………………………………………………………… 192

Глава 12. Ходовые испытания: обход препятствий…………………………. 193
Программа проверки и настройки основных функций робота…………………………. 193
Выводы…………………………………………………………………………………………………… 200

Глава 13. Робот, находящий выход из лабиринта…………………………….. 201
Способ обхода лабиринта…………………………………………………………………………. 202
Обход лабиринта без модернизации робота………………………………………………… 203
Программа………………………………………………………………………………………… 207
Выводы…………………………………………………………………………………………………… 213
Глава 14. Робот с видеокамерой………………………………………………………… 214
Аналоговое видео с робота………………………………………………………………………. 214
Цифровое видео для робота: ESP32-CAM…………………………………………………… 216
Робот с камерой ESP32-CAM…………………………………………………………………….. 218
Добавление контроллеров ESP в среду ArduinoIDE………………………………… 219
Прошивка ESP32-CAM…………………………………………………………………………. 221
Настройка программного обеспечения робота……………………………………………… 222
Сборка электроники…………………………………………………………………………………. 224
Сборка механики……………………………………………………………………………………… 224
Выводы…………………………………………………………………………………………………… 226

Глава 15. Робот и пройденное расстояние………………………………………… 227
Моторы с инкрементальным энкодером………………………………………………………. 227
Как работает инкрементальный энкодер?………………………………………………. 228
Получение информации о вращении с инкрементальных энкодеров…………… 229
Следим за энкодерами в приложении……………………………………………………. 236
Выводы…………………………………………………………………………………………………… 243

Глава 16. Балансирующий робот……………………………………………………….. 244
Теория……………………………………………………………………………………………………. 244
Как найти угол наклона робота?…………………………………………………………… 246
Регулятор балансировки робота………………………………………………………….. 247
Программирование…………………………………………………………………………………… 248
Порядок подбора коэффициентов пропорциональности регулятора…………. 254
Выводы…………………………………………………………………………………………………… 260

Приложение. Описание электронного архива…………………………………… 261
Предметный указатель………………………………………………………………………. 265

Момот Михаил Викторович, сотрудник Томского политехнического университета, основатель и директор фирмы «Юрга-Технологии-Инновации», занимающейся разработкой роботов. Увлекается робототехникой, поклонник и пропагандист проекта Arduino с 2014 года. Основатель неформального клуба робототехников «Лига роботов ЮТИ ТПУ», объединяющего школьников студентов, преподавателей и энтузиастов. Автор популярных книг “Мобильные роботы на базе Arduino“, “Мобильные роботы на базе ESP32 в среде Arduino IDE“.

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

Новинка! Глубокое обучение и анализ данных. Практическое руководство

Глубокое обучение и анализ данных. Практическое руководство

Представляем новую книгу Дмитрия Малова: “Глубокое обучение и анализ данных. Практическое руководство“.

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

Для Python-разработчиков и специалистов Data Science

Как говорил Артур Кларк, «любая достаточно продвинутая технология неотличима от магии» («третий закон Кларка»). На наших глазах именно так начинает восприниматься глубокое обучение – технология, зародившаяся в 1959 году.

Эта книга поможет вам сделать первые шаги в изучении важнейших современных библиотек глубокого обучения – Keras, PyTorch и Tensorflow. В ней просто и последовательно раскрываются принципы обработки изображений и естественного языка при помощи базовых алгоритмов, реализованных на Python. В книгу включён проект по построению собственной системы глубокого обучения на основе данных из обычного браузера.

Книга сопровождается примерами кода по каждому из теоретических аспектов, чтобы у разработчиков была возможность применить полученные теоретические знания на практике для решения собственных задач. Весь код доступен в репозитории: https://github.com/Dimitrioum/ml-data-analysis-book.

 

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

Введение. 9

Чему обучит книга?. 10

Для кого эта книга?. 11

Глава 1. Основы машинного обучения. 13

Линейная алгебра. 13

Скаляр. 13

Вектор. 13

Матрица. 14

Тензор. 14

Норма. 17

Теория информации и теория вероятностей. 17

Случайная величина. 18

Распределение вероятности. 18

Условная вероятность. 19

Маргинальное распределение вероятности. 20

Цепное правило. 20

Математическое ожидание. 20

Дисперсия. 21

Ковариация. 21

Правило Байеса. 21

Наиболее часто используемые распределения вероятности. 22

Машинное обучение: основные понятия, подходы и типы задач. 22

Задача Т. 23

Опыт Е. 24

Активация нейронов в нейросетевых моделях. 26

Основы языка программирования Python. 26

Базовые типы. 27

Интерактивный режим работы Python. 27

Переменные в Python. 28

Числа: целые, вещественные. 28

Строки. 29

Списки. 31

Кортежи. 32

Словари. 33

Операторы сравнения. 34

Логические операторы. 34

Операторы ветвления. 35

Циклы. 36

Работа со строками. 37

Срезы строк. 38

Функции. 38

Сценарный режим программирования. 40

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

Основы объектно-ориентированного программирования. 49

Полезные приемы. 51

Основы разработки программного обеспечения. 53

Глава 2. Основные алгоритмы машинного обучения. 55

Предобработка данных. 55

Алгоритмы снижения размерности данных. 58

Линейные методы. 59

Нелинейные методы. 66

Линейная регрессия. 76

Логистическая регрессия. 77

Дерево решений. 78

Метод опорных векторов. 80

Наивный байесовский классификатор. 81

Алгоритм k ближайших соседей. 83

Алгоритм k средних. 84

Случайный лес. 86

Алгоритмы градиентного бустинга. 88

Глава 3. Основы глубокого обучения. 91

Алгоритм обратного распространения ошибки. 91

Перцептрон. 92

Цепь Маркова. 94

Машина Больцмана. 94

Сеть Хопфилда. 96

Глубокая сеть доверия. 97

Глубокая сверточная сеть. 97

Капсульные нейронные сети. 99

Нейронная сеть с блоком внимания (трансформеры) 101

Рекуррентные нейронные сети. 103

Автокодировщики. 104

Генеративно-состязательные сети. 105

Практические примеры. 106

Система проактивной локализации пользователей киберфизической системы. 109

Концепция системы проактивной локализации. 116

Глава 4. Основы data science. 119

Методология CRISP-DM.. 119

Бизнес-анализ. 120

Анализ данных. 121

Подготовка данных. 122

Моделирование. 124

Оценка результата. 125

Внедрение. 126

Роли специалистов в команде ML-разработки. 127

Современные тренды data science. 129

Борьба с DeepFake-контентом. 129

Интерес бизнеса к полноценным (end-to-end) решениям на основе
машинного обучения. 130

Low-code- и no-code-платформы для ML-разработки. 130

Методы оптимизации (квантования) обученной нейросетевой модели. 130

MLOps 131

Full-stack deep learning-разработчик. 131

Обучение без учителя. 132

Few-shot-, one-shot-, zero-shot-обучение. 132

Обзор современных библиотек для ML-разработки. 133

TensorFlow.. 134

CNTK.. 135

PyTorch. 135

Keras 136

Theano. 136

Torch. 137

Caffe. 137

MxNet 138

Chainer 138

Глава 5. Задачи глубокого обучения. 141

Аугментация данных. 141

Методы аугментации данных. 141

Глубокое обучение в задачах компьютерного зрения. 142

Установка OpenCV.. 142

Загрузка и отображение изображений. 143

Рисование на изображении. 144

Задача оптического распознавания символов. 144

Обработка естественного языка. 148

Методы и инструменты обработки текста. 148

Статистические методы. 148

Текстовая классификация. 149

Извлечение текста. 150

Обработка аудио. 151

Задача идентификации спикера. 151

Как мы представляем звук в цифровом виде?. 152

Подготовка аудиоданных для модели глубокого обучения. 153

Спектр. 153

Аудиомодели глубокого обучения. 154

Какие проблемы решает глубокое обучение аудио?. 155

Классификация аудио. 155

Аудиоразделение и сегментация. 155

Классификация музыкальных жанров. 156

Создание и транскрипция музыки. 156

Распознавание голоса. 156

Преобразование речи в текст и текста в речь. 157

Обработка видеопоследовательности. 157

Декодирование и кодирование. 158

Интерполяция с отслеживанием. 159

Глава 6. Знакомство с TensorFlow.. 161

Начало работы с TensorFlow.. 161

Определение и запуск нейронной сети. 163

Определение нейронной сети. 163

Запуск нейронной сети. 164

Классификация изображений с помощью TensorFlow.. 165

Построение модели для трансферного обучения. 167

Обучение модели. 167

Тонкая настройка модели (fine tuning) 168

Обработка текста с TensorFlow.. 168

Представление текста в виде тензоров. 169

Векторизация текста. 171

Ограничение размера словарного запаса. 171

Текстовое представление набора слов через мешок слов. 171

Обучение классификатора мешка слов. 172

Обучение классификатора как одной сети. 173

Биграммы, триграммы и n-граммы. 174

Автоматический расчет векторов мешка слов. 175

Частота слова и обратная частота документа. 175

Сжатые векторные характеристики. 177

Рекуррентные нейронные сети для обработки текста. 184

Пересмотр последовательностей переменных. 188

Классификация аудио с TensorFlow.. 189

Импортирование набора данных речевых мини-команд. 189

Преобразование сигналов в спектрограммы. 192

Построение и обучение модели. 193

Оценка точности модели. 195

Глава 7. Знакомство с Keras 197

Функции. 197

Преимущества. 197

Установка пакетов. 198

Установка Keras с использованием Python. 200

TensorFlow.. 200

Theano. 201

Доступные модули. 201

Модуль Backend. 202

Модуль Utils 205

Основная концепция слоев в Keras 206

Форма ввода. 210

Модуль Initializers 210

Модуль Constraints 215

Модуль Regularizers 216

Функции активации. 217

linear 217

elu. 218

selu. 218

relu. 219

softmax. 220

softplus 220

softsign. 221

tanh. 221

sigmoid. 222

hard_sigmoid. 222

exponential 223

Классификация изображений с Keras 223

Трансферное обучение. 227

Keras для классификации аудио. 229

Предварительная настройка. 229

Построение кривых амплитуды. 230

Работа с tf.Keras 231

Классификация изображений с использованием TensorFlow 2.x. 231

Импортирование набора данных. 232

Предварительная обработка данных. 232

Компиляция и обучение модели глубокого обучения. 233

Классификация текста с использованием TensorFlow и Keras 234

Предварительная подготовка. 234

Импорт текста. 234

Очистка и предварительная обработка текста. 235

Заполнение текстовых последовательностей. 236

Создание тестовой выборки. 236

Построение и компиляция модели. 236

Обучение модели глубокого обучения. 236

Импорт тестовых данных. 237

Прогноз по набору тестов. 237

Глава 8. Знакомство с PyTorch. 239

Основы PyTorch. 239

Загрузка данных, устройств и CUDA.. 239

Создание параметров. 239

Пакет Autograd. 240

Процедура оптимизации. 240

Функция ошибки. 241

Модель. 241

Набор данных. 243

Метрика качества. 245

Классификация аудио с PyTorch. 245

Тензоры. 247

Классификация изображений с PyTorch. 247

PyTorch для компьютерного зрения. 247

Загрузка данных. 248

Обучение модели. 249

Классификация текста с PyTorch. 251

Подготовка конвейеров обработки данных. 252

Создание пакета данных и итератора. 252

Определение модели. 253

Глава 9. Разработка веб-приложения для демонстрации моделей
глубокого обучения. 259

Разработка веб-приложения на Django. 259

Пару слов о Heroku. 261

Заключение. 267

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

Малов Дмитрий

Малов Дмитрий Александрович, с 2017 по 2021 – научный сотрудник института Санкт-Петербургского Федерального исследовательского центра Российской академии наук, лаборатория больших данных в социокиберфизических системах, автор более 20 научных статей и монографии. Сфера профессиональных интересов – распознавание образов, синтетические данные. Является генеральным директором стартапа «Квант», занимающегося прикладными исследованиями в сфере квантовых вычислений.

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

Представляем 5-е издание книги “PHP глазами хакера”

PHP глазами хакера. 5-е издание

В книге рассмотрены вопросы безопасности и оптимизации сценариев на языке PHP. Большое внимание уделено описанию типичных ошибок программистов, благодаря которым, хакеры проникают на сервер, а также представлены методы и приведены практические рекомендации противостояния внешним атакам. Показаны реальные примеры взлома Web-сайтов и рекомендации, которые помогут создавать более защищенные сайты. В 5-м издании переписаны примеры с учетом современных возможностей PHP 8 и добавлена глава по безопасности во фреймворках Laravel и Symfony.

Для Web-программистов, администраторов и специалистов по безопасности

Создание безопасных Web-приложений на PHP

Язык PHP уже давно является самым популярным языком программирования Web-приложений. В настоящее время на этом языке создается большинство сайтов, и их количество ежедневно растет. С другой стороны, хакерское движение также набирает обороты, и количество взломов и попыток взлома Web-сайтов также увеличивается. Открытость информации приводит к тому, что приходится больше внимания уделять безопасности сайта. Сценарии для серверов пишут люди, а им свойственно ошибаться, и хакеры пользуются этим.

В данной книге описываются основные методы хакеров, используемые для взлома Web-сценариев, основные ошибки программистов и методы решения проблем безопасности. Надеемся, что эта книга и многочисленные примеры позволят вам взглянуть на программирование Web-сайтов глазами взломщика и помогут создавать безопасные сценарии на языке PHP. Кроме того, рассмотрены вопросы оптимизации Web-сценариев. Чем быстрее сервер выполнит сценарий, тем быстрее пользователь увидит ответ, а сервер сможет обработать больше запросов.

В 5-м издании переписаны примеры с учетом современных возможностей PHP 8 и добавлена глава по безопасности во фреймворках Laravel и Symfony.

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

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

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

Об авторе……………………………………………………………………………………………………………………………………. 10

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

Глава 1. Введение в PHP………………………………………………………………………… 11

1.1. Что такое PHP?……………………………………………………………………………………………………………………. 11

1.2. Создание сайта для Apache……………………………………………………………………………………………….. 12

1.3. Как работает PHP?……………………………………………………………………………………………………………… 15

1.4. Чего ждать дальше?……………………………………………………………………………………………………………. 17

Глава 2. Основы PHP…………………………………………………………………………….. 18

2.1. PHP-инструкции………………………………………………………………………………………………………………….. 18

2.2. Подключение файлов………………………………………………………………………………………………………….. 23

2.3. Вывод данных……………………………………………………………………………………………………………………… 27

2.4. Правила кодирования…………………………………………………………………………………………………………. 28

2.4.1. Комментарии…………………………………………………………………………………………………………………. 29

2.4.2. Чувствительность………………………………………………………………………………………………………….. 30

2.4.3. Переменные……………………………………………………………………………………………………………………. 32

2.4.4. Основные операции………………………………………………………………………………………………………. 35

2.4.5. Область видимости……………………………………………………………………………………………………….. 36

2.4.6. Константы……………………………………………………………………………………………………………………… 38

2.5. Управление выполнением программы………………………………………………………………………………. 39

2.6. Циклы…………………………………………………………………………………………………………………………………… 49

2.6.1. Цикл for………………………………………………………………………………………………………………………….. 50

2.6.2. Цикл while………………………………………………………………………………………………………………………. 52

2.6.3. Бесконечные циклы………………………………………………………………………………………………………. 52

2.6.4. Управление циклами…………………………………………………………………………………………………….. 53

2.7. Прерывание работы программы……………………………………………………………………………………….. 55

2.8. Функции……………………………………………………………………………………………………………………………….. 56

2.9. Классы…………………………………………………………………………………………………………………………………. 63

2.10. Массивы…………………………………………………………………………………………………………………………….. 66

2.11. Обработка ошибок……………………………………………………………………………………………………………. 69

2.12. Передача данных……………………………………………………………………………………………………………… 70

2.12.1. Переменные окружения………………………………………………………………………………………………. 71

2.12.2. Передача параметров…………………………………………………………………………………………………. 72

2.12.3. Метод GET…………………………………………………………………………………………………………………… 76

2.12.4. Метод POST…………………………………………………………………………………………………………………. 78

2.12.5. Скрытые параметры…………………………………………………………………………………………………… 80

2.13. Хранение параметров посетителя…………………………………………………………………………………… 81

2.13.1. Сеансы…………………………………………………………………………………………………………………………. 83

2.13.2. Cookies…………………………………………………………………………………………………………………………. 87

2.13.3. Безопасность cookie……………………………………………………………………………………………………. 91

2.14. Файлы………………………………………………………………………………………………………………………………… 93

2.14.1. Открытие файла………………………………………………………………………………………………………….. 94

2.14.2. Закрытие файла…………………………………………………………………………………………………………… 95

2.14.3. Чтение данных…………………………………………………………………………………………………………….. 95

2.14.4. Дополнительные функции чтения……………………………………………………………………………… 98

2.14.5. Запись данных…………………………………………………………………………………………………………….. 98

2.14.6. Позиционирование в файле………………………………………………………………………………………… 99

2.14.7. Свойства файлов……………………………………………………………………………………………………….. 100

Глава 3. Безопасность………………………………………………………………………….. 102

3.1. Комплексная защита………………………………………………………………………………………………………… 103

3.2. Права доступа…………………………………………………………………………………………………………………… 105

3.3. Как взламывают сценарии?……………………………………………………………………………………………… 105

3.4. Основы защиты сценариев……………………………………………………………………………………………….. 107

3.4.1. Реальный пример ошибки…………………………………………………………………………………………… 108

3.4.2. Рекомендации по защите……………………………………………………………………………………………. 111

3.4.3. Тюнинг PHP…………………………………………………………………………………………………………………. 112

3.5. Проверка корректности данных………………………………………………………………………………………. 113

3.6. Регулярные выражения…………………………………………………………………………………………………….. 118

3.6.1. Функции регулярных выражений PHP………………………………………………………………………. 119

Функция ereg()…………………………………………………………………………………………………………….. 119

Функция eregi()……………………………………………………………………………………………………………. 119

Функция ereg_replace()………………………………………………………………………………………………. 119

Функция eregi_replace()……………………………………………………………………………………………… 120

Функция split()…………………………………………………………………………………………………………….. 120

Функция spliti()……………………………………………………………………………………………………………. 120

3.6.2. Использование регулярных выражений PHP……………………………………………………………. 120

3.6.3. Использование регулярных выражений Perl…………………………………………………………….. 125

3.6.4. Функции регулярных выражений Perl……………………………………………………………………….. 127

Функция preg_match()………………………………………………………………………………………………… 127

Функция preg_match_all()………………………………………………………………………………………….. 128

Функция preg_split()…………………………………………………………………………………………………… 129

3.6.5. Проверка e-mail…………………………………………………………………………………………………………… 129

3.6.6. Советы по использованию регулярных выражений………………………………………………… 129

3.7. Что и как фильтровать?…………………………………………………………………………………………………….. 130

3.8. Базы данных……………………………………………………………………………………………………………………… 134

3.8.1. Основы баз данных…………………………………………………………………………………………………….. 134

3.8.2. Атака SQL Injection…………………………………………………………………………………………………….. 136

3.8.3. Реальное экранирование……………………………………………………………………………………………. 145

3.8.4. Параметризированные запросы………………………………………………………………………………… 146

3.8.5. Работа с файлами……………………………………………………………………………………………………….. 151

3.8.6. Практика работы с базами данных…………………………………………………………………………… 151

3.8.7. Проверка URL……………………………………………………………………………………………………………… 152

3.9. Работа с файлами……………………………………………………………………………………………………………… 153

3.10. Криптография………………………………………………………………………………………………………………….. 154

3.10.1. Симметричное шифрование…………………………………………………………………………………….. 154

3.10.2. Асимметричное шифрование…………………………………………………………………………………… 155

3.10.3. Необратимое шифрование……………………………………………………………………………………….. 156

3.10.4. Практика использования шифрования……………………………………………………………………. 158

3.11. Атака Cross-Site Scripting………………………………………………………………………………………………… 164

3.12. Флуд…………………………………………………………………………………………………………………………………. 169

3.12.1. Защита от флуда сообщениями……………………………………………………………………………….. 169

3.12.2. Защита от накрутки голосований……………………………………………………………………………. 170

3.13. Изменения формы и атака CSRF……………………………………………………………………………………. 172

3.14. Сопровождение журнала……………………………………………………………………………………………….. 175

3.15. Защита от неправомерных изменений………………………………………………………………………….. 176

3.16. Панель администратора………………………………………………………………………………………………… 178

3.17. Опасная переменная $REQUEST_URI…………………………………………………………………………… 179

3.18. CAPTCHA………………………………………………………………………………………………………………………… 180

3.19. Сериализация………………………………………………………………………………………………………………….. 185

Глава 4. Оптимизация………………………………………………………………………….. 188

4.1. Алгоритм……………………………………………………………………………………………………………………………. 188

4.2. Слабые места…………………………………………………………………………………………………………………….. 190

4.3. Базы данных……………………………………………………………………………………………………………………… 191

4.3.1. Оптимизация запросов……………………………………………………………………………………………….. 192

4.3.2. Оптимизация СУБД…………………………………………………………………………………………………….. 196

4.3.3. Выборка необходимых данных…………………………………………………………………………………. 198

4.3.4. Изучайте систему………………………………………………………………………………………………………… 200

4.4. Оптимизация PHP……………………………………………………………………………………………………………… 202

4.4.1. Кеширование вывода………………………………………………………………………………………………….. 202

4.4.2. Кеширование страниц………………………………………………………………………………………………… 203

4.5. Оптимизация или безопасность?……………………………………………………………………………………… 205

4.6. Переход на PHP 8……………………………………………………………………………………………………………… 207

Глава 5. Примеры работы с PHP………………………………………………………….. 208

5.1. Загрузка файлов на сервер………………………………………………………………………………………………. 208

5.2. Проверка корректности файла………………………………………………………………………………………… 213

5.3. Запретная зона………………………………………………………………………………………………………………….. 216

5.3.1. Аутентификация………………………………………………………………………………………………………….. 216

5.3.2. Защита сценариев правами доступа сервера Apache……………………………………………… 223

5.4. Работа с сетью…………………………………………………………………………………………………………………… 224

5.4.1. Работа с DNS……………………………………………………………………………………………………………….. 225

5.4.2. Протоколы…………………………………………………………………………………………………………………… 225

5.4.3. Сокеты………………………………………………………………………………………………………………………….. 226

Инициализация…………………………………………………………………………………………………………… 227

Серверные функции……………………………………………………………………………………………………. 227

Клиентские функции…………………………………………………………………………………………………… 228

Обмен данными…………………………………………………………………………………………………………… 229

Управление сокетами…………………………………………………………………………………………………. 230

5.5. Сканер портов…………………………………………………………………………………………………………………… 231

5.6. FTP-клиент низкого уровня………………………………………………………………………………………………. 234

5.7. Работа с электронной почтой………………………………………………………………………………………….. 237

5.7.1. Протокол SMTP…………………………………………………………………………………………………………… 237

5.7.2. Функция mail()……………………………………………………………………………………………………………… 239

5.7.3. Соединение с SMTP-сервером……………………………………………………………………………………. 241

5.7.4. Безопасность электронной почтовой службы………………………………………………………….. 242

5.7.5. Производительность отправки почты……………………………………………………………………….. 242

5.8. Защита ссылок………………………………………………………………………………………………………………….. 244

5.9. PHP в руках хакера…………………………………………………………………………………………………………… 245

5.10. Уловки……………………………………………………………………………………………………………………………… 247

5.10.1. Переадресация………………………………………………………………………………………………………….. 247

5.10.2. Всплывающие окна…………………………………………………………………………………………………… 249

5.10.3. Тег <iframe>………………………………………………………………………………………………………………. 250

5.10.4. Стой, не уходи!………………………………………………………………………………………………………….. 251

5.11. Как убрать теги?……………………………………………………………………………………………………………… 252

Глава 6. Фреймворки PHP……………………………………………………………………. 254

6.1. Знакомство с Laravel………………………………………………………………………………………………………… 254

6.2. Быстрый старт…………………………………………………………………………………………………………………… 256

6.3. Уязвимость CSRF………………………………………………………………………………………………………………. 259

6.4. Базы данных……………………………………………………………………………………………………………………… 261

6.4.1. Добавление данных……………………………………………………………………………………………………. 263

6.4.2. Чтение данных…………………………………………………………………………………………………………….. 264

6.4.3. Флуд при добавлении данных…………………………………………………………………………………… 266

6.4.4. Работа с базами данных в Symfony………………………………………………………………………….. 266

6.5. Фреймворки и защита от XSS…………………………………………………………………………………………… 267

6.5.1. XSS в Symfony…………………………………………………………………………………………………………….. 269

Литература…………………………………………………………………………………………… 270

Описание файлового архива, сопровождающего книгу……………………….. 270

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

Фленов Михаил

Флёнов Михаил, профессиональный программист. Работал в журнале «Хакер», в котором несколько лет вел рубрики «Hack-FAQ» и «Кодинг» для программистов, печатался в журналах «Игромания» и «Chip-Россия». Автор бестселлеров «Библия Delphi», «Программирование в Delphi глазами хакера», «Программирование на C++ глазами хакера», «Компьютер глазами хакера» и др. Некоторые книги переведены на иностранные языки и изданы в США, Канаде, Польше и других странах.

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

Переходите с Java на Kotlin!

От Java к Kotlin

Расстояние от острова Ява до острова Котлин составляет 9892 километра по прямой. Чтобы преодолеть его, не пользуясь воздушным транспортом, понадобится как минимум неделя. Если вы — опытный Java-разработчик, который решил перейти на Kotlin, вам потребуется примерно столько же времени. Вы обнаружите, что в Kotlin все делается по-другому, он требует иных подходов к программированию. Этот язык более функционален, у него больше возможностей, поэтому перенос кода ваших проектов с Java на Kotlin — отличная идея.

Ваши гиды Дункан и Нэт уже проделали этот путь в 2015 году, и с тех пор помогли многим командам и отдельным разработчикам повторить его. Путешествуйте вместе с ними по проверенному маршруту, включающему такие промежуточные остановки, как переход от объектов JavaBeans к значениям, от коллекций Java к коллекциям Kotlin и от классов Java к классам Kotlin.

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

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

Взять знакомый всем старый добрый код Java и наблюдать за тем, как он постепенно превращается в лаконичный, четкий, выразительный и легкий в обслуживании код на языке Kotlin — замечательный способ выучить язык. Воспользуйтесь опытом, которым делятся Макгрегор и Прайс.
Венкат Субраманиам, Ph.D., писатель и основатель компании Agile Developer, Inc.

Самый быстрый способ перенести свои навыки и умения из Java в Kotlin. Обязательно к прочтению любому профессиональному разработчику на Java.
Дон и Дэвид Гриффитс, авторы книг «React. Сборник рецептов» и «Head First. Kotlin»

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

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

Как устроена эта книга?……………………………………………………………………………………………………………. 12

Как были выбраны темы?…………………………………………………………………………………………………………. 12

Уровень сложности……………………………………………………………………………………………………………………. 13

Идеальный код…………………………………………………………………………………………………………………………… 14

Форматирование кода……………………………………………………………………………………………………………….. 14

Условные обозначения……………………………………………………………………………………………………………… 15

Использование примеров кода…………………………………………………………………………………………………. 16

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

Как с нами связаться?………………………………………………………………………………………………………………… 17

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

Благодарности Дункана………………………………………………………………………………………………… 18

Благодарности Нэта………………………………………………………………………………………………………. 19

Глава 1. Введение…………………………………………………………………………………… 21

Сущность языка программирования………………………………………………………………………………………… 21

История стилей программирования на Java (на наш взгляд)………………………………………………… 24

Первобытный стиль………………………………………………………………………………………………………… 24

Стиль JavaBeans…………………………………………………………………………………………………………….. 25

Корпоративный стиль……………………………………………………………………………………………………. 26

Инверсия абстракции………………………………………………………………………………………………. 27

Современный стиль………………………………………………………………………………………………………… 29

Будущее…………………………………………………………………………………………………………………………… 29

Сущность Kotlin…………………………………………………………………………………………………………………………. 29

Рефракторинг на Kotlin……………………………………………………………………………………………………………… 31

Принципы рефакторинга……………………………………………………………………………………………….. 32

Подразумеваем хорошее покрытие тестами………………………………………………………………… 33

Фиксации изменений рассчитаны на Git Bisect……………………………………………………………. 33

Над чем мы работаем?………………………………………………………………………………………………………………. 34

Приступим!…………………………………………………………………………………………………………………………………. 34

Глава 2. Перевод проектов с Java на Kotlin……………………………………………. 35

Стратегия……………………………………………………………………………………………………………………………………. 35

Добавление поддержки Kotlin в сборку Java…………………………………………………………………………… 37

Другие системы сборки……………………………………………………………………………………………. 40

Двигаемся дальше……………………………………………………………………………………………………………………… 40

Глава 3. От классов Java к классам Kotlin……………………………………………… 41

Исходный код…………………………………………………………………………………………………………… 41

Простой тип значений……………………………………………………………………………………………………………….. 41

Ограничения классов данных…………………………………………………………………………………………………… 48

Двигаемся дальше……………………………………………………………………………………………………………………… 52

Глава 4. От необязательных типов к обнуляемым…………………………………. 54

Как представить отсутствие чего-либо?………………………………………………………………………………….. 54

Рефракторинг от необязательных типов к обнуляемым…………………………………………………………. 56

Итерация и цикл for……………………………………………………………………………………………………. 58

Рефракторинг с помощью Expand-and-Contract……………………………………………………… 64

Рефракторинг в код, характерный для Kotlin………………………………………………………………………….. 64

Двигаемся дальше……………………………………………………………………………………………………………………… 71

Глава 5. От объектов JavaBeans к значениям…………………………………………. 72

JavaBeans……………………………………………………………………………………………………………………………………. 72

Значения……………………………………………………………………………………………………………………………………… 73

Почему следует выбирать значения?………………………………………………………………………………………. 74

Рефакторинг экземпляров JavaBeans в значения……………………………………………………………………. 74

Равенство объектов…………………………………………………………………………………………………. 81

Двигаемся дальше……………………………………………………………………………………………………………………… 82

Глава 6. От коллекций Java к коллекциям Kotlin………………………………….. 83

Коллекции Java………………………………………………………………………………………………………………………….. 83

Не изменяйте разделяемые коллекции……………………………………………………………………. 86

Коллекции Kotlin………………………………………………………………………………………………………………………… 86

Рефакторинг от коллекций Java к коллекциям Kotlin……………………………………………………………… 89

Подправим код на Java………………………………………………………………………………………………….. 90

Преобразование в Kotlin………………………………………………………………………………………………… 95

Двигаемся дальше……………………………………………………………………………………………………………………… 99

Глава 7. От действий к вычислениям…………………………………………………… 100

Функции……………………………………………………………………………………………………………………………………. 100

Вычисления………………………………………………………………………………………………………………………………. 101

Вычисляемое свойство или функция?………………………………………………………………….. 102

Действия……………………………………………………………………………………………………………………………………. 102

Почему это должно нас волновать?………………………………………………………………………………………. 103

Процедурное программирование…………………………………………………………………………. 104

Почему предпочтение отдается вычислениям?…………………………………………………………………….. 104

Рефракторинг действий в вычисления……………………………………………………………………………………. 105

Существующий код………………………………………………………………………………………………………. 105

2015 был концом времени……………………………………………………………………………………… 109

Улучшенный проект…………………………………………………………………………………………………….. 109

Конец игры……………………………………………………………………………………………………………………. 115

Двигаемся дальше……………………………………………………………………………………………………………………. 118

Глава 8. От статических методов к функциям верхнего уровня……………. 119

Модификатор Static в Java……………………………………………………………………………………………………… 119

Статическое состояние………………………………………………………………………………………….. 119

Функции верхнего уровня в Kotlin, объекты и объекты-компаньоны………………………………….. 120

Рефракторинг от статических методов к функциям верхнего уровня…………………………………. 122

Удобные функции………………………………………………………………………………………………….. 123

Перемещение на верхний уровень………………………………………………………………………………………….. 126

Kotlin’изация……………………………………………………………………………………………………………………………… 127

Перемещение функций верхнего уровня………………………………………………………………. 129

Двигаемся дальше……………………………………………………………………………………………………………………. 129

Глава 9. От многострочных функций к однострочным………………………… 130

Попытка № 1: Замена встроенным выражением…………………………………………………………………… 132

Попытка № 2: Ввести функцию………………………………………………………………………………………………. 133

Попытка № 3: Блок Let…………………………………………………………………………………………………………….. 138

Попытка № 4: Отступление…………………………………………………………………………………………………….. 140

Что должен возвращать метод Parse?……………………………………………………………………….. 143

Двигаемся дальше……………………………………………………………………………………………………………………. 143

Глава 10. От функций к функциям-расширениям………………………………… 145

Функции и методы……………………………………………………………………………………………………………………. 145

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

Расширения и типы функций…………………………………………………………………………………………………… 148

Свойства-расширения……………………………………………………………………………………………………………… 149

Преобразования……………………………………………………………………………………………………………………….. 149

Как именовать преобразования?…………………………………………………………………………… 150

Обнуляемые параметры………………………………………………………………………………………………………….. 151

Обнуляемые получатели…………………………………………………………………………………………………………. 152

Обобщенные расширения……………………………………………………………………………………………………….. 154

Функции-расширения в качестве методов…………………………………………………………………………….. 155

Рефракторинг к функциям-расширениям……………………………………………………………………………….. 155

Двигаемся дальше……………………………………………………………………………………………………………………. 171

Глава 11. От методов к свойствам………………………………………………………… 172

Поля, акцессоры и свойства……………………………………………………………………………………………………. 172

Как выбрать?……………………………………………………………………………………………………………………………. 176

Мутирующие свойства……………………………………………………………………………………………………………. 178

Рефракторинг к свойствам………………………………………………………………………………………………………. 178

Двигаемся дальше……………………………………………………………………………………………………………………. 184

Глава 12. От функций к операторам…………………………………………………….. 185

Базовый класс: Money……………………………………………………………………………………………………………… 185

Добавление определяемого пользователем оператора……………………………………………………….. 187

Вызов нашего оператора из существующего кода Kotlin……………………………………………………. 189

Операторы для существующих классов Java……………………………………………………………………….. 191

Соглашения для аннотаций значений……………………………………………………………………………………. 191

Двигаемся дальше……………………………………………………………………………………………………………………. 195

Глава 13. От потоков к итерируемым объектам и последовательностям. 196

Потоки в Java……………………………………………………………………………………………………………………………. 196

Итераторы в Kotlin…………………………………………………………………………………………………………………… 198

Последовательности в Kotlin………………………………………………………………………………………………….. 199

Замена итераций и последовательностей……………………………………………………………. 199

Множественные итерации………………………………………………………………………………………………………. 200

Выбор между потоками, итераторами и последовательностями……………………………………….. 203

Алгебраическая трансформация……………………………………………………………………………………………. 204

Рефракторинг от потоков к итераторам и последовательностям……………………………………….. 207

Сначала итераторы……………………………………………………………………………………………………… 210

Последовательности…………………………………………………………………………………………………….. 214

Извлечение части конвейера……………………………………………………………………………………….. 218

Итоговая уборка…………………………………………………………………………………………………………… 220

Двигаемся дальше……………………………………………………………………………………………………………………. 221

Глава 14. От накопления объектов к преобразованиям……………………….. 222

Вычисление с использованием параметров накопления……………………………………………………… 222

Рефакторинг функций над немутирующими данными…………………………………………………………. 227

Давайте проделаем это снова………………………………………………………………………………………………… 233

Обогащение обнаруженной нами абстракции……………………………………………………………………… 237

По поводу имен……………………………………………………………………………………………………… 238

Двигаемся дальше……………………………………………………………………………………………………………………. 239

Глава 15. От инкапсулированных коллекций к псевдонимам типов……. 241

Защитные копии…………………………………………………………………………………………………….. 242

Создание коллекций доменов…………………………………………………………………………………………………. 243

Коллекции с другими свойствами………………………………………………………………………………………….. 244

Рефракторинг инкапсулированных коллекций…………………………………………………………………….. 245

Преобразование операций в расширения………………………………………………………………….. 246

Замена псевдонима типа……………………………………………………………………………………………… 248

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

Двигаемся дальше……………………………………………………………………………………………………………………. 257

Глава 16. От интерфейсов к функциям…………………………………………………. 259

Объектно-ориентированная инкапсуляция…………………………………………………………………………… 260

Функциональная инкапсуляция……………………………………………………………………………………………… 263

Функциональные типы в Java…………………………………………………………………………………………………. 266

Сочетание и совмещение………………………………………………………………………………………………………… 269

Выразительные типы функций………………………………………………………………………………. 271

Сравнение подходов……………………………………………………………………………………………………………….. 272

Соединение………………………………………………………………………………………………………………………………. 275

Объектно-ориентированный или функциональный?……………………………………………………………. 276

Наследие Java………………………………………………………………………………………………………………………….. 279

Прослеживаемость…………………………………………………………………………………………………………………… 280

Рефракторинг от интерфейсов к функциям……………………………………………………………………………. 280

Введение функций………………………………………………………………………………………………………… 284

Двигаемся дальше……………………………………………………………………………………………………………………. 288

Глава 17. От мокинга к маппингу………………………………………………………… 289

Повреждение теста, вызванное моком…………………………………………………………………… 290

Замена мокинга маппингом…………………………………………………………………………………………………….. 292

Но действительно ли мы хотим уйти от моков?……………………………………………………………………. 297

Двигаемся дальше……………………………………………………………………………………………………………………. 301

Глава 18. От открытых классов к запечатанным…………………………………. 302

Полиморфизм или запечатанные классы?…………………………………………………………………………….. 306

Преобразование интерфейса в запечатанный класс……………………………………………………………. 307

Двигаемся дальше……………………………………………………………………………………………………………………. 315

Глава 19. От проверяемых исключений к типам результатов………………. 316

Перезагрузка интернет-соединения………………………………………………………………………. 316

Обработка ошибок до появления методов, основанных на исключениях…………………………. 318

Обработка ошибок с исключениями………………………………………………………………………………………. 319

Java и проверяемые исключения……………………………………………………………………………………………. 320

Как должен быть оформлен сбой parseInt?………………………………………………………………… 321

Kotlin и исключения…………………………………………………………………………………………………………………. 322

За пределами исключений: функциональная обработка ошибок………………………………………. 322

Обработка ошибок в Kotlin……………………………………………………………………………………………………… 326

Рефракторинг от исключений к обработке ошибок……………………………………………………………… 327

HTTP……………………………………………………………………………………………………………………….. 328

Наша стратегия преобразования………………………………………………………………………………… 329

Начнем с самого низа…………………………………………………………………………………………………… 330

Именование……………………………………………………………………………………………………………. 331

Контракт……………………………………………………………………………………………………………………….. 335

Отступление………………………………………………………………………………………………………………….. 339

Еще исправления……………………………………………………………………………………………………………………… 343

Слои………………………………………………………………………………………………………………………………………….. 349

Двигаемся дальше……………………………………………………………………………………………………………………. 351

Глава 20. От выполнения ввода/вывода к передаче данных………………… 353

Прослушивание тестов……………………………………………………………………………………………………………. 353

Ввод/вывод данных…………………………………………………………………………………………………………………. 356

Рефакторинг для удобства чтения…………………………………………………………………………. 361

Эффективное написание………………………………………………………………………………………………………….. 361

Еще о стимулах к работе……………………………………………………………………………………….. 361

Эффективное считывание……………………………………………………………………………………………………….. 365

Двигаемся дальше……………………………………………………………………………………………………………………. 370

Глава 21. От исключений к значениям…………………………………………………. 371

Определение того, что может пойти не так…………………………………………………………………………… 371

Представление ошибок……………………………………………………………………………………………………………. 379

А как насчет ввода/вывода?……………………………………………………………………………………………………. 387

Двигаемся дальше……………………………………………………………………………………………………………………. 388

Глава 22. От классов к функциям………………………………………………………… 389

Приемочный тест……………………………………………………………………………………………………………………… 389

Модульное тестирование……………………………………………………………………………………………………….. 394

Заголовки………………………………………………………………………………………………………………………………….. 399

Различные разделители полей……………………………………………………………………………………………….. 408

Последовательности……………………………………………………………………………………………………………….. 415

Считывание из файла………………………………………………………………………………………………………………. 421

Сравнение с Commons CSV……………………………………………………………………………………………………. 426

Двигаемся дальше……………………………………………………………………………………………………………………. 432

Глава 23. Продолжение путешествия……………………………………………………. 433

О сущностях……………………………………………………………………………………………………………………………… 433

Функциональное мышление……………………………………………………………………………………………………. 434

Простая конструкция………………………………………………………………………………………………………………. 436

Функциональное программирование и текстуальные рассуждения………………………………….. 437

Рефакторинг……………………………………………………………………………………………………………………………… 438

Рефакторинг и функциональное мышление…………………………………………………………………………… 439

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

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

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

Дункан Макгрегор
Нэт Прайс

Дункан Макгрегор (Duncan McGregor) и Нэт Прайс (Nat Pryce) — опытные разработчики, консультанты и преподаватели. Ранние последователи как Java, так и Kotlin, они научились сочетать методы объектно-ориентированного и функционального программирования, а  также рефакторинга между этими языками. Их успешные семинары на KotlinConf доказали ценность обучения через рефакторинг и привели к написанию этой книги.

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

Научитесь создавать приложения для Android с нуля!

Разработка Android-приложений с нуля

Вышла книга “Разработка Android-приложений с нуля. 3 изд.”, которая научит вас разрабатывать профессиональные, полнофункциональные приложения для Android, даже если раньше вы никогда не программировали!

Доступно изложены основы программирования на Java для Android, включая объектно-ориентированное программирование. Описаны установка и настройка среды разработки Android Studio, создание функциональных пользовательских интерфейсов с помощью визуального редактора Android Studio. Раскрыты принципы материального дизайна. Рассмотрены компоновки CardView и ScrollView, обработка касаний экрана, захват данных, использование в приложении звука и анимации, поддержка различных версий Android и нескольких языков интерфейса. Затронута тема хранения данных во встроенной базе данных SQLite. Показаны паттерны проектирования, используемые профессионалами для создания современных мобильных приложений.

Вы хотите сделать карьеру в программировании, но не знаете с чего начать? У вас есть отличная идея для мобильного приложения, и вы мечтаете воплотить ее в жизнь? Эта книга поможет реализовать ваши идеи и станет незаменимым руководством по созданию приложений для Android с нуля!

Вы познакомитесь со всеми фундаментальными понятиями программирования для Android, начиная с основ Java и заканчивая работой с Android API.

Вы изучите основы создания мобильных приложений в Android Studio и принципы объектно-ориентированного программирования.

Вы освоите разработку приложений с профессиональным современным интерфейсом и возможностью хранения пользовательских данных в базе SQLite.

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

Вы будете готовы создавать собственные профессиональные приложения для Android на Java.

  • Фундаментальные основы программирования для Android
  • Использование всех возможностей Android Studio
  • Разработка современных интерфейсов для мобильных приложений и материальный дизайн
  • Синтаксис и возможности языка Java
  • Объектно-ориентированное программирование
  • Сохранение и совместное использование данных
  • Анимация, рисование и графика, звуковые эффекты
  • Поддержка различных версий Android и нескольких языков интерфейса
  • Использование баз данных

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

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

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

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

Как получить максимум пользы от этой книги……………………………………………………………………….. 21

Файлы с примерами кода………………………………………………………………………………………………………….. 22

Цветные изображения……………………………………………………………………………………………………………….. 22

Условные обозначения……………………………………………………………………………………………………………… 22

Контакты…………………………………………………………………………………………………………………………………….. 23

Отзывы………………………………………………………………………………………………………………………………………… 23

Глава 1. Начало работы с Android и Java…………………………………………………………………………….. 24

Технические требования…………………………………………………………………………………………………………… 25

Новое в третьем издании…………………………………………………………………………………………………………… 25

Почему Java и Android?…………………………………………………………………………………………………………….. 26

Первый камень преткновения для новичков……………………………………………………………………………. 27

Как Java и Android работают вместе……………………………………………………………………………………….. 27

Что такое Android API………………………………………………………………………………………………………… 28

Java — объектно-ориентированный язык программирования………………………………………. 29

Повторим: что такое Android…………………………………………………………………………………………….. 31

Android Studio……………………………………………………………………………………………………………………… 31

Настройка Android Studio…………………………………………………………………………………………………………. 32

Что делает приложение для Android?………………………………………………………………………………………. 35

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

Структура кода Java в Android…………………………………………………………………………………………………. 36

Пакеты…………………………………………………………………………………………………………………………………. 36

Классы………………………………………………………………………………………………………………………………… 37

Методы……………………………………………………………………………………………………………………………….. 37

Создание нашего первого приложения для Android……………………………………………………………….. 38

Развертывание приложения на данном этапе…………………………………………………………………………. 42

Запуск и отладка приложения на эмуляторе Android…………………………………………………….. 43

Запуск приложения на реальном устройстве………………………………………………………………….. 45

Часто задаваемые вопросы………………………………………………………………………………………………………. 47

Итоги…………………………………………………………………………………………………………………………………………… 47

Глава 2. Первое знакомство: Java, XML и визуальный редактор…………………………………… 48

Технические требования…………………………………………………………………………………………………………… 48

Изучение вывода Logcat……………………………………………………………………………………………………………. 48

Фильтрация вывода Logcat……………………………………………………………………………………………….. 49

Java-проект и XML-код основной компоновки……………………………………………………………………….. 50

Файл MainActivity.java……………………………………………………………………………………………………… 50

Сворачивание (скрытие) кода в Android Studio……………………………………………………… 50

Объявление пакета……………………………………………………………………………………………………. 51

Импорт классов…………………………………………………………………………………………………………. 52

Класс………………………………………………………………………………………………………………………….. 52

Методы внутри класса……………………………………………………………………………………………… 53

Итог по коду Java на данный момент……………………………………………………………………… 53

Файл компоновки приложения………………………………………………………………………………………….. 53

Элементы компоновки пользовательского интерфейса………………………………………… 56

Текстовые элементы пользовательского интерфейса……………………………………………. 56

Элементы-кнопки пользовательского интерфейса………………………………………………… 57

Добавление кнопок в основной файл компоновки………………………………………………………………….. 57

Добавление кнопки с использованием визуального редактора…………………………………….. 58

Редактирование атрибутов кнопки…………………………………………………………………………. 60

XML-код новой кнопки…………………………………………………………………………………………….. 62

Добавление кнопки путем редактирования XML-кода………………………………………………….. 63

Назначение кнопкам уникальных атрибутов id……………………………………………………………… 65

Размещение двух кнопок в компоновке……………………………………………………………………………. 65

Как заставить кнопки вызывать разные методы……………………………………………………………… 68

Комментирование Java-кода…………………………………………………………………………………………………….. 69

Отправка сообщений пользователю и разработчику…………………………………………………………….. 69

Написание первого Java-кода………………………………………………………………………………………………….. 70

Добавление кода с сообщением в метод onCreate………………………………………………………….. 70

Изучение вывода……………………………………………………………………………………………………….. 71

Написание собственных методов Java…………………………………………………………………………….. 72

Изучение вывода……………………………………………………………………………………………………….. 74

Часто задаваемые вопросы………………………………………………………………………………………………………. 75

Итоги…………………………………………………………………………………………………………………………………………… 75

Глава 3. Android Studio и структура проекта………………………………………………………………………. 77

Технические требования…………………………………………………………………………………………………………… 78

Проводник проекта и анатомия проекта…………………………………………………………………………………. 78

Структура файлов и папок в шаблоне проекта Empty Activity…………………………………………….. 78

Проект Empty Activity………………………………………………………………………………………………………… 80

Папка manifests………………………………………………………………………………………………………….. 81

Папка java………………………………………………………………………………………………………………….. 83

Папка Java (generated)……………………………………………………………………………………………… 86

Папка res……………………………………………………………………………………………………………………. 86

Папка res/drawable……………………………………………………………………………………………………. 86

Папка res/layout………………………………………………………………………………………………………… 87

Папка res/mipmap………………………………………………………………………………………………………. 87

Папка res/values………………………………………………………………………………………………………… 89

Файл colors.xml………………………………………………………………………………………………………….. 89

Файл strings.xml…………………………………………………………………………………………………………. 90

Cтруктура файлов и папок в шаблоне проекта Basic Activity……………………………………………….. 92

Проект Basic Activity………………………………………………………………………………………………………………….. 93

Файл MainActivity.java……………………………………………………………………………………………… 93

Файл activity_main.xml……………………………………………………………………………………………… 96

Дополнительные методы в MainActivity.java…………………………………………………………. 97

Эмулятор Android………………………………………………………………………………………………………………………. 98

Панель управления эмулятором……………………………………………………………………………………….. 99

Использование эмулятора как реального устройства………………………………………………….. 100

Доступ к панели приложений………………………………………………………………………………… 100

Просмотр активных приложений и переключение между приложениями………… 101

Итоги…………………………………………………………………………………………………………………………………………. 102

Глава 4. Начало работы с компоновками и материальный дизайн…………………………….. 103

Технические требования…………………………………………………………………………………………………………. 104

Материальный дизайн…………………………………………………………………………………………………………….. 104

Дизайн пользовательского интерфейса Android…………………………………………………………………… 104

Компоновки………………………………………………………………………………………………………………………………. 105

Создание и изучение проекта компоновок…………………………………………………………………….. 105

Создание компоновки с помощью LinearLayout…………………………………………………………… 106

Добавление типа компоновки LinearLayout в проект…………………………………………………… 107

Подготовка рабочего пространства………………………………………………………………………………. 108

Изучение сгенерированного XML-кода…………………………………………………………………………. 108

Добавление TextView в пользовательский интерфейс………………………………………………….. 110

Добавление многострочного TextView в пользовательский интерфейс……………………… 112

Подключение пользовательского интерфейса с помощью кода Java. Часть 1…………… 113

Добавление компоновок в компоновки………………………………………………………………………….. 116

Украшение компоновки…………………………………………………………………………………………………… 119

Подключение пользовательского интерфейса с помощью кода Java. Часть 2…………… 121

Создание точного пользовательского интерфейса с помощью ConstraintLayout……………… 121

Добавление CalendarView……………………………………………………………………………………………….. 121

Изменение размера представления в ConstraintLayout……………………………………….. 122

Использование окна Component Tree……………………………………………………………………. 122

Добавление ограничений вручную……………………………………………………………………….. 124

Добавление и ограничение дополнительных элементов пользовательского интерфейса 126

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

Размещение данных с помощью TableLayout……………………………………………………………………….. 129

Добавление элемента TableRow…………………………………………………………………………………….. 130

Использование Component Tree для решения задач, невыполнимых
в визуальном редакторе…………………………………………………………………………………………. 130

Организация столбцов таблицы……………………………………………………………………………………… 132

Добавление ссылки на главное меню…………………………………………………………………………………….. 134

Итоги…………………………………………………………………………………………………………………………………………. 135

Глава 5. Красивые компоновки на основе CardView и ScrollView………………………………… 136

Технические требования…………………………………………………………………………………………………………. 136

Атрибуты пользовательского интерфейса…………………………………………………………………………….. 136

Размеры и использование dp…………………………………………………………………………………………… 136

Размеры шрифтов и использование sp……………………………………………………………………………. 137

Определение размера с wrap и match…………………………………………………………………………….. 139

Использование padding и margin……………………………………………………………………………………. 140

Использование свойства layout_weight…………………………………………………………………………. 141

Использование gravity……………………………………………………………………………………………………… 142

Создание пользовательского интерфейса с помощью CardView и ScrollView…………………… 144

Настройка представления с помощью кода Java…………………………………………………………. 144

Добавление изображений……………………………………………………………………………………………….. 145

Создание контента для карточек……………………………………………………………………………………. 146

Определение размеров для CardView…………………………………………………………………………….. 149

Добавление CardView в компоновку………………………………………………………………………………. 149

Добавление файлов компоновки внутрь другой компоновки……………………………… 151

Создание эмулятора планшета………………………………………………………………………………………………. 154

Часто задаваемые вопросы…………………………………………………………………………………………………….. 156

Итоги…………………………………………………………………………………………………………………………………………. 156

Глава 6. Жизненный цикл Android…………………………………………………………………………………….. 157

Технические требования…………………………………………………………………………………………………………. 157

Жизнь приложения для Android……………………………………………………………………………………………… 158

Взаимодействие Android с приложениями…………………………………………………………………………….. 158

Упрощенное объяснение жизненного цикла Android……………………………………………………………. 159

Демистификация фаз жизненного цикла………………………………………………………………………… 160

Работа с фазами жизненного цикла……………………………………………………………………………………….. 161

Демонстрационное приложение жизненного цикла…………………………………………………………….. 163

Написание кода для демонстрационного приложения жизненного цикла………………… 164

Запуск демонстрационного приложения жизненного цикла……………………………………….. 166

Вывод демонстрационного приложения жизненного цикла………………………………………… 167

Некоторые другие переопределенные методы……………………………………………………………… 168

Еще раз о структуре кода Java……………………………………………………………………………………………….. 170

Представление фрагментов и жизненного цикла………………………………………………………………….. 171

Итоги…………………………………………………………………………………………………………………………………………. 172

Глава 7. Переменные, операторы и выражения Java………………………………………………………. 173

Технические требования…………………………………………………………………………………………………………. 173

Java повсюду……………………………………………………………………………………………………………………………. 174

Синтаксис и жаргон Java………………………………………………………………………………………………………… 174

Дополнительные комментарии к коду……………………………………………………………………………. 175

Хранение и использование данных с переменными…………………………………………………………….. 177

Типы переменных…………………………………………………………………………………………………………….. 178

Примитивные типы…………………………………………………………………………………………………. 178

Ссылочные типы…………………………………………………………………………………………………….. 181

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

Объявление переменной………………………………………………………………………………………………………….. 182

Инициализация переменной……………………………………………………………………………………………………. 183

Изменение значений переменных с помощью операторов………………………………………………….. 184

Оператор присваивания………………………………………………………………………………………………….. 184

Оператор сложения………………………………………………………………………………………………………….. 184

Оператор вычитания……………………………………………………………………………………………………….. 185

Оператор деления…………………………………………………………………………………………………………….. 185

Оператор умножения……………………………………………………………………………………………………….. 185

Оператор инкремента………………………………………………………………………………………………………. 186

Оператор декремента………………………………………………………………………………………………………. 186

Выражения Java………………………………………………………………………………………………………………………. 186

Демоприложение Expressing Yourself…………………………………………………………………………….. 187

Итог…………………………………………………………………………………………………………………………………………… 189

Глава 8. Условия и циклы Java…………………………………………………………………………………………… 190

Технические требования…………………………………………………………………………………………………………. 190

Принятие решений в Java………………………………………………………………………………………………………… 191

Отступы в коде для ясности…………………………………………………………………………………………….. 191

Больше операторов………………………………………………………………………………………………………….. 192

Оператор сравнения……………………………………………………………………………………………….. 192

Логический оператор отрицания…………………………………………………………………………… 192

Оператор НЕравенства………………………………………………………………………………………….. 193

Оператор «больше»………………………………………………………………………………………………… 193

Оператор «меньше»………………………………………………………………………………………………… 193

Оператор «больше или равно»………………………………………………………………………………. 193

Оператор «меньше или равно»………………………………………………………………………………. 193

Логический оператор «И»………………………………………………………………………………………. 193

Логический оператор «ИЛИ»…………………………………………………………………………………. 194

Оператор модуля…………………………………………………………………………………………………….. 194

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

Использование ключевого слова if языка Java…………………………………………………….. 194

Switch и принятие решений…………………………………………………………………………………………………….. 197

Демоприложение Switch………………………………………………………………………………………………….. 198

Повторение кода с циклами……………………………………………………………………………………………………. 200

Циклы while………………………………………………………………………………………………………………………. 200

Выход из цикла……………………………………………………………………………………………………….. 202

Ключевое слово continue……………………………………………………………………………………….. 203

Циклы do while…………………………………………………………………………………………………………………. 204

Циклы for………………………………………………………………………………………………………………………………….. 205

Демоприложение Loops для работы с циклами……………………………………………………………………. 206

Итоги…………………………………………………………………………………………………………………………………………. 209

Глава 9. Методы Java…………………………………………………………………………………………………………….. 210

Технические требования…………………………………………………………………………………………………………. 210

Еще раз о методах……………………………………………………………………………………………………………………. 210

Java-методы……………………………………………………………………………………………………………………… 211

Структура метода……………………………………………………………………………………………………………………. 211

Модификатор……………………………………………………………………………………………………………………. 212

Возвращаемый тип…………………………………………………………………………………………………………… 213

Имя метода……………………………………………………………………………………………………………………….. 214

Параметры………………………………………………………………………………………………………………………… 215

Тело метода………………………………………………………………………………………………………………………. 216

Демонстрационное приложение для изучения методов………………………………………………………. 216

Методы Real world…………………………………………………………………………………………………………… 217

Обнаружение области видимости переменной……………………………………………………. 218

Перегрузка метода…………………………………………………………………………………………………………………… 219

Еще раз об области видимости и переменных………………………………………………………………………. 221

Рекурсия метода………………………………………………………………………………………………………………………. 222

Вопросы……………………………………………………………………………………………………………………………………. 224

Итоги…………………………………………………………………………………………………………………………………………. 225

Самостоятельное чтение…………………………………………………………………………………………………………. 226

Глава 10. Объектно-ориентированное программирование…………………………………………… 227

Технические требования…………………………………………………………………………………………………………. 227

Важное предупреждение об управлении памятью………………………………………………………………. 227

Объектно-ориентированное программирование………………………………………………………………….. 228

Что такое ООП?………………………………………………………………………………………………………………… 228

Инкапсуляция………………………………………………………………………………………………………….. 228

Полиморфизм…………………………………………………………………………………………………………… 229

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

Почему надо делать именно так?…………………………………………………………………………………… 230

Резюме: класс……………………………………………………………………………………………………………………. 230

Код класса………………………………………………………………………………………………………………………………… 230

Реализация класса……………………………………………………………………………………………………………. 231

Объявление, инициализация и использование объекта класса……………………………………. 231

Приложение Basic Classes……………………………………………………………………………………………………….. 234

Что еще можно сделать с нашим первым классом………………………………………………………… 237

Часто задаваемые вопросы…………………………………………………………………………………………………….. 238

Итоги…………………………………………………………………………………………………………………………………………. 238

Глава 11. Больше объектно-ориентированного программирования…………………………… 239

Технические требования…………………………………………………………………………………………………………. 239

Вы еще помните об инкапсуляции?……………………………………………………………………………………….. 239

Управление доступом к классам с помощью модификаторов доступа………………………. 240

Модификаторы доступа к классам……………………………………………………………………….. 241

Резюме: доступ к классам………………………………………………………………………………………. 241

Управление доступом к переменным с помощью модификаторов доступа……………….. 241

Модификаторы доступа к переменным………………………………………………………………… 242

Резюме: доступ к переменным……………………………………………………………………………….. 243

Методы и модификаторы доступа…………………………………………………………………………………. 243

Модификаторы доступа к методам………………………………………………………………………. 243

Резюме: доступ к методу………………………………………………………………………………………… 244

Доступ к private-переменным с помощью геттеров и сеттеров………………………………… 244

Настройка объектов с помощью конструкторов…………………………………………………………… 247

Статические методы………………………………………………………………………………………………………………… 249

Мини-приложение инкапсуляции и статических методов…………………………………………………… 251

ООП и наследование……………………………………………………………………………………………………………….. 255

Приложение с наследованием………………………………………………………………………………………………… 257

Полиморфизм……………………………………………………………………………………………………………………………. 261

Абстрактные классы………………………………………………………………………………………………………… 262

Интерфейсы………………………………………………………………………………………………………………………. 263

Часто задаваемые вопросы…………………………………………………………………………………………………….. 265

Итоги…………………………………………………………………………………………………………………………………………. 265

Глава 12. Стек, куча и сборщик мусора…………………………………………………………………………….. 266

Технические требования…………………………………………………………………………………………………………. 266

Все элементы пользовательского интерфейса Android — тоже классы……………………………… 266

Ссылки: повторное знакомство………………………………………………………………………………………. 267

Небольшой перерыв, чтобы выбросить мусор…………………………………………………….. 267

Шесть фактов о стеке и куче………………………………………………………………………………….. 268

В чем польза этой кучи?………………………………………………………………………………………………….. 268

Использование кнопок и виджетов TextView из компоновки………………………………………… 269

Запуск приложения………………………………………………………………………………………………………….. 277

Внутренние и анонимные классы…………………………………………………………………………………………… 278

Часто задаваемые вопросы…………………………………………………………………………………………………….. 279

Итоги…………………………………………………………………………………………………………………………………………. 279

Глава 13. Анонимные классы. Оживление виджетов Android……………………………………….. 280

Технические требования…………………………………………………………………………………………………………. 281

Объявление и инициализация объектов…………………………………………………………………………………. 281

Создание виджетов пользовательского интерфейса из Java без XML……………………………….. 281

Изучение палитры. Часть 1…………………………………………………………………………………………………….. 282

Виджет EditText………………………………………………………………………………………………………………… 283

Виджет ImageView……………………………………………………………………………………………………………. 283

Радиокнопки и группы…………………………………………………………………………………………………….. 284

Анонимные классы………………………………………………………………………………………………………………….. 285

Изучение палитры и анонимные классы. Часть 2…………………………………………………………………. 288

Switch………………………………………………………………………………………………………………………………… 288

CheckBox…………………………………………………………………………………………………………………………… 289

TextClock…………………………………………………………………………………………………………………………… 290

Использование WebView………………………………………………………………………………………………….. 290

Приложение Widget Exploration……………………………………………………………………………………………… 291

Настройка проекта Widget Exploration и его пользовательского интерфейса……………. 291

Написание кода для приложения Widget Exploration…………………………………………………… 297

Получение ссылок на все части пользовательского интерфейса……………………….. 297

Написание кода с чекбоксами……………………………………………………………………………….. 299

Написание кода с радиокнопками………………………………………………………………………… 301

Использование анонимного класса для обычной кнопки Button……………………….. 302

Написание кода для виджета Switch…………………………………………………………………….. 303

Использование WebView…………………………………………………………………………………………………………. 304

Запуск приложения Widget Exploration………………………………………………………………………………….. 304

Итоги…………………………………………………………………………………………………………………………………………. 306

Глава 14. Диалоговые окна Android…………………………………………………………………………………… 307

Технические требования…………………………………………………………………………………………………………. 307

Диалоговые окна……………………………………………………………………………………………………………………… 307

Создание проекта Dialog Demo………………………………………………………………………………………. 308

Написание кода класса DialogFragment……………………………………………………………………….. 308

Использование цепочки для конфигурации DialogFragment……………………………… 310

Использование класса DialogFragment…………………………………………………………………………. 311

Приложение Note to Self………………………………………………………………………………………………………….. 313

Применение соглашений об именах и строковых ресурсах………………………………………… 314

Получение файлов кода для приложения Note to Self………………………………………………….. 314

Завершенное приложение……………………………………………………………………………………………….. 315

Создание проекта…………………………………………………………………………………………………………….. 318

Подготовка строковых ресурсов…………………………………………………………………………………….. 318

Написание кода класса Note…………………………………………………………………………………………… 319

Реализация компоновок для диалоговых окон……………………………………………………………… 321

Написание кода диалоговых окон…………………………………………………………………………………. 325

Написание кода класса DialogNewNote……………………………………………………………….. 325

Написание кода класса DialogShowNote……………………………………………………………… 329

Удаление ненужных автосгенерированных фрагментов……………………………………. 331

Демонстрация диалоговых окон…………………………………………………………………………………….. 332

Написание кода плавающей кнопки действия…………………………………………………….. 333

Итоги…………………………………………………………………………………………………………………………………………. 336

Глава 15. Массивы, словари Map и случайные числа……………………………………………………… 337

Технические требования…………………………………………………………………………………………………………. 337

«Случайное» отступление………………………………………………………………………………………………………. 338

Обработка больших объемов данных с помощью массивов……………………………………………….. 338

Массивы — это объекты…………………………………………………………………………………………………. 340

Пример мини-приложения с простым массивом…………………………………………………………………… 341

Реализация динамического массива………………………………………………………………………………………. 342

Мини-приложение с динамическим массивом………………………………………………………………. 343

Работа с многомерными массивами………………………………………………………………………………………. 344

Мини-приложение с многомерным массивом……………………………………………………………….. 344

Исключения Array-out-of-bounds…………………………………………………………………………………….. 347

Структура данных ArrayList…………………………………………………………………………………………………… 348

Расширенный цикл for……………………………………………………………………………………………………… 349

Полиморфизм массивов и экземпляров ArrayList………………………………………………………………….. 350

Больше коллекций Java: HashMap…………………………………………………………………………………………. 351

Приложение Note to Self………………………………………………………………………………………………………….. 352

Часто задаваемые вопросы…………………………………………………………………………………………………….. 353

Итоги…………………………………………………………………………………………………………………………………………. 353

Глава 16. Адаптеры и классы Recycler……………………………………………………………………………….. 354

Технические требования…………………………………………………………………………………………………………. 354

RecyclerView и RecyclerAdapter………………………………………………………………………………………………. 354

Проблема с отображением большого количества виджетов……………………………………….. 355

Решение проблемы отображения большого количества виджетов…………………………….. 355

Практическое применение RecyclerView и RecyclerAdapter…………………………………………. 356

Настройка RecyclerView с RecyclerAdapter и заметками ArrayList……………………………… 357

Добавление RecyclerView, RecyclerAdapter и ArrayList в проект Note to Self……………………… 358

Удаление временной кнопки Show Note и добавление RecyclerView………………………………….. 358

Создание элемента списка для RecyclerView………………………………………………………………… 359

Написание кода класса RecyclerAdapter……………………………………………………………………….. 360

Написание кода конструктора NoteAdapter………………………………………………………… 364

Написание кода метода onCreateViewHolder………………………………………………………. 364

Написание метода onBindViewHolder………………………………………………………………….. 365

Написание кода метода getItemCount…………………………………………………………………… 365

Написание кода внутреннего класса ListItemHolder…………………………………………… 366

Написание кода MainActivity для использования классов RecyclerView и RecyclerAdapter          367

Добавление кода в метод onCreate……………………………………………………………………….. 367

Изменение метода addNote…………………………………………………………………………………….. 368

Написание метода showNote…………………………………………………………………………………. 368

Запуск приложения………………………………………………………………………………………………………………….. 369

Часто задаваемые вопросы…………………………………………………………………………………………………….. 370

Итоги…………………………………………………………………………………………………………………………………………. 370

Глава 17. Сохранение и совместное использование данных…………………………………………. 371

Технические требования…………………………………………………………………………………………………………. 371

«Намерения» Android………………………………………………………………………………………………………………. 372

Переключение Activity……………………………………………………………………………………………………… 372

Передача данных между активностями…………………………………………………………………………. 373

Добавление страницы настроек в Note to Self………………………………………………………………………. 374

Создание SettingsActivity…………………………………………………………………………………………………. 374

Разработка компоновки экрана настроек……………………………………………………………………… 375

Предоставление пользователю возможности переключаться на экран настроек…….. 375

Сохранение данных с помощью SharedPreferences……………………………………………………………… 377

Загрузка данных с помощью SharedPreferences…………………………………………………………………… 378

Сохранение настроек приложения Note to Self…………………………………………………………………….. 379

Написание кода класса SettingsActivity…………………………………………………………………………. 379

Написание кода класса MainActivity……………………………………………………………………………… 381

Более продвинутый способ сохранения данных………………………………………………………………….. 383

Классы JSON…………………………………………………………………………………………………………………….. 383

Исключения Java: try, catch и finally………………………………………………………………………………. 384

Резервное копирование пользовательских данных в Note to Self……………………………………….. 385

Часто задаваемые вопросы…………………………………………………………………………………………………….. 391

Итоги…………………………………………………………………………………………………………………………………………. 391

Глава 18. Локализация…………………………………………………………………………………………………………. 392

Технические требования…………………………………………………………………………………………………………. 392

Реализация поддержки испанского и немецкого языков в приложении Note to Self………….. 392

Добавление поддержки испанского языка…………………………………………………………………….. 393

Добавление поддержки немецкого языка………………………………………………………………………. 393

Добавление строковых ресурсов……………………………………………………………………………………. 394

Запуск приложения Note to Self на немецком или испанском языке…………………………………… 396

Выполнение переводов в коде Java………………………………………………………………………………… 396

Итоги…………………………………………………………………………………………………………………………………………. 399

Глава 19. Анимация и интерполяторы………………………………………………………………………………. 400

Технические требования…………………………………………………………………………………………………………. 400

Анимации в Android…………………………………………………………………………………………………………………. 400

Создание интересной анимации в XML…………………………………………………………………………. 401

Исчезновение и появление……………………………………………………………………………………… 401

Движение…………………………………………………………………………………………………………………. 401

Масштабирование, или растяжение……………………………………………………………………… 401

Контроль продолжительности………………………………………………………………………………. 402

Вращение…………………………………………………………………………………………………………………. 402

Повторение анимации…………………………………………………………………………………………….. 402

Комбинирование эффектов анимации с помощью set…………………………………………. 402

Создание анимаций и управление ими с помощью кода Java…………………………………….. 403

Дополнительные функции анимации……………………………………………………………………………… 403

Слушатели анимации…………………………………………………………………………………………….. 403

Интерполяторы анимации……………………………………………………………………………………… 404

Демонстрационное приложение анимации. Знакомство с SeekBar…………………………………….. 405

Демонстрационная анимация…………………………………………………………………………………………. 405

Написание кода XML-анимации……………………………………………………………………………………. 408

Использование Java в демонстрационном приложении анимации…………………………….. 412

Часто задаваемые вопросы…………………………………………………………………………………………………….. 420

Итоги…………………………………………………………………………………………………………………………………………. 421

Глава 20. Рисование и графика…………………………………………………………………………………………… 422

Технические требования…………………………………………………………………………………………………………. 422

Понятие о классе Canvas…………………………………………………………………………………………………………. 422

Рисование с помощью Bitmap, Canvas и ImageView……………………………………………………… 423

Canvas и Bitmap………………………………………………………………………………………………………. 423

Paint…………………………………………………………………………………………………………………………. 423

ImageView и Activity………………………………………………………………………………………………… 424

Краткий обзор Canvas, Bitmap, Paint и ImageView………………………………………………. 424

Использование класса Canvas………………………………………………………………………………………………… 425

Подготовка экземпляров необходимых классов…………………………………………………………… 425

Инициализация объектов………………………………………………………………………………………………… 425

Настройка содержимого Activity……………………………………………………………………………………. 426

Демонстрационное приложение Canvas……………………………………………………………………………….. 426

Создание нового проекта………………………………………………………………………………………………… 426

Написание кода демонстрационного приложения Canvas………………………………… 427

Инициализация Bitmap…………………………………………………………………………………………… 428

Рисование на экране……………………………………………………………………………………………….. 428

Метод Color.argb……………………………………………………………………………………………………. 429

Система координат Android……………………………………………………………………………………………………. 431

Черчение и рисование……………………………………………………………………………………………………… 431

Создание растровых изображений………………………………………………………………………………………… 432

Управление растровыми изображениями……………………………………………………………………………… 433

Что такое растровое изображение…………………………………………………………………………………. 433

Класс Matrix……………………………………………………………………………………………………………………… 433

Поворот растрового изображения в противоположное направление……………….. 434

Поворот растрового изображения вверх или вниз………………………………………………. 435

Демонстрационное приложение для работы с растровыми изображениями…………………….. 436

Добавление графики в проект…………………………………………………………………………………………. 436

Часто задаваемые вопросы…………………………………………………………………………………………………….. 440

Итоги…………………………………………………………………………………………………………………………………………. 440

Глава 21. Потоки. Разработка приложения для интерактивного рисования……………… 441

Технические требования…………………………………………………………………………………………………………. 441

Создание проекта Live Drawing………………………………………………………………………………………………. 441

Рефакторинг MainActivity в LiveDrawingActivity…………………………………………………………… 442

Блокировка игры в полноэкранном альбомном режиме………………………………………………. 442

Создание классов для нового приложения…………………………………………………………… 443

О структуре приложения Live Drawing…………………………………………………………………………… 443

Написание кода класса LiveDrawingActivity…………………………………………………………………. 444

Написание кода класса LiveDrawingView……………………………………………………………………… 447

Добавление полей класса………………………………………………………………………………………. 449

Написание кода конструктора LiveDrawingView………………………………………………… 451

Написание кода метода draw………………………………………………………………………………… 453

Добавление метода printDebuggingText……………………………………………………………….. 454

Метод draw и класс SurfaceView…………………………………………………………………………… 455

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

Потоки………………………………………………………………………………………………………………………………………. 458

Возможные проблемы с потоками………………………………………………………………………………….. 459

Реализация игрового цикла с помощью потока……………………………………………………………………. 462

Реализация Runnable и подготовка метода run…………………………………………………………….. 462

Написание кода потока…………………………………………………………………………………………………… 463

Запуск и остановка потока……………………………………………………………………………………………… 463

Использование жизненного цикла Activity для запуска и остановки потока……………… 464

Написание кода метода run……………………………………………………………………………………………. 464

Запуск приложения………………………………………………………………………………………………………………….. 467

Итоги…………………………………………………………………………………………………………………………………………. 468

Глава 22. Системы частиц и обработка касаний экрана……………………………………………….. 469

Технические требования…………………………………………………………………………………………………………. 469

Добавление пользовательских кнопок на экран…………………………………………………………………… 470

Реализация эффекта системы частиц…………………………………………………………………………………….. 470

Написание кода класса Particle……………………………………………………………………………………… 471

Написание кода класса ParticleSystem………………………………………………………………………….. 473

Создание систем частиц в классе LiveDrawingView……………………………………………………… 478

Обработка касаний………………………………………………………………………………………………………………….. 479

Написание кода метода onTouchEvent………………………………………………………………………….. 481

Завершение создания HUD……………………………………………………………………………………………… 482

Запуск приложения………………………………………………………………………………………………………………….. 483

Profiler: инструмент профилирования Android Studio………………………………………………………….. 484

Итоги…………………………………………………………………………………………………………………………………………. 487

Глава 23. Поддержка различных версий Android, звуковые эффекты
и виджет Spinner……………………………………………………………………………………………………………………… 488

Работа с разными версиями Android………………………………………………………………………………………. 488

Определение текущей версии Android……………………………………………………………………………. 489

Класс SoundPool……………………………………………………………………………………………………………………… 489

Инициализация SoundPool новым способом…………………………………………………………………. 490

Инициализация SoundPool старым способом……………………………………………………………….. 491

Загрузка звуковых файлов в память……………………………………………………………………… 491

Воспроизведение звука…………………………………………………………………………………………… 492

Остановка звука………………………………………………………………………………………………………. 493

Звуковое демонстрационное приложение и знакомство с виджетом Spinner……………………. 493

Создание звуковых эффектов………………………………………………………………………………………….. 493

Настройка звука………………………………………………………………………………………………………………. 496

Написание кода звукового демоприложения………………………………………………………………… 498

Итоги…………………………………………………………………………………………………………………………………………. 502

Глава 24. Шаблоны проектирования, множество компоновок и фрагменты…………….. 503

Технические требования…………………………………………………………………………………………………………. 503

Паттерн model-view-controller………………………………………………………………………………………………… 504

Рекомендации по дизайну приложений для Android…………………………………………………………….. 505

Реальные приложения……………………………………………………………………………………………………………… 506

Мини-приложение для обнаружения устройств…………………………………………………………………… 508

Написание кода класса MainActivity……………………………………………………………………………… 511

Разблокировка автоповорота экрана……………………………………………………………………. 512

Запуск приложения………………………………………………………………………………………………………….. 513

Квалификаторы конфигурации………………………………………………………………………………………………. 514

Ограничение квалификаторов конфигурации……………………………………………………………….. 516

Фрагменты………………………………………………………………………………………………………………………………… 517

Фрагменты: жизненный цикл………………………………………………………………………………………….. 517

Управление фрагментами с помощью FragmentManager…………………………………………….. 517

Наше первое приложение с Fragment……………………………………………………………………………………. 519

Проверка фрагмента в реальных условиях…………………………………………………………………………… 524

Часто задаваемые вопросы…………………………………………………………………………………………………….. 525

Итоги…………………………………………………………………………………………………………………………………………. 525

Глава 25. Создание приложения простой галереи изображений…………………………………… 526

Технические требования…………………………………………………………………………………………………………. 526

Классическое свайп-меню Angry Birds…………………………………………………………………………………… 526

Создание галереи изображений (слайдера)………………………………………………………………………….. 527

Реализация компоновки…………………………………………………………………………………………………… 528

Написание кода класса PagerAdapter……………………………………………………………………………. 529

Написание кода класса MainActivity……………………………………………………………………………… 531

Запуск приложения галереи……………………………………………………………………………………………. 533

Итог…………………………………………………………………………………………………………………………………………… 533

Глава 26. Расширенный пользовательский интерфейс с Navigation Drawer и Fragment 534

Технические требования…………………………………………………………………………………………………………. 534

Знакомство с NavigationView…………………………………………………………………………………………………. 535

Простое приложение базы данных………………………………………………………………………………………… 536

Insert………………………………………………………………………………………………………………………………….. 536

Delete…………………………………………………………………………………………………………………………………. 536

Search………………………………………………………………………………………………………………………………… 537

Results………………………………………………………………………………………………………………………………… 538

Реализация проекта Age Database………………………………………………………………………………………….. 538

Изучение автоматически сгенерированного кода и ресурсов…………………………………………….. 538

Написание кода классов Fragment и их компоновок……………………………………………………. 540

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

Написание классов………………………………………………………………………………………………………….. 540

Разработка компоновок…………………………………………………………………………………………………… 543

Разработка content_insert.xml…………………………………………………………………………………………. 543

Разработка content_delete.xml………………………………………………………………………………………… 543

Разработка content_search.xml……………………………………………………………………………………….. 544

Разработка content_results.xml……………………………………………………………………………………….. 545

Использование классов Fragment и их компоновок……………………………………………………………… 545

Редактирование меню Navigation Drawer……………………………………………………………………… 545

Добавление держателя к основной компоновке……………………………………………………………. 546

Написание кода класса MainActivity.java……………………………………………………………………… 547

Итоги…………………………………………………………………………………………………………………………………………. 550

Глава 27. Базы данных Android…………………………………………………………………………………………… 551

Технические требования…………………………………………………………………………………………………………. 551

Базы данных…………………………………………………………………………………………………………………………….. 552

Что такое база данных?…………………………………………………………………………………………………… 552

Что такое SQL?…………………………………………………………………………………………………………………. 552

Что такое SQLite?……………………………………………………………………………………………………………… 552

Учебник по синтаксису SQL……………………………………………………………………………………………………. 553

Пример кода SQLite………………………………………………………………………………………………………….. 553

Создание таблицы………………………………………………………………………………………………….. 553

Добавление данных в базу…………………………………………………………………………………….. 554

Получение данных из базы……………………………………………………………………………………. 554

Обновление структуры базы данных……………………………………………………………………. 555

Android SQLite API…………………………………………………………………………………………………………………… 555

SQLiteOpenHelper и SQLiteDatabase………………………………………………………………………………. 555

Создание и выполнение запросов…………………………………………………………………………………… 555

Курсоры базы данных…………………………………………………………………………………………………….. 557

Написание кода класса базы данных……………………………………………………………………………………. 558

Написание кода классов Fragment для использования класса DataManager……………………. 562

Запуск приложения Age Database………………………………………………………………………………………….. 565

Итоги…………………………………………………………………………………………………………………………………………. 567

Глава 28. Краткое напутствие перед расставанием…………………………………………………………. 568

Публикация приложения…………………………………………………………………………………………………………. 568

Создайте приложение!…………………………………………………………………………………………………………….. 569

Продолжайте учиться……………………………………………………………………………………………………………… 569

Продолжайте читать……………………………………………………………………………………………………….. 569

GitHub……………………………………………………………………………………………………………………………….. 570

Stack Overflow…………………………………………………………………………………………………………………… 570

Форумы пользователей Android……………………………………………………………………………………… 572

Обучение более высокого уровня…………………………………………………………………………………… 572

Каналы связи с автором………………………………………………………………………………………………………….. 572

До свидания и спасибо!…………………………………………………………………………………………………………… 573

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

Джон Хортон — энтузиаст программирования и игр из Великобритании. У него страсть к написанию приложений, игр, книг и статей в блогах. Он является основателем Game Code School.

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

Новая книга от автора бестселлера по тестированию!

Тест-дизайн. Практическое руководство для начинающих

В нашем издательстве вышла новая книга Ольги Назиной – автора бестселлера “Что такое тестирование. Курс молодого бойца”. Книга называется “Тест-дизайн. Практическое руководство для начинающих”.

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

Почему у некоторых тестировщиков получается придумывать полезные тесты лучше, чем у других? Почему они реже пропускают баги? Может быть, они знают какие-то секретные приемы и техники? Ничего подобного! Эффективные тестировщики применяют те же самые приемы, что и все остальные. Разница лишь в том, КАК они их применяют.
О каких приемах идет речь? Разбиение на классы эквивалентности, pairwise, деревья решений, диаграммы состояний и переходов — все эти и другие техники подробно и с наглядными примерами описаны в этой книге. А еще в ней рассказано, как и в каких случаях их нужно применять.

В книге есть бонус — подборка чек-листов для стандартных операций. Это такие «напоминалочки»: что нужно не забыть проверить в той или иной ситуации. Используйте их в работе, пополняйте и расширяйте в соответствии с особенностями своей системы!

  • Выделяем классы эквивалентности
  • Ищем границы в классах эквивалентности
  • Применяем готовые чек-листы
  • Исследуем приложение по турам
  • Пишем варианты использования функций
  • Оформляем Decision Table
  • Рисуем State & Transition Diagram

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

Ольга Назина

Ольга Назина — основатель Багреда (справочного ресурса для тестировщиков) и портала Testbase, на котором собраны полезные материалы по тестированию. Автор статей на Хабре и бесплатных уроков на Youtube. 13 лет проработала в тестировании, 6 из которых активно учила новичков. Провела более 110 курсов для начинающих тестировщиков, материал которых послужил основой для этой книги.