Читаем Журнал «Компьютерра» № 5 за 7 февраля 2006 года полностью

В качестве примера я написал плагин, который позволяет управлять воспроизведением музыки в Monad (полный код можно найти в [4]). Ниже приведена реализация команды play-nextsong на языке C#, которая переключает воспроизведение на следующую композицию:


[Cmdlet(«play», «nextsong»)]

public class PlayNextSongCommand : Cmdlet

protected override void EndProcessing()

Media.Player.controls.next();

Этого достаточно чтобы пользователь смог найти команду и узнать, как с ней работать:


Media:\Slayer\Reign In Blood> get-command play*

Command Type Name Definition

— — —

Cmdlet play-nextsong play-nextsong [-Verbose…

Cmdlet play-previoussong play-previoussong [-Ver…

Cmdlet play-song play-song [[-MshPath] S…

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


Media:\Slayer\Reign In Blood> get-command play-nextsong —Synopsis

play-nextsong [[-SkipSongCount] Int32] [-Verbose] [-Debug] [-ErrorAction ActionPreference] [-ErrorVariable String] [-OutVariable String] [-OutBuffer Int32]

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


Media:\Slayer\Reign In Blood> ls

Number Name AlbumName ArtistName Year

— — — —

1 Angel of Death Reign In Blood Slayer 1986

2 Piece By Piece Reign In Blood Slayer 1986

3 Necrophobic Reign In Blood Slayer 1986

Новые возможности

Что же дает Monad различным категориям пользователей? Программисты, например, смогут ускорить реализацию интерфейсов управления к разрабатываемым системам. Для того чтобы создать новую команду, достаточно унаследовать свой класс от класса Cmdlet и вызвать из него специфичную функцию системы (см. врезку). Отметим, что, реализовав интерфейс управления к своей программе таким образом, разработчик не ограничивается только командной строкой. Стандартная графическая консоль управления Microsoft Management Console (MMC), используемая в Windows XP и Vista, будет понимать модули, написанные для Monad.

Администраторам разнородных сетей, безусловно, будет удобнее управлять Windows-системами, с помощью привычного интерфейса командной строки. Инструменты управления DNS и Active Directory с навигацией, реализованной в виде иерархической структуры, тоже разрабатываются, и их можно найти в Интернете.

Администраторы смогут скомпоновать из разных блоков командную оболочку для определенных типов задач. Ее можно указать в качестве сценария запуска (login shell) при входе определенной группы пользователей в систему — локально или удаленно. Тем самым можно ограничивать функции, доступные пользователям, а требования к пропускной способности канала в случае распределенной системы будут минимальными, достаточными для протокола telnet.

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


SH vs MSH

Не могу удержаться от соблазна сразу же привести пример. Людям, знающим предметную область, он многое объяснит.

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

Я попросил специалиста Unix shell быстро, не зарываясь в man, написать такой скрипт.

Решение SH:


%>ps -A -sort ‘%cpu’ -format ‘%cpu,pid’ | egrep -v ‘^ (0|1|2).’ | grep -v ‘%CPU’ | tail —n3 | gawk ‘{print $2;}’ | xargs -r kill

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

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

Решение Monad:


C:\> get-process | where-object { $_.cpu -gt 3 } | sort-object -property cpu | select-object -Last 3 | foreach-object { $_.Kill() }

get-process — функция, возвращающая массив объектов типа System.Diagnostics.Process;

where-object — функция условия, которая сравнивает значение свойства с тройкой;

$_ — переменная, содержащая элемент массива — объект класса Process;

sort-object, select-object — сортировка и фильтрация массивов;

foreach-object — выполнить код для каждого элемента, в нашем случае — вызвать метод объекта — Kill()

Эту же строку можно написать с использованием алиасов:


C:\> ps | where { $_.cpu -gt 3 } | sort cpu | select -Last 3 | foreach { $_.Kill() }

Читаемость варианта Monad даже не имеет смысл сравнивать с SH-скриптом. Написано за минуту.

Когда?

Перейти на страницу:

Все книги серии Компьютерра

Похожие книги

«Если», 1999 № 06
«Если», 1999 № 06

ФАНТАСТИКАЕжемесячный журналСодержание:Брюс Стерлинг. ВЕЛОСИПЕДНЫЙ МАСТЕР, рассказСергей Куприянов. ПОЯС, рассказФАКТЫДжерри Пурнелл. СТРАХОВЩИК, повестьВИДЕОДРОМ*Тема--- Дмитрий Караваев. АПОКАЛИПСИС, статья*Посткриптум--- Вл. Гаков. ЗАТЕРЯННЫЕ В СПЕЦЭФФЕКТАХ, статья*Рецензии*Тема--- Вл. Гаков. ЗЛОВЕЩИЙ ОСКАР ГОЛЛИВУДА, статья*Внимание, мотор!--- Арсений Иванов. НОВОСТИ СО СЪЕМОЧНОЙ ПЛОЩАДКИ, очеркТимоти Зан. БОМБА ЗАМЕДЛЕННОГО ДЕЙСТВИЯ, повестьМарк Рич. ЧИСТОЕ ВОЛШЕБСТВО, рассказЛоис Макмастер Буджолд. ПЛЕТЕЛЬЩИЦА СНОВ, рассказПол Уилсон. ПРОВОЛОКА, рассказКРЕДО*Вячеслав Рыбаков. КАКОЕ ВРЕМЯ — ТАКОВЫ ПРОРОКИ, статьяКУРСОРРЕЦЕНЗИИКРУПНЫЙ ПЛАН*Александр Ройфе. ЧУДЕС НЕ БЫВАЕТ? статьяPERSONALIAНа обложке иллюстрация Игоря Тарачкова к повести Тимоти Зана «Бомба замедленного действия»Иллюстрации О. Васильева, О. Дунаевой, А. Филиппова, И. Тарачкова, А. Юрьевой.

Брюс Стерлинг , Владимир Гаков , Вячеслав Михайлович Рыбаков , Журнал «Если» , Фрэнсис Пол Вилсон

Журналы, газеты