Блог О пользователеphillisika

Регистрация

Календарь

« Февраль 2011  
Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

На странице


1 |2 |3
 

Создание нового класса документа и класса окна просмотра. Александр Вячеславович Фролов


Создайте два новых класса – класс документа и класс окна отображения для хранения и отображения на экране текстовой информации. Для создания новых классов используйте MFC ClassWizard .

Сначала откройте панель ClassWizard и нажмите кнопку Add Class. Откроется новая диалоговая панель Create New Class. Введите в поле Name имя нового класса – CEditorDoc, а в поле Base Class выберите имя базового класса CDocument. Нажмите кнопку Create. ClassWizard создаст класс CEditorDoc, определение которого он разместит в файле CEditorDoc.h, а реализацию методов класса в файле CEditorDoc.cpp.

Не закрывая ClassWizard, создайте класс окна просмотра текстового документа. Нажмите кнопку Add Class. В поле Name диалоговой панели Create New Class введите имя класса окна просмотра CEditorView, а в поле Base Class выберите имя его базового класса CEditView. Нажмите кнопку Create. ClassWizard создаст класс CEditorView, определение которого он разместит в файле CEditorView.h, а реализацию методов класса в файле CEditorView.cpp.

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

Мы уже изучали класс CEditView в предыдущей книге, посвященной MFC, и вы должны знать, что объекты этого класса сами хранят данные редактируемого документа. Поэтому для записи и чтения документа метод Serialize класса документа должен вызвать соответствующий метод класса окна просмотра. Измените метод Serialize следующим образом:

//////////////////////////////////////////////////////////////

// Метод класса Serialize CEditorDoc


void CEditorDoc::Serialize(CArchive& ar) {

 ((CEditView*)m_viewList.GetHead())- >SerializeRaw(ar);

}

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

 

Татьяна Соколова. Настройка параметров трехмерного моделирования


Вкладка настройки параметров трехмерного моделирования 3D Modeling диалогового окна Options, показанная на рис. 3.11, позволяет сделать следующие назначения.

Рис. 3.11. Диалоговое окно настройки параметров трехмерного моделирования


• В области 3D Crosshairs определяются параметры трехмерного перекрестья.

• В области Display ViewCube or UCS Icon устанавливаются параметры показа значка ПСК.

• В области Dynamic Input определяется параметр динамического ввода.

• В области 3D Objects задаются параметры трехмерных объектов:

· в списке Visual Style while creating 3D objects устанавливается визуальный стиль при создании трехмерных объектов;

· в списке Deletion control while creating 3D objects определяется управление удалением при создании трехмерных объектов;

· U isolines on surfaces and meshes – установка значения U-изолинии на поверхностях и сетях;

· V isolines on surfaces and meshes – установка значения V-изолинии на поверхностях и сетях.

• В области 3D Navigation определяются параметры навигации:

· Reverse mouse wheel zoom – установка реверса зумирования колесиком мыши;

· кнопка Walk and Fly… – загрузка диалогового окна Walk and Fly Settings, позволяющего установить параметры обхода и облета;

· кнопка Animation… – загрузка диалогового окна Animation Settings, позволяющего установить параметры анимации.

 

Контакты Windows / Андрей Валентинович Жвалевский


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

на панели инструментов.

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

Рис. 5.37. Данные пользователя в файле контакта


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

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

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

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

 

А. Г. Гузикевич | Исполнительный механизм


Исполнительный механизм NET Compact Framework представляет собой низкоуровневый код, отвечающий за загрузку, JIT-компиляцию и выполнение управляемого кода, а также управление памятью. Ему приходится брать на себя всю черновую работу, обеспечивающую выполнение управляемого кода.

Исполнительный механизм написан на языках C/C++ и компилируется в собственные команды процессора. На этот механизм дополнительно возлагается задача трансляции .NET Compact Framework и приложений конечного пользователя в исполняемый формат во время выполнения. Этот процесс известен под названием JIT- компиляции (just-in-time — оперативная). С помощью этого же механизма обрабатываются любые переходы из управляемого кода в собственный код, например, вызовы функций основанного на собственном коде API-интерфейсов базовой операционной системы; этот процесс называется переключением (thunking).

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

 

Владимир Верстак | Плавающие панели инструментов


Если выполнить команду Customize > Show UI > Show Floating Toolbars (Настройка > Показать пользовательский интерфейс > Показать плавающие панели инструментов), то откроются дополнительные плавающие панели: reactor, Layers (Слои), Animation Layers (Анимация слоев), Snaps (Привязки), Render Shortcuts (Быстрый доступ к настройкам визуализации), Axis Constraints (Ограничения по осям), Extras (Дополнения) и Brush Presets (Предустановки кистей).

Плавающая панель инструментов Layers (Слои) содержит кнопки для создания, активизации, блокировки и выделения слоев, а также средства для назначения и изменения свойств слоя. При помощи панели Snaps (Привязки) можно управлять свойствами привязок, используемых при моделировании и редактировании объектов. Панель Axis Constraints (Ограничения по осям) позволяет устанавливать ограничения перемещения только выделенной осью или плоскостью. Панель Extras (Дополнения) содержит кнопки переключения подключаемых модулей на сочетания клавиш, автосетки, а также кнопки создания массива, снимков и распределенных объектов по пути или заданному точками расстоянию. Панель Brush Presets (Предустановки кистей) позволяет получить доступ к предустановленным кистям, а также создавать собственные. Панель reactor содержит все необходимые команды для создания имитации физических реакций.

Панель Animation Layers (Анимация слоев) дает возможность объединять анимационные треки одного объекта, настраивая их по отдельности.

Рассмотрим некоторые панели инструментов более подробно.

Панель инструментов Snaps (Привязки) (рис. 1.17) обеспечивает быстрый доступ к наиболее используемым командам привязки.


Рис. 1.17. Плавающая панель Snaps (Привязки)


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


Рис. 1.18. Плавающая панель Render Shortcuts (Быстрый доступ к настройкам визуализации)


Удерживая нажатой клавишу Shift, щелкните на кнопке с буквой A, B или C – и настройки последней визуализации будут сохранены. Для начала визуализации сцены при помощи сохраненных настроек достаточно щелкнуть на одной из трех кнопок.

 

Джеффри П. Мак-Манус, Использование внешних объединений


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

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

SELECT FirstName, LastName, OrderDate

FROM tblCustomer LEFT OUTER JOIN

tblOrder ON tblCustomer.ID = tblOrder.CustomerID

Обратите внимание, что в предложении LEFT JOIN используется синтаксис имя_таблицы.имя_поля. Более длинное имя позволяет избежать неоднозначности при использовании полей с одинаковыми именами, поскольку поле ID существует как в так и в tblOrder. Фактически предложение LEFT OUTER JOIN означает, что будут отображены все данные таблицы tblCustomer, которая находится в левой стороне выражения tblCustomer.ID = tblOrder.CustomerID.

РИС. 2.6. Выполнение запроса на основе объединения двух таблиц в окне конструктора представлений

Этот запрос возвращает приведенный ниже набор записей.

FirstNameLastNameOrderDate
JohnSmith1/4/2001
JohnSmith1/9/2001
JillAzalia1/14/2001
BradJones< NULL >
DaisyKlein2/18/2001
DaisyKlein3/21/2001
DaisyKlein4/4/2001
DaveMartin6/5/2001
BettyKlein< NULL >
ThurstonRyan7/2/2001
JaneWinters8/16/2001
JaneWinters9/10/2001

В этот результирующий набор включены все клиенты базы данных, независимо от того, имеют ли они заказы или нет. Для клиентов, не имеющих заказов, в поле OrderDate появится < NULL >, что означает отсутствие данных.

Правое внешнее объединение (right join) аналогично левому внешнему объединению (left join), за исключением того, что оно возвращает все записи из второй таблицы, участвующей в объединении (имеется в виду таблица с правой стороны), независимо от того, есть ли соответствующие им записи в первой таблице (расположенной с левой стороны). (Левое и правое объединения являются разновидностями внешнего объединения и в определенных обстоятельствах могут возвращать идентичные результаты.)

 

Environment / Роман Александрович Клименко


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

¦ Count — возвращает общее количество системных переменных, созданных на данный момент.

¦ Length — аналогичен предыдущему методу.

¦ Remove(имя переменной) — удаляет указанную системную переменную.

¦ Item(имя переменной) — возвращает значение данной системной переменной.

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

ПРИМЕЧАНИЕ

Получить значение переменной можно также с помощью подобного вызова: MsgBox wshshell.ExpandEnvironmentStrings("%systemroot%"). 

Листинг 16.3. Работа с системными переменными 

set wshshell = WScript.CreateObject("WScript.Shell")

MsgBox wshshell.Environment.Count

MsgBox wshshell.Environment.item("winbootdir")

wshshell.Environment.Remove("winbootdir")

MsgBox wshshell.Environment.Count

 

Виктор Комаров - ВВЕДЕНИЕ



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

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

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

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

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

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

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

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

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

Приносят ли исследования в области проблемы внеземных цивилизаций сколько-нибудь ощутимый эффект — научный и практический? И если приносят, то в чем именно он состоит?

Настоящий сборник и ставит своей целью дать ответ на эти вопросы.


 

Мюррей Хилл | 5.2.3 Ссылки на Себя


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

class x (* int m; public: int readm() (* return m; *) *);

x aa; x bb;

void f() (* int a = aa.readm(); int b = bb.readm(); // ... *)

В первом вызове члена member() m относится к aa.m, а во втором – к bb.m.

Указатель на объект, для которого вызвана функция член, является скрытым параметром функции. На этот неявный параметр можно ссылаться явно как на this. В каждой функции класса x указатель this неявно описан как

x* this;

и инициализирован так, что он указывает на объект, для которого была вызвана функция член. this не может быть описан явно, так как это ключевое слово. Класс x можно эквивалентным образом описать так:

class x (* int m; public: int readm() (* return this-»m; *) *);

При ссылке на члены использование this излишне. Главным образом this используется при написании функций членов, котрые манипулируют непосредственно указателями. Типичный пример этого – функция, вставляющая звено в дважды связанный список:

class dlink (* dlink* pre; // предшествующий dlink* suc; // следующий public: void append(dlink*); // ... *);

void dlink::append(dlink* p) (* p-»suc = suc; // то есть, p-»suc = this-»suc p-»pre = this; // явное использование this suc-»pre = p; // то есть, this-»suc-»pre = p suc = p; // то есть, this-»suc = p *)


dlink* list_head;

void f(dlink*a, dlink *b) (* // ... list_head-»append(a); list_head-»append(b); *)

Цепочки такой общей природы являются основой для списквых классов, которые описываются в Главе 7. Чтобы присоеднить звено к списку необходимо обновить объекты, на которые указывают указатели this, pre и suc (текущий, предыдущий и последующий). Все они типа dlink, поэтому функция член dlink::append() имеет к ним доступ. Единицей защиты в С++ яляется class, а не отдельный объект класса.

 

Владимир Верстак. Blend (Смешиваемый)


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

Для доступа к материалу Blend (Смешиваемый) выполните следующие действия.

1. Щелкните на кнопке Type (Тип) в окне Material Editor (Редактор материалов) для вызова окна диалога Material/Map Browser (Окно выбора материалов и карт).

2. Выберите из списка материал Blend (Смешиваемый). В результате откроется окно диалога, в котором необходимо указать: Discard old material? (Удалить старый материал?) или Keep old material as sub-material? (Оставить старый материал в качестве компонента?).

3. Щелкните на кнопке OK. В результате в области свитков окна Material Editor (Редактор материалов) появится свиток Blend Basic Parameters (Основные параметры смешивания) (рис. 3.15).

Рис. 3.15. Свиток Blend Basic Parameters (Основные параметры смешивания)


4. Настройте параметры смешивания материала.

1) Щелкнув на одной из кнопок Material 1 (Материал 1) или Material 2 (Материал 2), выберите новый материал либо перейдите в режим редактирования существующего. В качестве материалов могут выступать как стандартные материалы, так и сложные составные.

2) Установите или снимите флажки, расположенные справа от кнопок материалов, для активизации или деактивизации материалов.

3) Установите переключатель Interactive (Интерактивный) напротив того материала, который должен быть показан в окне проекции.

4) Нажав кнопку Mask (Маска), укажите в открывшемся окне Material/Map Browser (Окно выбора материалов и карт) материал или файл растрового изображения, который будет использоваться для смешивания двух компонентов материала.

5) В счетчике Mix Amount (Доля в смеси) определите значение смешивания материалов-компонентов в диапазоне от 0 до 100. При значении, равном 0, будет виден только Material 1 (Материал 1), а при 100 – только Material 2 (Материал 2).

6) Задайте плавность перехода одного материала в другой с помощью элементов области Mixing curve (Кривая смешивания).

 

Лекция 9. Описание нейронных сетей - Е. М. Миркес


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

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

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

1. Сети с непрерывным временем.

2. Сети с дискретным асинхронным временем.

3. Сети с дискретным временем, функционирующие синхронно.

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

 

Журнал «Компьютерра» | 13-Я КОМНАТА: Утопия нашего времени


Автор: Илья Щуров Voyager

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

Однажды в детстве я придумал – ни много ни мало – модель идеального социума. Развитие техники, верил я, приведет к тому, что каждому человеку будет выдано по собственному миру во владение и пользование. Не по планете, а по целой вселенной. Исчезнет битва за ресурсы. Земли, солнца, воздуха, звезд и даже еды хватит на всех. Нет конкуренции – нет войн, голода, нищеты, болезней…

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

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

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

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

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

И кстати – о чем мечтают ваши дети? Нам ведь интересно, о чем мы будем писать через десять лет…


P.S. Напоминаем, что редакция «Компьютерры» решила внести свой вклад в мировую блогосферу, и приглашаем в наш редакционный блог: inside computerra ru. Надеемся, что описанные в этой статье отрицательные стороны жизни его не коснутся.

 

Видовые экраны произвольной формы. Татьяна Соколова


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

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

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

Для создания видовых экранов предназначены два ключа команды VPORTS – Object и Polygonal.

Ключи команды VPORTS следующие:


Object – позволяет преобразовать в видовой экран объект, построенный в пространстве листа. Вызов команды осуществляется из падающего меню View > Viewports > Object.

Если выбирается полилиния, она должна быть замкнутой и иметь не менее трех вершин. Допускается наличие в ней сегментов любого типа (как линейных, так и дуговых), а также самопересечения. Полилиния связывается с вновь создаваемым видовым экраном; в результате получается видовой экран неправильной формы. Этот процесс происходит так: AutoCAD описывает прямоугольник вокруг выбранного объекта, создает на его основе прямоугольный видовой экран, а затем «подрезает» его этим объектом.


Polygonal – позволяет описать границу видового экрана путем указания точек-вершин. Последовательность запросов аналогична той, которая используется при построении полилиний. Вызов команды при этом осуществляется из падающего меню View > Viewports > Polygonal Viewport.

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

Тренинг-система

Выполните упражнения Vpr1–Vpr3 и тест 9 из раздела 5.




 

Н.3.3 Состав (содержание) и организация указателя. Этсетера


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

Примечания

1 В качестве заголовков (элементов) указателя (слов или фраз, вносимых в указатель) следует использовать объекты, выбранные из конкретного документа (например, «программное средство»).

2 Для представления одинакового понятия должен использоваться один и тот же термин.

3 В указателе могут быть использованы подзаголовки, описывающие некоторые аспекты основного заголовка.

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

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

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

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

8 Сокращения и обозначения должны быть расположены а алфавитном порядке (например, обозначение «BASIC» для «Beginner's All-purpose Symbolic Instruction Code» между «Base» и «Battery»).

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

 

Д. Солнышков. Пример: уведомление сигналом с отключением блокировки


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

Листинг 5.10. Использование уведомления с помощью сигнала для считывания сообщения из очереди сообщений Posix

//pxmsg/mqnotifysig3.с

1  #include "unpipc.h"

2  volatile sig_atomic_t mqflag; /* ненулевое значение устанавливается обработчиком сигнала */

3  static void sig_usr1(int);


4  int

5  main(int argc, char **argv)

6  {

7   mqd_t mqd;

8   void *buff;

9   ssize_t n;

10  sigset_t zeromask, newmask, oldmask;

11  struct mq_attr attr;

12  struct sigevent sigev;

13  if (argc != 2)

14   err_quit("usage: mqnotifysig3 < name >");

15  /* открытие очереди, получение атрибутов, выделение буфера */

16  mqd = Mq_open(argv[1], O_RDONLY | O_NONBLOCK);

17  Mq_getattr(mqd, &attr);

18  buff = Malloc(attr.mq_msgsize);

19  Sigemptyset(&zeromask); /* сигналы не блокируются */

20  Sigemptyset(&newmask);

21  Sigemptyset(&oldmask);

22  Sigaddset(&newmask, SIGUSR1);

23  /* установка обработчика, включение уведомления */

24  Signal(SIGUSR1, sig_usr1);

25  sigev.sigev_notify = SIGEV_SIGNAL;

26  sigev.sigev_signo = SIGUSR1;

27  Mq_notify(mqd, &sigev);

28  for (;;) {

29   Sigprocmask(SIG_BLOCK, &newmask, &oldmask); /* блокируем SIGUSR1 */

30   while (mqflag == 0)

31    sigsuspend(&zeromask);

32   mqflag = 0; /* сброс флага */

33   Mq_notify(mqd, &sigev); /* перерегистрируемся */

34   while ((n = mq_receive(mqd, buff, attr.mq_msgsize, NULL)) >= 0) {

35    printf("read $ld bytes\n", (long) n);

36   }

37   if (errno != EAGAIN)

38    err_sys("mq_receive error");

39   Sigprocmask(SIG_UNBLOCK, &newmask, NULL); /* разблокируем SIGUSR1 */

40  }

41  exit(0);

42 }


43 static void

44 sig_usr1(int signo)

45 {

46  mqflag = 1;

47  return;

48 }

Открытие очереди сообщений в режиме отключенной блокировки

15-18 Первое изменение в программе: при открытии очереди сообщений указывается флаг O_NONBLOCK.

Считывание всех сообщений из очереди

34-38 Другое изменение: mq_receive вызывается в цикле, считывая все сообщения в очереди, пока не будет возвращена ошибка с кодом EAGAIN, означающая отсутствие сообщений в очереди. 

 

В. В. Мельниченко - Глава 12 Web-камеры: сетевое аудио— и видеообщение


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

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

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

Качество звучания Интернет-телефонов все еще далеко от качества обычного телефонного аппарата. Между завершением сказанной фразы и моментом, когда ее услышат, существует определенная задержка, а голоса хорошо знакомых неузнаваемы. Зато платить при таком способе общения приходится только за услуги Интернет-провайдера. К наиболее известным программам Интернет-телефонии можно отнести NetMeeting, Internet Phone, MediaRing Talk 99, Net2Phone. Как ими пользоваться, мы расскажем немного позже. А вначале рассмотрим оборудование, позволяющее "себя показать и других посмотреть".

 

Александр Вячеславович Шумович | Запас прочности мероприятия


Всегда готовьте план Б. В некоторых случаях, когда вероятность нестандартной ситуации высока, пропишите план Б и оговорите его с вашей командой, потренируйтесь в его выполнении, подготовьте и напишите к плану Б альтернативный сценарий.

Продумайте, кто может принимать оперативные решения. Если вы руководите мероприятием, вы не сможете быть одновременно везде – а где-то могут потребоваться неотложные действия. Делегируйте полномочия (особенно в случае необходимости срочного решения) и ответственность. Это залог успешности и прочности вашего мероприятия.

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

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

Установите, наконец, финансовый лимит ответственности и делегирования.

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

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

Опыт – возможность теперь уже с первой попытки сделать все как надо.

Лучший комплимент, который я слышал:

«Ваши мероприятия скучные. Чем-то похожи на Lexus. Все работает как часы, ничего не ломается и отлично выглядит».

Пусть и ваши мероприятия будут ТАК «скучны» для участников.

 

Валентин Озеров. Создание компонента TTable без формы


Решение 1

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

FSession:= TSession.Create(nil);

FDatabase:= TDatabase.Create(nil);

FSession.SessionName:= 'DBSession'

FDatabase.Connected:= False;

FDatabase.AliasName:= Database;

FDatabase.DatabaseName:= USER_DATABASE;

FDatabase.SessionName:= FSession.SessionName;

FUserTBL:= TTable.Create(nil);

FUserTBL.DatabaseName:= FDatabase.DatabaseName;

FUserTBL.SessionName:= FSession.SessionName;

FUserTBL.TableName:= USERTBL;

FUserTBL.IndexName:= USERSpIndex;

FUserSource:= TDataSource.Create(nil);

FUserSource.DataSet:= FUserTBL;

Решение 2

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

unit Unit2;


interface


uses db, DBTables, dialogs;


type fake = class(Ttable)

 procedure fakeFilterRecord(DataSet: TDataSet; var Accept: Boolean);

end;


var

 MyTable: fake;


implementation


procedure fake.fakeFilterRecord(DataSet: TDataSet; var Accept: Boolean);

begin

 showmessage('Здравствуй, Вася');

end;


Initialization

 MyTable:= fake.create(nil);

 With Mytable do begin

  DataBaseName:= 'dbdemos';

  TableName:= 'biolife';

  OnFilterRecord:= MyTable.fakeFilterRecord;

  Filtered:= true;

  active:= true;

 end;

 {проверка получением неких данных…}

 showmessage(MyTable.fields[1].asstring);


Finalization

 {Важно!  MyTable не имеет родителя, – уничтожаем объект сами, иначе память не высвобождается…}

 MyTable.free;

end.

 

Александр Владимирович Кузин, Тактический прием «Ссылки как плакаты времен холодной войны&r...


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

Поскольку в жизни Интернета главную роль играют гиперссылки, лучше всего размещать не просто тексты или изображения, а именно гиперссылки, содержащие в якорных словах текст с ключевыми словами. Такие ссылки одинаково полезны как с точки зрения привлечения внимания людей, так и с точки зрения продвижения ваших сайтов и блогов-аккумуляторов в поисковых системах. Ведь они ведут с разных адресов, более того, являются постоянными, а это также важно с точки зрения поисковых машин. Просто разместите ссылку с текстом вроде: «Секретов Секрет Секретович – ловкость рук? Легким движением руки книга П. П. Ершова „Конек-Горбунок“ превращается в книгу Секретова Секрета Секретовича». Эта ссылка будет давать возможность увидеть вашу точку зрения людям, а также тематически поднимет ваши сайты и блоги-аккумуляторы в выдаче поисковых машин по словосочетанию «Секретов Секрет Секретович».

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

 

Вик С. Штаркман - 1.5.4 Подсчет слов


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

#include ‹stdio.h›


#define IN 1 /* внутри слова */

#define OUT 0 /* вне слова */


/* подсчет строк, слов и символов */

main()

{

 int с, nl, nw, nc, state;

 state = OUT;

 nl = nw = nc = 0;

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

  ++nc;

  if (c == '\n')

   ++nl;

  if (c == ' ' || c == '\n' || c == '\t')

   state = OUT;

  else if (state == OUT) {

   state = IN;

   ++nw;

  }

 }

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

}

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

Строка

nl = nw = nc = 0;

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

nl = (nw = (nc = 0));

Оператор || означает ИЛИ, так что строка

if (c == ' ' || c == '\n' || c == '\t')

читается как "если c есть пробел, или c есть новая строка, или c есть табуляция". (Напомним, что видимая эскейп-последовательность \t обозначает символ табуляции.) Существует также оператор &&, означающий И. Его приоритет выше, чем приоритет ||. Выражения, связанные операторами && или ||, вычисляются слева направо; при этом гарантируется, что вычисления сразу прервутся, как только будет установлена истинность или ложность условия. Если c есть пробел, то дальше проверять, является значение c символом новой строки или же табуляции, не нужно. В этом частном случае данный способ вычислений не столь важен, но он имеет значение в более сложных ситуациях, которые мы вскоре рассмотрим.

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

if (выражение)

 инструкция1

else

 инструкция2

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

Упражнение 1.11. Как протестировать программу подсчета слов? Какой ввод вероятнее всего обнаружит ошибки, если они были допущены?

Упражнение 1.12. Напишите программу, которая печатает содержимое своего ввода, помещая по одному слову на каждой строке.

1 |2 |3