Введение
Эта часть о компьютерах и способах взаимодействия с ними. Мы попробуем разобраться с тем, какие способы взаимодействия возможны, почему не стоит бояться командной строки, и в каких ситуациях она лучше графического интерфейса. Кроме того, мы поговорим об автоматизации и работе с данными.
Компьютеры и интерфейсы
Будем называть компьютером любое устройство, способное выполнять программы: и настольные компьютеры, и ноутбуки, а также планшеты, смартфоны, все умные домашние устройства.
Человек взаимодействует с такими устройствами, используя определённые интерфейсы. Обычно привычные для нас интерфейсы ввода / вывода — это KVM (КВМ: клавиатура, монитор, мышь) или тачскрин в случае чего-то мобильного.
Интерфейсы ввода могут быть и менее привычными, например, в последнее время большое развитие получили голосовые помощники.
С компьютерами мы взаимодействуем, как правило, используя графический пользовательский интерфейс (GUI). То есть мы видим активные элементы и можем влиять на их состояние (например, вызвать меню файла, нажав правую кнопку мыши).
GUI развиваются разными компаниями и взаимно влияют друг на друга. Например, большинство ноутбуков и настольных компьютеров, поддерживающих GUI, имеют концепцию рабочего стола, папок, файлов, приложений, меню и т.д.
Скорее всего, вы не пользовались операционной системой Ubuntu 22.04 (кодовое название «Везучая медуза»), но сможете распознать назначение всех элементов на скриншоте и взаимодействовать с ними практически без подготовки.
Команды
Взаимодействуя с активными элементами, мы «заставляем» (просим) компьютер сделать для нас что-то полезное. Например, удалить или создать файл, исправить опечатку и т.д. Иногда достаточно только нажать на кнопку и подтвердить команду:
А иногда нужны подробности. Например, мы изменяем размер изображения, делая его в 5 раз меньше по каждой стороне, а также наклоняем на 40 градусов:
То есть просто абстрактной команды «Измени размер» здесь не хватит: нужно уточнять детали. Такие детали мы будем называть параметрами
команды.
Интерфейс командной строки
Одним из штампов Голливуда стало изображение условных хакеров, полицейских, шпионов за интерфейсом командной строки (консоли):
Почти любая операционная система: MacOS, Linux, Windows содержит в себе одну или даже несколько программ, которые выглядят как окно с текстовым вводом. Они кажутся очень простыми, но дальше вы сами увидите, какой это мощный инструмент для работы с данными. Обычных пользователей такой интерфейс пугает в силу непривычности и отличия от обычного GUI.
Программа cmd в Windows:
Оболочка PowerShell в Windows:
Программа «Терминал», MacOS:
Программа Bash, Ubuntu 22.04:
Общие черты командных интерпретаторов
Все программы, которые мы здесь упомянули, работают по схожим правилам. Они позволяют вам выполнять все операции, которые вы делаете на компьютере, только команды и параметры нужно писать текстом.
Эти программы работают в цикле REPL (от англ. read-eval-print loop — «цикл „чтение — вычисление — вывод“»):
- Программа демонстрирует приглашение командной строки (например
C:\Users\bibilov>
), показывая, что готова выполнить команду. - Команда вместе с параметрами вводится с клавиатуры, в конце нажимается
<Enter>
. - На экране показывается результат работы программы и новое приглашение командной строки, ожидая следующей команды.
Например, нам нужно узнать время. Обычно это легко сделать в виджете времени на панели задач.
А можно ввести в интерфейс командной строки команду date
, которая выводит текущую дату в часом поясе Гринвича (-3 часа от МСК):
bibilov@osgiliath:~$ date
Sat Sep 24 07:46:47 PM UTC 2022
bibilov@osgiliath:~$
С параметром формата %d
(day of month (e.g., 01)
) команда выводит только число в месяце:
bibilov@osgiliath:~$ date +%d
24
bibilov@osgiliath:~$
Мы также можем посмотреть календарь, например, на 2 месяца вперёд (параметр A
со значением 2
):
username@osgiliath:~$ cal -A 2
September 2022 October 2022 November 2022
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 1 1 2 3 4 5
4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12
11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19
18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26
25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30
30 31
Настраивая внешние параметры (язык по умолчанию в системе), а также опцию M
(день начала недели, тут — понедельник), мы можем получить такой вывод:
username@osgiliath:~$ ncal -M -b -A 2
Сентябрь 2022 Октябрь 2022 Ноябрь 2022
Пн Вт Ср Чт Пт Сб Вс Пн Вт Ср Чт Пт Сб Вс Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 1 2 1 2 3 4 5 6
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30
31
Оболочки Bash
, CMD
, PowerShell
называются командными интерпретаторами. Они выполняют (интерпретируют) по одной ваши команды.
В режиме REPL могут работать и языки программирования, например, Python (приглашение командной строки — >>>
):
>>> 3 + 4 * (2 - 19)
-65
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2022, 9, 24, 23, 1, 33, 102660)
Было выполнено 3 команды:
- Вычислено значение выражения
3 + 4 * (2 - 19)
- Импортирован объект
datetime
(чтобы его можно было использовать). - Запрошена текущая дата (год, месяц, день, час, минуты, секунды, микросекунды).
Ещё пример — так можно запустить Калькулятор в Windows, набрав имя этой программы (calc
):
C:\Users\username>calc
Интерфейсы
Компьютер работает в модели выполнения наших команд, которые могут отдаваться:
- Через графический интерфейс, когда пользователь взаимодействует с его компонентами.
- В текстовом виде в разнообразных командных интерпретаторах.
- Голосом. Например, с помощью «Алисы»
Чуть задержимся на голосовых интерфейсах.
Навыки Алисы — это по сути библиотека с командами и их параметрами.
Поставь таймер
— команда, на 7 минут
— параметр.
Можно пофантазировать как бы это выглядело в текстовом интерфейсе:
username@osgiliath:~$ alice set_timer -m 7
Кстати, боты в мессенджерах, например, в Телеграмме, по факту поддерживают командный интерфейс. Например, вот отрывок диалога с ботом «Бот-крестный отец», который создает других ботов:
Команда — /newbot
, а параметры (имя и логин нового бота) узнаются в результате интерактивного диалога.
Получается, мы пользуемся разными интерфейсами для того, чтобы передавать команды компьютеру. Можно провести аналогию с различными разъёмами для зарядки смартфонов: их много, а суть одна.
Когда удобен командный интерпретатор
Давайте ответим на вопрос, почему вообще текстовый командный интерфейс не вымер, ведь голосовой и графический — интуитивно понятнее и удобней. Кому нужны эти черные окна с текстом?
Ключевое слово здесь — автоматизация. Если нам надо сделать что-то один раз, конечно, привычней это сделать, используя GUI.
Но если нужно повторить что-то по несколько сотен раз, выполнить на нескольких компьютерах одни и те же действия, повторять одинаковые действия каждые 5 минут — тратить бесценные часы живого человека нежелательно.
Можно записать подряд несколько текстовых команд в один файл — сценарий и заставить компьютер повторять его. А записывать текстом понятней и удобней всего.
То есть вы как сценарист можете написать сценарий (последовательность действий) в текстовом файле для одного актера — компьютера, и он будет готов исполнять его снова и снова на протяжении многих лет, не требуя гонорара, не уставая, и неизменно успешно.
Совсем как в пьесе «Квадрат» Сэмюэля Беккета, которая происходит внутри квадрата, а актёрам даны инструкции, как двигаться между его вершинами. Приведем перевод ниже, под изображением.
Место действия: квадрат. Длина стороны: 6 шагов.
Маршрут 1: AC, CB, BA, AD, DB, BC, CD, DA
Маршрут 2: BA, AD, DB, BC, CD, DA, AC, CB
Маршрут 3: CD, DA, AC, CB, BA, AD, DB, BC
Маршрут 4: DB, BC, CD, DA, AC, CB, BA, AD
1 начинает в точке A, завершает свой маршрут и к нему присоединяется 3.
Вдвоем они завершают свои маршруты и к ним присоединяется 4.
Втроем они завершают свои маршруты и к ним присоединяется 2.
Вчетвером они завершают свои маршруты.
1 уходит. 2, 3 и 4 продолжают и завершают свои маршруты.
3. уходит.
2 и 4 продолжают и завершают свои маршруты.
4 уходит.
Конец 1-й очередности.
2 продолжает, начиная 2-ю очередность, завершает свой маршрут и к нему присоединяется 1.
И так далее.
Движение непрерывно.
«Кто сломается первым: Языковой театр: [сборник]/[Сост., вступ. статья, примеч. А. Рясова]. - Москва: Опустошитель, 2018. С. 336 - 337»
В своих сценариях вы можете оперировать объектами, командами и программами, которые установлены в вашей системе: файлами и папками, настройками, браузером, текстовым и табличным процессором, базой данных и т.д.
Например, мы можем собрать несколько команд по созданию Word-документа в оболочке PowerShell:
$w = New-Object -ComObject Word.Application # Получили доступ к установленному Word-у
$doc = $w.Documents.Add() # Создаем новый документ
$selection = $w.Selection # Объект, где находится курсор в данный момент.
$selection.TypeText("Part I") # Напечатаем текст.
$w.Visible = $True # Сделаем Word видимым, все манипуляции до этого велись в памяти, без запуска GUI.
Или попросить Google Chrome сохранить страницу в PDF (GUI не будет запущено, Ubuntu 22.04):
google-chrome --headless --disable-gpu --print-to-pdf https://afisha.yandex.ru
Поздравляем: вы стали на шаг ближе к автоматизации!
Автоматизация
Задача автоматизации процессов очень обширна как по области их применения, так и уровня, на котором вводится автоматизация: начиная от автоматизации процессов на производстве хлебобулочных изделий до роботов-телескопов, сканирующих пространство в поисках астероидов; от работы с сигналами датчиков задымления до робо-касс в продуктовом магазине.
Автоматизация может проводиться как комплексно, затрагивая все области работы предприятия, так и более локально. Рынок автоматизации огромен и разнообразен.
Нам важно сейчас определиться, какой именно автоматизацией мы будем заниматься внутри этого спектра.
Мы будем заниматься локальной автоматизацией на конкретном рабочем месте специалиста по анализу данных. Так называемой последней милей. То есть когда уже есть много индивидуальных программ и библиотек: языки программирования, браузер, текстовый и табличный редакторы, базы данных. Но при этом хочется убрать рутину и повторяющиеся действия.
Будем делать уклон на сбор и обработку данных, но так как под эту категорию можно подвести огромное количество офисной рутины, то у вас также будут навыки работы с автоматизацией широко спектра решений на рабочем месте.
Сейчас многие IT-гиганты (IBM, Microsoft, SAP, ...) поставляют решения для RPA, Robotic process automation, роботизированной автоматизации процессов.
Например, вот так выглядит стартовый пример в Microsoft Power Automate. Это небольшая программа, оформленная визуально (и команды, и параметры задаются через GUI), которая сообщает о новом файле, появившемся в облаке OneDrive.
В дальнейшем мы будем придерживаться концепции написания именно текстовых сценариев, а также использовать преимущественно свободное ПО.
Работа с данными. Цепочки
Важно понимать, что у нас есть огромное количество «строительных блоков» — готовых компонентов, программ, команд, на основе которых можно писать сценарии. Мы можем настроить их совместную работу таким образом, чтобы выстраивался конвейер (цепочка, pipeline) — совсем как на заводе Ford, где каждая операция производится узким специалистом, а результат работы передается следующему.
Рассмотрим учебную задачу (и по содержанию, и по предметной области).
На сайте школы выставляются сведения о меню в столовой – PDF-документы со сканом меню на конкретный день. Например, на 3 октября.
Предположим, мы хотим сделать исследование о вариативности меню за какой-то промежуток, например, является ли винегрет частым гостем в школьной столовой.
Мы можем скачивать и просматривать файлы вручную, но конечно, тут так и просится автоматизация. Покажем на примере ОС Ubuntu 22.04 и командного интерпретатора Bash.
Давайте составим такую цепочку преобразований данных на примере 1 файла:
- Скачать PDF-файл с меню.
- Извлечь изображение с 1 страницы. Текстового слоя там нет, только скан.
- Распознать текст на картинке.
- Узнать, если там слово "винегрет"
По каждому из этих пунктов есть готовая программа с интерфейсом командной строки.
1. Скачать PDF-файл с меню
Нам потребуется программа wget
, которая в самом простом случае принимает 1 параметр — ссылку на файл.
wget https://s27spb.ru/images/1menu/03.10.225-11.pdf
wget https://s27spb.ru/images/1menu/03.10.225-11.pdf
--2022-10-03 13:23:28-- https://s27spb.ru/images/1menu/03.10.225-11.pdf
Resolving s27spb.ru (s27spb.ru)... 5.23.51.195, 2a03:6f00:6:1::517:33c3
Connecting to s27spb.ru (s27spb.ru)|5.23.51.195|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 216930 (212K) [application/pdf]
Saving to: ‘03.10.225-11.pdf’
03.10.225-11.pdf 100%[=======================>] 211,85K --.-KB/s in 0,05s
2022-10-03 13:23:28 (3,97 MB/s) - ‘03.10.225-11.pdf’ saved [216930/216930]
После чего в папке будет сохранен 1 файл: 03.10.225-11.pdf
2. Извлечь изображение с 1 страницы
Страница там одна, поэтом просто извлечем все изображения. Программа так и называется: pdfimages
.
Указываем 2 параметра: имя PDF-файла и папку, куда сохранять изображения. В данном случае — .
— текущая папка.
pdfimages 03.10.225-11.pdf ./
После чего будет создан файл -000.ppm
. PPM — не самый популярный формат изображений. Давайте сконвертируем, например, в PNG.
convert -000.ppm 1.png
После чего у нас будет файл 1.png
3. Распознать текст на картинке
Здесь нам поможет система распознавания текстов Tesseract.
tesseract -l rus 1.png 1
.
Опция -l
говорит о языке, символы которого будут искаться в изображении. Второй параметр — имя текстового файла, куда будет сохранено все распознанное. В данном случае — 1.txt
. Расширение txt
не пишется в параметре команды.
Примерное содержимое файла:
ВИНЕГРЕТ ОВОЩНОЙ С МАСЛОМ
‚ РАСТИТЕЛЬНЫМ до 28.02 /САЛАТ ИЗ СВЕКЛЫ
208% | 51 -|ОТВАРНОЙ С МАСЛОМ РАСТИТЕЛЬНЫМ С 15 в 98 86 Е
01.03
”. С 71
2008 94 СУП КРЕСТЬЯНСКИЙ СО СМЕТАНОЙ 250/5 2,2 5,1 12,4 88,5
2008 261 ПЕЧЕНЬ, ТУШЕННАЯ В СОУСЕ 100/20 10,9 17,2 16,4 232,0
| 1 =
2008 331 МАКАРОННЫЕ ИЗДЕЛИЯ ОТВАРНЫЕ 180 6,5 5.7 41,8 244,3
2008 439 |НАПИТОК ИЗ ДЖЕМА ЧЕРНОСМОРОДИНОВОГО 180 0,1 0,0 24,1 67
ЕЕ
кк кк ПЕЧЕНЬЕ 20 6,2 37 25,9 123,8
ХЛЕБ РЖАНО-ПШЕНИЧНЫЙ ОБОГАЩЕННЫЙ
4. Узнать, если там слово «винегрет»
Для этого подходит программа поиска по шаблону в тексте grep
. Обычно она использует регулярные выражения, которые мы в этой главе не обсуждаем, но в простейшем случае мы можем говорить, что она работает как обычный поиск по файлу. Первый параметр — что мы ищем. Второй — где. Также есть опция игнорировать регистр символов --ignore-case
.
grep --ignore-case винегрет 1.txt
grep
печатает те строки, в которых есть совпадение:
ВИНЕГРЕТ ОВОЩНОЙ С МАСЛОМ
Возможно, нам подойдет параметр -c
(count), количество найденных совпадений.
username@osgiliath:~/food$ grep -c --ignore-case винегрет 1.txt
1
Итоговый сценарий для одного PDF-файла
wget https://s27spb.ru/images/1menu/03.10.225-11.pdf
pdfimages 03.10.225-11.pdf ./
convert -000.ppm 1.png
tesseract -l rus 1.png 1
grep -c --ignore-case винегрет 1.txt
Мы практически 1-в-1, с некоторыми дополнительными параметрами воплотили изначальную идею:
1. Скачать PDF-файл с меню.
2. Извлечь изображение с 1 страницы.
3. Распознать текст на картинке.
4. Узнать, если там слово "винегрет"
Итак:
- Сценарии автоматизации не сильно больше объяснения на русском языке.
- Мы оперируем высокоуровневыми программами. Например,
Tesseract
-ом. - Результаты действия одной программы передаются следующей. Так и получается цепочка преобразований.
- Все приведённые программы бесплатны и свободны, что дополнительно приятно.
Как только мы научимся делать сценарии для всех файлов сразу (изучим циклы), мы легко ответим на вопросы:
- Как часто бывает винегрет.
- Котлеты с макарошками или с пюрешкой?
- Сможем сравнивать питание в разных школах и т.д.
В заключительном пункте введения мы поговорим об информации, данных, их структуре и слоях интерпретации. Еще мы попробуем разобраться с тем, почему данные — это договоренность.