Иногда возникает необходимость защитить свое творение, представлен разработанный мною подход, дорогие читатели, на ваше суждение и понимание, данная статья посвещена конфигурированию в 8 версии.
Итак для начала вы создали отчет, обработку или документ который конечно же является шедевром и те ноу хау которые вы там воплотили, не хочется по каким либо причинам, моральным или материальным, делится с клиентом.
1) Разработчики восьмой платформы для этих целей нам предлагают закрыть модуль паролем. Ну что же, большое вам за это спасибо.
Однажды у меня возникла ситуация когда клиент пожелал платить деньги позже, ну что же, хорошо, но прокактить вам жадины меня не придется, работа была сделана в срок и естественно была запоролена.
2) Но ведь от этого она не теряет свой функционал и рабочие свойства, мне могут сказать что работа выполнена плохо и денег мы вам не дадим. Ну что ж, в свой запороленый модуль я вставил такой код:
//СИСТЕМА ЗАЩИТЫ
Который вызывался перед ключевой процедурой или функцией, как вы видите она привязана ко времени и когда оно, время, приходит значение сохраняется даже перевод стрелок не спасает вредного клиента от головной боли, и ему придется раскошелится или связаться с разработчиком.
3)Идем дальше, бывают ситуации когда нужно позволить пользователю обновить конфигурацию, но если вы поставили пароль то при объединении он его обязательно спросит, что же делать, мой вам совет выполните все ваши важные и ключевые процедуры, функции (Даже можно включить вызов из них функции защиты) в экпортном виде, в модуле внешней обработки (модуль которой конечно вы закрыли).
Обработка готова и ваш документ умеет к ней обращатся, теперь нужно сохранить ее в двоичном виде макета, в объекте метаданных который вы разрабатывали.
Можно использовать такой код :
И теперь обращаясь к нашим любимым процедурам через созданную и закрытую обработку, мы не имеем проблем с обновлением.
Примечание - большая часть написанного здесь текста с примерами взята по памяти (пару лет назад изучал достаточно подробно, поэтому может что-то в алгоритмах не работать - я ведь их не копировал откуда-то, а прямо тут же и писал, так что за синтаксические ошибки не пинайте) - на данный момент я активно OLE не пользуюсь (не из-за каких-то проблем с самим OLE, а из-за отсутствия надобности в его использовании в текущий момент).
Основные преимущества, благодаря которым OLE активно используется:
* Для вызывающей базы "по барабану" - какой тип вызываемой базы (DBF или SQL)
* Объектами вызываемой базы можно управлять всеми известными методами работы с объектами в 1С (т.е. со справочниками работают методы ВыбратьЭлементы(), ИспользоватьДату() и т.п., с документами - ВыбратьДокументы() и т.п.), соответственно, можно напрямую решить - стоит отрабатывать конкретные объекты базы OLE или пропустить их.
Пример 1. Присоединение к базе 1С через OLE.
БазаОле=СоздатьОбъект("V77.Application"); // Получаем доступ к OLE объекту 1С
Локальная версия (на одного пользователя): V77L.Application
Сетевая версия: V77.Application
Версия SQL: V77S.Application
Далее вместо термина "вызываемая база" будет написано просто "база OLE", а вместо термина "вызывающая база" - "местная база"
Теперь, мы должны знать несколько параметров для запуска базы OLE: Каталог базы, имя пользователя и пароль. Ну, наверное, еще и желание запустить 1С в монопольном режиме :)
Комментарий: функции СокрЛП() стоят в примере на случай, если пользователь захочет указанные выше переменные сделать в форме диалога, а проблема при этом состоит в том, что в алгоритм программа передаст полное значение реквизита (т.е. допишет в конце значения то количество пробелов, которое необходимо для получения полной длины строки (указана в свойствах реквизита диалога)).
Пример 2. Доступ к объектам базы OLE.
Запомните на будущее как непреложный факт:
1. Из местной базы в базу OLE (и, соответственно, наоборот) напрямую методом присвоения можно перенести только числовые значения, даты и строки ограниченной длины!!! Т.е. местная база поймет прекрасно без дополнительных алгоритмов преобразования полученного значения только указанные типы значений. Кроме того, под ограничением строк подразумевается проблемы с пониманием в местной базе реквизитов объектов базы OLE типа "Строка неограниченной длины". К этому же еще надо добавить и периодические реквизиты. Естественно, под методом присвоения подразумеваются и попытки сравнить объекты разных баз в одном условии (например, в алгоритмах "Если" или "Пока" и т.п.).
2. Есть проблемы при попытке перенести "пустую" дату - OLE может ее конвертировать, например, в 31.12.1899 года и т.п. Поэтому вам лучше заранее выяснить те значения, которые могут появится в местной базе при переносе "пустых" дат, чтобы предусмотреть условия преобразования их в местной базе.
A) Доступ к константам базы OLE:
Б) Доступ к справочникам и документам базы OLE (через функцию "CreateObject"):
После создания объекта справочника или документа к ним применимы все методы, касающиеся таких объектов в 1С:
Заметьте, что если вместо "Сообщить(Спр.Наименование)" вы укажете "Сообщить(Спр.ТекущийЭлемент())", то вместо строкового/числового представления этого элемента программа выдаст вам в окошке сообщение "OLE". Именно это я и имел в виду, когда говорил, что напрямую мало что можно перенести. Т.е. не будут работать следующие методы (ошибки 1С не будет, но и результат работы будет нулевой). Рассмотрим следующий пример:
Однако, сработает следующий метод:
Отсюда вывод: возможность доступа к объектам базы 1С через OLE требуется, в основном, только для определенной задачи - получить доступ к реквизитам определенного элемента справочника или документа. Однако, не забываем, что объекты базы OLE поддерживают все методы работы с ними, в т.ч. и "Новый()", т.е. приведем пример противоположный предыдущему:
В) Доступ к регистрам базы OLE (Не сложнее справочников и документов):
Г) Доступ к перечислениям базы OLE (аналогичен константе):
ЗначениеПеречисленияOLE = БазаОле.Перечисление.Булево.НеЗнаю; // :)
Заметьте, что пользы для местной базы от переменной "ЗначениеПеречисленияOLE" особо-то и нет, ведь подобно справочнику и документу перечисление также напрямую недоступно для местной базы. Пожалуй, пример работы с ними может быть следующим (в качестве параметра условия):
По аналогии со справочниками и документами работает объект "Периодический", план счетов работает по аналогии с ВидомСубконто, ну и далее в том же духе… Отдельную главу посвятим запросу, а сейчас… стоп. Еще пункт забыл!
Ж) Доступ к функциям и процедурам глобального модуля базы OLE!
Как же я про это забыл-то, а? Поскольку при запуске базы автоматически компилируется глобальный модуль, то нам становятся доступны функции и процедуры глобального модуля (поправлюсь - только те, у которых стоит признак "Экспорт"). Плюс к ним еще и различные системные функции 1С. А доступны они нам через функцию 1С OLE - EvalExpr(). Приведем примеры работы с базой OLE:
На самом деле, в последней строке примера я исхитрился и забежал немного вперед. Дело в том, что как и запрос (см. отдельную главу), так и EvalExpr() выполняются внутри базы OLE, причем команды передавается им обычной строкой, и поэтому надо долго думать, как передать необходимые ссылки на объекты базы OLE в строке текста местной базы. Так что, всегда есть возможность поломать голову над этим…
Алгоритмы преобразования объектов в "удобоваримый вид" между базами.
Ясно, что алгоритмы преобразования нужны не только для переноса объектов между и базами, но и для такой простой задачи, как попытки сравнить их между собой.
И еще раз обращу внимание: ОБЪЕКТЫ ОДНОЙ БАЗЫ ПРЕКРАСНО ПОНИМАЮТ ДРУГ ДРУГА, ПРОБЛЕМЫ ВОЗНИКАЮТ ТОЛЬКО ТОГДА, КОГДА ВЫ НАЧИНАЕТЕ СВЯЗЫВАТЬ МЕЖДУ СОБОЙ ОБЪЕКТЫ РАЗНЫХ БАЗ, т.е. команда
будет прекрасно работать без ошибок. Не забывайте это, чтобы не перемудрить с алгоритмами!
Итак, повторяюсь, что напрямую перенести, да и просто сравнить можно только даты (причем не "пустые"), числа и строки ограниченной длины. Итак, как же нам сравнить объекты разных баз (не числа, не даты, не строки), т.е. как их преобразовать в эту самую строку/число/дату.
А) Преобразование справочников/документов базы OLE (если есть аналогичные справочники/документы в местной базе). В принципе, преобразование их было уже рассмотрено в примерах выше и сводится к поиску их аналогов в местной базе. Могу еще раз привести пример, заодно с использованием регистров:
Б) Преобразование перечислений и видов субконто (подразумевается, что в обоих базах есть аналогичные перечисления и виды субконто). Вся задача сводится к получению строкового или числового представления перечисления или вида субконто.
Не поймите это как прямую команду воспользоваться функцией Строка() или Число() :)) Нет. Для этого у нас есть обращение к уникальному представлению перечисления и вида субконто - метод Идентификатор() или ЗначениеПоНомеру(). Второй вариант не очень подходит, так как зачастую в разных базах даже перечисления бывают расположены в другом порядке, а вот идентификаторы стараются держать одинаковыми в разных базах. Отсюда вывод, пользуйтесь методом Идентификатор(). Кстати, не путайте вид субконто с самим субконто! Привожу пример преобразования:
То же самое относится и к плану счетов - принцип у него тот же, что и у вида субконто…
В) Преобразование счетов:
Во многом объект "Счет" аналогичен объекту "Справочник". Отсюда и пляшем:
Работа с запросами и EvalExpr().
Наконец-то добрались и до запросов. Надо пояснить несколько вещей, касаемых запросов (да и EvalExpr() тоже). Самое главное - компиляция текста OLE-запроса (т.е. разбор всех переменных внутри запроса), как и сами OLE-запросы выполняются внутри базы OLE и поэтому ни одна переменная, ни один реквизит местной базы там недоступны, да и запрос даже не подозревает, что его запускают по OLE из другой базы!!! Поэтому, чтобы правильно составить текст, иногда требуется не только обдумать, как передать параметры запроса в базу OLE, но и обдумать, что нужно добавить в глобальный модуль той самой OLE-базы, чтобы как-то собрать для запросы переменные!
1. Поскольку сам текст запроса и функции EvalExpr() является по сути текстом, а не набором параметров, то напрямую передать ему ссылку на элемент справочника, документ, счет и т.п. нельзя. Исключение может быть составлено для конкретных значений перечислений, видов субконто, констант, планов счетов и т.п.
2. Хоть и многим и так понятно, что я скажу дальше, но я все-таки уточню: при описании переменных в тексте запроса не забывайте, что объекты базы надо указывать напрямую, без всяких префиксов типа "БазаОле".
3. Отрабатывать запрос сложно тем, что ошибки, например, при компиляции напрямую не увидеть. Поэтому начинаем пошагово готовится к отработке запроса в базе OLE.
Вначале допишем в глобальном модуле базы OLE немного строк, которые нам помогут в работе:
Теперь начинаем потихоньку писать сам запрос. Что мы имеем:
В форме диалога местной базы несколько реквизитов диалога (либо местные переменные):
* Даты периода (НачДата и КонДата)
* Элементы справочников для фильтрации (ВыбТовар, ВыбФирма, ВыбКлиент, и т.д.)
* Какие-либо флажки (ТолькоЗамерзающийЗимойТовар , ..)
Мы начинаем писать запрос и сразу попадаем в такую ловушку:
ТекстЗапроса = " Период с НачДата по КонДата; ";
Вроде все в порядке, но такой запрос не выполнится в базе OLE, так как там понятия не имеют, что такое НачДата и КонДата :)) Ведь эти переменные действительны только для местной базы! Переписываем запрос заново:
Казалось бы все очень просто. По аналогии - если уникальность для товаров ведется по наименованию, то простой заменой слова "код" на "наименование" мы решаем вопрос и здесь. Теперь рассмотрим, когда мы выбрали группу, т.е. текст условия должен будет выглядеть так:
И здесь, правда можно проблему решить "двумями путями" :)) Первый пусть - когда мы имеем дело с двухуровне вымсправочником. Тогда проблема группы решается также просто, как и в 1-м варианте:
А если справочник очень даже многоуровневый? Вот для этого мы и используем написанную ранее функцию. Предположим, что список значений запроса с индексом массива " 1 " мы будем использовать для хранения подобных значений (например, хранить в нем группы товаров, клиентов) для хитрых условий. Итак, например, в ВыбТовар у нас указана группа товаров, а в ВыбКлиент - группа клиентов, которым мы товары группы ВыбТовар продавали. Кроме того, мы должны пропустить накладные возвратов поставщикам, и не забыть, что товары надо еще отбирать по флажку ТолькоЗамерзающийЗимойТовар:
Ну, а с реквизитами запроса разбираемся так же, как указано было выше в предыдущих разделах… И не забываем, что кроме хранения конкретных значений, можно использовать другие списки значений запроса. Например, можно заполнить какой-либо список значений запроса списком клиентов и использовать его в запросе:
На примере создания иллюстрации можно понять основные приемы работы с Blend Tool, а также некоторые нюансы, которые следует учитывать для достижения положительных результатов. Это не прямое руководство, это лишь способ, один из многих, который позволяет понять алгоритм основных действий и решать в дальнейшем более сложные и конкретные задачи.
Не обычное применение Blend Tool.
На примере создания иллюстрации можно понять основные приемы работы с Blend Tool, а также некоторые нюансы, которые следует учитывать для достижения положительных результатов. Это не прямое руководство, это лишь способ, один из многих, который позволяет понять алгоритм основных действий и решать в дальнейшем более сложные и конкретные задачи.
Свеча на рисунке выглядит достаточно реалистичной, для ее создания использовалась техника описания ниже. Забегая вперед, скажу что время, затраченное автором не превышает одного часа, в рисунке использовалось шестнадцать нарисованных вручную элементов, все остальное сделано автоматически инструментом Blend Tool.
Для начала определимся с основными формами. В данном случае это пламя, ореол света, фитиль и собственно свеча. Те самые шестнадцать элементов это парные объекты, начальные и конечные, между которыми и производится операция перетекания, благодаря чему цвета плавно распределяются и рисунок выглядит реалистично. Это не маловажный аспект, цвет конечного (в данном случае внешнего) объекта языка пламени должен совпадать с цветом начального (внутреннего) объекта ореола, а цвет конечного объекта ореола с цветом фона.
Инструментом Bezier Tool по контрольным точкам нарисуем кривую. Следует отметить, что операции с кривыми требующие определенной точности нужно проводить именно Bezier Tool или Pen Tool, и изначально рисовать прямыми линиями, то есть определить на глаз где должны находится узлы и соединить их прямыми линиями. Инструмент Freehand Tool здесь не подойдет из-за неточности. Итак, когда линия проведена, делаем двойной клик на инструменте Shape Tool, двойной клик выделит все узлы элемента и все линии легко сделать кривыми командой Convert Line To Curve на панели свойств (Property Bar) активной при выбранном инструменте. Оставив активным инструмент Shape Tool отредактируем кривую до нужного вида, для хорошего перетекания важно чтоб все было плавно.
Не торопитесь с построением следующего объекта, здесь есть один важный нюанс. В идеале начальный объект дублируется и путем редактирования превращается в конечный. Дублируем кривую нажатием «+» на цифровой клавиатуре и инструментом Shape Tool тянем узлы на нужные позиции, с помощью направляющих линии доводятся до нужной степени изогнутости. Таким образом, получается кривая с тем же количеством схожих по свойствам узлов, что обеспечивает бес проблемное выполнение операции перетекания (Blend).
Далее руководствуясь теми же принципами рисуются остальные элементы рисунка. Язык пламени достаточно сложный объект, в нем используется три пары кривых, три последовательных перетекания.
Когда все пути готовы можно приступать к выбору цветовой гаммы. Здесь тоже следует обратить внимание на некоторые нюансы. Например не следует осуществлять переход от темно-желтого к светло-желтому в системе CMYK таким образом: из C0:M20:Y100:K20 в C0:M0:Y60:K0, так как в промежутке появятся «грязные» цвета типа C0:M11:Y81:K11, что значительно испортит вид рисунка. Такой переход лучше осуществить в два этапа: из C0:M20:Y100:K20 в C0:M0:Y100:K0, а из последнего в C0:M0:Y60:K0. Это стоит запомнить, руководствуясь таким принципом строятся и качественные градиенты, программные средства не идеальны, не следует полностью доверять им в таком важном аспекте как работе с цветом. Здесь не стоит ленится и жалеть времени, это один из завершающих этапов создания иллюстрации, следует уделить ему внимание, по экспериментировать и получить впоследствии картинку с яркими и сочными цветами, достойную глянцевой обложки.
Подготовительный, рутинный и самый сложный этап работы закончен. Теперь осталось самая приятная часть – создание переходов между объектами, превращение набора плашек в фотореалистичную иллюстрацию.
Выбираем инструмент Interactive Blend Tool или открываем докер Effects>Blend, делаем переход от объекта к объекту вручную или выбираем пару и нажимаем кнопку Apply в докере. В зависимости от исходного размера рисунка устанавливаем количество шагов (Steps).
Проблем возникнуть не должно если все сделано правильно, но все же если что-то упущено вместо ровного перехода может возникнуть цепочка из непонятных «рваных» объектов, не имеющих на первый взгляд никакого отношения к оригинальным и тем более к задуманному. Не стоит отчаиваться, для настоящего профессионала нет проблем которые нельзя решить. Такая ситуация может возникнуть в двух случаях: пути объектов имеют разное направление или несовпадающие узлы (даже если узлов одинаковое количество). Первая проблема решается просто, инструментом Shape Tool выделяется один объект и инвертируется направление кривой командой Reverse curve direction на панели свойств. Если не помогло придется самому назначить начальные и конечные узлы перетекания (предварительно убедившись что их одинаковое количество), для этого у инструмента есть набор опций Miscellaneous Blend Options (иконка с плюсиком на Property Bar, или последняя в докере), а в нем функция Map Nodes. После клика по ней курсор превратится в изогнутую стрелку и на одном из исходных объектов отобразятся узлы в виде увеличенных квадратиков, после клика на одном из таких квадратиков активируется второй объект с аналогичным отображением узлов, теперь следует кликнуть по узлу соответствующему первому выбранному, и повторить если потребуется на всех контрольные точки, хотя на практике все стает на свои места после «синхронизации» двух-трех узлов. Функция Split тоже достаточно интересна, она позволяет выделить любой объект из уже сделанного перетекания и сделать его третьим (средним) исходным и произвести над ним манипуляции (изменить цвет, размер, форму и т.д.) таким образом изменив все перетекание, в некоторых случаях достаточно удобно.
И на последок хотелось бы отметить. Данная статья лишь иллюстрирует на небольшом примере возможности программы и ее инструментов. Многие пользователи CorelDRAW недооценивают возможности Blend Tool и пренебрегают ее использованием, но при хорошо освоенной технике и достаточной практике с помощью инструмента без особого труда можно создавать сложные фотореалистичные, технически грамотные иллюстрации и элементы дизайна. Пламя, хромовые, матовые и глянцевые поверхности, объемные предметы и фигуры, тени – все это далеко не полный перечень того что можно изобразить этой техникой.
Откроем замечательную векторную программу Adobe Illustrator и попробуем нарисовать кусочек сыра (если вы не знаете, что такое векторный и подобные вещи, то читайте статью «Первые шаги - компьютерная графика и графические редакторы»).
Изучаем векторную графику (Adobe Illustrator).
Откроем замечательную векторную программу Adobe Illustrator и попробуем нарисовать кусочек сыра (если вы не знаете, что такое векторный и подобные вещи, то читайте статью «Первые шаги - компьютерная графика и графические редакторы»).
Для начала нужно создать новый документ (лист бумаги, на котором будем рисовать). В меню выбираем File - New...
Выбираем нужные размеры документа, и наживаем OK, чтобы его создать (в данном случае, взяты значения, те, что предложил Иллюстратор по умолчанию).
Так как рисуем сыр с нуля и еще не умеем, то воспользуемся сыром образцом (будем срисовывать).
Чтобы поместить не векторное изображение на лист, выбираем в меню: File - Place... - выбираем рисунок, который надо разместить на листе.
Прежде чем начать работать с сыром, его надо увеличить. Чтобы сделать саму картинку с сыром больше, надо кликнуть по ней левой кнопкой мыши - таким образом, выделится объект и вокруг него появится рамочка. Потянем за уголок - и таким образом можно изменить размер картинки. Чтобы при этом картинка не деформировалась и сохраняла пропорции, то придерживаем, когда тянем за уголок, клавишу Shift на клавиатуре.
Чтобы изменить видимый размер картинки (приблизить - отдалить) - выберем инструмент лупа (zoom tool) на основной панели инструментов. Этот инструмент, наводим на картинку, кликаем левой кнопкой мыши - изображение приблизится. Если наоборот, отдалить, то кликаем мышью по изображению, придерживая кнопку Alt на клавиатуре. Чтобы снова работать с изображением (т.е. выйти из режима лупы), надо выбрать другой инструмент на панели инструментов (например, следующий инструмент, с которым вы будете работать).
Итак, видимый размер куска сыра увеличен, чтобы было удобнее его обрисовывать, теперь фиксируем картинку с сыром на листе, чтобы, когда с ней начнем работать, она никуда не сдвинулась нечаянно. Для этого выбираем на панели инструментов черную стрелку (selecтion tool), после чего кликаем по рисунку, чтобы его выделить (всегда, объект, с которым работаем, должен быть выделен), затем в меню выбираем Object - Lock - Selecтion.
На панели инструментов выбираем инструмент перо (pen tool), с помощью него обрисовываем сыр. Но прежде чем, обрисовать сыр, надо убрать заливку объекта. Квадраты - белый и черный - внизу панели инструментов, указывают, какой цвет будет у объекта, который рисуем - он будет белым, и вокруг него будет черная граница.
Чтобы изменить цвет границы или цвет объекта - кликаем два раза по нужному квадрату (если нужно изменить границу - то по черному, в данном случае, если цвет объекта - по белому), и появится окошко, где можно выбрать другой, нужный цвет. Но в этом случае, другой цвет не нужен, надо, чтобы объект не был закрашен, и было видно только границу (контур объекта) - так будет удобнее срисовывать. Поэтому одним кликом мыши выбираем белый квадрат, и под ним выбираем иконку с квадратом, перечеркнутым красной полосой - таким образом, говорим иллюстратору - отмени заливку объекта белым цветом, и он это сделает.
Теперь начнем обрисовывать сыр, сначала светлую верхнюю плоскость, а затем нижнюю. Кликнем, допустим, в одном из уголков сыра, затем, повторяя контур сыра, кликаем дальше. Чтобы все линии (отрезки, которые появятся при этом), были прямыми, то когда надо кликнуть мышью, чтобы создать очередную точку, не отпуская левую клавишу мыши, тогда удерживая ее и двигая мышью, можно выгнуть отрезок, как угодно, и таким образом более точно обвести сыр.
Если был сделан отрезок кривым (выгнутым), то прежде чем продолжать обрисовывать объект, надо кликнуть левой кнопкой мыши по последней точке, которую поставили, и только затем создавать новую точку и отрезок. Если этого не сделаете, то следующий отрезок выгнется подобно предыдущему.
Если не верно поставлена точка, если отрезок как-то не так выгнут, то чтобы отменить действие, нажимаем на клавиатуре Ctrl+Z. Если отменили предыдущее действие ошибочно, то нажмите Ctrl+Shift+Z, чтобы вернуть все обратно.
Чтобы завершить обрисовывать верхнюю часть сыра надо обязательно закончить в той точке, с которой начали, чтобы получить цельный объект (т.е. замкнуть наш контур).
Аналогично первому создаем второй контур (объект).
Чтобы нагляднее было видно, что на картинке два контура: второй, недорисованный контур, немного сдвинут в сторону. При этом создание объекта не было прервано. Что делать, если надо довести контур объекта, после того как прервались? Чтобы продолжить работу, надо ткнуть кнопкой мышки в точку объекта, на которой прервались и можно дорисовывать объект дальше (естественно, при этом на панели инструментов должно быть выбрано перо, если надо дорисовать объект; если же надо подвигать объект, то переключаемся на selecтion tool - черная стрелка, только не забыть переключаться на нужные инструменты, прежде чем выполнять какие-то действия над объектом).
Когда нарисованы нужные объекты, следует их закрасить. Как это делается, объяснялось ранее: выделяем объект, и внизу панели через квадраты оперируем цветом. Есть и другие пути: можно вызвать цветовую палитру, чтобы она всегда на экране: Window - Color (опять же выделяем объект, прежде, чем дать ему цвет). Также можно, выделив объект, выбрать инструмент пипетка (eyedroррer tool) на панели инструментов, и ткнуть пипеткой по другому объекту на листе (например, по картинке с сыром, чтобы дать новому объекту такой же цвет, как цвет куска сыра, с которого срисовываем).
На данном примере три куска сыра: один - с какого срисовываем, второй - кусок сыра, которому дали такие же цвета, как сыру на картинке, но т.к. цвета не сырные, заплесневелые, то были подобранны другие цвета, которые можно видеть на третьем куске сыра. Если еще трудно сделать последнее самим, то сохраните картинку с примером на компьютере, поместите ее на лист бумаги в иллюстраторе и при помощи пипетки, дайте вашему куску сыра такие же яркие и приятные цвета, как у третьего куска сыра на картинке с примерами.
Как перемещать и копировать нарисованные объекты? Перемещать объекты надо следующим образом: выделить объект, предварительно выбрав инструмент selecтion tool (черная стрелка) на панели инструментов, а затем при помощи мышки перетащить выбранный объект. Если надо переместить сразу несколько объектов: опять же выбираем selecтion tool, и далее либо удерживая левую кнопку мыши выделяем все объекты, либо кликаем на нужные нам объекты поочередно, удерживая клавишу Shift на клавиатуре. После того как были выделены все нужные объекты, их можно перемещать, куда угодно. Также, выделив объекты, можно скопировать их Edit - Copy. Чтобы вставить скопированные объекты на лист - Edit - Paste. Чтобы удалить, выделенные объекты - Edit - Clear.
После придания куску, который рисуем, нужные цвета, рисуем на нем сырные дырки, чтобы придать ему еще большую схожесть с сыром. Дырки не будем срисовывать с фотографии куска сыра, а нарисуем сами. Дырка - это круг. Круги рисуют при помощи инструмента elliрse tool. Чтобы найти этот инструмент на панели инструментов надо кликнуть мышкой по инструменту квадрат (rectangle tool), удерживая мышку, выпадет меню, в котором надо выбрать elliрse tool. Далее кликаем на нашем листе в любом месте и рисуем круг.
Нарисовав круг, даем ему цвет более насыщенный и темный, чем боковая сторона сыра (т.к. дырка для этой стороны, а дырка она визуально более темная по цвету, чем сама сторона). Если переместить, нарисованный круг, на кусок сыра, то станет понятно, что он еще не смотрится дыркой, не хватает "глубины", так что надо приблизить круг (дырку) ближе к реальности, добавив ей бликов и теней.
Итак, скопируем круг, и вставим скопированное на лист (как это делается, рассказывалось ранее). Затем совместим круги так, как показано на рисунке (в итоге должно быть три круга - один исходный, и два которые, скопировав исходный круг, вставили на лист, а затем совместили между собой новые круги, как показано на рисунке):
Теперь порежем эти круги при помощи Pathfinder. Вызываем его через меню: Window - Pathfinder. Далее оба круга выделяем, и нажимаем в окошке Pathfinder инструмент Divide. Если сейчас попытаться подвигать круги, то обнаружите, что они слиплись в один объект. На самом деле, Divider порезал наши круги на много маленьких объектов, но для удобства, он их потом сгруппировал (вдруг захочется их передвинуть сразу куда-нибудь). Поэтому надо рассгруппировать все объекты. Выделяем нашу группу объектов, выбираем в меню - Object - Ungroup.
Если теперь попробовать мышкой подвигать круги, то видим, что их все-таки разрезали, и получили в итоге три очень интересных объекта: два полумесяца и объект похожий на дыню. Круги и резали, т.к. нужны были полумесяцы. Скопируем один из полумесяцев, вставим на лист, дадим ему цвет чуть бледнее, чем цвет круга, и переместим на круг, как показано на нашем рисунке (см. чуть выше).
Затем еще раз копируем полумесяц и вставляем его на лист, делаем его еще светлее, и переносим на наш круг, как показано на рисунке:
Теперь нужен другой полумесяц, зеркальный тем, что копировали до этого. Берем полумесяц, копируем, даем ему самый темный цвет по сравнению с другими объектами, перемещаем на круг так, как показано на рисунке:
Вот и все, сырная дырка готова, теперь надо переместим ее на сыр. Для этого надо сгруппировать все объекты, имеющие отношение к сырной дырке, чтобы потом было легче их копировать и перемещать при необходимости. Чтобы сгруппировать объекты, их нужно выделить, а затем группируем их, выбрав в меню Object - Group (если надо будет снова разбить объекты, отклеить друг от друга, то выделяем сгруппированные объекты, и при помощи уже знакомого Object - Ungroup).
Итак, переместили дырку на сыр, теперь скопируем ее, и вставим еще несколько новых дырок на боковую сторону сыра. Сделаем их размеры разными (как, уменьшать-увеличивать размер объекта говорили в начале статьи). В итоге, должны получить, вот такой сыр:
Чтобы сыр был похож на настоящий, добавим еще одну полудырку, а так же теней и рефлексов на края.
Для этого берем готовую дырку, копируем, вставляем на лист (отдельно от сыра), и затем при помощи Pathfinder и Divider ее ополовиниваем. Также копируем два полумесяца, которые потом, вставим на край сыра. Получаются две следующие картинки:
Теперь и половинку дырки, и два полумесяца немного развернем при помощи инструмента rotate tool. Края сыра идут немного под наклоном, и чтобы совместить дырки с краями куска сыра, их надо привести в соответствие. Теперь наложим их на кусок сыра, если надо еще чуть-чуть поразворачиваем, и в итоге должны получить следующее:
Итак, кусок сыра почти нарисовали, теперь надо нарисовать дырки для верхней плоскости (копируем уже имеющиеся дырки, и немного изменяем им цвет на посветлее, затем немного их трансформируем до овалов, и разворачиваем при помощи rotate tool):
Теперь еще для красоты можно нарисовать при помощи пера парочку рефлексов и теней, и сыр готов:
Можете идти ловить мышей. Хотя... умея рисовать картинки в Иллюстраторе, вам будет не до мышей.
Событие - это какое-либо действие, осуществляемое пользователем либо браузером. Например, когда мы щелкаем (кликаем) на ссылке - осуществляется событие, его перехватывает специальный обработчик и перенаправляет нас на нужную страницу; при наведении курсора (указателя мыши) на ссылку в строке состояния (обычно находится в нижней части окна браузера) отображается адрес, так как обработчик "наведения курсора на объект (в данном случае на ссылку)" помещает туда этот адрес и так далее...
а). onmouseout и onmouseover
Для начала наведем курсор на кнопку "Сброс" или "Отправить" и обратим внимание на строку состояния. Вы должны увидеть там надпись с объяснением значения кнопки. Теперь отведите курсор и строка состояния очистится.
Содержимое строки состояния хранится в переменной window.status. Переменная это некоторый объект (можно представить себе ящик), значение которого (содержимое которого) можно изменять. Изменение значения осуществляется операцией присваивания (=), а выглядит она следующим образом:
имя_переменной = "значение"; (какие использовать кавычки: одинарные или двойные значения не имеет)
Поэтому для того, чтобы изменить надпись в строке состояния, нам нужно присвоить переменной window.status нужное нам значение (подсказку к кнопке), а когда курсор будет убран - присвоить пустую строку("").
Вся задача сводится к тому, чтобы определить когда пользователь наводит курсор на кнопку, а когда убирает его. Для этого нужно "сказать" обработчикам этих событий выполнить нужное нам действие. Обработчик события "наведение курсора" - onmouseover, а "отведение курсора" - onmouseout.
Очень многие тэги имеют атрибуты, начинающиеся с on (onclick, onmouseout, onfocus и т. д.). Значение этих атрибутов и есть, задача которую необходимо выполнить соответствующему обработчику. То есть для обработчика onmouseout есть атрибут onmouseout, для onmouseover - onmouseover. И в итоге мы получаем следующее определение кнопок:
Как Вы видите, атрибут onmouseover имеет в качестве значения JavaScript-код: window.status='Щелкните для отправки данных', как только курсор достигает кнопки, обработчик события mouseover - onmouseover, смотрит, что хранится в атрибуте onmouseover и выполняет необходимое действие(присвоение значения переменной window.status). Аналогично действует и обработчик события onmouseout: как только курсор уводиться от кнопки (то есть выполняется событие mouseout), то обработчик события - onmouseout выполняет код, содержащийся в атрибуте onmouseout.
То же самое и со второй кнопкой.
б). <a href="Java Scriptfunction()">Function</a>
Теперь щелкните на ссылке и откроется окошко с подсказкой. Но заметьте, что окно небольших размеров и у него нет панели инструментов - такого силами html не сделаешь! В данном примере мы имеем окно размером 300x200, без панелей инструментов, содержащее документ help.html.
Для того чтобы создать такое окошко существует следующий JavaScript-код:
где:
1. helpWindow - это имя переменной (как window.status, только в данном случае имя выбирается произвольно). Эта переменная нужна для последующей работы с окном (например, закрыть его нестандартным способом - с помощью JavaScript-сценария).
- Зачем? Не проще ли указывать просто имя открывающейся страницы, например help.html?
- А если у нас две копии одной и той же страницы? Или две страницы с одинаковым именем(например, в разных папках)? Вот для того, чтобы не перепутать страницы и свободно работать именно с тем окном с которым предполагаешь и сделанно, так чтобы "окно" присваивалось переменной, так как имя переменной можно выбрать любое.
2. window.open(что-то) - это функция. Функции выполняют определенную задачу, в данном случае window.open() открывает новое окно.
3. help.html - это страница, которую нужно открыть.
4. "" - В кавычках должно быть имя окна, но оно нам не пригодится, поэтому там нулевая строка. В следующих кавычках указываются "параметры открываемого окна": оно не должно содержать панели инструментов (toolbar=0) и должно быть шириной 300 пикселей, а высотой - 200 (width=300,height=200, соответственно).
Теперь все, что нужно это по событию "щелчка" выполнить этот код, однако есть два "но". Во-первых строка очень длинная, чтобы присвоить ее какому-либо атрибуту - будет некрасиво смотреться, да и вызывать неудобства при чтении кода страницы. Во-вторых, первоначальное предназначение ссылки - это переход на другую страницу, но нам переходить никуда не нужно, нам нужно выполнить вместо этого JavaScript-код.
Первое решается написанием функции. Как я уже говорил функция выполняет некоторую задача, причем для использования функции достаточно указать ее имя. Можно не только использовать предопределенные(функции, которые имеется в языке и без нас), но и писать их самому. Обычно функции определяются(пишутся) в разделе HEAD документа, в котором используются:
"function" значит, что дальше будет написана наша функция; help() - это имя функции (оно будет указываться вместо тела функции (между { и })).
Вторая проблема решается тоже довольно просто. Адрес страницы указывается в атрибуте href, а нам надо выполнить JavaScript код вместо перехода по ссылке:
"Java Script" означает, что дальше должен идти JavaScript-код, и что он должен выполняться вместо стандартного перехода по ссылке. В данном случае наш JavaScript-код - это созданная нами функция help().
в). onclick
Нам не остается ничего более, как закрыть окно со справкой. Для этого воспользуемся кнопкой "Закрыть". Но нас интересует то, как работает эта кнопка, а имеет она следующий вид:
Дабы закрыть окно мы сделали щелчок(Click) на кнопке "Закрыть", а щелчок это нажатие и отпускание кнопки мыши, причем и то и другое должно быть произведено на одном и том же элементе (например, на кнопке). Кликая, на кнопке мы активируем обработчик события onClick, который выполняет для нас JavaScript-код, прописанный в атрибуте onclick нашей кнопки. Помните мы открывали окно? Мы писали window.open(), а здесь тоже самое только window.close(). window - это текущее окно, а close() - закрыть.
Это одно из наиболее частоупотребляемых событий.
г). onfocus и onblur
Ну что ж будем ближе подбираться к вводу требуемой от нас информации.
Как я уже говорил: элемент получает фокус когда на нем происходит нажатие кнопки мыши, или на него осуществляется переход посредством клавиши табуляции (Tab), а теряет, когда фокус получает другой элемент. Наше поле для ввода получит фокус тогда, когда пользователь решиться ввести информацию. При этом было бы удобно, чтобы текст с подсказкой ("Введите Ваше имя") автоматически выделялся и посетитель мог его удалить одним нажатием на del, а не удалять по одному символу, или выделять текст вручную. Удобство пользователя свято. Итак, для этого мы воспользуемся событием focus. Для выделения текста используется метод select(). То есть атрибутом к полю надо прописать: onfocus="this.select();", this обозначает, что выделение должно происходить именно в этом текстовом поле (а можно прописать путь и к другому, но это не целесообразно).
А теперь попробуйте ничего не изменяя (или все удалив) убрать фокус (например, щелкнув в любом месте окна, или нажав Tab). Это событие blur, я прописал в нем выполнение функции: onblur="check();". Сама же функция имеет следующий вид (в разделе head страницы с формой между <script> и </script>):
document.forms[0].name.value - это то, что введено в текстовое поле. document - это текущий документ, forms[0] - первая форма на нашей страницы (отсчет с нуля), name = имя поля (задается атрибутом name (<input name="name">)), а value это и есть нужное нам значение (то, что введенно в текстовое поле, к которому м ы и написали путь). Введенное в поле мы присваиваем переменной val (var значит, что дальше идет имя переменной), чтобы в дальнейшем каждый раз не писать весь путь целиком.
Следующее это оператор if(если). Он выглядит следующим образом:
Мы сравниваем содержание переменной val с пустой строкой ('') и с начальной строкой ('Введите Ваше имя'). Обратите внимание, что сравнение не как в математике(с одним =), а сравниваются двума ==. || - или. Функция alert выводит окно с ошибкой (то, что в скобках - это текст ошибки). То есть:
И на всякий случай приведу целиком строку с кодом поля input:
д). onreset и onsubmit
Допустим, что пользователь заполнил форму неправильно, и он хочет очистить все поля формы одновременно: для этого он воспользуется стандартной кнопкой reset. Но что если пользователь щелкнет на ней по случайности (рука дрогнет, или в суете спутает с кнопкой submit), а форма была огромная, и он долго мучился ее заполнять..., ему будет грустно, и еще он будет долго материться. Поэтому хорошо бы у него дополнительно спросить: действительно ли он хочет очистить форму.
Вообще событие reset обрабатывается до очистки формы. А чтобы отменить очистку вообще, нам просто напросто надо вернуть обработчику события значение false, то есть прописать в соответствующем атрибуте: "return false;", а чтобы продолжить очистку: "return true;". А теперь вспомним функцию, которая выдает вопрос пользователю на подтверждение чего-либо, эта функция: "confirm('Вопрос?');". При нажатии "Ok", эта функция заменяется на true, а при нажатии "Cancel" на false. То есть все что от нас требуется, это прописать в теге <form> атрибут: onreset="return confirm('Вы действительно хотите сбросить форму?');". Тогда при нажатии "Ok" там на самом деле будет "return true;", и форма будет очищена, а если "Cancel", то "return false;" и очистка формы будет отменена.
Подобным образом действует событие submit, которое возникает при попытке отправить форму. Поскольку в нашем случае форму отправлять никуда не надо, то у меня просто написано: onsubmit="return false;". И сколько бы Вы не щелкали ничего не изменится (разве что Вы JavaScript отключите).
Обычно же обработчик onsubmit используется для верификации формы (то есть проверки на заполнение всех необходимых полей, правильность их заполнения, скажем, проверка по определенному шаблону и т. п.), для этого создается функция, которая выполняет все действия. Функция должна содержать операторы "return true" и "return false", которые позволяют, заменить функцию на true или false, соответственно, в зависимости от результатов проверки (если успешно, то true, если нет false). Но верификация данных это обширная тема, которая не может быть рассмотрена здесь. Один из примеров базовой верификации я привел, когда объяснял событие blur - подобную функцию можно использовать и здесь. Тогда <form> будет содержать атрибут: onsubmit="return function();".
Но не забывайте, что нельзя ограничиваться одной лишь проверкой языком JavaScript, ибо его поддержка может быть отключена у посетителя, и тогда все Ваши труды по защите...
е). onmousedown и onmouseup
Еще одна пара событий не нашла достойного места на странице, но я ее реализовал в виде кнопки "Button". Причем это не обычная html-кнопка, она реализована в виде двух картинок. Исходная кнопка хранится в файле с именем npressed.jpg, а нажатая - pressed.jpg. Чтобы достичь эффекта нажатия кнопки нам необходимо, чтобы при при щелчке на ней(this) значение атрибута src (путь к картинке) тега <img> менялось на pressed.jpg, а при отпускании обратно на npressed.jpg. Нажатие кнопки обрабатывает onmousedown, а отпускание - onmouseup, то есть здесь все просто:
ж). onload, onunload и onabort
Обработчик события onload активируется, когда начинает загружаться графическая часть страницы (все тексты, графика и т.п.). onload является атрибутом тега <body>. Если честно я не вижу сколько бы реального применения этому событию, зато я нашел, что можно сделать с onunload. onunload это тоже атрибут тега <body>. Событие unload происходит когда мы пытаемся покинуть данную страницу (переходим по ссылке на другую, закрываем окно браузера, обновляем страницу и т. д.). Откройте еще раз окошко справки. Допустим, что пользователь прочитал справку, и хочет отправить форму, или уйдет с нашего сайта, но при этом он забыл закрыть это маленькое окошко с подсказкой, мы на выходе закроем его сами. А для этого тег <body> (у начального документа) у нас будет выглядеть следующим образом:
Вы должны бы помнить, что helpWindow это имя нашего окна (ведь именно этой переменной мы присваивали его открытие: helpWindow = window.open("help.html", "", "toolbar=0,width=300,height=200")), а метод close() закрывает это окно. Некоторые нехорошие люди используют это событие, чтобы когда посетители уходили с его страницы, появлялись какие-либо окна, так называемые pop-up.
onabort - атрибут тега <img>. Когда пользователь отменяет загрузку изображения происходит событие abort. Но отмена загрузки изображения может не входить в наши плане. И в качестве предупреждения у нас может быть написано нечто похожее на
ЗАКЛЮЧЕНИЕ
Есть некоторые события о которых я здесь нарочно не упомянул, потому что не нашел им достойного применения, но Вам они возможно пригодятся, поэтому я уделю им немного внимания.
onchange - обработчик события, который активируется, когда Вы изменяете содержимое текстового элемента или текстовой области (<TEXTAREA>) (например, когда Вы вводите или удаляете очередную букву какого-либо текстового поля).
onselect - обработчик события выбора текста. То есть это событие происходит, когда пользователь пытается выделить текст в текстовом элементе или текстовой области.
onerror - обработчик события error, которое возникает при ошибке загрузки документа или изображения (то есть onerror это атрибут тегов <body> и <img>). Оно возникает при синтаксической ошибке JavaScript-кода (но Вы ведь не будете специально делать в нем ошибки), либо ошибкой времени выполнения (например, если Ваш скрипт выполняет какие-либо вычисления и у Вас по ошибке получится так, что некое число будет делиться на ноль, а это недопустимо - это и есть одна из ошибок времени выполнения).
Так же не забывайте, что я привел лишь по одному примеру из десятков возможных на каждое событие. Здесь главное Ваша фантазия и навыки. Например, события mouseout, mouseover, mouseup, mousedown часто используются для создания выпадающих меню и других визуальных эффектов, но это весьма трудный материал, который требует более глубоких знаний, причем не одного JavaScript.
Всё что вы когда-либо хотели знать про mysql, php и кодировки, но боялись спросить! Почему кириллица на сайте отображается вопросами? Как правильно настроить сервер mysql для работы с кириллицей? Как поменять кодировку в mysql? Как изменить кодировку в скриптах php? Какую выбрать кодировку? Как сконвертировать базу данных из одной кодировки в другую? Эти и многие подобные вопросы с завидным упорством снова и снова поднимаются на различных форумах уже который год. В этом посте я постарался рассказать что нужно делать чтобы такие проблемы не возникали и дать наиболее эффективные советы на тот случай если они все-таки возникнут.
Mysql, php и кодировки. Источник проблем.
Проблемы с кодировками в Mysql обусловлены историей создания этой программы. Так как разрабатывали mysql - европейцы - для них было естественно выбрать в качестве основной кодировки более удобную для себя latin1. Странно, но и по сей день большинство инсталляций Mysql по умолчанию работают с этой кодировкой что и создает для пользователей кириллицы проблемы с добавлением в базу данных строк на русском и украинском языках - в latin1 эти символы просто отсутствуют.
Поэтому первое что нужно сделать при возникновении проблем с кодировками в mysql - нужно проверить какая кодировка является для данной инсталляции mysql основной. Проверить это можно несколькими способами.
Настройка сервера mysql для нужной кодировки.
* Если вы админ сервера или вы самостоятельно настраиваете собственную mysql на рабочей машине.
Откройте файл конфигурации mysql.ini (/etc/mysql.cnf для os linux) и найдите такие строки.
Вместо “название_кодировки” нужно подставить название той кодировки, которую вы будете использовать. Для текстов на русском и украинском языках можно использовать utf8 или cp1251 (обратите внимание - названия кодировок в mysql пишутся без обычного дефиса!!!). Но я советовал бы использовать только utf8 - так вы себе сэкономите в будущем немало нервов.
Если такие строки в файле конфигурации отсутствуют, то это означает что база данных использует по умолчанию ту кодировку, которая была задана при компиляции. Добавьте в конфиг нужные вам настройки кодировок (примеры ниже) и перезапустите mysql.
Если у вас возникли проблемы с кодировкой на хостинге, где вы не имеете прав администратора, то проверить настройки кодировки для mysql вы сможете другим способом: установите соединение с mysql (при помощи консольной команды mysql или phpmyadmin - как вам удобнее) и выполните такой sql-запрос: show variables like ‘char%’. Этот запрос покажет вам значения переменных mysql, которые имеют отношение к кодировкам. Скорее всего, вы увидите что-то вроде такого
Я специально привел выше пример НЕПРАВИЛЬНО НАСТРОЕННОГО СЕРВЕРА!!! Обратите внимание - в нем используются в разных случаях три(!) разные кодировки. Начинающему веб-программисту в такой ситуации будет сложно добиться корректной работы скрипта. Старайтесь чтобы все переменные были настроены на работу с одной и той же кодировкой. Тогда 99% проблем которые обсуждаются на форумах у вас просто не возникнут. Тут даже не столь важно какую именно кодировку вы выберете - главное чтобы она была везде одинаковой. Но все-таки старайтесь указывать в настройках ту кодировку, которую действительно будете использовать для хранения данных.
Итак, удачный вариант - это если команда show variables like ‘char%’ из абзаца выше покажет вам список одинаковых кодировок для каждой из переменных и еще лучше будет если эта кодировка совпадет с той которую используете вы.
Если же кодировка mysql отличается от вашей - не спешите расстраиваться. Изменить любую из этих переменных вы можете либо глобально, для всех правкой конфигов (если вы администратор сервера), либо только для себя - sql-запросом set character_set_database=utf8 (если вы пользователь). Такой запрос должен будет выполняться из вашего php скрипта сразу после установки соединения с сервером mysql. Ниже пример для установки кодировки utf8 из php скрипта.
Что касается character_set_database - постарайтесь сразу создать базу данных в нужной кодировке (как вариант - отправьте такую просьбу в техподдержку хостинга), тогда вы избежите по крайней мере одного лишнего запроса к mysql во время работы скрипта. Если удастся,то строчку с ‘character_set_database’ из приведенного выше кода можно будет удалить.
Примеры настроек сервера mysql для правильной работы с кодировками.
При правильно настроенном сервере делать запросы из скрипта для установки правильной кодировки уже будет не нужно.
Настройки для utf8
Проверка реальной кодировки в которой хранятся базы данных mysql.
В случае если вы все (и сервер, и php скрипт) настроили правильно, по инструкции выше, но русские буквы все равно не отображаются - проверьте действительно ли ваши строки сохранены в той кодировке, которую вы указали в настройках!!!
Простой способ проверки - сделайте дамп базы данных в sql-формате и откройте его в текстовом редакторе. Sql-формат - это обычный текст. Если ваша база данных mysql в кодировке cp1251 - открывайте в Блокноте. Если utf8 - в любом редакторе с поддержкой Юникода. Пролистайте файл и убедитесь что все надписи с кириллицей нормально читаются и что sql-команды create table и create database, которые встречаются в дампе содержат правильные названия кодировки mysql (той кодировки, которая вами была указана в настройках сервера или в запросах из php-скриптов.
Если кодировка не подходит - сделайте бекап базы на всякий случай, перекодируйте sql-дамп в любом текстовом перекодировщике, замените названия кодировок в файле на правильные и заливайте полученный файл на сервер mysql. Теперь с кодировками все должно быть в порядке.
На сегодняшний день ни один грамотно поддерживаемый сайт не обходится без анализа данных о посетителях сайта. Для чего нужна статистика? Только для того, чтобы наблюдать за темпом посещаемости сайта? Отчасти - да. Но умные люди найдут в статистике еще и дополнительный способ увеличения популярности своего сайта. Давайте же разберемся, чем сможет нам помочь статистика в этом плане.
Хост - уникальный посетитель вашего сайта. Другими словами - если один и тот же человек заходил к вам на сайт в течение дня несколько раз, то на счетчике хостов он будет засчитан только один раз.
Хит - количество загрузок всех страниц сайта, если счетчик установлен на каждой странце. Если один посетитель в течение одного дня возвращался к вам 10 раз или в течение одного сеанса просмотрел 10 страниц - на счётчике хитов будет отображена именно эта цифра. Информация будет суммироваться с приходом следующего юзера.
Реферал - (Refer) - англ. - ссылаться. Рефералом является ссылка на страницу, с которой к вам пришел пользователь. Это одна из самых важных частей статистики. Вы можете контролировать источники своей аудитории.
Анализируем :
Первым делом статистику надо получить. Те, кто не “обременен” платным хостингом, и, соответственно, не имеет доступа к логам сервера, могут воспользоваться бесплатным счетчиком. Благо, выбор довольно богатый. В зависимости от правил предоставителя счетчика его можно размещать как на одной странице, так и на всех. Идеальным выглядит, конечно же, второй вариант из соображений того, что почти каждое действие со стороны посетителя будет зафиксировано и статистика будет наиболее полной.
Итак, вы уже имеете ее, заветную информацию о посещениях вашего сайта. Теперь давайте искать пути использования статистики в целях раскрутки сайта или ликвидации тех факторов, которые препятствуют процессу раскрутки. Этому можно найти пример. Снимите в конце дня данные о количестве хитов и хостов на вашем сайте. Подсчитайте соотношение хиты/хосты, получившаяся цифра даст вам представление о том, сколько в среднем страниц загружает один посетитель. Если цифра окажется менее трех - это явно свидетельствует о том, что у вас не все в порядке с навигацией или отображением информации. Так же следует обратить внимание на контент (содержание) и скорость загрузки сайта. Без устранения этих недостатков раскрутка с мертвой точки не сдвинется.
Далее следует изучить наиболее популярные пути по сайту или наиболее популярные разделы сайта и уделить внимание менее популярным разделам, а может быть, и вовсе, заменить их на другие. Таким образом, все вышеописанные действия представляют собой первоначальную подготовку сайта к раскрутке.
Заимствуем “рефералов” :
Способ этот, насколько я знаю, еще нигде публично не излагался, поэтому я невольно являюсь первопроходцем в этой области. Всем известно, что сайт, зарегистрировавший счетчик, невольно попадает в своеобразный рейтинг сайтов. Вот туда мы и направимся. Причем неважно, зарегистрированы вы в этом рейтинге или нет. Из этого самого рейтинга в большинстве случаев можно получить доступ к статистике. Часть сайтов ее закрывает паролем, а часть оставляет “свободной”. Так вот в “свободной” статистике чужого сайта будет очень даже интересно покопаться. Особенно в отчете по “рефералам” (см. “на заметку”). Ищем наиболее прибыльные рефералы, идем на них и воплощаем идею сотрудничества с тем сайтом в жизнь. Таким образом, при удачном исходе вы будете сотрудничать с очень полезными сайтами, обладающими большой отдачей.
Не стоит забывать и про рефералов в своей статистике. Сайты, которые наиболее часто снабжают вас аудиторией следует лилеять и искать пути углубления сотрудничества.
В качестве заключения :
Таким образом, с помощью статистики можно не только выявить причины непопулярности сайта, но и раскрутить его. Конечно, речь не идет о мгновенном рывке в первые ряды TOPов, эффект будет поскромнее. Те, кто полагается на “авось сама раскрутится” очень ошибутся. Придется все же усердно поработать, прежде чем ваш счетчик закрутится. А кому сейчас легко? Ленивый веб-мастер - это не веб-мастер. Побольше вам “рефералов” и циферок на “крутилке”. И в добрый путь - бороздить рейтинги РуНета.
Выбор ключевых слов является одним из важнейших этапов оптимизации сайта под поисковые системы. Так как поисковики являются основным источником целевых посетителей, то этому вопросу надо уделять особое внимание. Правильно подобранные ключевые слова помогут пользователям легко находить страницы сайта, а также повысят их позицию в результатах выдачи по запросу.
Итак, для начала необходимо проанализировать тематику сайта и постараться взглянуть на него глазами посетителя. Цель такого упражнения-разминки – подбор слов и выражений, по которым, на ваш взгляд, производится поиск подобных сайтов.
Теперь можно приступить к детализации задачи, а именно, подбору ключевых слов для каждой страницы сайта отдельно. Большинство начинающих разработчиков при оптимизации допускают одну критическую ошибку, а именно, оптимизируют все страницы под одни и те же запросы. Они не учитывают тот факт, что машины поиска каждую страницу рассматривают независимо от остальных, поэтому необходимо оптимизировать страницы по отдельности, тщательно подбирая для них ключевые слова.
При анализе страницы необходимо написать около двух десятков ключевых слов, из которых попробовать сформировать фразы с учетом возможностей морфологического поиска и расположить слова и выражения в порядке их соответствия тематике страницы.
Например, ваша компания занимается продажей бытовой техники. Вместо использования в тегах HTML-кода и содержимом страниц ключевой фразы “продажа бытовой техники”, нужно уточнить эту фразу в зависимости от содержимого каждой страницы. Если на данной странице внимание сфокусировано, например, на кухонных комбайнах, то теги и текст необходимо оптимизировать именно под это выражение.
Сейчас идет тенденция к оптимизации страниц больше под ключевые выражения, чем под отдельные слова. Это связано с повышением уровня интернет-пользователей, которые для уточнения поисковых запросов из ключевых слов с помощью служебных символов строят ключевые фразы, значительно повышающие релевантность результатов поиска.
Следующий этап - это анализ частоты запросов по пунктам списка, составленного на этапе обдумывания тематики сайта. Здесь уже придется излагать не свое видение сайта, а вооружиться поисковой системой. Желательно брать тот поисковик, в трафике которого вы больше всего заинтересованы.
Составленный список предполагаемых ключевых слов можно проверить, например, с помощью сервиса «Яндекс.Директ» и выделить в нем фразы, сходные с заданными изначально. Далее необходимо посмотреть количество запросов для каждого выражения, выбранного на первом этапе, и попробовать найти фразы-синонимы. Если для них количество запросов будет больше, есть смысл заменить первоначальный вариант.
Чтобы выявить близкие по значению выражения, можно использовать сервис «Рамблер-Ассоциации», который представляет статистику поисковых запросов и работает по принципу «Те, кто ищут [запрос пользователя], ищут также». Сервис предназначен в помощь пользователю, совершившему поиск по какому-либо запросу и не получившему нужной информации. Статистика “ассоциаций” помогает выяснить интересы пользователей, путем анализа списка запросов, схожих с основным. Для выявления англоязычных запросов можно использовать сервис Wordtracker, который в бесплатной версии выдает ограниченные отчеты по поисковым запросам.
Теперь необходимо проанализировать полученную статистику запросов по списку ключевых слов. Если по некоторым из них результаты зашкаливают за десятки тысяч, их однозначно можно убрать из дальнейшего рассмотрения т.к. эти слова используются многими конкурентами. Здесь надо учесть тот факт, что если для оптимизации будет выбрана слишком распространенная ключевая фраза, то потребуется много времени и сил, чтобы взобраться на вершину ранжированного списка результатов. Кроме того, привлеченный таким образом сетевой трафик будет плохо сфокусирован, т.е. процент целевых покупателей будет невелик. С другой стороны, если для ключевой фразы будет получено малое число результатов, то эффективность такой оптимизации также буде невысока.
Чтобы добиться компромисса в этом сложном вопросе, надо брать ключевую фразу, которая является оптимальной для тематики страницы и высоко конкурентной, и добавлять в нее описательные слова или, например, конкретные модели и торговые марки, т.е. конкретизировать представленную на странице информацию.
Часто многие сайты для привлечения большего числа посетителей используют для ключевых слов практически на всех страницах выражения типа “все модели”, “весь модельный ряд”, “огромный выбор” и т.д. Если на вашем сайте в самом деле представлены все модели некоторой торговой марки или же подавляющее большинство их, то лучшим вариантом будет оптимизация под такой запрос какой-то одной страницы, например с самой популярной моделью. При этом на этой странице обязательно должны быть ссылки на другие модели или на страницу с кратким представлением всех моделей в удобном для сравнения виде. Если в ключевой фразе перечисляются конкретные модели, то необходимо располагать их в порядке убывания популярности.
Очень часто при вводе поискового запроса пользователи не пишут прописные буквы в названиях компаний, торговых марок, городов и т.п. Т.к. некоторые системы поиска чувствительны к регистру символов, т.е. поиск по вариантам фразы с символами, преобразованными в нижний регистр, и с символами в верхнем регистре приводит к разным результатам. Поэтому, чтобы улучшить результаты поиска своего сайта, надо добавлять на страницы все варианты написания ключевой фразы. Если во фразе используются слова, которые по правилам языка пишутся с прописной буквы, то можно использовать ее версию со строчными буквами там, где она не будет видна для посетителей.
В зависимости от того, под какую систему поиска оптимизируется сайт, необходимо узнать поддерживается ли ей морфологический поиск, т.е. поиск по слову во всех его морфологических формах. Это значит, что поиск по фразе «оптовая покупка скидка» может быть интерпретирован, как “при оптовой покупке скидки” и т.д. Чтобы определить, выполняет ли данный поисковик морфологическую функцию, можно проработать поиск по различным версиям ключевой фразы и проанализировать результаты.
Необходимо не только постоянно проводить мониторинг частоты использования вашей ключевой фразы пользователями, но и отслеживать, как много других страниц также оптимизированы под нее. Т.е. надо постоянно следить за конкурирующими ресурсами, которые стоят первыми в рейтинге при запросе по данной тематике.
Таким образом, выбор наиболее эффективных ключевых фраз может буквально поставить на ноги ваш онлайновый бизнес, а неудачный, наоборот, разрушить его. Главное не забывать, что каждая страница оптимизируется под одну-две ключевые фразы, которые четко соответствуют ее тематике.
В этой статье мы поговорим о рекламе сайта. Статья состоит из двух частей, в первой я расскажу вам отдельно о рекламе домашних страничек, во второй мы поговорим подробнее и серьезнее о рекламе в интернете, как таковой. Надеюсь, вы не пропустите первую часть статьи, потому что, не смотря ни на что, она принципиально важна.
Реклама домашних страниц.
Реклама, как таковая.
1 - Первый этап. Каталоги.
2 - Второй этап. Обмен баннерами и ссылками с тематическими ресурсами.
3 - Третий этап. Добавление в поисковые системы.
4 - Четвертый этап. Баннерные системы.
5 - Пятый этап. Нетрадиционные способы.
6 - Шестой этап. Как не потерять вашего посетителя.
7 - Седьмой этап. Повторение этапов.
Сразу поясню, почему я хочу поговорить с вами о рекламе домашних страниц отдельно.
Давайте рассмотрим эволюцию пользователя в интернете: сначала он гость, посещающий чужие сайты, знакомящийся с новыми людьми, чтобы переписываться с ними по почте, общаться в чате или на форумах. Но наступает момент, когда так хочется обзавестись собственным домиком, чтобы показать свою состоятельность и полноправность в гигантской паутине.
И вот когда домик отстроен, первые гости переступили его порог, похвалили, возникает такое свербящее чувство, которое можно назвать желанием популярности, желанием привлечь в свой домик толпы и толпы гостей в абсолютно разных целях: чтобы увеличить количество виртуальных друзей, а может быть найти любовь, или просто приобрести популярность, или даже извлечь выгоду из своего труда, заработать денюжку.
Все это вполне справедливые желания, т.к. и в реальной жизни нам свойственно самоутверждаться, но Интернет - это не тень реальной жизни, это информационная сеть, а простые домашние странички (обо всем и ни о чем, а точнее о вас любимых), они становятся мусором, когда в поиске важной, нужной и полезной информации человек натыкается на них, а не на то, что ищет в действительности. Поэтому, прежде чем ударяться в рекламные акции всеми правдами и неправдами, стоит задуматься: а нужно ли это? а как сделать, чтобы моя страница не стала мусором, а помогла найти мне друзей? А заработать?
Итак, сразу скажу, что заработок в интернете на пустом месте, из ничего, благодаря странице с баннерами спонсоров – миф, поверьте мне, и лучше забудьте об этом, не тратьте зря ни свое, ни чужое время.
Другое дело желание общения, некой популярности. Реклама вашей страницы в данном случае будет бесполезна, это все равно, что дать объявление в газете: вот мой дом, я там живу. Ну, и что? Кто вы такой, чтобы мы заинтересовались и пришли в гости? Другое дело, когда вы идете в какое-нибудь общественное место, клуб, знакомитесь там с новыми людьми, и говорите им, давая свой адрес:
- Вот мой дом, я там живу.
- О! – скажут они, - мы обязательно придем, нам с тобой было интересно пообщаться, и мы хотим узнать о тебе побольше и пообщаться еще не раз.
Т.е. я веду к тому, что домашняя страница, это как ваша квартира, чем больше у вас друзей, тем чаще они приходят к вам в гости, они заинтересованы в вас, именно поэтому им интересна ваша страница. Итак, для того, чтобы ваша страница была популярной, вы сами должны быть популярными. Благо, в интернете для этого много способов. Есть чаты, сайты знакомств, конференции и сайты, где люди общаются по определенным интересам, игровые сайты. Посещайте их, общайтесь, если вы интересны, то, посмотрев вашу анкету на таком сайте, люди обязательно посетят, и не раз, вашу домашнюю страницу.
И если у вас на душе все равно свербит и хочется добавить свою домашнюю страницу в поисковые системы и каталоги, тогда будьте вежливы, добавляйте ее в категории для Домашних страниц, они везде есть специально для вас. Повторюсь, не надо мусорить, вы поступите очень не красиво, если из-за того, что на вашей странице вы рассказываете о своей игрушечной машине, вы начнете позиционировать вашу страницу, как замечательный сайт об автомобилях. Это не даст популярности вашему сайту, т.к. на самом деле это не сайт об автомобилях, а лишь ваша домашняя страница, это только вызывает раздражение и негативные эмоции у тех, кого вы обманули.
Реклама, как таковая.
Я рассказывал о том, как сделать домашнюю страницу популярной, и читал нотации вам не просто так. Самое главное понять, что вы хотите достичь рекламной кампанией, и нужно ли вам это на самом деле.
Почему надо к рекламе подходить серьезно? Почему слово раскрутка надо отмести, как не состоятельное? Почему вы должны подходить к рекламе цивилизованно, когда вы можете просто начать «крутить» свой сайт и можете получить в день до 1000 посетителей с нуля при помощи специальных программ?
Потому что раскрутка это всего лишь фикция. Это посетитель, которого не было, который не вернется, который не пойдет по вашему сайту дальше первой страницы. Это зря затраченные усилия и потраченное время.
Для нас самое главное найти своего посетителя и заинтересовать его в том, что мы хотим ему предложить.
Но давайте по порядку, прежде всего вам следует понять, что количество и постоянный приток посетителей на вашем сайте зависит не только от рекламы, а также от наличия интересной, определенной группе людей, информации, ради которой они будут посещать ваш ресурс. Так, например, некоторые крупные компании, создают тематические информационные порталы относительно области своей деятельности, чтобы таким образом привлечь не только посетителей на свой сайт, но и потенциальных клиентов. Т.е. первое, что мы должны сделать, это качественный и интересный ресурс, сами понимаете, жиденькие сайты с 2-мя-3-мя десятками страничек, с информацией ни о чем, не могут претендовать на звание качественного ресурса.
Также хочу заметить, если вы создаете сайт для коммерческой организации, то лучше всего этот процесс от начала до конца поручить специалистам: и разработку, и рекламу, потому что и то, и другое взаимосвязано. По сути, сайт – это что-то вроде вашей рекламной брошюры: во время рекламной кампании вы привлекаете к ней внимание, чтобы ее прочли, и если ваш сайт-брошюра не интересен и не заинтриговал человека, пришедшего по рекламному объявлению, то смысл рекламной компании сводится к нулю.
Итак, поскольку я считаю, что коммерческие организации могут потратиться на рекламу, и даже должны, а обычные информационные порталы и некоммерческие организации часто не имеют возможности позволить себе относительно дорогостоящую рекламу, поэтому моя статья скорее для владельцев ресурсов последнего типа, поэтому я буду вести речь о бесплатных, или не очень дорогих способах рекламы сайта.
Когда, мы имеем качественный ресурс, хорошо продуманный, выверенный, стоящий того, чтобы о нем узнали, не надо нестись сломя голову на сайты поисковых систем и каталогов, не торопитесь. Следует продумать, какая аудитория заинтересована в вашем ресурсе: возраст, пол, профессиональная занятость этой аудитории – например, грузчики они или учителя. После того, как вы определились какова ваша аудитория, надо понять, где ваша аудитория в интернете обитает: на какие сайты ходит, какие журналы читает, и т.д. И только после этого мы начинаем охоту, господа :) .
Первый этап. Каталоги.
Первым делом мы добавляем себя в каталоги. Да-да, именно в каталоги, а не в поисковые системы, чуть позже объясню почему. Для добавления в каталоги нам надо придумать рекламное не слишком длинное объявление, такое, которое по возможности выделит ваш сайт среди других, подобных вашему, и может заинтересовать вашего потенциального посетителя. Объявление должно быть написано без грамматических ошибок, проверьте себя, не поленитесь, прежде чем оставлять объявление в каталогах.
Какие каталоги нас интересуют? Желательно каталоги, которые собирают в себе сайты с тематикой, подобной нашей. Т.е. если наш сайт рассказывает о медицинских проблемах, то имеет смысл поместить его в каталог, который освящает медицинские ресурсы. От обычных каталогов мы тоже не отказываемся, если у них есть раздел для сайтов с нашей тематикой, если нет, то не имеет смысла пихать информацию о нашем ресурсе туда для количества, не тратьте время.
Весьма рекомендую вам сайт http://1ps.ru - лучшего ресурса в плане поиска каталогов и добавления себя в них вам не найти. Однако, не добавляйте свой сайт через него в поисковики, это лучше делать вручную, и не сразу.
Второй этап. Обмен баннерами и ссылками с тематическими ресурсами.
Когда мы добавляем наш сайт в каталоги, то стоит обратить там свое внимание на интересные и посещаемые ресурсы со сходной нашему ресурсу тематикой. Зачем? Потому что мы будем обмениваться с ними ссылками и баннерами (желательно маленькими баннерами, кнопками).
Выберите несколько наиболее интересных ресурсов, которые предлагают обмен ссылками и баннерами, и напишите их владельцам письма, в которых поинтересуйтесь, не захотят ли они обменяться с вами ссылками или баннерами. Письмо должно быть вежливым, содержать ссылку на ваш ресурс и информацию, где вы собираетесь разместить баннер/ссылку портала, с которым хотите обмениваться.
Письмо должно именно предлагать - наглые письма: мол, я разместил на вас ссылку, а вы теперь разместите на меня – нельзя писать ни в коем случае. Помните, владелец крупного ресурса, посещаемого и устоявшегося, делает вам одолжение, размещая баннер или ссылку на вас, а не вы ему.
Предложите разместить его ссылку на первой странице вашего сайта, при этом будьте готовы согласиться на то, что в ответ вашу ссылку повесят в разделе с не слишком большой посещаемостью, и уж, в любом случае, не на главной странице.
Зачем нам это нужно: потому что третьим этапом будет размещение в поисковых системах, от того, какие ресурсы по качеству и сколько ресурсов на вас ссылается, зависит ваша позиция в списке результатов, выдаваемых поисковой системой пользователю на какой-либо запрос. Поймите, когда отпадет надобность, и вы добьетесь нужных вам результатов и посещаемости, вы можете отказаться от обмена баннерами/ссылками с другим ресурсом, или же заключить новые условия обмена.
Кстати, на втором этапе ваши друзья и знакомые могут вам помочь, разместив на ваш портал ссылку у себя на сайтах.
Третий этап. Добавление в поисковые системы.
Вы должны понимать, что сразу ничего не делается, прежде чем все ваши действия принесут результаты, пройдет какое-то время. Не надо никуда торопиться, ваш ресурс некоммерческий, от того, что к вам сразу не будет притока посетителей, трагедии не случится. К тому же бесплатная реклама не может быть сопоставима по эффективности с той, в которую вы вложили деньги.
В поисковые системы мы добавляем информацию о нашем ресурсе через неделю-другую, после того, как мы разобрались с каталогами и обменом. Мы это делаем в надежде, что к тому времени, как мы будем добавлять о себе информацию в поисковики, они успеют проиндексировать (заметить), страницы других сайтов, где появилась информация о нас.
Для поисковых систем мы заготавливаем заранее ключевые слова - это слова, которые, как мы предполагаем, будет вводить для поиска человек, когда он ищет ресурсы, содержащие такую информацию, как на нашем сайте. Также для поисковых систем мы заготавливаем интересное описание, нашего ресурса.
На что стоит обратить внимание при составлении списка ключевых слов - ключевые слова, должны встречаться в обычном тексте на страницах нашего сайта. Так, если мы берем слово «медицина», как одно из ключевых, оно должно быть в тексте на первой странице нашего сайта, и не только на ней, т.к. поисковые системы смотрят, соответствуют ли заявленные ключевые слова тем, что содержатся в тексте ваших страниц. От этого тоже зависит ваша позиция в списке результатов, выдаваемых поисковой системой пользователю.
Более того, есть специальные META тэги, которые мы должны прописать в коде всех страниц нашего сайта, они содержат ключевые слова и описание вашего сайта. Содержимое мета-тэгов не видно посетителю вашей страницы, зато учитывается поисковыми системами.
Четвертый этап. Баннерные системы.
Участвовать в баннерных системах имеет смысл, только если они тематические – т.е. допустим, баннерная система, в которой участвуют только сайты с медицинской тематикой. В универсальных баннерных системах, не подчиненных единой тематике участвовать вам не имеет смысла. Это не эффективно, ведь вы сможете показывать в день столько баннеров, сколько было показано на страницах вашего сайта, т.е. мало, а если их при этом не видит ваш потенциальный посетитель, человек, который заинтересован в предлагаемой вами информации, то эффективность баннерной рекламы стремиться к нулю, незаинтересованный человек просто не перейдет по баннеру на ваш сайт.
Баннерные системы нас могут интересовать также в том случае, если вы все-таки решили немного потратиться на рекламу. В этом случае вы можете купить баннерные показы на каких-нибудь крупных сайтах, где обитает ваш потенциальный посетитель.
Пятый этап. Нетрадиционные способы.
Вы можете мне не поверить, но этот этап может быть самым эффективным, для повышения посещаемости вашего сайта.
Ваша задача придумать, как еще можно рекламировать свою страницу. К сожалению, общего рецепта тут быть не может. Но я расскажу, как я действовал в случае с Постройкой.ру, в свое время, чтобы вы поняли, что я имею ввиду.
Я сидел, думал, как же сделать сайт популярнее. И мне пришла в голову замечательная идея: у меня есть замечательный и уникальный учебник по html, если сделать оффлайн версию, положить в архив, тогда можно будет поместить мой учебник на сайты-сборники разных программ, ведь я ничего от этого не теряю. Конечно, прежде чем сделать это, я посмотрел, дают ли эти сайты такую возможность, оказалось, что на них имеются специальные разделы для обучающих программ и мой учебник подходит для размещения там. Решено, сделано. Я разместил учебник по всем крупным файловым архивам. В итоге, через какое-то время посещаемость моего сайта заметно возросла, потому что посетители, прочитав оффлайн версию уникального учебника приходили на сайт в поисках других интересных и полезных материалов, а также советов автора.
Конечно, этот способ подойдет не всем. Но вы можете написать несколько интересных статей, и поместить их на крупные порталы, если статьи будут интересные, то читатель зайдет на ваш сайт, ведь в статье всегда указываются при публикации данные об авторе.
Я полагаю, это далеко не единственные нетрадиционные способы, стоит только приложить чуточку выдумки, и вы найдете хороший способ для рекламы своего сайта. В любом случае, это не должен быть способ навязывания: некоторые несознательные граждане захламляют чужие форумы и гостевые следующим образом - “Здрасте, я Вася Пупкин, мне ваш сайт нравится. Посетите мой сайт.” - это неправильное позиционирование вас и вашего ресурса, так вы только выставляете себя в дурном свете.
Шестой этап. Как не потерять вашего посетителя.
Чтобы посетитель возвращался к вам вновь и вновь, нужно периодически добавлять на сайт новую информацию. Кроме того, нужно постоянно поддерживать с посетителем общение: установите форум или гостевую книгу, где посетители смогут задавать вам вопросы. Старайтесь каждый день просматривать форум, гостевую книгу, почту, и отвечать на вопросы ваших посетителей.
Вы также можете устраивать опросы, чтобы узнать мнение своего посетителя, что ему нужно, это создаст у него впечатление, что он принимает участие в развитии вашего ресурса, ему будет это приятно. Вы можете устраивать конкурсы с небольшими призами. Вы можете сделать новостную рассылку + рассылку с частью новых материалов, которые появляются на сайте. И много чего еще.
Не забывайте, главное, это заинтересованность вашего посетителя в том, что вы ему предлагаете, он нужен вам, а вы должны попытаться стать нужными ему. Когда вы нужны посетителю, когда у него остаются хорошие и теплые впечатления о вашем сайте, он начинает рекомендовать вас друзьям, знакомым. Он начинает сам упоминать о вас на форумах и чатах, где он общается. Он добавляет на вас ссылку на своей странице, чтобы поделиться с другими таким хорошим ресурсом, как ваш. А это и есть лучшая реклама, а это и есть признание того, что ваш ресурс действительно замечательный.
Седьмой этап. Повторение этапов.
Каждый день в интернете появляется много разных и новых ресурсов. В том числе и каталоги, и поисковые системы, и новые сайты, близкие по тематике вашему. Ваша задача следить за новыми ресурсами, добавлять свой сайт в новые каталоги и поисковые системы. Если вы будете заниматься рекламой периодически, то у вас больше шансов сделать свой сайт посещаемым, и привлечь больше новых посетителей.
Думать о продвижении сайта надо еще до его создания. Все начинается с постановки задач и опредления целей. Многие люди, которые собираются продвигать (рекламировать) свой сайт в Интернет, не знают зачем им это, нужен ли им сайт вообще, не знают как оптимизировать свое детище для того, чтобы было возможным осуществлять его продвижение, чтобы достичь поставленных целей и отдых под Киевом, каталог баз отдыха. Если вы относитесь к ним, то это статья для вас.
Сразу хочу уточнить, что в этой статье речь не идет о несерьезных ресурсах вроде домашних страниц. Свое мнение о том, стоит ли рекламировать домашную страницу, почему и как, я высказала в первой части вводной статьи к разделу Реклама. Настоятельно рекомендую всем владельцем домашних страниц перечитать первую часть вводной статьи раз 20-ть, а лучше сто, прежде чем пускаться во все тяжкие.
Теперь, когда я погрозил пальцем недобросовестным гражданам для очистки своей совести, перейдем непосредственно к делу.
Прежде, чем создавать сайт вы должны понять, нужен ли он вам вообще. Зачем, что, для чего.
К неверным мотивам создания сайта можно отнести следующие:
* У всех есть сайт. Чем я хуже?
* Я создам самый лучший ресурс, он поразит воображение всех нынеживущих в интернет, я буду популярным, ко мне придет много людей!
* У наших конкурентов есть сайт. Сваяем и мы что-нибудь по быстрому. Полагаю, прайс-листа и контактов хватит.
* Я сделаю себе сайт, раскручу его, и срублю много денег, ничего особо не делая…
Если, вас сподвигает на создание сайта что-то вроде того, что я только что перечислила - то вам сайт еще не нужен, если вы коммерческая организация. Почему? Потому что цель коммерческого сайта помочь вам завязать и упрочить отношения, которые помогут развитию вашего бизнеса. Подход, чтобы было - это не серьезный, не деловой подход, с таким долго не живут. Что же касается остальных, тщеславных граждан с домашними страничками - куда они идут я уже указывала в самом начале этой статьи. Никогда не забывайте, что интернет - прежде всего информационная сеть, человек сюда приходит за информацией, ему нужна интересная и качественная информация, так зачем же плодить мусор?
К правильным мотивам создания сайта можно отнести следующие:
* Привлечение новых посетилей (для комерческой организации: клиентов, потенциальных клиентов).
* Расширить свой бизнес, увеличить прибыль.
* Получить поддержку, склонить людей и общественное мнение к чему-либо.
* Найти единомышленников по какой-либо проблеме, поделиться инересной и нужной информацией с другими.
Только, когда у нас есть определенная цель, только тогда можно и нужно создавать ресурс, опираясь на нее. Когда есть цель - есть возможность правильно продумать и осуществить разработку ресурса. А при правильно разработанном ресурсе уже можно совершать успешные действия по его продвижению.
Итак, как же правильно осуществить разработку сайта, если мы хотим, чтобы было потом возможным продвигать его в сети:
1. Определите цели вашего сайта. Зачем вы его создаете? (об этом мы уже поговорили).
2. Определите вашу стратегию. Что вы хотите достичь? Как вы собираетесь добиться своих целей? Какие приемы вы будете использовать, чтобы показать себя, чтобы удержаться и развиваться, чтобы продвигать свой сайт? У вас есть конкуренты (фирмы-конкуренты, другие информационные сайты, сообщества). Вам надо исследовать, что они предлагают, какие методы используют для продвижения своего ресурса. На основе исследования определить, какие методы будете использовать вы для продвижения своего сайта. При составлении плана также нужно учесть, какие ресурсы вы имеете в наличии (люди, деньги, знания, время и т.д.), чтобы добиться своих целей.
3. Определите аудиторию вашего сайта. Для кого вы его создаете? Какова целевая аудитория вашего сайта (например, деловая современная женщина, с доходом средний и выше от 20 до 40 лет). В зависимости от того какова ваша аудитория вы решаете какие сервисы вы ей предложите, какие материалы разместите на сайте, каким будет языком вестись изложение материалов (согласитесь, язык научного сайта неприемлим для сайта с детской аудиторией, если детский ресурс будет написан на слишком непонятном его аудитории языке, то популярностью он пользоваться никогда не будет). Если у сайта широкая аудитория, то можно сделать несколько крупных разделов для каждой группы посетителей. Для сайтов, где аудитория говорит на разных языках делается несколько версий на разных языках, причем язык изложения может адаптироваться в зависимости от страны (допустим, что считается приличным в одной стране, может вызвать возмущение у жителей других стран, нужно обязательно учитывать национальные особенности, чтобы не потерять потом посетителя).
4. Доменое имя. То, каков адрес вашего сайта, решает многое. Согласитесь, что сайт с адресом http://firma.com или http://community.com внушает гораздо больше доверия и уважения, чем http://narod.ru/tut/tam/firma или http://freehosting.com/was/here/community, первые два доменных имени говорят о серьезности фирмы или организации, о том, что завтра она никуда не исчезнет, это важно, особенно если учесть, что есть злоумышленники, которые любят пользоваться доверием людей, и поэтому люди стали сейчас гораздо осторожнее и настороженнее относится к предлагаемым им услугам и информации.
Более того, адрес http://firma.com легче продвигать в поисковых системах и рейтингах. Кроме того, адрес http://firma.com, гораздо легче запомнить, чем http://narod.ru/tut/tam/firma. Старайтесь, чтобы в названии домена присуствовало название организации. Имя домена = имя фирмы - очень легко запоминается. Если у фирмы или организации сложное имя, то имя домена может символизировать область деятельности фирмы или организации. Допустим, комбинату по производству хлеба со сложным названием “Комбинат №4 по производству хлебо-булочных изделий “Серебрянный бор” никак не подобрать запоминаемое сокращение, чтобы его можно было использовать в качестве доменного имени, но зато можно зарегистрировать домен типа: http://hleb.ru или http://bulka.ru - запоминаемо и связано с деятельностью предприятия.
5. Презентабельность. Внешний вид вашего сайта не должен отталкивать. Наооборот, он обязан быть привлекательным. Помните - по одежке встречают. Первое впечатление - очень важно. Если оформление вашего сайта отталкивающее, то вы можете потерять посетителя, он уйдет, даже не попытавшись ознакомиться с представленной информацией.
6. Удобство. Вся информация на сайте должна быть организована так, чтобы ее было легко находить, чтобы было легко ориентироваться по сайту. Навигация должна быть простой и понятной. Желательно, чтобы до самого дальнего подраздела можно было дойти не более, чем в несколько кликов. Струтура сайта должна быть четкой и ясной посетителю.
7. Нужная информация. Какой бы ни был ваш сайт просто информационный, посвященный какой-либо проблеме, или коммерческий сайт, предназначенный продвигать вашу компанию посредством Интернет, самое главное - это содержимое сайта. Ваш посетитель приходит к вам за информацией, и поэтому, разрабатывая содержимое сайта, вы должны подумать, какую информацию хотела бы получить ваша аудитория, какую информацию они будут искать. Желательно, чтобы информация была уникальная. Только присуствие уникальной информации или сервисов на ресурсе может привлечь к вам посетителя, только наличие постоянно добавляемой и обновляемой уникальной информации может привлечь и убедить его зайти к вам на сайт еще раз, и не один раз. Именно поэтому, даже коммерческой организации не стоит делать сайт из серии “прайс-лист+контакты”, потому что такой сайт практически никому не будет интересен и не приведет к организации новых клиентов. Зато интересный портал, связанный с сферой деятельности фирмы, это то, что нужно. Он привлечет много посетителей, которые потом могут стать клиентами фирмы.
8. Интересные сервисы и предложения. Конечно, не только информацией единой жив сайт. Обязательно нужно учесть необходимость создания связи с посетителем, в этом вам помогут форум, или гостевая книга. Иногда необходимо напоминать о себе своим посетителям, для этого возможно стоит ввести рассылку новостей вашего сайта, чтобы каждый желающий мог на нее подписаться. Но это все стандартные, хотя и нужные ходы. Нужно еще что-то оригинальное и инетересное. Предложите поучавствовать посетителям в жизни сайта. Например, на популярных сайтах с кулинарными рецептами, вы можете найти не только миллион и один рецепт, а также прислать свой собственный, ваш рецепт могут оценить и обсудить другие посетители сайта. Кроме того, периодически устраиваются конкурсы на лучший рецепт, с призами, незайтейливыми, но приятными.
Однако, такое возможно не только для некоммерческого ресурса. Подобные ходы может взять себе на вооружение сайт какой-нибудь ресторанной сети, расчитанной на обывателя с средним доходом. Сборник рецептов, возможность посетителям его пополнять, обсуждать, учавствовать в конкурсах - все это не только не повредить коммерческому сайту, но и поможет в продвижении компании не только в сети интернет, Сходить на выходные с семьей в любимый ресторан, на сайте которого вечерами общаешься с подругой - думаю, это может стать традицией для многих женщин.
Итог:
Главная выгода, которую вам дает интернет - это непосредственное общение с вашим посетителем (потенциальным клиентом). Задача хорошего ресурса (как коммерческого, так и нет) быть ближе к посетителю, соотвествовать его нуждам. Вы должны думать о своей аудитории - это единственно правильный подход. Реклама в интернет не сводится к банальной баннерной рекламе, рассылке е-майл, продвижению сайта компании или организации в поисковиках, рейтингах, каталогах - это далеко не основные способы, эти способы как раз не так эффективны, как хотелось бы, хотя их все равно не стоит сбрасывать со счетов. Основное - это как раз создание неких взаимоотношений со своей аудиторией. Таким отношениям есть даже определенное название - PR - что означает Public Relations - связь с общественностью. Именно PR - есть самый эффективный способ продвижения чего-либо в Интернет, именно благодаря Public Relations вы сможете добиться своих целей и извлечь выгоду для своей организации или компании.
В этой статье я лишь затронула тему PR, и надеюсь, это было для вас интересным и познавательным. По традиции в правой колонке вы найдете ссылки по теме, и сможете ознакомиться с ней дальше сомостоятельно.
История из жизни. Я сидел за одним из своих компьютеров, слегка нервничал, потому что пытался решить проблему несоответствия браузеров стандартам CSS, и получил в это время письмо следующего содержания:
«Я с удовольствием куплю несколько текстовых ссылок на вашем сайте. Если вы заинтересованы, сообщите мне, и мы продолжим переговоры. Я действительно могу предложить вам достойное, конкурентоспособное соглашение».
Достойное, конкурентоспособное соглашение? Этот парень, должно быть, шутит? Все, кто меня знают, могут с уверенностью сказать, что на большинство предложений поисковой оптимизации или покупки ссылок я отвечаю двумя способами: нажимаю кнопку «удалить» или сообщаю в поисковые системы о спаме. Конечно, кнопка «удалить» более эффективна. Но в тот раз я был настроен по-другому. Потому что несоответствие браузеров стандартам CSS меня действительно раздражает.
«Спасибо, что ответили мне. Я заинтересован в размещении текста где-нибудь в средней или нижней части внутренних страниц вашего сайта. За это я готов заплатить вам: … за каждую внутреннюю страницу, где можно будет легко добавить маленький параграф со ссылками внизу текста. Список рекомендованных страниц: … »
Я был крайне озадачен страницами, которые он выбрал. Любой сообразительный владелец сайта посчитал бы, что эти страницы не способны привлечь посетителей.
Затем меня озарило - этот человек был совершенно серьезен в своем намерении. Он не причислял себя к «черным» или «белым» оптимизаторам, также как и не причислял к «красным» и «голубым»… Он не считал этот способ Интернет-маркетинга поисковым спамом. Я думаю, он просто пытался совершить совершенно законную сделку, чтобы получить высококачественные ссылки на свой сайт.
Этика в голове оптимизатора
Множество профессионалов поисковой оптимизации считают себя интернет-маркетологами, действующими этичными методами. Обозначение компании как «фирма с этичным поисковым маркетингом» приводит к росту продаж и подразумевает надежность. Это обозначение - синоним знаний и компетенции, символ того, что фирма понимает поисковую оптимизацию. Это говорит о том, что фирме можно доверять.
Кроме этого, этичность действий по поисковой оптимизации часто зависит от внешних обстоятельств. У каждого из профессионалов в этой отрасли обстоятельства складываются по-разному…
К примеру, я знаю некоторых внутренних специалистов по поисковому маркетингу, которые работают над оптимизацией сайтов с плохой юзабилити, к тому же написанных на Flash. Я знаю специалистов, которым начальство приказывает вывести сайт на первое место, но при этом они не разрешает производить изменения ключевых слов или текстов на сайте. Их работа - оптимизировать сайты в таких условиях. Начальство или администрация не желает слушать их извинения и ссылки на инструкции, которые составляю представители поисковыхе систем для оптимизаторов. Они просто хотят, чтобы эти специалисты делали свою работу.
У меня другая ситуация. Я владелец компании. Я могу решать, применять или нет определенные стратегии оптимизации. Когда я слышу от клиентов их ожидания на будущее, я стараюсь дать им понять, что они необоснованны. Оптимизация часто связана с проведением изменений на веб-сайте. Модификации информационной архитектуры сайта могут стать долгосрочным проектом, который некоторые люди хотят ускорить искусственно.
Я понимаю, что люди не хотят изменять свои сайты. Тогда я упоминаю о возможности рекламы в поисковых системах. Если клиент или подписчик не заинтересован в подобной рекламе, я могу сказать следующее: «Итак, вы хотите, чтобы я посыпал ваш сайт блестящим волшебным порошком, и он чудесным образом взлетел на первое место по всем ключевым словам одновременно? Хорошо… подождите… я просто сделаю пометку в блокноте: «не забыть заказать визитные карточки с должностью SEO-фея».
Интересно, насколько этичны феи.. но я отвлекся. Я понимаю, что в моих обстоятельствах и с моими знаниями, наверно, легче следовать всем инструкциям по поисковой оптимизации. Другие профессионалы SEO и SEM не становятся более или менее этичными из-за того, что у них другие обстоятельства. Человек, который пытался покупать у меня ссылки, не рассматривал себя как поискового спамера.
Таким образом, я полагаю, что «этика маркетолога поисковых систем» - в голове самого маркетолога.
«Белый» оптимизатор - начинающий оптимизатор
Многим специалистам SEO, использующим методы «черной» оптимизации, несправедливо приписывают многие черты. Вспыхивающие там и здесь обсуждения двух тактик SEO могут быть очень бурными. Я спросил Эрика Даффорна (Erik Dafforn), исполнительного вице-президента Интрапромоут, что он об этом думает:
«Мы стараемся всеми силами не вмешиваться в этот спор. Обычно мы на стороне «белых» оптимизаторов, но это становится так тяжело морально, что мы просто отстраняемся от обсуждения. Нас расстраивает, когда склиенты читают, что мы «не в теме» или менее технически грамотны, чем другие компании. Откровенно говоря, на самом деле это не так, и люди могут верить в это или опровергать в свое удовольствие.
Нахождение существующих лазеек - не та возможность, которой мы стремимся привлечь клиентов. Я не могу представить, как говорю солидному клиенту: «помните перестройку архитектуры сайта, которую мы рекомендовали вам восемь месяцев назад и которая стоила 40 000 долларов? Ну, теперь все надо начинать заново, потому что лазейка закрылась».
Как заметил Эрик, «белых» оптимизаторов обычно не считают экспертами в своей области, поскольку считают, что им недостает изощренных технических навыков. На самом же деле построение эффективной архитектуры сайта часто требует применения значительных технических навыков. Вот что об этом сказал мне Адам Одетт (Adam Audette), президент Одеттмедиа:
«Существует неверное понимание того, что может принести «белая» поисковая оптимизация… часто говорят, что «черная» оптимизация дает большие преимущества, а «белая» - нет. Или что «черные» оптимизаторы более опытны, чем «белые».
«Белые» оптимизаторы вовсе не обязательно «начинающие» оптимизаторы. Они продвинутые, очень опытные маркетологи, которые делают «белую» работу. Для меня главное отличие в том, что «белые» оптимизаторы в своей работе ориентируются на пользователя. Они не всегда соглашаются с тем, что диктуют им поисковые системы. Но им приходится придерживаться правил и, в то же время, учитывать потребности пользователя. На мой взгляд, это наиболее долгосрочный путь проведения кампаний поискового маркетинга, гораздо более выгодный, чем любые попытки перехитрить поисковые системы».
«Белые» оптимизаторы - лохи поисковых систем
«Белых» специалистов SEO называют по-разному. Они и ханжи, и фарисеи, и пай-мальчики, и мальчики для битья. Я думаю, многих смущает идея послушно следовать руководству поисковых систем. Многие специалисты SEO, практикующие «белую» оптимизацию, делают все, чтобы уложиться в рамки, заданные поисковыми системами, но не обязательно полностью согласны со всеми их инструкциями. Спросите любого «белого» специалиста SEO, что ему не нравится в Google, и вы услышите массу интересного.
Например, я не большой фанат AdSense, хотя я осознаю его прибыльный потенциал. Мне также не нравятся вебсайты AdSense magnet, которые распространены гораздо шире, чем мне бы хотелось. Факт в том, что во время тестов на юзабилити я часто наблюдал первое негативное впечатление от сайта, когда участник теста видел на сайте рекламу от Google. Часто с недоверием задается вопрос: «Google одобрил этот сайт?» Как я должен отвечать на него, будучи сторонником Google?
Я, конечно же, делаю все, чтобы следовать всем требованиям и условиям поисковых систем и буду делать в дальнейшем. Но я не всегда с ними согласен. Честно говоря, я уверен, что многие как «черные», так и «белые» оптимизаторы имеют общие взгляды на ряд условий и руководств поисковых систем. Мне очень интересно, что другие скажут на эту тему. В чем совпадают взгляды «черных» и «белых» специалистов? Лично мне бы понравилось, если бы какой-то творческий специалист по поисковому маркетингу написал пьесу с набором характерных персонажей. Я буду фея SEO. Какого героя сыграли бы вы?
Все началось до банального просто - любимый директор сказал "Хочу!". Аргументация была следующей:
* Переводится много бумаги для печати и отправки по факсу (клиентов много, потому отправленные счета сразу выбрасываются: найти нужный документ даже через день - нереально)
* Электронная почта "есть в наши дни у всех и каждого" (то, что сам директор ею не пользуется - другой вопрос :-) )
* Тратится меньше времени персонала (не нужно сидеть и ждать перед факсом, стартовать, "прошло"/"не прошло", ...)
* Легче вести учет когда и что было отправлено.
Сначала ставился вопрос отправки документов вообще - что может быть проще? Сохранить таблицу как файл MS-Excel, вызвать внешнюю программу отправки с параметрами - и все. Потом возникли сомнения:
* А вот клиенты отредактируют файл - и будут доказывать что мы такой и отправили,
* В файле передается рисунок печати - они его смогут использовать с какой-нибудь темной целью.
Сразу же было предложено отправить как рисунок, благо я знал, что это можно сделать, но как - еще не представлял. Согласие получено, и вот начались поиски соответствующих программ...
Подбор нужного инструментария
Некоторое время я стараюсь использовать бесплатные программы, а не ломать те, за которые нужно платить деньги. Так что одним из условий (не главным, но в результате выполненным почти на 100%) была бесплатность инструментария.
Понятно, что для получения рисунка на выходе нужен виртуальный принтер, на который можно печатать любой документ. Выходным форматом был выбран tiff как достаточно распространенный, предполагая что его можно будет конвертировать в любой формат, если возникнет необходимость. Были испробованы многие принтеры, встреченные в просторах Internet`а, как бесплатные, так и нет. Большинство из них умеют печатать кроме искомого tiff еще и pdf документы, но не один не удовлетворял условиям передачи в них внешних параметров (важно было указать место сохранения и возможно имя файла для уменьшения коллизий, поскольку работа происходит на сервере терминалов). В конечном итоге выбор пал на AFPL Ghostscript 8.14 for Win32 и драйвер переадресации порта принтера RedMon.
Ghost Script умеет конвертировать данные из ps, eps, pdf в разные форматы (те же ps, eps, pdf, языки принтеров вроде PCL6 от HP, и рисунки). Получать данные он может как из файла, так и из входящего потока (stdin для посвященных). RedMon умеет данные, полученные от драйвера принтера, передавать как входной поток выбранной программе. Кроме того устанавливает несколько системных переменных, одну из которых (%REDMON_USER% - имя пользователя, печатающего документ) мы будем использовать.
Итак - используемый режим связки: установка PS принтера в системе, указание ему виртуального порта RedMon, пересылка исходящего PS потока от принтера на Ghost Script, формирование tif по указанным настройкам.
Настройки для режима работы Ghost Script хранятся в файле одном для всех, потому в схему добавим еще одно звено: RedMon передает данные не Ghost Script, а скрипту WSH, а уже он откорректировав настройки под пользователя, передает дальше поток для Ghost Script. Потому еще одна программа, которая нам нужна: Windows Script 5.6 for Windows. Нужна именно версия 5.6, поскольку во встроенной в Windows 2000 версии 5.1 отсутствует необходимый метод Exec().
Еще возможно нам понадобится компонент для вывода рисунков с прозрачным фоном. Пока приходится использовать Active_BMP, упоминаемый на безвременно почившем hare.ru. Этот компонент умеет отображать прозрачными только 2-х цветные bmp (по крайней мере только с ними у меня получилось добиться прозрачности), но за неимением лучшего... :-) (Если кто знает бесплатный ActiveX компонент для отображения gif с прозрачным слоем - скажите в форум или мыло)
Собственно для отправки почты из командной строки я уже полгода пользуюсь Postie, потому искать ничего нового не пришлось.
Приступим (установка и регистрация программ)
Установка WSH проблем не вызывает (конечно, если вы не попытаетесь установить версию для 9X/NT4 на 2000/XP, как я это сделал, причем осознал это только взявшись за статью - уже месяц сервер живет в этом режиме :-) ): запуск scripten.exe (scr56en.exe), ответы на все вопросы, перезагрузка.
Установка Ghost Script не требует даже перезагрузки. Единственный момент - от пытается по умолчанию установится в каталог %SystemDrive%\gs - я его устанавливал в %SystemDrive%\Tools\gs - так мне удобнее. (ниже в скобках я буду писать свои настройки, с которыми у меня работает живая система).
Для установки RedMon нужно его распаковать в некий каталог (%SystemDrive%\Tools\RedMon) и запустить setup.exe из него. В файлах readme.txt и redmon.hlp находится подробная информация по установке и стандартной настройке redmon.
Регистрация Active_BMP осуществляется распаковкой файлов в каталог (%SystemDrive%\Tools\OLE\ActiveBMP) и запуском из этого каталога "regsvr32 Bmp_1c.ocx".
В дальнейшем каталоги с RedMon и Active_BMP нам не понадобятся, так что про них смело можно забыть (но не удалять совсем с диска :-) ).
Postie устанавливается простым извлечение его в нужный каталог (%SystemDrive%\Tools\Postie).
Теперь нам необходимо настроить принтер. Для этого из папки принтеры выбираем "Добавить". Тип принтера - локальный, отказываемся от автоматического поиска и добавляем порт: тип порта: Redirect Port, имя: RPT1. На следующем шаге выбираем модель PS-принтера (в RedMon рекомендуется Apple LaserWriter II NT или Apple Color LaserWriter 12/600 если вы хотите цветное изображение). Я использовал Apple LaserWriter II NT, т.к. мне нужно было черно-белое изображение. Сразу после этого я переименовал принтер в более соответствующее его функциям название: "Send EMail". Теперь нам необходимо настроить порт. Для этого открываем настройки принтера, ищем страницу "Порты" и жмем кнопку "Конфигурировать порт".
Дальнейшие настройки отличаются от стандартных, описанных в redmon.hlp:
* "Redirect this port to the program:"="cscript.exe" (без кавычек, естественно),
* "Arguments for this programs are:"="Наш\Скрипт\С\Полным\Путем.js" (%SystemDrive%\Tools\gs\PrnUser.js) (в кавычках, если путь содержит пробелы),
* "Output:"="Program handles output"
* "Run:"="Hidden"
* "Run as user" снята (у меня вызывало ошибку, если установлено)
* "Shut down delay:"="300"
Кнопка "Log file" нужна во время отладки всей системы отправки почты, хотя можно оставить запись лога и в рабочем режиме - все равно он перезаписывается, а не накапливается.
Соглашения о настройках
Скрипт, который мы указали в настройках порта, принимает данные с принтера и согласно настройкам, сохраненным из внешней программы (1С или другой), отправляет его по почте как рисунок (в скрипте предусмотрены проверки на корректность значений). Поскольку единственное, что мы можем получить из печатного задания - это имя пользователя (%REDMON_USER%), то с каждым пользователем мы будем работать в его каталоге, при этом одновременная печать 2-х заданий от одного пользователя невозможна. (Если вам удастся передать в скрипт другую информацию из 1С, например: уникальный идентификатор задания или имя файла - сообщите мне). У меня используется самописный компонент SysTools для получения профиля пользователя по его имени. Поскольку он еще только в альфа-версии выкладывать не буду, если кому нужен - вышлю по почте. Итак, предположим, у нас есть каталог, в котором хранятся данные пользователей (%MyProfiles%\User1, %MyProfiles%\User2, ...). К личном каталоге пользователя мы будем создавать подкаталог SendMail для отправки почты.
Временные файлы для работы мы будем хранить во временном каталоге (переменная %TEMP% для системы, поскольку запускаться скрипт будет от имени Local service).
Все остальные настройки и пути к файлам заданы в переменных вначале скрипта - их можно (и нужно) изменить для себя.
Файл, в котором 1С сохраняет настройки называется %UserProfile%\SendMail\mail.ini и имеет следующую структуру: каждая строка - поле=значение, кроме поля BODY, которое обязательно идет последним и может быть растянуто на несколько строк.
Пишем программу
В этом разделе будут показаны и пояснены тексты нескольких модулей, входящих в демонстрационную конфигурацию. Скрипт на языке JavaScript здесь описан не будет, поскольку несоответствует тематике раздела. Надеюсь - комментариев внутри скрипта будет достаточно для пожелавших разобраться в его работе.
Поскольку в 1С не предусмотрена модульная организация программ, то сложные вещи я обычно строю по такой схеме: законченная функциональность - во внешней обработке, параметры в которую передаются через СписокЗначений, и вспомагательная процедура/функция в глобальном модуле, которая этот список заполняет из параметров. Так было сделано и здесь.
Функция запроса параметров отправки почты (кому, от кого, тема и пр.) в глобальном модуле выглядит так:
[pagebreak]
В этой функции переданные параметры записываются в список значений, который передается внешней обработке ПараметрыОтправкиПочты.ert в подкаталоге ExtForms каталога базы данных. Запрос параметров имеет вид:
Возвращенные значения записываются в файл, параметры которого (путь, имя, и т.п.) заданы в конце глобального модуля.
В самой обработке ничего интересного нет: чтение параметров из списка, отображение и проверка параметров при нажатии кнопки Отправить. Если не заданы необходимые параметры (ОтКого, Кому) или адреса E-Mail указаны не правильно - будет выдано сообщение и форма не закроется.
Рассмотрим параметры вызова даной функции:
* Заголовок - заголовок формы, на рисунке - синяя надпись "Тестовый документ №3 от 30.04.04";
* Кому, ОтКого, Копия - E-mail или список E-Mail`ов (через ",");
* Тема, Сообщение - соответствующие параметры письма;
* Запретить - какие поля запрещены для редактирования (на рисунке - поле Тема);
* БезФормы - если 1: форма не отображается и при правильных параметрах письмо отправится автоматически.
Следующая функция вызывает эту и если все прошло успешно - вызывает внешнюю обработку для небольшой предподготовки таблицы при печати и отправки ее:
Здесь уже большая функциональность перенесена на обработку. Она (обработка) вообще не открывается, только выполняет некоторые действия. Рассмортим параметры:
* Таб - Значение типа "Таблица", которую и будем печатать;
* Заголовок, Кому, ОтКого, Копия, Тема, Сообщение, Запретить, БезФормы - просто передаются в функцию глПараметрыОтправкиПочты и подробно рассмотрены в ней;
* Масштаб - масштаб печати таблицы. Если не задан - автомасштаб по ширине.
В обработке всего 2 процедуры: ПроверитьПараметр для проверки корректности переданных значений и ПриОткрытии, в которой подготавливается и печатается таблица. Выглядит весь модуль обработки так:
Код: (1c)
Вот практически и все, что касается программы в 1С. Некоторые сервисные функции, которые не были описаны здесь, можно посмотреть в примере конфигурации. Таким образом ничего сложного здесь нет. Больше сложностей вызывает настройка системы для правильной работы. Выглядит отправленный документ приблизительно так:
Замечания в процессе эксплуатации
Сразу скажу - в боевом режиме система работает недолго (с 15.04.2004), но даже за это время были замечены некоторые "особенности" работы:
* Формат tiff оказался не таким уж стандартным. Потому пришлось его заменить на png. Сделать это нужно в двух местах: в суффиксе исходящего файла в скрипте (чтобы Postie правильно поставил его Content-Type:) и в настройках GS (параметр -sDEVICE=pngmono собственно и задает выходной формат файла). Можно заменить и на еще более стандартный jpeg, но при этом сильно вырастет размер файла. К сожалению gif уже не поддерживается в текущей версии GS (как я понял из документации - из-за возможных проблем с лицензированием этого формата). Можно добится поддержки gif, выдрав ее из исходников предыдущих версий и перекомпилировав текущую, но я пока этого не делал. Возникла мысль передавать в настроечном файле (%UserProfile%\SendMail\mail.ini) параметры, как отправлять изображения (jpeg, tif, png; color/mono; ...) и в скрипте динамически менять.
* PostScript шрифты, идущие в поставке GS, не так хорошо "вылизаны", как TrueType. Потому русские буквы выглядят жирнее англиских. Пока жалоб на это не было :-)
* В новой версии Postie у меня почему-то не работает ключ -bcc (ошибки не выдает, но и не отправляет по указанным адресам). Так и не разобрался - пришлось откатится на старую версию (POSTIE Version 4)
* Хотя ломать ничего и не пришлось, но все-таки мы нарушаем лицензию Postie, который "free for personal use". Может кто знает другую программу отправки почты из коммандной строки?
Благодарности
Моему любимому директору - за неуемный ум и новые интересные задания.
Вадиму Ханасюку - за неопубликованную здесь, но полезную компоненту SysInfo (получение каталога профиля пользователя по имени) и помощь в поиске нужного софта.
Всем сотрудникам, которые не мешали работать.
Сегодня я покажу, как получить список директорий в каком-то каталоге, а также как получить список файлов в определённом каталоге.
Итак, начнём с получения списка подкаталогов в определённом каталоге.
Функция получает один параметер, и это - путь к каталогу, список подкаталогов которого мы хотим узнать.
Функция использует рекурсию для получения подкаталогов любого уровня вложенности.
Пример использования:
Если функция запускается в Windows, то надо кое-что изменить:
Указывая путь, обязательно нужно использовать двойные слэши, как это показано ниже.
В результате на экране получим список всех подкаталогов указаной директории.
Получаем список файлов в конкретном каталоге без захода в субкаталоги.
Функция принимает один параметер - путь к каталогу, список файлов которого нам нужно получить.
Пример использования:
Если функция запускается в Windows, то надо кое-что изменить:
Указывая путь, обязательно нужно использовать двойные слэши, как это показано ниже.
В итоге получим список файлов в указаном каталоге, причём только тех, что в корне указанного каталога.
Регионы нужны не только для того, чтобы резать дырки в формах. Иногда они могут оказаться довольно полезным инструментом именно в своём "родном" качестве, т.е. для отрисовки на экране достаточно сложных геометрических фигур. Например, для вывода карт, представляющих собой совокупность ломанных линий, построенных по массивам точек. Создать такую линию нам уже не составит труда, пора разобраться, как её показать юзеру.
Из функций отрисовки две первые нам уже смутно знакомы: они делают тоже, что делает параметр FillMode (ALTERNATE/WINDING) для функций CreatePolygonRgn и CreatePolyPolygonRgn. GetPolyFillMode получает заданный для указанного контекста режим заливки, а SetPolyFillMode устанавливает его. Просто на этот раз речь идёт не о создании региона, а всего лишь о его отрисовке. Установленное значение будет иметь смысл для всех функций, заливающих регион, т.е. PaintRgn и FillRgn, при этом сам регион останется таким, каким он и был создан, а вот раскрашен будет по разному, в том случае, если он состоит из нескольких пересекающихся регионов. Для простых регионов типа прямоугольника или элипса установка данного значения ничего не меняет.
Итак. Давайте срочно что-нить создадим и нарисуем. Можно, конечно, сделать это в одной функции, например в OnCreate, но тогда изображение будет весьма недолговечным - до первой перерисовки формы. Поэтому поступим иначе: объявим private property fRgn, в OnCreate его инициализируем, в OnPaint будем его отображать, а в OnDestroy - уничтожим. Код методов представлен ниже:
Следует помнить, что Функции отрисовки регионов всегда работают с цветом,
указанным в Canvas.Brush.Color. Даже рисуя бордюр (frame) использоваться будет не цвет Canvas.Pen, что, в общем-то, представляется более логичным, а цвет Canvas.Brush.
Ничего такой получился кружочек. Погребального вида. Давайте сделаем его более жизнерадостным, и заодно разберёмся, как работает FrameRgn:
У меня получилась такая вот картинка:
Насколько я могу судить, функции FillRgn и PaintRgn отличаются друг от друга только тем, что первая позволяет указать дескриптор кисти, не связанной с текущим canvas'ом. Сомнительная фича с точки зрения дельфей, т.к. манипулировать с текущим цветом кисти канваса всяко легче, чем создавать отдельный экземпляр класса TBrush. Вот, собственно, и всё об отрисовке. Примечательно то, что для того, чтобы нарисовать регион нам не нужно знать, что он из себя представляет. Мы просто передаём дескриптор одной и той же процедуре, а она отобразит на экране круг, овал, треугольник, звезду Давида - всё, что угодно.
Функции, представленные в разделе прочее ничего особенно интересного из себя не представляют, и, в общем-то, интуитивно понятны. поэтому рассотрим лишь некоторые из них.
Для программирования расширенных хранимых процедур 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 необходимые для получения списка доменных пользователей;
- Создадим готовый проект (реализуем наше техническое задание)
Надеюсь - до скорой встречи!