Жесткие диски (винчестеры), как электромеханические устройства, являются одним из самых ненадежных компонентов современного компьютера. Несмотря на то, что в большинстве случаев срок службы последних соизмерим, и даже превосходит время их эксплуатации до момента морального устаревания и замены более новыми моделями, все же отдельные экземпляры выходят из строя в течение первых месяцев эксплуатации. Выход жесткого диска из строя - самое худшее, что может случиться с вашим компьютером, так как при этом часто необратимо теряются накопленные на нем данные. Если резервная копия по какой-то причине отсутствует, то суммарный ущерб от поломки заметно превышает номинальную стоимость современных винчестеров.
Многие фирмы, пользуясь ситуацией, предлагают свои услуги по восстановлению информации с вышедшего из строя накопителя. Очевидно, это обходится недешево и целесообразно только тогда, когда на диске находилось что-то действительно ценное. В противном случае легче просто смириться с потерей.
Ремонт жестких дисков требует специального оборудования и практически невозможен в домашних условиях. Так, например, для вскрытия контейнера необходима особо чистая от пыли комната. Казалось бы, положение безнадежно и нечего даже помышлять о восстановлении поломанного диска в домашних условиях. Но, к счастью, не все поломки настолько серьезны, и во многих случаях можно обойтись для ремонта подручными (а иногда чисто программными) средствами.
Один из самых частых отказов винчестеров фирмы 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 скриптом подсчета просмотров страниц, можно по этой ссылке.
bluetooth - это технология, которая призвана заменить соединение сотового телефона, мобильного компьютера и других периферийных устройств между собой с помощью проводов, на более удобное соединение по радио каналу.
Немного истории.
Вообще-то, bluetooth дословно переводится как "Голубой зуб". Так прозвали когда-то короля викингов Харальда, жившего в Дании около тысячи лет назад. Прозвище это король получил за темный передний зуб.
Король Харальд вошел в историю как человек, объединивший Данию и принесший им христианство. Таким образом, именем исторической личности был назван протокол, который, по замыслу его создателей, так же должен творить историю.
Как все начиналось.
Где-то в начале 1998 года сразу несколько гигантов компьютерного и телекоммуникационного рынка, такие как ericsson, nokia, intel, ibm, toshiba, объединились с целью создания технологии беспроводного соединения между мобильными устройствами и периферийной техникой.
20 мая миру была представлена специальная рабочая группа (sig, special interest group), в задачу которой как раз и входило создать и запустить такую систему, получившую название bluetooth.
Очень быстро к Группе присоединились такие компании, как, например, motorola, dell, compaq, xircom и многие, многие другие.
Создаётся форум bluetooth, в который входит более 1300 компаний (Полный список участников группы bluetooth доступен по адресу http://www.bluetooth.com/).
Компания ericsson впервые создаёт аппарат, реально подтверждающий, что bluetooth работает, развивается и будет продолжать свое развитие.
Речь идет об уже упоминавшемся комплекте беспроводной связи с сотовым телефоном, состоящем из наушника и микрофона. Этот комплект способен работать на расстоянии до 10 метров от базы, которой, в данном случае, и является сотовый телефон со встроенной платой bluetooth.
Кстати, в скором времени компания собирается увеличить дальность работы комплекта в несколько раз:
При этом эти два аппарата могут не находиться в прямой видимости друг друга. Чтобы ответить на звонок, вам достаточно нажать на кнопку микрофона, а при наборе номера вам на помощь придет функция голосового вызова. Растущая словно снежный ком популярность bluetooth объясняется так же и его общедоступностью. Во-первых, использование частоты 2,44 ГГц. не требует лицензирования, да и распространение других лицензий на работу с bluetooth будет производиться за символическую плату. Во-вторых, помимо общедоступности, данная технология обещает стать и общепринятой, то есть стандартом де-факто, так как в ближайшее время мировое промышленное сообщество примет технологию как глобальный стандарт. Такое единство вызвано тем, что гораздо проще и дешевле снабжать все устройства одинаковым стандартным чипом, нежели разрабатывать компьютеры под разные интерфейс-карты.
Еще один аргумент за - это дешевизна сетевых адаптеров, которые будут встроены буквально во все - в средства связи, в бытовые приборы, в компьютеры, в другую оргтехнику.
Перспективы.
Они у bluetooth огромны. Эта технология, как ожидается, будет (и есть) совместима с очень многими протоколами и аналогичными системами. gsm, tcp, ip и так далее. Кроме того, есть надежды на относительно низкую стоимость, ведь технология уже изначально задумывалась как общедоступная. Пользователю будет гарантирована высокая степень защиты и отличное качество работы.
Согласно прогнозу компании international data corporation к 2004 в мире будет насчитываться 448.9 млн. устройств, поддерживающих этот стандарт. Одними из первых поддержат стандарт мобильные телефоны. Следом идут принтеры - они начнут поддержку bluetooth в 2001-2002 годах. А к 2004 году 19% всех цифровых камер будут поддерживать bluetooth.
Уже начались поставки инструментального набора от компании ericsson, для разработчиков приложений. И наконец, сегодня (точнее, совсем недавно) компания ericsson, один из главных "родителей" технологии, выпустила телефон, действительно работающий с технологией bluetooth. Это - ericsson t36. Данный сотовый телефон вообще можно назвать образцовым. В нем объединено все лучшее, чего достигла сотовая связь на сегодняшний день. Так, t36 является телефоном трехдиапазонным, у него есть wap-броузер, он поддерживает технологию high speed data, что дает возможность организовать более быстрое соединение, чем стандарт gsm, огромное количество функций, делающих его не просто телефоном, а полноценным помощником в бизнесе, и конечно, он поддерживает технологию bluetooth.
Так же компания выпустила аналогичный по своим возможностям Т36 телефон ericsson r520. Основное отличие - это, безусловно, дизайн - Т36 продолжает линейку таких телефонов, как Т10, Т18, Т28, а r520 можно с уверенностью назвать более совершенным вариантом r320. Трехдиапазонность Т36 позволяет ему работать практически в любой точке земного шара. Но, конечно, диапазон 1900 работает только в Америке.
Но не только ericsson выпускает bluetooth - компоненты. На том же cebit компания toshiba продемонстрировала устройство, использующее bluetooth и видеостандарт mpeg-4 для проведения видеоконференции - изображение с камеры передавалось на компьютер и затем на еще один компьютер.
А, например, компания anoto (http://www.anoto.com/) совместно со все той же компанией ericsson, разработала авторучку, позволяющую передавать сделанные ей записи по мобильной связи.
Конечно, писать придется не на простой бумаге, а на специальной, состоящей из множества точек, которые и различает находящаяся внутри ручки миниатюрная видеокамера.
nec заявила о своем намерении начать в середине этого года выпуск ноутбуков со встроенными чипами bluetooth. Новые модели будут иметь возможность выводить данные на принтеры и другие периферийные устройства, используя беспроводное соединение. Коммуникационный модуль bluetooth, используемый nec, построен на rf-чипе от national semiconductor corp.
ibm сообщила, что сейчас она ведет разработку bluetooth-модема для органайзеров типа palm, в том числе и для своего palm-совместимого карманного компьютера workpad. Как сообщается, эта модемная карта bluetooth pc card будет стоить не дороже 200 дол.
Следует отметить, что осенью этого года компании acer neweb и widcomm собираются выпустить свой bluetooth-модем, который должен составить конкуренцию модему от ibm. Это тоже будет карта стандарта bluetooth pc card, называться она будет bluecard, а стоить - около 100 дол.
На некоторых сайтах часто можно увидеть следующую надпись внизу страницы или под статьями: "Всего просмотров xxx. Сегодня xx". На первый взгляд ничего особенного, но все равно, многим интересно, как это сделано.
В этой статье я попробую рассказать вам о том, как устроена данная статистика просмотров страниц сайта, на самом простом примере, написанном на php. Статистика просмотров страниц будет работать на связке MySQL + PHP. Основным отличием этой статистики от других будет то, что MySQL таблица будет занимать очень мало места, но при этом нельзя будет точно сказать какую именно страницу и сколько раз просмотрели. А все из-за того, что все url будут хешированны с помощью php функции md5(), что гарантирует почти 100% неповторяющихся id для каждой страницы сайта. Делается это только для ускорения работы php скрипта (при условии, что индексом является id страницы) и уменьшения размеров MySQL таблицы (за счет отсутствия длинных url).
MySQL таблица будет иметь следующую структуру:
page_id – уникальный id для каждой страницы сайта сгенерированный php функцией md5().
all – значение всех просмотров данной страницы.
today – просмотров страницы сегодня.
date – дата возвращаемая php функцией time() + 24 часа
Для правильного учета посещений страниц значение поля date будет изменяться, тогда, когда текущая дата будет больше той, что указанна в таблице. В этот же момент будет происходить и обнуление счетчика просмотров страницы за прошедшие сутки.
Почти весь php скрипт статистики просмотров для каждой страницы сайта состоит в основном из функций, которые выполняют строго определенную роль. Все функции снабжены комментариями, поэтому, надеюсь, все поймете сами.
PHP код скрипта статистики просмотров страниц сайта:
Вот в принципе и весь php скрипт статистики просмотров страниц сайта. Для того, что бы он работал, его нужно "подключить" к нужному вам скрипту, например к index.php, добавив в index.php строчку include(' counter.php ');. А в том месте, где должно выводиться сообщение о том, сколько человек просмотрело данную страницу – строчку echo Today_and_all_counter;.
Скачать данный php скрипт статистики просмотров страниц сайта и MySQL файл со структурой таблицы можно здесь
Создавая свой php движок для нового сайта, я, как и всегда не захотел выполнять нудную работу сам и поэтому такое задание как подбор ключевых слов к каждой странице сайта доверил php скрипту, который написал меньше чем за полчаса.
Конечно, многие могут сказать, что поисковики не учитывают мета теги keywords и description, и вовсе незачем голову морочить проблемой подбора ключевых слов, но учитывают или нет, это известно только администраторам поисковых машин. В частности, я недавно проводил эксперимент, в котором участвовало три пары сайтов, на каждой паре сайтов был один и тот же контент, но на одном из сайтов каждой пары были прописаны keywords и description. И что вы думаете, через месяц, все три сайта с keywords и description были выше в выдаче Яндекса, чем их двойники без этих мета тегов. (Примечание: сайты были оптимизированы под абсолютно не конкурентные запросы и не имели бэклинков).
Принцип работы php скрипта, основной задачей которого является “на лету” подбирать к тексту ключевые слова (keywords), заключается в разделении всего текста на слова и занесение их в массив. Из исходного текста сначала удаляются все знаки препинания, затем слова помещаются в массив и каждому слову присваивается число его повторений в тексте. После заполнения массива слова упорядочиваются по количеству повторений, и в качестве результатов берется верхушка массива – 15-25 самых часто употребляемых слов.
А вот и сам исходный код этого php-скрипта для подбора ключевых слов:
Пользоваться данным php классом очень просто, создаете экземпляр класса функцией new а потом вызываете внутреннюю функцию get_keywords(), класса Counter. Вот наглядный пример использования этого класса:
В переменной $content должен содержатся основной текст страницы, для которой создаются ключевые слова. И еще, полученная строка содержит только ключевые слова, без мета тегов. Скачать данный php класс для подбора ключевых слов в zip архиве вы можете здесь.
Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. На практике это означает, что потоки исполняют код и манипулируют данными в адресном пространстве процесса. Если два или более потока выполняются внутри одного процесса, они делят одно адресное пространство.
Любой поток (thread) состоит из двух компонентов:
объекта ядра, через который ОС управляет потоком. Там же хранится статистическая информация о потоке.
Стека потока, который содержит параметры всех функций и локальные переменные, необходимые потоку для выполнения кода.
Потоки могут выполнять один и тот же код, манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах.
Потоки используют намного меньше ресурсов системы, чем процессы, поэтому все задачи, требующие параллельного выполнения нескольких подзадач, стоит решать по возможности с помощью потоков, не прибегая к созданию нескольких процессов.
Обычная структура многопоточного приложения рассчитана на одновременное исполнение нескольких подзадач. Однако стоит помнить, что, создавая многопоточное приложение, нам придется заботиться о сохранности и ликвидности, общих для всех потоков, данных.
Создание потока.
Первичный поток, который присутствует в программе, начинает свое выполнение с главной функции потока типа WinMain.
Для создания вторичного потока необходимо создать и для него входную функцию, которая выглядит примерно так:
Имя у функции вторичного потока, в отличии от первичного, может быть любым однако, при наличии нескольких разных потоков, назвать функции необходимо по-разному, иначе система создаст разные реализации одной и той же функции.
Когда поток закончит свое исполнение, он вернет управление системе, память, отведенная под его стек, будет освобождена, а счетчик пользователей его объекта ядра "поток" уменьшится на 1. Когда счетчик обнулится, этот объект ядра будет разрушен.
Для создания своего потока необходимо использовать функцию CreateThread:
При каждом вызове этой функции система создает объект ядра (поток). Это не сам поток, а компактная структура данных, которая используется операционной системой для управления потоком и хранит статистическую информацию о потоке.
Система выделяет память под стек потока из адресного пространства процесса. Новый поток выполняется в контексте того же процесса, что и родительский поток. Поэтому он получает доступ ко всем описателям объектов ядра, всей памяти и стекам всех потоков в процессе. За счет этого потоки в рамках одного процесса могут легко взаимодействовать друг с другом.
CreateThread - это Windows-функция, создающая поток. Если вы пишете код на С/С++ не вызывайте ее. Вместо нее Вы должны использовать _beginthreadex из библиотеки Visual C++. Почему это так важно в наших следующих выпусках.
Параметры функции CreateThread.
LpThreadAttributes - является указателем на структуру LPSECURITY_ATTRIBUTES. Для присвоения атрибутов защиты по умолчанию, передавайте в этом параметре NULL.
DwStackSize - параметр определяет размер стека, выделяемый для потока из общего адресного пространства процесса. При передаче 0 - размер устанавливается в значение по умолчанию.
LpStartAddress - указатель на адрес входной функции потока.
LpParameter - параметр, который будет передан внутрь функции потока.
DwCreationFlags - принимает одно из двух значений: 0 - исполнение начинается немедленно, или CREATE_SUSPENDED - исполнение приостанавливается до последующих указаний.
LpThreadId - Адрес переменной типа DWORD в который функция возвращает идентификатор, приписанный системой новому потоку.
Завершение потока
Поток можно завершит четырьмя способами:
функция потока возвращает управление (рекомендуемо);
поток самоуничтожается вызовом функции ExitThread;
другой поток процесса вызывает функцию TerminateThread;
завершается процесс, содержащий данный поток.
Все способы , за исключением рекомендуемого, являются нежелательными и должны использоваться только в форс-мажорных обстоятельствах.
Функция потока, возвращая управление, гарантирует корректную очистку всех ресурсов, принадлежащих данному потоку. При этом:
любые С++ объекты, созданные данным потоком, уничтожаются соответствующими деструкторами;
система корректно освобождает память, которую занимал стек потока;
система устанавливает код завершения данного потока. Его функция и возвращает;
счетчик пользователей данного объекта ядра (поток) уменьшается на 1.
При желании немедленно завершить поток изнутри используют функцию ExitThread(DWORD dwExitCode).
При этом освобождаются все ресурсы ОС, выделенные данному потоку, но С С++ ресурсы (например, объекты классов С++) не очищаются. Именно поэтому не рекомендовано завершать поток, используя эту функцию.
Если же вы ее использовали, то кодом возврата потока будет тот параметр, который вы передадите в данную функцию.
Как и для CreateThread для библиотеки Visual C++ существует ее аналог _endthreadex, который и стоит использовать. Об причинах в следующем выпуске.
Если появилась необходимость уничтожить поток снаружи, то это моет сделать функция TeminateThread.
Эта функция уменьшит счетчик пользователей объекта ядра (поток) на 1, однако при этом не разрушит и не очистит стек потока. Стек будет существовать, пока не завершится процесс, которому принадлежит поток. При задачах, постоянно создающих и уничтожающих потоки, это приводит к потере памяти внутри процесса.
При завершении процесса происходит следующее.
Завершение потока происходит принудительно. Деструкторы объектов не вызываются, и т.д. и т.д.
При завершении потока по такой причине, связанный с ним объект ядра (поток) не освобождается до тех пор, пока не будут закрыты все внешние ссылки на этот объект.
В этой статье будет рассмотрен скрипт, который создает анимацию в виде падающего снега. Анимация воспроизводится в заданной области 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 в нужную позицию.
Давайте определимся с номенклатурой. Поле - это ячейка в таблице. Запись - набор из полей. Так вот, существуют разные типы полей - обычные, индексные и ключевые. Обычные поля - просто данные. Индексное поле - поле, по которому данные сортируются. Ключевое - поле, значение которого уникально. В общем-то четкого разделения нет. Ведь программа базы данных может сортировать таблицу и по обычным полям, а индексное поле может быть также уникальным.
В BDE достаточно логично поределена структура построения полей и их типов. Для этого имеются классы TxxxDef (три икса здесь обозначают подстановку, а то мало ли что Вы подумаете ;)), произведенные ото абстрактного базового класса TNamedItem. В компоненте TTable имеются и соответствующие свойства
TIndexDefs
TFieldDefs
Как и следовало предполагать, эти свойства содержат в себе определения индексных и обычных полей. Здесь нет свойства типа TKeyDefs, потому что в таблицах типа Парадокс индексные поля могут быть сами по себе уникальны. За счет этих свойств и задаются параметры таблицы, ее сетка. Создание таблицы довершает метод CreateTable.
Теории было много, теперь практика. Вот пример, честно скажу, взятый их Хелпа и перекомментированный автором (то есть мной).
Это все еще объяснять и объяснять. Но, я надеюсь, общая логика понятна.
Такие типы данных, как int, float, char и long, являются неотъемлемой частью C/C++ и вам не нужно писать никакого кода, чтобы сообщить компилятору о том, что означают эти слова. C/C++ позволяет вам также объ-являть свои собственные, специальные типы данных. В следующем разделе вы узнаете, как объявлять структуры, которые можно отнести к специальным типам данных.
Как вы уже знаете, переменная в C/C++ объявляется следующим образом:
В приведенном операторе iMyVariable объявлена как целая переменная. А вот объявление переменной типа char:
Напишите следующий исходный код:
В коде, который вы написали, имеются два оператора #include:
Файл iostream.h включен в код, поскольку в main(void) используется cout. Файл string.h включается потому, что в main(void) используется функция strcpy() (объявленная в файле string.h). Затем вы объявляете структуру:
Обратите внимание на синтаксис объявления структуры. Оно начинается с ключевого слова struct, за которым следует имя типа-структуры. В этой программе типу структуры присвоено имя MYSTRUCTURE. Затем следует собственно определение структуры, заключенное в фигурные скобки. Не забудьте поставить точку с запятой после закрывающей фигурной скобки. Теперь посмотрите на код внутри фигурных скобок:
Это означает, что MYSTRUCTURE состоит из строки с именем sName и целого с именем iAge, sName и iAge называются элементами данных структуры; Вы объявили их "Внутри" cтруктуры MYSTRUCTURE. Код в main(void) объявляет переменную с именем MyStructure типа MYSTRUCTURE:
Вспомните, что в объявляли переменную iNum1 следующим образом:
Когда вы объявляете MyStructure , которая будет структурой типа MYSTRUCTURE, рассматривайте переменную MyStructure аналогично переменной iNum1. MyStructure - это имя переменной, а ее типом является MYSTRUCTURE точно так же, как типом переменной iNum1 является int. (Обратите внимание, что по традиции имя структуры составлено из символов нижнего регистра или в нем смешаны символы нижнего и верхнего регистров, как, например, в имени MyStructure, но в имени типа структуры используются только символы верхнего регистра, как, например, в MYSTRUCTURE.)
Следующий оператор в main(void) копирует строку 'Andy' в элемент данных MyStructure.sName:
В этом операторе обращение к элементу данных sName записано как MyStructure.sName Следующий оператор присваивает значение 13 элементу данных iAge cтруктуры MyStructure: MyStructure.iAge - 13; Затем выполняется ряд операторов вывода cout:
Сложив все вместе, мы видим, что программа MyStruct выводит сообщение My name is Andy and I am 13 years old. (Меня зовут Andy и мне 13 лет)
В состав библиотеки 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. Частой ошибкой является необдуманная покупка внешних ссылок с различных веб-сайтов. К данному вопросу стоит относиться очень серьёзно и покупать ссылки только у профессиональных компаний.