Форматы | Владимир Викторович Маслов |
В Перл реализован удобный метод создания форматированных отчетов. С помощью оператора format вы описываете заголовки, размеры полей, указываете положение данных на листе в удобной текстовой форме. Затем выполняете команду write(файл) которая выводит отформатированные данные в указанный файл.
Оператор формат имеет следующий синтаксис:
format имя =
FORMLIST
.
Обратите внимание на то что описание формата идет после строки format и заканчивается символом '.' в начале строки.
Здесь 'имя' – это имя формата, такое же как и имя указателя выходного файла.
Если 'имя' отсутсвует то значение по умолчанию – STDOUT.
FORMLIST – это строки формата. Они бывают трех типов:
1. Комментарий. Строка начинается символом '#'.
2. Описатель полей данных (picture).
3. Строка аргументов используемых описателем.
Описатель – это строка которая выводится в виде «как есть» за исключением специально обозначенных форматов полей данных. Каждое поле начинается либо символом '@' либо '^'.
В описательной строке указывается только положение и вид выводимых данных, но не имена полей и переменных.
Для этого предназначена следующая строка аргументов которая следует всегда после описателя и содержит имена переменных или целые выражения в порядке указанном описателем.
Размер и вид поля в описателе обозначается следующими символами:
«>>>>» – выровнить значение по правому краю.
«<<<<» – -//– по левому.
«||||» – -//– по центру.
«####.###» – формат числа с точкой.
«@*» – многострочная строка. Данные выводятся в колонку.
Размер поля равен количеству указанных символов.
Символ '^' в начале поля имеет специальное значение.
Так:
«^####» – пусто если переменная не определена.
для строчного скаляра:
«^<<<<<» – Выводится сколько возможно символов, а значение переменной меняется на остаток вывод которого можно продолжить на следующих строках которые могут иметь свои поля.
Пример:
#!/usr/local/bin/perl
#
# Программа печати пригласительного билета
#
$кому = «Чапаеву Василию Ивановичу»;
$от_кого = «Компания МММ»;
$адрес = «Москва, ул. Петровка, д 38»;
$текст = "Уважаемый Василий Иванович! Компания МММ имеет честь пригласить
Вас и Ваших близких на презентацию наших новых хромовых сапог, сделанных
на уровне мировых стандартов качества и дизайна.";
format STDOUT =
П Р И Г Л А С И Т Е Л Ь Н Ы Й Б И Л Е Т
Кому: @<<<<<<<<<<<<<<<<<<<<<<<<<< | ^|||||||||||||||||||||||||||||||
$кому, $текст
| ^|||||||||||||||||||||||||||||||
$текст
От кого: @<<<<<<<<<<<<<<<<<<<<<<< | ^|||||||||||||||||||||||||||||||
$от_кого, $текст
| ^|||||||||||||||||||||||||||||||
$текст
Адрес:@<<<<<<<<<<<<<<<<<<<<<<<<<< | ^|||||||||||||||||||||||||||||||
$адрес, $текст
| ^|||||||||||||||||||||||||||||||
$текст
| ^|||||||||||||||||||||||||||||||
$текст
| ^|||||||||||||||||||||||||||||||
$текст
Отпечатано в типографии ИТУ 38
.
write(); # Вывод данных.
exit 0; # Конец программы
Результат:
П Р И Г Л А С И Т Е Л Ь Н Ы Й Б И Л Е Т
Кому: Чапаеву Василию Ивановичу | Уважаемый Василий Иванович!
| Компания МММ имеет честь
От кого: Компания МММ | пригласить Вас и Ваших близких
| на презентацию наших новых
Адрес:Москва, ул. Петровка, д 38 | хромовых сапог, сделанных на
| уровне мировых стандартов
| качества и дизайна.
|
Отпечатано в типографии ИТУ 38
Специальные переменные:
$~ – построчный формат содержимого.
$^ – формат заголовка листа.
$% – номер листа.
$= – строк в листе.
Если вы хотите использовать одни и те же форматы для разных файлов то самый простой путь:
use FileHandle; # Указать в начале программы
format_name файл имя_формата; # Формат содержимого листа.
format_top_name файл имя_формата; # Формат заголовка листа.
write(файл); # вывод данных.
Здесь 'файл' имеется ввиду указатель файла полученный командой open();
Если вам нужно в теле листа выводить разного рода форматы (например заголовки групп или отбивку листа) то применяйте format_name.
|
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.
|
Программы сторонних разработчиков. Виктор Гольцман |
Известный исследователь Антарктиды однажды сказал: «Благоразумие для полярника – жизненная необходимость!» Исследователю собственного мобильного телефона осторожность и благоразумие тоже не помешают. Программы от производителей телефонов снабжены всевозможными «защитами от дурака» и что-либо повредить в телефоне в принципе не могут. А вот приложения, о которых пойдет речь далее, подобной защиты обычно лишены. В документации к ним принято приводить фразы: «Автор программы не гарантирует… и не несет ответственности за возможный ущерб, причиненный использованием программы. Все, что вы делаете, вы делаете на собственный страх и риск».
Другими словами, непродуманное удаление или замена некоторых файлов могут наделить телефон заметными «странностями поведения». К счастью, такая ситуация обычно исправима. Для этого придется прибегнуть к средствам, о которых рассказано в гл. 7. Однако программы для перепрошивки и доступа к сервисным возможностям мобильного требуют еще более осторожного подхода. При неосторожном использовании они могут сделать телефон уже «полным идиотом». Лучшая профилактика нежелательных последствий сводится к двум правилам.
• Правило первое. Нужно четко представлять себе, что вы собираетесь делать и что при этом должно произойти в телефоне (компьютере). Источники таких сведений – данная книга, документация и справочная система программ, а при наличии неясностей или сомнений стоит обратиться к многочисленным конференциям в Интернете.
• Правило второе. Удалению, замене файлов в телефоне, тем более замене программного обеспечения или отдельных частей мобильного должно предшествовать резервное копирование информации на компьютер. Чем полнее резервная копия, тем больше вероятность восстановления в случае неудачной операции.
Выбор программ для работы со своим телефоном – процесс творческий. В любом случае целесообразно ознакомиться с программным пакетом от производителя. Как правило, предоставляемых этими приложениями возможностей более чем достаточно для решения повседневных задач.
Менеджеры сторонних производителей тоже заслуживают внимания: среди многочисленных разработок почти всегда можно найти ту, которая удовлетворит вас и набором функций, и удобством доступа к ним.
Оптимальное решение – установить на компьютере несколько программ для работы с телефоном, выбрать среди них самую удобную для повседневного использования, а к другим обращаться для выполнения отдельных функций, отсутствующих в любимом менеджере. Отметим, что совместимость нескольких программ на одном компьютере проверяется только опытным путем.
Поскольку в качестве примера «фирменного» решения мы привели программу-менеджер телефонов Motorola, для сравнения уместно рассмотреть некоторые программы сторонних разработчиков для телефонов той же марки.
|
М. Зислис / Многопрофильные команды |
Сопротивление разработчиков программного обеспечения всему, что грозит изменить знакомую последовательность событий процесса разработки, привела к рождению многочисленных извилистых логических построений в сообществе проектировщиков. Широко обсуждается мысль о том, что проектирование должны осуществлять команды, включающие представителей многих дисциплин.
Согласно этой гипотезе, команда, включающая представителей пользователей, программистов, менеджеров, маркетологов, специалистов по юзабилити, даст лучшие результаты. По моему опыту, метод «круглого стола» не эффективен. Цели и заботы участников различаются, а участник, цели которого имеют наибольший вес, часто хуже всего приспособлен для выражения своих забот. Хуже того, программисты, в любом случае обладающие абсолютной властью над программными артефактами, неизбежно берут на себя управление командой, обычно с заднего сиденья.
Круглый стал не дает желаемых перемен. Подход демократичный, полидисциплинарный, многокультурный, никого не оставляющий за бортом, но неспособный исправить ущербную последовательность, продолжающую отравлять взаимодействие.
|
Антон Валерьевич Попов / Шаг первый. Привлечение покупателя |
Понятно, что не вся реклама работает. (Сет Годин утверждает, что 90% средств на нее тратится впустую.) Для того чтобы оценить результативность каждого СМИ, многие магазины используют купоны со скидкой – «вырежь и предъяви». Это неплохо, но при развитии мобильного маркетинга выглядит анахронизмом. Можно легко заменить эту процедуру автоматизированным сбором данных по ключевому слову.
Каждому СМИ (печать, радио и др.) присваивается свое ключевое слово, которое покупатель посылает в SMS-сообщении и получает, допустим, SMS-купон; а рекламодатель в таком случае получит точные сведения о характере контакта рекламы с человеком. Правда, не все и не всегда хотят тратить деньги на SMS. Тогда просто поместите в рекламе пароль, который нужно сказать продавцу при покупке, чтобы получить ту же скидку или какой-то комплементарный товар (разумеется, пароли должны быть разными для разных медиаканалов, и продавцы должны быть предупреждены заранее). Такой способ, конечно, более трудоемок, чем SMS, но тоже результативен.
Пароли служат для облегчения отслеживания первой точки контакта. Например, в рекламе по радиостанции №1 вы говорите после номера телефона: «Спросите Олю», а в рекламе по радиостанции №2 – «Спросите Сашу». Таким образом, по количеству звонков Саше и Оле нетрудно сравнить эффективность размещения рекламы на радиостанции №1 и №2.
Паролем могут быть «полезные» слова – например, адрес магазина, название торговой марки, модель товара, имя основателя... Так что параллельно потребитель узнает немного нового о вашем магазине.
Зимой можно объявить температурную скидку на весь летний ассортимент. Скидка зависит от температуры воздуха на улице. К примеру, в 30 градусов мороза скидка составляет 30%. Такая схема позволит поддержать посещаемость магазина в холодные дни, когда желания ходить по магазинам ни у кого нет. Погоня за скидкой превращается в игру: посмотрел прогноз на неделю и понял, что лучше всего покупать роликовые коньки в среду. А может быть, синоптики ошиблись и надо бежать за ними сегодня?
Оформление витрин – безусловно, важный элемент привлечения покупателей в магазин. В 1900 году 22-летний Джошуа Лайонел Кауэн в качестве рекламы своих товаров поставил в витрине магазина игрушечный поезд с двигателем на батарейках. К его удивлению, клиенты больше интересовались покупкой игрушечного поезда, чем товаров магазина. С тех пор технологии существенно продвинулись. А что если вам установить в витрину устройство Bluetooth, которое будет посылать приглашение зайти или информацию о скидках тем посетителям, которые провели перед витриной некоторое время? Можно предположить, что рассматривание витрины более минуты говорит об интересе к продукции магазина, и реклама, пришедшая на мобильный, будет восприниматься как подсказка, полезная информация.
|
Владимир Верстак, Второй вариант |
В предыдущем примере для контроля формы объекта и его положения в пространстве использовались управляющие вершины. Рассмотрим другой способ анимации страниц книги: при помощи лофт-поверхности. Для продолжения работы выполните одно из трех действий:
¦ выделите анимированный лист и, используя команду Hide Selection (Спрятать выделенное) контекстного меню, спрячьте его;
¦ удалите анимированный лист из сцены;
¦ загрузите начальную сцену из файла bookstart.max, находящегося в папке Examples\Глава 08\Воок прилагаемого DVD.
Для создания анимированной страницы нам понадобится построить лофт-поверхность по четырем управляющим кривым. Для этого сделайте следующее.
1. Щелкните на кнопке Shapes (Формы) вкладки Create (Создание) командной панели и выберите из раскрывающегося списка строку NURBS Curves (NURBS-кривые).
2. Нажмите кнопку CV Curve (CV-кривая) для выбора типа кривой.
3. Перейдите в окно проекции Top (Сверху), щелкните в верхнем углу книги, вертикально переместите указатель до нижнего края и щелкните еще раз для построения второй точки кривой. Нажмите правую кнопку мыши для завершения построения.
СОВЕТ
Чтобы создать контрольные вершины, расположенные строго в вертикальной или горизонтальной плоскости, при построении нажмите и удерживайте клавишу Shift.
4. Копируйте созданную кривую, выполнив команду Edit > Clone (Правка > Клонирование), и в появившемся окне Clone Options (Параметры клонирования) установите переключатель в положение Copy (Независимая копия объекта).
5. Повторите описанные в п. 4 действия два раза для создания третьей и четвертой копий кривой. После этого разместите построенные кривые так, чтобы первая кривая находилась в области корешка книги, а остальные приблизительно соответствовали положению строящейся страницы (рис. 8.27).
Теперь необходимо создать NURBS-поверхность. Для этого выделите в окне проекции Perspective (Перспектива) первую кривую и в свитке General (Общие)
щелкните на кнопке NURBS Creation Toolbox (Инструменты создания NURBS-объектов)
для вызова плавающей панели NURBS с инструментами создания кривых и поверхностей. На плавающей панели NURBS нажмите кнопку Create U Loft Surface (Создать поверхность методом U-лофтинга) (рис. 8.28), после чего указатель примет соответствующий вид.
Рис. 8.27. Положение кривых перед построением поверхности
Рис. 8.28. Плавающая панель NURBS с нажатой кнопкой Create U Loft Surface (Создать поверхность методом U-лофтинга)
Подведите указатель мыши к первой кривой (расположенной в районе корешка), в результате чего она подсветится цветом, и щелкните на ней. Затем щелкните на соседней кривой. В результате этих действий между первой и второй кривой образуется поверхность.
ВНИМАНИЕ
В отличие от объектов другого типа, на уровне редактирования подобъектов для NURBS-объектов при анимации блокируется кнопка выбора центра трансформации. По этой причине важным фактором является последовательность выделения кривых. Дело в том, что первая выделенная кривая в нашем случае будет являться одновременно осью вращения и для объекта, и для его подобъектов.
Продолжите выделение оставшихся двух кривых и создание поверхности страницы, образованной всеми кривыми. После завершения построения щелкните на окне проекции правой кнопкой мыши. Теперь можно окончательно отредактировать положение кривых в пространстве. Для этого перейдите на уровень редактирования подобъектов Curve (Кривая) выделенного объекта. В окне проекции Front (Спереди) передвиньте кривые так, чтобы поверхность листа приняла более естественный вид и при этом не пересекалась со статичной геометрией (рис. 8.29).
Все подготовительные действия выполнены – можно приступать к анимации. Передвиньте ползунок шкалы анимации на 60 кадр. Щелкните на кнопке Auto Key (Автоключ). Перейдите на уровень редактирования подобъектов Curve (Кривая) и в окне проекции Front (Спереди) выделите вторую управляющую кривую (в активном состоянии все кривые будут обозначены кружками). Нажмите кнопку Select and Rotate (Выделить и повернуть)
на панели инструментов и выберите из раскрывающегося списка Reference Coordinate System (Система координат) пункт Local (Локально) (рис. 8.30).
Рис. 8.29. Расположение управляющих кривых в окне проекции Front (Спереди)
Рис. 8.30. Раскрывающийся список Reference Coordinate System (Система координат)
Поворачивая манипулятор против часовой стрелки, разверните управляющую кривую в левую сторону. Проделайте те же действия для оставшихся двух кривых. Не выключая запись ключей анимации, при необходимости отредактируйте положение управляющих кривых в пространстве относительно левой стороны книги (рис. 8.31).
Рис. 8.31. Положение управляющих кривых на левой стороне книги
Подводя итоги выполненной анимации листа книги, можно заметить, что второй способ более простой и легкоуправляемый. В общем случае для такой анимации достаточно трех управляющих кривых и создания ключей анимации в первом и последнем кадрах анимации, а небольшое изменение кривой трансформации поворота в Curve Editor (Редактор кривых) позволяет получить реалистичное движение листа при минимальных трудозатратах.
ПРИМЕЧАНИЕ
Файл урока с настройками анимации book_var02.max находится на прилагаемом DVD в папке Examples\Глава 08\Book.
|
Создание нового класса документа и класса окна просмотра - Александр Вячеславович Фролов |
Создайте два новых класса – класс документа и класс окна отображения для хранения и отображения на экране текстовой информации. Для создания новых классов используйте 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);
}
На этом реализация классов для хранения и отображения текстового документа закончена и можно перейти к самому интересному – к созданию шаблона нового документа.
|
М. Зислис. Мы решаем задачи, чтобы достичь целей |
До того, как цифровая эра познакомила нас с когнитивным сопротивлением, дизайн (проектирование) был понятием в основном художественным, и мнение одного человека о качестве дизайна продукта было ничем не хуже мнений других людей. Когнитивное сопротивление приходит вместе с взаимодействием, а взаимодействие необходимо лишь в присутствии намерения, цели. В этом новом свете природа дизайна изменилась. Художественная составляющая никоим образом не исчезла. Она лишь попала в тень более серьезной потребности – достижения целей пользователя. Таким образом, в современном проектировании воспринимаемое качество – уже не спорный вопрос, а свойство, которое можно подвергать системному анализу. Иначе говоря, в ярком свете пользовательских целей мы можем достаточно просто определить, какой дизайн будет соответствовать намерениям, независимо от чьего-либо мнения или, если уж об этом зашла речь, эстетических качеств.
Слова «качественное проектирование взаимодействия» обретают смысл лишь в контексте разговора о человеке, непосредственно участвующем во взаимодействиях и имеющем при этом определенные намерения. Намерения не существуют без людей. Эти элементы неразделимы. Именно поэтому ключевыми составляющими нашего процесса проектирования являются цели и персонажи – намерения и люди.
Более того, наиболее важными целями считаются личные цели, интересующие одного конкретного человека. С вашим продуктом взаимодействует реально существующий человек, а вовсе не абстрактная корпорация, поэтому личные цели людей вы обязаны ставить выше целей корпорации. Ваши пользователи будут изо всех сил стараться достигнуть целей бизнеса, но лишь после того, как достигнут собственных. Самая важная личная цель – сохранить достоинство, не почувствовать себя глупо.
Сущность качественного проектирования взаимодействия заключается в изобретении таких взаимодействий, которые помогут пользователям достигать практических целей, не препятствуя достижению личных целей.
|
Скрытые письмена. А. С. Доброславский |
Дедал рассматривает загрязнение окружающей среды как бесценное национальное достояние. Он вспоминает, что историкам удается разобрать надписи на старинных пергаментах, сделанные одна поверх другой, и пытается разработать аналогичную методику анализа слоев копоти на стенах домов, свалок промышленных отходов, наслоений на дне старых каналов. Всякий производственный процесс сопряжен с выбросом определенных веществ, которые затем оседают в окрестностях. Поэтому тщательный химический анализ наслоений должен выявить, каким топливом пользовались и как его сжигали, какие применялись химические реактивы, смазочные материалы и т. д. Всякая приостановка производства, всякое изменение производственного процесса будут отражены в бесчисленных слоях, отложившихся на заброшенных фабричных корпусах или на стенах старинной ратуши. Современные микроскопические и микроаналитические методы позволят археологу прочитать эту драматическую летопись — если, конечно, ее прежде не уничтожат недальновидные блюстители чистоты. Дедал призывает бережно относиться к копоти на стенах старых заводов и железнодорожных тоннелей, к кучам шлака на заводских дворах: это кладези сведений об истории промышленного развития страны.
В частности, этот принцип можно использовать при изучении истории кулинарного искусства. Аромат, исходящий от кушаний, конденсируется на стенах в виде тонкого и душистого слоя жира. С течением времени на стенах кухонь и обеденных залов в безупречной последовательности накапливаются химические составляющие бесчисленных завтраков, обедов и ужинов. Быть может, их удастся даже подразделить по смене блюд при каждом застолье — от закусок до коньяка и сигар. Поскольку вкус каждого блюда определяется именно летучими веществами, в этих слоях содержится точная рецептура каждого блюда. Таким образом, тщательный химический анализ веществ, отложившихся на не чищенном сто лет потолке кухни французского отеля, может рассказать нам многое о вкусах знаменитых гурманов и творчестве легендарных поваров и даже позволит восстановить рецепты забытых блюд[34].
New Scientist, May 7, 1970
Комментарий Дедала
Красивым примером хронологической последовательности загрязнений являются «воскресные камни» — отложения на трубах, по которым откачивали воду из старых угольных шахт. В воде постоянно содержалась белая известковая взвесь; во время рабочей смены в воду попадала также угольная пыль. Поэтому на срезе отложения, снятого со стенки трубы, рабочие смены отмечены отчетливыми черными линиями. В воскресенье шахта не работала, и этот день отмечен более широкой белой полосой.
«Воскресный камень» находится в музее города Ньюкасл-апон-Тайн. Шестидневная рабочая неделя в шахте из которой он извлечен, отмечена на срезе шестью полосами угольной пыли. Широкие белые полоски соответствуют воскресеньям, когда шахта не работает. Вторая серия полос внизу содержит только пять линий должно быть, в эту суббота местная футбольная команда играла на своем поле!
Хотя предложенный мной метод историографического исследования еще не был использован во всей его полноте, одно из моих предположений оказалось пророческим. Идею о том, что история промышленного развития страны может быть прочитана по отложениям на дне старинных каналов, с успехом развили Э. Гольдберг и его коллеги (Geochemical Journal, 10, 1977, p. 165; New Scientist, March 31, 1977, p. 757). Эти ученые решили исследовать ров вокруг императорского дворца в Токио. Подобраться к обители божественного смертного не так-то просто, но после долгой бюрократической волокиты Гольдбергу удалось получить керн со дна рва. Химический анализ слоев позволил восстановить историю загрязнений воздуха в Токио. Например, изменение содержания свинца и кадмия в слоях отражает увеличение интенсивности автомобильного движения, минимум содержания цинка и меди в период примерно 1955 г. может соответствовать переходу от послевоенной разрухи к мирному процветанию; высокое содержание углерода указывает на широкое использование каменного и древесного угля в качестве топлива. Итак, владельцы дворцов и замков, не мутите воду во рвах! Быть может, здесь еще пишутся ваши фамильные мемуары!
|
Управление видимостью слоя. Татьяна Соколова |
AutoCAD не отображает на экране объекты, расположенные на невидимых слоях, и не выводит их на плоттер. Если при работе с деталями рисунка на одном или нескольких слоях чертеж слишком загроможден, допускается отключение или замораживание неиспользуемых слоев. Кроме того, чтобы запретить вывод на печать объектов определенных слоев, например для вспомогательных линий, можно оставить эти слои видимыми, но отключить их вывод на печать.
Для отключения слоя необходимо в Диспетчере свойств слоев Layer Properties Manager, показанном на рис. 4.1, навести указатель мыши на имя отключаемого слоя и затем щелкнуть на пиктограмме On. Аналогично происходит и замораживание слоя при щелчке на пиктограмме Freeze.
Предусмотрена возможность запрещать печать любого слоя, даже видимого. Если слой содержит, например, только справочную информацию, то его вывод на печать можно отключить. Запрещение печати слоя не изменяет его отображения на экране. Поэтому запрет печати удобно использовать для слоев, содержащих вспомогательные элементы построений. При этом перед выводом рисунка на печать такие слои не требуется отключать. Запрет печати любого слоя осуществляется в Диспетчере свойств слоев Layer Properties Manager – см. рис. 4.1. С этой целью требуется выделить слои, для которых необходимо разрешить или запретить вывод на печать, и щелкнуть на пиктограмме Plot.
|
7. Формы распределения товаров - Елена Юрьевна Логинова |
Существует три формы распределения товаров.
1. Эксклюзивная (исключительная) – небольшое число посредников, обладающих исключительными правами на распределение товаров фирмы на определенной территории. В основном эта форма характерна для эксклюзивных товаров, которая возвышает образ товара, подчеркивает его исключительность, обеспечивает полный контроль над посредниками. Недостатки – узкий охват рынка, существенные затраты на сбыт.
2. Интенсивная – наличие большого числа посредников в целях максимального приближения товара к покупателю. Данная форма применима для товаров повседневного спроса. Плюсы данной формы состоят в широком охвате рынка и низких затратах на сбыт. Минус – слабый контроль посредников.
3. Селективная – заключается в том, что фирма работает со специально отобранными посредниками. С помощью данной формы возможен широкий охват рынка, полный контроль над посредниками и сравнительно низкие затраты на сбыт товаров.
Таким образом, рациональная организация товародвижения является решением одной из главных задач фирмы – обеспечение желаемых объемов продаж и желаемой прибыли.
|
А. Г. Гузикевич. Сенсорные экраны и важность использования крупных кнопок |
При создании пользовательских интерфейсов для устройств с сенсорными экранами часто допускают ошибку, состоящую в том, что элементы управления имеют слишком маленькие размеры. Практическим следствием этого является то, что в процессе использования мобильного приложения пользователь лишь с большим трудом может нажать нужную кнопку или ввести точные данные. Пользователей это очень раздражает, поскольку, теряя возможность надежной координации своих действий, они чувствуют себя крайне неуверенно. Не заставляйте пользователей испытывать стыд за свою неловкость! Проблемы, связанные с недостаточно большими размерами элементов управления, возникают по нескольким причинам:
¦ Проектирование и тестирование интерфейсов с использованием программных эмуляторов устройств. При работе с программным эмулятором устройства на настольном компьютере не составляет труда следить за точным положением указателя мыши и выполнять щелчок в нужном месте экрана. Точно выполнить на эмуляторе необходимые действия с небольшими элементами управления пользовательского интерфейса при помощи мыши гораздо легче, чем сделать то же самое на экране физического устройства с помощью пера.
¦ Наличие смещения между сенсорной поверхностью и поверхностью дисплея, а также погрешности калибровки. Поверхность сенсорного экрана обычно располагается хотя и на небольшом, но не пренебрежимо малом расстоянии от элементов физического дисплея. В зависимости от угла, под которым рассматривается экран, и угла наклона пера относительно поверхности экрана могут возникать неточности, и в действительности щелчок может регистрироваться со смещением от того места, в котором пользователь намеревался его выполнить. В различных устройствах эта проблема может проявляться в разной степени, причем описанный эффект смещения становится более заметным в случае упрочненных устройств, в которых в результате введения защитных слоев соответствующие расстояния несколько возрастают, что только усугубляет последствия указанного эффекта. Кроме того, причиной неточностей могут быть погрешности калибровки сенсорного экрана. Отсюда следует, что точность управления пером может быть меньше той, на которую вы надеетесь.
¦ Реальные условия использования. Возможно, в офисных условиях вам и удастся точно щелкнуть на небольшой кнопке, но что если вам надо воспользоваться приложением, когда вы едете в автобусе, такси, идете по улице или сидите в вагоне поезда? При работе в реальных условиях на пользователя воздействует множество отвлекающих факторов, вибрация и короткие, но неожиданные толчки, которые делают работу с небольшими кнопками на сенсорных экранах весьма затруднительной.
¦ Желание "уместить все на одном экране". Попытки размещения на единственном экране чрезмерного количества информации приводят к скученности элементов управления и уменьшению их размеров. Чем более плотно располагаются элементы управления, тем выше вероятность их неправильного выбора.
¦ Привлечение встроенных программных механизмов ввода. В таких устройствах, как Pocket PC, предлагается всплывающая программная клавиатура, которой пользователь может воспользоваться для ввода информации. Это средство доказало свою полезность, однако оно является универсальным, и поэтому в нем предусмотрено множество клавиш, которые должны быть все отображены на небольшом экранном пространстве. Если ваши запросы носят более специфический характер, то механизмы ввода, предусматриваемые пользовательским интерфейсом, вам придется оптимизировать.
На рис. 13.2 показано то же самое приложение, в котором используется программная клавиатура (software input panel — SIP) Хотя программная клавиатура представляет собой в целом неплохой механизм для ввода букв, цифр и символов, укрупненные элементы управления пользовательского интерфейса, предназначенные специально для калькулятора, применяемого при проведении научных расчетов, предлагают более точный и легкий в использовании интерфейс. Типовая программная клавиатура удобна для ограниченного ввода информации общего назначения, но ее можно и необходимо улучшать в тех случаях, когда задаче требуется более специфический ввод. Проектируя пользовательские интерфейсы для устройств с сенсорными экранами, вы должны делать размеры элементов управления настолько большими, а их целевое назначение настолько специализированным, насколько это возможно.
|
ГЛАВА 11. ПРОГРАММНЫЕ ПРОЕКТЫ НА ПРОЛОГЕ / У. Клоксин |
В этой главе рассматривается перечень программных проектов, которые вы могли бы попытаться осуществить для развития навыков программирования на Прологе. Некоторые из этих проектов довольно просты, зато другие вполне могут быть предложены в качестве «курсовой работы» в рамках учебного курса по Прологу. Более простые проекты следует использовать как дополнение к упражнениям, приведенным в предыдущих главах. В целом при перечислении проектов мы не придерживались какого-то определенного порядка, хотя те из них, что содержатся в разд. 11.2, в большей мере допускают расширения, содержат вызов честолюбию, но и требуют некоторой подготовки или знакомства с литературой по различным вопросам искусственного интеллекта и информатики. Небольшая часть проектов требует знаний из определенных разделов науки, поэтому если вы не специалист в области математической физики, то не отчаивайтесь, если не сможете написать программу дифференцирования трехмерных векторных полей.
Целая подборка Пролог-программ опубликована в отчете Coehlo H., Cotta J. С, Pereira L. M. How to solve it with Prolog, Laboratorio Nacional de Engenharia Civil, Lisbon, Portugal. В нем содержится свыше ста небольших примеров, задач и упражнений из таких областей как вывод умозаключений на основе базы данных, естественный язык, символьное решение уравнений, и т. д. Этот отчет по своему характеру не рассчитан на использование для обучения, поэтому приведенные в нем Пролог-программы снабжены лишь краткими пояснениями.
|
Инициализация объектов / Джесс Либерти |
До сих пор переменные-члены объектов задавались прямо в теле конструктора. Выполнение конструктора происходит в два этапа: инициализация и выполнение тела конструктора.
Большинство переменных может быть задано на любом из этих этапов: как во время инициализации, так и во время выполнения конструктора. Но логически правильнее, а зачастую и эффективнее, инициализировать переменные-члены во время инициализации конструктора. В следующем примере показана инициализация переменных-членов:
CAT(): // имя конструктора и список параметров
itsAge(5), // инициализация списка
itsWeigth(8)
{} // тело конструктора
После скобки закрытия списка параметров конструктора ставится двоеточие. Затем перечисляются имена переменных-членов. Пара круглых скобок со значением за именем переменной используется для инициализации этой переменной. Если инициализируется сразу несколько переменных, то они должны быть отделены запятыми. В листинге 10.4 показана инициализация переменных конструкторов, взятых из листинга 10.3. В данном примере инициализация переменных используется вместо присвоения им значений в теле конструктора.
Листинг 10.4. Фрагмент программного кода с инициализацией переменных-членов
1: Rectangle::Rectangle():
2: itsWidth(5),
3: itsLength(10)
4: {
5: }
6:
7: Rectangle::Rectangle (int width, int length):
8: itsWidth(width),
9: itsLength(length)
10: {
11: }
Результат: Отсутствует
Анализ: Некоторые переменные можно только инициализировать и нельзя присваивать им значения: например, в случае использования ссылок и констант. Безусловно, переменной-члену можно присвоить значение прямо в теле конструктора, но для упрощения программы лучше по возможности устанавливать значения переменных-членов на этапе инициализации конструктора.
|
С / Денис Николаевич Колисниченко |
С/С++/С# — популярные языки программирования. Язык С был разработан в начале 1970-х годов Керниганом и Ритчем и до сих пор остается одним из самых популярных языков программирования
cable — кабель
cache — кэш. Очень быстрая буферная память, находящаяся «между» основной памятью и регистрами процессора. Используется для временного хранения часто используемых данных для быстрого доступа к ним
disk cache — дисковый кэш, область памяти, которая используется для хранения блоков диска, к которым недавно осуществлялось обращение Не нужно путать с кэшем жесткого диска Кстати, чем больше кэш у жесткого диска, тем быстрее он работает
callback— обратный звонок. Ваш модем звонит провайдеру, сообщает имя пользователя и пароль Если имя пользователя и пароль правильные, сервер разрывает связь и перезванивает пользователю В итоге пользователь экономит на телефонном времени
calculate — вычислять
calculator — калькулятор
call — запрос; звонок
cancel — отмена
capacity — объем, обычно имеется в виду объем носителя данных
CD (Compact Disk) — компакт-диск
CD changer — устройство для смены компакт-дисков
CD-R (Compact Disk-Recordable) — компакт-диск с дозаписью Такой диск можно записать один раз и затем дописывать в «конец» диска, пока будет свободное место
CD-ROM (Compact Disk Read Only Memory) — компакт-диск, предназначенный только для чтения (дописывать на него нельзя), а также устройство для чтения компакт-дисков
CD-RW (CD Rewritable) — компакт-диск для многократного перезаписывания, записи можно стирать и наносить заново
CDSL (Consumer Digital Subscriber Line) — выделенная цифровая линия. Скорость данных одинакова в обоих направлениях (прием/передача) и достигает 1 Мбит/с. См. ADSL
Celeron — процессор компании Intel. Первоначально планировался как более дешевая версия Pentium, но потом стал полноценным процессором, устанавливаемым на многие современные компьютеры Подробнее о процессорах Intel см в тексте энциклопедии
Celeron D — более усовершенствованная версия процессора Celeron, имеет другую частоту системной шины — 533 МГц против 400 МГц (обычный Celeron)
Celeron М — версия процессора Celeron с пониженным энергопотреблением, устанавливается на ноутбуках
cell — ячейка (например, ячейка электронной таблицы)
cellular — сотовый (имеется в виду сотовый телефон или сотовая технология связи)
change directory — изменить каталог
channel — канал
chip — чип, микросхема
chipset — чипсет
clean — чистый
clock — часы
close — закрывать
close a file — закрыть файл
close all — закрыть все (файлы, окна)
color — цвет
color management — управление цветом
color palette — палитра цветов
color separation — отделение цветов
color setting — установка цветов
color table — таблица цветов
COM (Component Object Model) — модель компонентных объектов (компания Microsoft) Используется для внедрения объектов в другие программы: например, вы можете написать программу и внедрить в нее экземпляр программы Word Получится как бы «собственный» Word. Модель СОМ используется в технологиях DCOM и ActiveX
comma — запятая
command — команда, оператор
computer — компьютер
battery-powered computer — компьютер с питанием от автономной батареи (например, ноутбук)
mains-powered computer — компьютер с обычным питанием (от сети электропитания)
pocket computer— «карманный» компьютер, КПК
confirmation — подтверждение
connection — соединение, подключение
control— управление; элемент управления (кнопка, переключатели и т. д.)
controller — контроллер, устройство управления другими устройствами, освобождающее от этой функции процессор
cooler — вентилятор
coprocessor — сопроцессор, дополнительный процессор, использующийся для ускорения определенных операций, например математических
сору — копия, копировать
copy all — копировать все
cpi (character per inch) — символов на дюйм, плотность печати символов в строке
cps (character per second) — символов в секунду, скорость печати
CPU (Central Processing Unit) — центральный процессор, «мозг» компьютера
Ctrl+Alt+Del — данная комбинация используется для перезагрузки компьютера (в некоторых ОС) или вызова Диспетчера задач (в Windows)
|
9.5.5.1. Пример конфигурации. / Андрей Киселев |
Конфигурация практически идентична вышеприведенному примеру:
# tc qdisc add dev eth0 root handle 1: htb default 30
# tc class add dev eth0 parent 1: classid 1:1 htb rate 6mbit burst 15k
# tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k
# tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 6mbit burst 15k
# tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k
Автор рекомендует устанавливать дисциплину SFQ для этих классов:
# tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
# tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
# tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
Добавим фильтры, которые будут выполнять классификацию трафика:
# U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32"
# $U32 match ip dport 80 0xffff flowid 1:10
# $U32 match ip sport 25 0xffff flowid 1:20
В результате получаем ясную и понятную конфигурацию — никаких малопонятных чисел, никаких недокументированных параметров.
В HTB все выглядит достаточно прозрачно — классы 10: и 20: имеют гарантированную пропускную способность, при наличии свободной части пропускной способности они заимствуют ее в отношении 5:3.
Неклассифицированый трафик будет отнесен к классу 30:, который имет достаточно небольшую ширину, но может заимствовать незанятую часть канала.
|
Проблемы с аудиокартой / Денис Николаевич Колисниченко |
Обычно со звуковой картой одна проблема – нет звука. Причины следующие:
• неправильное подключение акустической системы – проверьте, чтобы штекер акустической системы был подключен к зеленому гнезду звуковой платы (обычно находится посредине между LINE-IN и гнездом микрофона). Проверьте уровень громкости на самой акустической системе и, наконец, включено ли питание АС;
• низкий программный уровень громкости – если с питанием, подключением и уровнем громкости все в порядке, нужно проверить системный уровень громкости. Для этого выберите команду меню Пуск, Выполнить, введите команду sndvol32 (рис. 19.11) и установите максимальный уровень громкости (также убедитесь, что не включен флажок Выкл. для Front Speaker, Звук, Синтезатор и CD Player);
• ошибка драйвера – запустите программу установки драйвера, после установки драйвера перезагрузите компьютер;
• звуковая плата отключена – возможно, кто-то пошутил и отключил вашу звуковую плату в SETUP. Тут вам поможет руководство по вашей материнской плате – в нем нужно найти название опции, позволяющей включить/выключить встроенную звуковую плату. Обычно эта опция находится в разделе Integrated Peripherals.
|
ПОЗДРАВЛЕНИЯ / Журнал «4PDA» |
Текст:Barsik («который везде» – прим. редакции) :)
ВОСЬМЁРОЧКА
В стародавние времена, когда персональные компьютеры были, вероятно, ещё в диковинку, а о покетах мечтали только самые отчаянные головы, жила-была на свете белом девочка Клара. И захотелось ей праздника. Светлого такого праздника захотелось, чистого, женского – чисто женского: чтобы в этот день посуду не мыть, бельё не стирать, на работе накануне получить подарки. И, придя домой в праздник после утренней пробежки, увидеть уже накрытый стол: винцо лёгенькое, салатики уже поструганые, цветочки-лютики в вазочке, свечечки зажжённые, внимание-заботу ощутить, понимаш... !
Время шло. Выросла Клара большой, выбилась в активистки-революционерки...
И вот поехала как-то Клара в Копенгаген. А там, в Копенгагене этом, как раз международная конференция женщин проходила. Дай, думает Клара, я тож зайду на эту конференцию и провозглашу: пущай день восьмого марта сделают международным праздником, днём солидарности пролетарских женщин! Не-а, не звучит… Лучше уж днём рождения женского пролетариата или международным днём трудящихся женщин! Хотя..., какое именно название придумала Клара (дословно), я могу только догадываться, хотя бы потому, что, нося фамилию Цеткин, она вряд ли думала на русском языке, разве только на очень ломаном.
Ну, и что ты думаешь – Клара пошла-таки на эту конференцию, вышла на трибуну и провозгласила свою идею, о как! Было это в далёком 1910 году. Почему именно 8 марта Кларе захотелось праздновать – остаётся загадкой, во всяком случае, единого мнения нет, лишь гипотезы, но нам-то какая разница?!
Русские пролетарии услыхали слово «праздник», и идея им очень понравилась. Они перевели название на русский, и уже через пару годиков, с 1913-го, стали его, день этот, вовсю праздновать, оставив для солидности прилагательное «международный», хотя, кажись, дальше пределов бывшего СССР он не распространился – не прижился. И это странно: не то женщин они – буржуи, – не любят, не то праздники. Хм-м, действительно, странно. А нам-то какая разница, пральльна?!
Не-е, хоть и с русским языком у Клары скорее всего были проблемы, хоть и по национальности она была не то немка, не то еврейка – дух у неё был, как мне кажется, всё-таки русский! Иначе как бы она такой праздник придумала?!
Благодарные советские люди не оставили заслуги Клары без внимания. Вот, например, когда в моём городе шоколадную фабрику называли именем Надежды Крупской, то табачную фабрику назвали именем Клары!
Шло время. Мужчины-пролетарии, чтобы не утруждать себя стиркой в праздник (восьмого марта), придумали стиральные машины. Чтобы не мыть самим посуду – посудомоечные машины. Чтобы не строгать салатики – придумали кухонные комбайны.
Заодно придумали и карманные компьютеры, которым и посвящён этот журнал. И поставили себе в этих КПК напоминания, чтобы праздник, упаси Господи, не пропустить случайно. В итоге, из всего перечисленного в начале статьи им остается тока поджечь свечечку, поставить цветочки-лютики в вазочку, разлить вино по бокалам, да внимание-заботу оказать, понимаш... . А это мы – мужики, – могём; это мы умеем!
И коллектив редакции журнала с огромным удовольствием поздравляет милых девушек и женщин с этим замечательным днём – праздником 8 марта! Хочется пожелать Вам, дорогие Вы наши, чтобы если бы у Вас и возникало желание съездить в Копенгаген – то только для того, чтобы мир посмотреть да себя показать, потому как во всём остальном у Вас недостатка не было бы. Счастья Вам, благополучия, творческой реализации и всего-всего-привсего самого-пресамого... (вот именно того, о чём ты сейчас подумала)!
Постскриптум (ака ЗЫ): Мужчины! Не забудьте поставить в своих покетах напоминание и поздравить всех своих любимых девушек. Всех до единой! Иначе, Барсик это сделает за Вас!
|
Где мы находимся? / А. Шкадова |
В этой главе была представлена концепция интерфейса СОМ. Интерфейсы СОМ обладают простыми двоичными сигнатурами, которые позволяют любому клиенту обращаться к объекту независимо от языка программирования, использованного клиентом или конструктором объекта. Чтобы облегчить поддержку различных языков, интерфейсы СОМ определяются на языке IDL (Interface Definition Language). Эти IDL-определения интерфейса могут быть также использованы для генерирования кода передачи данных (communications code), который позволяет получать доступ к объекту через сеть.
Большая часть этой главы была посвящена IUnknown – базовому интерфейсу, на котором построен весь СОМ. Все интерфейсы СОМ должны наследовать от IUnknown. Следовательно, все объекты СОМ должны реализовывать IUnknown. В IUnknown предусмотрено три сигнатуры метода, посредством которых клиент может безошибочно управлять иерархией типов объекта для доступа к дополнительным возможностям, предоставляемым этим объектом. С учетом этого QueryInterface можно рассматривать как оператор приведения типа в СОМ. По этой же причине IUnknown можно рассматривать как «void *» (указатель на пустой тип) среди указателей интерфейса, так как от него не слишком много пользы до тех пор, пока он не «приведен» (is «cast») к чему-нибудь более содержательному с помощью QueryInterface.
Следует заметить, что при обращении или реализации IUnknown не было сделано никаких существенных системных вызовов. В этом смысле IUnknown просто является протоколом или набором обещаний (promises), которого должны придерживаться все программы. Это позволяет объектам СОМ быть очень простыми и эффективными. Реализация IUnknown в C++ требует всего нескольких строк стандартного кода. Чтобы автоматизировать реализацию IUnknown в C++, была представлена серия макросов для препроцессора, которые реализуют QueryInterface под табличным управлением. Хотя эти макросы не были совершенно необходимыми, они удаляли большую часть общего стандартного кода из каждого определения класса, не внося при этом заметных усложнений в реализацию.
|