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

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

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

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

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

Кроме этого, с помощью компонентов среднего уровня можно отделить изменения структуры базы данных от изменений бизнес-правил. Эти компоненты аналогичны представлениям и хранимым процедурам тем, что скрывают изменения структуры базы данных от клиентского приложения. Помимо этого, существует еще одно преимущество использования таких компонентов по сравнению с представлениями и хранимыми процедурам SQL Server: они упрощают процесс программирования, возвращают данные в виде объектов, а не строк и столбцов, а также не привязаны к конкретной СУБД или языку программирования. Более подробно компоненты среднего уровня рассматриваются в главе 12, "Web-службы и технологии промежуточного уровня".


Валентин Перция | Создание имени

После того как заказчик (внешний, если вы рекламное или маркетинговое агентство, или внутренний, если вы руководитель отдела маркетинга компании) заполнил бриф на разработку имени, наступает время его создания. Для разработки первоначальных вариантов достаточно двух недель. Естественно, что не все две недели (10 рабочих дней по 8 часов) уйдут на сидение за столом и писание слов. Вам потребуется пара-тройка дней на «раскачку» подсознания: поставленная задача начинает крутиться в голове вне зависимости от того, думаете ли вы о ней в данную минуту. Затем некоторое время уйдет на сбор дополнительной информации по теме имени (об этом ниже). Собственно говоря, может так случиться, что в прямом смысле «делать имя» вы будете не более одного дня или пары часов. Творческий процесс, к сожалению или к счастью, невозможно запустить или остановить по расписанию.

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

Не мешает запастись купленными в магазине или одолженными у друзей англо-, французско-, немецко-, испанско-, итальянско-русскими (-украинскими, -белорусскими) словарями. Иногда простой перевод найденного вами слова на иностранный язык может дать искомый результат.

Итак, задача, стоящая перед вами на этом этапе, формулируется так: «Хочу все знать».

В компании BrandAid существуют восемь этапов создания имени брендов.

1. Анализ рынка.

2. Разработка «тематических полей».

3. Генерация имен по «тематическим полям».

4. Повторная генерация.

5. Защита и отбор.

6. Маркетинговый и лингвистический фильтры.

7. Полный юридический анализ и защита.

8. Утверждение имени.


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

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

Если выполнить команду 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 – и настройки последней визуализации будут сохранены. Для начала визуализации сцены при помощи сохраненных настроек достаточно щелкнуть на одной из трех кнопок.


Госстандарт России - 9.2.3 Базовые линии и трассируемость

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

а) установить базовые линии для элементов конфигурации, на которые распространяется сертификационное доверие (промежуточные базовые линии могут быть установлены с целью обеспечить контроль работ процессов жизненного цикла ПО);

б) установить базовую линию для программного средства и определить ее в Указателе конфигурации ПО (12.26).

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

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

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

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

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

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


Денис Колисниченко / Совет № 73 Старайтесь выбрать тот тип парковки, который наиболее уместен в данной ситуации

Парковка бывает трех типов:

• параллельно проезжей части;

• перпендикулярно проезжей части;

• под углом к проезжей части.

Параллельная парковка

Параллельная парковка – наиболее сложная, поскольку нужно учитывать:

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

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

Рис. 4. Параллельная парковка.


Алгоритм параллельной парковки будет следующий:

• Нужно убедиться, что места для вашего автомобиля достаточно.

• Заезжаем передом, как обычно.

• Скорее всего, вы встанете неровно и впритык к следующему автомобилю. Поэтому сдайте назад, одновременно выравнивая автомобиль. Если вы паркуетесь с той же стороны, как и автомобиль на рис. 4, то вам нужно вывернуть руль вправо и сдавать назад, постепенно возвращая руль в положение «прямо» (если вы паркуетесь с другой стороны дороги – тогда руль нужно будет выворачивать влево).

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

• Затем сдаем назад и выравниваем машину – ваша машина стоит ровно (ну, практически ровно).

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

Рис. 5. Параллельная парковка задним ходом.


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

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

Перпендикулярная парковка. Заезд в гараж

Казалось, что тут сложного? Выровнял машину перпендикулярно дороге и ровно заехал, стараясь никого не задеть. Ясно, что нужно знать габариты машины, чтобы можно было не только заехать, не сломав зеркала заднего вида, но и чтобы можно было выйти из машины. Но что делать, если место ограниченно? Например, напротив парковки стена или второй ряд машин (что часто бывает на стоянке). Тогда вам поможет разобраться траектория, изображенная на рис. 6.

Рис. 6. Перпендикулярная парковка.


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

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

Парковка под углом к проезжей части

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


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

Запуск интерпретатора Перл | Владимир Викторович Маслов

Синтаксис:

perl [ключи] файл аргументы

Перед стартом Перл ищет скрипт (программу) в следующем порядке:

1. В командной строке если указан ключ '-e'

2. Содержимое файла указанного в командной строке. В первой строке можно указывать #!/usr/bin/perl для «автоматического» запуска скрипта.

3. Стандартный ввод/вывод если не указан файл или аргументы содержащие имя файла. Для передачи аргументов скрипту из стандартного потока имя файла в командной строке обозначается символом '-'.

В методах 1 и 2 Перл сканирует строки начиная с первой если не указан ключ '-x', в противном случае началом программы считается строка с символами '#!' в начале и содержащая слово 'perl'.

Концом программы считается строка '__END__'.

В строке с '#!' можно указывать и ключи. Например '#!/bin/perl -d' для отладки программ.

После «обнаружения» скрипта Перл компилирует его целиком во внутреннее представление. Если обнаруживаются ошибки то выполнение прекращается. Если ошибок нет он выполняется. Если скрипт заканчивается без команд exit() или die() то по умолчанию выполняется команда exit(0) обозначающая нормальное завершение программы.

Ключи:

-Oцифры

Код символа-разделителя записей. По умолчанию \0.

-a

Включает режим автоматического разделения (split) переменной $_ в массив $F. Применяется с ключами -n и -p.

-c

Выполняется синтаксическая проверка скрипта и выход без запуска.

-d

Запуск в режиме интерактивной отладки.

-Dчисло или Dсписок

Установить флаги отладки Перл. Например -d14 проследить как Перл исполняет вашу программу.

1 p Синтаксический разбор

2 s Состояние стека

4 l Состояние стека имен

8 t Трассировка исполнения

16 o Создание оператора узла

32 c Строковое/числовое преобразование

64 p Вывод команды препроцессора для -P

128 m Распределение памяти

256 f Обработка формата

512 r Синтаксический разбор регулярных выражений

1024 x Дамп синтаксического дерева

2048 u Проверка защиты

4096 L «Утечка» памяти

8192 H Дамп хеша

16384 X Распределение scratchpad

32768 D Очистка

-e команда

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

-F шаблон

Указывает шаблон разделения в режиме работы с ключом -a

-iрасширение

Применяется для резервной копии файла обрабатываемого оператором '<>'. Оригинал хранится в файле с тем же именем что и исходный, но с указанным расширением.

Пример:

perl -p -i.old -e «s/рядовой/ефрейтор/» file

– Поменять все слова «рядовой» на «ефрейтор» в файле file

а оригинал записать в файле file.old

-Iдиректория

Директория includ- файлов для С препроцессора. Применяется с ключом –P

по умолчанию это /usr/include и /usr/lib/perl.

-lчисло


Автоматическая обработка символа конца строки.

Работает в двух случаях.

1. Отбрасывает последний символ читаемых строк для режимов -n и -p

2. Присваивает указанное значение переменной $\. Таким образом к концу каждой строки выводимой оператором print добавляется этот символ.

-n

Зацикливает скрипт и последовательно обрабатывает файлы указанные в командной строке. Позволяет создавать команды подобные sed или awk.

Операторы BEGIN и END дают возможность делать начальные и конечные установки. Содержимое файлов не выводится.

-p

То же что и -n но печатает обрабатываемые строки файлов.

-P

Предварительная обработко препроцессором языка С. Будьте внимательны и не применяйте в комментариях слова 'if', 'else' или 'define' т.к. это команды С – препроцессора.

-s

Включение режима обработки ключей командной строки запуска скрипта.

Все аргументы с символом '-' в начале, считаются ключом и переменным с таким же именем присваивается значение true.

-S


Использование системной переменной PATH для поиска скрипта.

Данный ключ применяется в системах не воспринимающих последовательность "#!" в начале скрипта для указания интерпретатора.

-T

Режим проверки «дыр» в защите. Обычно это нужно для программ работающих в режиме повышенной привелегии (setuid, setguid). Желательно для CGI скриптов.

-u

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

-U

Разрешение выполнять опасные операции. Например стереть директорию или выполнять явно не закрытую программу.

-v

Вывод номера версии Перл.

-w

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

-x директория

Режим запуска скрипта вставленного в файл содержащий обычный текст. Началом скрипта считаестся строка с символами '#!' в начале и содержащия слово perl. Концом – строка с '__END__'

Указанная директория становится текущей в момент исполнения. Если необходимо читать последующие строки то это лучше делать через указатель файла DATA.


Александр Ватаманюк, Концентратор

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

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

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

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

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

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

Существует два основных типа концентраторов.

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

Рис. 6.5. Внешний вид концентратора с фиксированным количеством портов


• Модульные концентраторы (рис. 6.6) состоят из блоков, которые устанавливают в специальное шасси и объединяют кабелем. Возможна также установка концентраторов, не связанных между собой общей шиной, например, когда существуют разные локальные сети, связь между которыми не принципиальна.

Рис. 6.6. Внешний вид модульного концентратора


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

Поскольку для создания сети в основном используют коаксиальный кабель и кабель на основе витой пары, соответственно существуют концентраторы с BNC– и RJ-45-портами.

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

Рис. 6.7. Внешний вид концентратора с консольным портом (в левой части)


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

Часто на концентраторе присутствует дополнительный порт, через который можно подключать другие сегменты сети. Например, к сети стандарта 100Base-TX можно подключить сеть или сегмент со стандартом 10Base-2.


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

Андрей Киселев | 3.4.2. Просмотр списка ip-адресов с помощью утилиты ip

[ahu@home ahu]$ ip address show

1: lo: <LOOPBACK,UP> mtu 3924 qdisc noqueue

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo

2: dummy: <BROADCAST,NOARP> mtu 1500 qdisc noop

    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

3: eth0: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1400 qdisc pfifo_fast qlen 100

    link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.1/8 brd 10.255.255.255 scope global eth0

4: eth1: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast qlen 100

    link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff

3764: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP> mtu 1492 qdisc pfifo_fast qlen 10

    link/ppp

    inet 212.64.94.251 peer 212.64.94.1/32 scope global ppp0

Этот листинг содержит более подробную информацию. Здесь показаны все IP-адреса, и каким интерфейсам они принадлежат. Здесь "inet" соответствует термину "Internet (IPv4)". Существует целый ряд типов сетевых адресов, но нас они пока не интересуют.

Взглянем поближе на интерфейс eth0. Из листинга видно, что ему назначен адрес "inet" — 10.0.0.1/8, где "/8" определяет число бит, соответствующих адресу сети. Таким образом, для адресации хостов в сети у нас остается 32 – 8 = 24 бита, что соответствует адресу сети – 10.0.0.0 и маске сети – 255.0.0.0.

Это говорит о том, что любой хост в этой сети, например 10.250.3.13, будет непосредственно доступен через наш интерфейс с IP-адресом 10.0.0.1.

Для ppp0 применима та же концепция, хотя числа в IP-адресе отличаются. Ему присвоен адрес — 212.64.94.251, без маски сети. Это означает, что он обслуживает соединение типа "точка-точка" (point-to-point), и что каждый адрес, за исключением 212.64.94.251, является удаленным. Но и это еще не все. Для этого интерфейса указывается адрес другого конца соединения — 212.64.94.1. Здесь число "/32" говорит о том, что это конкретный IP-адрес и он не содержит адреса сети.

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

Вы наверняка обратили внимание на слово "qdisc". Оно обозначает дисциплину обработки очереди (Queueing Discipline). Позднее мы коснемся этой темы подробнее.


Менеджеры для мобильных телефонов. Виталий Петрович Леонтьев

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

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

Проще всего обладателям коммуникаторов и смартфонов на базе Windows Mobile – все необходимое для работы с ними уже встроено в операционную систему Windows Vista. У владельцев телефонов на базе Symbian (Nokia, Sony) или MacOS (IPhone) тоже не должно быть проблем – в комплект поставки любого телефона обязательно включена программа синхронизации вроде PCSuite. Однако стандартные программы, как водится, страдают от чрезмерной полноты и работают довольно медленно. Поэтому в определенных случаях нам стоит выбрать альтернативные программы. Особенно это актуально для тех, кто использует коммуникатор или смартфон в связке с ноутбуком – тут вопрос быстродействия и компактности выходит на первый план.


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

Резюме / Джесс Либерти

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

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

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

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

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

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

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

В стандартной библиотеке C++ используется пространство имен std. Однако избегайте использования оператора using, открывающего доступ ко всем идентификаторам стандартной библиотеки. Воспользуйтесь лучше объявлениями с ключевым словом using.


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

Настоящая работа. Евгений Зуев

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

Все было по-другому. Вечером мы запускали тестовый прогон, утром (если наш жалкий SparcClassic или монструозный диск Maxtor на 300 Мбайт за ночь не дал сбой) получали протоколы тестирования, разбирали "по принадлежности" непрошедшие тесты, и начиналась настоящая программистская работа?—?поиск и исправление ошибок.

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

Первые тестовые прогоны были кошмарны: на половине тестов компилятор выдавал вереницы жутких диагностических сообщений, которые, казалось, никогда не должны появляться, другие аварийно заканчивались знаменитой диагностикой "core dumped", те тесты, которым все-таки удалось прорваться сквозь компилятор, при исполнении выдавали неверные результаты, и лишь единицы завершались скромной фразой "test passed". Казалось, не в силах человеческих разобраться в этой каше. Однако, капля камень точит.

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

А тут еще в самый разгар работы, когда ошибки щелкаются одна за другой, компилятор на глазах выздоравливает, словно от тяжелой болезни,-- приходит новая версия стандарта. Значит, надо опять смотреть, что изменилось. Ладно если вводится новая языковая возможность, это может быть несложно в реализации и даже приятно: когда ни у Borland, ни у gcc еще не были реализованы описатель mutable или булевский тип, у нас уже все работало. Хуже, если уточняются детали семантики хорошо известных конструкций, что, как правило, влечет за собой переделку базовых алгоритмов. Так, общий алгоритм сравнения типов, алгоритм обработки совместно используемых функций (одноименных функций, различающихся числом и типами параметров) и в особенности, алгоритмы, реализующие правила вызова деструкторов и обработки исключений переделывались после почти каждой новой версии предварительного стандарта. Понятно, что каждая такая переделка работающей программы вызывает поток новых ошибок, и мы откатываемся на месяц назад…

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

А интересно, как тестирует свои компиляторы Watcom?

(обратно)

17.4.1 Зачем вообще нужно компилировать ядро?. Виктор Алексеевич Костромин

Как было сказано в начале данного раздела, основная функция ядра состоит в том, чтобы обеспечить взаимодействие с аппаратурой компьютера. Обслуживание некоторых составляющих аппаратного обеспечения (таких, как память, например) напрямую встроено в ядро. Для тех частей аппаратуры, которые могут быть нестандартными, имеются драйверы устройств, которые обеспечивают взаимодействие ОС с аппаратурой. Большинство пользователей компьютеров с ОС Windows знакомы с понятием драйвера хотя бы потому, что после установки нового оборудования они вынуждены устанавливать и программные драйверы для этого оборудования. Только после этого становится возможным использовать вновь установленную аппаратную составляющую. В терминологии, принятой в Linux, драйвера называются "модулями". Таким образом, поддержка аппаратных устройств может быть обеспечена двумя способами: либо путем встраивания такой поддержки в ядро, либо путем использования соответствующего модуля (драйвера).

Компании, которые выпускают дистрибутивы Linux (такие как RedHat, Caldera, Debian и т. д.) вынуждены встраивать в ядро поддержку как можно более широкого спектра устройств, потому что они не могут заранее знать, какие устройства (модели устройств) будут установлены на компьютере конкретного пользователя. Поддержка в ядре широкого спектра устройств облегчает установку и поддержку системы для покупателей, избавляя их от ненужных сложностей.

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

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

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

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

Я был вынужден заниматься установкой ядра из исходных кодов потому, что система виртуальных машин VMware отказалась работать с установленным у меня ядром 2.2.16, сообщив, что эта версия ядра не поддерживает работу с CDROM из VMware, и предложив мне либо установить более позднюю версию ядра, либо вернуться к версии 2.2.15. Попытки установить новую версию ядра из rpm-пакетов тоже не решили проблему, потому что конфигурационный скрипт VMware сообщал, что ему не хватает header-файлов. Установка пакетов kernel-headers (полностью соответствующих ядру) тоже не привела к успеху, вот и пришлось сделать попытку установить ядро из исходных текстов.

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

Я экспериментировал на версии 2.2.16-22 из свежеустановленного дистрибутива ASPLinux Release Candidate 3 и устанавливал ядро версии 2.4.2. Поэтому все примеры в данной главе приводятся для случая, когда система уже работает на ядре версии 2.2.x и вы пришли к решению установить ядро версии 2.4.x.


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

Опоры / Валентин Викторович Красник

Вопрос. Какие типы опор следует применять для ВЛ?

Ответ. Следует применять следующие типы опор (могут быть выполнены из различных материалов):

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

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

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

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

Опоры, на которых выполняются ответвления от ВЛ, называются ответвительными; опоры, на которых выполняется пересечение ВЛ разных направлений или пересечение ВЛ с инженерными сооружениями, называются перекрестными. Эти опоры могут быть всех указанных типов (2.4.50).

Вопрос. Возможность установки каких аппаратов должны обеспечивать конструкции опор?

Ответ. Должны обеспечивать возможность установки:

светильников уличного освещения всех типов;

концевых кабельных муфт;

защитных аппаратов;

секционирующих и коммутационных аппаратов; шкафов и щитков для подключения электроприемников (2.4.51).

Вопрос. Какими могут быть опоры (по исполнению) независимо от их типа?

Ответ. Могут быть свободностоящими, с подкосами или оттяжками.

Оттяжки опор могут прикрепляться к анкерам, установленным в земле, или к каменным, кирпичным, железобетонным и металлическим элементам зданий и сооружений. Сечение оттяжек определяется расчетом; оно должно быть не менее 25 мм2 (2.4.52).

Вопрос. На какие нагрузки должны быть рассчитаны промежуточные опоры?

Ответ. Должны быть рассчитаны на следующие сочетания нагрузок:

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

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

на условную расчетную нагрузку, равную 1,5 кН, приложенную к вершине опоры и направленную вдоль оси ВЛ (2.4.53).

Вопрос. На какую нагрузку должны быть рассчитаны угловые опоры (промежуточные и анкерные)?

Ответ. Должны быть рассчитаны на результирующую нагрузку от тяжения проводов и ветровую нагрузку на провода и конструкцию опоры (2.4.53).

Вопрос. На какую нагрузку должны быть рассчитаны анкерные опоры?

Ответ. Должны быть рассчитаны на разность тяжения проводов смежных пролетов и поперечную нагрузку от давления ветра при гололеде и без гололеда на провода и конструкцию опоры. За наименьшее значение разности тяжения следует принимать 50 % наибольшего значения одностороннего тяжения всех проводов (2.4.53).

Вопрос. На какую нагрузку должны быть рассчитаны концевые и ответвительные опоры?

Ответ. Концевые опоры должны быть рассчитаны на одностороннее тяжение всех проводов. Ответвительные опоры рассчитываются на результирующую нагрузку от тяжения всех проводов (2.4.53).


Символы / Джесс Либерти

Символьные переменные (типа char) обычно занимают один байт, этого достаточно для хранения 256 значений печатаемых символов (см. приложение В). Значение типа char можно интерпретировать как число в диапазоне 0—255, или символ ASCII. Набор символов ASCII и его эквивалент ISO (International Standards Organization — Международная организация по стандартизации) представляют собой способ кодировки всех букв, цифр и знаков препинания.

Например, в коде ASCII английской строчной букве "а" присвоено значение 97. Всем прописным и строчным буквам, всем цифрам и знакам препинания присвоены значения от 1 до 128. Дополнительные 128 знаков и символов зарезервированы для расширения возможностей компьютера, хотя расширенный набор символов IBM стал уже чем-то вроде стандарта.


Примечание:ASCII обычно произносится как "аскей".


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