Жесткие диски (винчестеры), как электромеханические устройства, являются одним из самых ненадежных компонентов современного компьютера. Несмотря на то, что в большинстве случаев срок службы последних соизмерим, и даже превосходит время их эксплуатации до момента морального устаревания и замены более новыми моделями, все же отдельные экземпляры выходят из строя в течение первых месяцев эксплуатации. Выход жесткого диска из строя - самое худшее, что может случиться с вашим компьютером, так как при этом часто необратимо теряются накопленные на нем данные. Если резервная копия по какой-то причине отсутствует, то суммарный ущерб от поломки заметно превышает номинальную стоимость современных винчестеров.
Многие фирмы, пользуясь ситуацией, предлагают свои услуги по восстановлению информации с вышедшего из строя накопителя. Очевидно, это обходится недешево и целесообразно только тогда, когда на диске находилось что-то действительно ценное. В противном случае легче просто смириться с потерей.
Ремонт жестких дисков требует специального оборудования и практически невозможен в домашних условиях. Так, например, для вскрытия контейнера необходима особо чистая от пыли комната. Казалось бы, положение безнадежно и нечего даже помышлять о восстановлении поломанного диска в домашних условиях. Но, к счастью, не все поломки настолько серьезны, и во многих случаях можно обойтись для ремонта подручными (а иногда чисто программными) средствами.
Один из самых частых отказов винчестеров фирмы western digital (а также и некоторых других) выглядит следующим образом: жесткий диск не опознается bios, а головки при этом отчетливо стучат. Скорее всего, по какой-то причине не работает блок термокалибровки, и устройство не может обеспечить нужный зазор между головкой и рабочей поверхностью "блина". Обычно это происходит при отклонении от нормального температурного режима эксплуатации, например, в зимнее время, когда жесткие диски в плохо отапливаемых помещениях "выстывают" за ночь (при температуре 18...210С жесткий диск часто может исправно функционировать и с испорченным механизмом термокалибровки). Попробуйте дать поработать винчестеру в течение нескольких часов, чтобы он прогрелся, при этом рано или поздно винчестер попадает в необходимый диапазон температур и работоспособность (возможно, временно) восстанавливается. Разумеется, первым делом нужно скопировать всю информацию, поскольку работоспособность такого диска уже не гарантируется. То же можно рекомендовать и в отношении устаревших моделей без термокалибровки; часто они оказываются зависимыми от температурного режима, и с ростом износа винчестера эта зависимость проявляется все сильнее.
Вторым по распространенности отказом является выход из строя модуля диагностики при полной исправности остальных компонентов. Как это ни покажется парадоксальным, но полностью рабочий винчестер не проходит диагностику. При этом в регистре ошибок (порт ox1f1 для первого жесткого диска) могут содержаться значения, приведенные ниже:
Диагностические ошибки
Бит Содержимое Источник ошибки
7 0 Ошибка master диска
1 Ошибка slave диска
2-0 011 Ошибка секторного буфера
100 Ошибка контрогльной суммы, не устранимая избыточным кодированием
101 Ошибка микроконтроллера
Разные biosы могут различно реагировать на такую ситуацию, но все варианты сводятся к одному - жесткий диск не определяется и не "чувствуется". Однако на уровне портов ввода/вывода устройство функционирует отлично. Заметим, что существуют такие материнские платы (особенно среди новых моделей), которые, обнаружив ошибку микроконтроллера винчестера, просто отключают питание жесткого диска. Несложно написать для испорченного таким образом винчестера драйвер, который обеспечит работу с диском через высокоуровневый интерфейс int 0x13. Например, следующая процедура обеспечивает посекторное чтение и запись через порты ввода/вывода для первого жесткого диска в chs режиме.
lba mode для упрощения понимания не поддерживается. Необходимую техническую информацию обычно можно найти на сайте производителя вашего жесткого диска.
Этот фрагмент может служить вполне работоспособным ядром для драйвера 16-ти разрядного режима. Для упрощения понимания не включена задержка после каждого обращения к порту. В зависимости от соотношений скорости вашего процессора и контроллера диска эта задержка может и не потребоваться (в противном случае рекомендуется читать регистр статуса ox1f7, дожидаясь готовности контроллера). При этом не следует спешить с заменой такого жесткого диска на новый, с подобной неисправностью можно успешно работать не год и не два. Последнее, правда, лишь при условии, что все используемое программное обеспечение не будет конфликтовать с нестандартным драйвером. Писать драйвер, скорее всего, придется вам самому, поскольку не известно ни одной коммерческой разработки в этом направлении, а все любительские разработки выполнены в основном "под себя". Так, например, драйвер от kpnc hddfix3a поддерживает только винчестеры primary master до пятисот мегабайт и не работает в среде windows 95 (разработан на год раньше ее появления).
Более легкий, но не всегда осуществимый путь - запретить тестирование жестких дисков biosом или, по крайней мере, игнорировать результаты такового. Как это осуществить, можно прочесть в руководстве на материнскую плату (или обратиться за помощью к службе технической поддержки фирмы-производителя, поскольку в руководствах пользователя такие тонкости нередко опускают). Например, попробуйте установить "halt on" в "never" или перезаписать flach bios, модифицировав его так, чтобы тот не выполнял подобную проверку. Если Вам повезет, жесткий диск заработает! Однако иногда все же происходят и аппаратные отказы. Например, у винчестеров фирм samsung и conner отмечены случаи отказа модуля трансляции мультисекторного чтения/записи. Если это не будет обнаружено внутренним тестом устройства, то такой жесткий диск вызовет зависание операционной системы на стадии ее загрузки. Для предотвращения этого достаточно добавить в config.sys ключ multi-track=off и отключить аналогичные опции в blose. При этом, проиграв в скорости, все же можно заставить жесткий диск сносно работать. Понятно, что эксплуатировать восстановленный таким образом диск длительное время нерационально по причине потери быстродействия. Лучше приобрести новый, на который и скопировать всю информацию. С другой стороны, такой жесткий диск все же остается полностью рабочим и успешно может служить, например, в качестве резервного.
На том же connere эпизодически выходит из строя блок управления позиционированием головок, так что последние уже не могут удержаться на дорожке и при обращении к следующему сектору немного "уползают". При этом считывание на выходе дает ошибочную информацию, а запись необратимо затирает соседние сектора. Бороться с этим можно позиционированием головки перед каждой операцией записи/чтения, обрабатывая за один проход не более сектора. Понятно, что для этого необходимо вновь садиться за написание собственного драйвера. К счастью, он достаточно простой (можно использовать аппаратное прерывание от жесткого диска int 0x76 irq14, вставив в тело обработчика команду сброса контроллера. В данном случае подразумевается, что контроллер используемого жесткого диска проводит рекалибровку головки во время операции сброса. Некоторые модели этого не делают. В этом случае придется прибегнуть к операции позиционирования головки (функция ОхС дискового сервиса 0x13). Первые модели от вторых можно отличить временем, требуемым на сброс контроллера. Понятно, что электроника "сбрасывается" мгновенно, а позиционирование головки требует хоть и не большого, но все же заметного времени. Современные модели с поддержкой кэширования этого часто не делают или "откладывают" операции с головкой до первого к ней обращения. Разумеется, в этом случае кэширование придется выключить. Большинство bios позволяет это делать без труда, и нет нужды программировать контроллер самостоятельно. В другом случае вышедший из строя блок позиционирования (трансляции) подводит головки вовсе не к тому сектору, который запрашивался. Например, головки могли физически сместиться с оси, "уползая" в сторону. Разумеется, этот дефект можно скорректировать программно, достаточно проанализировать ситуацию и логику искажения трансляции. Многие модели позиционируют головку, используя разметку диска, что страхует от подобных поломок (к сожалению, сейчас от такого подхода большинство фирм отказались, выигрывая в скорости).
Конечно, все описанные программные подходы в действительности не устраняют неисправность, а только позволяют скопировать с казалось бы уже нерабочего винчестера ценные и еще не сохраненные данные. При этом ни к чему писать универсальный драйвер для win32 и защищенного режима. Вполне можно ограничиться dos-режимом. Для копирования файлов последнего должно оказаться вполне достаточно, конечно за исключением тех случаев, когда диск был отформатирован под ntsf или другую, не поддерживаемую ms-dos, систему. К счастью, для многих из них есть драйверы, которые позволяют "видеть" подобные разделы даже из "голой" ms-dos. В крайнем случае, можно ограничиться посекторным копированием на винчестер точно такой же топологии. При этом совершенно не имеет значения используемая файловая система и установленная операционная система.
Посекторно скопировать диск на винчестер с иной топологией трудно, но возможно. Дело в том, что многие современные контроллеры жестких дисков позволяют пользователю менять трансляцию произвольным образом. Для этого необходимо приобрести винчестер, поддерживающий lba-режим (а какой из современных жестких дисков его не поддерживает?). При этом он может быть даже большего объема, нежели исходный, но это никак не помешает копированию. Другой вопрос, что без переразбиения скопированный таким образом диск не "почувствует" дополнительных дорожек и следует запустить norton disk doctor, который устранит эту проблему.
Достаточно часто нарушается вычисление зон предком-пенсации. Дело в том, что плотность записи на разных цилиндрах не одинакова, так как линейная скорость растет от центра диска к периферии. Разумеется, гораздо легче постепенно уплотнять записи, нежели искать некий усредненный компромисс. На всех существующих моделях плотность записи изменяется скачкообразно и на последних моделях программно доступна через соответствующие регистры контроллера. При этом значения, выставленные в bios, практически любой жесткий диск (с интерфейсом ide) просто игнорирует. Предыдущие модели не имели с этим проблем, и только винчестеры, выпущенные в течение последних двух лет, склонны к подобным поломкам. Скорее, даже не к поломкам, а к сбоям, в результате которых искажается хранимая где-то в недрах жесткого диска информация. Если контроллер позволяет ее программно корректировать, то считайте, что ваш жесткий диск спасен. Конечно, придется пройти сквозь мучительные попытки угадать оригинальные значения, однако это можно делать и автоматическим перебором до тех пор, пока винчестер не начнет без ошибок читать очередную зону. Помните, что любая запись на диск способна нарушить низкоуровневую разметку винчестера, после чего последний восстановлению не подлежит и его останется только выкинуть. Производите только чтение секторов!
Если же контроллер не позволяет программно управлять предкомпенсацией, то еще не все потеряно. Попробуйте перед каждым обращением делать сброс контроллера, а точнее, его рекалибровку (команда ixh). В некоторых случаях это срабатывает, поскольку с целью оптимизации скорости обмена предкомпенсацией обычно управляет не один блок. И, кроме того, иногда контроллер кэша не учитывает предкомпенсацию, а его сброс реализует последнюю аппаратно. К сожалению, это по большей части догадки и результаты экспериментов автора, так как техническая документация фирм-производителей по этому поводу не отличается полнотой, а местами содержит противоречия. Можно испытать и другой способ - попробовать перезаписать микрокод контроллера (команда 92h). Конечно, это доступно только для специалистов очень высокого класса, но ведь доступно! Заметим, что не все контроллеры поддерживают такую операцию. С другой стороны, это и хорошо, так как уменьшает вероятность сбоя и не дает некорректно работающим программам (вирусам в том числе) испортить дорогое устройство. Жесткие диски от samsung обладают еще одной неприятной особенностью - часто при подключении шлейфа "на лету", при включенном питании, они перестают работать. Внешне это выглядит так: индикатор обращения к диску постоянно горит, но диск даже не определяется biosom, или определяется, но все равно не работает. Близкое рассмотрение показывает, что на шине пропадает сигнал готовности устройства. В остальном контроллер остается неповрежденным. Разумеется, если не обращать внимание на отсутствие сигнала готовности, то с устройством можно общаться, делая вручную необходимые задержки (поскольку физическую готовность устройства уже узнать не представляется возможным, приходится делать задержки с изрядным запасом времени). При этом, к сожалению, придется отказаться от dma-mode (а уж тем более ultra-dma) и ограничиться pio 1 (с небольшим риском - pio 2) режимом. Конечно, писать соответствующий драйвер вам придется опять самостоятельно. Разумеется, скорость обмена в режиме pio 1 по сегодняшним меркам совершенно неудовлетворительна и не годится ни для чего другого, кроме как копирования информации со старого на новый винчестер, но некоторые "нечистоплотные" продавцы компьютерной техники как-то ухитряются устанавливать подобные экземпляры на продаваемые машины. Будьте осторожны! Учитывая, что написание подобных драйверов для win32 - трудоемкое занятие, большинство ограничивается поддержкой одной лишь ms-dos, и вовсе не факт, что компьютер, демонстрирующий загрузку win95, содержит исправный, а не реанимированный подобным образом жесткий диск.
У жестких дисков фирмы samsung при подключении "налету" может появляться другой неприятный дефект - при запросах на чтение контроллер периодически "повисает" и не завершает операцию. В результате "замирает" вся операционная система (впрочем, windows nt с этим справляется, но, вероятно, не всегда). На первый взгляд может показаться, что с этого винчестера несложно скопировать ценные файлы, но при попытке выполнить это выясняется, что диск "зависает" все чаще и чаще и копирование растягивается до бесконечности. Однако если выполнить сброс контроллера, то можно будет повторить операцию. Это можно сделать аппарат -но, подпаяв одну кнопку на линию сброса и статуса. Последнее нужно для указания на ошибочную ситуацию, чтобы операционная система повторила незавершенную операцию. Если этого не сделать, то часть секторов не будет реально прочитана (записана). Или можно выполнять сброс автоматически, например, по таймеру. Чтобы не сталкиваться с подобной ситуацией, никогда не следует подсоединять/отсоединять винчестер при включенном питании. Очень часто это приводит к подобным ошибкам, хотя производители других фирм, по-видимому, как-то от этого все же защищаются, ибо аналогичной ситуации у них практически не встречается. Все же не стоит искушать судьбу... От аппаратных ошибок теперь перейдем к дефектам поверхности. Заметим сразу, что последнее встречается гораздо чаще и проявляется намного коварнее. Обычно это ситуация, в которой мало что можно предпринять. Но достичь главной цели - спасти как можно больше уцелевших данных - довольно часто удается. Возьмем такую типичную ситуацию как ошибка чтения сектора. Маловероятно, чтобы сектор был разрушен целиком. Чаще всего "сыплется" только какая-то его часть, а все остальные данные остаются неискаженными. Существуют контроллеры двух типов. Первые, обнаружив расхождение контрольной суммы считанного сектора, все же оставляют прочитанные данные в буфере и позволяют их извлечь оттуда, проигнорировав ошибку чтения. Вторые либо очищают буфер, либо просто не сбрасывают внутренний кэш, в результате чего все равно прочитать буфер невозможно. На практике обычно встречаются последние. При этом сброс кэша можно инициировать серией запросов без считывания полученных данных. Кэш при этом переполняется, и наиболее старые данные будут вытолкнуты в буфер. Остается их только прочесть. Конечно,-это крайне медленно, но, к сожалению, универсальной команды сброса кэша не существует. Разные разработчики реализуют это по-своему (впрочем, иногда это можно найти в документации на чипы, используемые в контроллере). western digital сообщает в техническом руководстве что при длинном чтении сектора без повтора контроль сектора не выполняется и он будет-таки целиком помещен в буфер. Кстати, так и должно быть по стандарту. Увы, остальные фирмы от него часто отклоняются по разным соображениям. Остается определить, какие же из прочитанных данных достоверные, а какие нет (если этого не видно "визуально" - например, в случае текстового или графического файлов)? Разумеется, в подобных рамках задача кажется неразрешимой, но это не совсем так. Дело в том, что можно произвести не только короткое, но и длинное чтение (ox22h req ploin long with retry), для чего можно использовать следующую процедуру. При этом кроме собственно данных читаются также и корректирующие коды. Автоматическая коррекция не выполняется (хотя некоторые контроллеры это реализуют аппаратно и не могут отключить автокоррекцию; в документации этот момент, кстати, не уточняется). Как правило, используются корректирующие коды Рида-Соломона, хотя последнее не обязательно. Математические законы позволяют не только определить место возникновения сбоя, но и даже восстановить несколько бит. При больших разрушениях можно определить только место сбоя, но достоверно восстановить информацию не удается.
Модуляция при записи такова, что все биты, стоящие справа от сбойного, уже не достоверны. Точнее, не все, а только в пределах одного пакета. Обычно за один раз записывается от 3 до 9 бит (необходимо уточнить у конкретного производителя) и содержимое остальных пакетов, как правило, остается достоверным. Самое интересное, что зачастую сбойный пакет можно восстановить методом перебора! При этом можно даже рассчитать, сколько вариантов должно получиться. Учитывая хорошую степень "рассеяния" корректирующих кодов можно сказать, что не очень много. И таким образом можно восстановить казалось бы безнадежно испорченные сектора, а вместе с ними и файлы, расположенные "поверх" последних.
Выше были перечислены наиболее типичные случаи отказов жестких дисков, которые поддавались чисто программному восстановлению если уж не винчестера, то хотя бы хранимых на нем данных. Разумеется, что иногда жесткий диск выходит из строя полностью (например, при неправильно подключенном питании, скачках напряжения) от вибрации или ударов, а то и просто из-за откровенного заводского брака. Есть один старый проверенный способ - найти жесткий диск такой же точно модели и заменить электронную плату. К сожалению, последнее из-за ряда конструктивных особенностей все реже и реже бывает возможно, а уж дефекты поверхности этот способ и вовсе бессилен вылечить. Поэтому, берегите свой жесткий диск и почаще проводите резервное копирование. Помните, что самое дорогое это не компьютер, а хранимая на нем информация!
Эта статья является продолжением статьи о создании счетчика просмотров для каждой страницы сайта на php и MySQL (если Вы ее не читали, то обязательно прочтите, иначе ничего не поймете из ниже сказанного). В этой статья я решил продолжить тему и расширить возможности счетчика просмотров страниц.
Для увеличения возможностей и получения статистики просмотров страниц сайта к базовому php скрипту необходимо добавить несколько строк и своих функций. В частности нужно будет создать еще одну таблицу, которая имеет следующую структуру:
Как видно из структуры MySQL таблицы, она состоит всего из двух полей (page_id – хэш сумма md5() от urla страницы и page_url – url страницы) и индекса, установленного на поле page_id – для значительного ускорения поиска значения в таблице. И еще, я не стал изменять изначальную таблицу my_log, которая использовалась для подсчета количества просмотров страниц, а создал другую по одной простой, но очень весомой причине: чем больше данных в таблице – тем медленнее осуществляется поиск по таблице. А скорость работы php скриптов такого уровня не должна ощутимо влиять на работу сайта в целом. Ведь если у вас коммерческий и при этом очень посещаемый сайт, то тратить строго ограниченное процессорное время на второстепенные задачи просто невыгодно, ведь зачастую прибыль зависит от того, сколько человек сможет увидеть ваш сайт.
Теперь перейдем непосредственно к коду php скрипта. Я внес в него незначительные изменения, в основном это новые функции для работы с MySQL таблицей my_log_urls.
В counter.php внес следующие изменения:
добавляем функцию Default_Write_URL
В результате, получаем значительную экономию времени т.к. делаем всего одну запись в таблицу my_log_urls и одну в my_log, и при следующих запросах этой же страницы запрос к таблице my_log_urls выполняться не будет, т.к. запись уже существует в таблице my_log, следовательно и в таблице my_log_urls она то же есть.
Для подсчета рейтинга страниц сайта, предлагаю написать другой php скрипт, который будет по значениям просмотров страницы в таблице my_log брать значения в таблице my_log_urls. А результат представлять в виде таблицы с данными о просмотрах страниц, отсортированными по убыванию (от большего значения к меньшему).
Ниже приведен код php скрипта, который необходимо скопировать в созданный вами файл top.php:
Данный php скрипт выводит 10 самых популярных страниц вашего сайта за последние сутки и за все время. В принципе, можно осуществлять вывод и большего числа страниц, изменив в php функциях MySQLReadAll и MySQLReadToday лимит считываемых из таблицы записей. А так же можно вместо самых популярных страниц увидеть самые непопулярные, изменив способ сортировки в этих же функциях с DESC на ASC.
Скачать данный php скрипт, вместе с модифицированным php скриптом подсчета просмотров страниц, можно по этой ссылке.
Создавая свой php движок для нового сайта, я, как и всегда не захотел выполнять нудную работу сам и поэтому такое задание как подбор ключевых слов к каждой странице сайта доверил php скрипту, который написал меньше чем за полчаса.
Конечно, многие могут сказать, что поисковики не учитывают мета теги keywords и description, и вовсе незачем голову морочить проблемой подбора ключевых слов, но учитывают или нет, это известно только администраторам поисковых машин. В частности, я недавно проводил эксперимент, в котором участвовало три пары сайтов, на каждой паре сайтов был один и тот же контент, но на одном из сайтов каждой пары были прописаны keywords и description. И что вы думаете, через месяц, все три сайта с keywords и description были выше в выдаче Яндекса, чем их двойники без этих мета тегов. (Примечание: сайты были оптимизированы под абсолютно не конкурентные запросы и не имели бэклинков).
Принцип работы php скрипта, основной задачей которого является “на лету” подбирать к тексту ключевые слова (keywords), заключается в разделении всего текста на слова и занесение их в массив. Из исходного текста сначала удаляются все знаки препинания, затем слова помещаются в массив и каждому слову присваивается число его повторений в тексте. После заполнения массива слова упорядочиваются по количеству повторений, и в качестве результатов берется верхушка массива – 15-25 самых часто употребляемых слов.
А вот и сам исходный код этого php-скрипта для подбора ключевых слов:
Пользоваться данным php классом очень просто, создаете экземпляр класса функцией new а потом вызываете внутреннюю функцию get_keywords(), класса Counter. Вот наглядный пример использования этого класса:
В переменной $content должен содержатся основной текст страницы, для которой создаются ключевые слова. И еще, полученная строка содержит только ключевые слова, без мета тегов. Скачать данный php класс для подбора ключевых слов в zip архиве вы можете здесь.
При разработке больших приложений, оперирующих большими объемами информации на первое место при отладке встает проблема обнаружения неправильного распределения памяти. Суть проблемы состоит в том, что если мы выделили участок памяти, а затем освободили не весь выделенный объем, то образуются блоки памяти, которые помечены как занятые, но на самом деле они не используются. При длительной работе программы такие блоки могут накапливаться, приводя к значительному расходу памяти.
Для обнаружения подобных ошибок создано специализированное программное обеспечение (типа BoundsChecker от Numega), однако чаще бывает удобнее встроить механизм обнаружения утечки в свои проекты. Поэтому метод должен быть простым, и в то же время как можно более универсальным. Кроме того, не хотелось бы переписывать годами накопленные мегабайты кода, написанного и отлаженного задолго до того, как вам пришло в голову оградить себя от ошибок. Так что к списку требований добавляется стандартизация, т.е. нужно каким-то образом встроить защиту от ошибок в стандартный код.
Предлагаемое решение основывается на перегрузке стандартных операторов распределения памяти new и delete. Причем перегружать мы будем глобальные операторы new|delete, т.к. переписать эти операторы для каждого разработанного ранее класса было бы очень трудоемким процессом. Т.о. после перегрузки нам нужно будет только отследить распределение памяти и, соответственно, освобождение ее в момент завершения программы. Все несоответствия - ошибка.
Реализация
Проект написан на Visual C++, но переписать его на любой другой диалект С++ не будет слишком сложной задачей. Во-первых, нужно переопределить стандартные операторы new и delete так, чтобы это работало во всех проектах. Поэтому в stdafx.h добавляем следующий фрагмент:
Как видите, переопределение операторов происходит в блоке #ifdef/#endif. Это ограждает наш код от влияния на релиз компилируемой программы. Вы, наверное, заметили, что теперь оператор new имеет три параметра вместо одного. Два дополнительных параметра содержат имя файла и номер строки, в которой выделяется память. Это удобно для обнаружения конкретного места, где происходит ошибка. Однако код наших проектов по-прежнему ссылается на оператор new, принимающий один параметр. Для исправления этого несоответствия нужно добавиить следующий фрагмент
Теперь все наши операторы new будут вызываться с тремя параметрами, причем недостающие параметры подставит препроцессор. Конечно, пустые переопределенные функции ни в чем нам не помогут, так что давайте добавим в них какой-нибудь код:
Для полноты картины нужно переопределить операторы new[] и delete[], однако никаких существенных отличий здесь нет - творите!
Последний штрих - пишем функции AddTrack() и RemoveTrack(). Для создания списка используемых блоков памяти будем использовать стандартные средства STL:
Перед самым завершением программы наш список allocList содержит ссылки на блоки памяти, котороые не были освобождены. Все, что нужно сделать - вывести эту информацию куда-нибудь. В нашем проекте мы выведем список неосвобожденных участков памяти в окно вывода отладочных сообщений Visual C++:
Надеюсь, этот проект сделает ваши баг-листы короче, а программы устойчивее. Удачи!
В этой статье будет рассмотрен скрипт, который создает анимацию в виде падающего снега. Анимация воспроизводится в заданной области web-страницы. Анимационный эффект, создаваемый данным скриптом выглядит весьма привлекательно, поэтому скрипт вполне может быть использован для создания анимированных логотипов, или блоков новогодних объявлений и поздравлений на сайте.
Область web-страницы, в которой производится анимация, задается элементом DIV с идентификатором ID_ANIMATE. Принцип работы скрипта заключается в вертикальном перемещении (с небольшими стохастическими перемещениями по горизонтали) элементов IMG, представляющих изображение снежинки в пределах этого элемента (элемент DIV с идентификатором ID_ANIMATE является элементом-контейнером для элементов IMG).
Элемент-контейнер DIV с идентификатором ID_ANIMATE определяется при помощи HTML-разметки в документе, в котором содержится скрипт. В этот элемент может быть помещено произвольное гипертекстовое содержимое, которое будет располагаться "на фоне" падающих снежинок, либо на фоне которого будут падать снежинки (это зависит от значения позиционного уровня этого содержимого). Код фрагмента HTML-разметки, определяющей элемент-контейнер DIV и его содержимое в демо-примере, приложенном к статье (см. демо-пример), приведен далее:
Параметры элемента-контейнера DIV (его размеры, схема позиционирования, значение свойства переполнения, цвет фона, параметры границы), а также перемещаемых в нем элементов IMG (схема позиционирования, размер, значение позиционного уровня), определяются правилами внедренной в документ таблицы слилей CSS:
Как можно видеть из листинга, элементам IMG, являющимся потомками элемента DIV с идентификатором ID_ANIMATE, назначается значение позиционного уровня 1. Поэтому, если вы хотите, чтобы "снежинки" двигались "под" остальным содержимым этого элемента, содержимому следует задать значение позиционного уровня больше 1 (как это сделано в демо-примере). Обратите также внимание на то, что элементам IMG назначена схема абсолютного позиционирования.
Теперь рассмотрим непосредственно работу скрипта. Полный листинг кода скрипта приведен далее.
Как можно видеть из листинга, в начале скрипта производится инициализация нескольких переменных. В переменную oAnimate заносится ссылка на DOM-объект элемента DIV с идентификатором ID_ANIMATE. Переменные nWidth и nHeight инициализируются значениями значения ширины и высоты этого элемента. Переменная nFSize должна содержать значение высоты (в пикселях) элементов изображений-снежинок (оно должно быть таким же, как задано в таблице стилей). Переменная strFlakeURL содержит URI ресурса изображения снежинки. Значение переменной nCount определяет общее количество движущихся изображений. Массив aoFlakes предназначен для хранения ссылок на DOM-объекты элементов изображений-снежинок.
Создание элементов изображений, добавление их в дерево документа, ссылок на DOM-объекты этих элементов в массив aoFlakes производится в процессе инициализации скрипта (см. окончание листинга кода скрипта). Значению свойства src DOM-объектов элементов изображений при этом присваивается значение переменной strFlakeURL. Для установки параметров движения каждого созданного элемента, вызывается функция ResetFlake. Для позиционирования соответствующего элемента IMG относительно элемента-контейнера DIV - UpdateFlakePos.
Функция ResetFlake устанавливает значения свойствам m_nX, m_nY и m_nSpeed DOM-объекта элемента, ссылка на который содержится в элементе массива aoFlakes с индексом, равным значению первого параметра ResetFlake. Свойство m_nX объекта хранит текущую координату по оси X, а свойство m_nY - по оси Y соответствующего элемента относительно контейнера. Свойство m_nSpeed определяет "скорость" движения элемента (величину его вертикального смещения на каждом шаге анимации). Функция ResetFlake устанавливает случайные значения свойствам m_nX и m_nSpeed. Свойству m_nY случайное значение устанавливается только в том случае, если параметр bRandY функции вычисляется в true (в этом случае элемент изображения снежинки будет иметь случайную позицию по вертикали). Иначе свойству m_nY устанавливаетя значение -nFSize (при этом изображение будет позиционироваться так, что оно будет полностью скрыто за верхней границей элемента-контейнера). При создании элементов изображений в процессе инициализации скрипта, ResetFlake вызывается со значением параметра bRandY, равным true.
Функция UpdateFlakePos принимает в качестве единственного параметра значение индекса в массиве aoFlakes и производит позиционирование элемента, ссылка на DOM-объект которого содержится в элементе массива aoFlakes с данным индексом в соответствии со значениями его свойств m_nX и m_nY.
Перемещение всех изображений-снежинок осуществляется функцией OnTimer, которая является обработчиком событий таймера, запускаемого в процессе инициализации скрипта.
Как можно видеть из приведенного ранее листинга кода скрипта, в функции OnTimer производится перебор всех DOM-объектов элементов изображений снежинок. Значение свойства m_nY каждого из этих объектов наращивается на величину его свойства m_nSpeed. Значение свойства m_nX изменяется на случайную величину, которая находится в диапазоне [-1..1] (так достигается случайное горизонтальное движение "снежинок"). В случае, если элемент изображения вышел за нижнюю границу элемента-контейнера, вызывается функция ResetFlake, которая устанавливает случайные значения свойств m_nX и m_nSpeed соответствующего объекта, а значение его свойства m_nY устанавливаетт в -nFSize. Затем вызывается функция UpdateFlakePos для перемещения конкретного элемента IMG в нужную позицию.
В этом разделе вы создадите два новых приложения OLE. Первое - простая программа-сервер OLE, второе - пример простого контейнера OLE. Эти программы предназначены для демонстрации минимальных затрат программирования, необходимых для создания приложений OLE 2.
В любом случае, для создания оболочки программы следует воспользоваться приложением AppExpert. Сначала необходимо сгенерировать основу приложения в AppExpert, затем модифицировать созданные файлы для создания законченного рабочего примера.
При написании своих версий этих программ необходимо иметь в виду несколько моментов. Во-первых, в этой главе приводятся листинги только исходных, немодифицированных файлов.
Во-вторых, CLSID этих программ будет отличаться от CLSID программ, которые вы сгенерируете с помощью AppExpert. Это нормально и даже необходимо, поскольку с помощью CLSID одни серверные приложения в Windows отличаются от других.
В-третьих, эти примеры содержат минимум необходимых средств для того, чтобы начать программировать с OLE. Вы можете использовать эти примеры в качестве начального кода для создания своего действительно полезного сервера или контейнера. В этой главе просто не хватает места для описания реализации функциональных сервера и контейнера - в этом случае вам понадобился бы грузоподъемник, чтобы положить эту книгу на стол.
Создание сервера OLE
Первое приложение OLE в этой главе - сервер. В этом примере вы построите полный сервер - сервер, который может использоваться и как автономное приложение, и как сервер. Создавая автономный сервер (т.е. в виде исполняемой программы .ЕХЕ, а не в виде динамически подключаемой библиотеки DLL), вы упрощаете процесс регистрации сервера в Windows.
Начальный процесс разработки сервера прост. Сначала из интегрированной среды Borland C++ версии 4.5 запустите AppExpert. Задайте каталог и имя вашего проекта. Я поместил свой проект в каталог \BC45\SOURCE\OLESVR. Проект я назвал OLESVR (я всегда называю проекты и каталоги проектов одним и тем же именем, это облегчает запоминание). Ниже приводится последовательность действий, в результате которых был создан проект OLESVR.
Запустите AppExpert. В первом диалоговом окне следует задать имя и каталог проекта. Как уже отмечалось, я использовал OLESVR для задания обоих.
После выбора ОК в диалоговом окне имени и каталога проекта следующий раздел АррЕхреrt - диалоговое окно Application General Options (основные опции приложения). Это диалоговое окно позволяет задать конфигурацию приложения, генерируемого AppExpert. Вам придется модифицировать несколько опций для проекта OLESVR.
Первая опция, которую необходимо изменить, находится в блоке Application: Summary. Замените параметр по умолчанию Multiple document interface на Single document interface. Это изменение согласуется с призывом Microsoft делать ставку на однодокументные приложения для Windows. На рис. 21.1 демонстрируется модифицированный блок Application: Summary.
Второе изменение, которое необходимо внести, - указать AppExpert, что ваша программа будет сервером OLE. Это изменение вносится в пункт Application: OLE 2 Options, имеющий ряд опций OLE 2, которые можно задавать. Поскольку вы создаете сервер OLE, вы будете оперировать только элементами блока группы OLE 2 Server: (поищите его в правой верхней части диалога). Выберите кнопку ячейки пометки Server EXE. На рис. 21.2 демонстрируются изменения, проведенные в пункте Application:OLE 2 Options.
При желании вы можете заполнить элементы пункта Application: Admin Options блока диалога AppExpert. С его помощью вы можете задать в приложении заметку об авторском праве, имя и информацию о версии. Все элементы в Application: Admin Options необязательны, и вы можете их не задавать.
Подпункты пункта Main Window не нуждаются в модификациях, их следует оставить заданными значениями по умолчанию. Для данного приложения нет необходимости менять что-либо в этих подпунктах. Пункт MDI Child/View неприменим для этого проекта, поэтому нет нужды в нем что-нибудь менять.
После задания всех необходимых модификаций следует выбрать кнопку Generate в нижней части блока диалога AppExpert Application General Options. AppExpert запросит у вас подтверждение, действительно ли вы собираетесь создать проект; после принятия подтверждения AppExpert сгенерирует приложение. На рис. 21.3 приводится конечный проект, загруженный в интегрированную среду Borland C++ версии 4.5.
Теперь, когда программа сгенерирована, в нее следует добавить код, задающий функциональность сервера OLE. Необходимо включить код, рисующий изображение, а также провести другие незначительные изменения.
К счастью, помимо Borland C++ версии 4.5 можно воспользоваться программой ClassExpert, что облегчит внесение большей части изменений. Предположим, вы хотите сперва заняться вопросами отображения. Как и в любой созданной с помощью AppExpert программе, основная часть рисования выполняется классом отображения, производным от класса OWL TOleView. Файл, в котором содержится реализация отображения, имеет имя LSVROLVW.CPP. В листинге 21.1 приводится первоначальный файл OSROLVW.CPP.
Листинг (файл реализации класса отображения OLESVR, OSVROLVW.CPP)
В состав библиотеки MFC входит ряд классов, представляющих стандартные диалоговые панели. Эти классы позволяют легко реализовать такие часто используемые операции, как открытие и сохранение файла, выбор цвета, выбор шрифта и т.д. Все эти классы наследуются от CCommonDialog, который в свою очередь является производным по отношению к базовому классу CDialog.
Приведем классы стандартных диалоговых панелей и их назначение:
CColorDialog - Панель для выбора цвета
CFileDialog - Панель выбора файлов для открытия и сохранения на диске
CFindReplaceDialog - Панель для выполнения операции поиска и замены
CFontDialog - Панель для выбора шрифта
CPrintDialog - Панель для вывода документа на печать
CPageSetupDialog - Панель выбора формата документа
COleDialog - Панель для управления технологией OLE
Классы, управляющие стандартными диалоговыми панелями, определены в файле afxdlgs.h. Поэтому при использовании этих классов в приложении необходимо включить этот файл в исходный текст при помощи директивы #include.
Панель выбора цвета (класс CColorDialog)
Чтобы отобразить на экране стандартную диалоговую панель выбора цвета, надо создать объект класса CColorDialog, а затем вызвать метод DoModal. При создании объекта класса СColorDialog используется следующий конструктор:
Все параметры конструктора необязательны, однако в некоторых случаях использование этих параметров может помочь.
Первый параметр clrInit позволяет указать цвет, выбранный по умолчанию сразу после открытия диалоговой панели. Если параметр не будет указан, в качестве цвета, выбранного по умолчанию, будет использоваться черный цвет.
Параметр dwFlags содержит набор флагов, управляющих диалоговой панелью выбора цвета. При помощи него блокировать или разрешать работу некоторых элементов управления диалоговой панели выбора цвета. Если при создании объекта класса CColorDialog не указать параметр dwFlags, тем не менее можно выполнить настройку диалоговой панели, обратившись непосредственно к элементу m_cc данного класса. Параметр dwFlags, указанный в конструкторе, используется для инициализации m_cc. Изменения в элемент m_cc должны быть внесены до того, как панель будет отображаться на экране.
Последний параметр pParentWnd можно использовать, чтобы указать родительское окно диалоговой панели.
Методы класса CСolorDialog
Чтобы вывести диалоговую панель выбора цвета на экран, необходимо использовать метод DoModal. После отображения панели на экране пользователь может выбрать из нее цвет и нажать кнопки OK или Cancel для подтверждения выбора цвета или отказа от него. Когда диалоговая панель закрывается, метод DoModal возвращается значения IDOK и IDCANCEL, в зависимости от того, какую кнопку нажал пользователь:
На экране появится стандартная диалоговая панель выбора цвета Color. В верхней половине диалоговой панели расположены 48 прямоугольников, имеющих различные цвета. Они представляют так называемые основные цвета (Basic colors). Можно выбрать один из этих цветов и нажать кнопку OK. После того, как диалоговая панель закрыта (метод DoModal завершил свою работу), можно воспользоваться методами класса CColorDialog, чтобы узнать цвета, выбранные пользователем.
Для определения цвета, выбранного пользователем, можно обратиться к методу GetColor класса CColorDialog. Данный метод возвращает значение COLORREF, соответствующее выбранному цвету.
Если пользователю недостаточно основных цветов, представленных в диалоговой панели Color, он может выбрать до 16 дополнительных цветов. Для этого он должен нажать кнопку DefineCustom Colors. Диалоговая панель изменит свой внешний вид - появятся дополнительные органы управления, позволяющие выбрать любой из 16 777 216 цветов. Когда цвет выбран, нужно нажать кнопку Add Custom Colors. Выбранный цвет будет добавлен к дополнительным цветам (Custom colors) - один из свободных прямоугольников окрасится соответствующим цветом.
При помощи метода GetSavedCustomColors класса CColorDialog можно определить дополнительные цвета, выбранные пользователем в диалоговой панели Color. Этот метод возвращает указатель на массив из 16 элементов типа COLORREF. Каждый элемент массива описывает один дополнительный цвет.
Когда диалоговая панель Color отображается приложением первый раз, все прямоугольники, отображающие дополнительные цвета, имеют белый цвет. Дополнительные цвета, выбранные пользователем, сохраняются во время работы приложения. После перезапуска приложения дополнительные цвета сбрасываются.
Панель выбора файлов (класс CFileDialog)
Среди стандартных диалоговых панелей, для которых в библиотеке MFC создан специальный класс, есть панели для работы с файловой системой - Open и Save As. Диалоговая панель Open позволяет выбрать один или несколько файлов и открыть их для дальнейшего использования. Диалоговая панель Save As позволяет выбрать имя файла для записи в него документа.
Для управления диалоговыми панелями Open и Save As предназначен один класс CFileDialog. Рассмотрим конструктор класса CFileDialog более подробно:
Объекты класса CFileDialog представляют диалоговые панели Open или Save As в зависимости от параметра bOpenFileDialog. Если параметр bOpenFileDialog содержит значение TRUE, то создается объект, управляющий диалоговой панелью Open, а если FALSE - диалоговой панелью Save As.
Параметр bOpenFileDialog является единственным обязательным параметром, который необходимо указать. Остальные параметры конструктора класса CFileDialog задают различные режимы работы панели и могут не указываться.
Чтобы создать объект класса CFileDialog , представляющий диалоговую панель для открытия файлов (mFileOpen), и объект, представляющий диалоговую панель для сохранения файлов (mFileSaveAs), можно воспользоваться следующими вызовами конструктора класса:
Во многих случаях имена файлов, которые нужно открыть или закрыть, имеют определенное расширение. Параметр lpszDefExt позволяет задать расширение файлов, используемое по умолчанию. То есть, если пользователь при определении имени файла не укажет расширение, имени файла автоматически присваивается расширение, принятое по умолчанию. Если при определении свойств диалоговой панели программист присвоит параметру lpszDefExt значение NULL, то расширение файлов должно задаваться пользователем явно.
В некоторых случаях требуется, чтобы диалоговые панели отображались с уже выбранным именем файла. Чтобы указать имя файла, используемое по умолчанию, применяется параметр lpszFileName. Если параметр lpszFileName имеет значение NULL, данная возможность не реализуется.
С помощью флага dwFlags можно изменить внешний вид и некоторые другие характеристики стандартных диалоговых панелей класса CFileDialog. В него можно записать комбинацию флагов, управляющих различными характеристиками этих панелей. Например, флаг OFN_HIDEREADONLY означает, что из диалоговой панели удаляется переключатель "Read Only", а флаг OFN_OVERWRITEPROMPT (используемый для панели Save As) - что необходимо выводить диалоговую панель с предупреждением, если пользователь выбирает для сохранения имя уже существующего файла.
Диалоговые панели выбора файлов обычно имеют список так называемых фильтров, включающих названия типов файлов и расширения имен файлов данного типа. Выбрав фильтр, пользователь указывает, что он желает работать только с файлами определенного типа, имеющими соответствующее расширение. Файлы с другими расширениями в диалоговых панелях не отображаются.
Список фильтров можно указать через параметр lpszFilter. Одновременно можно указать несколько фильтров. Каждый фильтр задается двумя строками - строкой, содержащей имя фильтра, и строкой, в которой перечислены соответствующие ему расширения имен файлов. Если одному типу соответствует несколько расширений, они разделяются символом ;. Строка, содержащая имя фильтра, отделяется от строки с расширениями файлов символом |. Если используется несколько фильтров, то они также отделяются друг от друга символом |. Например, в качестве строки, задающей фильтры, можно использовать строку вида:
Диалоговые панели, представленные объектами класса CFileDialog, могут иметь или не иметь родительского окна. Чтобы указать родительское окно, нужно передать конструктору CFileDialog указатель на него через параметр pParentWnd.
Методы класса CFileDialog
Создание объекта класса CFileDialog еще не вызывает отображения соответствующей диалоговой панели. Для этого необходимо воспользоваться методом DoModal класса CFileDialog.При вызове метода DoModal для ранее созданного объекта класса CFileDialog на экране открывается соответствующая диалоговая панель. После того, как пользователь завершает работу с диалоговой панелью, метод DoModal вернет значение IDOK или IDCANCEL в случае успешного завершения и нуль - в случае возникновения ошибок:
После того, как пользователь закроет диалоговую панель и метод DoModal вернет управление, можно воспользоваться другими методами класса CFileDialog , чтобы определить имена выбранных файлов:
GetPathName - Определяет полный путь файла
GetFileName - Определяет имя выбранного файла
GetFileExt - Определяет расширение имени выбранного файла
GetFileTitle - Позволяет определить заголовок выбранного файла
GetNextPathName - Если диалоговая панель позволяет выбрать сразу несколько файлов, то этот метод можно использовать для определения полного пути следующего из выбранных файлов
GetReadOnlyPref - Позволяет узнать состояние атрибута "только для чтения" (read-only) выбранного файла
GetStartPosition - Возвращает положение первого элемента из списка имен файлов
Наиболее важный метод - GetPathName. Он получает полный путь файла, выбранного из диалоговых панелей Open или Save As. Если диалоговая панель позволяет выбрать сразу несколько файлов, тогда метод GetPathName возвращает массив строк, состоящий из нескольких строк, заканчивающихся двоичным нулем. Первая из данных строк содержит путь к каталогу, в котором расположены выбранные файлы, остальные строки содержат имена выбранных файлов. Выделение строки, содержащей путь к каталогу, проблем не вызывает, а чтобы получить имена выбранных файлов, необходимо воспользоваться методами GetStartPosition и GetNextPathName.
[pagebreak]
Метод GetStartPosition возвращает значение типа POSITION. Оно предназначено для передачи методу GetNextPathName и получения очередного имени выбранного файла. Если пользователь не выбрал ни одного файла, метод GetStartPosition возвращает значение NULL. Значение, полученное этим методом, следует записать во временную переменную типа POSITION и передать ссылку на нее методу GetNextPathName. Метод GetNextPathName вернет полный путь первого из выбранных в диалоговой панели файлов и изменит значение переменной pos, переданной методу по ссылке. Новое значение pos можно использовать для последующих вызовов метода GetNextPathName и получения путей всех остальных выбранных файлов. Когда метод GetNextPathName вернет имена всех выбранных файлов, в переменную pos записывается значение NULL.
В панелях Open и Save As имеется переключатель "ReadOnly". По умолчанию этот преключатель не отображается. Если есть необходимость воспользоваться этим переключателем, то нужно отказаться от использования флага OFN_HIDEREADONLY.
Метод GetReadOnlyPref позволяет определить положение переключателя "ReadOnly". Если переключатель включен, то метод GetReadOnlyPref возвращает ненулевое значение. В противном случае GetReadOnlyPref возвращает нуль.
Панель выбора шрифта (класс CFontDialog)
Стандартная диалоговая панель Font предназначена для выбора шрифта. Эта панель отображает список шрифтов, установленных в системе, и позволяет выбрать название шрифта, его начертание и другие параметры.
Для управления диалоговой панелью Font в библиотеку классов MFC включен класс CFontDialog. Методы этого класса можно использовать для отображения панели Font и определения характеристик шрифта, выбранного пользователем. Конструктор класса CFontDialog:
Все параметры конструктора являются необязательными. Настройка стандартной панели выбора шрифта, которая выполняется конструктором класса CFontDialog по умолчанию, удовлетворяет большинству пользователей.
Параметр lplfInitial является указателем на структуру LOGFONT, описывающую логический шрифт. Если этот параметр используется, то в диалоговой панели по умолчанию будет выбран шрифт, наиболее соответствующий шрифту, описанному в структуре LOGFONT.
Параметр dwFlags задает набор флагов, управляющий различными режимами работы панели. Например, флаг CF_EFFECTS позволяет пользователю создавать подчеркнутые и перечеркнутые буквы, определять цвет букв, а флаг CF_SCREENFONTS - разрешает выбирать только экранные шрифты.
Через параметр pdcPrinter можно передать конструктору контекст отображения принтера, шрифты которого будут представлены в диалоговой панели Font. Данный параметр используется только в том случае, если в параметре dwFlags указаны флаги CF_PRINTERFONTS или CF_BOTH.
Через параметр pParentWnd можно указать родительское окно для диалоговой панели Font.
Методы класса CFontDialog
Для отображения диалоговой панели Font предназначен виртуальный метод DoModal. Если пользователь выбрал шрифт и нажал кнопку OK, метод DoModal возвращает идентификатор IDOK, если пользователь отменил выбор шрифта, метод DoModal возвращает идентификатор IDCANCEL:
Остальные методы класса предназначены для определения характеристик выбранного пользователем шрифта.
Метод GetCurrentFont позволяет сразу определить все характеристики выбранного шрифта, записав их в структуру LOGFONT.
Остальные методы класса позволяют определить только отдельные характеристики выбранного шрифта:
GetFaceName - Возвращает имя выбранного шрифта
GetStyleName - Возвращает имя стиля выбранного шрифта
GetSize - Возвращает размер выбранного шрифта
GetColor - Возвращает цвет выбранного шрифта
GetWeight - Возвращает плотность выбранного шрифта
IsStrikeOut - Определяет, является ли шрифт выделенным перечеркнутой линией
IsUnderline - Определяет, является ли шрифт выделенным подчеркиванием
IsBold - Определяет, является ли шрифт жирным
IsItalic - Определяет, является ли шрифт наклонным
Панель для вывода документов на печать (класс CPrintDialog)
Класс CPrintDialog можно использовать для создания двух видов диалоговых панелей, предназначенных для печати документов и выбора форматов документов. Кроме класса CPrintDialog можно также использовать класс CPageSetupDialog. Он позволяет создать диалоговую панель для выбора формата документа, имеющую несколько иной вид.
В приложениях, подготовленных с использованием средств MFC AppWizard и построенные по модели документ-облик, по умолчанию встроена возможность вывода редактируемого документа на печать.
В меню File такого приложения находятся три строки (Print, Print Preview и Print Setup), которые управляют процессом печати документов, подготовленных в приложении. Чтобы распечатать документ, достаточно выбрать из меню File строку Print. На экране появится диалоговая панель Print. В ней можно выбрать печатающее устройство для печати документов (группа Name), указать, будет печататься весь документ либо его часть (группа Print range), а также сколько копий документа будет напечатано (группа Copies). Также можно настроить различные характеристики печатающего устройства, если нажать кнопку Properties в группе Printer.
Если требуется определить только печатающее устройство и формат документа, из меню File следует выбрать строку Printer Setup. В группе Printer можно указать печатающее устройство и настроить его соответствующим образом. Группа Paper задает формат бумаги и режим подачи бумаги в печатающее устройство. Группа Orientation включает только один переключатель, определяющий ориентацию бумаги. Он принимает положение Portrait для вертикальной ориентации изображения на бумаге (режим "портрет") или Landscape для горизонтальной ориентации изоборажения на бумаге (режим "ландшафт").
Строка Print Preview меню File выбирается для предварительного просмотра документа перед печатью. При этом главное окно приложения изменит свой внешний вид и можно будет просмотреть, как будет выглядеть документ после печати.
Если не требуется выполнять специфическую обработку документа перед печатью, то вряд ли понадобится самостоятельное добавление программного кода, отвечающего за процесс печати. Просто следует отметить, что процедура создания панелей, связанных с печатью документа, практически ничем не отличается от создания выше описанных стандартных диалоговых панелей.
Панель для выполнения поиска и замены (класс CFindReplaceDialog)
Класс CFindReplaceDialog предназначен для управления диалоговыми окнами Find и Replace. Диалоговая панель Find используется для поиска известных строк в документе приложения, а панель Replace позволяет замену одной строки на другую.
Важным отличием диалоговых панелей Find и Replace от других стандартных диалоговых панелей является то, что они представляют собой немодальные диалоговые панели. Поэтому процесс создания этих панелей значительно отличается от процесса создания стандартных панелей для выбора цвета, шрифта и имен файла.
В этом разделе речь пойдет о растеризации двумерных графических примитивов, таких как отрезки, окружности, эллипсы. Мы попробуем разобраться, в чем отличие идеальных математических объектов от реальных отрезков и окружностей, рисуемых на экране.
При этом рассматриваются реальные задачи отрисовки графики, поэтому предложенные алгоритмы должны работать с приемлемой скоростью и использовать различные оптимизации.
Далее, на базе рассмотренных методов, будут построенны алгоритмы заливки фигур.
Связность
Идеальная математическая линия представляет собой бесконечное количество точек, удовлетворяющих определенному уравнению, или задана другим образом. Реальный экран это всегда конечное количество точек. Изображение представляет из себя прямоугольную сетку, узлы которой имеет целочисленные координаты. Появляется законный вопрос: как определить связность линии на экране?
Традиционно вводятся два понятия связности.
4-связность: пикселы p1(x1, y1) и p2(x2, y2) называются соседними, если либо разность их координат по оси x, либо разность их координат по оси y равна 1 (либо исключающее):
|x2 – x1| + |y2 – y1| <= 1
8-связность: пикселы p1(x1, y1) и p2(x2, y2) называются соседними, если разность их координат по оси x и разность их координат по оси y не больше 1:
|x2 – x1| <= 1, |y2 – y1| <= 1
8-связность(рис 1.) и 4-связность (рис 2.)
Линией на растровой сетке будем считать последовательность пикселов {P1, …, Pn}, таких, что любые два пиксела Pi, Pi+1 являются соседними в смысле заданной связности.
Прим. Отметим, что любая четырехсвязная линия одновременно является восьмисвязной, но не наоборот. Таким образом 4-связность является более сильным понятием.
Отсечение
Понятие связности, введенное выше, позволяет обойти требование на целочисленность координат всех точек. С помощью этого понятия можно судить о связности дискретной линии. Другая проблема состоит в том, что область вывода всегда имеет ограниченные размеры. Область формы, на которую делался вывод в предыдущих разделах, имеет форму прямоугольника. Таким образом появляется задача отсечения выводимых геометрических примитивов по границе некоторой области. Алгоритмы отчесения будут рассмотрены ниже.
Переход к оконным координатам
В предыдущем разделе не акцентировалось внимание, где именно стоит перейти из логических координат в оконные. Дискретность сетки, на которую выводится изображение, имеет определенные преимущества. А именно, за счет целочисленности коорднат пикселей можно создать алгоритмы, которые будут также работать только с целыми числами. Более того, во многих случаях основной цикл из числа арифметических операций содержит только сложения!
Становится ясно, что переход к оконным коодинатам нужно осуществить до начала работы основного алгоритма. В общем случае схема работы будет выглядеть следующим образом:
Это то, что касается базовых понятий. В последующих статьях будут рассмотрены математические основы задания графических примитивов и алгоритмы их построения (растеризации).
Данная публикация предназначена для тех кто делает первые шаги в PHP-программировании.
В статье приводятся примеры часто используемых методов работы с текстом.
После каждого примера идет краткое описание используемых функций.
Данная публикация предназначена для тех кто делает первые шаги в PHP-программировании. В статье приводятся примеры часто используемых методов работы с текстом. После каждого примера идет краткое описание используемых функций, описания взяты из официального руководства PHP. Примеры будут пополнятся по мере поступления вопросов от читателей.
Урок №1
Заменяем {text}, например на слово "студёную", строгий регистр, т.е. заменится только {text}, но не {TexT}:
str_replace (search, replace, subject)
Эта функция возвращает строку или массив со всеми вхождениями search в subject, заменёнными данным значением replace.
Урок №2
Заменяем "летнюю", например на слово "зимнюю", нестрогий регистр, т.е. заменится "летнюю", "ЛЕТНЮЮ", "Летнюю", "леТНюю" и т.д.
preg_replace (pattern, replacement, subject)
Эта функция выполняет поиск и замену регулярного выражения.
Ищет в subject совпадения с pattern и замещает их replacement, где pattern - это регулярное выражение, с которыми мы познакомся позже.
Урок №3
Считываем первые 5 символов из текста:
substr (string, start [, length])
Substr возвращает часть строки string, специфицированную параметрами start и length.
Если start положительный, возвращаемая строка начинается со start'овой позиции в string, отсчитываемой от нуля. Например, в строке 'abcdef' символ в позиции 0 это 'a', символ в позиции 2 это 'c', и так далее.
Урок №4
Считываем последние 5 символов из текста:
Урок №5
Удаляем первые 5 символов из текста:
Урок №6
Удаляем последние 5 символов из текста:
Урок №7
Считываем символы с 3-го по 7-ой:
Урок №8
Заменяем все буквы в тексте на маленькие:
strtolower (string)
Возвращает string со всеми алфавитными символами, конвертированными в нижний регистр.
Урок №9
Заменяем все буквы в тексте на большие:
string strtoupper (string)
Возвращает string со вмеси алфавитными символами, конвертированными в верхний регистр.
Урок №10
Меняем все буквы в тексте на маленькие и делаем самую первую букву заглавной:
ucfirst (string)
Возвращает строку с первым символом в верхнем регистре, если это алфавитный символ.
Урок №11
Замена нескольких пробелов на один:
Урок №12
Удаление лишних пробелов по левому и правому краю текста:
trim (string)
Эта функция возвращает строку с вырезанными в начале и конце строки string пробелами.
Урок №13
Удаление лишних пробелов по левому краю текста:
ltrim (string)
Эта функция возвращает строку с вырезанными пробелами в начале string.
Урок №14
Удаление лишних пробелов по правому краю текста:
rtrim (string)
Эта функция возвращает строку с вырезанными пробелами в конце string.
Урок №15
Удаление всех тэгов:
strip_tags (str [, allowable_tags])
Эта функция пытается вернуть строку str с вырезанными тэгами HTML и PHP. Выдаёт ошибку с предупреждением в случае наличия неполных или ложных тэгов.
Вы можете использовать необязательный второй параметр для специфицирования тэгов, которые не должны вырезаться.
Урок №16
Удаление всех тэгов, кроме <b> и <i>:
Урок №17
Проверяем, есть ли в тексте слово "разогнём", нестрогий регистр, т.е. ищется и "РаЗогНЁМ", и "РАЗОГНЁМ" и "разогнём" и т.д.:
preg_match (pattern, subject)
Ищет в subject совпадения с регулярным выражением, заданным в pattern.
Урок №18
Проверяем, есть ли в тексте слово "надо", строгий регистр, т.е. ищется только слово "надо":
strstr (haystack, needle)
Возвращает часть строки haystack от первого вхождения needle до конца haystack.
Если needle не найден, возвращает FALSE (ложь).
Урок №19
Считываем первые 6 слов из текста:
explode (separator, string)
Возвращает массив строк, каждая из которых является подстрокой строки string и сформирована путём разделения строки по границам образованными сепаратором строки separator.
Операция .= добавляет к строковой переменной новые символы.
Урок №20
Конвертируем текст с кодировком windows-1251 в кодировку koi8-r:
convert_cyr_string (str, from, to)
Эта функция возвращает данную строку, конвертированную из одного набора символов кириллицы в другой.
Аргументы from и to это односимвольные аргументы, представляющие исходный и целевой наборы кириллицы. Поддерживаются типы:
k - koi8-r
w - windows-1251
i - iso8859-5
a - x-cp866
d - x-cp866
m - x-mac-cyrillic
Урок №21
Используем в качестве разделителя "||" (две вертикальных черты):
Урок №22
Заменяем <b> на <b> и </b> на </b>:
htmlspecialchars (string string)
Некоторые символы имеют в HTML специальное значение и должны быть представлены мнемониками HTML для сохранения своего значения.
Эта функция возвращает строку с выполненной конвертацией.
Используется для того, чтобы всякие нехорошие человеки не написали в вашей гостевой (например) нежелательных тегов, испортив тем самым её внешний вид.
Хотя эти и не единственное где можно применить данную функцию, мы поговорим об этом при случае 1
& (амперсанд) становится &
" (двойная кавычка) становится "
' (одинарная кавычка) становится '
< (меньше) становится <
> (больше) становится >
Добавление сайта в каталоги уже давно и прочно вошло в список наиболее важных инструментов раскрутки и продвижения сайта в сети интернет. Сегодня мы расскажем о том, как с наилучшим результатом добавить свой сайт в каталоги. Есть два пути, при котором регистрация в каталогах влияет на посещаемость Интернет-ресурса:
Во-первых, каталоги предназначены для людей – в них человек может найти сайты по интересующей тематике. Среди таких посетителей каталогов есть и Ваши потенциальные клиенты. Таким образом, это Ваша реклама в каталоге. Примерами таких, приводящих посетителей, каталогов, является Яндекс.Каталог, рейтинг Рамблер.Top100, MAIL.ru и много других. Эти каталоги посещают миллионы пользователей ежедневно.
Во-вторых, любая поисковая система при ранжировании сайтов в выдаче по поисковому запросу учитывает количество и качество ссылок на ресурс, это так называемые индексы цитирования. У каждой поисковой системы он свой. У Яндекса - тИЦ (тематический индекс цитирования, применяется для ранжирования сайтов в Яндекс.Каталоге; можно увидеть на "денежке") и вИЦ (внутренний индекс цитирования, применяется для ранжирования сайтов в поисковой выдаче; не разглашается), у Google - PR (PageRank), у Апорта - ИЦ.
PageRank (PR) – рассчитывается для каждой веб-страницы отдельно, и определяется PageRank’ом (цитируемостью) ссылающихся на нее страниц. Своего рода замкнутый круг. Главная задача заключается в том, чтобы найти критерий, выражающий важность страницы. В случае с PageRank таким критерием была выбрана теоретическая посещаемость страницы.
тИЦ – тематический индекс цитирования – рассчитывается для сайта в целом и показывает авторитетность ресурса относительно других, тематически близких ресурсов (а не всех сайтов Интернета в целом). ТИЦ используется для ранжирования сайтов в каталоге Яндекса.
вИЦ – взвешенный индекс цитирования – аналог PageRank, применяемый поисковой системой Яндекс. Значения ВИЦ нигде не публикуются и известны только Яндексу. Поскольку узнать ВИЦ нельзя, следует просто помнить, что у Яндекса есть собственный алгоритм оценки «важности» страниц.
Добавляя свой сайт в каталог, Вы создаете дополнительную ссылку на него и повышаете таким образом свой индекс цитирования.
Стоит помнить, что просто повышая ИЦ, тИЦ, PR Вы мало чего добьетесь . Думаю, многие наблюдали ситуацию, когда на первой странице выдачи Яндекса вперед выходят сайты, имеющие меньший тИЦ, да и PR, чем у тех, кто занимает более низкие позиции. Для того чтобы использовать регистрацию в каталогах максимально эффективно, необходимо принять во вниманию ссылочное ранжирование. Дело в том, что этот фактор зачастую перевешивает многие другие, влияющие на место в поисковой выдаче.
Каким же образом действует ссылочное ранжирование? Формат гипертекста позволяет «на гиперссылке» ставить произвольный текст. Совпадение текста ссылок со словами поискового запроса (а особо точного вхождения) повышает Ваши позиции в выдаче.
Заметим также, что по низкочастотным запросам поисковики иногда выдают проиндексированные ими страницы каталогов со ссылкой на Ваш ресурс.
Таким образом, перед тем как регистрировать сайт в каталогах, составьте список запросов, по которым Вы хотели бы, чтобы Вас находили в поисковых системах. Для этого можно воспользоваться службами Подбора слов Яндекс.Директа и Статистикой поисковых запросов Рамблера.
Затем составьте несколько названий для Вашего сайта с использованием выбранных Вами ключевых слов. При этом учтите, что оптимальным будет использование словосочетаний, а не только отдельных слов, найденных Вами в статистике. Эти названия будут размещены на ссылке из каталога на Ваш сайт! Использование при регистрации в каталогах несколько названий позволит Вам использовать разные ключевые слова и избежать «превышения лимита» ссылок с одинаковым текстом, которые не учитываются поисковиками.
Названия должны быть осмысленными. Это обусловлено двумя причинами: во-первых, в последнее время поисковые системы очень плохо учитывают ссылки с перечислением ключевых слов через запятые. Во-вторых, большинство каталогов размещают ссылки после предварительной модерации. Те каталоги, которые следят за своим содержанием, с большой вероятностью откажут в размещении такой ссылки либо скорректируют ее на свое усмотрение, а как правило, ссылки именно с этих, серьезно модерируемых каталогов, имеют наибольший вес.
Адрес сайта указывать не обязательно, однако его присутствие в названии повышает Вашу узнаваемость среди многих других конкурентов. Еще раз повторю: не стоит перечислять ключевые слова через запятую, большое количество альтернативных названий позволит Вам использовать все выбранные Вами ключевые слова и даст значительно больше эффекта.
Выбирая рубрики, выбирайте наиболее подходящие. Зачем? Страница из подходящего раздела каталога получается самой подходящей с точки зрения «тематического» цитирования – это раз. Если раздел не подходит, модератор каталога (который тоже человек), может, не вдаваясь в подробности, просто отклонить сайт. Это два.
Для увеличения скорости выбора рубрик используйте Поиск. Обратите внимание на следующее: расставляйте слова в списке, начиная с наиболее подходящих, а затем по убыванию соответствия. В некоторых случаях, когда сложно предугадать, в каком склонении стоит слово в названии рубрики, используйте слова без окончаний. Иногда одно и то же слово может писаться по-разному. Учитывайте и это.
На заметку:
Обязательное условие успешной регистрации в каталогах и поисковиках - правильное описание ресурса и подбор ключевых слов. Иначе эффективность регистрации будет чрезвычайно мала.
Подача заявки на регистрацию еще вовсе не означает, что ресурс будет обязательно зарегистрирован. На это существует масса причин: неподходящая специализация каталога, некорректно составленное описание сайта, выбор неправильной категории, "заморочки" модераторов и проч. В среднем при хорошей предрегистрационной подготовке сайта, ресурс в течение месяца проходит регистрацию в 70-80% каталогов, куда была подана заявка.
Поисковая оптимизация - это комплекс работ над сайтом и внешними факторами для достижения наилучших позиций в поисковых системах в соответствии с выбранными ключевыми словами. Этот способ оптимизации позволяет достигать высоких позиций в результатах выдачи поисковых машин по профильным запросам (ключевым словам) и тем самым привлекать огромную часть целевых посетителей.
В настоящий момент единственным путём завоевать Интернет-просторы, является оптимизация и продвижение сайта в поисковых системах. С каждым годом число пользователей Интернета, а, следовательно, поисковых систем растет. А это значит, что поисковая оптимизация приносит все больше и больше выгоды владельцам сайта. Согласно статистике, около 85% пользователей ищут информацию при помощи поисковых машин, которые обеспечивают от 70% до 85% от общей посещаемости ресурса.
Основные этапы оптимизации сайта и поискового продвижения:
* анализ ресурса;
* составление семантического ядра для поисковой оптимизации;
* оптимизация сайта: тексты, навигация, код;
* поисковое продвижение сайта: регистрация сайта в каталогах, на досках объявлений и форумах, работа со ссылочным ранжированием.
Поисковую оптимизацию можно разделить на внутреннюю и внешнюю.
Внутренняя оптимизация сайта направлена на работу с самим сайтом. К ней относится:
1. Составление семантического ядра сайта.
Семантическое ядро представляет собой совокупность запросов (ключевых слов), смыслу которых отвечает интернет-ресурс. Семантическое ядро создается с учетом специфики сайта из наиболее распространенных и соответствующих ключевых слов. По такому списку ключевых слов отслеживается продвижение сайта.
Правильно подобранные ключевые слова станут эффективным оружием в конкурентной борьбе. Есть несколько рекомендаций по использованию ключевых слов на страницах интернет-ресурсов.
Советы по использованию ключевых слов:
* Всегда используйте более одного слова при выборе ключевых фраз. Исследования показали, что большинство людей вводят в строку поиска фразу, состоящую из 2-х слов и более.
* Избегайте самых популярных ключевых слов, потому что Вашему сайту придется конкурировать с миллионом других подобных страниц, среди которых те, что принадлежат более мощным компаниям.
* Оптимальная частотность ключевых слов - 5%. Использование большего количества ключевых фраз может превратить ваш документ в спам.
2. Оптимизация страниц сайта.
В нее входят работы с html-кодом и текстами (контентом) страниц. При оптимизации html-кода проводится правка непосредственно html-кода, коррекция META-тегов, заголовков, описаний страниц сайта, выделение нужных частей страницы специальными тегами. Все тексты страниц анализируются и корректируются в соответствии с ключевыми словами.
Основные факторы ранжирования, на которые надо обратить внимание:
* Теги title - заголовки страниц сайта, наиболее важный фактор, на который следует обратить внимание. В заголовки страниц необходимо прописывать слова, по которым вы планируете провести оптимизацию сайта, но не следует забывать о том, что текст, содержащийся в заголовке страницы, будет выдаваться в результатах поиска. Следовательно, заголовок страницы должен быть информативными и привлекательно выглядеть, ведь с большей вероятностью пользователь выберет именно такое описание страницы. Распространенная ошибка - использование одного заголовка для всех страниц сайта. Для каждой страницы заголовок должен разрабатываться отдельно, в соответствии с содержанием страницы.
*
* Тег meta name="description" content="описание страницы" - практически никак не влияет на ранжирование сайта, однако это описание страницы будет выдаваться, если ваш сайт будет найден по ссылке, поэтому всё же стоит составить грамотное описание страницы и включить его в данный тег.
* Теги заголовков h1-h6 - играют очень большую роль при ранжировании сайта. Рекомендуется включать ключевые слова в данные теги. Также можно оформлять данные теги с помощью стилей CSS, но в пределах разумного, т.е. заголовок h1 должен быть основным заголовком страницы, h2 - подзаголовком и т.д. При попытке включить весь текст на странице в данный тег, ваш сайт может быть вообще исключен из результатов поиска, так что рекомендуем вам пользоваться данными тегами осторожно и не злоупотреблять ими.
* Теги акцентирования b, i и им подобные - рекомендуется выделять ключевые слова на странице данными тегами, это может дать преимущество при ранжировании сайта.
* Плотность ключевых слов на странице - отношение количества ключевых слов и словосочетаний к полному текстовому объему страницы. Рекомендуемой плотностью является, по разным данным, от 5% до 7%.
3. Оптимизация структуры сайта.
Изменение внутренних ссылок на страницы, создание карты сайта, для того чтобы поисковый робот смог проиндексировать все страницы. После таких работ поисковым роботам будет проще и удобнее работать со страницами, что ускорит их индексацию.
Рекомендации по структуре сайта:
* Используйте текстовые ссылки на все страницы сайта с необходимыми ключевыми словами, используйте прямые ссылки вида: , поисковые системы очень хорошо распознают такие ссылки, использование сложных скриптов, таких как Java, PHP и т.п. для формирования ссылок лучше не используйте.
* При наличии большого количества страниц на сайте, сделайте карту сайта, можно даже разбить ее на несколько страниц так, чтобы одна страница не содержала больше 50 исходящих ссылок (это затрудняет работу поискового робота).
* Следуйте "правилу трех кликов", т.е. все страницы сайта должны быть доступны пользователю на расстоянии 3-х кликов от главной страницы.
* Старайтесь не использовать на страницах сайта большое количество flash и графики, страница не должна очень много весить.
К внешней оптимизации относятся действия по повышению "дружественности" к поисковым системам и авторитетности (популярности) интернет-ресурса. Чтобы увеличить популярность сайта нужно учесть такие факторы как:
1. Ссылки с сайтов с большим тИЦ и PageRank.
Такие ссылки являются качественными и обладают большим весом, что влияет на позиции сайта в результатах поиска.
2. Тексты описания ссылок.
Текст ссылки, содержащий ключевые слова, воспринимается поисковой системой как дополнительная рекомендация, подтверждающая соответствие поисковому запросу, что влияет на ранжирование сайта.
3. Ссылки на тематических сайтах.
Кроме текста ссылок поисковые роботы учитывают общее информационное содержимое ссылающейся страницы сайта и при схожести тематик дают таким ссылкам больший вес.
4. Односторонние ссылки.
Поисковые системы стараются отслеживать взаимные ссылки, поэтому отдают предпочтение односторонним ссылкам, считая их более подлинными и ценными.
5. Избегание "плохих" ссылок.
С тех пор как увеличение ссылочности стала одним из важных факторов ранжирования, число сайтов "каталогов ссылок" возросло. Поисковые системы негативно относятся к многочисленным каталогам сайтов и стараются обесценить такие ссылки или не учитывать их совсем.
22 наиболее часто встречаемых ошибок при самостоятельной оптимизации сайта под поисковые системы:
1. Регистрируемая в поисковой системе страница должна содержать ссылки на другие страницы сайта. В противном случае она будет единственным, что проиндексирует поисковая машина.
2. Не стоит регистрировать сайт в поисковых системах, который находится в стадии разработки (к каталогам, доскам объявлений и форумам это относиться в меньшей степени). Робот, пришедший на пустую страницу вернется очень не скоро и придется ждать следующей индексации.
3. При использовании механизма переадресации, регистрировать в поисковых системах необходимо реальный адрес Вашего сайта. Машина все равно будет выдавать ссылки именно на него, а не на redirect.
4. Разведение линкопомоек на сайтах. Никогда не размещайте на одной странице сайта больше 20 исходящих ссылок. Если необходимо разместить большее количество ссылок, то их стоит располагать на отдельных страницах. В противном случае Ваш сайт может пропасть из поисковой системы на длительное время.
5. Если поисковая машина не понимает переадресацию, то ресурс останется не проиндексированным.
6. Не стоит плодить копии страницы под разными именами, релевантности сайту это не добавит, а на санкции от поисковой машины нарваться можно.
7. Неправильное написание букв национальных алфавитов - вместо русской "С" (эс) английская "С" (це). Данное правило стоит всегда соблюдать.
8. Грамматические ошибки и примкнувшие к ним опечатки. Используйте редакторы с проверкой правописания.
9. Не используйте слова через п р о б е л. Слова, написанные таким образом - поисковая машина воспримет как группу несвязанных символов.
Если требуется установить большое расстояние между буквами - используйте таблицы стилей CSS (напр.: letter-spacing: 7px; ).
10. Размещение на странице текста по цвету схожего с фоном и включение в этот текст кучи ключевых слов, является недопустимым. При обнаружении поисковыми системами можно попасть в бан.
11. Большое количество индексируемых страниц, не содержащих ключевой информации, снижает релевантность сайта и увеличивает время его индексации.
12. Не стоит создавать несколько страниц настроенных на одинаковый набор ключевых слов. Используйте синонимы или слова близкие по смыслу. Люди при поиске могут набирать фразы по-разному.
13. Использование для выделения тега FONT. Этот тег не увеличивает релевантность выделяемых слов. Используйте, когда это возможно, теги
-
или .
14. Использование в заголовке (тег TITLE) посторонней информации: название сайта на всех языках мира, его URL, самые популярные в Сети слова, не имеющие отношения к сайту (кстати, это может квалифицироваться как спам), пара десятков восклицательных знаков и т.п. Выводите в заголовок важную ключевую информацию. Например, для сайта www.ваш сайт.ru, заголовок может выглядеть следующим образом - Магазин техники – персональные компьютеры и комплектующие.
15. Использование в META-теге KEYWORDS слов не только не встречающихся в тексте, но и не имеющих к нему никакого отношения. Такие страницы могут считаться спамом.
16. Использование тегов DESCRIPTION и/или TITLE как еще одного тега KEYWORDS (бессмысленный набор ключевых слов)
17. Каждая страница должна иметь индивидуальный тег TITLE, а в идеале и KEYWORDS + DESCRIPTION.
18. Создание множества никому не нужных, невразумительных сателитов. (Хороший, интересный сателит с уникальным и интересным контентом - это совсем другое дело).
19. Частой ошибкой при конструировании сайта является идти "на поводу" оптимизации в ущерб контенту и дизайну.
20. Использование "чужого" контента. Более эффективным является написание собственного уникального контента.
21. Оптимизация страницы более чем под 10 поисковых запросов. На практике лучше каждую страницу оптимизировать под конкретные ключевые слова, причём количество слов не должно превышать 10!
22. Частой ошибкой является необдуманная покупка внешних ссылок с различных веб-сайтов. К данному вопросу стоит относиться очень серьёзно и покупать ссылки только у профессиональных компаний.
На сегодняшний день ни один грамотно поддерживаемый сайт не обходится без анализа данных о посетителях сайта. Для чего нужна статистика? Только для того, чтобы наблюдать за темпом посещаемости сайта? Отчасти - да. Но умные люди найдут в статистике еще и дополнительный способ увеличения популярности своего сайта. Давайте же разберемся, чем сможет нам помочь статистика в этом плане.
Хост - уникальный посетитель вашего сайта. Другими словами - если один и тот же человек заходил к вам на сайт в течение дня несколько раз, то на счетчике хостов он будет засчитан только один раз.
Хит - количество загрузок всех страниц сайта, если счетчик установлен на каждой странце. Если один посетитель в течение одного дня возвращался к вам 10 раз или в течение одного сеанса просмотрел 10 страниц - на счётчике хитов будет отображена именно эта цифра. Информация будет суммироваться с приходом следующего юзера.
Реферал - (Refer) - англ. - ссылаться. Рефералом является ссылка на страницу, с которой к вам пришел пользователь. Это одна из самых важных частей статистики. Вы можете контролировать источники своей аудитории.
Анализируем :
Первым делом статистику надо получить. Те, кто не “обременен” платным хостингом, и, соответственно, не имеет доступа к логам сервера, могут воспользоваться бесплатным счетчиком. Благо, выбор довольно богатый. В зависимости от правил предоставителя счетчика его можно размещать как на одной странице, так и на всех. Идеальным выглядит, конечно же, второй вариант из соображений того, что почти каждое действие со стороны посетителя будет зафиксировано и статистика будет наиболее полной.
Итак, вы уже имеете ее, заветную информацию о посещениях вашего сайта. Теперь давайте искать пути использования статистики в целях раскрутки сайта или ликвидации тех факторов, которые препятствуют процессу раскрутки. Этому можно найти пример. Снимите в конце дня данные о количестве хитов и хостов на вашем сайте. Подсчитайте соотношение хиты/хосты, получившаяся цифра даст вам представление о том, сколько в среднем страниц загружает один посетитель. Если цифра окажется менее трех - это явно свидетельствует о том, что у вас не все в порядке с навигацией или отображением информации. Так же следует обратить внимание на контент (содержание) и скорость загрузки сайта. Без устранения этих недостатков раскрутка с мертвой точки не сдвинется.
Далее следует изучить наиболее популярные пути по сайту или наиболее популярные разделы сайта и уделить внимание менее популярным разделам, а может быть, и вовсе, заменить их на другие. Таким образом, все вышеописанные действия представляют собой первоначальную подготовку сайта к раскрутке.
Заимствуем “рефералов” :
Способ этот, насколько я знаю, еще нигде публично не излагался, поэтому я невольно являюсь первопроходцем в этой области. Всем известно, что сайт, зарегистрировавший счетчик, невольно попадает в своеобразный рейтинг сайтов. Вот туда мы и направимся. Причем неважно, зарегистрированы вы в этом рейтинге или нет. Из этого самого рейтинга в большинстве случаев можно получить доступ к статистике. Часть сайтов ее закрывает паролем, а часть оставляет “свободной”. Так вот в “свободной” статистике чужого сайта будет очень даже интересно покопаться. Особенно в отчете по “рефералам” (см. “на заметку”). Ищем наиболее прибыльные рефералы, идем на них и воплощаем идею сотрудничества с тем сайтом в жизнь. Таким образом, при удачном исходе вы будете сотрудничать с очень полезными сайтами, обладающими большой отдачей.
Не стоит забывать и про рефералов в своей статистике. Сайты, которые наиболее часто снабжают вас аудиторией следует лилеять и искать пути углубления сотрудничества.
В качестве заключения :
Таким образом, с помощью статистики можно не только выявить причины непопулярности сайта, но и раскрутить его. Конечно, речь не идет о мгновенном рывке в первые ряды TOPов, эффект будет поскромнее. Те, кто полагается на “авось сама раскрутится” очень ошибутся. Придется все же усердно поработать, прежде чем ваш счетчик закрутится. А кому сейчас легко? Ленивый веб-мастер - это не веб-мастер. Побольше вам “рефералов” и циферок на “крутилке”. И в добрый путь - бороздить рейтинги РуНета.
Выбор ключевых слов является одним из важнейших этапов оптимизации сайта под поисковые системы. Так как поисковики являются основным источником целевых посетителей, то этому вопросу надо уделять особое внимание. Правильно подобранные ключевые слова помогут пользователям легко находить страницы сайта, а также повысят их позицию в результатах выдачи по запросу.
Итак, для начала необходимо проанализировать тематику сайта и постараться взглянуть на него глазами посетителя. Цель такого упражнения-разминки – подбор слов и выражений, по которым, на ваш взгляд, производится поиск подобных сайтов.
Теперь можно приступить к детализации задачи, а именно, подбору ключевых слов для каждой страницы сайта отдельно. Большинство начинающих разработчиков при оптимизации допускают одну критическую ошибку, а именно, оптимизируют все страницы под одни и те же запросы. Они не учитывают тот факт, что машины поиска каждую страницу рассматривают независимо от остальных, поэтому необходимо оптимизировать страницы по отдельности, тщательно подбирая для них ключевые слова.
При анализе страницы необходимо написать около двух десятков ключевых слов, из которых попробовать сформировать фразы с учетом возможностей морфологического поиска и расположить слова и выражения в порядке их соответствия тематике страницы.
Например, ваша компания занимается продажей бытовой техники. Вместо использования в тегах HTML-кода и содержимом страниц ключевой фразы “продажа бытовой техники”, нужно уточнить эту фразу в зависимости от содержимого каждой страницы. Если на данной странице внимание сфокусировано, например, на кухонных комбайнах, то теги и текст необходимо оптимизировать именно под это выражение.
Сейчас идет тенденция к оптимизации страниц больше под ключевые выражения, чем под отдельные слова. Это связано с повышением уровня интернет-пользователей, которые для уточнения поисковых запросов из ключевых слов с помощью служебных символов строят ключевые фразы, значительно повышающие релевантность результатов поиска.
Следующий этап - это анализ частоты запросов по пунктам списка, составленного на этапе обдумывания тематики сайта. Здесь уже придется излагать не свое видение сайта, а вооружиться поисковой системой. Желательно брать тот поисковик, в трафике которого вы больше всего заинтересованы.
Составленный список предполагаемых ключевых слов можно проверить, например, с помощью сервиса «Яндекс.Директ» и выделить в нем фразы, сходные с заданными изначально. Далее необходимо посмотреть количество запросов для каждого выражения, выбранного на первом этапе, и попробовать найти фразы-синонимы. Если для них количество запросов будет больше, есть смысл заменить первоначальный вариант.
Чтобы выявить близкие по значению выражения, можно использовать сервис «Рамблер-Ассоциации», который представляет статистику поисковых запросов и работает по принципу «Те, кто ищут [запрос пользователя], ищут также». Сервис предназначен в помощь пользователю, совершившему поиск по какому-либо запросу и не получившему нужной информации. Статистика “ассоциаций” помогает выяснить интересы пользователей, путем анализа списка запросов, схожих с основным. Для выявления англоязычных запросов можно использовать сервис Wordtracker, который в бесплатной версии выдает ограниченные отчеты по поисковым запросам.
Теперь необходимо проанализировать полученную статистику запросов по списку ключевых слов. Если по некоторым из них результаты зашкаливают за десятки тысяч, их однозначно можно убрать из дальнейшего рассмотрения т.к. эти слова используются многими конкурентами. Здесь надо учесть тот факт, что если для оптимизации будет выбрана слишком распространенная ключевая фраза, то потребуется много времени и сил, чтобы взобраться на вершину ранжированного списка результатов. Кроме того, привлеченный таким образом сетевой трафик будет плохо сфокусирован, т.е. процент целевых покупателей будет невелик. С другой стороны, если для ключевой фразы будет получено малое число результатов, то эффективность такой оптимизации также буде невысока.
Чтобы добиться компромисса в этом сложном вопросе, надо брать ключевую фразу, которая является оптимальной для тематики страницы и высоко конкурентной, и добавлять в нее описательные слова или, например, конкретные модели и торговые марки, т.е. конкретизировать представленную на странице информацию.
Часто многие сайты для привлечения большего числа посетителей используют для ключевых слов практически на всех страницах выражения типа “все модели”, “весь модельный ряд”, “огромный выбор” и т.д. Если на вашем сайте в самом деле представлены все модели некоторой торговой марки или же подавляющее большинство их, то лучшим вариантом будет оптимизация под такой запрос какой-то одной страницы, например с самой популярной моделью. При этом на этой странице обязательно должны быть ссылки на другие модели или на страницу с кратким представлением всех моделей в удобном для сравнения виде. Если в ключевой фразе перечисляются конкретные модели, то необходимо располагать их в порядке убывания популярности.
Очень часто при вводе поискового запроса пользователи не пишут прописные буквы в названиях компаний, торговых марок, городов и т.п. Т.к. некоторые системы поиска чувствительны к регистру символов, т.е. поиск по вариантам фразы с символами, преобразованными в нижний регистр, и с символами в верхнем регистре приводит к разным результатам. Поэтому, чтобы улучшить результаты поиска своего сайта, надо добавлять на страницы все варианты написания ключевой фразы. Если во фразе используются слова, которые по правилам языка пишутся с прописной буквы, то можно использовать ее версию со строчными буквами там, где она не будет видна для посетителей.
В зависимости от того, под какую систему поиска оптимизируется сайт, необходимо узнать поддерживается ли ей морфологический поиск, т.е. поиск по слову во всех его морфологических формах. Это значит, что поиск по фразе «оптовая покупка скидка» может быть интерпретирован, как “при оптовой покупке скидки” и т.д. Чтобы определить, выполняет ли данный поисковик морфологическую функцию, можно проработать поиск по различным версиям ключевой фразы и проанализировать результаты.
Необходимо не только постоянно проводить мониторинг частоты использования вашей ключевой фразы пользователями, но и отслеживать, как много других страниц также оптимизированы под нее. Т.е. надо постоянно следить за конкурирующими ресурсами, которые стоят первыми в рейтинге при запросе по данной тематике.
Таким образом, выбор наиболее эффективных ключевых фраз может буквально поставить на ноги ваш онлайновый бизнес, а неудачный, наоборот, разрушить его. Главное не забывать, что каждая страница оптимизируется под одну-две ключевые фразы, которые четко соответствуют ее тематике.
В этой статье мы поговорим о рекламе сайта. Статья состоит из двух частей, в первой я расскажу вам отдельно о рекламе домашних страничек, во второй мы поговорим подробнее и серьезнее о рекламе в интернете, как таковой. Надеюсь, вы не пропустите первую часть статьи, потому что, не смотря ни на что, она принципиально важна.
Реклама домашних страниц.
Реклама, как таковая.
1 - Первый этап. Каталоги.
2 - Второй этап. Обмен баннерами и ссылками с тематическими ресурсами.
3 - Третий этап. Добавление в поисковые системы.
4 - Четвертый этап. Баннерные системы.
5 - Пятый этап. Нетрадиционные способы.
6 - Шестой этап. Как не потерять вашего посетителя.
7 - Седьмой этап. Повторение этапов.
Сразу поясню, почему я хочу поговорить с вами о рекламе домашних страниц отдельно.
Давайте рассмотрим эволюцию пользователя в интернете: сначала он гость, посещающий чужие сайты, знакомящийся с новыми людьми, чтобы переписываться с ними по почте, общаться в чате или на форумах. Но наступает момент, когда так хочется обзавестись собственным домиком, чтобы показать свою состоятельность и полноправность в гигантской паутине.
И вот когда домик отстроен, первые гости переступили его порог, похвалили, возникает такое свербящее чувство, которое можно назвать желанием популярности, желанием привлечь в свой домик толпы и толпы гостей в абсолютно разных целях: чтобы увеличить количество виртуальных друзей, а может быть найти любовь, или просто приобрести популярность, или даже извлечь выгоду из своего труда, заработать денюжку.
Все это вполне справедливые желания, т.к. и в реальной жизни нам свойственно самоутверждаться, но Интернет - это не тень реальной жизни, это информационная сеть, а простые домашние странички (обо всем и ни о чем, а точнее о вас любимых), они становятся мусором, когда в поиске важной, нужной и полезной информации человек натыкается на них, а не на то, что ищет в действительности. Поэтому, прежде чем ударяться в рекламные акции всеми правдами и неправдами, стоит задуматься: а нужно ли это? а как сделать, чтобы моя страница не стала мусором, а помогла найти мне друзей? А заработать?
Итак, сразу скажу, что заработок в интернете на пустом месте, из ничего, благодаря странице с баннерами спонсоров – миф, поверьте мне, и лучше забудьте об этом, не тратьте зря ни свое, ни чужое время.
Другое дело желание общения, некой популярности. Реклама вашей страницы в данном случае будет бесполезна, это все равно, что дать объявление в газете: вот мой дом, я там живу. Ну, и что? Кто вы такой, чтобы мы заинтересовались и пришли в гости? Другое дело, когда вы идете в какое-нибудь общественное место, клуб, знакомитесь там с новыми людьми, и говорите им, давая свой адрес:
- Вот мой дом, я там живу.
- О! – скажут они, - мы обязательно придем, нам с тобой было интересно пообщаться, и мы хотим узнать о тебе побольше и пообщаться еще не раз.
Т.е. я веду к тому, что домашняя страница, это как ваша квартира, чем больше у вас друзей, тем чаще они приходят к вам в гости, они заинтересованы в вас, именно поэтому им интересна ваша страница. Итак, для того, чтобы ваша страница была популярной, вы сами должны быть популярными. Благо, в интернете для этого много способов. Есть чаты, сайты знакомств, конференции и сайты, где люди общаются по определенным интересам, игровые сайты. Посещайте их, общайтесь, если вы интересны, то, посмотрев вашу анкету на таком сайте, люди обязательно посетят, и не раз, вашу домашнюю страницу.
И если у вас на душе все равно свербит и хочется добавить свою домашнюю страницу в поисковые системы и каталоги, тогда будьте вежливы, добавляйте ее в категории для Домашних страниц, они везде есть специально для вас. Повторюсь, не надо мусорить, вы поступите очень не красиво, если из-за того, что на вашей странице вы рассказываете о своей игрушечной машине, вы начнете позиционировать вашу страницу, как замечательный сайт об автомобилях. Это не даст популярности вашему сайту, т.к. на самом деле это не сайт об автомобилях, а лишь ваша домашняя страница, это только вызывает раздражение и негативные эмоции у тех, кого вы обманули.
Реклама, как таковая.
Я рассказывал о том, как сделать домашнюю страницу популярной, и читал нотации вам не просто так. Самое главное понять, что вы хотите достичь рекламной кампанией, и нужно ли вам это на самом деле.
Почему надо к рекламе подходить серьезно? Почему слово раскрутка надо отмести, как не состоятельное? Почему вы должны подходить к рекламе цивилизованно, когда вы можете просто начать «крутить» свой сайт и можете получить в день до 1000 посетителей с нуля при помощи специальных программ?
Потому что раскрутка это всего лишь фикция. Это посетитель, которого не было, который не вернется, который не пойдет по вашему сайту дальше первой страницы. Это зря затраченные усилия и потраченное время.
Для нас самое главное найти своего посетителя и заинтересовать его в том, что мы хотим ему предложить.
Но давайте по порядку, прежде всего вам следует понять, что количество и постоянный приток посетителей на вашем сайте зависит не только от рекламы, а также от наличия интересной, определенной группе людей, информации, ради которой они будут посещать ваш ресурс. Так, например, некоторые крупные компании, создают тематические информационные порталы относительно области своей деятельности, чтобы таким образом привлечь не только посетителей на свой сайт, но и потенциальных клиентов. Т.е. первое, что мы должны сделать, это качественный и интересный ресурс, сами понимаете, жиденькие сайты с 2-мя-3-мя десятками страничек, с информацией ни о чем, не могут претендовать на звание качественного ресурса.
Также хочу заметить, если вы создаете сайт для коммерческой организации, то лучше всего этот процесс от начала до конца поручить специалистам: и разработку, и рекламу, потому что и то, и другое взаимосвязано. По сути, сайт – это что-то вроде вашей рекламной брошюры: во время рекламной кампании вы привлекаете к ней внимание, чтобы ее прочли, и если ваш сайт-брошюра не интересен и не заинтриговал человека, пришедшего по рекламному объявлению, то смысл рекламной компании сводится к нулю.
Итак, поскольку я считаю, что коммерческие организации могут потратиться на рекламу, и даже должны, а обычные информационные порталы и некоммерческие организации часто не имеют возможности позволить себе относительно дорогостоящую рекламу, поэтому моя статья скорее для владельцев ресурсов последнего типа, поэтому я буду вести речь о бесплатных, или не очень дорогих способах рекламы сайта.
Когда, мы имеем качественный ресурс, хорошо продуманный, выверенный, стоящий того, чтобы о нем узнали, не надо нестись сломя голову на сайты поисковых систем и каталогов, не торопитесь. Следует продумать, какая аудитория заинтересована в вашем ресурсе: возраст, пол, профессиональная занятость этой аудитории – например, грузчики они или учителя. После того, как вы определились какова ваша аудитория, надо понять, где ваша аудитория в интернете обитает: на какие сайты ходит, какие журналы читает, и т.д. И только после этого мы начинаем охоту, господа :) .
Первый этап. Каталоги.
Первым делом мы добавляем себя в каталоги. Да-да, именно в каталоги, а не в поисковые системы, чуть позже объясню почему. Для добавления в каталоги нам надо придумать рекламное не слишком длинное объявление, такое, которое по возможности выделит ваш сайт среди других, подобных вашему, и может заинтересовать вашего потенциального посетителя. Объявление должно быть написано без грамматических ошибок, проверьте себя, не поленитесь, прежде чем оставлять объявление в каталогах.
Какие каталоги нас интересуют? Желательно каталоги, которые собирают в себе сайты с тематикой, подобной нашей. Т.е. если наш сайт рассказывает о медицинских проблемах, то имеет смысл поместить его в каталог, который освящает медицинские ресурсы. От обычных каталогов мы тоже не отказываемся, если у них есть раздел для сайтов с нашей тематикой, если нет, то не имеет смысла пихать информацию о нашем ресурсе туда для количества, не тратьте время.
Весьма рекомендую вам сайт http://1ps.ru - лучшего ресурса в плане поиска каталогов и добавления себя в них вам не найти. Однако, не добавляйте свой сайт через него в поисковики, это лучше делать вручную, и не сразу.
Второй этап. Обмен баннерами и ссылками с тематическими ресурсами.
Когда мы добавляем наш сайт в каталоги, то стоит обратить там свое внимание на интересные и посещаемые ресурсы со сходной нашему ресурсу тематикой. Зачем? Потому что мы будем обмениваться с ними ссылками и баннерами (желательно маленькими баннерами, кнопками).
Выберите несколько наиболее интересных ресурсов, которые предлагают обмен ссылками и баннерами, и напишите их владельцам письма, в которых поинтересуйтесь, не захотят ли они обменяться с вами ссылками или баннерами. Письмо должно быть вежливым, содержать ссылку на ваш ресурс и информацию, где вы собираетесь разместить баннер/ссылку портала, с которым хотите обмениваться.
Письмо должно именно предлагать - наглые письма: мол, я разместил на вас ссылку, а вы теперь разместите на меня – нельзя писать ни в коем случае. Помните, владелец крупного ресурса, посещаемого и устоявшегося, делает вам одолжение, размещая баннер или ссылку на вас, а не вы ему.
Предложите разместить его ссылку на первой странице вашего сайта, при этом будьте готовы согласиться на то, что в ответ вашу ссылку повесят в разделе с не слишком большой посещаемостью, и уж, в любом случае, не на главной странице.
Зачем нам это нужно: потому что третьим этапом будет размещение в поисковых системах, от того, какие ресурсы по качеству и сколько ресурсов на вас ссылается, зависит ваша позиция в списке результатов, выдаваемых поисковой системой пользователю на какой-либо запрос. Поймите, когда отпадет надобность, и вы добьетесь нужных вам результатов и посещаемости, вы можете отказаться от обмена баннерами/ссылками с другим ресурсом, или же заключить новые условия обмена.
Кстати, на втором этапе ваши друзья и знакомые могут вам помочь, разместив на ваш портал ссылку у себя на сайтах.
Третий этап. Добавление в поисковые системы.
Вы должны понимать, что сразу ничего не делается, прежде чем все ваши действия принесут результаты, пройдет какое-то время. Не надо никуда торопиться, ваш ресурс некоммерческий, от того, что к вам сразу не будет притока посетителей, трагедии не случится. К тому же бесплатная реклама не может быть сопоставима по эффективности с той, в которую вы вложили деньги.
В поисковые системы мы добавляем информацию о нашем ресурсе через неделю-другую, после того, как мы разобрались с каталогами и обменом. Мы это делаем в надежде, что к тому времени, как мы будем добавлять о себе информацию в поисковики, они успеют проиндексировать (заметить), страницы других сайтов, где появилась информация о нас.
Для поисковых систем мы заготавливаем заранее ключевые слова - это слова, которые, как мы предполагаем, будет вводить для поиска человек, когда он ищет ресурсы, содержащие такую информацию, как на нашем сайте. Также для поисковых систем мы заготавливаем интересное описание, нашего ресурса.
На что стоит обратить внимание при составлении списка ключевых слов - ключевые слова, должны встречаться в обычном тексте на страницах нашего сайта. Так, если мы берем слово «медицина», как одно из ключевых, оно должно быть в тексте на первой странице нашего сайта, и не только на ней, т.к. поисковые системы смотрят, соответствуют ли заявленные ключевые слова тем, что содержатся в тексте ваших страниц. От этого тоже зависит ваша позиция в списке результатов, выдаваемых поисковой системой пользователю.
Более того, есть специальные META тэги, которые мы должны прописать в коде всех страниц нашего сайта, они содержат ключевые слова и описание вашего сайта. Содержимое мета-тэгов не видно посетителю вашей страницы, зато учитывается поисковыми системами.
Четвертый этап. Баннерные системы.
Участвовать в баннерных системах имеет смысл, только если они тематические – т.е. допустим, баннерная система, в которой участвуют только сайты с медицинской тематикой. В универсальных баннерных системах, не подчиненных единой тематике участвовать вам не имеет смысла. Это не эффективно, ведь вы сможете показывать в день столько баннеров, сколько было показано на страницах вашего сайта, т.е. мало, а если их при этом не видит ваш потенциальный посетитель, человек, который заинтересован в предлагаемой вами информации, то эффективность баннерной рекламы стремиться к нулю, незаинтересованный человек просто не перейдет по баннеру на ваш сайт.
Баннерные системы нас могут интересовать также в том случае, если вы все-таки решили немного потратиться на рекламу. В этом случае вы можете купить баннерные показы на каких-нибудь крупных сайтах, где обитает ваш потенциальный посетитель.
Пятый этап. Нетрадиционные способы.
Вы можете мне не поверить, но этот этап может быть самым эффективным, для повышения посещаемости вашего сайта.
Ваша задача придумать, как еще можно рекламировать свою страницу. К сожалению, общего рецепта тут быть не может. Но я расскажу, как я действовал в случае с Постройкой.ру, в свое время, чтобы вы поняли, что я имею ввиду.
Я сидел, думал, как же сделать сайт популярнее. И мне пришла в голову замечательная идея: у меня есть замечательный и уникальный учебник по html, если сделать оффлайн версию, положить в архив, тогда можно будет поместить мой учебник на сайты-сборники разных программ, ведь я ничего от этого не теряю. Конечно, прежде чем сделать это, я посмотрел, дают ли эти сайты такую возможность, оказалось, что на них имеются специальные разделы для обучающих программ и мой учебник подходит для размещения там. Решено, сделано. Я разместил учебник по всем крупным файловым архивам. В итоге, через какое-то время посещаемость моего сайта заметно возросла, потому что посетители, прочитав оффлайн версию уникального учебника приходили на сайт в поисках других интересных и полезных материалов, а также советов автора.
Конечно, этот способ подойдет не всем. Но вы можете написать несколько интересных статей, и поместить их на крупные порталы, если статьи будут интересные, то читатель зайдет на ваш сайт, ведь в статье всегда указываются при публикации данные об авторе.
Я полагаю, это далеко не единственные нетрадиционные способы, стоит только приложить чуточку выдумки, и вы найдете хороший способ для рекламы своего сайта. В любом случае, это не должен быть способ навязывания: некоторые несознательные граждане захламляют чужие форумы и гостевые следующим образом - “Здрасте, я Вася Пупкин, мне ваш сайт нравится. Посетите мой сайт.” - это неправильное позиционирование вас и вашего ресурса, так вы только выставляете себя в дурном свете.
Шестой этап. Как не потерять вашего посетителя.
Чтобы посетитель возвращался к вам вновь и вновь, нужно периодически добавлять на сайт новую информацию. Кроме того, нужно постоянно поддерживать с посетителем общение: установите форум или гостевую книгу, где посетители смогут задавать вам вопросы. Старайтесь каждый день просматривать форум, гостевую книгу, почту, и отвечать на вопросы ваших посетителей.
Вы также можете устраивать опросы, чтобы узнать мнение своего посетителя, что ему нужно, это создаст у него впечатление, что он принимает участие в развитии вашего ресурса, ему будет это приятно. Вы можете устраивать конкурсы с небольшими призами. Вы можете сделать новостную рассылку + рассылку с частью новых материалов, которые появляются на сайте. И много чего еще.
Не забывайте, главное, это заинтересованность вашего посетителя в том, что вы ему предлагаете, он нужен вам, а вы должны попытаться стать нужными ему. Когда вы нужны посетителю, когда у него остаются хорошие и теплые впечатления о вашем сайте, он начинает рекомендовать вас друзьям, знакомым. Он начинает сам упоминать о вас на форумах и чатах, где он общается. Он добавляет на вас ссылку на своей странице, чтобы поделиться с другими таким хорошим ресурсом, как ваш. А это и есть лучшая реклама, а это и есть признание того, что ваш ресурс действительно замечательный.
Седьмой этап. Повторение этапов.
Каждый день в интернете появляется много разных и новых ресурсов. В том числе и каталоги, и поисковые системы, и новые сайты, близкие по тематике вашему. Ваша задача следить за новыми ресурсами, добавлять свой сайт в новые каталоги и поисковые системы. Если вы будете заниматься рекламой периодически, то у вас больше шансов сделать свой сайт посещаемым, и привлечь больше новых посетителей.