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

Нам уже известно, что перенаправлением
ввода-вывода можно создать временный файл (это выглядело бы так: sort
<names2 >temp ; uniq temp ; rm temp), однако конвейер,
задаваемый символом |, позволяет "замкнуть" вывод команды
sort на ввод uniq без создания промежуточного файла, который потом
нужно удалять: sort <names2 | uniq temp. Цепочка команд,
объединяемых в конвейер, может быть произвольной длины.


И, наконец, еще одним мощным средством командной
оболочки является поддержка шаблонов имен файлов (усеченного варианта
так называемых "регулярных выражений"). Если мы хотим
удалить из каталога, содержимое которого отображалось в примере на
рис. 1, файлы words-to-avoid.ru.html.1 и words-to-avoid.ru.html.2,
нам не обязательно передавать их список команде rm; достаточно
определить выражение, однозначно их характеризующее, например
words-to-avoid*. Метасимвол * означает любое количество любых
символов; существют и другие метасимволы. Результат выполнения этой
команды в указанном каталоге в точности эквивалентен команде rm
words-to-avoid.ru.html.1 words-to-avoid.ru.html.2, причем "раскрытие"
метасимволов выполняет, опять же, не утилита, а сама оболочка.


6.4 Командная оболочка как язык программирования


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



  • сентенциональная (директивная) парадигма;


  • возможность построчной интерпретации или
    однопроходной компиляции (т.е. построчкая контекстная независимость
    сверху вниз). Нам неизвестны компилирующие реализации языка
    стандартной оболочки;


  • наличие управляющих конструкций:


  • последовательного исполнения,


  • условного (if-then, if-else, if-then-else,
    if-then-elif...) исполнения,


  • многовариантного выбора (case),


  • циклов (перебора списка for, с постусловием
    until, с предусловием while) и их разрыва (break, continue);


  • наличие механизма подпрограмм-функций
    (описываемых как в файле сценария, так и в отдельных файлах или
    библиотеках);


  • наличие оператора присваивания (установки
    значения переменной);


  • возможность использования внешних программ
    (команд) ОС в качестве операторов (вызовов функций) и обработки
    значений их кодов возврата;


  • наличие нетипизованных переменных. Переменные
    декларируются первым упоминанием, могут принимать в качестве
    значения произвольную строку. Значение, могущее быть
    интерпретированным как число может использоваться в выражениях
    целочисленной арифметики;


  • развитый синтаксис выражений, используемых в
    операторах присваивания, а также в качестве условий исполнения или
    циклов;


  • развитая система работы с файлами
    (ввода/вывода), в том числе со стандартным вводом с терминала и
    выводом на терминал;



Таким образом, язык оболочки хорошо подходит для
того, для чего он предназначен: написания программ (сценариев) работы
с файлами (небезынтересно, что значительная часть самих открытых ОС
написана именно на языке оболочки). Он не слишком подходит для
решения алгебраических задач, хотя отсутствие встроенного механизма
работы с плавающей арифметикой может быть обойдено применением
специальных утилит, например, универсального калькулятора
произвольной точности bc, и хранением значений вещественных чисел в
строковых переменных. Подобным же образом использованием внешних
утилит можно писать на этом языке программы с оконным (как
псевдографическим, так и графическим) интерфейсом.


Синтаксис языка (в частности, синтаксис выражений)
не отличается внешним изяществом (хотя для знатока сценарии могут
быть весьма красивыми и нетривиальными) и вряд ли может быть
рекомендован7
в качестве первого языка при знакомстве с программированием.
Отсутствие типизации и неподдержка иных, кроме сентенциональной,
парадигм программирования, во всяком случае, служат веским поводом к
тому, чтобы не вводить его в учебный курс в качестве единственного.


В то же время, хотя бы беглое знакомство с языком
оболочки, помимо очевидного прагматического значения, дидактически
полезно. Он вполне пригоден для демонстрации таких важных понятий,
как присвоение значений, смысл и использование управляющих
конструкций, подпрограммы (функции). Технически он прост в
использовании благодаря наличию интерпретатора bash (могущего
работать в POSIX-режиме, т.е. в строгом соответствии со стандартами)
под рукой в любой стандартной ОС (а также наличию портов того же bas
практически для любой альтернативной платформы). Он может быть
единственным сентенциональным языком в общеобразовательном курсе
информатики.


6.5 Ресурсы


Методическая литература, специально
ориентированная на школьный курс и посвященная программированию на
языке оболочки, на русском языке сегодня отсутствует, хотя следует
отметить, что "классические" руководства по Unix за
тридцать лет развития отрасли достигли практически кристальной
прозрачности изложения и легко могут быть адаптированы для нужд как
учителей, так и самих учащихся. По-русски нам известна единственная
книга [11], специально посвященная программированию на языке
оболочки.


Интерпретаторы языка оболочки являются
неотъемлемой частью открытых систем и включены в состав любого
дистрибутива (так же, как и руководства пользователя); лучшим из них
мы считаем свободный bash, разработанный Фондом свободного
программного обеспечения. Для пользователей альтернативных архитектур
(например, Microsoft Windows) мы рекомендуем также bash, доступный в
составе многочисленных программных пакетов.


Для Microsoft Windows рекомендуется установка
пакета Cygwin, содержащего утилиты GNU и некоторые другие программы,
позволяющие организовать стандартную рабочую среду. Следует учесть,
что при работе в версиях MS Windows, основанных на MS-DOS (MS Windows
95/98/Me), у многих программ возникают сложности из-за отсутствия в
MS-DOS контроля за правами доступа к файлам и каталогам (версии,
основанные на NT -- MS Windows NT/00/XP, лишены этого
недостатка), а также то, что локализованная для русской среды сборка
Cygwin в настоящее время не поставляется. Для поддержки кириллических
символов необходимо в каталоге пользователя создать файл с именем
.inputrc, содержащий строки:


set meta-flag on
set convert-meta off
set output-meta on


Альтернативой Cygwin (по ряду причин менее предпочтительной) является
использование системы Interix UNIX Tools for Windows, также
содержащей утилиты GNU, включая bash (ее можно приобрести через
Microsoft на диске либо скачать с их сайта).


Лекция 7. Графический интерфейс пользователя


До середины девяностых существовали отдельно
компьютерная графика и отдельно -- настольные игры в
компьютерную графику. Помнящие историю отечественной школьной
информатизации читатели, возможно, сталкивались с чудом техники под
названием "цифровой дисплей растровый" (ЦДР), которое
удавалось подключить к первому отечественному персональному
компьютеру ДВК, чтобы отображать на экране телевизора несколько тысяч
пикселов в четырех цветах. В то время в Лабораториях Компьютерной
Графики некоторых вузов можно было встретить Графические Рабочие
Станции с векторными устройствами и X-терминалами, и даже плоттерами.


Закон Мура тем временем делал свое (в данном
случае, не черное, а многоцветное) дело, и к середине девяностых на
компьютере с процессором Intel 486 уже запускалась та самая система,
которую пятью годами раньше наблюдать можно было лишь на X-терминалах
и графических станциях, стоивших каких-то немыслимых (что по тем
временам, что сегодня) денег.


Игры в самодельную графику, конечно, продолжаются
и сегодня, но в целом мир воссоединился, и особой нужды в таких играх
давно нет. Хотя -- такова диалектика массовых рынков --
именно эти игры (включая игры в буквальном смысле) породили спрос на
дешевые устройства (прежде всего, графические акселераторы), которые
и делают настоящую компьютерную графику доступной пользователю
массовой x86- и PowerPC-техники, даже устаревшие "персоналки"
-- сопоставимыми с X-терминалами, а более новые и мощные --
соперниками и с профессиональных графических рабочих станций
начального и среднего уровня.


7.1 X Window System и Xfree86


X Window System -- один из самых больших и
успешных проектов в истории компьютерной техники -- восходит к
1984 г., когда разработчики двух систем компьютерной графики,
претендующих на универсальность -- проектов Athena
(Массачуссетский технологический институт) и W Windowing
(Стэнфордский университет) -- решили объединить свои усилия. С
тех пор практически каждая компания, серьезно занимающаяся графикой,
посчитала своим долгом внести какие-либо разработки в систему,
формальным "хозяином" которой в 1987 г. стал вновь
созданный X Consortium (ныне X Open Group, www.X.org).


С тех пор X прошел через одиннадцать основных
релизов и множество версий.


Дальнейшее изложение ориентировано на свободную
реализацию X, которая называется XFree86, поддерживается одноименным
партнерством (www.xfree86.org) и воплощает на сегодня версию 4.2
текущего релиза. XFree86 -- самая популярная реализация X, она
поставляется в составе подавляющего большинства открытых систем (как
свободных, так и несвободных) для x86-совместимых компьютеров,
поддерживает беспрецедентно широкий спектр оборудования и, благодаря
доступности исходных текстов и пользовательской аудитории в десятки
миллионов человек, достаточно "вылизана", по крайней
мере, насколько это возможно для такого разнообразия "железа".
Несмотря на то, что исторически цифры "86" в названии
пакета относятся к соответствующему семейству процессоров от Intel,
современные версии XFree86 реализованы для большинства других
популярных процессоров. XFree86 доступен и для некоторых
альтернативных архитектур ОС, включая Microsoft Windows NT.


Большинство нижесказанного справедливо для любой
реализации X на любом оборудовании и под любой ОС, список которых
можно найти на www.X.org.


7.2 Цветной сэндвич


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


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


Здесь сразу видно отличие X Windows System от
большинства самодельных систем графики, используемых в проприетарных
системах: взаимодействие X-сервера с его многочисленной клиентурой
происходит по специфицированному протоколу, который может
туннелироваться через TCP/IP и, соответственно, клиенты и сервер
могут исполняться на разных узлах Сети. Это означает, что одни и те
же программы могут эксплуатироваться в разных топологиях, включая
совокупность автономных рабочих станций ("персональных
компьютеров"), совокупность рабочих станций без данных или
бездисковых рабочих станций ("локальная сеть"),
многопользовательскую систему с X-терминалами (или какую-либо
гибридную топологию).


Еще одним ресурсом, который предоставляет
X-сервер, являются шрифты. Оперировать шрифтами он может
самостоятельно, либо с помощью другой программы, которая называется
сервер шрифтов X и обеспечивает их масштабирование.


Большинство пользователей, установив систему,
получают в свое распоряжение готовую графическую среду. Мы поступим
иначе -- будем разбираться с ней по слоям.


7.3 "Чистый" X


На Рис. 1 изображена "голая" система X
Window -- то, с чем большинство пользователей никогда не
сталкивается. Запустить ее обычно можно так: X.





Мы видим традиционный серый экран с не менее
традиционным курсором в виде буквы X. Используя мышь или другое
координатное устройство, курсор можно перемещать по экрану. На
нажатие кнопок мыши и клавиш никакой видимой реакции не следует. И
невидимой тоже -- сервер готов передавать эти сигналы своим
клиентам, а клиенты пока не запущены. Хотя на самом деле некоторые
комбинации клавиш X перехватывает и обрабатывает. Это Zap
(Control-Alt-Backspace) -- завершение работы сервера (если эта
возможность не запрещена при конфигурации), Zoom (Control-Alt-+/-) --
"горячее" переключение доступных видеорежимов. В
некоторых ОС (Например, GNU/Linux) Control-Alt в сочетании с
функциональной клавишей освобождает оборудование и передает его на
время соответствующей виртуальной консоли.



Воспользуемся последней возможностью, перейдем на консоль и запустим
первое клиентское приложение: программу xterm (Рис. 2). На экране X
обрел появилось окно, а в окне можно видеть интерфейс клиентского
приложения. В данном случае интерфейс текстовый, а приложение --
эмулятор терминала, на котором запущена диалоговая оболочка системы
по умолчанию. С эмулятором можно делать все то же, что и с обычным
терминалом: издавать команды, получать результат и запускать другие
программы. Если программы текстовые (строчные или оконные),
исполняться они будут в том же окне, а если графические (как и сам
xterm) -- в отдельных окнах.



Запустим программу xclock (Рис. 3). При ее запуске мы использовали
несколько параметров, задающих геометрию (местоположение и размер)
вновь порождаемого окна, цвет его фона и шрифта по умолчанию, толщину
и цвет рамки. Эти (и некоторые другие) параметры типичны для
программ, построенных на основе графической библиотеки X Toolkit.
Значения параметров, заданные при вызове программы, могут быть
перекрыты самим запускающимся приложением, кроме опции геометрии.
Дело в том, что окно выделяется клиентскому приложению при запуске, и
все доступные ему ресурсы этим окном и ограничены -- это
свойство X-протокола.


Запустив несколько экземпляров того же xterm (и
почитав документацию) можно обнаружить, что и "голышом" X
умеет не так мало. Например, оперирует буфером обмена текстом между
приложениями и предоставляет текстовым приложениям такой ресурс, как
полосу прокрутки (забавная полоска, скроллировать текст с помощью
которой вверх или вниз можно, щелкая по ней разными кнопками мыши, --
это наследие проекта Athena).


Есть ли польза от системы, работающей с
фиксированными окнами? Да, если вспомнить, что "универсальный
десктоп" -- не единственная сфера применения компьютера.
Можно запустить при загрузке X и браузер на весь экран и получить
гипермедийный киоск по цене PC. А можно посадить за тот же браузер
оператора, который будет через него весь день "рулить"
базу данных.


Но мы пойдем дальше. Итак, основная работа
X-сервера -- создавать окна и предоставлять клиентским
приложениям возможности работы в них. Для того, чтобы работать с
окнами, нужна другая программа, которая так и называется --
менеджер окон (window manager).


7.4 Окноводы


Как же менеджер окон преодолевает указанное
ограничение X-протокола? Никак -- просто выделенным ему окном
является весь экран. (На самом деле, менеджер окон -- не
единственная программа, способная работать с "корневым"
окном; например, входящая в комплект поставки xsetroot позволяет
установить цвет фона или поместить на него рисунок.)


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


"Просвещение" (www.Enlightenment.org)
создано Карстеном Хайцлером и Джеффом Харрисоном (Carsten Haitzler,
Geoff Harrison) и его текущая версия -- 0.16.5. До 2000 г. он
был "штатным" менеджером окон в популярной среде GNOME
(ей будет посвящена отдельная "лекция"), затем уступив
это место менее функциональной, но более быстрой "Рыбе-пиле"
(Sawfish). Он продолжает оставаться GNOME-совместимым, и многие
пользователи этого популярного десктоп-менеджера предпочитают его,
хотя и без GNOME у Enlightenment поклонников хватает.




Запустим "Просвещение" (Рис. 4). Как резко изменилась
картина!


Первое, что мы видим -- это появившиеся
вокруг окна нашего xterm "виджеты" (элементы окон) --
строка заголовка с кнопками и рамка. Окно теперь можно перемещать по
экрану, "ухватив" за заголовок, масштабировать, "взяв"
за бок или за угол, максимизировать, минимизировать или закрыть,
нажав соответствующую кнопку. Спрашивается, что еще можно делать с
окном?



Вопрос не праздный. Нажав на левую кнопку в заголовке, получаем
неожиданно разнообразное меню (меню -- это тоже "виджет")
таких действий (Рис. 5). Оказывается, его можно еще уничтожить
(Annihilate), поднять/опустить (Raise/Lower), оттенить/растенить
(Shade/Unshade) приклеить/отклеить (Stick/Unstick) и выполнить еще
массу действий, для которых потребовались отдельные меню! Набор этих
действий зависит от конкретного менеджера окон (и Enlightenment --
один из самых богатых возможностями), а то, какие из них выведены в
строку заголовка отдельными кнопками -- вообще от его настройки.


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



Вы уже обратили внимание на то, что при запуске "Просвещения"
на экране появилось еще одно окно. Это так называемый пейджер
(pager), на Рис. 6 он изображен крупным планом. На пейджере
представлена миниатюрная копия экрана, обновляющаяся в режиме
реального времени, причем, если подвести курсор к изображению
отдельного окна, оно увеличивается и рядом высвечивается название
приложения, запущенного в нем. Но почему экран занимает только
четверть окна пейджера? Потому что оконный менеджер позволяет
оперировать "виртуальным столом, по размеру превышающим
физический экран, а пейджер -- одно из средств перемещения
физического экрана по рабочему столу. Enlightenment позволяет
создавать до 64 экранов на рабочем столе.



Еще один важный компонент Enlightenment мы не увидели сразу: это меню
настройки самого менеджера, которое можно "достать",
щелкнув правой кнопкой мыши на фоне экрана (Рис. 7). Порывшись в
настройках, можно обнаружить, что вышесказанное о способах
оперирования с этим менеджером весьма условно, потому что поменять
можно буквально все, от декора виджетов до количества и функций
элементов оформления окон и их реакции на различные действия.


Лишь один пример: сколько способов визуализировать
перемещение окна вы знаете? Разработчики "Просвещения"
придумали целых шесть, включая фантастический "полупрозрачный".
Настройки и расширения Enlightenment можно объединять в "темы"
(themes) и обмениваться ими.


Собственно, на этом функции оконного менеджера как
такового и заканчиваются, а дальше Enlightenment вторгается во
владения другого класса программ -- менеджеров рабочего стола...


7.5 Столоначальники


...Что демонстрирует отсутствие резкой границы
между ними. Существует два подхода к тому, чтобы достроить оконную
систему до полнофункциональной среды. Первый -- добавить в
"графический сэндвич" еще один слой -- менеджер
рабочего стола -- работающий "поверх" оконного
менеджера и использующий функциональность последнего. Этим путем идут
команды разработчиков GNOME и KDE, которым посвящены отдельные
"лекции".


Другой путь -- "дотянуть" до
полнофункциональной среды функциональность самого оконного менеджера,
и им идет Enlightenment и ряд других проектов.


Что нам не хватает до полнофункциональной среды?
Менеджера программ, утилит и приложений. Так вот, в "Просвещении"
есть и такая функциональность, доступная (по умолчанию) по щелчку на
фоне левой кнопкой.


Комментировать здесь особо нечего: пункты меню
позволяют запустить множество различных приложений, причем, кроме
независимо разработанных, и целую пачку "эпплетов",
поставляемых вместе с Enlightenment. Альтернативный способ запуска --
через "панель" -- встроен в некоторые темы
"Просвещения".


Откуда берутся такие ресурсы, как "виджеты"
с их декором и способом поведения? Конечно, менеджер окон может
содержать их в себе. Но такой подход не очень характерен для открытых
систем, одним из принципов разработки которых является
компонентность. Большинство развитых оконных менеджеров, менеджеров
рабочего стола и "заточенных" под них приложений можно
сгруппировать по библиотекам (toolkits), с опорой на которые они
разработаны.


7.6 Триумф интерфейса над пользователем?


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


Фредерик Брукс еще в 1995 г., обсуждая основные
процессы, произошедшие в программной отрасли за 20 предшествовавших
лет, назвал в числе "наиболее впечатляющих явлений"
"триумф интерфейса WIMP" [17, сс. 239-243]. В этом
ставшем классическим четырехстраничном анализе (всем, интересующимся
темой, крайне рекомендуется прочитать эти четыре страницы. А заодно --
и всю книгу Брукса). Брукс:



  • производит декомпозицию самой идеи ("диалог"
    с системой: объекты-"существительные" и
    действия-"глаголы"),


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


  • называет ограничения метафоры "рабочего
    стола" ("проблема двух курсоров"), а также


  • предрекает устаревание WIMP при внедрении
    речевого интерфейса ("WIMP через поколение станет достоянием
    истории. Указание курсором останется способом задания
    существительных при управлении нашими компьютерами. Для выражения
    глаголов станет использоваться речь").



Прошло еще пять лет, и мы можем отметить, что:



  • Проф. Брукс не заметил решения "проблемы
    двух курсоров" (а заодно -- и непротиворечивой интеграции
    командной строки в графико-интерфейсное окружение) в конце
    восьмидесятых в Norton Commander (и сонме последователей этой
    замечательной программы на разных платформах (обзор см. в [15].
    Проф. Безруков предложил для реализованного в Norton Commander
    интерфейса термин "ортодоксальный менеджер файлов"
    (OFM));


  • WIMP не думает устаревать, и скорее сам
    абсорбирует новые интерфейсные возможности (включая распознавание
    речи), чем будет вытеснен ими;


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



"Сплошной" же WIMP-среды и вовсе нет
нигде, кроме встроенных/специализированных систем: в любом окружении,
претендующем даже не на универсальность, а просто на широкую сферу
применения, элементы WIMP сочетаются с элементами другой интерфейсной
модели -- командно-строчной -- иногда более органично (OFM,
AppleScript и т.п.), а чаще эклектично, противоречиво и с фатальным
для производительности исходом (фрагменты "рваной"
командной строки в "диалоговых окнах", разнообразные
Wizards и "окна установки предпочтений").


Если перечитать текст доклада, в котором идеи WIMP
впервые были представлены широкой публике [16], станет понятно,
почему: модель WIMP предлагалась как средство непосредственного
манипулирования конкретными объектами ("взять это и положить
туда", "изменить такое-то свойство того-то объекта",
а не как средство формулирования абстрактных положений и команд ("все
ли файлы, лежащие в каталоге X, имеют формат Y?", "удалить
все файлы, созданные до 01.01.2000 в которых упоминается Борис
Ельцин" и т.п.). Соответственно, сделать WIMP-рабочее место для
выполнения технических процедур, "рабского",
неквалифицированного труда можно, а вот систему поддержки полноценной