понедельник, 29 ноября 2010 г.

Вадим Викторович Мацкевич / Роботы – игрушки

На рис. 81 вы видите модель кибернетического краба, созданную юными техниками в пионерском лагере им. Вити Коробкова (Крымская обл.). Краб двигается на свет электрического фонаря или на солнечный свет, перемещаясь с помощью двух электродвигателей с редукторами, которые вращают колесо (такие узлы есть в комплекте многих детских электромеханических конструкторов). Поверх ходовой части на металлической плите собраны два узла зрения из радиокубов. Нос краба – отсек с батареями 3336 (для питания двигателей) и «Крона» (для питания устройства зрения) – отделяет один глаз краба от другого. Поэтому боковой свет попадает только в один глаз, и его реле включает электродвигатель, разворачивающий краба в сторону источника света. Как только свет попадает и во второй глаз, включается второй электродвигатель и краб движется прямо на источник света. Чтобы в глаза краба попадало больше света, его металлическая платформа установлена под углом 45° к горизонту. Третье колесо, поддерживающее платформу, свободно поворачивается при её поворотах.



Рис. 81 Кибернетический краб

Эту конструкцию можно усовершенствовать. Например, установить на крабе лампу, на свет которой реагировала бы система зрения другого краба. Эту игру можно назвать «электронной охотой». Крабы, снабжённые лампами, будут охотиться друг за другом, пока один не настигнет другого.

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

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


Семафоры Posix, размещаемые в памяти / Д. Солнышков

Мы измеряем скорость работы семафоров Posix (именованных и размещаемых в памяти). В листинге А.24 приведен текст функции main, а в листинге А.23 — текст функции incr.

Листинг А.23. Увеличение счетчика с использованием семафоров Posix в памяти

//bench/incr_pxsem1.с

37 void *

38 incr(void *arg)

39 {

40  int i;

41  for (i = 0; i < nloop; i++) {

42   Sem_wait(&shared.mutex);

43   shared.counter++;

44   Sem_post(&shared.mutex);

45  }

46  return(NULL);

47 }

Листинг А.24. Функция main для семафоров Posix, размещаемых в памяти

//bench/incr_pxsem1.с

1  #include "unpipc.h"

2  #define MAXNTHREADS 100

3  int nloop;

4  struct {

5   sem_t mutex; /* размещаемый в памяти семафор */

6   long counter;

7  } shared;

8  void *incr(void *);


9  int

10 main(int argc, char **argv)

11 {

12  int i, nthreads;

13  pthread_t tid[MAXNTHREADS];

14  if (argc != 3)

15   err_quit("usage: incr_pxseml <#loops> <#threads>");

16  nloop = atoi(argv[1]);

17  nthreads = min(atoi(argv[2]), MAXNTHREADS);

18  /* инициализация размещаемого в памяти семафора 0 */

19  Sem_init(&shared.mutex, 0, 0);

20  /* создание всех потоков */

21  Set_concurrency(nthreads);

22  for (i = 0; i < nthreads; i++) {

23   Pthread_create(&tid[i], NULL, incr, NULL);

24  }

25  /* запуск таймера и разблокирование семафора */

26  Start_time();

27  Sem_post(&shared.mutex);

28  /* ожидание завершения всех потоков */

29  for (i = 0; i < nthreads; i++) {

30   Pthread_join(tid[i], NULL);

31  }

32  printf("microseconds: %.0f usec\n", Stop_time());

33  if (shared.counter != nloop * nthreads)

34   printf("error: counter = %ld\n", shared.counter);

35  exit(0);

36 }

18-19 Создается семафор, инициализируемый значением 0. Второй аргумент в вызове sem_init, имеющий значение 0, говорит о том, что семафор используется только потоками вызвавшего процесса.

20-27 После создания всех потоков запускается таймер и вызывается функция sem_post.


Елена Юрьевна Логинова | 40. Процесс установления цены на новый товар. Регулирование ценообразования

Процесс установления цены относительно сложен и состоит из следующих этапов.

1. Определение целей фирмы и задач ценовой политики.

2. Выявление всех факторов, которые могут влиять на процесс ценообразования.

3. Анализ уровня продаж за определенный период.

4. Определение уровня спроса на перспективу.

5. Оценка всех затрат фирмы.

6. Исследование и анализ цен товаров-конкурентов.

7. Определение метода ценообразования.

8. Выработка ценовой стратегии.

9. Установление конечной цены.

10. Выявление реакции конечных потребителей и фирм-посредников на установленную цену.

Также специалисты по маркетингу должны учитывать психологический фактор:

1) многие потребители воспринимают цену как индикатор качества товара;

2) установление цены с учетом престижности (характерно для дорогих товаров);

3) стратегия неокругленных сумм (например, 100 руб. воспринимается значительно больше 99 руб.).

Регулирование ценообразования.

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

Государство оказывает влияние путем фиксирования цены, ее регулирования с помощью установления «правил игры» при свободных рыночных ценах.

Способы государственного воздействия.

1. Ввод государственных прейскурантных цен.

2. «Заморозка» цен на определенное время.

3. Фиксация цен компаний-монополистов.

4. Установление предельных надбавок к фиксированным ценам.

5. Установление предельного уровня цен на конкретные товары.

6. Установление конкретного уровня разового повышения цен на определенные товары.

В системе свободных рыночных цен государство может:

1) вводить запрет на горизонтальное и вертикальное фиксирование цен;

2) запретить ценовую дискриминацию;

3) запретить демпинговые цены.

Цены также определяются типом рынка: чистая конкуренция, монополистическая конкуренция, олигополия и монополия.

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

При определении конечной цены необходимо учитывать и влияние цен конкурентов, а также их количество.


четверг, 25 ноября 2010 г.

В. В. Мельниченко - Создание альбомов

А если есть желание передать фотографии тем друзьям и родственникам, у которых уже есть ПК? Самый простой ответ, переслать по электронной почте или записать на CD-диск. Удобно, быстро, но скучно и тривиально. Гораздо правильнее из отсылаемых снимков создать свою персональную интерактивную презентацию. Так, можно проиллюстрировать любую туристическую поездку только изображениями, а можно добавить к каждому из них текстовый или звуковой комментарий.

И в этом случае вам придется воспользоваться программой INAlbum (www.inalbum.com) или же вернутся к старой знакомой ACDSee. Используя любую из указанных программ, буквально за несколько щелчков мышью можно создать шоу, которое будет выглядеть вполне профессионально. А если потратить некоторое время на дополнительную обработку и оформление каждого снимка в удобном несложном редакторе, то результат, уж наверняка, превзойдет все ваши ожидания. Такие альбомы не будут пылиться на полке, и извлекаться только для принудительной их демонстрации скучающим родственникам или гостям.

Все же не будем особо останавливаться на дополнительном узкоспециализированном ПО, а поговорим о том, как при помощи ACDSee создать пристойную презентацию. Для этого запустите программу любым удобным вам способом и выполните из меню Создать (Create) команду Создать Слайд-шоу (Create Slide Show).

Рис. 6.16. Первые шаги в создании вашего презентационного альбома

Первое что спросит программа это о том, какой тип файла "на выходе" вы хотите получить. Среди предложенных вариантов имеется Стандартное слайд-шоу (*.exe), для операционной системы есть возможность создать Скринсейвер (*.scr) и конечно же для электронных сетей имеется Презентация Macromedia Flash (*.swf). Конечно же, вам решать какой тип требуется.

Следующим шагом будет выбор фотографий, которые будут включены в презентационный пакет. Для этого следует щелчком на кнопке Добавить (Add) (правый рисунок выше) открыть окно открытия и добавления файлов. В окне укажите все необходимые вам картинки и добавьте их в область Выбранные картинки. Далее следует лишь щелкнуть на кнопке Ok. Теперь перед вами главное окно мастера и необходимо еще раз проверить, все ли файлы вы выбрали. Если не все, то повторите процедуру добавления для нужных файлов. И как только все картинки будут собраны воедино, щелкайте на кнопке Далее. После этого в отдельном окне вам придется указать, каковы должны быть переходы между фотографиями и небольшие текстовые комментарии. Но от большой лени этого можно и не делать.

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

Последним вопросом мастера будет выбор разрешения для слайдов и выбор расположения создаваемого файла. Тут уж вам решать: что, где и когда? Если вы будете записывать полученный альбом на диск то можно особенно не задумываться о его объеме, ну а если собираетесь отправлять по электронной почте, то все же лучше больших файлов не создавать. И все же работа с графикой изначально подразумевает работу с большими файлами, поэтому лучше оставить разрешение фотографий максимальным и записать полученный альбом на диск.


10.1.2.2 Closе, A. В. Крюков

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


алгоритм close /* для устройств */

входная информация: дескриптор файла

выходная информация: отсутствует

{

 выполнить алгоритм стандартного закрытия (глава 5ххх);

 if (значение счетчика ссылок в таблице файлов не 0) goto finish;

 if (существует еще один открытый файл, старший и младший номера которого совпадают с номерами закрываемого устройства)

  goto finish; /* не последнее закрытие */

 if (устройство символьного типа) {

  использовать старший номер в качестве указателя в таблице ключей устройства посимвольного ввода-вывода;

  вызвать процедуру закрытия, определяемую типом драйвера и передать ей в качестве параметра младший номер устройства;

 }

 if (устройство блочного типа) {

  if (устройство монтировано) goto finish;

  переписать блоки устройства из буферного кеша на устройство;

  использовать старший номер в качестве указателя в таблице ключей устройства ввода-вывода блоками;

  вызвать процедуру закрытия, определяемую типом драйвера и передать ей в качестве параметра младший номер устройства;

  сделать недействительными блоки устройства, оставшиеся в буферном кеше;

 }

finish:

 освободить индекс;

}

Рисунок 10.4. Алгоритм закрытия устройства

Алгоритм закрытия устройства похож на алгоритм закрытия файла обычного типа (Рисунок 10.4). Однако, до того, как ядро освобождает индекс, в нем выполняются действия, специфичные для файлов устройств.

1. Просматривается таблица файлов для того, чтобы убедиться в том, что ни одному из процессов не требуется, чтобы устройство было открыто. Чтобы установить, что вызов функции close для устройства является последним, недостаточно положиться на значение счетчика ссылок в таблице файлов, поскольку несколько процессов могут обращаться к одному и тому же устройству, используя различные точки входа в таблице файлов. Так же недос таточно положиться на значение счетчика в таблице индексов, поскольку одному и тому же устройству могут соответствовать несколько файлов устройства. Например, команда ls -l покажет, что одному и тому же устройству символьного типа ("c" в начале строки) соответствуют два файла устройства, старший и младший номера у которых (9 и 1) совпадают. Значение счетчика связей для каждого файла, равное 1, говорит о том, что имеется два индекса.

crw-w-w- 1 root vis 9, 1 Aug 6 1984 /dev/tty01

crw-w-w- 1 root unix 9, 1 May 3 15:02 /dev/tty01

Если процессы открывают оба файла независимо один от другого, они обратятся к разным индексам одного и того же устройства.

2. Если устройство символьного типа, ядро запускает процедуру закрытия устройства и возвращает управление в режим задачи. Если устройство блочного типа, ядро просматривает таблицу результатов монтирования и проверяет, не располагается ли на устройстве смонтированная файловая система. Если такая система есть, ядро не сможет запустить процедуру закрытия устройства, поскольку не был сделан последний вызов функции close для устройства. Даже если на устройстве нет смонтированной файловой системы, в буферном кеше еще могут находиться блоки с данными, оставшиеся от смонтированной ранее файловой системы и не переписанные на устройство, поскольку имели пометку "отложенная запись". Поэтому ядро просматривает буферный кеш в поисках таких блоков и переписывает их на устройство перед запуском процедуры закрытия устройства. После закрытия устройства ядро вновь просматривает буферный кеш и делает недействительными все буферы, которые содержат блоки для только что закрытого устройства, в то же вре мя позволяя буферам с актуальной информацией остаться в кеше.

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


суббота, 6 ноября 2010 г.

Использование директивы #define для тестирования | Джесс Либерти

Второй способ использования директивы #define состоит в простом объявлении того, что данная лексема определена в программе. Например, можно записать следующее:

#define BIG

В программе можно проверить, была ли определена лексема BIG, и предпринять соответствующие меры. Для подобной проверки используются такие команды препроцессора, как #ifdef (если определена) и #ifndef (если не определена). За обеими

командами должна следовать команда #endif, которую необходимо установить до завершения блока (до следующей закрывающей фигурной скобки).

Директива #ifdef принимает значение, равное истине, если тестируемая лексема уже была определена. Поэтому можем записать следующее:

#ifdef DEBUG

cout << "Строка DEBUG определена"; #endif

Когда препроцессор читает директиву #ifdef, он проверяет построенную им самим таблицу, чтобы узнать, была ли уже определена в программе лексема DEBUG. Если да, то #ifdef возвращает значение true, и все, что находится до следующей директивы #else или #endif, записывается в промежуточный файл для компиляции. Если эта директива возвращает значение false, то ни одна строка кода, находящаяся между директивами #ifdef DEBUG и #endif, не будет записана в промежуточный файл, т.е. вы получите такой вариант промежуточного файла, как будто этих строк никогда и не было в исходном коде.

Обратите внимание, что директива #ifndef является логической противоположностью директивы #ifdef. Директива #ifndef возвращает true в том случае, если до этой точки в программе заданная лексема не была определена.


45 | В. М. Феоклистова

В начале сражения при Камбре британский Танковый корпус бригадного генерала Хью Эллиса (три бригады по три батальона в каждой) помог пехотным дивизиям III и IV корпусов 3-й армии генерал-лейтенанта сэра Джулиана Бинга прорвать оборону немцев на участке «группы Кодри» (XIII корпуса 2-й германской армии генерала кавалерии Георга фон дер Марвица). Накануне наступательной операции англичан в их Танковом корпусе числилось 476 танков, в том числе 378 «боевых» и 98 «административных» (последние предназначались для перевозки артиллерийских орудий, понтонных материалов и телефонного кабеля, а также для ведения беспроволочной связи и уборки колючей проволоки). Благодаря умелому взаимодействию пехоты, танков и артиллерии британские войска в первый день своего наступления, 20 ноября 1917 г., овладели тремя укрепленными позициями противника и, продвинувшись за день на 8 км (на фронте в 9,5 км), захватили 4200 пленных. Сами они потеряли убитыми, ранеными и пропавшими без вести немногим более 4000 человек, но при этом Танковый корпус недосчитался 179 боевых машин из 374, принявших участие в атаке (65 танков были уничтожены огнем немецкой артиллерии, 71 вышел из строя по техническим причинам и 43 застряли в канавах или воронках). В дальнейшем боевые действия снова приняли позиционный характер, а 30 ноября — 3 декабря немцы, подтянув резервы, нанесли контрудар, в результате которого британцам к 7 декабря 1917 г. пришлось оставить большую часть захваченной ими территории. Британские потери за всю операцию под Камбре составили 44 207 человек (в том числе около 9000 пленными), германские — примерно 45 000 (из них более 11 000 пленными).

(обратно)

Функция mq_close, Д. Солнышков

В листинге 5.20 приведен текст нашей функции mq_close.

Листинг 5.20. Функция mq_close

//my_pxmsg_mmap/mq_close.с

1  #include "unpipc.h"

2  #include "mqueue.h"


3  int

4  mymq_close(mymqd_t mqd)

5  {

6   long msgsize, filesize:

7   struct mymq_hdr *mqhdr;

8   struct mymq_attr *attr;

9   struct mymq_info *mqinfo;

10  mqinfo = mqd;

11  if (mqinfo->mqi_magic != MQI_MAGIC) {

12   errno = EBADF;

13   return(-1);

14  }

15  mqhdr = mqinfo->mqi_hdr;

16  attr = &mqhdr->mqh_attr;

17  if (mymq_notify(mqd, NULL) != 0) /* снятие вызвавшего процесса с регистрации */

18   return(-1);

19  msgsize = MSGSIZE(attr->mq_msgsize);

20  filesize = sizeof(struct mymq_hdr) + (attr->mq_maxmsg *

21   (sizeof(struct mymsg_hdr) + msgsize));

22  if (munmap(mqinfo->mqi_hdr, filesize) == –1)

23   return(-1);

24  mqinfo->mqi_magic = 0; /* на всякий случай */

25  free(mqinfo);

26  return(0);

27 }

Получение указателей на структуры

10-16 Проверяется правильность переданных аргументов, после чего получаются указатели на область, занятую отображенным в память файлом (mqhdr), и атрибуты (в структуре mq_hdr).

Сброс регистрации вызвавшего процесса

17-18 Для сброса регистрации на уведомление вызвавшего процесса мы вызываем mq_notify. Если процесс был зарегистрирован, он будет снят с уведомления, но если нет — ошибка не возвращается.

Отключение отображения файла и освобождение памяти

19-25 Мы вычисляем размер файла для вызова munmap и освобождаем память, используемую структурой mqinfo. На случай, если вызвавший процесс будет продолжать использовать дескриптор очереди сообщений, до того как область памяти будет вновь задействована вызовом malloc, мы устанавливаем значение mq_magiс в ноль, чтобы наши функции для работы с очередью сообщений обнаруживали ошибку.

Обратите внимание, что если процесс завершает работу без вызова mq_close, эти же операции выполняются автоматически: отключается отображение в память, а память освобождается.


вторник, 2 ноября 2010 г.

Числовые признаки | Е. М. Миркес

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

Содержательное значение признака. Если входными данными сети является угол между двумя направлениями, например, направление ветра, то ни в коем случае не следует подавать на вход сети значение угла (не важно в градусах или радианах). Такая подача приведет к необходимости «уяснения» сетью того факта, что 0 градусов и 360 градусов одно и тоже. Разумнее выглядит подача в качестве входных данных синуса и косинуса этого угла. Число входных сигналов сети увеличивается, но зато близкие значения признака кодируются близкими входными сигналами.

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

Расположение значений признака в интервале значений. Следует рассмотреть вопрос о равнозначности изменения значения признака на некоторую величину в разных частях интервала значений признака. Как правило, это связано с косвенными измерениями (вместо одной величины измеряется другая). Например, сила притяжения двух небесных тел при условии постоянства массы однозначно характеризуется расстоянием между ними. Пусть рассматриваются расстояния от 1 до 100 метров. Легко понять, что при изменении расстояния с 1 до 2 метров, сила притяжения изменится в четыре раза, а при изменении с 99 до 100 метров — в 1.02 раза. Следовательно, вместо подачи расстояния следует подавать обратный квадрат расстояния c'=1/c?.


воскресенье, 31 октября 2010 г.

У. Клоксин. ГЛАВА 7. ЕЩЕ НЕСКОЛЬКО ПРИМЕРОВ ПРОГРАММ

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

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


Денис Колисниченко - Совет № 15 При переключении передачи «вниз» обороты двигателя повышаются. Поэтому при переключении «вниз» нужно сначала сбавить скорость (путем торможения), а затем уж переключаться, чтобы не превысить допустимые обороты

Предположим, что вы едите на четвертой передаче, скорость около 160 км/ч, обороты двигателя приближаются к максимальным – пусть это 6500 тысяч. Вы хотите включить пятую передачу, но нечаянно включили третью. В результате обороты двигателя превысят максимально допустимые и вы попадете на капремонт двигателя. Теперь вы понимаете, почему АКПП считают более безопасной? АКПП не позволит переключиться в неправильном режиме. Даже если вы будете использовать ручной режим и принудительно перейдете на пониженную передачу, обороты двигателя все равно не превысят максимальные.

Вы можете возразить, мол, я с такой скоростью не езжу. А тут много и не нужно. Предположим, что вы едите со скоростью 70 км/ч на второй передаче. Если вы сейчас переключитесь на первую, эффект будет таким же, как описан выше.

Вот поэтому перед переключением на пониженную передачу нужно снизить скорость до допустимой для той передачи, на которую вы хотите переключиться. Как узнать, какая скорость допустима для той или иной передачи? Если у вас нет руководства по автомобилю, тогда допустимую скорость можно определить экспериментальным путем. Включите первую передачу, троньтесь с места, раскрутите двигатель до максимальных оборотов, посмотрите на спидометр. Предположим, что на первой передаче вы разогнали автомобиль до 55 км/ч. Переключитесь на вторую, опять раскрутите двигатель до максимальных оборотов, пусть скорость при этом будем 90 км/ч. Аналогично поступите с третьей передачей – больше не нужно. Итак, если вы едите на скорости 120 км/ч и включена третья передача, то вам нужно снизить скорость до 90 км/ч (а еще лучше – до 70–80, потому что при 90 км/ч обороты станут максимальными, что не желательно), а только потом переключиться на пониженную передачу. Аналогично, как только скорость станет меньше 55 км/ч, можно переключиться на первую передачу.

Итак, алгоритм переключения вниз выглядит так:

• снижаем скорость до допустимой для той передачи, на которую будем переключаться;

• переключаем передачу;

• на педаль газа нажимать не нужно – ведь мы же хотим замедлиться.

Иногда переключение вниз нужно для более резвого обгона. Например, вы вышли на обгон на пятой передаче (пусть 120 км/ч и 3000 оборотов), но уже видите, что не успеваете его завершить – не хватает скорости, тогда можно переключиться на третью передачу и резко нажать педаль газа – автомобиль быстрее станет набирать скорость. Следите за оборотами – как только они приблизятся к максимальным, переключайтесь на четвертую.


четверг, 28 октября 2010 г.

H. M. Ручко. Сотрудничество объектов

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

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

create  Объект может быть создан

destroy  Объект может быть разрушен

call  Операция, определенная в одном объекте, может быть вызвана другим объектом или им самим

return  Объекту возвращается значение

send  Объекту может быть послан сигнал

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

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

association Объект видим по причине существования ассоциации (самый общий случай)

parameter Объект видим, поскольку он является параметром для вызывающего объекта

local Объект видим, поскольку он имеет локальную область видимости для вызывающего объекта

global Объект видим, поскольку он имеет глобальную область видимости для вызывающего объекта

self Объект вызывает собственный метод

Помимо перечисленных, возможно применение и других стереотипов.

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

Рис. 10.7. Диаграмма сотрудничества, использующая порядковые номера для обозначения последовательности выполнения операций


Как показано на рис. 10.7, объект MainObject выполняет две операции в слелующей последовательности:

1: << create >>

2: Value := performAction(ObjectF)

При выполнении операции 1 объект MainObject создает объект Obj ectA. Объект ObjectA локален по отношению к объекту MainObject (поскольку имеет место включение объектов). Это инициирует первую последовательность операций во вложенном потоке управлени я. Дл я обозначения всех операций этой последовательности используется число 1, за которым следует число, отражающее порядок их выполнения. Итак, первая операция последовательности 1 такова: 1.1: initialize()

Объект ObjectA вызывает собственный метод. Выполнение объектом собственно г о метода выражается соединительной линией, связываю щ ей объект с самим собой, и индикатором стереотипа {self} ({caм } ).Onepaция ObjectA::initialize() также запускает другую последовательность действий:

1.1.1 : initializeB()

1.1.2: initializeC()

В этой последовательности два других объекта (которые локальны по отношению кобъекту ObjectA) инициализируются посредством вызова соответствую щ их методов инициализации. Операция 2: performAction(ObjectD)

является началом еще одной вложенной последовательности действий. Объекту ObjectA передается объект ObjectD. Объект ObjectA вызывает операцию, определенную в объекте ObjectD:

2.1: doAction()

Объект ObjectA имеет право вызвать эту операцию, поскольку объект ObjectD является параметро м (переданны м объекто м MainObject), как от м ечено стереотипо м {parameter}. В результате выполнения этой последовательности действий объекту ObjectA возвра щ ается значение и объекту MainObject также возвра щ ается значение. По м и м о ко м бинаций порядковых номеров, обозначение этих вложенных потоков управления можно усилить с помощью линии с зачерненной стрелкой, указывающей в направлении выполнения последовательности действий.


H. M. Ручко / Создание потоков

Библиотека Pthreads используется для создания, поддержки и управления потоками многопоточных программ и приложений. При создании многопоточной программы потоки могут создаваться на любом этапе выполнения процесса, поскольку это — динамические образования. Функция pthread_create() создает новый поток в адресном пространстве процесса. Параметр thread указывает на дескриптор, или идентификатор (id), создаваемого потока. Новый поток будет иметь атрибуты, заданные объектом attr. Созданный поток немедленно приступит к выполнению инструкций, заданных параметром start_routine с использованием аргументов, заданных параметром arg. При успешном создании потока функция возвращает его идентификатор (id), значение которого сохраняется в параметре thread.

Синопсис

#include <pthread.h>

int pthread_create(pthread_t *restrict thread,

const pthread_attr_t *restrict attr,

void *(*start_routine)(void*),

void *restrict arg) ;

Если параметр attr содержит значение NULL, новый поток будет использовать атрибуты, действующие по умолчанию. В противном случае новый поток использует атрибуты, заданные параметром attr при его создании. Если же значение параметра attr изменится после того, как поток был создан, это никак не отразится на его атрибутах. При завершении параметра-функции start_routine завершается и поток, причем так, как будто была вызвана функция pthread_exit() с использованием в качестве статуса завершения значения, возвращаемого функцией start_routine.

При успешном завершении функция возвращает число 0 . В противном случае по-не создается, и функция возвращает код ошибки. Если в системе отсутствуют ресурсы для создания потока, или в процессе достигнут предел по количеству возможных потоков, выполнение функции считается неудачным. Неудачным оно также будет в случае, если атрибут потока задан некорректно или если инициатор вызова потока не имеет разрешения на установку необходимых атрибутов потока.

Приведем примеры создания двух потоков с заданными по умолчанию атрибутами:

pthread_create(&threadA,NULL, taskl,NULL) ;

pthread_create(&threadB,NULL, task2, NULL) ;

Это — два вызова функции pthread_create () из листинга 4 .1. Оба потока создаются с атрибутами, действующими по умолчанию.

В программе 4 .1 отображен основной поток, который передает аргумент из командной строки в функции, выполняемые потоками.

// Программа 4.1

#include <iostream>

#include <pthread.h>

#include <stdlib.h>

int main(int argc, char *argv[]) {

pthread_t ThreadA,ThreadB;

int N;

if(argc != 2) {

cout << «error» << endl;

exit (1);

}

N = atoi(argv[l]);

pthread_create(&ThreadA,NULL, taskl,&N);

pthread_create(&ThreadB,NULL, task2, &N);

cout « «Ожидание присоединения потоков.» « endl;

pthread_join(ThreadA,NULL) ;

pthread_join(ThreadB,NULL);

return (0) ;

};

В программе 4 .1 показано, как основной поток может передать аргументы из командной строки в каждую из потоковых функций. Число в командной строке имеет строковый тип. Поэтому в основном потоке аргумент сначала преобразуется в целочисленное значение, и только после этого результат преобразования передается при каждом вызове функции pthread_create () посредством ее последнего аргумента.

В программе 4.2 представлена каждая из потоковых функций.

// Программа 4.2

void *task1(void *X)

{

int *Temp;

Temp = static_cast<int *>(X);


for(int Count = 1;Count < *Temp;Count++){

cout << «work from thread A: " << Count << " * 2 = "

<< Count * 2 << endl;

}

cout << «Thread A complete» << endl;

}


void *task2(void *X)

{

int *Temp;

Temp = static_cast<int *>(X);


for(int Count = 1;Count < *Temp;Count++){

cout << «work from thread B: " << Count << " + 2 = "

<< Count + 2 << endl;

}

cout << «Thread B complete» << endl;


}

В программе 4.2 функции taskl и task2 выполняют цикл, количество итераций которого равно числу, переданному каждой функции в качестве параметра. Одна функция увеличивает переменную цикла на два, вторая — умножает ее на два, а затем каждая из них отправляет результат в стандартный поток вывода данных. По выходу из цикла каждая функция выводит сообщение о завершении выполнения потока. Инструкции по компиляции и выполнению программ 4.1 и 4.2 содержатся в профиле программы 4.1.

[ Профиль программы 4.1

Имя программы •program4-12.cc

* Описание Принимает целочисленное значение из командной строки и передает функциям: потоков. Каждая функция выполняет цикл, в котором переменная цикла увеличивается (в одной функции на два, а в другой в два раза), а затем результат отсылается в стандартный поток вывода данных. Код основного потока выполнения приведен в программе 4.1, а код функций — в программе 4.2.

Требуемая библиотека libpthread

Требуемые заголовки <pthread.h> <iostream> <stdlib.h>

Инструкции по компиляции и компоновке программ

с++ -о program4-12 program4-12.cc -lpthread

Среда для тестирования SuSE Linux 7.1, gcc 2.95.2,

Инструкции по выполнению ./program4-12 34

Примечания Эта программа требует задания аргумента командной строки.

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


Елена Юрьевна Логинова. 46. Реклама и жизненный цикл товара

Жизненный цикл товара – это период времени обращения товара на рынке от замысла продукта до снятия его с производства и выведения из продажи.

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

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

Первым этапом жизненного цикла является внедрение.

Ко второму этапу относится рост. Третья стадия – зрелость.

Четвертый этап жизненного цикла – насыщение.

На пятом этапе происходит спад.

На этапе выхода товара на рынок нужно учитывать полную неосведомленность покупателей о новинке, при этом основные цели рекламы:

1) формирование интереса к существованию товара и марки;

2) информирование рынка о преимуществах нового товара;

3) побуждение потребителя к приобретению нового товара;

4) побуждение закупщиков к обороту товару. Таким образом, происходит первичное знакомство

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

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

1) созданию сильного, конкурентоспособного образа марки товара;

2) формированию предпочтения к марке;

3) стимулированию покупки товара.

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

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

Основным видом рекламы остается агитирующая реклама.

На этапе спада продажи стремительно падают и реклама нецелесообразна. Товар уходит с рынка. Однако если на складах сохранились большие партии товаров, то предприниматели продолжают рекламировать свою продукцию до полной ее ликвидации.


понедельник, 25 октября 2010 г.

В. В. Мельниченко - Меню Команды

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

Дерево каталогов, например, выводит полную древообразную структуру, которая представляет вам диск активного окна. Для быстрого перехода к любой из «ветвей» достаточно выполнить двойной щелчок на папке, с которой начинается ветка. При этом она и отобразится в активном окне. Эту же структуру можно распечатать.

Поиск файлов (рис. 16.9) предоставляет прекрасную возможность найти затерявшийся в дебрях вашего диска файл по многим параметрам (маска, дата создания, атрибуты, текст).

Рис. 16.9. Диалоговое окно поиска Total Commander

Этим меню вы можете воспользоваться и для того, чтобы сменить Метку диска…

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

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

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

Из этого меню также можно Запустить сеанс DOS.Сложно сказать, зачем он нужен, но ведь и по сей день существуют программы, которые работают только в этой оболочке.

Иногда необходимо отобразить в обоих окнах одинаковую информацию путем выполнения Команды>Получатель=Источнику. Для визуального удобства можно Поменять панели местами.


аЛЕКСей БЛАЖенный | Ломание воли субъекта

Не путайте волю с упрямством: первое можно поломать сравнительно легко, а второе практически невозможно!

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

Лишённый одежды человек чувствует, как правило, свою полную беспомощность и уязвимость. Если совместить раздевание жертвы с оскорблением или избиением, то её сопротивление, возможно, будет полностью сломлено. Без одежды человек теряет свои психологические щиты. Можно заставить жертву раздеться саму или грубо сорвать с неё одежду. Психофизиологический эффект данной процедуры усиливается, если она проводится на холоде.

Оскорбления словом действуют на впечатлительных людей. Необходимо издеваться и оскорблять самого субъекта а также близких ему людей или «святые» (в его понимании) вещи.

Длительные пытки по любой из вышеописанных методик рано или поздно сломают волю жертвы.

Унижение путём макания жертвы головой в ведро с дерьмом, испускания на него мочи и других фекалий.

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

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

Угрозы и насильственные действия в отношении родственников жертвы.

Субъекта садят на табурет и фиксируют в такой позе на 2–3 дня, не давая заснуть. В результате всего этого он уже не может отличить реальность от сна и отвечает на самые коварные вопросы.

Сенсорная депривация. Субъект помещается в звукоизолированную комнату без окон. Комната должна быть обита внутри мягким материалом, как в психиатрических палатах. Круглые сутки горит, не потухая, умеренный белый свет от дневной лампы. Примерно через 3 дня из замаскированных динамиков начинает литься еле слышная музыка. Субъект сначала думает, что эта музыка ему кажется, настолько она тихая. Репертуар должен состоять из минорных композиций без слов, например, похоронный марш или произведения Баха. Музыка звучит без перерывов (лента закольцована) в течение нескольких дней. Именно в этот момент жертва чувствует, что начинает сходить с ума. Потом музыка начинает чередоваться с тихими голосами, которые обвиняют и оскорбляют жертву или просто говорят повторяющиеся бессмысленные и бессодержательные фразы. Ещё через несколько дней даже самый крепкий человек теряет контроль с реальностью и у него начинаются галлюцинации.

«Сажание на иглу». Подобная задача реализуется использованием исключительно тяжёлых физиологических реакций организма на резкое лишение привычного наркотического препарата. Такое состояние называется абстиненцией и немедленно устраняется повторым введением наркотика. На продолжительность и силу абстиненции влияет тип употребляемого наркотика, длительность приёма, дозы и особенности организма.

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

Привычка к героину и триметилфентанилу наступает после реализации 3–4 инъекций, к морфия — после 10–12 при постепенном увеличении дозы. Ломка, как правило накатывает через 2–3 часа после употребления героина, через 5–6 часов после морфия и через 10–12 часов после опия.

Для наркомана характерен переход от лёгких наркотиков к более тяжёлым.


суббота, 23 октября 2010 г.

1.5.3 Подсчет строк / Вик С. Штаркман

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

#include ‹stdio.h›

/* подсчет строк входного потока */

main()

{

 int c, nl;

 nl = 0;

 while ((с = getchar()) != EOF)

  if (c == '\n')

   ++nl;

 printf("%d\n", nl);

}

Тело цикла теперь образует инструкция if, под контролем которой находится увеличение счетчика nl на единицу. Инструкция if проверяет условие в скобках и, если оно истинно, выполняет следующую за ним инструкцию (или группу инструкций, заключенную в фигурные скобки). Мы опять делаем отступы в тексте программы, чтобы показать, что чем управляется.

Двойной знак равенства в языке Си обозначает оператор "равно" (он аналогичен оператору = в Паскале и .EQ. в Фортране). Удваивание знака = в операторе проверки на равенство сделано для того, чтобы отличить его от единичного =, используемого в Си для обозначения присваивания. Предупреждаем: начинающие программировать на Си иногда пишут =, а имеют в виду ==. Как мы увидим в главе 2, в этом случае результатом будет обычно вполне допустимое по форме выражение, на которое компилятор не выдаст никаких предупреждающих сообщений (Современные компиляторы, как правило, выдают предупреждение о возможной ошибке. - Примеч. ред.).

Символ, заключенный в одиночные кавычки, представляет собой целое значение, равное коду этого символа (в кодировке, принятой на данной машине). Это так называемая символьная константа. Существует и другой способ для написания маленьких целых значений. Например, 'A' есть символьная константа, в наборе символов ASCII ее значение равняется 65 - внутреннему представлению символа A. Конечно, 'A' в роли константы предпочтительнее, чем 65, поскольку смысл первой записи более очевиден, и она не зависит от конкретного способа кодировки символов.

Эскейп-последовательности, используемые в строковых константах, допускаются также и в символьных константах. Так, '\n' обозначает код символа новой строки, который в ASCII равен 10. Следует обратить особое внимание на то, что '\n' обозначает один символ (код которого в выражении рассматривается как целое значение), в то время как "\n" - строковая константа, в которой чисто случайно указан один символ. Более подробно различие между символьными и строковыми константами разбирается в главе 2.

Упражнение 1.8. Напишите программу для подсчета пробелов, табуляций и новых строк.

Упражнение 1.9. Напишите программу, копирующую символы ввода в выходной поток и заменяющую стоящие подряд пробелы на один пробел.

Упражнение 1.10. Напишите программу, копирующую вводимые символы в выходной поток с заменой символа табуляции на \t, символа забоя на \b и каждой обратной наклонной черты на \\. Это сделает видимыми все символы табуляции и забоя.


H. M. Ручко. Модель делегирования

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

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

программировать на обработку запросов только определенного типа. Если тип запроса в очереди не совпадает с типом запросов, на обработку которых ориентирован данный поток, то он может снова приостановиться. Главная цель управляю-потока — создать все потоки, поместить задания в очередь и «разбудить» рабочие потоки, когда эти задания станут доступными. Рабочие потоки справляются о наличии запроса в очереди, выполняют назначенную задачу и приостанавливаются сами, если для них больше нет работы. Все рабочие и управляющий потоки выполняются параллельно. Описанные два подхода к построению модели делегирования представлены для сравнения на рис. 4.6.


среда, 13 октября 2010 г.

Владимир Борисов, Фальшивое божество технологии

Эссе написано в октябре 1998 г.


1

Приведенный ниже текст в значительной мере позаимствован из статьи американского журналиста Роберта Каттнера (Robert Kuttner), напечатанной в «International Herald Tribune» 27 октября 1998 года. Повторяя за ним мрачные замечания в адрес мировой информационной сети, отвечу на часто задаваемый вопрос, почему я не являюсь энтузиастом столь усовершенствованной системы связи. Как пишет Каттнер, компания Microsoft провозгласила два мифа. Первый убеждает каждого пользователя Интернета, что сетевая информационная технология расширяет индивидуальные возможности. Второй миф представляет Microsoft бескорыстным, нейтральным «помощником» всякого рода коммуникаций. Журналист оспаривает оба этих мифа, опираясь на практику, в основном американскую, но не только.

2

В разговоре с приятелем, большим поклонником новой культуры и ее воплощения в Интернете, Каттнер выяснил, в частности, что электронная почта (e-mail) имеет и отрицательные стороны. Например, возвращаясь из путешествия или отпуска, обычно обнаруживаешь в своем электронном почтовом ящике массу писем. Прием этой массы сообщений представляет собой достаточно большой объем работы и превращает не слишком счастливого в тот момент пользователя сети в работника, запряженного в телегу. Этот журналист пишет то же, что всегда утверждал и я: сетевая связь создает иллюзию, будто она способна мгновенно увеличить количество профессиональных или частных контактов. Это неверно. Дело в том, что, работая в сети, теряешь много времени, а это раздражает, тогда как плодотворная совместная работа требует сосредоточенности.

3

Экономисты недоумевают: когда же, наконец, сетевая информационная технология революционизирует производство (и произойдет ли это вообще). Очевидно, сетевые коммуникации могут ускорять процессы, повышать точность работы в таких областях, как банковское дело, проведение платежей, издательская деятельность, хранение данных, касающихся проектирования, производства и пр. Но этим усовершенствованиям сопутствует немало минусов. Только освоишь прошлогодние доработки программ, как прибывает новая версия. Тем самым хваленая культура непрерывного обучения превращается в поучения, стареющие слишком быстро. Автор говорит, что главным образом пользуется пишущей машинкой (так же как и я). Если хорошо освоишь работу на машинке (которые к тому же никогда не зависают), то перейти на компьютер нетрудно. Что же касается качества статей, Каттнер говорит, что в последнее время он редактировал статью одного из известнейших американских колумнистов (публицистов). Тот пользуется пишущей машинкой, но его проза требует гораздо меньше редактирования по сравнению с работами, подготовленными в текстовых редакторах типа Lexus-Nexus и Microsoft Word.

4

Неверно, что присущая сетевым коммуникациям оперативность качественно уравняет всех пользователей. Если сравнивать два различных рода занятия: врачебную практику и обучение студентов, окажется, что компьютерно-сетевая опека превращает врача в чиновника, имеющего в своем распоряжении больше экспертных данных, но пользующегося меньшим личным авторитетом у пациентов. В то же время большинство преподавателей американских средних школ, работающих на основе краткосрочных контрактов, сейчас имеют меньше «свободного времени для творческого труда», а ведь именно он является основой академической вольницы и суверенности. Таким образом, различные категории работников лишаются независимости, несмотря на то, что с приходом информационных технологий торжественно провозглашается расширение возможностей личности. Кроме того, новая технологическая система не только является своего рода оргией деградации, но и приводит к потере многого, ведь ничто не обесценивает труд больше, чем его замена автоматизированной технологией. Вдобавок девальвируются человеческие контакты. Как утверждает большинство социологов, такая деятельность, как, например, забота о малолетних и стариках, о больных, требует прежде всего человеческого участия. Но именно эта сторона страдает от внедрения сетевой автоматизации. Компьютерная мышь не может ни накормить ребенка, ни окружить заботой умирающего.

5

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

6

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


воскресенье, 10 октября 2010 г.

135 / Питер Ладлоу

Для перенесения информации через эти границы в Сети, возможно, понадобятся новые метаправила. Например, члены многопользовательской области LambdaMOO детально обсуждали вопрос о том, стоит ли разрешать использование информации, полученной от действующей дискуссионной группы в «реальном мире». См. примеч. 69, Mnookin, p. 20—21. Некоторые онлайновые системы имеют правила, касающиеся копирования перемещения материалов из одной онлайновой области в другую. Например, условия обслуживания Counsel Connect содержат следующие правила приемлемого копирования: «Будет сочтено, что участники, предоставившие материал, даруют... подписчикам системы оплаченную бессрочную неотзывную лицензию на использование, копирование и повторное распространение материала, любых его частей и любых производных от него работ по всему миру. В качестве условия получения лицензии каждый участник дает согласие не удалять из дословных копий предоставленных материалов информацию, идентифицирующую источник... и не репродуцировать их части, идентифицируя источник, но неточно характеризуя суть и источник любой модификации, переделки или выборки... Несмотря на лицензии, дарованные участниками и поставщиками информации, подписчики... не должны участвовать в систематическом, значительном и регулярном тиражировании коммерческим издателем материалов, предоставленных системе... поскольку результатом подобных действий будет предоставление лицам, не являющимся подписчиками соответствующих материалов, реальной замены такой подписки» (Terms and Conditions for Use of Counsel Connect, прилагается к Stanford Law Review). Соглашение об условиях обслуживания компании America Online содержит сходный параграф: «4. Права и обязанности. Участники сознают, что AOL включает в себя информацию, программное обеспечение, фотографии, видео, графику, музыку, звуки и другие материалы и услуги (собирательно — "содержание")... AOL разрешает доступ к содержанию, защищенному авторскими правами, торговыми марками и прочими собственническими (включая интеллектуальную собственность) правами... Использование содержания участниками должно определяться применимыми законами об авторском праве и другой интеллектуальной собственности... Предоставляя содержание в "общедоступную область"... [участники] автоматически даруют... AOL Inc. бесплатные бессрочные неотзывные неисключительные права и лицензию на использование, репродукцию, модифицирование, приспособление, публикацию, перевод, создание работ на основе распространения, исполнения и отображения такого содержания (как в целом, так и частично) по всему миру» (AOL Inc.'s Terms of Service Agreement, прилагается к Stanford Law Review).

(обратно)

Андрей Владимирович Попов | Список всех групп на рабочей станции

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

В приведенном в листинге 11.6 сценарии ListAllGroups.js для связывания с компьютером 404_Popov мы создаем объект-контейнер ComputerObj, в котором содержатся все объекты рабочей станции 404_Popov:

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

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

Затем в сценарии создается объект Enumerator для доступа к элементам коллекции ComputerObj и инициализируется переменная SList, в которой будет храниться список всех локальных групп рабочей станции:

//Создание объекта Enumerator для доступа к коллекции ComputerObj

E=new Enumerator(ComputerObj);

SList="Ha компьютере 404_Popov созданы группы:\n";

После этого в цикле while из коллекции ComputerObj выбираются лишь объекты класса Group, т.е. те объекты, у которых в поле Class записана строка "Group"; в SList заносятся названия групп из поля Name:

while (!E.atEnd()) {

 //Извлекаем текущий элемент коллекции

 GroupObj=E.item();

 //Выделение объектов класса Group

 if (GroupObj.Class == "Group")

  //Формируем строку с именами групп

  SList+=GroupObj.Name+"\n";

 //Переход к следующему элементу коллекции

 E.moveNext();

}

Рис. 11.5. Список всех локальных групп, определенных на рабочей станции


После окончания цикла сформированная строка выводится на экран (см. рис. 11.5):

//Выводим информацию на экран

WScript.Echo(SList);

Листинг 11.6. Вывод на экран имен всех локальных групп заданной рабочей станции

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

/* Имя: ListAllGroups.js                                               */

/* Язык: JScript                                                    */

/* Описание: Вывод на экран имен всех групп заданного компьютера    */

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

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

var

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

 E,           //Объект Enumerator

 SList;       //Строка для вывода на экран


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

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

//Создание объекта Enumerator для доступа к коллекции ComputerObj

E=new Enumerator(ComputerObj);

SList="На компьютере 404_Popov созданы группы:\n";

//Цикл по всем элементам коллекции объектов компьютера

while (!E.atEnd()) {

 //Извлекаем текущий элемент коллекции

 GroupObj=E.item();

 //Выделение объекты класса Group

 if (GroupObj.Class == "Group")

  //Формируем строку с именами групп

  SList+=GroupObj.Name+"\n";

 //Переход к следующему элементу коллекции 

 E.moveNext();

}

//Выводим информацию на экран

WScript.Echo(SList);

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


вторник, 5 октября 2010 г.

А. К. Щербаков, Глава 9. Альтернативы

Из альтернативных протоколу 802.11 способов построения беспроводной сети можно упомянуть разве что интерфейс Bluetooth да инфракрасную связь. Применение первого ограничено вследствие низкой пропускной способности, которая не превышает 700 Кбит/с, да и радиус действия Bluetooth-связи в большинстве случаев составляет максимум 10 метров. Следует помнить и о том, что аппаратная часть технологии до сих пор остаётся несколько дороже оборудования для сетей Wi-Fi. Но «сине-зубые» устройства — как адаптеры для КПК и ноутбуков, так и точки доступа — выпускаются и продаются. Последние обойдутся в 120-150 долларов и позволят подключать до семи абонентов. Цены же на адаптеры стандарта Bluetooth 1.1 опустились в последнее время до отметки в 40 долларов.

Для инфракрасных сетей существует масса вариантов реализации, да и внедрение такой сети обойдётся дешевле, так как почти все КПК и ноутбуки уже имеют инфракрасные порты. Здесь необязательна точная направленность приёмника на передатчик, допустимые углы отклонения — 15-75 градусов; может приниматься и отражённый сигнал. К сожалению, дальность связи ИК-адаптеров не превышает 4 метров, так что «посотрудничать» с коллегой удастся, только сидя за одним с ним столом. Скорость инфракрасной связи может достигать 4 Мбит/с. Устройства для организации инфракрасной сети выпускает, например, компания Clarinet Systems. Кстати, в ассортименте компании (и не только её одной) есть коммутатор, позволяющий подключать несколько КПК или лэптопов, оборудованных ИК-портами, к беспроводной сети стандарта 802.11b. Инфракрасные приёмопередатчики стоят около $30-40, но принцип действия ограничивает их применение стенами одной комнаты. К тому же, невысокая скорость мало кого устроит на сегодняшний день. Использовать их можно разве что в качестве «шлюза» локальной сети для подключения наладонников, оборудованных ИК-портом.

Прочитав вышеизложенное, читатель может подумать, что сеть для мобильного офиса — благодать, доступная только топ-менеджерам, использующим связь для отслеживания котировок акций на бирже, проведения видеоконференций и прочей фантастики. Но на самом деле это ещё и удобное средство для автоматизации многих бизнес-процессов. Представим себе склад, где хранятся тысячи наименований товара. Процесс передачи товара в торговый зал или филиал компании сопровождается регистрацией этого события в базе данных, осуществляемых путём ручного набора его индекса или артикула. Если номенклатура товаров достаточно обширна, недолго ошибиться и потерять товар, а затем и часть заработной платы. А если бы кладовщик и экспедитор имели при себе КПК со сканером штрих-кодов и доступом к беспроводной сети предприятия, процедура могла бы значительно ускориться. Кто стоял в очереди на оптовых складах, должен меня понять. Здесь скорость и точность обработки напрямую связаны с оборотом денежных средств, так что сеть Wi-Fi на складе оправдает себя очень быстро.

Торговый зал — ещё один кандидат на автоматизацию. Очень часто встречается ситуация, когда менеджер не может рассказать о преимуществах одного высокотехнологичного товара перед другим или просто дать ему исчерпывающие характеристики. КПК с тем же сканером штрих-кодов очень помог бы ему в этом случае. Отослать распознанный артикул товара на сервер БД предприятия и получить описание товара (из той же базы данных, что представлена на веб-сайте компании) можно за несколько секунд. Эффективно и эффектно — мнение потрясённого покупателя о «продвинутом магазине» будет однозначно положительным. А вслед за ним вашу торговую точку обязательно посетят и его знакомые, с которыми он не замедлит поделиться впечатлениями.

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

Резюмируя сказанное, заключу — беспроводные технологии могут найти место практически в любой области торгового бизнеса. Находится ли бизнесмен в кабинете, летит ли на деловую встречу, осматривает ли склады — быстрая и надёжная связь всегда пригодится ему и его работникам. И реальным вариантом её обеспечения сегодня являются беспроводные сети Wi-Fi.


Доверие, Александр Назайкин

Человек внимает только тому, что заслуживает доверия. Поэтому он будет много раз перечитывать заинтересовавшее его объявление, каждую фразу и каждое слово. Покупатель будет решать для себя – стоит ли откликаться на эту рекламу, внушает ли она доверие.

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

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

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

Чем реальнее, правдоподобнее изображаемая ситуация, тем сильнее воздействие. Если иллюстрация или текст воспринимается со скепсисом, то это отношение легко перенесется и на представляемый товар.

Разработчик рекламы должен быть уверен в том, о чем он заявляет. Искренность в таком случае будет не напускной. Читатель это почувствует.

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

Не доверяют люди и объявлениям, в которых использованы преувеличения. Поэтому продавцам стоит избегать превосходных степеней. Лучше отказаться от слов и фраз типа – «самый лучший», «наикрасивейший» или «фантастическое предложение» и т.д.

Реклама должна уважительно относиться к читателю. Трудно говорить о доверии и тогда, когда продавец глядит на покупателя сверху вниз, разговаривает с ним сквозь зубы или «похлопывает» его по плечу.

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

Не стоит недооценивать потребителя, считать его глупее себя. Кому приятно, если с ним обращаются не на равных. Покупатель легко может подумать: «За мои же деньги меня же и обижают». Такие мысли вряд ли приведут его к покупке.

Нельзя забывать, что главное лицо в рекламе – это покупатель. Не продавец, как бы ему этого ни хотелось.

Созданию атмосферы доверия будет способствовать индивидуальность рекламы. Чем четче человек представляет что либо, тем спокойнее к нему относится.

Часто хороший результат в формировании чувства доверия достигает метод «рассказа друзьям»: обращение от первого лица как бы к конкретному человеку. Люди в таком случае легче вступают контакт.

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

В конце текста будет полезным указать не только название фирмы, но и имя человека, с которым предстоит контактировать покупателю.

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


суббота, 2 октября 2010 г.

Упражнения / Джесс Либерти

1. Напишите программу, которая объявляет класс с именем Employee (Служащие) с такими переменными-членами: age (возраст), yearsOfService (стаж работы) и Salary (зарплата).

class Employee

{

   int Age;

   int YearsOfService;

   int Salary;

};

2. Перепишите класс Employee, чтобы сделать данные-члены закрытыми и обеспечить открытые методы доступа для чтения и установки всех данных-членов.

class Employee

{

   public:

      int GetAge() const;

      void SetAge(int age);

      int GetYearsOfService() const;

      void SetYearsOfService(int years);

      int GetSalary() const;

      void SetSalary(int salary);

   private:

      int Age;

      int YearsOfService;

      int Salary;

};

3. Напишите программу с использованием класса Employee, которая создает два объекта класса Employee; устанавливает данные-члены age, YearsOfService и Salary, а затем выводит их значения.

int main()

{

   Employee John;

   Employee Sally;

   John.SetAge(30);

   John.SetYearsOfService(5);

   John.SetSalary(50000);

   Sally.SetAge(32);

   Sally.SetYearsOfService(8);

   Sally.SetSalary(40000);

   cout << "At AcmeSexist company, John and Sally have the same job.\n";

   cout << "John is " << John.GetAge() << " years old and he has been with";

   cout << "the firm for " << John.GetYearsOfService << " years.\n";

   cout << "John earns $" << John.GetSalary << " dollars per year.\n\n";

   cout << "Sally, on the other hand is " << Sally.GetAge() << " years old and has";

   cout << "been with the company " << Sally.GetYearsOfService;

   cout << " years. Yet Sally only makes $" << Sally.GetSalary();

   cout << " dollars per year! Something here is unfair.";

   return 0;

}

4. На основе программы из упражнения 3 создайте метод класса Employee, который сообщает, сколько тысяч долларов зарабатывает служащий, округляя ответ до 1 000 долларов.

float Employee:GetRoundedThousands() const

{

   return (Salary+500) / 1000;

}

5. Измените класс Employee так, чтобы можно было инициализировать данные-члены

age, YearsOfService и Salary в процессе "создания" служащего.

class Employee

{

   public:

      Employee(int Age, int yearsOfService, int salary);

      int GetAge() const;

      void SetAge(int Age);

      int GetYearsOfService() const;

      void SetYearsOfService(int years);

      int GetSalary() const;

      void SetSalary(int salary);

   private:

      int Age;

      int YearsOfService;

      int Salary;

};

6. Жучки: что неправильно в следующем объявлении?

class Square

{

   public:

      int Side;

}

Объявления классов должны завершаться точкой с запятой.

7. Жучки: что весьма полезное отсутствует в следующем объявлении класса?

class Cat

{

   int GetAge() const;

   private:

      int itsAge;

};

Метод доступа к данным GetAge() является закрытым по умолчанию. Помните: все члены класса считаются закрытыми, если не оговорено иначе.

8. Жучки: какие три ошибки обнаружит компилятор в этом коде?

class TV

{

   public:

      void SetStation(int Station);

      int GetStation() const;

   private:

      int itsStation;

};

main()

{

   TV myTV;

   myTV.itsStation = 9;

   TV.SetStation(10);

   TV myOtherTv(2);

}

Нельзя обращаться к переменной itsStation непосредственно. Это закрытая пере- менная-член.

Нельзя вызывать функцию-член SetStation()npHMO в классе. Метод SetStation() можно вызывать только для объекта.

Нельзя инициализировать переменную-член itsStation, поскольку в программе не определен нужный для этого конструктор.


Инсталляция приложения, использующего удаленное взаимодействие / А. Г. Сивак

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

Клиент. Этот компоновочный блок представляет сущность (например, приложение Windows Forms или консольное приложение), заинтересованную в получении доступа к удаленному объекту.

Сервер. Этот компоновочный: блок представляет сущность, получающую канальные запросы от удаленного клиента и обслуживающую удаленные объекты.

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

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

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

• Использовать приложение командной строки soapsuds.exe. С помощью этого инструмента можно сгенерировать компоновочный блок, содержащий только метаданные удаленных типов.

• Вручную построить компоновочный блок, содержащий только метаданные удаленных типов.

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

Замечание. Чтобы выяснить, как реализовать общие компоновочные блоки в рамках указанных выше альтернативных подходов, прочитайте книгу Tom Barnaby, Distributed .NET Programming in C# (Apress, 2002).


четверг, 30 сентября 2010 г.

Установка всех компонентов в режиме непривилегированного пользователя / Денис Каледин

Если при выполнении шагов, описанных в Главе 5, вы будете зарегистрированы в системе как root, есть вероятность, что некоторые файлы системы будут заменены файлами, которые будут скомпилированы в Главе 5. На это есть ряд причин, неопределенная переменная $LFS – одна из них. Замена файлов на вашей системе скорее всего приведет к возникновению всякого рода проблем, поэтому рекомендуется выполнять шаги Главы 5 от имени непривилегированного пользователя. Для чистоты эксперимента создадим новую учетную запись «lfs», которую будем использовать на стадии компиляции со статическими ссылками. Для добавления новой учетной записи, выполните следующие команды в режиме пользователя root:

useradd -s /bin/bash -m lfs && passwd lfs


Теперь скорректируем права на директорию $LFS/static, чтобы пользователь «lfs» имел к ней доступ на запись:

chown -R lfs $LFS/static


Теперь войдите в систему под учетной записью «lfs». Это можно сделать двумя способами: через новую виртуальную консоль или оконный менеджер, или командой su – lfs. После этого выполните следующие команды от имени пользователя «lfs» для создания благоприятной среды:

cat > ~/.bash_profile << «EOF» umask 022 LFS=/mnt/lfs LC_ALL=POSIX CC='gcc -s' export LFS LC_ALL CC EOF source ~/.bash_profile


Этот профиль устанавливает umask равным 022, чтобы созданные файлы и директории автоматически получали правильные права. Настоятельно рекомендуется использование этой установки на протяжении всей инсталляции LFS. Также были заданы переменные $LFS, $LC_ALL, и $CC. Про переменную $LFS мы уже не раз говорили. Переменная $LC_ALL используется для интернационализации.

Если на вашем базовом дистрибутиве установлена библиотека glibc версии 2.2.4 и ранее, и на протяжении Главы 5 переменная $LC_ALL определена не как "C" или «POSIX», могут возникнуть проблемы при выходе повторном входе в среду chroot в Главе 6. Для того чтобы быть уверенным в том, что в среде chroot все будет работать корректно, присвойте этой переменной значение «POSIX» ("C" is an alias for «POSIX»).

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


вторник, 21 сентября 2010 г.

1.8.39. Заземляющие устройства / Валентин Викторович Красник

Вопрос 156. Каков общий объем проверки заземляющих устройств?

Ответ. В данный объем проверок входит:

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

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

проверка состояния пробивных предохранителей в электроустановках до 1 кВ. Пробивные предохранители должны быть исправны и соответствовать номинальному напряжению электроустановки (п. 3);

проверка цепи фаза-нуль в электроустановках до 1 кВ с системой TN. Проверка производится одним из следующих способов:

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

измерением полного сопротивления цепи фазанулевой защитный проводник с последующим вычислением тока однофазного замыкания (п. 4);

измерение сопротивления заземляющих устройств. Значения сопротивления заземляющих устройств с подсоединенными естественными заземлителями должны удовлетворять значениям, приведенным в табл. 1.8.38 (п. 5);

измерение напряжения прикосновения. Напряжение прикосновения измеряется в контрольных точках, в которых эти значения определены расчетом при проектировании (п. 6).

Таблица 1.8.38

Наибольшие допустимые значения сопротивлений заземляющих устройств




* расчетный ток замыкания на землю;

** Соответственно при линейных напряжениях 660, 380 и 220 В;

*** Полный ток замыкания на землю.


1.3. Обзор модели зрелости процессов разработки / Владимир Рябикин

Хотя зачастую инженеры-разработчики и менеджеры хорошо осведомлены о своих проблемах, их взгляды на то, какие усовершенствования являются наиболее важными, могут быть различными. Без организованной стратегии усовершенствования трудно достичь согласия между профессионалами-разработчиками и руководством по вопросу, какие именно работы по усовершенствованию следует выполнять первыми. Для того чтобы усилия по усовершенствованию процессов принесли долговременные результаты, необходимо разработать эволюционный путь развития, поэтапно увеличивающий зрелость производственного процесса организации. Концептуальная структура зрелости производственного процесса [Humphrey 87a] упорядочивает эти стадии таким образом, что усовершенствования на каждой предшествующей стадии являются фундаментом усовершенствований последующей стадии. Таким образом, стратегия усовершенствования, предлагаемая концептуальной структурой зрелости производственного процесса, обеспечивает наиболее прямой путь постоянного улучшения производственного процесса. Эта стратегия призвана руководить усовершенствованиями и выявлять недостатки организации; она не предназначена для быстрого «латания дыр» неудачного проекта.

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

Многоуровневая структура CMM основывается на принципах обеспечения качества продукта, выработанных за последние шестьдесят лет. В начале тридцатых Валтер Шеварт (Walter Shewart) опубликовал работу, в которой изложил принципы статистического контроля качества. Его идеи были развиты, а их успешное применение было продемонстрировано в работах В. Эдвардса Деминга (W. Edwards Deming) [Deming 86] и Джозефа Джурана [Juran 88, Juran 89]. Эти принципы были развиты институтом SEI в виде концептуальной структуры зрелости процессов, формирующей управленческий и инженерный фундамент для количественного контроля над производственным процессом, что является основой для его непрерывного усовершенствования.

Структура зрелости процессов, в которую вошли эти принципы качества, была впервые намечена Филиппом Кросби в его книге «Quality is Free» [Crosby 79]. Сетка зрелости управления качеством, приведенная Кросби, описывает пять эволюционных фаз во внедрении системы управления качеством. Эта структура зрелости была адаптирована для производственного процесса Роном Радиком (Ron Radice) и его коллегами, работающими под руководством Уотса Хэмфри (Watts Humphrey) из компании IBM [Radice 85]. Хэмфри предложил свою структуру зрелости SEI в 1986 г., добавив концепции уровней зрелости и разработав основу для их текущего использования в программной отрасли.

Ранние версии структуры зрелости процессов разработки, предложенные Хэмфри, описаны в технических отчетах SEI [Humphrey 87a, Humphrey 87b], статьях [Humphrey 88] и в его книге «Managing the Software Process» [Humphrey 89]. Предварительный опросный лист для выявления уровня зрелости [Humphrey 87b] был выпущен в 1987 г. в качестве инструмента, позволяющего организациям определить уровень зрелости их производственных процессов. Для получения характеристик зрелости программного процесса в 1987 г. были разработаны методы внутренней и внешней оценки производственного процесса. Начиная с 1990 г., институт SEI с помощью многих энтузиастов из правительственных и отраслевых структур еще более развил и усовершенствовал эту модель, основываясь на опыте нескольких лет совершенствования производственных процессов.


12 / А. Лущанов

Это предупреждение опубликовано с разрешения CIAC и Кевина Обермана. CIAC настояла на публикации следующего заявления:

«Этот документ был подготовлен в результате работы агентства Правительства Соединенных Штатов. Ни Правительство США, ни университет Калифорнии, ни один из служащих этих институтов не несет никаких гарантий, специальных или предполагаемых, и не принимает на себя никаких законных обязательств и никакой ответственности за точность, полноту или пригодность любой информации, приборов, продукта или описания процесса, и не гарантирует, что их использование не станет нарушением закона о частной собственности. Имеющиеся ссылки на любые специальные коммерческие продукты, процессы или услуги, обозначенные торговым именем, торговой маркой, названием производителя или как-либо иначе, не обязательно являются или требуют их подтверждения, рекомендации или предпочтения Правительством Соединенных Штатов или университета Калифорнии. Точка зрения и мнение авторов не обязательно являются или выражают точку зрения или мнение Правительства Соединенных Штатов или университета Калифорнии, и не могут быть использованы в целях рекламы или поддержки какой-либо продукции».

(обратно)

Использование конструкции while(true) / Джесс Либерти

В качестве условия, проверяемого при переходе на очередную итерацию цикла, может выступать любое выражение, корректное с точки зрения синтаксиса языка C++. Цикл выполняется до тех пор, пока это выражение истинно. Для организации так называемых бесконечных циклов в качестве такого выражения применяется логическая константа true. Листинг 7.5 демонстрирует пример бесконечного цикла, выполняющего счет до десяти.

Листинг 7.5. Еще один пример использования оператора while

1: // Листинг 7.5.

2: // Пример "бесконечного" цикла

3:

4: #include <iostream.h>

5:

6: int main()

7: {

8:    int counter = 0;

9:

10:   while (true)

11:   {

12:     counter++;

13:     if (counter > 10)

14:       break;

15:   }

16:   cout << "Counter: " << counter << "\n";

17:   return 0;

18: }


Результат:

Counter: 11


Анализ: Понятно, что условие продолжения цикла, заданное в строке 10, будет выполняться всегда. В теле цикла (строка 12) значение переменной counter увеличивается на единицу. Работа цикла продолжается до тех пор, показначение counter не превысит 10. Выполнение цикла прерывается оператором break в строке 14, и на экран выводится значение переменной counter (строка 16).

Несмотря на то что данная программа работает, ее структуру нельзя назвать оптимальной. Это типичный пример некорректного использования оператора while. Правильным решением была бы организация проверки значения counter в условии продолжения цикла.

Гибкий синтаксис языка C++ позволяет решить одну и ту же задачу множеством различных способов. Поэтому важно научиться выбирать средство, наиболее подходящее в конкретной ситуации.