понедельник, 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?.