среда, 12 января 2011 г.

Удаление пользователя и группы на рабочей станции  , Андрей Владимирович Попов

Для удаления созданных с помощью сценариев AddUser.js и AddGroup.js пользователя XUser и группы XGroup мы создадим сценарий DelUserAndGroup.js, который представлен в листинге 11.5.

Замечание

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

В принципе, удалить пользователя и группу так же просто, как и создать — нужно связаться с объектом Computer:

ComputerObj = GetObject("WinNT://404_Popov");

и вызвать метод Delete(), указав в качестве первого параметра класс объекта, который мы хотим удалить, и в качестве второго параметра — имя этого объекта:

//Удаляем пользователя

ComputerObj.Delete("user", UserStr);

Однако здесь могут возникнуть ошибки (например, мы не запускали предварительно сценарий AddUser.js и у нас на компьютере не зарегистрирован пользователь, которого мы хотим удалить). Поэтому в сценарии DelUserAndGroup.js предусмотрена обработка исключительных ситуаций с помощью конструкции try…catch:

IsError=false;

try {

 //Удаляем пользователя

 ComputerObj.Delete("user", UserStr);

} catch (e) { //Обрабатываем возможные ошибки

 if (e != 0) {

  //Выводим сообщение об ошибке

 IsError=true;

  Mess="Ошибка при удалении пользователя "+UserStr+"\nКод ошибки: " + е.number+"\nОписание: "+е.description;

  WshShell.Popup(Mess, 0, "Удаление пользователя", vbCritical);

 }

}

Как мы видим, если при вызове метода Delete() произойдет какая-либо ошибка, значение переменной IsError станет равным true, а на экран с помощью метода Popup() объекта WshShell выведется соответствующее сообщение (рис. 11.3).

Рис. 11.3. Сообщение, формируемое при попытке удаления несуществующего пользователя


Если же удаление прошло успешно (значение переменной IsError равно false), то на экран также выведется соответствующее диалоговое окно (рис. 11.4):

if (!IsError) { //Все в порядке

 Mess="Пользователь."+UserStr+" удален";

 WshShell.Popup(Mess, 0, "Удаление пользователя", vbInformation);

}

Рис. 11.4. Сообщение об удачном удалении пользователя


Листинг 11.5. Удаление пользователя и группы на рабочей станции

/********************************************************************/

/* Имя: DelUserAndGroup.js                                          */

/* Язык: JScript                                                    */

/* Описание: Удаление пользователя и группы компьютера              */

/********************************************************************/

//Объявляем переменные

var

 ComputerObj,         //Экземпляр объекта Computer

 UserStr = "XUser",   //Имя удаляемого пользователя

 GroupStr = "XGroup", //Имя удаляемой группы

 WshShell;            //Объект WshShell

//Инициализируем константы для диалоговых окон

var vbCritical=16,vbInformation=64;

//Связываемся с компьютером 404_Popov

ComputerObj = GetObject("WinNT://404_Popov");

//Создаем объект WshShell

WshShell = WScript.CreateObject("WScript.Shell");

/*************  Удаление пользователя  ***********************/

IsError=false;

try {

 //Удаляем пользователя

 ComputerObj.Delete("user", UserStr);

} catch (e) {  //Обрабатываем возможные ошибки

 if (e != 0) {

  //Выводим сообщение об ошибке

  IsError=true;

  Mess="Ошибка при удалении пользователя "+UserStr+"\nКод ошибки: " + e.number + "\nОписание: " + e.description;

  WshShell.Popup(Mess,0,"Удаление пользователя",vbCritical);

 }

}

if (!IsError)  {

 //Все в порядке

 Mess="Пользователь "+UserStr+" удален";

 WshShell.Popup(Mess,0,"Удаление пользователя",vbInformation);

}

/*************  Удаление группы  ***********************/ 

IsError=false;

try  {

 //Удаляем группу

 ComputerObj.Delete("group", GroupStr);

} catch (e) {  //Обрабатываем возможные ошибки

 if (e != 0) {

  //Выводим сообщение об ошибке

  IsError=true;

  Mess="Ошибка при удалении группы "+GroupStr+"\nКод ошибки: " + e.number+"\nОписание: " + e.description;

  WshShell.Popup(Mess,0,"Удаление группы",vbCritical);

 }

}

if (!IsError)  {

 //Все в порядке

 Mess="Группа "+GroupStr+" удалена";

 WshShell.Popup(Mess,0,"Удаление группы",vbInformation);

}

/*************  Конец *********************************************/


Использование объекта атрибутов. H. M. Ручко

Объект атрибутов инкапсулирует атрибуты потока или группы потоков. Он используется для установки атрибутов потоков при их создании. Атрибутный объект потока имеет тип pthread_attr_t. Он представляет собой структуру, позволяющую хранить следующие атрибуты:

• размер стека потока;

• местоположение стека потока;

• стратегия планирования, наследование и параметры;

• тип потока: открепленный или присоединяемый;

• область конкуренции потока.

Для типа pthread_attr_t предусмотрен ряд методов, которые могут быть вызваны для установки или считывания каждого из перечисленных выше атрибутов (см. табл. 4.3).

Для инициализации и разрушения атрибутного объекта потока используются функции pthread_attr_init () и pthread_attr_destroy () соответственно.

Синопсис

#include <pthread.h>

int pthread_attr_init(pthread_attr_t *attr);

int pthread_attr_destroy(pthread attr__t *attr) ;

Функция pthread_attr_init () инициализирует атрибутный объект потока с помощью стандартных значений, действующих для всех этих атрибутов. Параметр attr представляет собой указатель на объект типа pthread_attr_t. После инициализации attr-объекта значения его атрибутов можно изменить с помощью функций, перечисленных в табл. 4.3. После соответствующей модификации атрибутов значение attr используется в качестве параметра при вызове функции создания потока pthread_create(). При успешном выполнении эта функция возвращает число 0, в противном случае — код ошибки. Функция pthread_attr_init() завершится неуспешно, если для создания объекта в системе недостаточно памяти.

Функцию pthread_attr_destroy() можно использовать для разрушения объекта типа pthread_attr_t, заданного параметром attr. При обращении к этой функ ц ии будут удалены любые скрытые данные, связанные с этим атрибутным объектом потока. При успешном выполнении эта функция возвращает число 0, в противном случае - код ошибки.


6.2. Состояние. Александр Леоненков

Понятие состояния (state) является фундаментальным не только в метамоде-ли языка UML, но и в прикладном системном анализе. Ранее в главе 1 кратко были рассмотрены особенности представления динамических характеристик сложных систем, традиционно используемых для моделирования поведения. Вся концепция динамической системы основывается на понятии состояния системы. Однако семантика состояния в языке UML имеет целый ряд специфических особенностей.

В языке UML под состоянием понимается абстрактный метакласс, используемый для моделирования отдельной ситуации, в течение которой имеет место выполнение некоторого условия. Состояние может быть задано в виде набора конкретных значений атрибутов класса или объекта, при этом изменение их отдельных значений будет отражать изменение состояния моделируемого класса или объекта.

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

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

Рис. 6.2. Графическое изображение состояний на диаграмме состояний

Состояние на диаграмме изображается прямоугольником со скругленными вершинами (рис. 6.2). Этот прямоугольник, в свою очередь, может быть разделен на две секции горизонтальной линией. Если указана лишь одна секция, то в ней записывается только имя состояния (рис. 6.2, а). В противном случае в первой из них записывается имя состояния, а во второй – список некоторых внутренних действий или переходов в данном состоянии (рис. 6.2, б). При этом под действием в языке UML понимают некоторую атомарную операцию, выполнение которой приводит к изменению состояния или возврату некоторого значения (например, «истина» или «ложь»).


воскресенье, 9 января 2011 г.

Макс Каневский | Информационный SMS-канал

ТЕРМИН, ИСПОЛЬЗУЕМЫЙ В ДАННОМ РАЗДЕЛЕ:

Информационный SMS-канал – служба распространения текстовых сообщений среди абонентов сетей сотовой связи в формате SMS.


Первый SMS-канал в преддверии выборов в Государственную думу в декабре 2003 года организовала сотовая сеть «Билайн» в Калининграде. Подписка предусматривала возможность получения новостей от предвыборного штаба кандидатов. Наиболее активным избирателям предлагали отправлять наказы и жалобы кандидату с помощью SMS. С тех пор подвиг «Билайн» никто из операторов не повторял.

СОЗДАНИЕ SMS-КАНАЛА

В рамках работы канала существует не менее двух вариантов доставки информации избирателю:

1. С помощью традиционной SMS-рассылки.

2. С помощью размещения канала в меню SIM-карты услуг оператора сотовой связи. Мы уже описывали этот формат ранее в разделе, посвященном организации SMS-платежей.

В любом случае SMS-канал не только мгновенно доставляет избирателям информацию о кандидате, но и подсознательно делает ее легитимной. В основном подписчики рассуждают следующим образом: то, что прислали мне, а тем более то, что доступно с помощью оператора сотовой связи, скорее всего правда. Кстати, канал может быть сделан не только для одного кандидата, но и для партии либо как сторонний независимый проект.

Структура канала может варьироваться аналогично содержанию интернет-сайта – от одного раздела до нескольких. Можно присвоить собственный код каждому разделу в рамках канала – себестоимость канала от количества разделов практически не меняется. Например, партия «За любовь!», кандидаты которой одновременно участвуют в избирательной кампании по нескольким округам, может открыть вариант персональной подписки на новости каждого кандидата. В таком случае абонент, отправивший SMS со словом ZAL, получит еще одно сообщение, в котором ему будет предложено выбрать новости интересующего его кандидата.


ПРИМЕР СТРУКТУРЫ SMS-КАНАЛА


Пример SMS на экране телефона.

Избиратель может оформить подписку на новости по следующим разделам:

– Новости партии (код подписки part).

– Новости лидера (код подписки lider).

– Новости из Энска – в разделе размещаются новости о кандидате Иванове И.И., баллотирующемся от партии в данном городе (код подписки ensk).

– Новости из Эмска – в разделе размещаются новости о кандидате Петрове И.И., баллотирующемся от партии в данном городе (код подписки emsk), и т. п.

– Все новости (код подписки vse).

Чтобы о канале узнали избиратели, кандидаты размещают сервисный номер для подписки на своих предвыборных информационно-агитационных материалах. Например, на агитационных материалах партии «За любовь!» можно разместить: «Отправь SMS ZAL или ЗАЛ на номер ****, чтобы получать новости партии». Если у кандидата устойчивое финансовое положение, можно организовать подписку таким образом, что все входящие SMS-сообщения для избирателя будут бесплатными. Такой аттракцион неслыханной щедрости обойдется кандидату в среднем не более чем в 300 у. е. за десять тысяч сообщений.

Предполагаемые результаты.

Практические:

– распространение информации о кандидате формирует у избирателя соответствующий образ народного избранника;

– распространение результатов exit-polls в день голосования.

Аналитические:

– оценка готовности избирателей к получению в дальнейшем политических новостей в рамках избирательной кампании.

Примечание

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


Анализ CIL-кода, А. Г. Сивак

Напомним, что компоновочный блок не содержит специфических для платформы инструкций, а содержит независимый от платформы CIL-код. Когда среда выполнения .NET загружает компоновочный блок в память, этот CIL-код компилируется (с помощью JIT-компилятора) в инструкции, понятные для данной платформы. Если выполнить двойной щелчок на строке метода TurboBoost() класса SportsCar, с помощью ildasm.exe откроется новое окно, в котором будут показаны CIL-инструкции.

.method public hidebysig virtual instance void TurboBoost() cil managed {

 // Code size 17 (0x11)

 .maxstack 2

 IL_0000: ldstr "Ramming speed!"

 IL_0005: ldstr "Faster is better…"

 IL_000a: call valuetype [System.Windows.Forms] System.Windows.Forms.DialogResult [System.Windows.Forms] System.Windows.Forms.MessageBox::Show(string, string)

 IL_000f: pop

 IL_0010: ret

} // end of method SportsCar::TurboBoost

Обратите внимание на то, что для идентификации метода, определенного типом SportsCar, используется лексема .method. Члены-переменные, определенные типом, обозначаются лексемой .field. Напомним, что класс Car определяет набор защищенных данных, например, таких как currSpeed.

.field family int 16 currSpeed

Свойства обозначены лексемой.property. Этот CIL-код описывает открытое свойство CurrSpeed (заметьте, что характеристики read/write свойства обозначаются лексемами .get и .set).

.property instance int16 CurrSpeed() {

 .get instance int16 CarLibrary.Car::get_CurrSpeed()

 .set instance void CarLibrary.Car::set_CurrSpeed(int16)

} // end of property Car::CurrSpeed