Какие бывают консольные приложения
Вам предстоит создать приложение, которое считывает текстовый файл и выводит его содержимое в консоль. Вывод в консоль осуществляется с такой скоростью, которая позволяет читать текст вслух. Скорость можно увеличивать или уменьшать клавишами "<" (меньше) и ">" (больше). Это приложение можно запустить в ОС Windows, Linux, macOS или в контейнере Docker.
В этом руководстве описано множество функций. Попробуем собрать их по одному.
Предварительные требования
Создание приложения
Первым шагом является создание нового приложения. Откройте командную строку и создайте новый каталог для приложения. Перейдите в этот каталог. В командной строке введите команду dotnet new console . Эта команда создает начальный набор файлов для базового приложения Hello World.
Прежде чем вносить изменения, давайте запустим простое приложение Hello World. Когда вы создадите приложение, наберите в командной строке команду dotnet run . Эта команда запускает процесс восстановления пакета NuGet, создает исполняемый файл приложения и запускает этот файл.
Весь код простого приложения Hello World размещается в файле Program.cs. Откройте этот файл в любом текстовом редакторе. Замените код в Program.cs на следующий код:
Чтение и вывод файла
Первая функция, которую мы добавим, будет считывать данные из текстового файла и выводить полученный текст в консоль. Сначала нам нужно добавить текстовый файл. Скопируйте в каталог проекта файл sampleQuotes.txt из репозитория GitHub для этого примера. Он будет источником текста для вашего приложения. Чтобы скачать пример приложения для этого раздела, воспользуйтесь инструкциями в разделе Примеры и руководства.
Теперь добавьте в класс Program (он расположен сразу за методом Main ) следующий метод:
Переменная reader определена с ключевым словом var . Ключевое слово var определяет неявно типизированную локальную переменную. Это означает, что тип переменной определяется во время компиляции по типу объекта, присвоенного этой переменной. Здесь это возвращаемое значение метода OpenText(String), то есть объект StreamReader.
Теперь давайте создадим в методе Main код для чтения файла:
Запустите программу командой dotnet run и убедитесь в том, что все текстовые строки выводятся в консоль.
Добавление задержек и форматирование выходных данных
Сейчас данные отображаются слишком быстро для чтения. Поэтому нам нужно добавить задержку в процесс вывода. Для этого вы создадите несложный код, выполняющий асинхронную обработку. Но первые наши действия будут нарушать стандартные рекомендации. Эти нарушения мы укажем в комментариях при создании кода, а затем заменим этот код в последующих шагах.
В этом разделе описаны два действия. Во-первых, обновите метод итератора, чтобы он возвращал не всю строку целиком, а каждое слово отдельно. Для этого внесите такие изменения. Замените инструкцию yield return line; следующим кодом:
Теперь следует изменить код обработки строк файла, добавив задержку после вывода каждого слова. Замените инструкцию Console.WriteLine(line) в методе Main на такой блок кода:
Теперь добавьте следующий код после инструкции yield return word + " "; (перед закрывающей фигурной скобкой):
Запустите пример, и теперь вы сможете читать текст вслух в заданном темпе.
Асинхронные задачи
И на последнем этапе мы добавим код, который позволяет выполнять две асинхронные задачи, одна из которых — вывод текста, а вторая — ожидание ввода от пользователя для ускорения, замедления или прекращения вывода текста. Этот этап разделяется на несколько шагов, по завершении которых вы получите все необходимые обновления. Первым шагом является создание асинхронной задачи (Task), которая возвращает метод с тем кодом, который вы создали ранее для чтения и отображения файла.
Добавьте следующий метод в класс Program . Этот текст основан на тексте метода Main :
Вы можете заметить два изменения. Во-первых, в тексте нет вызова Wait(), который в синхронном режиме ожидает завершения задачи. Вместо него в этой версии используется ключевое слово await . Чтобы это работало, в сигнатуру метода нужно добавить модификатор async . Этот метод возвращает Task . Обратите внимание, что здесь нет инструкции для возвращения объекта Task . Вместо этого объект Task создается в коде, который компилятор предоставляет в точке использования оператора await . Представьте, что метод завершает выполнение при достижении await . Он возвращает Task в знак того, что работа еще не завершена. Метод возобновит свою работу, когда завершится ожидаемая задача. Когда работа метода завершится, это будет отражено в возвращаемом объекте Task . Вызывающий код может отслеживать состояние полученного Task , чтобы определить момент завершения метода.
Теперь наш новый метод можно вызвать из метода Main :
Здесь, в методе Main , код синхронно ожидает завершения. Всегда, когда это возможно, следует использовать оператор await вместо синхронного ожидания. Но в методе Main консольного приложения запрещено использовать оператор await . В противном случае приложение завершит работу раньше, чем выполнит все свои задачи.
Теперь следует создать второй асинхронный метод, который позволяет считывать данные ввода из консоли и реагировать на клавиши "<" (меньше), ">" (больше) и "X" или "x". Для выполнения этой задачи добавьте приведенный ниже метод.
Здесь создается лямбда-выражение, представляющее делегат Action, который считывает нажатие клавиши из консоли и изменяет локальную переменную с длительностью задержки, если пользователь нажал клавишу "<" (меньше) или ">" (больше). Выполнение метода делегата можно завершить, нажав клавишу "X" или "x". Таким образом пользователь может в любой момент прекратить отображение текста. Этот метод использует метод ReadKey(), чтобы блокировать выполнение и ожидать нажатия клавиши.
Чтобы завершить создание этой функции, нам нужна новая инструкция async Task , которая вернет метод, запускающий обе задачи ( GetInput и ShowTeleprompter ) и управляющий обменом данными между этими задачами.
Пришло время создать класс, который может обрабатывать совместное использование данных двумя задачами. Этот класс содержит два открытых свойства: delay (задержка) и флаг Done , который означает, что файл прочитан полностью:
Поместите этот класс в отдельный новый файл и включите его в пространство имен TeleprompterConsole , как показано выше. Также следует добавить оператор using static в верхнюю часть файлами, чтобы можно было ссылаться на методы Min и Max без указания имени внешнего класса или пространства имен. Оператор using static импортирует методы из одного класса. Это отличается от оператора using без static , который импортирует все классы из пространства имен.
Теперь вам нужно обновить методы ShowTeleprompter и GetInput для использования нового объекта config . И еще одна инструкция Task , которая возвращает метод async , запускающий обе задачи и завершающий работу после окончания первой задачи:
Новым методом здесь является WhenAny(Task[]). Этот метод создает задачу ( Task ), которая завершается сразу, как только завершится любая из задач в списке аргументов.
Теперь вам нужно обновить методы ShowTeleprompter и GetInput , чтобы они использовали объект config для задержки:
Новая версия метода ShowTeleprompter вызывает новый метод из класса TeleprompterConfig . Сейчас нужно изменить метод Main , чтобы вместо ShowTeleprompter он вызывал RunTeleprompter :
Заключение
Дополнительные сведения о файловом вводе-выводе см. в статье Файловый и потоковый ввод-вывод. Дополнительные сведения о модели асинхронного программирования, используемой в учебнике, см. в статьях Асинхронное программирование на основе задач и Асинхронное программирование.
Прежде чем создавать свои компьютерные программы, вы должны знать, какие они бывают и для чего предназначены. Видов программ не так много. Различия между программами можно назвать условными, так как по сути любая программа - это двоичный файл. Но мы так глубоко копать пока не будем, и поговорим о том, чем отличаются программы друг от друга с точки зрения пользователя.
Мы уже знаем, какие программы можно создавать в Lazarus. Но сегодня мы будем классифицировать программы с несколько иной точки зрения. Ниже перечислены основные виды программ с краткими описаниями.
Консольные приложения
Консольное приложение - это программа, которая работает с командной строкой. То есть это обычное окно, где пользователь может ввести какую-то команду и получить результат. Здесь нет никаких кнопочек и прочих прелестей Windows.
Примеры работы с командной строкой см. в статье Кое что о ДОС.
Оконные приложения
Оконное приложение - это привычная всем программа Windows. То есть это окошко с разными кнопочками и полями для ввода-вывода данных. На сегодняшний день это, пожалуй, самый распространённый вид программ. Именно оконные приложения создают большинство программистов.
Драйверы
Драйвер - это программа, которая обычно служит для “стыковки” компьютерного железа (например, видеокарты) с операционной системой или другой программой. Иногда драйвером называют программу, которая “стыкует” две других программы между собой. Хотя сейчас такие программы принято называть интерфейсами (например, COM-интерфейс или DDE-интерфейс).
Когда я говорю “стыкует”, то я имею ввиду, что драйвер позволяет организовать правильный обмен данными между компьютерным железом и ОС. То есть операционная система обращается не напрямую к железу, а через драйвер.
Зачем так сделано? Дело в том, что производителей, например, видеокарт, существует огромное количество. И все они делают их по своим внутренним стандартам. И операционная система не может знать всё обо всех видеокартах. Поэтому есть определённые общепринятые стандарты, которые поддерживаются операционной системой. И производитель “железа” делает какую угодно “железяку”, а затем просто пишет программу-драйвер, которая соответствует общепринятым стандартам и “стыкует” эту “железяку” с операционной системой.
Это позволяет извращённым умам делать разные смешные штуки. Например, можно написать “кривой” драйвер, который будет определять USB-мышку как флэшку. Конечно, работать такая “флэшка” не будет, но зато будет прикольно)))
Интерфейсы
Интерфейс - это программа, которая обычно служит для “стыковки” одной программы с другой. Например, вы хотите получить данные из чужой программы. Как это сделать? Если чужая программа поддерживает какой-нибудь стандартный интерфейс (например, DDE), то вы можете использовать этот интерфейс для получения данных из чужой программы.
Библиотеки
Библиотека - это двоичный файл, который хранит разные методы и объекты. Пока это вам ни о чём не говорит. Но просто знайте, что свои процедуры вы можете сохранить в библиотеку, а затем использовать её в других своих программах. Также вы можете использовать в своих программах чужие библиотеки и наоборот - распространять свои библиотеки, чтобы другие программисты могли их использовать в своих программах.
Удобство использования библиотек заключается в том, что они не привязаны к языку программирования. Например, вы можете написать библиотеку на языке С++, а использовать её потом в программах, которые пишите на Паскале.
Резидентные программы
Резидентная программа - это программа, которая работает в фоновом режиме (то есть не видна пользователю и пользователь может о ней даже не подозревать). В фоновом режиме работают, например, антивирусы (и вирусы тоже))).
Системные программы
В общем-то это обычные программы, которые могут быть как консольными, так и оконными приложениями. Сюда же я бы отнёс резидентные программы, библиотеки и драйверы. Пожалуй, это будет не совсем правильно. Однако эта статья для начинающих. Поэтому я не хочу перегружать читателей информацией, которую они пока плохо понимают. Давайте пока будем думать, что это куча разных вспомогательных программ, которые необходимы для нормальной работы системы и оборудования.
Пока на этом всё. Домашнего задания не будет. Просто подумайте о том, как огромен мир программирования, и сколько всего вам надо будет ещё изучить)))
Освоить работу с консольными приложениями и с параметрами программы.
Консольные приложения
На сегодняшний день о программировании на Lazarus существует очень мало книг на русском языке, и все они описывают работу в основном, с консольными приложениями, хотя особой надобности в консолях сейчас нет. Но и совсем обойти эту тему нельзя. Что же такое консольное приложение ?
Консольным приложением называется программа , которая не имеет графического интерфейса - окон, и которая работает в текстовом режиме в черно-белой консоли. Команды в такой программе приходиться вводить с клавиатуры, результаты работы консольные приложения также выводят на экран в текстовом режиме.
Если вы пользуетесь операционной системой Windows , то нажмите на "Пуск" и выберите команду "Выполнить". В открывшемся окне наберите
и нажмите <Enter>. Откроется командная консоль , в которой команды нужно вводить в текстовом режиме:
Собственно, вы видите окно предка Windows - операционной системы MS-DOS . Именно так выглядел экран с загруженной ОС MS-DOS , и управлять ею приходилось, вручную набивая всевозможные команды. Это уже позже корпорация Microsoft навесила на ядро MS-DOS всевозможные драйверы и утилиты, снабдила его графическим оконным интерфейсом, и появилась сначала полуграфическая ОС Windows 3.10 (русский вариант был 3.11 версии), а затем и целиком графическая Windows 95 . Но к консольному ядру системы можно обращаться и в современных ОС, в Windows для этого используется программа cmd.exe, а в ОС Linux - терминал .
Все языки высокого уровня позволяют делать и консольные приложения, другое дело - зачем? Подавляющее большинство современных программ имеет графический интерфейс , который мы с вами создавали с самой первой лекции. А консольные приложения делаются в основном, системными программистами. Несмотря на то, что Object Pascal обладает для этого всеми необходимыми инструментами, системщики обычно пользуются такими языками, как Ассемблер , C, реже - C++. Но все же знать, как создаются консольные приложения нужно, поэтому данную лекцию мы посвящаем им.
Создание консольного приложения
Создать консольное приложение можно разными способами, но проще всего так. Откройте Lazarus. Командой "Проект -> Закрыть проект" закройте текущий проект, автоматически появится окно Мастера создания проекта. В нем нажмем кнопку "Новый проект". Появится окно создания проекта, в котором можно выбрать "Программа" или "Консольное приложение". Если мы выберем "Программа", то будет создан модуль с минимальным кодом. Если же мы выберем "Консольное приложение", то кода будет больше, так как при этом создается программа с новым классом, производным от TCustomApplication . TCustomApplication обеспечивает хорошую основу и делает программирование утилит командной строки довольно простым. Например, проверку опций командной строки, написание справки, проверку переменных окружения и обработку исключений. Все программы LCL автоматически это используют.
Но нам не нужно использовать возможности класса TCustomApplication , мы делаем простую консольную программу, поэтому в окне создания проекта мы выбираем "Программа". Сформируется проект, а в Редакторе исходного кода будет минимум текста:
Обратите внимание, если нам нужно подключить к программе какие то модули, то делать это нужно до комментария
В этом случае мы ставим запятую после указанного модуля Classes и добавляем свои модули. Завершающая точка с запятой стоит после комментария, нам её ставить не нужно.
Свой код мы будем писать между скобками
А если нам потребуется указать глобальные константы , переменные или сделать объявления процедур и функций, то все это делается до begin .
Для примера мы создадим простое приложение , а по ходу дела, познакомимся с инструментами ввода-вывода информации в консольных приложениях.
WRITE и WRITELN
Процедура Write предназначена для вывода информации на экран. Она имеет следующий синтаксис :
Действует процедура следующим образом. В скобках мы можем указать какой-то текст, вывести содержимое переменных. Например:
После вывода информации на экран курсор остается на той же строчке, в позиции, где он оказался после вывода последнего символа.
Процедура Writeln действует точно также, но после вывода последнего символа курсор переходит на начало следующей строки.
Для ознакомления с процедурами создайте новый проект "Программа". Модуль можно не переименовывать, просто сохраните его в папку 21-01. Полный текст модуля следующий:
Обратите внимание: раздел переменных var мы указали до служебного слова begin , то есть, переменные a и b в пределах модуля являются глобальными. Далее мы присвоили переменным значения, затем вывели на экран приветствие, а потом содержимое переменных. На процедуру readln() пока не обращайте внимания, она нужна только, чтобы программа не закрылась сразу же после вывода текста, а была на экране, пока мы не нажмем <Enter>. Сохраните проект и запустите его на выполнение. И сразу же мы видим недостаток: вместо русских букв выходит нечто, что в Интернете называют "кракозябры":
Рис. 21.2. Неправильный вывод кириллицы в консольной программе
В "Символы и строки" мы упоминали, что в консольных приложениях Windows принято использовать кодировку CP866, тогда как в графических приложениях используется CP1251 и Юникод. Отсюда и "кракозябры". В Linux и Unix таких проблем нет. Однако решить эту проблему совсем несложно. Нажмите <Enter>, чтобы закрыть консоль , и вернитесь в Редактор кода. Щелкните по окну с кодом правой кнопкой мыши, и в открывшемся контекстном меню выберите команду "Параметры файла -> Кодировка -> CP866". Откроется окно смены кодировки, нам надо нажать кнопку "Изменить файл". Снова запустите программу на выполнение - теперь с кодировкой полный порядок :
Если ты перешел на Linux совсем недавно или же работаешь исключительно в графической среде и графических приложениях, то наверняка задаешься вопросом: а зачем столько людей используют консольный софт? Я говорю не о терминале и его мощной командной строке, а о консольных приложениях с псевдографическим интерфейсом, в которых вся визуальная составляющая — это символы (яркий пример из мира Windows — FAR и Norton Commander).
Скорее всего, ты думаешь, что пользователи таких приложений — старперы, которые уже не могут переучиться и привыкнуть к новому. Отчасти это правда, однако есть и другие причины: скорость, удобство и «чистота интерфейса». Консольный софт просто невероятно быстр, им можно управлять не используя мышь, а главное — создать захламленный псевдографический интерфейс просто невозможно, он всегда будет содержать только необходимую информацию, без лишних обвесок и декораций.
Далее я расскажу о десятке приложений для решения повседневных задач: управления файлами, чтения почты, прослушивания музыки и прочего. Сразу скажу, что в списке есть несколько графических приложений (просмотрщик изображений и PDF-ридер), но созданы они с оглядкой на консольный софт — минималистичный интерфейс и полное управление с клавиатуры. Так что все будет честно.
Файлы: Midnight Commander
Midnight Commander (или просто mc) — одно из самых известных консольных приложений. Это клон бессмертного Norton Commander, созданный специально для UNIX. Mc можно увидеть на экране ноутбука каждого второго админа, вот только почему-то все они используют его как есть, выжигая себе глаза синим фоном.
На самом деле Midnight Commander поддерживает темы, выбирать которые можно из интерфейса или отредактировав .config/mc/config . Например, чтобы заставить mc использовать не режущую глаза темную тему, достаточно добавить (изменить) такую строку:
Также рекомендую изменить две другие опции для отключения бесполезных строки меню сверху и строки кнопок снизу:
Ну а те, кто не любит стандартный редактор mc и предпочитает юзать другой, должны добавить такую опцию:
Важная особенность mc — умение показывать и запускать многие типы файлов с помощью внешних приложений. Например, если ты выберешь файл с изображением и нажмешь F3, то увидишь на экране информацию об изображении: формат, размер, глубина цвета и другие данные. Эту информацию mc получает от утилиты identify из пакета ImageMagic. Нажатие Enter запустит просмотрщик изображений (по умолчанию с помощью gqview, see или zgv, какой найдется в системе).
Все привязки типов файлов к приложениям описаны в файле
/.configs/mc/mc.ext . Он интуитивно понятен, так что при желании конфиг можно изменить, чтобы заставить mc открывать файлы с помощью удобных тебе приложений.
Midnight Commander здорового человека
Файлы по-другому: Nnn
Двухпанельный файловый менеджер не всегда удобен, когда необходимо просто пройтись по каталогам и найти/открыть нужный файл. В этом случае гораздо лучше подойдет nnn — простой и быстрый как молния файловый менеджер без лишних обвесок и со всей необходимой функциональностью для навигации по файловой системе.
Nnn представляет файловое дерево в виде списка с указанием даты модификации и размера файлов. Навигация крайне простая — стрелки вверх/вниз для перемещения по списку, вперед/назад для перехода между каталогами (клавиши h, j, k, l, как в Vim, тоже поддерживаются). Клавиши & и - возвращают к начальному и последнему посещенному каталогу, D открывает подробную информацию о файле, Ctrl + R — для переименования.
В nnn есть система поиска в реальном времени, вызываемая по клавише / , и система закладок. Просто нажми b в нужном каталоге, введи имя закладки и возвращайся к нему когда вздумается с помощью Ctrl + V .
Лаконичный интерфейс nnn
Электронная почта: mutt
В среде пользователей UNIX почтовый клиент mutt занимает примерно то же место, что и Vim: его либо ненавидят, либо не могут без него жить. Как и у Vim, у mutt очень высокий порог вхождения, его нельзя просто запустить и начать использовать. Точнее, можно, но всей мощи клиента ты не увидишь. mutt необходимо конфигурировать, долго подстраивая его под себя. Зато в результате ты получишь приложение, с помощью которого можно обработать тонны писем намного быстрее, чем с помощью любого другого клиента.
Рассказывать здесь о том, как конфигурировать mutt, бессмысленно, это слишком обширная тема. Зато в Сети всегда можно найти множество преднастроенных конфигов, один из которых обязательно тебе подойдет (пример для любителей Vim). Существуют даже онлайн-генераторы конфига mutt.
Вот лишь базовый конфиг mutt для подключения к Gmail (имей в виду, тебе необходимо включить поддержку IMAP и создать пароль приложения специально для mutt, если ты используешь двухфакторную аутентификацию):
mutt: простота и эффективность
Продолжение доступно только участникам
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.
Читайте также: