Эта электронная книга - попытка рассмотреть все наиболее распространенные современные методы управления промышленным предприятием. Для большинства российских предприятий, стремящихся успешно развиваться и конкурировать не только на внутреннем, но и на внешнем рынке, сейчас самое время узнать, как наиболее эффективно управлять предприятием.
Точно вовремя (Just-In-Time, JIT) - концепция управления промышленными предприятиями, широко использующаяся на промышленных предприятиях различного профиля и различного размера во всем мире. Эта книга - попытка рассмотреть все наиболее распространенные современные методы управления промышленным предприятием. Для большинства российских предприятий, стремящихся успешно развиваться и конкурировать не только на внутреннем, но и на внешнем рынке, сейчас самое время узнать, как наиболее эффективно управлять предприятием. В книге рассматриваются эволюция систем управления - от самых простых методов к более сложным (MRP II - планирование производственных ресурсов), новые, только получающие широкое распространение компьютерные системы (APS-системы, или системы синхронного планирования и оптимизации производственных процессов), теория ограничений и теория `Точно вовремя`, некоторые практические аспекты использования корпоративных компьютерных систем (ERP-систем), а также место ERP-систем в информационном пространстве предприятия и возможности интеграции ERP-систем с другими системами (бухгалтерскими, CAD/CAM, PDM-системами). Значительное место в книге занимают вопросы организации проекта внедрения описанных методов управления и поддерживающих их компьютерных систем. Рассматривается тактика выбора системы, подходящей предприятию, а также вопросы организации проекта успешного внедрения.
dBASE и Paradox таблицы имеют в своем арсенале BLOB-поля, позволяющие хранить бинарные данные, в том числе bitmap-формат, отображаемый с помощью компонента TDBImage. В Database Desktop данный тип полей указан как Binary и Graphic (для dBASE и Paradox таблиц, соответственно). Тем не менее, процесс сохранения изображений в InterBase BLOB-полях и их использование в компонентах TDBImage не такой уж простой.
Таблицы InterBase не имеют простого типа BLOB-поля. Есть три варианта, или подтипа: тип 0, тип 1 и подтип, определенный пользователем. Типы 0 и 1 - "встроенные" типы. Тип 0 - BLOB-поля (тип по умолчанию) для хранения общих бинарных данных. Тип 1 - BLOB-поля для хранения текстовых BLOB-данных. Ни один из предопределенных типов не допускает автоматического извлечения данных изображения из BLOB-поля для его последующего отображения в компоненте TDBImage. BLOB-поля типа 0 могут использоваться для хранения данных bitmap-формата, но данные должны извлекаться и передаваться в объект типа TBitmap программным путем. Вот пример ручного извлечения данных изображения, хранящихся в BLOB-поле типа 0 (Table1BLOBField), и его показ в компоненте TImage (не предназначенным для работы с БД) :
Естественно, поскольку это должно делаться вручную, данный процесс менее желателен в приложении, нежели автоматическое отображение данных изображения в комбинации BDE и компонента TDBImage. Здесь происходит определение подтипа определенного пользователем BLOB-поля. При работе с данными подтип BLOB-поля учитывается, т.к. сохраненные первыми данные устанавливают тип данных для этого поля для всей таблицы целиком. Таким образом, если данные bitmap-формата оказывается первым загружаемым типом, то данный формат будет единственно возможным для данного поля. До сих пор по умолчанию тип бинарного BLOB-поля (предопределенный тип 0) позволял BDE читать и отображать данные в компоненте TDBImage без особых проблем.
Утилиты Database Desktop допускают создание бинарных BLOB-полей только типа 0 и не имеют возможности самим определять подтипы BLOB-полей. Из-за такого ограничения таблицы, подразумевающие хранение и вывод изображений, должны создаваться с помощью SQL-запросов. Обычно это делается посредством утилиты WISQL, но вполне достаточно выполнение SQL-запроса с помощью компонента TQuery. Ниже приведен SQL-запрос, создающий таблицу с определенным пользователем подтипом BLOB-поля:
После создания таблицы с совместимыми BLOB-полями, для хранения данных изображения в BLOB-поле и его вывода в компоненте TDBImage используются те же самые методы, что и при работе с таблицами dBASE и Paradox.
Имеется множество способов загрузки изображений в BLOB-поле. Три самых простых метода включают в себя:
копирование данных из буфера обмена Windows в компонент TDBImage, связанный с BLOB-полем
использование метода LoadFromFile компонента TBLOBField
использование метода Assign для копирования объекта типа TBitmap в значение свойства Picture компонента TBDBImage.
Первый способ, когда происходит копирование изображения из буфера обмена, вероятно, наиболее удобен в случае, когда необходимо добавить изображение в таблицу при использовании приложения конечным пользователем. В этом случае компонент TDBImage используется в роли интерфейса между BLOB-полем таблицы и изображением, хранящимся в буфере обмена. Метод PasteFromClipboard компонента TDBImage как раз и занимается тем, что копирует изображение из буфера обмена в TDBImage. При сохранении записи изображение записывается в BLOB-поле таблицы.
Поскольку буфер обмена Windows может содержать данные различных форматов, то желательно перед вызовом метода CopyFromClipboard осуществлять проверку формата хранящихся в нем данных. Для этого необходимо создать объект TClipboard и использовать его метод HasFormat, позволяющий определить формат хранящихся в буфере данных. Имейте в виду, что для создания объекта TClipboard вам необходимо добавить модуль Clipbrd в секцию uses того модуля, в котором будет создаваться экземпляр объекта.
Вот исходный код примера, копирующий содержание буфера обмена в компонент TDBImage, если содержащиеся в буфере данные имеют формат изображения:
Второй способ заполнения BLOB-поля заключается в загрузке изображения непосредственно из файла в BLOB-поле. Данный способ одинаково хорош как при создании приложения (формирование данных), так и при его использовании.
Этот способ использует метод LoadFromFile компонента TBLOBField, который применяется в Delphi для работы с dBASE-таблицами и двоичными Windows полями или таблицами Paradox и графическими Windows полями; в обоих случаях с помощью данного метода возможно загрузить изображение и сохранить его в таблице.
Методу LoadFromFile компонента TBLOBField необходим единственный параметр типа String: имя загружаемого файла с изображением. Значение данного параметра может быть получено при выборе файла пользователем с помощью компонента TOpenDialog и его свойства FileName.
Вот пример, демонстрирующий работу метода LoadFromFile компонента TBLOBField с именем Table1Bitmap (поле с именем Bitmap связано с таблицей TTable, имеющей имя Table1):
Третий способ для копирования содержимого объекта типа TBitmap в свойство Picture компонента TDBImage использует метод Assign. Объект типа TBitmap может быть как свойством Bitmap свойства-объекта Picture компонента TImage, так и отдельного объекта TBitmap. Как и в методе, копирующем данные из буфера обмена в компонент TDBImage, данные изображения компонента TDBImage сохраняются в BLOB-поле после успешного сохранения записи.
Ниже приведен пример, использующий метод Assign. В нашем случае используется отдельный объект TBitmap. Для помещения изображения в компонент TBitmap был вызван его метод LoadFromFile.
TField-компоненты (или, точнее, потомки компонента TField с соответствующим типом поля) могут создаваться во время проектирования программы с помощью Fields Editor (редактора полей). Fields Editor вызывается двойным щелчком на иконке компонента TTable или TQuery. Но потомки TField могут быть созданы и удалены и в режиме выполнения программы.
Потомки компонента TField (такие как, например, TStringField, TIntegerField и др.) создаются методом Create для того типа потомка TField, который подходит к соответствующему полю набора данных. Другими словами, для поля строкового типа текущего набора данных необходимо вызвать метод Create класса TStringField, являющегося потомком TField. Методу Create необходим один параметр - владелец потомка TField, расположенный на TForm. После создания компонента наследника TField для того, чтобы новый экземпляр объекта мог установить связь с необходимым полем набора данных, необходимо установить несколько ключевых свойств. Вот их список:
Index: позиция компонента-потомка TField в массиве TFields (свойство Fields компонента TTable или TQuery, с которым будет связан TField).
DataSet: компонент TTable или TQuery, с которым будет связан TField.
Приведенный ниже код демонстрирует способ создания TStringField. TForm названа Form1 (здесь ссылка на переменную Self), активный набор данных TQuery имеет имя Query1 и поле, для которого создается компонент TStringField, расположено в таблице dBASE с именем CO_NAME. Новый потомок TField будет вторым TField в свойстве-массиве Fields компонента Query1. Имейте в виду, что набор данных, связанный с новым потомком TField (в нашем случае Query1), перед добавлением TField должен быть закрыт, а после добавления вновь открыт.
Вышеприведенный пример создает новый TStringField с именем Query1CO_NAME.
Для удаления существующего потомка TField достаточно вызова метода Free данного компонента. В примере, приведенном ниже, метод TForm FindComponent используется для получения указателя на компонент TStringField с именем Query1CO_NAME. Возвращаемая функцией FindComponent величина в случае успешного завершения будет иметь тип TComponent или nil в противном случае. Возвращаемое значение может использоваться для того, чтобы определить, действительно ли существует компонент до того, как будет применен метод Free.
Как и при создании TField, набор данных, связанный с потомком TField и активный в настоящий момент, перед вызовом данного метода должен быть закрыт и впоследствии вновь активирован.
chmod играет важную роль при программировании на языке php. Особого внимания заслуживают случаи работы с файлами, особенно при настройке движков сайтов (CMS), форумов, гостевых книг и пр. Заметим, что chmod используется языком php только в Unix-подобной операционной системе, для которой и описаны приведенные ниже примеры. Заметим, что хостинг, в основном, базируется на Unix-подобной операционной системе.
В этих примерах показаны только принципы программирования в php при работе с chmod. В силу особенностей языка php права доступа в нем записывается только в числовом формате, поэтому рекомендуем символьный формат chmod предварять символом 0.
Читатели должны осознавать тот факт, что при программировании они должны использовать функции для определения наличия проверяемого файла, наличия переменных, приведения типов и пр.
Изменение chmod
chmod можно выставлять средствами языка php. Это можно делать только на уровне файловой системы сервера; изменение chmod для удаленных файлов не допускается.
Функция chmod() пытается изменить права доступа для filename на указанные в параметре mode. В случае успешного завершения функция возвращает true, в случае ошибки функция возвращает false. Поскольку числовой формат записи chmod является восьмеричным числом значение параметра mode рекомендуется предварять симоволом 0.
В указанном примере первая функция установит chmod 644 для файла /contacts/index.php. Вторая функция возвратит false, так как нельзя указавать в качестве параметра удаленные файлы. Третья функция установит chmod 467 для каталога /contacts/; во избежание недоразумений лучше всегда записывать в качестве второго параметра восьмеричное число, предваряя его симоволом 0. Четвертая фунция возвратит false, так как в качестве второго параметра обятельно надо указывать числовое значение.
Определение chmod
Для определения chmod воспользуемся функцией fileperms().
Функция fileperms() возвращает информацию о filename либо false в случае ошибки. Заметим, что получение информации об удаленных файлах не допускается.
Функция fileperms() возвращает больше информации, чем нам требуется (ее мы не будем затрагивать). Нам требуется определить последние 9 бит. Для этого воспользуемся логическим оператором & и функцией decoct().
Обращаем внимание, что функция decoct() возвращает переменную строкового типа (в которой записаны права доступа в числовом формате), поэтому при использовании полученных результатов в функции chmod() необходимо либо использовать функцию octdec(), либо не использовать функцию decoct(). Приведенные ниже два примера эквивалентны.
В приведенном выше примере в переменной $perms записана строка, состоящая из трех символов. Данный способ необходимо использовать в случаях, когда необходимо получить chmod в числовом формате, а затем использовать переменную для изменения chmod.
Данный пример предпочтительнее предыдущему, его необходимо использовать в случаях, когда переменная $perms используется исключительно для изменения прав доступа без промежуточных действий.
Ваш сайт доходчиво объясняет посетителям, что заказывать нужно именно у вас, а не у ваших конкурентов? На нем хорошо видны контакты, а сделать заказ легко? Есть ли у вас возможность отслеживания активности посетителей и коэффициента конверсии? И последнее: вы знаете, сколько стоит ваш посетитель? Если вы смело можете ответить "да" на эти воспросы - ваш сайт готов к приему посетителей. Если нет - проработайте их, иначе много денег будут уходить впустую.
Все хотят "бесплатный" (поисковый) трафик, но находиться в топе поисковых систем - очень трудоемкое занятие. Однако, если вы создадите богатый контентом сайт и последуете советам из этого списка, ваш трафик будет увеличиваться сам собой и PR будет расти.
*Pay-Per-Click (PPC) - оплата за клики. Трафик с PPC-систем можно получить почти мгновенно! Google и Overture (теперь еще и Yahoo) - вот основные источники PPC-трафика, но можно попробовать и FindWhat.com. На что следует обратить внимание: Держите в голове цену своего посетителя, ставьте объявления по сотням неконкурентным ключевым словам и фразам, и отслеживайте статистику по каждому слову или фразе отдельно.
*Распространяйте свой контент в сети - пишите полезные статьи, интересные целевой аудитории. Распространяйте их среди веб-мастеров, разрешите им перепечатывать ваши тексты в обмен на размещение ссылки на ваш ресурс вида "источник: " или "по материалам сайта: ". Распространяйте ваши статьи и через каталоги статей, электронные журналы и ваш блог. На что следует обратить внимание: полезное, по возможности уникальное, содержание статей.
*Публикуйте свои пресс-релизы - периодически публикуйте пресс-релизы с новостями, которые будут интересны вашей целевой аудитории и вашим потенциальным покупателям. Поскольку пресс релизы это, фактически, новости, они публикуются быстро, и вы можете так же быстро заполучить сотни ссылок на свой сайт. На что следует обратить внимание: желательно писать пресс-релиз из 300-500 слов, и включить в него ссылку на свой ресурс. Желательно доверить распространение релизов профессионалам, которые смогут оптимизировать их по ключевым словам.
*Сделайте блог с RSS - чтобы приносить пользу, блог должен часто пополняться новыми материалами. Пусть ваш блог содержит информацию, полезную для ваших покупателей, но не заостренную на продажах и специальных предложениях. Последнее нужно делать очень аккуратно, мы советуем вообще заострять на продажах внимание, если не можете посвятить этому достаточное количество времени. Seth Godin говорит, что составляющие успешного блога это: (1) Беспристрастность, (2) Мгновенное реагирование, (3) Своевременность, (4) Тематичность - коротко и "в кассу", и (5) Дискуссия, полемика. На что следует обратить внимание: блог должен быть интересен посетителям, добавьте его во все каталоги блогов, проверяйте ваши блоговые посты в поисковиках, распространяйте свой контент через RSS.
*Набирайте односторонние входящие ссылки - все вышеперечисленное создаст хорошие входящие односторонние ссылки на ваш сайт, хотя Вы можете дополнительно покупать ссылки на других сайтах, напрямую и через биржи ссылок. Не занимайтесь обменом ссылками - от этого уже никакого толка. Убедитесь, что ссылки на ваш сайт ведут со страниц, PR которых выше 0. Если у страницы PR0, возможно Google пессимизировал ее по каким-либо причинам, в результате ссылка может нести в себе отрицательную силу. На что следует обратить внимание: удостоверьтесь, что в текстах входящих ссылок есть ключевые слова, и что ссылки текстовые. Ссылки должны быть с тематических и околотематических сайтов, а не с линкопомоек или немодерируемых каталогов. Лучшие ссылки - со страниц, количество ссылок на которых невелико.
*Разрешите другим сайтам использовать ваши материалы. Разрешайте им делать это до тех пор, пока они будут ссылаться на вас. Это позволит вам получить одностороннюю ссылку с сайтов, который бы не согласились поставить ее в других случаях. На что следует обратить внимание: старайтесь вести диалог с вебмастерами кратко, и по делу.
*Реклама через E-mail - Рекламируйтесь в электронных журналах, размещайте рекламу в почтовых рассылках, если среди получателей есть ваша целевая аудитория. На что следует обратить внимание: внимательно отслеживайте эффективность рассылок.
*Используйте возможности партнеров по бизнесу. Рекламируйтесь, используя базу клиентов ваших партнеров. John Reese продал информационный товара на $1 млн. за 24 часа, используя только базу клиентов своих партнеров, рассылая им свои предложения. Он платил партнерам 50% с продаж. На что обратить внимание: нужно знать цену своего посетителя, и хорошо проверить в действии точку продаж перед тем, как обращаться к партнерам с предложениями.
*Заведите партнерскую программу. Если Вы продаете что-нибудь, предложите партнерам комиссию за каждого привлеченного покупателя. Ссылки с сайтов партнеров будут приводить на сайт посетителей, а также увеличивать вес сайта в глазах поисковиков. На что следует обратить внимание: предложение должно быть привлекательным, обеспечьте партнеров всеми рекламными и сопуствующими материалами, дайте им доступ к статистике, чтобы они могли отслеживать переходы и активность посетителей самостоятельно, сделайте регистрацию в партнерской программе легкой. Дайте им проверенные баннеры, рекламные письма и другой инструментарий, облегчающий их задачу.
*Покупайте готовые, хорошо раскрученные сайты. Найдите сайты, которые занимают высокие позиции по вашим запросам в поисковиках, проверьте качество трафика через владельцев этих сайтов и принимайте решение о покупке. Позаботьтесь о том, чтобы права собственности на домен полностью принадлежали Вам. Вы можете разрешить бывшим владельцам использовать контент сайта, если хотите. Проверьте deleteddomains.com на предмет доменов, брошенных владельцами, которые можно зарегистрировать всего за несколько долларов. На что обратить внимание: проверьте Google PR, Alexa rank, и бэклинки сайтов до их покупки. (Я знал одного продавца, который поспорил с профессиональными оптимизаторами на предмет того, кто займет самое высокое место в поисковике за 24 часа. Он выиграл спор, просто купив сайт, который занимал первое место).
И напоследок то, с чего начинается большинство статей...
*Поисковая оптимизация (SEO). Здесь есть много технических моментов, которые следует изучить, если Вы собираетесь оптимизировать сайт самостоятельно, поэтому я советую нанять профессионала, который все сделает за вас. Не доверяйте тем, кто гарантирует вам первые места, потому что нельзя гарантировать высокие позиции в Google или Yahoo, потому что алгоритмы постоянно меняются. (Они могут гарантировать места в топе по словосочетаниям типа названия вашей компании, но это не конкурентная фраза, и она не принесет особого толка). Дизайн и структура вашего сайта - также обратите на это внимание.
3 кита поисковой оптимизации это:
*Контент
*Тематические внешние ссылки с хорошим PR
*Правильный дизайн сайта
Все перечисленное в этих 10 пунктах помогает и с контентом, и с односторонними входящими ссылками, поэтому остается только хороший дизайн. На что следует обратить внимание: не думайте о сайте как об одной странице, думайте о сайте как о сотне оптимизированных страниц, с определенной тематикой и интересных целевой аудитории.
В состав библиотеки MFC входит ряд классов, представляющих стандартные диалоговые панели. Эти классы позволяют легко реализовать такие часто используемые операции, как открытие и сохранение файла, выбор цвета, выбор шрифта и т.д. Все эти классы наследуются от CCommonDialog, который в свою очередь является производным по отношению к базовому классу CDialog.
Приведем классы стандартных диалоговых панелей и их назначение:
CColorDialog - Панель для выбора цвета
CFileDialog - Панель выбора файлов для открытия и сохранения на диске
CFindReplaceDialog - Панель для выполнения операции поиска и замены
CFontDialog - Панель для выбора шрифта
CPrintDialog - Панель для вывода документа на печать
CPageSetupDialog - Панель выбора формата документа
COleDialog - Панель для управления технологией OLE
Классы, управляющие стандартными диалоговыми панелями, определены в файле afxdlgs.h. Поэтому при использовании этих классов в приложении необходимо включить этот файл в исходный текст при помощи директивы #include.
Панель выбора цвета (класс CColorDialog)
Чтобы отобразить на экране стандартную диалоговую панель выбора цвета, надо создать объект класса CColorDialog, а затем вызвать метод DoModal. При создании объекта класса СColorDialog используется следующий конструктор:
Все параметры конструктора необязательны, однако в некоторых случаях использование этих параметров может помочь.
Первый параметр clrInit позволяет указать цвет, выбранный по умолчанию сразу после открытия диалоговой панели. Если параметр не будет указан, в качестве цвета, выбранного по умолчанию, будет использоваться черный цвет.
Параметр dwFlags содержит набор флагов, управляющих диалоговой панелью выбора цвета. При помощи него блокировать или разрешать работу некоторых элементов управления диалоговой панели выбора цвета. Если при создании объекта класса CColorDialog не указать параметр dwFlags, тем не менее можно выполнить настройку диалоговой панели, обратившись непосредственно к элементу m_cc данного класса. Параметр dwFlags, указанный в конструкторе, используется для инициализации m_cc. Изменения в элемент m_cc должны быть внесены до того, как панель будет отображаться на экране.
Последний параметр pParentWnd можно использовать, чтобы указать родительское окно диалоговой панели.
Методы класса CСolorDialog
Чтобы вывести диалоговую панель выбора цвета на экран, необходимо использовать метод DoModal. После отображения панели на экране пользователь может выбрать из нее цвет и нажать кнопки OK или Cancel для подтверждения выбора цвета или отказа от него. Когда диалоговая панель закрывается, метод DoModal возвращается значения IDOK и IDCANCEL, в зависимости от того, какую кнопку нажал пользователь:
На экране появится стандартная диалоговая панель выбора цвета Color. В верхней половине диалоговой панели расположены 48 прямоугольников, имеющих различные цвета. Они представляют так называемые основные цвета (Basic colors). Можно выбрать один из этих цветов и нажать кнопку OK. После того, как диалоговая панель закрыта (метод DoModal завершил свою работу), можно воспользоваться методами класса CColorDialog, чтобы узнать цвета, выбранные пользователем.
Для определения цвета, выбранного пользователем, можно обратиться к методу GetColor класса CColorDialog. Данный метод возвращает значение COLORREF, соответствующее выбранному цвету.
Если пользователю недостаточно основных цветов, представленных в диалоговой панели Color, он может выбрать до 16 дополнительных цветов. Для этого он должен нажать кнопку DefineCustom Colors. Диалоговая панель изменит свой внешний вид - появятся дополнительные органы управления, позволяющие выбрать любой из 16 777 216 цветов. Когда цвет выбран, нужно нажать кнопку Add Custom Colors. Выбранный цвет будет добавлен к дополнительным цветам (Custom colors) - один из свободных прямоугольников окрасится соответствующим цветом.
При помощи метода GetSavedCustomColors класса CColorDialog можно определить дополнительные цвета, выбранные пользователем в диалоговой панели Color. Этот метод возвращает указатель на массив из 16 элементов типа COLORREF. Каждый элемент массива описывает один дополнительный цвет.
Когда диалоговая панель Color отображается приложением первый раз, все прямоугольники, отображающие дополнительные цвета, имеют белый цвет. Дополнительные цвета, выбранные пользователем, сохраняются во время работы приложения. После перезапуска приложения дополнительные цвета сбрасываются.
Панель выбора файлов (класс CFileDialog)
Среди стандартных диалоговых панелей, для которых в библиотеке MFC создан специальный класс, есть панели для работы с файловой системой - Open и Save As. Диалоговая панель Open позволяет выбрать один или несколько файлов и открыть их для дальнейшего использования. Диалоговая панель Save As позволяет выбрать имя файла для записи в него документа.
Для управления диалоговыми панелями Open и Save As предназначен один класс CFileDialog. Рассмотрим конструктор класса CFileDialog более подробно:
Объекты класса CFileDialog представляют диалоговые панели Open или Save As в зависимости от параметра bOpenFileDialog. Если параметр bOpenFileDialog содержит значение TRUE, то создается объект, управляющий диалоговой панелью Open, а если FALSE - диалоговой панелью Save As.
Параметр bOpenFileDialog является единственным обязательным параметром, который необходимо указать. Остальные параметры конструктора класса CFileDialog задают различные режимы работы панели и могут не указываться.
Чтобы создать объект класса CFileDialog , представляющий диалоговую панель для открытия файлов (mFileOpen), и объект, представляющий диалоговую панель для сохранения файлов (mFileSaveAs), можно воспользоваться следующими вызовами конструктора класса:
Во многих случаях имена файлов, которые нужно открыть или закрыть, имеют определенное расширение. Параметр lpszDefExt позволяет задать расширение файлов, используемое по умолчанию. То есть, если пользователь при определении имени файла не укажет расширение, имени файла автоматически присваивается расширение, принятое по умолчанию. Если при определении свойств диалоговой панели программист присвоит параметру lpszDefExt значение NULL, то расширение файлов должно задаваться пользователем явно.
В некоторых случаях требуется, чтобы диалоговые панели отображались с уже выбранным именем файла. Чтобы указать имя файла, используемое по умолчанию, применяется параметр lpszFileName. Если параметр lpszFileName имеет значение NULL, данная возможность не реализуется.
С помощью флага dwFlags можно изменить внешний вид и некоторые другие характеристики стандартных диалоговых панелей класса CFileDialog. В него можно записать комбинацию флагов, управляющих различными характеристиками этих панелей. Например, флаг OFN_HIDEREADONLY означает, что из диалоговой панели удаляется переключатель "Read Only", а флаг OFN_OVERWRITEPROMPT (используемый для панели Save As) - что необходимо выводить диалоговую панель с предупреждением, если пользователь выбирает для сохранения имя уже существующего файла.
Диалоговые панели выбора файлов обычно имеют список так называемых фильтров, включающих названия типов файлов и расширения имен файлов данного типа. Выбрав фильтр, пользователь указывает, что он желает работать только с файлами определенного типа, имеющими соответствующее расширение. Файлы с другими расширениями в диалоговых панелях не отображаются.
Список фильтров можно указать через параметр lpszFilter. Одновременно можно указать несколько фильтров. Каждый фильтр задается двумя строками - строкой, содержащей имя фильтра, и строкой, в которой перечислены соответствующие ему расширения имен файлов. Если одному типу соответствует несколько расширений, они разделяются символом ;. Строка, содержащая имя фильтра, отделяется от строки с расширениями файлов символом |. Если используется несколько фильтров, то они также отделяются друг от друга символом |. Например, в качестве строки, задающей фильтры, можно использовать строку вида:
Диалоговые панели, представленные объектами класса CFileDialog, могут иметь или не иметь родительского окна. Чтобы указать родительское окно, нужно передать конструктору CFileDialog указатель на него через параметр pParentWnd.
Методы класса CFileDialog
Создание объекта класса CFileDialog еще не вызывает отображения соответствующей диалоговой панели. Для этого необходимо воспользоваться методом DoModal класса CFileDialog.При вызове метода DoModal для ранее созданного объекта класса CFileDialog на экране открывается соответствующая диалоговая панель. После того, как пользователь завершает работу с диалоговой панелью, метод DoModal вернет значение IDOK или IDCANCEL в случае успешного завершения и нуль - в случае возникновения ошибок:
После того, как пользователь закроет диалоговую панель и метод DoModal вернет управление, можно воспользоваться другими методами класса CFileDialog , чтобы определить имена выбранных файлов:
GetPathName - Определяет полный путь файла
GetFileName - Определяет имя выбранного файла
GetFileExt - Определяет расширение имени выбранного файла
GetFileTitle - Позволяет определить заголовок выбранного файла
GetNextPathName - Если диалоговая панель позволяет выбрать сразу несколько файлов, то этот метод можно использовать для определения полного пути следующего из выбранных файлов
GetReadOnlyPref - Позволяет узнать состояние атрибута "только для чтения" (read-only) выбранного файла
GetStartPosition - Возвращает положение первого элемента из списка имен файлов
Наиболее важный метод - GetPathName. Он получает полный путь файла, выбранного из диалоговых панелей Open или Save As. Если диалоговая панель позволяет выбрать сразу несколько файлов, тогда метод GetPathName возвращает массив строк, состоящий из нескольких строк, заканчивающихся двоичным нулем. Первая из данных строк содержит путь к каталогу, в котором расположены выбранные файлы, остальные строки содержат имена выбранных файлов. Выделение строки, содержащей путь к каталогу, проблем не вызывает, а чтобы получить имена выбранных файлов, необходимо воспользоваться методами GetStartPosition и GetNextPathName.
[pagebreak]
Метод GetStartPosition возвращает значение типа POSITION. Оно предназначено для передачи методу GetNextPathName и получения очередного имени выбранного файла. Если пользователь не выбрал ни одного файла, метод GetStartPosition возвращает значение NULL. Значение, полученное этим методом, следует записать во временную переменную типа POSITION и передать ссылку на нее методу GetNextPathName. Метод GetNextPathName вернет полный путь первого из выбранных в диалоговой панели файлов и изменит значение переменной pos, переданной методу по ссылке. Новое значение pos можно использовать для последующих вызовов метода GetNextPathName и получения путей всех остальных выбранных файлов. Когда метод GetNextPathName вернет имена всех выбранных файлов, в переменную pos записывается значение NULL.
В панелях Open и Save As имеется переключатель "ReadOnly". По умолчанию этот преключатель не отображается. Если есть необходимость воспользоваться этим переключателем, то нужно отказаться от использования флага OFN_HIDEREADONLY.
Метод GetReadOnlyPref позволяет определить положение переключателя "ReadOnly". Если переключатель включен, то метод GetReadOnlyPref возвращает ненулевое значение. В противном случае GetReadOnlyPref возвращает нуль.
Панель выбора шрифта (класс CFontDialog)
Стандартная диалоговая панель Font предназначена для выбора шрифта. Эта панель отображает список шрифтов, установленных в системе, и позволяет выбрать название шрифта, его начертание и другие параметры.
Для управления диалоговой панелью Font в библиотеку классов MFC включен класс CFontDialog. Методы этого класса можно использовать для отображения панели Font и определения характеристик шрифта, выбранного пользователем. Конструктор класса CFontDialog:
Все параметры конструктора являются необязательными. Настройка стандартной панели выбора шрифта, которая выполняется конструктором класса CFontDialog по умолчанию, удовлетворяет большинству пользователей.
Параметр lplfInitial является указателем на структуру LOGFONT, описывающую логический шрифт. Если этот параметр используется, то в диалоговой панели по умолчанию будет выбран шрифт, наиболее соответствующий шрифту, описанному в структуре LOGFONT.
Параметр dwFlags задает набор флагов, управляющий различными режимами работы панели. Например, флаг CF_EFFECTS позволяет пользователю создавать подчеркнутые и перечеркнутые буквы, определять цвет букв, а флаг CF_SCREENFONTS - разрешает выбирать только экранные шрифты.
Через параметр pdcPrinter можно передать конструктору контекст отображения принтера, шрифты которого будут представлены в диалоговой панели Font. Данный параметр используется только в том случае, если в параметре dwFlags указаны флаги CF_PRINTERFONTS или CF_BOTH.
Через параметр pParentWnd можно указать родительское окно для диалоговой панели Font.
Методы класса CFontDialog
Для отображения диалоговой панели Font предназначен виртуальный метод DoModal. Если пользователь выбрал шрифт и нажал кнопку OK, метод DoModal возвращает идентификатор IDOK, если пользователь отменил выбор шрифта, метод DoModal возвращает идентификатор IDCANCEL:
Остальные методы класса предназначены для определения характеристик выбранного пользователем шрифта.
Метод GetCurrentFont позволяет сразу определить все характеристики выбранного шрифта, записав их в структуру LOGFONT.
Остальные методы класса позволяют определить только отдельные характеристики выбранного шрифта:
GetFaceName - Возвращает имя выбранного шрифта
GetStyleName - Возвращает имя стиля выбранного шрифта
GetSize - Возвращает размер выбранного шрифта
GetColor - Возвращает цвет выбранного шрифта
GetWeight - Возвращает плотность выбранного шрифта
IsStrikeOut - Определяет, является ли шрифт выделенным перечеркнутой линией
IsUnderline - Определяет, является ли шрифт выделенным подчеркиванием
IsBold - Определяет, является ли шрифт жирным
IsItalic - Определяет, является ли шрифт наклонным
Панель для вывода документов на печать (класс CPrintDialog)
Класс CPrintDialog можно использовать для создания двух видов диалоговых панелей, предназначенных для печати документов и выбора форматов документов. Кроме класса CPrintDialog можно также использовать класс CPageSetupDialog. Он позволяет создать диалоговую панель для выбора формата документа, имеющую несколько иной вид.
В приложениях, подготовленных с использованием средств MFC AppWizard и построенные по модели документ-облик, по умолчанию встроена возможность вывода редактируемого документа на печать.
В меню File такого приложения находятся три строки (Print, Print Preview и Print Setup), которые управляют процессом печати документов, подготовленных в приложении. Чтобы распечатать документ, достаточно выбрать из меню File строку Print. На экране появится диалоговая панель Print. В ней можно выбрать печатающее устройство для печати документов (группа Name), указать, будет печататься весь документ либо его часть (группа Print range), а также сколько копий документа будет напечатано (группа Copies). Также можно настроить различные характеристики печатающего устройства, если нажать кнопку Properties в группе Printer.
Если требуется определить только печатающее устройство и формат документа, из меню File следует выбрать строку Printer Setup. В группе Printer можно указать печатающее устройство и настроить его соответствующим образом. Группа Paper задает формат бумаги и режим подачи бумаги в печатающее устройство. Группа Orientation включает только один переключатель, определяющий ориентацию бумаги. Он принимает положение Portrait для вертикальной ориентации изображения на бумаге (режим "портрет") или Landscape для горизонтальной ориентации изоборажения на бумаге (режим "ландшафт").
Строка Print Preview меню File выбирается для предварительного просмотра документа перед печатью. При этом главное окно приложения изменит свой внешний вид и можно будет просмотреть, как будет выглядеть документ после печати.
Если не требуется выполнять специфическую обработку документа перед печатью, то вряд ли понадобится самостоятельное добавление программного кода, отвечающего за процесс печати. Просто следует отметить, что процедура создания панелей, связанных с печатью документа, практически ничем не отличается от создания выше описанных стандартных диалоговых панелей.
Панель для выполнения поиска и замены (класс CFindReplaceDialog)
Класс CFindReplaceDialog предназначен для управления диалоговыми окнами Find и Replace. Диалоговая панель Find используется для поиска известных строк в документе приложения, а панель Replace позволяет замену одной строки на другую.
Важным отличием диалоговых панелей Find и Replace от других стандартных диалоговых панелей является то, что они представляют собой немодальные диалоговые панели. Поэтому процесс создания этих панелей значительно отличается от процесса создания стандартных панелей для выбора цвета, шрифта и имен файла.
Для программирования расширенных хранимых процедур Microsoft предоставляет ODS (Open Data Service) API набор макросов и функций, используемых для построения серверных приложений позволяющих расширить функциональность MS SQL Server 2000.
Расширенные хранимые процедуры - это обычные функции написанные на С/C++ с применением ODS API и WIN32 API, оформленные в виде библиотеки динамической компоновки (dll) и призванные, как я уже говорил, расширять функциональность SQL сервера. ODS API предоставляет разработчику богатый набор функций позволяющих передавать данные клиенту, полученные от любых внешних источников данных (data source) в виде обычных наборов записей (record set). Так же, extended stored procedure может возвращать значения через переданный ей параметр (OUTPUT parametr).
Как работают расширенные хранимые процедуры.
* Когда клиентское приложение вызывает расширенную хранимую процедуру, запрос передаётся в TDS формате через сетевую библиотеку Net-Libraries и Open Data Service ядру MS SQL SERVER.
* SQL Sever находит dll библиотеку ассоциированную с именем расширенной хранимой процедуры и загружает её в свой контекст, если она не была загружена туда ранее, и вызывает расширенную хранимую процедуру, реализованную как функцию внутри dll.
* Расширенная хранимая процедура выполняет на сервере необходимые ей действия и передаёт набор результатов клиентскому приложению, используя сервис предоставляемый ODS API.
Особенности расширенных хранимых процедур.
* Расширенные хранимые процедуры - это функции выполняющиеся в адресном пространстве MS SQL Server и в контексте безопасности учётной записи под которой запущена служба MS SQL Server;
* После того, как dll библиотека с расширенными хранимыми процедурами была загружена в память, она остаётся там до тех пор, пока SQL Server не будет остановлен, или пока администратор не выгрузит её принудительно, используя команду :
DBCC DLL_name (FREE).
* Расширенная хранимая процедура запускается на выполнение так же, как и обычная хранимая процедура:
EXECUTE xp_extendedProcName @param1, @param2 OUTPUT
@param1 входной параметр
@param2 входной/выходной параметр
Внимание!
Так как расширенные хранимые процедуры выполняются в адресном пространстве процесса службы MS SQL Server, любые критические ошибки, возникающие в их работе, могут вывести из строя ядро сервера, поэтому рекомендуется тщательно протестировать Вашу DLL перед установкой на рабочий сервер.
Создание расширенных хранимых процедур.
Расширенная хранимая процедура эта функция имеющая следующий прототип:
Параметр pSrvProc указатель на SRVPROC структуру, которая является описателем (handle) каждого конкретного клиентского подключения. Поля этой структуры недокументированны и содеражат информацию, которую библиотека ODS использует для управления коммуникацией и данными между серверным приложением (Open Data Services server application) и клиентом. В любом случае, Вам не потребуется обращаться к этой структуре и тем более нельзя модифицоравать её. Этот параметр требуется указывать при вызове любой функции ODS API, поэтому в дальнейшем я небуду останавливаться на его описании.
Использование префикса xp_ необязательно, однако существует соглашение начинать имя расширенной хранимой процедуры именно так, чтобы подчеркнуть отличие от обычной хранимой процедуры, имена которых, как Вы знаете, принято начинать с префикса sp_.
Так же следует помнить, что имена расширенных хранимых процедур чувствительны к регистру. Не забывайте об этом, когда будете вызвать расширенную хранимую процедуру, иначе вместо ожидаемого результата, Вы получите сообщение об ошибке.
Если Вам необходимо написать код инициализации/деинициализации dll, используйте для этого стандартную функцию DllMain(). Если у Вас нет такой необходимости, и вы не хотите писать DLLMain(), то компилятор соберёт свою версию функции DLLMain(), которая ничего не делает, а просто возвращает TRUE. Все функции, вызываемые из dll (т.е. расширенные хранимые процедуры) должны быть объявлены, как экспортируемые. Если Вы пишете на MS Visual C++ используйте директиву __declspec(dllexport). Если Ваш компилятор не поддерживает эту директиву, опишите экспортируемую функцию в секции EXPORTS в DEF файле.
Итак, для создания проекта, нам понадобятся следующие файлы:
* Srv.h заголовочный файл, содержит описание функций и макросов ODS API;
* Opends60.lib файл импорта библиотеки Opends60.dll, которая и реализует весь сервис предоставляемый ODS API.
Microsoft настоятельно рекомендует, чтобы все DLL библиотеки реализующие расширенные хранимые процедуры экспортировали функцию:
Когда MS SQL Server загружает DLL c extended stored procedure, он первым делом вызывает эту функцию, чтобы получить информацию о версии используемой библиотеки.
Для написания своей первой extended stored procedure, Вам понадобится установить на свой компьютер:
- MS SQL Server 2000 любой редакции (у меня стоит Personal Edition). В процесе инсталляции обязательно выберите опцию source sample
- MS Visual C++ (я использовал версию 7.0 ), но точно знаю подойдёт и 6.0
Установка SQL Server -a нужна для тестирования и отладки Вашей DLL. Возможна и отладка по сети, но я этого никогда не делал, и поэтому установил всё на свой локальный диск. В поставку Microsoft Visual C++ 7.0 редакции Interprise Edition входит мастер Extended Stored Procedure DLL Wizard. В принципе, ничего сверх естественного он не делает, а только генерирует заготовку шаблон расширенной хранимой процедуры. Если Вам нравятся мастера, можете использовать его. Я же предпочитаю делать всё ручками, и поэтому не буду рассматривать этот случай.
Теперь к делу:
- Запустите Visual C++ и создайте новый проект - Win32 Dynamic Link Library.
- Включите в проект заголовочный файл - #include <srv.h>;
- Зайдите в меню Tools => Options и добавьте пути поиска include и library файлов. Если , при установке MS SQL Server, Вы ничего не меняли, то задайте:
- C:Program FilesMicrosoft SQL Server80ToolsDevToolsInclude для заголовочных файлов;
- C:Program FilesMicrosoft SQL Server80ToolsDevToolsLib для библиотечных файлов.
- Укажите имя библиотечного файла opends60.lib в опциях линкера.
На этом подготовительный этап закончен, можно приступать к написанию своей первой extended stored procedure.
Постановка задачи.
Прежде чем приступать к программированию, необходимо чётко представлять с чего начать, какой должен быть конечный результат, и каким способом его добиться. Итак, вот нам техническое задание:
Разработать расширенную хранимую процедуру для MS SQL Server 2000, которая получает полный список пользователей зарегистрированных в домене, и возвращает его клиенту в виде стандартного набора записей (record set). В качестве первого входного параметра функция получает имя сервера содержащего базу данных каталога (Active Directory), т.е имя контролера домена. Если этот параметр равен NULL, тогда необходимо передать клиенту список локальных групп. Второй параметр будет использоваться extended stored procedure для возварата значения результата успешной/неуспешной работы (OUTPUT параметр). Если, расширенная хранимая процедура выполнена успешно, тогда необходимо передать количество записей возвращённых в клиентский record set , если в процессе работы не удалось получить требуемую информацию, значение второго параметра необходимо установить в -1, как признак неуспешного завершения.
.
А вот шаблон расширенной хранимой процедуры, который нам предстоит наполнить содержанием:
Работа с входными параметрами
В этой главе я не хочу рассеивать Ваше внимание на посторонних вещах, а хочу сосредоточить его на работе с переданными в расширенную хранимую процедуру параметрами. Поэтуму мы несколько упростим наше техническое задание и разработаем тольку ту его часть, которая работает с входными параметрами. Но сначал не много теории
Первое действие, которое должна выполнить наша exteneded stored procedure , - получить параметры, которые были переданы ей при вызове. Следуя приведённому выше алгоритму нам необходимо выполнить следующие действия:
- Определить кол-во переданных параметров;
- Убедится, что переданные параметры имеют верный тип данных;
- Убедиться, что указанный OUTPUT параметр имеет достаточную длину, для сохранения в нём значения возвращаемого нашей extended stored procedure.
- Получить переданные параметры;
- Установить значения выходного параметра как результат успешного/неуспешного завершения работы extended stored procedure .
Теперь рассмотрим подробно каждый пункт:
Определение количества переданных в расширенную хранимую процедуру параметров
Для получения количества переданных параметров необходимо использовать функцию:
.
При успешном завершении функция возвращает количество переданных в расширенную хранимую процедуру параметров. Если extended stored procedure была вызвана без параметров - srv_rpcparams ввернёт -1. Параметры могут быть переданы по имени или по позиции (unnamed). В любом случае, нельзя смешивать эти два способа. Попытка передачи в функцию входных параметров по имени и по позиции одновременно - приведёт к возникновению ошибки, и srv_rpcparams вернёт 0 .
[pagebreak]
Определение типа данных и длины переданых параметров
Для получения информации о типе и длине переданных параметров Microsoft рекомендует использовать функцию srv_paramifo. Эта универсальная функция заменяет вызовы srv_paramtype, srv_paramlen, srv_parammaxlen, которые теперь считаются устаревшими. Вот её прототип:
.
.
.
.
.
.
.
.
.
.
pByte - указатель на переменную получающую информацию о типе входного параметра;
pbType задаёт порядковый номер параметра. Номер первого параметра начинается с 1.
pcbMaxLen - указатель на переменную, в которую функция заносит максимальное значение длины параметра. Это значение обусловлено конкретным типом данных переданного параметра, его мы и будем использовать, чтобы убедиться втом, что OUTPUT параметр имеет достаточную длину для сохранения передаваемых данных.
pcbActualLen указатель на реальную длину параметра переданного в расширенную хранимую процедуру при вызове. Если передаваемый параметр имеет нулевую длину, а флаг pfNull устанавлен в FALSE то (* pcbActualLen) ==0.
pbData - указатель на буфер, память для которого должна быть выделена перед вызовом srv_paraminfo. В этом буфере функция размещает полученные от extended stored procedure входные параметры. Размер буфера в байтах равен значению pcbMaxLen. Если этот параметр установлен в NULL, данные в буфер не записываются, но функция корректно возвращает значения *pbType, *pcbMaxLen, *pcbActualLen, *pfNull. Поэтому вызывать srv_paraminfo нужно дважды: сначала с pbData=NULL, потом, выделив необходимый размер памяти под буфер равный pcbActualLen, вызвать srv_paraminfo второй раз, передав в pbData указатель на выделенный блок памяти.
pfNull указатель на NULL-флаг. srv_paraminfo устанавливает его в TRUE, если значение входного параметра равно NULL.
Проверка, является ли второй параметр OUTPUT параметром.
Функция srv_paramstatus() предназначена для определения статуса переданного параметра:
.
.
.
.
.
n - номер параметра переданного в расширенную хранимую процедуру при вызове. Напомню: параметры всегда нумеруются с 1.
Для возврата значения, srv_paramstatus использует нулевой бит. Если он установлен в 1 переданный параметр является OUTPUT параметром, если в 0 обычным параметром, переданным по значению. Если, exteneded stored procedure была вызвана без параметров, функция вернёт -1.
Установка значения выходного параметра.
Выходному параметру, переданному в расширеную хранимую можно передать значение используя функцию srv_paramsetoutput. Эта новая функция заменяет вызов функции srv_paramset, которая теперь считается устаревашай, т.к. не поддерживает новые типы данных введённые в ODS API и данные нулевой длины.
.
.
.
.
.
.
.
.
n - порядковый номер параметра, которому будет присвоено новое значение. Это должен быть OUTPUT параметр.
pbData указатель на буфер с данными, которые будут посланы клиенту для установки значения выходного параметра.
cbLen длина буфера посылаемых данных. Если тип данных переданного OUTPUT параметра определяет данные постоянной длины и не разрешает хранение значения NULL (например SRVBIT или SRVINT1), то функция игнорирует параметр cbLen. Значение cbLen=0 указывает на данные нулевой длины, при этом парметр fNull должен быть установлен в FALSE.
fNull установите этот его в TRUE, если возвращаемому параметру необходимо присвоить значение NULL, при этом значение cbLen должно быть равно 0, иначе функция завершится с ошибкой. Во всех остальных случаях fNull=FALSE.
В случае успешного завершения функция возвращает SUCCEED. Если возвращаемое значение равно FAIL, значит вызов был неудачным. Всё просто и понятно
Теперь мы достаточно знаем, для того чтобы написать свою первую расширенную хранимую процедуру, которая будет возвращать значение через переданный ей параметр.Пусть, по сложившейся традиции, это будет строка Hello world! Отладочну версию примера можно скачать здесь.
. Не рассмотренными остались функции srv_sendmsg и srv_senddone. Функция srv_sendmsg используется для посылки сообщений клиенту. Вот её прототип:
msgtype определяет тип посылаемого клиенту сообщения. Константа SRV_MSG_INFO обозначает информационное сообщение, а SRV_MSG_ERROR сообщение об ошибке;
msgnum номер сообщения;
class - степень тяжести возникшей ошибки. Информационные сообщения имеют значение степени тяжести меньшее или равное 10;
state номер состояния ошибки для текущего сообщения. Этот параметр предоставляет информацию о контексте возникшей ошибки. Допустимые значения лежат в диапазоне от 0 до 127;
rpcname в настоящее время не используется;
rpcnamelen - в настоящее время не используется;
linenum здесь можно указать номер строки исходного кода. По этому значению, в последствие будет легко установить в каком месте возникла ошибка. Если Вы не хотите использовать эту возможность, тогда установите linenum в 0;
message указатель на строку посылаемую клиенту;
msglen определяет длину в байтах строки сообщения. Если это строка заканчивается нулевым символом, то значение этого параметра можно установить равным SRV_NULLTERM.
Возвращаемыме значения:
- в случае успеха SUCCEED
- при неудаче FAIL.
В процессе работы расширенная хранимая процедура должна регулярно сообщать клиентскому приложению свой статус, т.е. посылать сообщения о выполненных действиях. Для этого и предназначена функция srv_senddone:
status - статус флаг. Значение этого параметра можно задавать использую логические операторы AND и OR для комбинирования констант приведённых в таблице:
Status flag Описание
SRV_DONE_FINAL Текущий набор результатов является окончательным;
SRV_DONE_MORE Текущий набор результатов не является окончательным следует ожидать очердную порцию данных;
SRV_DONE_COUNT Параметр count содержит верное значение
SRV_DONE_ERROR Используется для уведомления о возникновении ошибок и немедленном завершении.
into зарезервирован, необходимо установить в 0.
count количество результирующих наборов данных посылаемых клиенту. Если флаг status установлен в SRV_DONE_COUNT, то count должен содержать правильное количество посылаемый клиенту наборв записей.
Возвращаемыме значения:
- в случае успеха SUCCEED
- при неудаче FAIL.
Установка расширенных хранимых процедур на MS SQL Server 2000
1.Скопируйте dll библиотеку с расширенной хранимой процедурой в каталог binn на машине с установленным MS SQL Server. У меня этот путь следующий: C:Program FilesMicrosoft SQL ServerMSSQLBinn;
2.Зарегистрирйте расширенную хранимую процедуру на серверt выполнив следующий скрипт:
Заключение
На этом первая часть моей статьи закончена. Теперь я уверен Вы готовы справиться с нашим техническим заданием на все 100%. В следующей статье Вы узнаете:
- Типы данных определённые в ODS API;
- Особенности отладки расширенных хранимых процдур;
- Как формировать recordset-ы и передавать их клиентскому приложению;
- Чстично мы рассмотрим функции Active Directory Network Manegment API необходимые для получения списка доменных пользователей;
- Создадим готовый проект (реализуем наше техническое задание)
Надеюсь - до скорой встречи!
В состав версий Windows Server 2003 Service Pack 1 (SP1) и Windows XP SP2 входит размещаемый в системе брандмауэр Windows Firewall, гораздо более эффективный, чем его предшественник, Internet Connection Firewall (ICF). В отличие от ICF, который поставлялся с Windows 2003 и XP, Windows Firewall подходит для развертывания в масштабах предприятия благодаря возможности управлять политиками брандмауэра из единого центра, нескольким интерфейсам настройки и множеству новых функций безопасности. В этой статье я расскажу о том, как лучше подойти к планированию, настройке конфигурации и применению брандмауэра на предприятии.
Подготовительный этап
Важно помнить о выбираемом по умолчанию режиме Windows Firewall. В XP SP2 брандмауэр Windows Firewall активен по умолчанию, а в Windows 2003 SP1 его стандартное состояние — выключенное, если только SP1 не развертывается на системе с запущенным ICF. В этом случае режим брандмауэра не изменяется. Если пакет SP1 размещен на установочном компакт-диске с операционной системой, то Windows Firewall всегда активизируется в режиме включения по умолчанию, когда в процессе установки происходит соединение со службой Windows Update для получения последних обновлений. Поэтому, если развернуть XP SP2, не уделяя должного внимания настройке Windows Firewall, и опрометчиво принять стандартные параметры, можно лишиться доступа к инструментарию для дистанционного управления настольными компьютером. Если администратор не готов использовать Windows Firewall или работает с брандмауэром независимого поставщика, то можно спокойно отключить Windows Firewall и развернуть SP2 без него.
Если для аутентификации пользователей применяется Active Directory (AD), а настольные компьютеры являются членами домена с соответствующими учетными записями, то самый простой способ настроить Windows Firewall — задействовать объекты групповой политики Group Policy Object (GPO). После установки XP SP2 на настольных компьютерах параметры брандмауэра настраиваются при перезагрузке машин и каждый раз при обновлении политики. Если используется продукт управления каталогами независимого поставщика или на предприятии имеются не управляемые администратором компьютеры, которые не входят в состав домена AD, то для настройки Windows Firewall вместо объектов GPO можно использовать пакетные файлы или сценарии. Настроить конфигурацию брандмауэра можно и в ходе автоматизированных или интерактивных процедур установки XP SP2.
Настройка Windows Firewall
Приступая к настройке конфигурации Windows Firewall, следует помнить об основных характеристиках брандмауэра:
* Windows Firewall не выполняет фильтрации исходящего трафика, то есть не ограничивает его. Если предприятие нуждается в фильтрации исходящего трафика, следует использовать брандмауэр независимого поставщика.
* Возможности Windows Firewall шире, чем у ICF: в Windows Firewall можно настраивать исключения, чтобы разрешить входящий трафик с учетом не только транспортного протокола (TCP или UDP) и номера порта, но и приложения (например, одноранговой программы обмена файлами).
* Можно уточнить исключения по области действия, то есть разрешить соединения от всех компьютеров, от компьютеров в указанных подсетях, только из локальной подсети или от компьютеров с определенными IP-адресами.
* Windows Firewall активизируется по умолчанию для всех сетевых соединений, но для каждого сетевого интерфейса можно настроить разные правила брандмауэра.
* Настраивать Windows Firewall может только администратор. Если управление брандмауэром централизованное (через AD или GPO), то можно лишить локальных администраторов права изменять параметры.
* С помощью Windows Firewall можно ограничить трафик IPv4 и IPv6.
* Windows Firewall располагает двумя профилями, Domain и Standard. Профиль Domain активизируется, если компьютер подключен к сети с контроллерами домена (DC), членом которого он является. Профиль Standard применяется, если компьютер подключен к другой сети, например общедоступной беспроводной сети или скоростному соединению в номере отеля. Рекомендуется настроить профили Domain и Standard для серверов и настольных компьютеров, а также для ноутбуков.
Прежде чем настраивать конфигурацию Windows Firewall, следует провести инвентаризацию приложений на рабочих станциях и серверах, которые могут организовать оконечные точки соединений; портов, используемых приложениями и операционной системой; источников трафика для каждой хост-машины с Windows Firewall. Для мобильных систем, таких как ноутбуки, в ходе инвентаризации следует учитывать различную природу сетевого трафика при подключении системы к корпоративной сети с контроллерами домена и активным профилем Domain брандмауэра Windows Firewall, в отличие от системы, подключенной к общедоступной сети с активным профилем Standard. Нужно всегда выбирать профиль Standard и разрешать только необходимый входящий трафик через брандмауэр, чтобы свести к минимуму угрозу для подключенных к сети мобильных машин.
В Windows Firewall определены четыре встроенные административные службы, представляющие типовые исключения для любой политики брандмауэра: File and Print, Remote Administration, Remote Desktop и Universal Plug and Play (UpnP). Remote Administration обеспечивает управление системой через типовые административные интерфейсы и подсистемы, такие как Windows Management Instrumentation (WMI) и вызов удаленных процедур (remote procedure call — RPC). Remote Desktop позволяет подключиться к одной системе с другой через RDP и используется при запросе на поддержку Remote Assistance. Администраторы часто применяют Remote Desktop для подключения к удаленным серверам, которыми они управляют. Протокол UpnP обеспечивает корректную работу устройств, которые обнаруживают и динамически настраивают друг друга с учетом активных приложений и служб. Типовой пример использования UpnP — взаимодействие XP с UPnP-совместимым широкополосным маршрутизатором при запуске MSN Messenger, в результате которого аудио и видеосоединения устанавливаются через встроенный брандмауэр маршрутизатора.
При настройке профилей Domain и Standard брандмауэра Windows Firewall рекомендуется задать исключения для конкретных приложений. Благодаря исключению приложение сможет установить любые нужные оконечные точки и принимать через них трафик. Существуют две веские причины, чтобы назначать исключения для приложений. Во-первых, проще определить и описать приложения, нежели отдельные используемые ими порты, особенно потому, что порты, используемые многими приложениями, документированы не полностью или назначаются динамически. Во-вторых, многие приложения, в том числе несанкционированные, используют те же порты, что и легальные приложения; указав приложения вместо портов, можно лишить неутвержденные приложения возможности установить оконечные точки соединения. Всегда, когда возможно, рекомендуется не делать исключений для профиля Standard и отклонять все входящие соединения.
Windows Firewall для серверов
Microsoft не дает специальных рекомендаций по настройке Windows Firewall для серверов. По умолчанию брандмауэр блокирован, если только пакет Windows Server 2003 SP1 не устанавливается на системе с активным ICF, однако брандмауэром можно воспользоваться для укрепления безопасности сервера Windows 2003. Применяя брандмауэр на сервере, следует помнить, что серверы по своей природе служат для размещения приложений и служб, с которыми устанавливают соединения приложения и службы на других серверах, настольных компьютерах и ноутбуках. Прежде чем активизировать Windows Firewall на сервере, следует продумать его конфигурацию.
Для некоторых серверов настроить Windows Firewall не составляет труда. Например, неуправляемому автономному Web-серверу в демилитаризованной зоне (DMZ) требуется принимать только входящие соединения через порт 80/TCP (HTTP) или 443/TCP (HTTP Secure-HTTPS), если установлен сертификат и активизирована защита SSL (Secure Sockets Layer).
На сервере с двумя или несколькими интерфейсами, из которых один интерфейс подключен к Internet, а другие — к корпоративным сетям, можно активизировать Windows Firewall, а затем отключить его на всех интерфейсах, кроме Internet, и настроить брандмауэр, разрешив только необходимые входящие соединения на интерфейсе Internet.
В простых файл- и принт-серверах корпоративной сети, входящих в состав домена, можно активизировать Windows Firewall и задействовать встроенную службу File and Printer Sharing для подключения пользователей к этим серверам. Можно также использовать Windows Firewall для защиты сервера, службы которого прослушивают известные порты, например сервера базы данных Microsoft SQL Server 2000. Для этого следует разрешить в брандмауэре трафик через соответствующие порты.
Настроить Windows Firewall на сервере можно с помощью мастера Security Configuration Wizard (SCW). SCW, факультативный компонент Windows 2003 SP1, уменьшает поверхность атаки сервера, задавая роль или роли для сервера. SCW содержит ролевую информацию для DC и других серверов инфраструктуры; он блокирует необязательные службы и ограничивает входящий трафик через Windows Firewall.
Windows Firewall не следует размещать на некоторых серверах, в том числе контроллерах домена AD и некоторых серверах приложений, которые прослушивают большой диапазон портов или используют динамические порты, таких как серверы Exchange Server 2003. В последнем случае можно развернуть Windows Firewall, если серверы и клиенты, подключенные к серверам Exchange, входят в состав домена. Брандмауэр настраивается на передачу аутентифицированного трафика IPsec в обход Windows Firewall (этот прием будет рассмотрен ниже), а клиенты настраиваются на использование IPsec.
На многих серверах, в том числе таких, на которых выполняется множество приложений и служб, необходима выборочная настройка Windows Firewall. Требуется указать порты, прослушиваемые приложениями и службами, отбросить необязательные порты и настроить Windows Firewall для необходимых портов. Определить открытые порты и прослушивающие их приложения и службы можно с помощью команды Netstat (netstat.exe), усовершенствованной в последних пакетах обновлений. Указав в командной строке
netstat -a -b
можно увидеть все открытые порты TCP (независимо от состояния) и порты UDP в системе, идентификатор процесса (PID) для каждого активного соединения (образец выходной информации приведен на экране 1). Как уже упоминалось, Windows Firewall можно настроить на разрешение входящего трафика для поименованных приложений, независимо от прослушиваемых ими портов. Единственный недостаток Netstat заключается в том, что команда выдает лишь «моментальный снимок» системы. С ее помощью нельзя идентифицировать приложения, службы и их порты, если эти приложения неактивны в момент запуска Netstat. Чтобы получить достоверную картину, можно сделать несколько снимков в разное время.
Более простая альтернатива Netstat — инструмент Port Reporter, который можно получить по адресу http://support.microsoft.com/?kbid=837243. Программа устанавливается как служба и регистрирует сетевую активность, в том числе подробные сведения об активных программах и службах, и даже учетную запись пользователя, с которой работает приложение или служба. С помощью сопутствующего инструмента Port Reporter Parser (http://www.support.microsoft.com/?kbid=884289) можно извлечь данные из журналов, генерируемых Port Reporter. Правильно настроив и запуская Port Reporter в течение определенного промежутка времени, можно идентифицировать приложения, которые открывают порты сервера и должны быть настроены в Windows Firewall по приложениям или отдельным портам. Длительность применения Port Reporter зависит от приложений и особенностей работы пользователей. Предостережение: Port Reporter может слегка снизить производительность системы, а журналы очень велики. Файлы журналов следует записывать на быстрый диск с достаточным количеством свободного места.
Рекомендуется активизировать функции протоколирования Windows Firewall после завершения настройки серверов. Можно записывать сведения об успешных и неудачных соединениях. Если после настройки и активизации Windows Firewall возникают проблемы при выполнении некоторых приложений, то с помощью информации из журналов можно определить дополнительные порты, которые следует открыть. Для настройки функций протоколирования следует открыть панель управления, запустить утилиту Windows Firewall, щелкнуть на вкладке Advanced, а затем на кнопке Settings в разделе Security Logging. Откроется диалоговое окно Log Settings (экран 2). Журнал Windows Firewall следует сохранять на быстром диске, а максимальный размер журнала должен быть достаточным для записи необходимой информации в течение длительного времени. Проверив корректность настройки Windows Firewall, можно отключить протоколирование.
Экран 2. Настройка протоколирования в Windows Firewall
Windows Firewall можно настроить и таким образом, чтобы передавать аутентифицированный трафик IPsec от доверенных машин в обход брандмауэра. В этот режим можно перевести серверы и рабочие станции, чтобы они пропускали только необходимый клиентский трафик, одновременно обеспечивая неограниченный доступ для администрирования рабочих станций и серверов.
Полная готовность
После завершения подготовки к развертыванию Windows Firewall рекомендуется активизировать брандмауэр сначала для пилотной группы пользователей. Если в процессе пробного развертывания возникнут трудности, следует активизировать режим протоколирования; в журналах содержится информация, которая поможет определить причину проблем. После устранения неполадок и успешного развертывания Windows Firewall брандмауэр станет неоценимым компонентом системы безопасности предприятия.
Можно сказать, что современная корпорация буквально "пропитана" данными. Они повсюду и, более того, очень часто одни и те же данные могут находиться в нескольких местах. Корпорация должна иметь возможность идентифицировать источник, происхождение, семантику и пути доступа к данным. Метаданные или, как их обычно называют, "данные о данных", являются ключом для получения этой информации. Но, как это ни удивительно, у большинства корпораций нет отчетливой стратегии относительно метаданных. Различные подразделения организации используют разные наборы инструментов для поддержки своих данных.
Каждому такому набору соответствуют определенные метаданные. Поэтому картина, типичная для многих корпораций, - это так называемые "острова метаданных", т.е. некоторые объемы информации, которые невозможно связать друг с другом. Для решения этой проблемы некоторые организации начинают крупные проекты по интеграции метаданных, тратя на это значительные средства и время. Но, к сожалению, в большинстве проектов отсутствует структурный подход, поэтому временные и финансовые затраты не окупаются.
В предлагаемой статье обсуждаются подходы к управлению метаданными, в том числе то, какие метаданные необходимо собирать, как их можно моделировать, как создать требуемое архитектурное решение и как обеспечить простоту поддержки метаданных в долгосрочной перспективе. Большинство этих подходов уже существуют в той или иной форме в различных организациях. В данной статье сделана попытка собрать и обобщить имеющийся опыт.
Классификация метаданных
На самом высоком уровне метаданные могут быть разделены на две категории:
Элементы общих метаданных должны иметь совместные (непротиворечивые) определения и семантику в масштабах всей корпорации. Например, определение понятия "клиент" должно быть единым для всей компании.
Метаданные могут быть классифицированы и по другим параметрам:
Метаданные бизнеса включают определения объектов, относящихся к корпоративным пользователям, логическим картам данных и словарям Хранилищ данных. Технические метаданные включают данные о физических объектах: названия таблиц и столбцов, ограничения и правила физического преобразования между различными зонами. В метаданных процессов отражается статистическая информация о различных процессах: статистика загруженности, информация о календарном планировании и обработка исключений.
Создание решения для управления метаданными
Для создания успешного решения по управлению корпоративными метаданными автор рекомендует следовать определенной последовательности шагов:
1. собрать все требования, предъявляемые к метаданным;
2. выбрать соответствующую модель метаданных;
3. определить общие подходы к архитектуре;
4. внедрить выбранное решение и осуществлять его поддержку.
Сбор требований, предъявляемых к метаданным
Определение требований, предъявляемых к метаданным, может оказаться непростой задачей. Ключевые стороны, которым могут быть нужны метаданные, разнообразны и пространственно разобщены. Это могут быть как конечные пользователи или аналитики, так и приложения или наборы инструментов. Процесс сбора стандартных требований не должен слишком расплываться. Автор предлагает следующий подход, учитывающий специфическую природу метаданных:
* определение ключевых сторон для каждого элемента метаданных;
* отнесение каждого элемента метаданных к определенной категории: метаданным бизнеса, техническим или метаданным процессов;
* отнесение каждого элемента метаданных к категории общих или уникальных на основе их использования в тех или иных процессах.
Следующий шаг - идентификация источника элемента метаданных. Обычно они называются "официальными метаданными" или "метаданными записи"1. Метаданные записи указывают на официальную версию определенного элемента для какого-либо события, в котором может быть несколько источников одних и тех же данных. Для того чтобы назвать определенный элемент метаданных официальным, важно понимать различные процессы, которые могут привести к созданию этого элемента. Эта информация помогает определить официальный источник метаданных. Например, компания розничной торговли создает корпоративное Хранилище данных, при этом элементы, содержащие информацию о клиентах, появляются в нескольких местах, таких как Хранилище данных о потребителях, система управления отношениями с клиентами (Customer Relationship Management, сокр. CRM) и система сбыта. При этом важно проводить анализ надежности и полноты каждого источника и оценивать, какие именно определения могут использоваться в качестве официальной версии. В данном случае уже может существовать Хранилище данных о потребителях, определяющее соответствующее измерение, поэтому можно будет считать словарь данных этого Хранилища официальными метаданными записей. После того как этот процесс будет закончен для всех элементов метаданных, можно будет сказать, что организация требований к метаданным завершена.
Выбор метамодели
Следующий шаг после формализации требований к метаданным - создание модели. Моделирование метаданных важно, поскольку оно может стать элементом, который используется во всей корпорации. Существует несколько способов выбора модели метаданных:
* создание специальной модели данных для работы с метаданными;
* использование имеющихся стандартных моделей;
* оснащение доступного репозитория метаданных инструментами, позволяющими использовать его как источник интеграции.
Для создания специальной модели метаданных важно иметь корректные определения элементов, их атрибутов и связей с другими элементами. Такая модель может быть объектно-ориентированной или моделью типа объект-отношение. Что касается стандартных моделей, то тут существует два варианта: модель открытой информации (Open Information Model, сокр. OIM) и общая метамодель Хранилища данных (Common Warehouse Meta-Model, сокр. CWM). CWM описывает обмен метаданными между Хранилищами данных, средствами Business Intelligence и управления знаниями и портальными технологиями. Согласно компании Meta Data Coalition, OIM - это набор спецификаций метаданных для облегчения их совместного и многократного использования в области разработки приложений и Хранилищ данных. OIM описывается с помощью универсального языка моделирования (Unified Modeling Language, сокр. UML) и организуется по предметным областям, которые могут быть легко использованы и при необходимости расширены. Эта модель данных основана на отраслевых стандартах, таких как UML, XML и SQL.
Выбор подходящей метамодели является непростой задачей. Хотя специальные модели бывают гораздо более гибкими, создание надежной модели на корпоративном уровне и ее долгосрочная поддержка могут оказаться довольно обременительными. Для решения такой задачи нужен хорошо продуманный план. С другой стороны, стандартные модели довольно широкие: они охватывают большинство требований, предъявляемых на корпоративном уровне. Но настройка таких моделей под специфические нужды корпорации может оказаться проблематичной. Для тех корпораций, где существуют наборы инструментов и связанные с ними метаданные, хорошим решением будет использование метамоделей от любого поставщика. При этом, безусловно, понадобятся существенные интеграционные усилия. С другой стороны, если корпорация только начинает работать с метаданными и у нее нет несовместимых наборов инструментов, то хорошим решением может быть создание собственной специальной метамодели.
После завершения моделирования метаданных важно определить репозиторий для хранения данных. Это может быть реляционное или объектно-ориентированное Хранилище.
[pagebreak]
Определение архитектуры высокого уровня
Для внедрения решений по работе с метаданными существует целый ряд архитектурных возможностей. Одно из решений - централизованный репозиторий, где хранятся все метаданные.
Основные элементы метаданных, которые будут храниться в таком центральном репозитории, - это метаданные приложений, систем управления базами данных, бизнеса и метаданные, связанные с различными процессами. Создание и модификация элементов метаданных должны осуществляться с помощью общего интерфейса. Для такого решения можно разработать специальную метамодель или использовать одну из стандартных. Данная архитектура имеет несколько преимуществ:
* сравнительно простая поддержка метаданных;
* упрощенные процедуры взаимодействия между компонентами;
* простые процедуры подготовки отчетности.
Некоторые корпорации пытаются создавать очень небольшие решения для работы с метаданными. Это означает, что каждое подразделение организации конструирует свое собственное решение.
Для облегчения обмена метаданными в качестве основы для их передачи используется XML. Каждое приложение, система управления базами данных или инструмент вступает в контакт с репозиторием с помощью XML. Парсер репозитория преобразует формат XML в формат метамодели и обновляет содержимое репозитория.
Наконец, третье архитектурное решение известно под названием распределенной архитектуры. Это тот случай, когда корпорация уже потратила значительное количество ресурсов на создание локального решения для работы с метаданными, а интеграция в масштабах всей корпорации оказывается слишком дорогостоящей. В результате локальное решение продолжает существовать, а в тех случаях, когда это оправдано и выгодно, происходит совместное пользование метаданными из нескольких источников.
Внедрение и поддержка решения для работы с метаданными
После завершения разработки архитектуры и выбора метамоделей можно приступать к внедрению решения. При этом надо иметь в виду следующее:
1. природу репозитория метаданных (реляционная база данных, система файлов, объектно-ориентированная база данных или репозиторий XML);
2. вопросы безопасности репозитория метаданных (кто управляет репозиторием; кто имеет право читать информацию репозитория или обновлять ее);
3. механизмы создания, чтения и добавления компонентов метаданных;
4. инфраструктуру отчетности для метаданных.
После разработки плана и обеспечения соответствующих инструментальных средств можно приступать к внедрению решения для работы с метаданными.
Но собственно внедрение еще не обеспечивает решения всех проблем. Важно обеспечить достаточно продолжительное функционирование созданной системы и ее соответствующее обслуживание. Одно из основных требований при этом - правильное распределение ролей и ответственности в корпорации.
После распределения ролей и ответственности необходимо создать процесс, определяющий жизненный цикл метаданных. Этот цикл задает следующие параметры: кто создает метаданные, кто использует их компоненты и кто отвечает за поддержку этих компонентов. Один из главных критериев долгосрочного успеха решения для работы с метаданными - это его расширяемость. Архитектура должна позволять легко добавлять новые требования к метаданным. Для этого необходим специальный процесс, обеспечивающий добавление новой информации о метаданных. При этом необходимо получить ответы на следующие важные вопросы:
* нужно ли хранить новые метаданные в общем репозитории (если таковой имеется);
* каковы методы доступа к элементам этих метаданных (только чтение или чтение и запись);
* являются ли эти метаданные уникальными или будут использоваться несколькими приложениями.
На основе ответов на эти вопросы принимаются соответствующие решения о хранении компонентов новых метаданных.
Пример решения для работы с метаданными
В качестве примера автор приводит розничную компанию, имеющую несколько Хранилищ данных для обеспечения различных видов бизнес-отчетности. Компания имеет Хранилище для составления отчетов по каналам поставок, Хранилище для CRM, Хранилище для данных о продажах и отдельное Хранилище для финансовой информации. Компания хочет создать единое корпоративное Хранилище данных с помощью консолидации информации в масштабах всей организации. Это хранилище будет центральным репозиторием для всех корпоративных данных, а отдельные подразделения будут создавать себе витрины данных на его основе. В процессе реализации этого проекта пришло понимание того, что также необходимо выработать стратегию консолидации метаданных.
Для этого можно использовать подход, описанный выше, который включает четыре основных действия. Первое действие - определение требований к метаданным. Этот процесс включает идентификацию заинтересованных сторон и классификацию метаданных. Поскольку это проект консолидации Хранилища данных, то типы метаданных будут достаточно простыми. Основные элементы - это некоторые корпоративные измерения, которые должны быть определены, и корпоративные факты. Оба этих элемента связаны с одними и теми же метаданными бизнеса. Следующий набор метаданных - это список таблиц и граф, использующих данные измерения и факты, т.е. это технические метаданные. Наконец, для документирования процессов ETL (extraction, transformation, loading - извлечение, преобразование и загрузка) и создания витрин данных необходима информация о тех шагах, из которых они состоят, т.е. это метаданные о процессах.
Для этих метаданных заинтересованными сторонами являются те, кто занимаются моделированием данных, а также разработчики ETL, витрин данных и отчетов. Помимо этого, такие метаданные нужны для работы с инструментами ETL и отчетности. Для консолидации метаданных требуются все элементы метаданных, их классификация, а также информация о том, кто и какие именно данные использует.
Следующий шаг - моделирование решения для работы с метаданными. В организации было принято решение создать свою метамодель, которая бы учитывала требования к модели данных, процессу ETL, витринам данных и инструментам отчетности.
После создания метамодели необходимо определить общую архитектуру. Было решено создать единый репозиторий для метаданных и определить процесс, который обеспечит его наполнение из всех систем. Например, после определения измерений и фактов метаданные экспортируются из инструментов моделирования данных и сохраняются в репозитории. Информация о процессах ETL создается вручную и также сохраняется в репозитории. Репозиторий инструментов отчетности наполняется с помощью заранее определенной технологии. Для выполнения требований отчетности, предъявляемых к метаданным, была создана система отчетности на основе интернета, которая создает запросы к репозиторию для получения информации.
После создания такого решения консолидация метаданных может считаться практически законченной. Следующая проблема - обеспечение долговременной работы данного решения. Например, как должен обрабатываться новый элемент или измерение, созданные в модели данных? Как вносится информация о новом процессе ETL или новом отчете? Все это определяется процессом поддержки метаданных. Для моделей данных периодически используется процесс синхронизации репозиториев инструментов и метаданных. Для ETL и отчетности существуют аналогичные процессы.
Заключение
Важность метаданных для корпораций уже общепризнанна. При работе с метаданными очень важно предварительно выработать соответствующую стратегию. Также важно понимать, что метаданные не являются универсальным средством для управления данными. Это мощное средство, которое может существенно улучшить качество анализа данных в корпорации, тем самым способствуя росту эффективности ее работы. При этом важно не распыляться в поисках абсолютно совершенного решения, а создавать решение, наиболее оптимальное для конкретного бизнеса.
Волоконная оптика дороже кабелей с медными жилами, но с каждым годом спрос на нее растет. Отчасти это происходит из-за того, что технология монтажа стала намного проще, а стоимость необходимого инструментария постоянно снижается. Без преувеличения можно сказать, что оптическое волокно получило массовое распространение в телекоммуникациях.
Одно из серьезных ограничений в использовании волоконно-оптических кабелей — необходимость особого, аккуратного отношения к их укладке, разделке, соединению и оконцовке, т. е. абсолютно ко всем элементам технического процесса монтажа кабельной линии. Ошибки обходятся весьма дорого — от замены испорченного соединителя до установки соединительной муфты на месте поврежденного кабеля. Тем не менее оптическое волокно активно вытесняет медь не только на магистральных участках сетей связи общего пользования, где почти все новые линии строятся на основе волоконно-оптических линий связи, но даже и на магистральных (вертикальных) участках СКС.
Некоторые особенности работы с волоконно-оптическими кабелями (ВОК) рассматривались в предыдущих номерах, в разделах, посвященных вопросам укладки кабеля. В основном они сводились к набору специальных приемов для захвата кабеля при втягивании в канал, чтобы обеспечить равномерность приложенного тягового усилия, ограничить его максимально допустимым уровнем, а также строго выдержать норму минимального радиуса изгиба. Для успешного выполнения этих задач создан целый набор монтажных приспособлений: кабельные чулки и захваты, электрические и гидравлические тяговые лебедки с электронным управлением и ограничителем усилия, а также защитные устройства, смазка и т. п. «мелочи». Теперь настал черед уделить внимание инструментарию для всех прочих операций.
Основные трудности, которые приходится преодолевать при резке волоконно-оптических кабелей, — броневой покров (стальная лента или стальная проволока) и внутренние силовые элементы (стальной трос). Поскольку оптическое волокно чувствительно к осевым и радиальным деформациям, то волоконно-оптические кабели имеют их в большем количестве, чем медножильные. Это касается не только кабелей для внешней прокладки, но и тех, что предназначены для укладки в зданиях. Правда, последние не всегда содержат силовой элемент из стали. Бронирование, если таковое имеется, осуществляется тонкой стальной или алюминиевой гофрированной фольгой. А так называемые мини-кабели, которые используются для изготовления коммутационных шнуров и выполнения горизонтальных участков СКС, представляют собой одиночное или двойное оптическое волокно в буферном покрытии с одним или двумя защитными слоями полимерной изоляции. Так или иначе, но для большинства волоконно-оптических кабелей недорогие кабелерезы для медных кабелей непригодны. Для них требуется более дорогой инструмент, лезвия которого рассчитаны на резку стали. Впрочем, такой же инструмент необходим и для резки бронированных медножильных.
Первые этапы разделки волоконно-оптических кабелей (удаление верхнего слоя защитных и броневых покровов) выполняются теми же инструментами, что и разделка медножильных кабелей. Никаких особенностей здесь нет — полимерная изоляция и фольга вскрываются резаками, а стальная проволока выкусывается бокорезами. Однако без применения нескольких специальных инструментов не обойтись. Во-первых, это ножницы с керамическими лезвиями или кусачки для удаления нитей из кевлара, которые часто применяются для упрочнения кабеля. Обычные ножницы эти тонкие, гибкие и прочные волокна не режут, а выдавливают или гнут. Во-вторых, это приспособление для снятия полимерной изоляции с мини-кабелей. При выполнении работы не универсальным, а специализированным инструментом риск повреждения оптического волокна существенно снижается, так как его рабочие поверхности имеют фиксированную настройку.
Стоит отметить, что важно хорошо знать конструкцию разделываемого кабеля, так как последний слой защитного покрытия кабеля или изоляцию модулей (групповых элементов, содержащих несколько волокон) нужно удалять с особенной аккуратностью. После удаления всех защитных слоев открывается доступ к одиночным оптическим волокнам в буферном покрытии. На этом сходство заканчивается, и далее работать с волоконно-оптическими кабелями можно только специальным инструментом.
Разделка кабеля может выполняться для оконцовки (монтажа разъемных соединителей) или сращивания (сварки или монтажа неразъемных соединителей).
Разъемные соединители монтируются на мини-кабели или на оптическое волокно в буферном покрытии; для оптического волокна их существует великое множество (ST, SC, SMA, FC, LC, FJ, MT и др.). Некоторые из них выпускаются еще и в нескольких разновидностях, предназначенных для оконцовки различного оптического волокна (многомодового, одномодового, разного диаметра, с различной толщиной оболочки) и отличающихся некоторыми деталями конструкции и технологии монтажа. Такое разнообразие не слишком осложняет работу монтажников. Грамотная техническая политика позволяет резко уменьшить число разновидностей кабелей и соединителей для волоконно-оптических линий связи. Иногда ограничения вытекают из особенностей применяемого оборудования, иногда — оформляются в виде внутреннего стандарта организации. Подобные ограничения и правила просто необходимы, если помнить, что существенная часть достаточно дорогого инструмента и приспособлений предназначена только для оптического волокна или соединителей определенного вида. А в силу высочайших требований к точности обработки и монтажа использование непредусмотренного технологией инструментария почти всегда заканчивается браком в работе. В значительной степени результат зависит и от качества расходных материалов: клеев, растворителей, безворсовых салфеток, шлифовальной и полировальной бумаги.
Итак, после разделки кабеля по шаблону до оптического волокна в буферном покрытии наступает наиболее ответственный момент. С помощью особого инструмента, рассчитанного на оптическое волокно определенного размера, с него удаляют буферное покрытие. Основная проблема — не повредить при этом само волокно, так как при небольшом задире или сколе всю работу придется выполнять еще раз. Поскольку внешне инструменты для этой операции выглядят абсолютно одинаково, производители используют для их маркировки различные цвета.
Затем производится сборка соединителя. Оптическое волокно продевается сквозь отверстие наконечника соединителя и фиксируется с помощью различных видов клея: термоклея (становится пластичным при нагреве), эпоксидного компаунда (полимеризуется благодаря реакции между двумя смешанными компонентами), универсального клея (твердеет после испарения растворителя) или клея с отвердением под воздействием ультрафиолета. Отверстие заполняется клеем с помощью шприца (исключение составляет термоклей, который наносится в процессе производства разъемов). Однокомпонентный клей поставляется уже расфасованным в шприцы, а двухкомпонентный — в отдельной таре. Полученная сборка нагревается в печке (для ускорения процесса отвердения эпоксидного компаунда или разогрева термоклея) или облучается ультрафиолетом.
После склеивания излишки оптического волокна удаляются, а торец сердечника шлифуется и полируется. Для удаления излишков на поверхности волокна резаком (скрайбером) наносится царапина. Резаки могут иметь различный профиль: лезвие (металл, карбид или керамика) либо конус (алмаз или корунд). После нанесения риски волокно отламывается.
Дальнейшая обработка торца выполняется на мате или стекле на нескольких листах наждачной бумаги с убывающим размером абразивного элемента (шлифовальная, полировальная, доводочная). Для фиксации сердечника строго перпендикулярно к поверхности наждака применяется оправка, в которую устанавливается обрабатываемый соединитель. При больших объемах эта операция может быть автоматизирована за счет использования шлифовальной машины.
Качество обработки проверяется с помощью микроскопа. Выпускаемые модели контрольных микроскопов отличаются степенью увеличения и конструкцией. Особенно удобен защитный фильтр для глаз — для блокирования излучения на случай, если оно окажется в подключенном волокне.
Все инструменты для работы с волоконно-оптическими кабелями можно приобрести по отдельности, но чаще всего они поставляются в специально составленных комплектах, куда входит не только инструмент, но и вся необходимая для проведения работ тара, дозаторы, распределители, расходные материалы и защитные средства. Для удобства хранения все это упаковано в органайзер (сумку или чемодан). Восполнение расходных материалов также осуществляется подобранными комплектами.
В зависимости от поставленных задач предлагается как скромный набор минимально необходимых для обработки одного типа оптического волокна средств, так и полный набор для работы с любым оптическим волокном. А вот комплектов, универсальных с точки зрения обрабатываемых разъемных соединителей, очень мало. Объясняется это просто — часть инструмента для их монтажа поставляется только производителями самих соединителей.
Несколько слов тем, кому придется выполнять работы с волоконно-оптическими кабелями на улице. Для защиты от пыли и осадков, а также создания необходимого микроклимата используются теплоизолированные палатки и боксы. Первые легко переносятся и собираются в любом месте; вторые устанавливаются на шасси автомобиля и прицепа.
Всем, кто некоторое время своей жизни потратил на изучение основ техники SEO, известен тот факт, что величина трафика на ресурс сильно зависит от качества контента. Ни для кого уже не секрет, что интересные и качественные статьи любят как читатели, так и поисковые роботы. В этой статье я постараюсь пролить немного света на процесс создания информационных материалов и источники их формирования.
Приведу несколько вещей, которые необходимо помнить:
- контент сайта нужно писать, исходя из того, что его будут читать живые люди, а не поисковые роботы. Поэтому варианты с беглым написанием "нечитаемых" статей с великим множеством синтаксических ошибок, автоматические переводы и т.д - должны отпасть сразу же.
- раз уж выбрали определенную тематику ресурса, то ее и придерживайтесь. Только таким образом можно сформировать постоянную аудиторию читателей. Естественно, расширение информативности сайта за счет добавления новых рубрик, разделов - только приветствуется. Важно сохранять общую тематическую направленность.
- ну и не надо забывать о постоянном обновлении информации на сайте. Неплохим подспорьем будет использование информеров с других сайтов. Они их представляют бесплатно, есть возможность выбора тематики импорта новостей, вида их размещения и т.д.
Сейчас рассмотрим, что же хочет видеть ваша целевая аудитория на вашем сайте:
1. Календарь событий - идеальный вариант для новостных сайтов, блогов и т.п. Вообщем всех тех, на которых информация привязана к определенной дате.
2. Географические карты - без них не обойтись на сайтах о туризме, путешествиях, охоте, рыбалке. Тут даже не обязательно быть художником и геодезистом - в инете уже полным-полно подобных он-лайн сервисов. Что от вас потребуется - смекалка и знание Photoshop'а.
3. Отзывы посетителей вашего сайта - ко всем статьям нужно добавить возможность размещать комментарии. Так вы сможете быть в курсе - насколько востребован тот или иной материал, качество его написания.
4. Фотографии клиентов - сделайте отдельный раздел на вашем сайте, где бы были размещены фотографии ваших клиентов. Наличие в клиентах солидных и авторитетных компаний еще никому не помешало.
5. Цветовая гамма - как правило, для сайтов развлекательной и туристической направленности использование графики только идет на пользу. Фотографии достопримечательностей стран, клубов, ресторанов - только повышает информативность статей. Ведь человеку интересно увидеть на фото то, что он может увидеть в живую. Главное - не перестараться и использовать оптимизированную графику.
6. Блоги и форумы - у человека всегда есть потребность в общении, что и объясняет популярность в интернете подобных вещей. Плюс ко всему - на форумах и блогах постоянно обновляется информация - вот за это их и любят поисковики.
7. Специализированные статьи для целевой аудитории. Их следует писать с периодичностью не реже одного или двух раз в неделю.
8. Вопросы / ответы экспертов - создайте возможность задавать вопросы людям, которые являются экспертами в определенных вопросах. Естественно, следует организовать оперативные ответы на них.
9. Краткие обзоры продукции - это необходимо делать как для новинок рынка, так и для остальной продукции. Так как любой рынок постоянно меняется, выходит новая продукция, технологии, версии программ - то тут не обойтись без обзоров. Желательно так же размещать как положительные, так и отрицательные характеристики.
[pagebreak]
10. FAQ (Наиболее часто задаваемые вопросы). FAQ – такой тип контента, в котором целевая аудитория по-настоящему заинтересована. Получая вопросы от читателей, предоставьте ответить на них экспертам.
11. Историческая справка. Думаю, ни для кого не будет секретом, что много людей интересуется вопросом возникновения определенной продукции, производства, историей выхода новых моделей и версий.
Поэтому не помешает разместить на сайте небольшие очерки об истории продаваемого вами товара. подобную информацию можно без особого труда найти в инете - было бы только желание. И забывайте о графических иллюстрациях - так всегда интереснее и познавательнее.
12. Публикация интервью. Является одним из самых простых способов создания уникального контента. Да, ко всему прочему, еще и интересного. Ведь, если взять интервью у известного и уважаемого человека, то найдется много людей, которым будет его интересно почитать.
Добавлять интервью советую периодически, но не очень редко - чтобы поддерживать интерес к вашему ресурсу. По поводу оформления - то не помешает фотография персоны, у которой берется интервью, а также оставьте его формулировки без изменений (разве что исправьте грамматические и орфографические ошибки).
13. Сезонные статьи. Если ваша сфера деятельности зависит от времени года (например, ваша фирма занимается туризмом, организацией охоты, рыбалки), то тут без статей с учетом сезона не обойтись. Таким образом для посетителя предоставленная информация будет интересной и актуальной.
14. Статистические данные. Такая информация просто жизненно необходима для сайтов, посвященных финансовым операциям, недвижимости и т.п. Если у вас нету собственных ресурсов для формирования данных статистики, то тут придут на помощь сайты, которые готовы предоставить вам такие данные. В большинстве случаев это делается бесплатно, а платой за использование будет ссылка на первоисточник.
15. Конкурсы. Людям всегда нравилось участвовать в различных конкурсах и соревнованиях. Пусть даже они и носят виртуальный характер. Даже если победители не получат ценный приз, а всего лишь их имя будет гордо красоваться на вашем сайте - это тоже будет людям приятно. Можно организовать конкурс стихов, рассказов, фотографий - всего того, что может разместить любой посетитель.
16. Истории успешного сотрудничества. Добавьте на ваш сайт отдельный раздел типа "Отзывы наших клиентов" и поместите туда настоящие (а не вымышленные) отзывы ваших клиентов о вашей компании, качестве предоставляемых услуг. Можете просто попросить вашего клиента написать отзыв. Убедите его, что это выгодно - и реклама его фирмы, и его фото (можно и так сделать) или предоставить скидку на дальнейшие покупки.
17. Новости индустрии или сферы, имеющей отношение к вашей продукции (услугам). Людям всегда интересно, что нового появляется в выпускаемой продукции, какие появляются новшества и разработки. Если лень добавлять самому новости (а они появляются практически каждый день), то можно экспортировать их с нескольких сайтов. Опять же есть такая замечательная вещь, как RSS лента.
Вот и все советы. Как видите, их не так уж и много. Зато эффект он их воплощения - ощутимый. Таким образом вы будете интересны и поисковым машинам и посетителям вашего сайта.
В данной статье я бы хотел рассмотреть и сравнить между собой несколько способов раскрутки сайтов. Некоторые способы уже известны многим как быстрый путь к увеличению посещаемости сайта. Посмотрим так ли это на самом деле.
Достижение высоких позиций невозможно только редактируя meta-теги.
В свое время я прочел очень интересную книгу Стефана Ковея "7 привычек успешного человека". Мне в этой книге особенно понравился раздел "Персональная этика". В нем автор упоминает о том, как некоторые люди изо всех сил пытаются найти "быстрый и простой способ достичь успеха в жизни не работая и не совершенствуя свои профессиональные навыки".
Далее автор подводит итог: "Персональная этика - вещь иллюзорная и обманчивая. Вот поэтому пытаться достичь каких-либо значимых целей так просто и быстро так же утопично, как найти Эйфелеву башню на карте Мадрида".
Я думаю, что сказанное выше можно смело применить и к поисковой оптимизации: простых путей нет. Вот поэтому я считаю мифом, что раскрутить сайт можно только путем редактирования meta-тегов.
Почему meta-теги бессильны?
Все дело в том, что толком неизвестно насколько важными являются meta-теги для релевантности сайта. Да и вообще используют ли информацию из них поисковые машины.
Иначе обстоит дело с поиском внутри самого сайта. Вот здесь информация из meta-тегов как раз и помогает найти пользователю страничку на сайте с необходимой информацией. Или, по крайней мере, сузить количество возможных страниц до минимума.
К сожалению, разница между внутренним поиском и поиском с помощью поисковой машины (напр. той же Google) очень велика. Например, с помощью внутреннего поиска можно без проблем найти минимальное количество страничек, которые будут максимально соответствовать поисковому запросу. К тому же содержание сайта (контент) и meta-теги только помогут пользователю добраться до нужной ему информации.
С другой стороны, все главные поисковые машины интернета имеют свои базы данных, которые содержат информацию о всех интернет страничках, о которых они только знают. Они-то не всегда доверяют информации из meta-тегов, так как она запросто может отличаться от истинного содержания сайта. К примеру, вы как владелец сайта, желаете видеть свой сайт на верху результатов поиска по многим ключевым словам (фразам), но поисковик все равно поместит туда наиболее релевантные по данным ключевым словам сайты.
Вот по этой причине только изменять информацию в meta-тегах не приведет к росту рейтинга сайта и увеличению трафика.
И о контенте замолвим мы слово...
Бесспорно, вы можете наполнять свой сайт статьями любого содержания и тематики и надеяться на быстрый эффект. Но вот только написание хороших статей (т.е контента) требует времени и часто довольно много. Можно, конечно, потратить годы на написание статей, что в конечном итоге приведет к появлению довольно весомого архива полезной информации. Вот только у меня возникаю сомнения, что кто-то сможет писать 100 статей в неделю, да еще и интересных и полезных в информационном плане для посетителя. Тут нужно либо нахально воровать контент с других сайтов, либо пользоваться программами для его генерации, либо становиться роботом с множеством рук!
А как же ссылки?
Да, без сомнений, ссылки - это очень важный инструмент, который помогает вашему сайту хотя бы просто быть замеченным (проиндексированным) поисковой машиной. Вот только делается это не так и быстро, ввиду довольно большой инертности поисковиков. Да ведь играет еще и "вес" ссылающегося на вас сайта, а в данном случае лучше получит одну ссылки с сайта с PR=6-7, чем с сотни с PR=2-3. Но пока ваш сайт еще не раскручен, то крупные сайты вряд-ли поставят на ваш сайт ссылки. Зачем это им?
Так что лучше пока забудьте о популярности ссылки и вместо этого подумайте о привлечении на сайт целевой аудитории и как она узнает о существовании вашего сайта. Тут все проще пареной репы, как говорится. У вас есть сайт и вы занимаетесь бизнесом, который [лучше] [уникальнее] [качественнее] чем аналогичный у ваших конкурентов. Вам, естественно, нужно его заставить приносить прибыль. Не обязательно в вас должно быть много денег для рекламы вашего сайта.
Хорошая реклама в (пусть и не в самом популярной) газете, журнале или даже телепрограмме уже поможет обратить внимание на ваш ресурс. Ведь, чем популярнее сайт, тем о нем должны больше говорить. Можно даже использовать PPC (Paid per click, сервис показа баннеров с вашей рекламой с оплатой за клики), который поможет привлечь на ваш сайт заинтересованных посетителей.
Но, как бы вы не рекламировали свой сайт, не рассчитывайте на бум в течении суток.
А теперь снова вернемся к книге Стефана Ковея. Конечно, можно научиться быстро редактировать meta-теги и зарегистрировать сайт в тысячах поисковых машин, поставить свою ссылку на миллионах бесполезных сайтов. Тем не менее, если вы не потратите время на написание хорошего и уникального контента, который будет понятен и интересен посетителю, написан простыми словами без использования сленга, у вас никогда не будет долговременных положительных результатов.
Как достичь долговременных результатов
Одним из способов быстрой раскрутки есть оптимизация сайта под малоиспользуемые ключевые слов. Ваш ресурс-то будет высоко в поисковых рейтингах, да вот толку от этого маловато.
Но так как мы уже решили, что эффективная оптимизация - процесс довольно долгий, то следующие 5 советов помогут вам с пользой это время использовать.
1) Тщательно исследуйте нужные вам ключевые слова с помощью таких сервисов, как Wordtracker или KeywordDiscovery. Пусть эти сервисы и платные, но, как я считаю, чтобы заработать деньги, их нужно сначала потратить. Рано или поздно все к этому приходят. А вот как раз платные сервисы по анализу ключевых слов - совершенный инструмент раскрутки сайта.
2) Не перегружайте свой сайт графикой. Тут есть два недостатка: до сих пор толком неизвестно, как поисковые роботы обрабатывают графику; да и мало у кого из посетителей хватит терпения долго ждать загрузки вашей веб-странички.
3) Используйте понятный посетителю язык, на котором написана информация на сайте. Пусть посетителю будет понятно, что вы желаете ему рассказать. Не забывайте также оптимизировать текст под те ключевые слова, по которым вы желаете достичь высоких позиций в поисковиках.
4) Не лишним будет убедиться, что текст в теге "title" и в описании ссылки полностью сходится с контентом вашего сайта.
5) Будьте терпеливы и настойчивы. Как правило, нужно около 6-9 месяцев, чтобы получить стабильный трафик на ваш сайт с популярных поисковиков. Что поделать, так уж устроены поисковые алгоритмы - им нужно некоторое время, чтобы присмотреться к новым ресурсам. И тут не следует расстраиваться, лучше потратить время на наполнение сайта хорошим контентом.
И помните, что ваши труды по оптимизации - это работа на будущее. Как и все в этой жизни, если вы тратите время и деньги правильно и для конкретной цели, то ожидаемые результаты не заставят себя ждать.
Сетевой уровень в первую очередь должен предоставлять средства для решения следующих задач:
* доставки пакетов в сети с произвольной топологией,
* структуризации сети путем надежной локализации трафика,
* согласования различных протоколов канального уровня.
Локализация трафика и изоляция сетей
Трафик в сети складывается случайным образом, однако в нем отражены и некоторые закономерности. Как правило, некоторые пользователи, работающие над общей задачей, (например, сотрудники одного отдела) чаще всего обращаются с запросами либо друг к другу, либо к общему серверу, и только иногда они испытывают необходимость доступа к ресурсам компьютеров другого отдела.
Желательно, чтобы структура сети соответствовала структуре информационных потоков. В зависимости от сетевого трафика компьютеры в сети могут быть разделены на группы (сегменты сети). Компьютеры объединяются в группу, если большая часть порождаемых ими сообщений, адресована компьютерам этой же группы.
Для разделения сети на сегменты используются мосты и коммутаторы. Они экранируют локальный трафик внутри сегмента, не передавая за его пределы никаких кадров, кроме тех, которые адресованы компьютерам, находящимся в других сегментах. Тем самым, сеть распадается на отдельные подсети. Это позволяет более рационально выбирать пропускную способность имеющихся линий связи, учитывая интенсивность трафика внутри каждой группы, а также активность обмена данными между группами.
Однако локализация трафика средствами мостов и коммутаторов имеет существенные ограничения.
С одной стороны, логические сегменты сети, расположенные между мостами, недостаточно изолированы друг от друга, а именно, они не защищены от, так называемых, широковещательных штормов. Если какая-либо станция посылает широковещательное сообщение, то это сообщение передается всем станциям всех логических сегментов сети. Защита от широковещательных штормов в сетях, построенных на основе мостов, имеет количественный, а не качественный характер: администратор просто ограничивает количество широковещательных пакетов, которое разрешается генерировать некоторому узлу.
С другой стороны, использование механизма виртуальных сегментов, реализованного в коммутаторах локальных сетей, приводит к полной локализации трафика - такие сегменты полностью изолированы друг от друга, даже в отношении широковещательных кадров. Поэтому в сетях, построенных только на мостах и коммутаторах, компьютеры, принадлежащие разным виртуальным сегментам, не образуют единой сети.
Приведенные недостатки мостов и коммутаторов связаны с тем, что они работают по протоколам канального уровня, в которых в явном виде не определяется понятие части сети (или подсети, или сегмента), которое можно было бы использовать при структуризации большой сети. Вместо того, чтобы усовершенствовать канальный уровень, разработчики сетевых технологий решили поручить задачу построения составной сети новому уровню - сетевому.
Согласование протоколов канального уровня
Современные вычислительные сети часто строятся с использованием нескольких различных базовых технологий - Ethernet, Token Ring или FDDI. Такая неоднородность возникает либо при объединении уже существовавших ранее сетей, использующих в своих транспортных подсистемах различные протоколы канального уровня, либо при переходе к новым технологиям, таким, как Fast Ethernet или 100VG-AnyLAN.
Именно для образования единой транспортной системы, объединяющей несколько сетей с различными принципами передачи информации между конечными узлами, и служит сетевой уровень. Когда две или более сетей организуют совместную транспортную службу, то такой режим взаимодействия обычно называют межсетевым взаимодействием (internetworking). Для обозначения составной сети в англоязычной литературе часто также используется термин интерсеть (internetwork или internet).
Создание сложной структурированной сети, интегрирующей различные базовые технологии, может осуществляться и средствами канального уровня: для этого могут быть использованы некоторые типы мостов и коммутаторов. Однако возможностью трансляции протоколов канального уровня обладают далеко не все типы мостов и коммутаторов, к тому же возможности эти ограничены. В частности, в объединяемых сетях должны совпадать максимальные размеры полей данных в кадрах, так как канальные протоколы, как правило, не поддерживают функции фрагментации пакетов.
Маршрутизация в сетях с произвольной топологией
Среди протоколов канального уровня некоторые обеспечивают доставку данных в сетях с произвольной топологией, но только между парой соседних узлов (например, протокол PPP), а некоторые - между любыми узлами (например, Ethernet), но при этом сеть должна иметь топологию определенного и весьма простого типа, например, древовидную.
При объединении в сеть нескольких сегментов с помощью мотов или коммутаторов продолжают действовать ограничения на ее топологию: в получившейся сети должны отсутствовать петли. Действительно, мост или его функциональный аналог - коммутатор - могут решать задачу доставки пакета адресату только тогда, когда между отправителем и получателем существует единственный путь. В то же время наличие избыточных связей, которые и образуют петли, часто необходимо для лучшей балансировки нагрузки, а также для повышения надежности сети за счет существования альтернативного маршрута в дополнение к основному.
Сетевой уровень позволяет передавать данные между любыми, произвольно связанными узлами сети.
Реализация протокола сетевого уровня подразумевает наличие в сети специального устройства - маршрутизатора. Маршрутизаторы объединяют отдельные сети в общую составную сеть. Внутренняя структура каждой сети не показана, так как она не имеет значения при рассмотрении сетевого протокола. К каждому маршрутизатору могут быть присоединены несколько сетей (по крайней мере две).
В сложных составных сетях почти всегда существует несколько альтернативных маршрутов для передачи пакетов между двумя конечными узлами. Задачу выбора маршрутов из нескольких возможных решают маршрутизаторы, а также конечные узлы.
Маршрут - это последовательность маршрутизаторов, которые должен пройти пакет от отправителя до пункта назначения.
Маршрутизатор выбирает маршрут на основании своего представления о текущей конфигурации сети и соответствующего критерия выбора маршрута. Обычно в качестве критерия выступает время прохождения маршрута, которое в локальных сетях совпадает с длиной маршрута, измеряемой в количестве пройденных узлов маршрутизации (в глобальных сетях принимается в расчет и время передачи пакета по каждой линии связи).
[pagebreak]
Сетевой уровень и модель OSI
В модели OSI, называемой также моделью взаимодействия открытых систем (Open Systems Interconnection - OSI) и разработанной Международной Организацией по Стандартам (International Organization for Standardization - ISO), средства сетевого взаимодействия делятся на семь уровней, для которых определены стандартные названия и функции.
Сетевой уровень занимает в модели OSI промежуточное положение: к его услугам обращаются протоколы прикладного уровня, сеансового уровня и уровня представления. Для выполнения своих функций сетевой уровень вызывает функции канального уровня, который в свою очередь обращается к средствам физического уровня.
Рассмотрим коротко основные функции уровней модели OSI.
Физический уровень выполняет передачу битов по физическим каналам, таким, как коаксиальный кабель, витая пара или оптоволоконный кабель. На этом уровне определяются характеристики физических сред передачи данных и параметров электрических сигналов.
Канальный уровень обеспечивает передачу кадра данных между любыми узлами в сетях с типовой топологией либо между двумя соседними узлами в сетях с произвольной топологией. В протоколах канального уровня заложена определенная структура связей между компьютерами и способы их адресации. Адреса, используемые на канальном уровне в локальных сетях, часто называют МАС-адресами.
Сетевой уровень обеспечивает доставку данных между любыми двумя узлами в сети с произвольной топологией, при этом он не берет на себя никаких обязательств по надежности передачи данных.
Транспортный уровень обеспечивает передачу данных между любыми узлами сети с требуемым уровнем надежности. Для этого на транспортном уровне имеются средства установления соединения, нумерации, буферизации и упорядочивания пакетов.
Сеансовый уровень предоставляет средства управления диалогом, позволяющие фиксировать, какая из взаимодействующих сторон является активной в настоящий момент, а также предоставляет средства синхронизации в рамках процедуры обмена сообщениями.
Уровень представления. В отличии от нижележащих уровней, которые имеют дело с надежной и эффективной передачей битов от отправителя к получателю, уровень представления имеет дело с внешним представлением данных. На этом уровне могут выполняться различные виды преобразования данных, такие как компрессия и декомпрессия, шифровка и дешифровка данных.
Прикладной уровень - это в сущности набор разнообразных сетевых сервисов, предоставляемых конечным пользователям и приложениям. Примерами таких сервисов являются, например, электронная почта, передача файлов, подключение удаленных терминалов к компьютеру по сети.
При построении транспортной подсистемы наибольший интерес представляют функции физического, канального и сетевого уровней, тесно связанные с используемым в данной сети оборудованием: сетевыми адаптерами, концентраторами, мостами, коммутаторами, маршрутизаторами. Функции прикладного и сеансового уровней, а также уровня представления реализуются операционными системами и системными приложениями конечных узлов. Транспортный уровень выступает посредником между этими двумя группами протоколов.
Функции сетевого уровня
Протоколы канального уровня не позволяют строить сети с развитой структурой, например, сети, объединяющие несколько сетей предприятия в единую сеть, или высоконадежные сети, в которых существуют избыточные связи между узлами. Для того, чтобы, с одной стороны, сохранить простоту процедур передачи пакетов для типовых топологий, а с другой стороны, допустить использование произвольных топологий, вводится дополнительный сетевой уровень.
Прежде, чем приступить к рассмотрению функций сетевого уровня , уточним, что понимается под термином "сеть". В протоколах сетевого уровня термин "сеть" означает совокупность компьютеров, соединенных между собой в соответствии с одной из стандартных типовых топологий и использующих для передачи пакетов общую базовую сетевую технологию. Внутри сети сегменты не разделяются маршрутизаторами, иначе это была бы не одна сеть, а несколько сетей. Маршрутизатор соединят несколько сетей в интерсеть.
Основная идея введения сетевого уровня состоит в том, чтобы оставить технологии, используемые в объединяемых сетях в неизменном в виде, но добавить в кадры канального уровня дополнительную информацию - заголовок сетевого уровня, на основании которой можно было бы находить адресата в сети с любой базовой технологией. Заголовок пакета сетевого уровня имеет унифицированный формат, не зависящий от форматов кадров канального уровня тех сетей, которые могут входить в объединенную сеть.
Заголовок сетевого уровня должен содержать адрес назначения и другую информацию, необходимую для успешного перехода пакета из сети одного типа в сеть другого типа. К такой информации может относиться, например:
* номер фрагмента пакета, нужный для успешного проведения операций сборки-разборки фрагментов при соединении сетей с разными максимальными размерами кадров канального уровня,
* время жизни пакета, указывающее, как долго он путешествует по интерсети, это время может использоваться для уничтожения "заблудившихся" пакетов,
* информация о наличии и о состоянии связей между сетями, помогающая узлам сети и маршрутизаторам рационально выбирать межсетевые маршруты,
* информация о загруженности сетей, также помогающая согласовать темп посылки пакетов в сеть конечными узлами с реальными возможностями линий связи на пути следования пакетов,
* качество сервиса - критерий выбора маршрута при межсетевых передачах - например, узел-отправитель может потребовать передать пакет с максимальной надежностью, возможно в ущерб времени доставки.
В качестве адресов отправителя и получателя в составной сети используется не МАС-адрес, а пара чисел - номер сети и номер компьютера в данной сети. В канальных протоколах поле "номер сети" обычно отсутствует - предполагается, что все узлы принадлежат одной сети. Явная нумерация сетей позволяет протоколам сетевого уровня составлять точную карту межсетевых связей и выбирать рациональные маршруты при любой их топологии, используя альтернативные маршруты, если они имеются, что не умеют делать мосты.
Таким образом, внутри сети доставка сообщений регулируется канальным уровнем. А вот доставкой пакетов между сетями занимается сетевой уровень.
Существует два подхода к назначению номера узла в заголовке сетевого пакета. Первый основан на использовании для каждого узла нового адреса, отличного от того, который использовался на канальном уровне. Преимуществом такого подхода является его универсальность и гибкость - каков бы ни был формат адреса на канальном уровне, формат адреса узла на сетевом уровне выбирается единым. Однако, здесь имеются и некоторые неудобства, связанные с необходимостью заново нумеровать узлы, причем чаще всего вручную.
Второй подход состоит в использовании на сетевом уровне того же адреса узла, что был дан ему на канальном уровне. Это избавляет администратора от дополнительной работы по присвоению новых адресов, снимает необходимость в установлении соответствия между сетевым и канальным адресом одного и того же узла, но может породить сложную задачу интерпретации адреса узла при соединении сетей с разными форматами адресов.
Протоколы передачи данных и протоколы обмена маршрутной информацией
Для того, чтобы иметь информацию о текущей конфигурации сети, маршрутизаторы обмениваются маршрутной информацией между собой по специальному протоколу. Протоколы этого типа называются протоколами обмена маршрутной информацией (или протоколами маршрутизации). Протоколы обмена маршрутной информацией следует отличать от, собственно, протоколов сетевого уровня. В то время как первые несут чисто служебную информацию, вторые предназначены для передачи пользовательских данных, также, как это делают протоколы канального уровня.
Для того, чтобы доставить удаленному маршрутизатору пакет протокола обмена маршрутной информацией, используется протокол сетевого уровня, так как только он может передать информацию между маршрутизаторами, находящимися в разных сетях. Пакет протокола обмена маршрутной информацией помещается в поле данных пакета сетевого уровня, поэтому с точки зрения вложенности пакетов протоколы маршрутизации следует отнести к более высокому уровню, чем сетевой. Но функционально они решают общую задачу с пакетами сетевого уровня - доставляют кадры адресату через разнородную составную сеть.
С помощью протоколов обмена маршрутной информацией маршрутизаторы составляют карту межсетевых связей той или иной степени подробности и принимают решение о том, какому следующему маршрутизатору нужно передать пакет для образования рационального пути.
На сетевом уровне работают протоколы еще одного типа, которые отвечают за отображение адреса узла, используемого на сетевом уровне, в локальный адрес сети. Такие протоколы часто называют протоколами разрешения адресов - Address Resolution Protocol, ARP. Иногда их относят не к сетевому уровню, а к канальному, хотя тонкости классификации не изменяют их сути.