В наш век "тотальной графичности" разговор об алфавитно-цифровом интерфейсе может показаться несовременным. А может и не показаться — смотря с какой стороны смотреть… особенно если вы любите смотреть на предмет с разных сторон
Кому это нужно?


Если говорить о программировании в текстовом режиме, то правильный ответ — всем, практически.


Мне известно, как минимум, три серьезные киевские промышленно-коммерческие организации, которые до сих пор работают под DOS/FoxPro 2.6 for DOS. И работает всё просто прекрасно — летает. Не то что в конторах,  перешедших на всякие "дивные" софтины. Одна только струйная печать может поставить с ног на голову любой IT-отдел своими ценами на расходники, не говоря уже о "широкой" лазерной печати.


Чтобы не выдавать, возможно, чужие секреты — возьмем такую самодостаточную сферу, как пункты обмена валют. Там тоже работают программы — и работают не то что под FoxPrо, а даже под Clipper 5.0. В качестве платформ — все что угодно: от 486-х до P4.


Вопрос к вам такой: как вы, будущий сотрудник (начальник) отдела программного обеспечения, видите развитие такой "гетерогенной" среды — мощность компьютеров меняется от и до, нужно объединить их в сеть, плюс на всех установить одинаковую и совместимую программу?


Не нужны вам обмены валют? Ладно, пусть будет ВУЗ, желающий предоставить студентам доступ к знаниям в текстовом виде, но не превратиться при этом в геймерский клуб и не страдать от вирусных атак. Или вот еще: представьте себе промышленное производство, в реальном времени снимающее показания датчиков и выводящее их в цифровом/псевдографическом виде на экран. Возьмите те же научные лаборатории с вычислительными задачами. Нужна им "винда"?


Если и это не ваш случай, представьте тогда, что вы удаленно (или не очень удаленно) администрируете сервер по модемному соединению — и вас, соответственно, интересует трафик по интерфейсу, а не то, как выглядит KDE.


Что вы предложите этим людям? Естественно: для использования в качестве сервера приложений купить лицензионный Microsoft Windwos Server 2003 Enterprise Edition, плюс написать распределенные XML-приложения, установить беспроводные сети, новые компьютеры (тысячи по три долларов каждый), руководящий состав снабдить персональными коммуникаторами с доступом по WAP GPRS, менеджерам — планшетные ноутбуки с доступом по Wi-Fi, остальным — терминалы Citrix Metaframe…


Бинго! Вы выиграли! — попробуйте связаться с "Майкрософт", они нуждаются в вашей энергии. А для всех остальных, в частности для реальных потребителей информационных услуг, может хватить и обычных терминальных программ.


Малость истории


Терминальные программы, как известно, могут работать в двух режимах — в режиме телетайпа, когда последняя строка выталкивает первую на экране. Этот режим появился в те времена, когда в качестве консоли использовали пишущие машинки (я еще застал такую — CM 2; консоль у нее была на лепестковом принтере Robotron). Эти терминалы понимают некоторые "непечатные" символы, обрабатываемые особым образом: перевод строки, сдвиг каретки или символ сигнала (ascii(7), BELL), по которому терминал издает в меру противный писк. Существует также много других служебных символов, о которых пользователь и не догадывается. Один из таких символов — ESC, который и был задействован для расширения функциональности терминалов.


 

IPTraf — едва ли не главный инструмент любого администратора


Более продвинутые устройства известны как ESC-терминалы. Они получили — тоже от принтеров — возможность обрабатывать так называемые ESC-последовательности (прозванные так потому, что начинаются с (ascii(0x27)) — кода ESC). Для набора такого символа с клавиатуры нужно ввести Ctrl+V ESC, что записывается как "^[". Такая последовательность не выводится на терминал как символ, а выполняет специальное действие, которое обуславливается символами, идущими за ESC.


В качестве развития терминалов (по-моему, в терминалах ATT, если не ошибаюсь) появились такие, которые умели сначала выделять текст более ярким, тогда еще монохромным, зеленым или коричневым цветом, а потом и цветные символы выводить — четырех, шестнадцати, шестнадцати в двух яркостях и, наконец, из 256-ти цветов.


Для того чтобы терминал понимал эти символы, была разработана общая система ESC-последовательностей. Кроме того, была разработана система управления курсором: некоторые спец. последовательности отсылали курсор в заданную позицию экрана — и, поскольку символы тогда еще были моноширинными, выглядело все это красиво и гармонично.


На сегодня существует несколько "сленгов" ESC-последовательностей — возможно, знакомых вам как "режимы эмуляции терминала". Самый известный — VT100.


Хочется сказать, что все это относится лишь к миру аппаратных терминалов Unix. Первые IBM PC тоже могли позиционировать курсор на уровне BIOS, но посредством совершенно иных механизмов. Под DOS были и есть эмуляторы терминалов — но сама машина ESC-коды не понимает. Некоторое время спустя Xerox, а затем и Apple, предложили графические интерфейсы, вообще на долгие годы забывшие о терминальном вводе и программировании соответственно.


Справедливость восторжествовала только в MacOS X. Впрочем, спор "программно или аппаратно" не имеет предметной основы — все делается программно, но на разном уровне.


Основным недостатком ESC-языка была плохая мнемоничность ESC-кодов (точнее — полное отсутствие этой самой мнемоничности), что выливалось в некоторые сложности разработки. Появлялись "ужасные гуру", которые помнили ESC-коды и монополизировали разработку интерфейсов пользователя — и "другие", которые этих кодов не помнили, а потому ходили со справочниками подмышкой. Поскольку программисты на C с большим энтузиазмом работали в терминальной среде, то вскоре для преодоления такой дискриминации появилась небольшая библиотечка curses. Что она делала, так это активно эксплуатировала ESC-последовательности для создания пользовательского интерфейса. Основные идеи — кэширование и оптимизация пересылок, так чтобы за один сеанс передавать как можно меньше байт. Кроме того, появились режимы оконного интерфейса, подобного тому, что был в Turbo Pascal, а позже — и формы ввода, похожие на все современные формы.


Пока графические интерфейсы для Unix проходили долгий путь к совершенству, группа энтузиастов создала "реинкарнацию" библиотеки curses, назвав ее ncurses — то есть new curses. В качестве прототипа была выбрана версия из дистрибутива System V Release 4.0. Перед этим, правда, была еще psurses, названная по имени Павла Кертиса (Pavel Curtis), но об этом уже мало кто помнит, поскольку дело было в середине восьмидесятых. Были и другие версии, однако после создания ncurses в 1992 г. их всех используют исключительно из духа противоречия — других причин обнаружить не удалось.

 

А в это время Линус Торвальдс сидел в неизвестности, ожидая, когда же Эндрю Танненбаум (Andew S. Tannenbaum) напишет свой Minix — чтобы, не будучи довольным творением учителя, создать свой легендарный Linux…


И тут пришел Linux


Пришел Линус, принес Linux... и ничего особенного, по сути, не произошло. Это только в последнее время для многих многое стало понятно, а тогда Linux воспринимался так же, как и Minix,— как учебная программа для студентов. Первоначально взрослые разработчики проявляли весьма умеренный энтузиазм — хотя сегодня в группе поддержки (контрибьюции) Linux ходят такие боссы, как IBM, Sun и Hewlett Packard.


После того как у Linux обнаружился достаточно POSIX-совместимый компилятор и ядро, для этой ОС начали портировать многие приложения из мира BSD (это сейчас процесс пошел уже в обратном направлении).


Если говорить точно, то ncurses должна компилироваться и работать на любой POSIX-совместимой платформе, к каковым относятся, например, QNX или Cygwin — хотя первая не имеет с Unix ничего общего, кроме POSIX-совместимости, а вторая вообще является эмулятором. В результате сегодня вы можете работать в довольно прихотливых графических оболочках — тем не менее, на большинстве платформ вы сможете скомпилировать и запустить терминальные приложения, написанные с помощью ncurses. Главное — какой-нибудь эмулятор терминала, например — VT100, а также набор POSIX-C совместимых интерфейсов.


Итак, переносимость и производительность (как кода, так и пользователя), а также низкие требования к оборудованию — вот что нам дает эта библиотека и вот почему она до сих пор востребована.


Докатились по сути


Первое, что вам нужно (хотя под Linux оно у вас уже есть) для компиляции ваших программ с использованием ncurses — это база данных различных терминалов. То, что мы вспоминали как "режимы эмуляции".


Что делает ncurses? Фактически, транслирует ваши вызовы в C-программах в последовательности ESC-кодов — а поскольку последовательности не совсем совместимы, нужно иметь целую базу характеристик терминалов. О каждом терминале есть информация: какие режимы, например цвет, он поддерживает (terminfo), а также о том, как заставить его сделать ту или иную операцию — например, переместить курсор в заданную позицию (termcap). Файл с такой информацией называется terminfo.src, а в Linux вы можете обнаружить его под именем /etc/termcap — этот файл распространяется с ncurses. Все современные дистрибутивы обязательно включают ncurses, так что ищите — должен быть.


На самом деле, говоря точно, этот файл содержит и termcap, и terminfo, но нас это будет мало касаться.


 

Midnight Commander — в представлениях не нуждается


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


Некоторые "вечные оптимизаторы" урезают этот файл, чтобы сохранить место на диске. Можете и сами так сделать, на все случаи жизни оставив такие терминалы: ansi, ansi-m, color_xterm, ecma+color, klone+acs, klone+color, klone+sgr, klone+sgr-dumb, linux, pcansi-m, rxvt, vt52, vt100, vt102, vt220 и xterm.


Дело чтения /etc/termcap стоит затраченного времени только в случае, если вы используете настоящие аппаратные терминалы — их вы не заставите работать в режиме эмуляции. Если же вы намерены использовать "софт-терминал", то его легко настроить на один из общепринятых стандартов. Собственно, современные софт-терминалы даже эмулируют свои первые исторические аналоги, например первый XTerm, так что совместимость сегодня не проблема.


Хочется отметить, что сама библиотека ncurses работает не с текстовым файлом, а с его компилированным вариантом (обычно располагается по адресу /usr/share/terminfo) или, если он есть,— с $HOME/.terminfo. Компиляцией именно этих данных заведует утилита tic — у нее весьма содержательные man-страницы. Компилированная форма, впрочем, представляет собой просто оптимизированное для поиска дерево каталогов.


Кстати, по ходу мы заметим, как конфигурируются терминальные настройки для отдельных пользователей. Настройки ищутся сначала в каталоге, заданном в переменной $TERMINFO, затем — в каталоге $HOME/.terminfo и, наконец — /usr/share/terminfo. Перехватывая этот процесс на любом этапе можно для отдельного пользователя задать особые настройки терминала.


Библиотека, собственно


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


У вас, как у программиста, есть доступ и ко всему алфавитно-цифровому экрану, и к отдельным окнам. Точнее — не совсем так: у вас есть весь экран, который по умолчанию является текущим окном. Так вот, все функции продублированы — одни работают с текущим окном, в результате чего экономится один параметр, а другие — с любым заданным. Те, что работают с "другими" окнами, имеют по соглашению префикс w*, то есть windowing output. На самом деле варианты без w* — просто макросы с stdscr (см. дальше) в качестве параметра.


Два буфера экрана определены по умолчанию:

  • curscr — это то, что пользователь как бы видит (проверить это нет возможности), то есть старый буфер;
  • stdscr — буфер, в который вы косвенно, с помощью команд вывода, пишете символы и строки.

На самом деле до команды refresh() никакой передачи не происходит — только после вызова refresh() оба буфера синхронизируются. При этом ncurses "за сценой" сравнивает оба буфера построчно, находит "дифф" и преобразует ваши действия в наименьшее количество пересылок ESC-последовательностей. Также реализуются такие "чудеса", как отсечения текста по границам окон, прокрутка окон, формы и так далее — естественно, что терминал и не подозревает о таких вещах, он получит только лишь ESC-коды.



MP3Blaster — отличный MP3-плеер, управляемый горячими клавишами


Одна из примитивных операций — переместить курсор в заданную позицию. Другая — записать один символ в позицию курсора. Позиции могут быть как относительно экрана, так и относительно окна. Вся библиотека ncurses изобилует "удобствами" вроде объединения таких команд: есть как функция, к примеру, move(x,y) и addch(ch), так и mvaddch(x,y,ch). Обычно вы, конечно, будете выводить не по одному символу, а целыми строками, с помощью addstr() или printw(). Как вы поняли, последняя работает так же, как и printf(), только в заданном окне. В результате вы имеете комбинацию координатного вывода и режима "телетайп в окне". Такими делами, как автоматический скроллинг, занимается ncurses.


Hellow World!


Теперь продемонстрируем самую простую "Hello World", которая демонстрирует дополнительные вещи, такие как инициализация.

 

#include < ncurses.h >
int main() {
    initscr();
    printw("Hello World !!!");
    refresh();
    getch();
    endwin();
    return 0;
}

 

Как видите — сложного мало. Единственное, что библиотека должна "захватить" весь экран в целях отсутствия интерференции с другими приложениями, поэтому есть инициатор (который, помимо захвата экрана, инициирует также внутренние структуры ncurses), а также endwin(), который возвращает все на свои места — вы видели, как это происходит в Midnight Commander и других программах. Не забудьте указать библиотеку в строке gcc:

 

gcc hw.c –lncurses

 

Более сложные вопросы


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


У окон своя система координат, своя текущая позиция курсора, так что все, как в экране,— только в окне. Единственное, что вы должны всегда держать в уме: координаты в ncurses суть "строка и позиция", можно сказать — y и затем x, в терминах других оконных систем. Кто привык к другому — может пару раз ошибиться. Будут палитры — пары цветов, задающие фон и цвет символов. Будут так называемые "жирность" и "подчеркивание", хотя на большинстве терминалов это одно и то же. Сами атрибуты могут "включаться" и "выключаться". Например, attron(A_BOLD) включает режим жирных символов и весь остальной вывод — до attroff(A_BOLD) — будет идти в жирном (на аппаратных терминалах — в ярком, "подсвеченном") начертании. Есть даже такая функция, как chgat(), которая меняет атрибуты, не изменяя ни самих символов, ни текущей позиции курсора.


Библиотека не только выводит символы, но и читает их. У чтения — много режимов, которые обычно задаются сразу после инициализации. Можно вводить символы по мере ввода, посимвольно, а можно — целыми строками, по нажатию Enter. Можно также разрешить терминалу авто-эхо, а можно подавить эхо и реализовать его самостоятельно. Для разбора строки, начиная с произвольного места экрана, применяется аналог scanf() scanw().

 

Все это, с даже большими деталями, чем это необходимо, вы можете найти в интернете, например по адресу www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/.


И это еще один довод в пользу ncurses: открытая, доступная среда разработки и поддержка в Сети. В результате вы после пары дней практики сможете создавать легкие и быстрые интерфейсы, которые, я надеюсь, просуществуют не одно десятилетие. По крайней мере, в будущем из "Матрицы" я еще видел символьные терминалы — притом монохромные. А кино, как мечта: делает наше будущее.

2005.01.27
19.03.2009
В IV квартале 2008 г. украинский рынок серверов по сравнению с аналогичным периодом прошлого года сократился в денежном выражении на 34% – до $30 млн (в ценах для конечных пользователей), а за весь календарный год – более чем на 5%, до 132 млн долл.


12.03.2009
4 марта в Киеве компания Telco провела конференцию "Инновационные телекоммуникации", посвященную новым эффективным телекоммуникационным технологиям для решения задач современного бизнеса.


05.03.2009
25 февраля в Киеве компания IBM, при информационной поддержке "1С" и Canonical, провела конференцию "Как сохранить деньги в условиях кризиса?"


26.02.2009
18-19 февраля в Киеве прошел юбилейный съезд ИТ-директоров Украины. Участниками данного мероприятия стали ИТ-директора, ИТ-менеджеры, поставщики ИТ-решений из Киева, Николаева, Днепропетровска, Чернигова и других городов Украины...


19.02.2009
10 февраля в Киеве состоялась пресс-конференция, посвященная итогам деятельности компании "DiaWest – Комп’ютерний світ" в 2008 году.


12.02.2009
С 5 февраля 2009 г. в Киеве начали работу учебные курсы по использованию услуг "электронного предприятия/ учреждения" на базе сети информационно-маркетинговых центров (ИМЦ).


04.02.2009
29 января 2009 года в редакции еженедельника "Computer World/Украина" состоялось награждение победителей акции "Оформи подписку – получи приз!".


29.01.2009
22 января в Киеве компания "МУК" и представительство компании Cisco в Украине провели семинар для партнеров "Обзор продуктов и решений Cisco Small Business"

 

 
 
Copyright © 1997-2008 ИД "Комиздат".