Данное руководство по С# - новому революционному языку, созданному компанией Microsoft для .NET-разработчиков, - написано Гербертом Шилдтом, автором ряда книг по программированию, получивших мировую известность. Здесь вы найдете полную информацию о взаимодействии С#-кода с системой .NET Framework, а также об основах языка, в том числе об операторах, типах данных, массивах, строках, классах, объектах, методах и пространствах имен. Подробно рассмотрены программирование ввода/вывода данных и обработка исключений и инновационные возможности языка С# - делегаты и индексаторы. Прочитав это компетентное руководство, вы без труда сможете заняться программированием на языке С#.
Формат PDF был разработан фирмой Adobe Systems, чтобы решить проблему единства отображения и обработки полиграфической продукции в различных информационных средах (его кроссплатформенность) и довольно успешно справляется с этой задачей и по сегодняшний день. Однако со временем у этого формата появилось и иное предназначение. Универсальность этого формата спровоцировала рост его популярности, а, следовательно, увеличилось и количество публикаций, доступных в этом формате в электронном виде в Интернете.
Изначально файлы формата PDF в сознании многих людей ассоциировались именно с качественным уникальным контентом, т. к. с его помощью часто публиковались и публикуются различные отчёты, доклады, статьи, руководства и другая полезная информация. Конечно, было бы глупо упускать такой источник полезной информации. Со временем все популярные поисковые системы научились индексировать файлы PDF и ранжировать их, что автоматически поставило их наравне с привычными для нас файлами в формате HTML (веб-страницами).
Нам же важно не упустить возможную выгоду и научиться правильно оптимизировать файлы подобного рода для поисковых систем, чтобы обеспечить их лучшую видимость в результатах поиска. Долгое время файлы PDF воспринимались исключительно как файлы-архивы, для открытия которых необходимо было их загружать на компьютер и читать в сторонней программе (Например, в Adobe Reader – программе для просмотра формата PDF). Так было раньше, сейчас же многое меняется: значительно увеличиваются скорости Интернета, появляются встроенные в браузер плагины для чтения формата PDF, позволяющие просматривать файлы сразу же в браузере. Например, уже сегодня в браузере Opera можно читать файлы PDF прямо на сайте онлайн. А это всё прямое свидетельство того, что популярность этого формата в обозримом будущем будет только расти. Это теперь не только универсальный формат для хранения и редактирования полиграфии, но также и способ передачи информации в Интернете (выполняющий функции обычной веб-страницы).
В этой статье я старался систематизировать информацию, осветив как можно больше фактов, влияющих на индексацию поисковыми системами документов этого формата в Интернете, а также ответив на самые распространённые вопросы, которые возникают у веб-мастеров, использующих эти файлы на своих сайтах.
Любой веб-мастер и seo-оптимизатор должен понимать, что файл PDF - это такая же страница сайта, как и файл в формате HTML. Как правило, на этот файл ссылаются так, что он является тупиковым для поисковой системы, т. к. в нём почти никогда не содержатся ссылки на другие страницы сайта, а зря. Каждый PDF-файл (как и страница HTML) находится в индексе поисковых систем, следовательно, имеет и свой поисковый вес, передаваемый по ссылкам (вИЦ или PR, если хотите). Я настоятельно рекомендую вам в любом файле PDF, выложенным на сайте, делать ссылки на обычные HTML-страницы сайта и на другие страницы PDF (можно даже продублировать навигацию основного сайта). В данном случае вы будете только в выигрышном положении, т. к. помимо передачи поискового веса по ссылке, посетитель, скачав файл PDF с вашего сайта и ознакомившись с информацией в нём, может к вам вернуться, щёлкнув по ссылке, ведущей на ваш сайт из скачанного документа. К тому же файл PDF редко редактируется, поэтому часто сохраняется в первоначальном виде, а также как файловый архив может стремительно распространяться через различные файловые хостинги, а это, опять же, новые пользователи для вашего сайта (тот редкий случай, когда поисковая оптимизация напрямую влияет на непоисковое продвижение).
ПРОГРАММЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ PDF
Для создания файлов PDF используйте программу Adobe Acrobat, т. к. она имеет целый арсенал средств, которые способны максимально качественно оптимизировать наши файлы. Несмотря на это, можно (но не рекомендуется) использовать и другие программы. Например, для создания файлов PDF вы можете использовать связку программ Adobe Pagemaker и Adobe InDesign или текстовые редакторы наподобие Word из пакета Microsoft Office или Write - из OpenOffice. Когда будете использовать текстовый редактор Word для создания документа формата PDF, то используйте теги H1, H2, H3 и другие подобные для оптимизации текста документа. Вы должны сделать полученный текст базирующимся на языке HTML, чтобы поисковые системы эффективно его индексировали.
Не используйте программы типа Photoshop и Illustrator, т. к. после обработки документа на выходе информация превращается в одно большое изображение, текст на котором не распознать поисковым системам. Однако часто случается и то, что у веб-мастера уже есть большое количество PDF-файлов, полученных от заказчика, или же специфика темы на сайте такая, что по ней есть информация в электронном виде только в этом формате. Если у вас именно такой случай, то не отчаивайтесь. Сейчас активно разрабатываются программы, способные распознавать текст на изображениях, что позволяет модифицировать текст на изображениях в обычный текст, который индексируется поисковыми системами. В России довольно успешно распознаванием текстов занимается компания ABYY. К примеру, вы можете воспользоваться их конвертером Abbyy PDF Transformer. Хочу сразу заметить, что это довольно уникальный продукт, аналогов которому почти нет. В его возможности входит конвертирование текста на картинках PDF в текст, способный индексироваться поисковыми системами.
Несколько слов, я думаю, можно сказать и про программы конвертеры. Если же вы решили, что по каким-то причинам формат PDF на сайте вас не очень устраивает, а контент вашего сайта состоит, в основном, из файлов PDF, то у вас есть возможность переконвертировать эти файлы в формат HTML, используя различные бесплатные и платные PDF конвертеры.
Вот небольшой список таких конвертеров:
* Advanced PDF to HTML
* Comfortable PDF to HTML
* Easy PDF to HTML
* Adobe Acrobat Pro Extended – это конвертер компании Adobe, но известно, что оптимизаторы испытывают сложности с этой программой.
Теперь, я думаю, самое время поделиться с вами секретами оптимизации файла PDF для поисковых систем.
ИЗОБРАЖЕНИЯ
Не используйте слишком много изображений или изображения большого размера. Картинки хоть и улучшают внешний вид, однако также увеличивается размер файла и время его загрузки. Как и на HTML-странице, если вы поставите много изображений (особенно неоптимизированных), то это потребует больше времени для их загрузки в браузер. Но помимо оптимизации размера изображений PDF-документа, необходимо также оптимизировать и подписи (альтернативный текст) к ним. У каждого изображения документа должна быть своя подпись, как к картинкам обычной HTML-страницы.
РАЗМЕР ФАЙЛА
Нужно всегда помнить, что поисковые системы не индексируют файлы, которые слишком много весят. Например, поисковая система "Яндекс" не будет индексировать файлы весом больше, чем 10 Мб, отсюда следует правило, что файл PDF не может быть больше 10 Мб.
Если говорить про оптимальный размер PDF-файла, то многие seo-оптимизаторы считают его величину в пределах 500 - 1000 Кб, т. к. с файлами именно таких размеров происходит меньше всего ошибок, связанных с индексацией файлов.
Для оптимизации размера в программе Adobe Acrobat есть специальная функция: Advanced > PDF Optimizer.
Внимание! При создании PDF-документа в любом редакторе обращайте внимание на версию получаемого файла. Рекомендуемая версия – 1.5 и ниже, т. к. такой файл гарантированно будет читаться всеми программами для просмотра PDF и роботами поисковых систем. Формат PDF позволяет оптимизировать также и копию документа, поэтому по возможности оптимизируйте и её.
ТЕКСТ ФАЙЛА
Старайтесь избегать большого количества текста в одном файле PDF, дробите один файл на несколько файлов, причём, линкуйте их ссылками внутри каждого такого документа (так, как бы вы это делали с обычными HTML-документами).
Оптимизируйте текст файла PDF под конкретные ключевые запросы, а здесь надо уделять внимание таким же показателям, как и на обычной веб-странице (плотность ключевых слов не выше 5% и прочим). Если вы хотите получить хорошо индексируемый и релевантный поисковым запросам контент PDF-документа, вы должны стараться избегать нагромождения страниц в нём. При внутренней оптимизации текста, а именно: заголовков и подзаголовков, ключевых слов и фраз, необходимых для вашего документа, - будьте очень осторожны, чтобы файл не выглядел заспамленным и не вылетел, в итоге, из индекса поисковых систем.
Если ваш файл PDF разбит на несколько частей, то настройте порядок отображения этих частей. От порядка чтения документа зависит то, какая информация будет предоставлена поисковому роботу сначала, а какая - потом. Помните, что наибольшую поисковую значимость имеют ключевые слова, находящиеся ближе к началу документа, поэтому если в документе обратное, то вам стоит перестроить логическую последовательность частей вашего PDF документа, чтобы выделить наиболее важные части и улучшить их поисковую видимость в Интернете.
Сделайте оглавление (поисковую карту документа), каждый пункт этого оглавления оформите ссылкой (закладкой) внутри PDF документа, для каждой ссылки пропишите ключевые слова в описании ссылки. Этот приём наиболее эффективен для документов, состоящих из нескольких логический частей и с большим количеством страниц – он обеспечивает качественную внутреннюю перелинковку документа, позволяющую эффективно индексировать документ поисковым роботам.
Если вы хотите создать справочник, руководство или другой документ, предполагающий большой объём информации в одном файле, то я рекомендую создавать подобные документы в формате DjVu. Страницы документов (контент) в этом формате не индексируются поисковыми системами. Но если по каким-то причинам у вас не получается уменьшить размер PDF-файлов и разбить их на несколько отдельных файлов, то можно воспользоваться очень удобной функцией в программе Adobe Reader - Optimize for Fast Web View, позволяющей просматривать уже загрузившиеся страницы документа, не дожидаясь его окончательной загрузки. Это удобно для тех пользователей, кто будет просматривать ваш PDF-файл непосредственно на вашем сайте в режиме онлайн.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ (МЕТАПОЛЯ)
Очень важно заполнить всю дополнительную информацию о вашем файле PDF. Уделите особое внимание таким тегам как: Title (заголовок), Author (автор материала), Subject (тема), Keywords (ключевые слова документа), Descriptions (описание PDF-документа) и Copyright (авторские права). Все эти настройки можно найти в программе Adobe Acrobat в меню File > Document Properties. Метаданные файла PDF имеют схожее происхождение с метатегами файлов HTML, так что уделяйте им особое внимание при оптимизации.
КОДИРОВКА, ШРИФТЫ И РАСПОЛОЖЕНИЕ ФАЙЛА
Несколько слов нужно сказать и про оптимизацию шрифтов. Не забывайте включать в сам файл все необходимые (нестандартные) шрифты. Довольно часто для декоративных целей используются самые разнообразные и редкие полиграфические шрифты, которые могут плохо восприниматься поисковыми системами, поэтому, по возможности, старайтесь пользоваться стандартными шрифтами (Arial, Helvetica, Sans-Serif, Times New Roman и другими), которые хорошо индексируются поисковыми системами. Их плюс в том, что они присутствуют по умолчанию в любой операционной системе, поэтому из документа PDF их можно спокойно исключить, уменьшив тем самым размер файла.
Шрифты, которые не были добавлены в PDF-документ или отсутствуют в операционной системе, будут отображаться тем шрифтом, который имеется (самым близким по значению), что может привести к нежелательным последствиям, а именно к увеличению или уменьшению числа страниц, количества символов в строках, межстрочного интервала и других проблем метрики.
Довольно болезненный параметр для поисковых систем - кодировка файла. Если поисковая система не сумеет определить кодировку вашего PDF файла самостоятельно, то документ вообще не будет проиндексирован, поэтому всегда проверяйте, указана ли она. Желательно использовать самые известные и популярные кодировки.
Ваш файл PDF, как и обычная страница файла, должен быть максимально близок к корню сайта. Ссылайтесь на них ближе к главной странице, не пытайтесь засунуть его глубоко в структуру сайта, чтобы не понизить поисковую значимость вашего PDF документа.
Не давайте вашим документам в формате PDF слишком сложные имена. Упрощайте их. Несколько слов в названии самого файла разделяйте символом "_". Например: imya_documenta.pdf. Также для разделителя можно использовать и символ "-", но я рекомендую использовать первый вариант.
После всех проделанных операций по оптимизации можете выкладывать файл на сайт. Поисковые системы найдут файл, проиндексируют его и начнут выводить в результатах поиска, и если материал интересен, начнётся самораскрутка его среди посетителей - на файл начнут ссылаться, скачивать и публиковать его в других местах (а сам файл будет с ссылками на ваш сайт). Неплохо, не правда ли?
Напоследок, предоставлю вам пару ссылок, которые могут быть полезны в связи с опубликованным материалом:
http://ru.wikipedia.org/wiki/PDF - общая информация о файле PDF
http://get.adobe.com/reader/ - последняя версия Adobe Reader
http://www.adobe.com/products/acrobat/ - последняя версия Adobe Acrobat
http://www.abbyy.ru/pdftransformer/ - последняя версия Abbyy PDF Transformer
http://www.taurion.ru/acrobat - самоучитель работы в программе Adobe Acrobat
В этом обзоре я постарался ответить на наиболее распространённые вопросы по оптимизации файла PDF, которые задают люди, занимающиеся раскруткой сайтов. Но если у вас появились вопросы или что-то осталось непонятным, то, пожалуйста, сообщайте об этом! Буду рад любым отзывам от вас! Спасибо!
Поиск по шаблону является настолько обычным занятием в разработке программного обеспечения, что для облегчения этой задачи была создана специальная технология — регулярные выражения. Узнайте, как можно использовать ее при написании кода, прочитав эту статью.
Все устройства получают входную информацию, выполняют какие-либо операции и выдают результат. Например, телефон во время разговора преобразует звуковую энергию в электрический сигнал и обратно. Двигатель потребляет топливо (пар, расщепление атомных ядер, бензин, мышечные усилия) и преобразует его в энергию. Блендер поглощает ром, лед, лайм и кюрасао и взбалтывает их в коктейль Mai Tai. (Или, если вам хочется чего-то изысканного, сделайте Bellini из шампанского и грушевого сока. Блендер – замечательное универсальное устройство.)
Так как программное обеспечение преобразует данные, то каждое приложение фактически является устройством (хоть и виртуальным, так как у него нет физических составляющих). Например, компилятор в качестве входной информации получает исходную программу и преобразует ее в двоичный исполняемый код. Программа прогнозирования погоды генерирует предсказания на основе результатов прошлых (исторических) замеров, а графический редактор обрабатывает пикселы, применяя правила к отдельным пикселам или их группам, чтобы, например, сделать изображение более четким или изменить его стиль.
Так же, как и любое другое устройство, программное обеспечение предназначено для работы с определенным исходным материалом, например, набором чисел, данными XML-схемы или протоколом. Если программе задать некорректную входную информацию — неподходящую по форме или типу, то существует большая вероятность того, что результат будет непредсказуемым и, возможно, даже катастрофическим. Как говорится: "Мусор заложишь - мусор получишь".
На самом деле для решения всех нетривиальных задач необходимо отделять правильные данные от некорректных и отклонять некорректные данные во избежание ошибок в результатах. Это, конечно же, актуально и для Web-приложений, написанных на языке PHP. Неважно, получены ли входные данные из формы для ввода с клавиатуры или в результате выполнения программного запроса Asynchronous JavaScript + XML (Ajax), прежде чем начать какие-либо вычисления, программа должна проверить входную информацию. Возможно, что числовые значения должны находиться в пределах определенного диапазона чисел или представлять собой только целые числа. Возможно, значение должно соответствовать определенному формату, например, почтового индекса. Например, почтовый индекс в США представляет собой пять цифр плюс дополнительный префикс "Plus 4", состоящий из дефиса и 4 дополнительных цифр. Возможно, другие строки также должны состоять из определенного количества символов, например, две буквы для указания аббревиатуры штата США. Строковые данные доставляют особенно много проблем: PHP-приложение должно быть начеку по отношению к злонамеренным программам-агентам, вложенным в SQL-запросы, код JavaScript или любой другой код, которые способны изменить поведение приложения или обойти защиту.
Однако каким образом программа может определить, являются ли входные данные числом или соответствуют ли определенным требованиям, например, к почтовому индексу? На самом деле для реализации проверки путем сопоставления с шаблоном необходим небольшой парсер, создающий конечный автомат, считывающий входные данные, обрабатывающий маркеры, отслеживающий состояние и выдающий результаты. Однако создание и обслуживание даже самого простого парсера может оказаться непростым делом.
К счастью, анализ на основе сопоставления с шаблоном настолько широко распространен в компьютерных технологиях, что с течением времени (примерно с момента появления UNIX®) были разработаны специальные технологии и, конечно же, механизмы обработки, чтобы облегчить рутинную работу. Регулярное выражение (regex) описывает шаблоны посредством лаконичных и удобочитаемых обозначений. Получив регулярное выражение и данные, механизм regex сообщает, совпадают ли эти данные с шаблоном, и если совпадение было обнаружено, что именно совпало.
Вот небольшой пример использования регулярного выражения, взятый из UNIX-утилиты, работающей в режиме командной строки, которая ищет заданный шаблон в содержимом одного или нескольких текстовых файлов UNIX. Команда grep -i -E '^Bat' ищет последовательность символов beginning-of-line (начало строки), обозначаемое "крышкой", [^]), за которым следуют буквы b, a, и t верхнего или нижнего регистра (ключ -i указывает на то, что при сопоставлении с шаблоном регистр не учитывается, таким образом, например, B и b - тождественны). Следовательно, для файла heroes.txt:
Листинг 1. heroes.txt
Вышеупомянутая команда grep выдаст два совпадения:
Batman
Batgirl
Регулярные выражения
PHP предлагает два программных интерфейса регулярных выражений: один -- для интерфейса переносимых операционных систем (POSIX), а второй - для регулярных выражений, совместимых с языком Perl (PCRE). В общем и целом второй интерфейс является более предпочтительным, так как PCRE сам по себе мощнее, чем POSIX, и предоставляет все операторы, используемые в языке Perl. Более подробная информация по обращению к regex-функциям POSIX представлена в документации по языку PHP (см. раздел Ресурсы). В данной статье мы сосредоточим свое внимание на свойствах PCRE.
Регулярные выражения PHP PCRE содержат операторы, позволяющие путем сопоставления находить конкретные символы или другие операторы, определенные местоположения, например, начало и конец строки, начало или конец слова. Регулярные выражения также позволяют описывать альтернативы, которые можно задать альтернативы типа "или"-"или"; повторения фиксированной, изменяемой или неопределенной длины; наборы символов (например, "любая буква от a до m"); и классы, или типы символов (печатаемые символы, знаки препинания). Специальные операторы также разрешают использовать группировку — возможность применить оператор к целой группе других операторов.
В таблице 1 показаны некоторые типичные операторы регулярных выражений. Для создания сложных выражений можно последовательно объединять элементарные операторы из таблицы 1 (и другие).
Таблица 1. Типичные операторы регулярных выражений
Оператор Значение
. (точка) Любой одиночный символ
^ (крышка) Пустая последовательность в начале строки или цепочки
$ (знак доллара) Пустая последовательность в конце строки
A Буква A верхнего регистра
a Буква a нижнего регистра
\d Любая цифра
\D Любой нецифровой символ
\w Любая буква или цифра; синоним - [:alnum:]
[A-E] Любая заглавная буква из A, B, C, D или E
[^A-E] Любой символ, за исключением заглавных букв A, B, C, D или E
X? Найти совпадение по отсутствию или наличию одной заглавной буквы X
X* Ни одной или любое количество заглавных букв X
X+ Одна или несколько заглавных букв X
X{n} Ровно n заглавных букв X
X{n,m} Не менее n и не более m заглавных букв X; если опустить m, то выражение будет искать не менее n заглавных букв X
(abc|def)+ По меньшей мере одно вхождение последовательности abc и def
В следующем примере показано типичное использование регулярного выражения. Например, для web-сайта необходимо, чтобы каждый пользователь регистрировался. Имя пользователя должно начинаться с буквы и содержать от 3 до 10 буквенно-цифровых символов. Для проверки имени пользователя на соответствие ограничениям при отправке данных в приложение можно использовать следующее регулярное выражение: ^[A-Za-z][A-Za-z0-9_]{2,9}$.
Знак "крышка" соответствует началу строки. Первый набор [A-Za-z] соответствует любой букве. Второй набор [A-Za-z0-9_]{2,9} соответствует последовательности, содержащей от 2 до 9 букв, цифр или символов подчеркивания. Знак доллара ($) соответствует концу строки.
На первый взгляд, знак доллара может показаться лишним, однако его использование важно. Если его пропустить, то условиям данного регулярного выражения будет отвечать любая строка, которая начинается с буквы, содержит от 2 до 9 буквенно-цифровых символов и любое количество других символов. Иными словами, если бы не было знака доллара как привязки к концу строки, то подошла бы недопустимо длинная строка с подходящим началом, например, "martin1234-cruft" .
Программирование на языке PHP и регулярные выражения
В PHP есть функции для поиска совпадений в тексте, замены каждого совпадения на другой текст (похоже на операцию "найти и заменить") и поиска совпадений среди элементов списка. Вот эти функции:
Чтобы показать, как работают эти функции, давайте создадим небольшое PHP-приложение, которое будет просматривать список слов на соответствие определенному шаблону. Слова и регулярные выражения будут вводиться из обычной web-формы, а результаты отображаться в браузере посредством функции simple print_r(). Эта программка пригодится, если возникнет желание проверить или отладить регулярное выражение.
PHP-код показан в листинге 2. Все входные данные берутся из обычной HTML-формы. (Для краткости эту форму и PHP-код, отслеживающий ошибки, опустим.)
Листинг 2. Сравнение текста с шаблоном
Вначале с помощью функции preg_split() строка из слов, разделенных запятыми, преобразуется в отдельные элементы. Данная функция разбивает строку в тех местах, которые соответствуют условиям регулярного выражения. В данном случае регулярное выражение представляет собой просто "," , (запятая - разделитель списка слов, указанных через запятую). Слэш в начале и в конце просто показывает начало и конец regex.
Третий и четвертый аргументы функции preg_split() необязательны, но полезны. Добавьте в третий аргумент число n целого типа, если необходимо вернуть только первые n совпадений, или -1, если необходимо вернуть все совпадения. Если в качестве четвертого аргумента задать идентификатор PREG_SPLIT_NO_EMPTY, то функция preg_split() не будет возвращать пустые результаты.
Затем каждый элемент списка слов, разделенных запятыми, корректируется (убираются начальные и конечные пробелы) с помощью функции trim() и сравнивается с заданным регулярным выражением. Функция preg_grep() существенно упрощает процесс обработки списка: просто укажите в качестве первого аргумента шаблон, а в качестве второго - массив слов для сравнения. Функция возвращает массив совпадений.
Например, если в качестве шаблона задать регулярное выражение ^[A-Za-z][A-Za-z0-9_]{2,9}$ и список слов разной длины, то можно получить результат, показанный в листинге 3.
Листинг 3. Результат работы простого регулярного выражения
Кстати, с помощью дополнительного маркера PREG_GREP_INVERT можно инвертировать операцию preg_grep() и найти элементы, которые не совпадают с шаблоном (аналогично оператору grep -v в командной строке). Заменяя 22 строку на $matches = preg_grep( "/${_REQUEST[ 'regex' ]}/", $words, PREG_GREP_INVERT ) и используя входные данные из листинга 3, мы получим Array ( [1] => 1happy [2] => hermanmunster ).
Разбор строк
Функции preg_split() и preg_grep() очень удобны. Первая из них может разбирать строку на подстроки, если подстроки разделяются определенным шаблоном. Функция preg_grep() позволяет быстро отфильтровать список.
Но что произойдет, если строку нужно разобрать на составные части, используя одно или несколько сложных правил? Например, в США номера телефонов обычно выглядят следующим образом: "(305) 555-1212," "305-555-1212," или "305.555.1212." Если убрать пунктуацию, то количество символов сократится до 10 цифр, что легко можно определить с помощью регулярного выражения \d{10}. Однако код и префикс (каждый из которых состоит из трех цифр) телефонного номера США не могут начинаться с нуля или единицы (так как нуль и единица используются как префиксы для междугородных звонков). Вместо того чтобы разбивать числовую последовательность на отдельные цифры и создавать сложный код, для верификации можно использовать регулярное выражение.
Фрагмент кода позволяющий решить эту задачу, показан в листинге 4.
Листинг 4. Проверка американского телефонного номера
Давайте пройдем по этому коду:
* Как показано в таблице 1, в регулярных выражениях используется ограниченный набор специальных символов, например, квадратные скобки ([ ]) для наименования последовательности. Если надо найти такой символ в тексте, необходимо "выделить" специальный символ в регулярном выражении, поставив перед ним обратный слэш (\). Когда символ выделен, можно задать его посик, как и любого другого символа. Если нужно найти символ точки, например, в полном составном имени хоста, то напишите \.. При желании строку можно подать в функцию preg_quote() которая выполняет автоматическую изоляцию всех специальных символов регулярных выражений, как показано в строке 1. Если поставить echo() $punctuation после первой строки, то вы должны увидеть \(\)\.-.
* В строке 2 из телефонного номера убираются все знаки пунктуации. Функция preg_replace() заменяет все символы из $punctuation — операторы из набора [ ] - пустой строкой, эффективно устраняя такие символы. Возвращаемая новая строка присваивается переменной $number.
* В строке 4 определен шаблон верифицируемого телефонного номера США.
* Строка 5 реализует сопоставление, сравнивая телефонный номер, который теперь состоит только из цифр, с шаблоном. Функция preg_match() возвращает 1, если есть совпадение. Если совпадения нет, функция preg_match() возвращает нулевое значение. Если во время обработки возникла ошибка, то функция возвращает значение False (ложно). Таким образом, чтобы проверить удачное завершение, необходимо посмотреть, было ли возвращено значение 1. В противном случае проверьте итоговое значение функции preg_last_error() (если используется PHP версии 5.2.0 или выше). Если оно не равно нулю, то, возможно, был превышен лимит вычислений, например, разрешенная глубина рекурсии регулярного выражения. Обсуждение констант и ограничений, применяемых в регулярных выражениях PHP, представлено на странице, посвященной функциям регулярных выражений PCRE (см. раздел Ресурсы).
Извлечение данных
Во многих случаях необходимо только получить ответ на вопрос: "Соответствуют ли данные шаблону?" – например, при проверке данных. Однако чаще регулярные выражения используются для подтверждения соответствия и получения информации о совпадении.
Вернемся к примеру с телефонным номером. Пусть при соответствии шаблону нам необходимо сохранить код, префикс и номер линии в отдельных полях базы данных. Регулярные выражения могут запоминать совпадающие с шаблоном данные с помощью оператора capture. Оператор capture обозначается круглыми скобками и может использоваться в любой части регулярного выражения. Операции capture можно делать вложенными для поиска подсегментов в извлеченных сегментах данных. Например, чтобы из 10-значного номера телефона извлечь код города, префикс и номер линии, можно использовать следующую строку:
/([2-9][0-9]{2})([2-9][0-9]{2})([0-9]{4})/
Если входные данные соответствуют шаблону, первые три цифры захватываются первой парой круглых скобок, следующие три цифры - второй парой, а последние 4 цифры - последним оператором. Модификация вызова функции preg_match() возвращает извлеченные данные.
Листинг 5. Возврат извлеченных данных функцией preg_match()
Если в качестве третьего аргумента функции preg_match() указать переменную, например, в нашем коде, $matches, то в качестве ее значения будет выступать список извлеченных результатов. Нулевой элемент списка (с индексом 0) - это все совпадение целиком; первый элемент - совпадение, относящееся к первой паре круглых скобок, и так далее.
Вложенные операторы capture извлекают сегменты и подсегменты фактически любой глубины. Сложность с вложенными операторами capture состоит в том, чтобы определить, в какой части массива соответствий находится каждое соответствие, например, $matches. Действует следующее правило: подсчитайте порядковый номер открывающей скобки в регулярном выражении — этот номер и будет индексом нужного совпадения в массиве соответствий.
В листинге 6 показан пример (немного надуманный) извлечения частей городского адреса.
Листинг 6. Код для извлечения городского адреса
Опять все совпадение целиком хранится по индексу 0. А где хранится номер улицы? Если считать слева направо, номер улицы проверяется \d+. Это вторая открывающая круглая скобка слева, следовательно, значением $matches[2] будет 123. В $matches[4] оказывается название города, а в $matches[6] - почтовый индекс.
Продвинутые технологии
Обработка текста – широко распространенная задача, и PHP предоставляет ряд функций, упрощающих выполнение большого числа операций. Обратите внимание на следующее:
* Функция preg_replace() может работать как с одной строкой, так и с массивом строк. Если вызвать preg_replace() для массива строк, замена будет выполнена во всех элементах массива. В этом случае код preg_replace() возвращает массив измененных строк.
* Как и во всех остальных реализациях PCRE, здесь для осуществления замены можно прибегать к сравнению с вложенным шаблоном. Для наглядности давайте рассмотрим проблему стандартизации формата телефонного номера. Заменим все знаки пунктуации точками. Наше решение показано в листинге 7.
Листинг 7. Замена знаков пунктуации точками
Сопоставление с шаблоном и, в случае совпадения, перевод в стандартный телефонный номер выполняется за один шаг.
Компоненты Delphi для работы с базами данных были созданы в расчете на работу с SQL и архитектурой клиент/сервер. При работе с ними вы можете воспользоваться характеристиками расширенной поддержки удаленных серверов. Delphi осуществляет эту поддержку двумя способами.
1. Введение
Во-первых, непосредственные команды из Delphi позволяют разработчику управлять таблицами, устанавливать пределы, удалять, вставлять и редактировать существующие записи.
Второй способ заключается в использовании запросов на языке SQL, где строка запроса передается на сервер для ее разбора, оптимизации, выполнения и передачи обратно результатов.
Данный документ делает акцент на втором методе доступа к базам данных, на основе запросов SQL (pass-through). Авторы не стремились создать курсы по изучению синтаксиса языка SQL и его применения, они ставили перед собой цель дать несколько примеров использования компонентов TQuery и TStoredProc. Но чтобы сделать это, необходимо понимать концепцию SQL и знать как работают selects, inserts, updates, views, joins и хранимые процедуры (stored procedures). Документ также вскользь касается вопросов управления транзакциями и соединения с базой данных, но не акцентирует на этом внимание. Итак, приступая к теме, создайте простой запрос типа SELECT и отобразите результаты.
2. Компонент TQuery
Если в ваших приложениях вы собираетесь использовать SQL, то вам непременно придется познакомиться с компонентом TQuery. Компоненты TQuery и TTable наследуются от TDataset. TDataset обеспечивает необходимую функциональность для получения доступа к базам данных. Как таковые, компоненты TQuery и TTable имеют много общих признаков. Для подготовки данных для показа в визуальных компонентах используется все тот же TDatasource. Также, для определения к какому серверу и базе данных необходимо получить доступ, необходимо задать имя псевдонима. Это должно выполняться установкой свойства aliasName объекта TQuery.
Свойство SQL
Все же TQuery имеет некоторую уникальную функциональность. Например, у TQuery имеется свойство с именем SQL. Свойство SQL используется для хранения SQL-запроса. Ниже приведены основные шаги для составления запроса, где все служащие имеют зарплату свыше $50,000.
Создайте объект TQuery
Задайте псевдоним свойству DatabaseName. (Данный пример использует псевдоним IBLOCAL, связанный с демонстрационной базой данных employee.gdb).
Выберите свойство SQL и щелкните на кнопке с текстом - '...' (три точки, Инспектор Объектов - В.О.). Должен появиться диалог редактора списка строк (String List Editor).
Введите:
. Нажмите OK.
Выберите в Инспекторе Объектов свойство Active и установите его в TRUE.
Разместите на форме объект TDatasource.
Установите свойство Dataset у TDatasource в Query1.
Разместите на форме TDBGrid.
Установите его свойство Datasource в Datasource1.
Свойство SQL имеет тип TStrings. Объект TStrings представляет собой список строк, и чем-то похож на массив. Тип данных TStrings имеет в своем арсенале команды добавления строк, их загрузки из текстового файла и обмена данными с другим объектом TStrings. Другой компонент, использующий TStrings - TMemo. В демонстрационном проекте ENTRSQL.DPR (по идее, он должен находится на отдельной дискетте, но к "Советам по Delphi" она не прилагается - В.О.), пользователь должен ввести SQL-запрос и нажать кнопку "Do It" ("сделать это"). Результаты запроса отображаются в табличной сетке. В Листинге 1 полностью приведен код обработчика кнопки "Do It".
Листинг 1
Свойство Params
Этого должно быть достаточно для пользователя, знающего SQL. Тем не менее, большинство пользователей не знает этого языка. Итак, ваша работа как разработчика заключается в предоставлении интерфейса и создании SQL-запроса. В Delphi, для создания SQL-запроса на лету можно использовать динамические запросы. Динамические запросы допускают использование параметров. Для определения параметра в запросе используется двоеточие (:), за которым следует имя параметра. Ниже приведе пример SQL-запроса с использованием динамического параметра:
Если вам нужно протестировать, или установить для параметра значение по умолчанию, выберите свойство Params объекта Query1. Щелкните на кнопке '...'. Должен появиться диалог настройки параметров. Выберите параметр Dept_no. Затем в выпадающем списке типов данных выберите Integer. Для того, чтобы задать значение по умолчанию, введите нужное значение в поле редактирования "Value".
Для изменения SQL-запроса во время выполнения приложения, параметры необходимо связать (bind). Параметры могут изменяться, запрос выполняться повторно, а данные обновляться. Для непосредственного редактирования значения параметра используется свойство Params или метод ParamByName. Свойство Params представляет из себя массив TParams. Поэтому для получения доступа к параметру, необходимо указать его индекс. Для примера,
Query1.params[0].asInteger := 900;
Свойство asInteger читает данные как тип Integer (название говорит само за себя). Это не обязательно должно указывать но то, что поле имеет тип Integer. Например, если тип поля VARCHAR(10), Delphi осуществит преобразование данных. Так, приведенный выше пример мог бы быть записан таким образом:
Query1.params[0].asString := '900';
или так:
Query1.params[0].asString := edit1.text;
Если вместо номера индекса вы хотели бы использовать имя параметра, то воспользуйтесь методом ParamByName. Данный метод возвращает объект TParam с заданным именем. Например:
Query1.ParamByName('DEPT_NO').asInteger := 900;
В листинге 2 приведен полный код примера.
Листинг 2
Обратите внимание на процедуру, первым делом подготовливающую запрос. При вызове метода prepare, Delphi посылает SQL запрос на удаленный сервер. Сервер выполняет грамматический разбор и оптимизацию запроса. Преимущество такой подготовки запроса состоит в его предварительном разборе и оптимизации. Альтернативой здесь может служить подготовка сервером запроса при каждом его выполнении. Как только запрос подготовлен, подставляются необходимые новые параметры, и запрос выполняется.
[pagebreak]
Источник данных
В предыдущем примере пользователь мог ввести номер отдела, и после выполнения запроса отображался список сотрудников этого отдела. А как насчет использования таблицы DEPARTMENT, позволяющей пользователю легко перемещаться между пользователями и отделами?
Примечание: Следующий пример использует TTable с именем Table1. Для Table1 имя базы данных IBLOCAL, имя таблицы - DEPARTMENT. DataSource2 TDatasource связан с Table1. Таблица также активна и отображает записи в TDBGrid.
Способ подключения TQuery к TTable - через TDatasource. Есть два основных способа сделать это. Во-первых, разместить код в обработчике события TDatasource OnDataChange. Например, листинг 3 демонстрирует эту технику.
Листинг 3 - Использования события OnDataChange для просмотра дочерних записей
Техника с использованием OnDataChange очень гибка, но есть еще легче способ подключения Query к таблице. Компонент TQuery имеет свойство Datasource. Определяя TDatasource для свойства Datasource, объект TQuery сравнивает имена параметров в SQL-запросе с именами полей в TDatasource. В случае общих имен, такие параметры заполняются автоматически. Это позволяет разработчику избежать написание кода, приведенного в листинге 3 (*** приведен выше ***).
Фактически, техника использования Datasource не требует никакого дополнительного кодирования. Для поключения запроса к таблице DEPT_NO выполните действия, приведенные в листинге 4.
Листинг 4 - Связывание TQuery c TTable через свойство Datasource
Выберите у Query1 свойство SQL и введите:
Выберите свойство Datasource и назначьте источник данных, связанный с Table1 (Datasource2 в нашем примере)
Выберите свойство Active и установите его в True
Это все, если вы хотите создать такой тип отношений. Тем не менее, существуют некоторые ограничения на параметризованные запросы. Параметры ограничены значениями. К примеру, вы не можете использовать параметр с именем Column или Table. Для создания запроса, динамически изменяемого имя таблицы, вы могли бы использовать технику конкатенации строки. Другая техника заключается в использовании команды Format.
Команда Format
Команда Format заменяет параметры форматирования (%s, %d, %n и пр.) передаваемыми значениями. Например,
Format('Select * from %s', ['EMPLOYEE'])
Результатом вышеприведенной команды будет 'Select * from EMPLOYEE'. Функция буквально делает замену параметров форматирования значениями массива. При использовании нескольких параметров форматирования, замена происходит слева направо. Например,
Результатом команды форматирования будет 'Select * from EMPLOYEE where EMP_ID=3'. Такая функциональность обеспечивает чрезвычайную гибкость при динамическом выполнении запроса. Пример, приведенный ниже в листинге 5, позволяет вывести в результатах поле salary. Для поля salary пользователь может задавать критерии.
Листинг 5 - Использование команды Format для создания SQL-запроса
В этом примере мы используем методы Clear и Add свойства SQL. Поскольку "подготовленный" запрос использует ресурсы сервера, и нет никакой гарантии что новый запрос будет использовать те же таблицы и столбцы, Delphi, при каждом изменении свойства SQL, осуществляет операцию, обратную "подготовке" (unprepare). Если TQuery не был подготовлен (т.е. свойство Prepared установлено в False), Delphi автоматически подготавливает его при каждом выполнении. Поэтому в нашем случае, даже если бы был вызван метод Prepare, приложению от этого не будет никакой пользы.
Open против ExecSQL
В предыдущих примерах TQuerie выполняли Select-запросы. Delphi рассматривает результаты Select-запроса как набор данных, типа таблицы. Это просто один класс допустимых SQL-запросов. К примеру, команда Update обновляет содержимое записи, но не возвращает записи или какого-либо значения. Если вы хотите использовать запрос, не возвращающий набор данных, используйте ExecSQL вместо Open. ExecSQL передает запрос для выполнения на сервер. В общем случае, если вы ожидаете, что получите от запроса данные, то используйте Open. В противном случае допускается использование ExecSQL, хотя его использование с Select не будет конструктивным. Листинг 6 содержит код, поясняющий сказанное на примере.
Листинг 6
Все приведенные выше примеры предполагают использования в ваших приложениях запросов. Они могут дать солидное основание для того, чтобы начать использовать в ваших приложениях TQuery. Но все же нельзя прогнозировать конец использования SQL в ваших приложених. Типичные серверы могут предложить вам другие характеристики, типа хранимых процедур и транзакций. В следующих двух секциях приведен краткий обзор этих средств.
[pagebreak]
3. Компонент TStoredProc
Хранимая процедура представляет собой список команд (SQL или определенного сервера), хранимых и выполняемых на стороне сервера. Хранимые процедуры не имеют концептуальных различий с другими типами процедур. TStoredProc наследуется от TDataset, поэтому он имеет много общих характеристик с TTable и TQuery. Особенно заметно сходство с TQuery. Поскольку хранимые процедуры не требуют возврата значений, те же правила действуют и для методов ExecProc и Open. Каждый сервер реализует работу хранимых процедур с небольшими различиями. Например, если в качестве сервера вы используете Interbase, хранимые процедуры выполняются в виде Select-запросов. Например, чтобы посмотреть на результаты хранимой процедуры, ORG_CHART, в демонстрационной базе данных EMPLOYEE, используйте следующих SQL-запрос:
При работе с другими серверами, например, Sybase, вы можете использовать компонент TStoredProc. Данный компонент имеет свойства для имен базы данных и хранимой процедуры. Если процедура требует на входе каких-то параметров, используйте для их ввода свойство Params.
4. TDatabase
Компонент TDatabase обеспечивает функциональность, которой не хватает TQuery и TStoredProc. В частности, TDatabase позволяет создавать локальные псевдонимы BDE, так что приложению не потребуются псевдонимы, содержащиеся в конфигурационном файле BDE. Этим локальным псевдонимом в приложении могут воспользоваться все имеющиеся TTable, TQuery и TStoredProc. TDatabase также позволяет разработчику настраивать процесс подключения, подавляя диалог ввода имени и пароля пользователя, или заполняя необходимые параметры. И, наконец, самое главное, TDatabase может обеспечивать единственную связь с базой данных, суммируя все операции с базой данных через один компонент. Это позволяет элементам управления для работы с БД иметь возможность управления транзакциями.
Транзакцией можно считать передачу пакета информации. Классическим примером транзакции является передача денег на счет банка. Транзакция должна состоять из операции внесения суммы на новый счет и удаления той же суммы с текущего счета. Если один из этих шагов по какой-то причине был невыполнен, транзакция также считается невыполненной. В случае такой ошибки, SQL сервер позволяет выполнить команду отката (rollback), без внесения изменений в базу данных. Управление транзакциями зависит от компонента TDatabase. Поскольку транзакция обычно состоит из нескольких запросов, вы должны отметить начало транзакции и ее конец. Для выделения начала транзакции используйте TDatabase.BeginTransaction. Как только транзакция начнет выполняться, все выполняемые команды до вызова TDatabase.Commit или TDatabase.Rollback переводятся во временный режим. При вызове Commit все измененные данные передаются на сервер. При вызове Rollback все изменения теряют силу. Ниже в листинге 7 приведен пример, где используется таблица с именем ACCOUNTS. Показанная процедура пытается передать сумму с одного счета на другой.
Листинг 7
И последнее, что нужно учесть при соединении с базой данных. В приведенном выше примере, TDatabase использовался в качестве единственного канала для связи с базой данных, поэтому было возможным выполнение только одной транзакции. Чтобы выполнить это, было определено имя псевдонима (Aliasname). Псевдоним хранит в себе информацию, касающуюся соединения, такую, как Driver Type (тип драйвера), Server Name (имя сервера), User Name (имя пользователя) и другую. Данная информация используется для создания строки соединения (connect string). Для создания псевдонима вы можете использовать утилиту конфигурирования BDE, или, как показано в примере ниже, заполнять параметры во время выполнения приложения.
TDatabase имеет свойство Params, в котором хранится информация соединения. Каждая строка Params является отдельным параметром. В приведенном ниже примере пользователь устанавливает параметр User Name в поле редактирования Edit1, а параметр Password в поле Edit2. В коде листинга 8 показан процесс подключения к базе данных:
Листинг 8
Этот пример показывает как можно осуществить подключение к серверу без создания псевдонима. Ключевыми моментами здесь являются определение DriverName и заполнение Params информацией, необходимой для подключения. Вам не нужно определять все параметры, вам необходимо задать только те, которые не устанавливаются в конфигурации BDE определенным вами драйвером базы данных. Введенные в свойстве Params данные перекрывают все установки конфигурации BDE. Записывая параметры, Delphi заполняет оставшиеся параметры значениями из BDE Config для данного драйвера. Приведенный выше пример также вводит такие понятия, как сессия и метод GetTableNames. Это выходит за рамки обсуждаемой темы, достаточно упомянуть лишь тот факт, что переменная session является дескриптором database engine. В примере она добавлена только для "показухи".
Другой темой является использование SQLPASSTHRU MODE. Этот параметр базы данных отвечает за то, как натив-команды базы данных, такие, как TTable.Append или TTable.Insert будут взаимодействовать с TQuery, подключенной к той же базе данных. Существуют три возможных значения: NOT SHARED, SHARED NOAUTOCOMMIT и SHARED AUTOCOMMIT. NOT SHARED означает, что натив-команды используют одно соединение с сервером, тогда как запросы - другое. Со стороны сервера это видится как работа двух разных пользователей. В любой момент времени, пока транзакция активна, натив-команды не будут исполняться (committed) до тех пор, пока транзакция не будет завершена. Если был выполнен TQuery, то любые изменения, переданные в базу данных, проходят отдельно от транзакции.
Два других режима, SHARED NOAUTOCOMMIT и SHARED AUTOCOMMIT, делают для натив-команд и запросов общим одно соединение с сервером. Различие между двумя режимами заключаются в передаче выполненной натив-команды на сервер. При выбранном режиме SHARED AUTOCOMMIT бессмысленно создавать транзакцию, использующую натив-команды для удаления записи и последующей попыткой осуществить откат (Rollback). Запись должна быть удалена, а изменения должны быть сделаны (committed) до вызова команды Rollback. Если вам нужно передать натив-команды в пределах транзакции, или включить эти команды в саму транзакцию, убедитесь в том, что SQLPASSTHRU MODE установлен в SHARED NOAUTOCOMMIT или в NOT SHARED.
5. Выводы
Delphi поддерживает множество характеристик при использовании языка SQL с вашими серверами баз данных. На этой ноте разрешите попрощаться и пожелать почаще использовать SQL в ваших приложениях.
В данной статье рассмотрены принципы, помогающие компилятору Delphi генерировать более оптимальный с точки зрения скорости код. Если Вы не хотите вникать в подробности, в конце статьи есть «свод правил», которые рекомендуется соблюдать при написании программ.
Компилятор Delphi относится к разряду оптимизирующих. Но насколько качественно проводится оптимизация? Как «помочь» компилятору создать более быстрый код? Давайте разберемся с этим на экспериментах.
Оптимизация константных выражений
Пример 1:
С точки зрения оптимизации код можно упростить еще на этапе компиляции до
Но написанный выше листинг преобразуется в
С одной стороны компилятор не «сообразил», что значение переменной «a» можно преобразовать в константу и сложить с другой константой (которая, заметим, подставлена именно как константа) на этапе компиляции, с другой стороны был применен весьма хитрый трюк с LEA (об этом ниже). Тем не менее, код
в любом случае быстрее и короче.
Пример 2:
Скомпилированный код будет выглядеть
А ведь значение, присвоенной переменной «а» являлось константой и наш пример можно было бы переписать как:
Пример 3:
После компиляции получаем:
Т.е. компилятор преобразовал код так, как он был написан, а ведь можно было бы просто записать:
Оптимизация алгебраических выражений
Пример 4:
После компиляции эти переменные будут удалены, причем с предупреждением
Пример 5:
Код скомпилируется как есть! Таким образом мы обманули компилятор псевдо использованием переменных. Delphi не исправляет нашей «кривости», поэтому эта задача ложится исключительно на плечи программиста.
Пример 6:
Данный код можно оптимизировать до
И этого Delphi за нас не сделает.
Пример 7:
В данном примере первую строчку можно безболезненно удалить, что Delphi делать умеет.
Пример 8:
В данном случае можно избавится от одной операции умножения, присвоив значение выражения a*b временной переменной. Анализ ассемблерного листинга показывает, что компилятор именно так и поступает. Тем не менее, поменяв второе подвыражение на ((b*a)>0), компилятор принимает выражения за разные и генерирует умножение для обоих случаев, не смотря на то, что результат одинаков.
Оптимизация арифметических операций
Сложение и вычитание
Применение инструкции LEA вместо ADD позволяет производить сумму 3х операндов (двух переменных и одной константы) за один такт. Трюк заключается в том представление ближних указателей эквивалентно их фактическому значению, поэтому результат, возвращенный LEA равен сумме ее операндов. При возможности Delphi производит такую замену.
Деление
Операция деления требует гораздо больше тактов процессора, нежели умножение, поэтому замена деления на умножение может значительно ускорить работу. Существуют формулы, позволяющие выполнять такое преобразование. Тем не менее, Delphi не использует такую оптимизацию. Деление на степень двойки можно заменять сдвигом вправо на n бит, но даже в этом случае получаем следующий код:
Здесь учитывается особенность самой операции div – округление в большую сторону. Поэтому, если можно пренебрегать округлением, используйте c:=a shr 1 вместо с:=a div 2.
Умножение
Умножение на степень двойки можно заменять сдвигами битов. Delphi заменяет умножение сдвигами при умножении на 4,8,16 итд. При умножении на 2 производится суммированием переменной с собой.
Умножать на 3,5,6,7,8,10 и т. д. можно и без операции умножения – расписав выражение по формуле (a shl n)+a, где n – показатель степени двойки. Например, при умножении на 3 n=1. Delphi при возможности прибегает к этому трюку. Заметим, операнд LEA умеет умножать регистр на 2,4,8, что также при возможности используется компилятором. Например, умножение на 3 преобразуется в инструкцию
Оптимизация case of
Анализ скомпилированного кода показывает, что Delphi проводит утрамбовку дерева. Т.е. значения case сортируются и выбор нужного элемента производится при помощи двоичного поиска.
В случае, если элементы case of выстраиваются в арифметической прогрессии, компилятор формирует таблицу переходов. Т.е. создается массив указателей с индексами элементов, поэтому выбор нужно элемента выполняется за одну итерацию независимо от количества элементов.
Оптимизация циклов
Разворачивание циклов – не производится. Разворачивание циклов весьма спорный момент в оптимизации, поэтому принять грамотное решение может только человек. Delphi не производит разворачивания ни больших, ни маленьких циклов.
Слияние циклов – не производится. Если два цикла, следующие друг за другом имеют одинаковые границы итерационной переменной, разумно оба цикла объединить в один.
Вынесение инвариантного кода за пределы цикла – не выносится. Наиболее распространенный недочет – условие цикла записывается как:
Delphi будет при каждой итерации вызывать метод count, вычитать из результата 1 и потом уже сверять. Настоятельно рекомендуется переписывать подобный код как
Весь код VCL написан с нарушением этого правила. Очевидно, что проще подобного рода оптимизацию встроить в компилятор, нежели переписывать VCL :)
Замена циклов с предусловием на циклы с постусловием – производится. Циклы с постусловием имеют главное преимущество над другими видами циклов (с предусловием и с условием в середине) – они содержат всего одно ветвление. Delphi производит такую замену.
Замена инкремента на декремент – не производится. Более того, даже декрементный цикл компилируется в неоптимальный код, т.к. не используется флаг ZF. Вместо этого происходит сравнивание значения регистра с 0.
Удаление ветвлений – не производится.
Вывод:
1. Не используйте переменные для временного хранения констант или обязательно объявляйте «магические» числа как const, либо подставляйте в код непосредственные значения
2. Неиспользуемыми объявлениями и присвоениями можно безболезненно пренебрегать – Delphi умеет их вычищать.
3. Внимательно следите за использованием переменных, в частности лишним присвоениям их значений друг другу. Такого рода оптимизации Delphi делать не умеет.
4. Используйте свернутые математические выражения. (например, (3*a - a) /2 упрощается до a). Delphi не умеет упрощать математические выражения. (Да и что говорить, даже MathCAD не всегда грамотно умеет делать такие преобразования).
5. Не используйте конструкции типа a:=10*sin(45*pi/180); Delphi не вычислит эту константу на этапе компиляции, напротив, будет послушно вызывать sin и pi по ходу выполнения программы! В случае, если угол является переменной, по крайней мере pi можно заменить константой 3,1415...
6. Delphi прекрасно справляется с выражениями, полностью составленных из констант – они вычисляются на этапе компиляции.
7. Внимательно следите за условиями и их границами. Компилятор Delphi не умеет обнаруживать заведомо ложных условий. Также он не умеет удалять заведомо лишние условия. Например, (a>0) and (a<15616) and (a<>0)
8. Если в условии несколько раз проверяется одно и тоже выражение, следите, чтобы оно было выражено во всех конструкциях одинаково. В противном случае скомпилированный код будет не оптимален. Например, if ((a*b)>0) and ((a*b)<1024) then... При перестановке во втором случае b*a смысл выражения не изменится, но код будет иметь уже на одну операцию умножения, а две. Можно временно присвоить проверяемое выражение временной переменной, а затем уже проверять полученное значение.
9. Сообщение «Combining signed and unsigned types – widened both operands» сообщает не только о потенциальной ошибке – также вследствие преобразования мы теряем производительность. Например, z – объявлена как ineteger. условие if z>$abcd6123 then z:= $abcd6123; несмотря на его правильность вызовет данное предупреждение. Сгенерированный код будет, выполнять преобразования величин до 64-х бит, и дальнейшее уже сравнение 64-х битных операндов. Если изменить тип z на cardinal, мы избавимся от предупреждения и получим 3 строки кода, вместо 8 !
10. Delphi умеет оптимизировать сложение, умножение и частично деление. При делении на степень двойки, если не важно округление до большего, рекомендуется пользоваться shr 1 вместо div 2.
11. В case of при возможности используйте элементы, расположенные в арифметической прогрессии. Тем не менее, даже при невыполнении данного условия мы получим качественный код после утрамбовки дерева.
12. Выносите инвариантный код за тело цикла. Наиболее частая ошибка – for i:=1 to length(str) do... Дело в том, что при каждой итерации будет вызываться функция length, что пагубно скажется на производительности. Рекомендуется длину строки заранее присвоить переменной. Также не включайте в тело цикла код, заведомо не зависящий от изменения итерационной переменной.
Сравнивая Delphi с компиляторами Visual C++, WATCOM, Borland C++ (тестирование данных компиляторов приведено в [1]) приходим к выводу, что Delphi по своим оптимизирующим свойствам аналогичен Borland C++ (а кто сомневался? ;) ). Учитывая, что Borland C++ по итогам сравнения оказался последним, делаем несложный вывод. Весьма печален и тот факт, что большинство кода VCL написано с точки зрения «красоты» кода, а не его оптимальности с точки зрения скорости. Например, не соблюдается правило 12.
Эта статья является продолжением статьи о создании счетчика просмотров для каждой страницы сайта на 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 скриптом подсчета просмотров страниц, можно по этой ссылке.
В этой статье будет рассмотрен скрипт, который создает анимацию в виде падающего снега. Анимация воспроизводится в заданной области 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 в нужную позицию.
Поисковая оптимизация - это комплекс работ над сайтом и внешними факторами для достижения наилучших позиций в поисковых системах в соответствии с выбранными ключевыми словами. Этот способ оптимизации позволяет достигать высоких позиций в результатах выдачи поисковых машин по профильным запросам (ключевым словам) и тем самым привлекать огромную часть целевых посетителей.
В настоящий момент единственным путём завоевать Интернет-просторы, является оптимизация и продвижение сайта в поисковых системах. С каждым годом число пользователей Интернета, а, следовательно, поисковых систем растет. А это значит, что поисковая оптимизация приносит все больше и больше выгоды владельцам сайта. Согласно статистике, около 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. Частой ошибкой является необдуманная покупка внешних ссылок с различных веб-сайтов. К данному вопросу стоит относиться очень серьёзно и покупать ссылки только у профессиональных компаний.
Хочется немного осветить вопрос индексации сайта основными поисковиками (к которым относятся грозный и страшный Яндекс, рвущийся к лидерству уже и на просторах русскоязычного поиска Google, скатывающийся назад Рамблер, “всемирный” соперник Гугла Yahoo, ну и непонятно зачем все еще существующий Апорт ).
Проще всего рассмотреть скорость индексации на примере данного сайта. Сайту нет еще даже месяца, поэтому интересна динамика попадания страниц сайта в индекс (выдачу) поисковиков. Немного удивило то, что уже в день появления сайта на просторах всемирной сети (именно физического появления, т.е. момента, когда данные сайта стали доступны) Google каким-то образом успел проиндексировать несколько десятков страниц, и это при том, что сайт в “Google для вебмастеров” не вносился, вручную в Google не добавлялся, на сайт вообще была всего одна ссылка, правда на главной странице более-менее посещаемого (в том числе роботами) мини-портала .
Также в тот же день этот сайт был добавлен в Яндекс.вебмастер - якобы это ускоряет индексацию Яндексом. Как выяснилось - не ускоряет… вообще, складывается впечатление, что хоть какие-то обновления в базе Яндекса происходят раз в неделю, обычно в выходные, при том робот шарит по сайту стабильно - но почему-то на выдачу это никак не влияет.
Следом за Гугле, буквально через день, сайт заметил Яху, примерно столько же страниц - около 60. Несмотря на отстутствие в первые дни sitemap.xml (сейчас в нем чуть более 1600 страниц), Гугле уже за первую неделю проиндексировал более 500 страниц, а через 2.5 недели в базе было 1.5 тысячи страниц, то есть почти весь сайт. Примерно в это же время первые несколько страниц (а именно 4) появились в выдаче Яндекса - впечатляющая скорость. Да, сайт в первый же день был зарегистрирован в каталоге-рейтинге Рамблера, и через пару дней там появился, а вот в выдаче Рамблера до сих пор нет ни одной страницы (код счетчика стоит на каждой странице), Рамблер в этом плане отстает даже от Апорта, в котором уже есть несколько десятков страниц.
Яху меня несколько раз впечатлял скоростью индексации ссылок на сайт - показывал некоторые бэклинки буквально через час-два после их появления, просмотр бэклинков на Яндекс.вебмастер тоже немного порадовал - несмотря на то, что Яндекс знает всего 4 страницы сайта, но тем не менее он уже знает около 20 ссылок на сайт - то есть примерно 70% на данный момент… что не так уж плохо.
Ну вот собственно пока и все, надеюсь из этого коротенького обзора можно сделать кое-какие выводы о скорости попадания сайта в индекс (выдачу) основных поисковиков.
Очень часто при работе с запросами приходится менять SQL этого запроса. Например, при изменении порядка сортировки или при необходимости изменения фильтра, прописанного в where. Сделать это стандартными средствами можно, но довольно муторно, т.к. весь запрос хранится в одном месте (для TQuery и её потомков это свойство Sql). При желании изменить, например, количество или порядок следования полей в order by, нужно программно найти этот order by, написать свой, вставить его вместо старого и т.д. Для меня, честно говоря, загадка, зачем борланд пошла по такому ущербному пути: стандарт ANSI SQL-92, с которым (и только с которым!) работает Bde, подразумевает достаточно жёсткий синтаксис запроса, вполне допускающий обработку на уровне отдельных секций. Сегодня я хотел бы поделиться одним из вариантов реализации потомка TQuery, в котором задачи такого класса будут решаться на лету одной строчкой кода.
Смысл очень простой. Для того, чтобы уйти от ручной обработки текста sql-запроса, надо просто разбить его на стандартные секции. И менять их по отдельности. Ведь любой select-запрос имеет достаточно строгий синтаксис, состоя из определённого количества заранее известных секций (clauses), задаваемых в строго определённой последовательности. Рассмотрим этот синтаксис поподробнее на примере СУБД Interbase:
Как видим, обязательными являются две секции: SELECT и FROM.
Ещё восемь секций опциональны. Наша задача сводится к тому, чтобы значение каждой секции устанавливать отдельно, при необходимости переоткрывая запрос. Можно было бы плясать от стандартного свойства Sql, выделять нужную секцию, менять и вставлять обратно. Но зачем это, если можно сам Sql формировать на основе заданных секций? Конечно, этот подход имеет тот минус, что накрывается прямая установка Sql одной строкой, что может быть неудобно при хранении запроса в реестре, базе и т.д., но и это, при желании, можно побороть.
В общем-то, ничего заумного, реализация до смешного проста, но при использовании в проектах позволяет сэкономить массу времени и значительно увеличить читабельность кода.
Чтобы не писать отдельное свойство на каждую секцию, задавать их будем в виде массива строк. Для работы с этим массивом нам понадобятся индексы, которые тоже лучше определить заранее:
Определим тип нашего индексированного свойства и определим сам класс:
Свойство fClauses будет содержать все секции запроса, на основе которых и будет формироваться сам запрос. Занимается этим процедура UpdateSql. Ну а методы GetClause/SetClause стандартны, и служат для установки/чтения значений отдельных секций. Поглядим на сам код:
Всё достаточно прозрачно, отмечу лишь, что метод UpdateSql добавляет в текст Sql-запроса только те секции, для которых установлено начение, и переоткрывает квери, если она была открыта на момент изменения секции. Здесь есть мелкие недоработки, например, не проверяется выход индекса за пределы допустимых значений, я просто не хотел мусорить исходный код вещами, которые очевидны и принципиально не важны. Можно было бы привести код регистрации компонента в палире дельфи, но это также тривиально. Приведу лучше исходник тестового проекта, в котором используется этот квери. В этом проекте на форме находятся компоненты DbGrid1, подключенные к источнику данных DataSource1, динамически создаётся экземпляр TDynQuery, открывающий таблицу "biolife" из DbDemos, входящую в стандартную поставку Delphi. После этого изменяется по кликанью на заголовке (Title) грида меняется сортировка таблицы:
Наряду с мета-тегами, которые повышают рейтинг веб-страниц и дают дополнительную информацию браузеру и поисковым системам, существуют и бесполезные мета-теги, их роль сводится только к тому, чтобы занимать лишнее место. Ниже рассмотрены некоторые такие мета-теги.
Тег, управляющий временем индексации сайта
<META NAME="revisit-after" content=<... days">
Тег говорит поисковому роботу посетить ваш сайт снова через заданное количество дней. Сегодня тег не работает потому, что крупнейшие поисковики официально объявили, что их роботы больше не слушаются этого тега. Это вполне логично, представим, что каждый сайт поставит время индексации один день, поисковики просто не справятся с такой огромной нагрузкой.
Тег для поисковых машин, управляющий индексацией страниц
<META NAME="robots" content="...">
Не имеет смысла, т.к. намного удобнее задать все команды для поисковика в одном текстовом файле с именем robots, а затем вносить в него изменения по мере необходимости, а не ворошить все страницы и вставлять этот тег в каждую из них.
Тег, определяющий тему
<META NAME="subject" content="...">
Прописывать тему страницы в мета-тегах просто нелепо, для этого существуют заголовки, названия. Поисковики не обращают на этот тег внимания. Если в теме будет написано одно, а сайт совершенно другой тематики, то результат будет тем более нулевым.
Тег, определяющий заголовок страницы
<META NAME="title" content="...">
Для заголовка страницы существуют специальные теги <title> и </title>. Поэтому, прописывание загловка в мета-тегах не имеет смысла хотя бы потому, что эта конструкция будет слишком громоздкой.
Тег, определяющий создателя сайта
<META NAME="site-created" content="...">
Т.к. очень малое количество пользователей сети ищут сайты по имени их создателя (чаще всего он вообще неизвестен), то и целесообразность этого тега можно поставить под сомнение. Такой тег уместен лишь для «культовых личностей», имя и фамилию котрых пользователи сами вводят в строку поиска.
Тег, определяющий язык, на котором написана страница
<META NAME="Content-Language" content="...">
Язык посковики и сами хорошо умеют определять, поэтому в подсказках не нуждаются, следовательно, тег лишний.
Тег, определяющий принадлежность авторских прав
<META NAME="Copyright" content="...">
Такое впечатление, что этот тег был придуман специально для российских разработчиков, потому что только в нашей стране уж очень любят лепить копирайты везде, где попало, и побольше. Прежде всего, тег излишен тем, что владельца авторских прав никто, кроме поисковых машин не увидит. Одно это делает тег почти бесполезным, уж лучше копирайт внизу страницы поставить. Ну а для тех, кто захочет код страницы посмотреть, послание можно и в комментариях оставить.
Тег, определяющий автора содержания страницы
<META NAME="Author" content="...">
В общем и целом, данный тег аналогичен предыдущему, т.к. обычно автор сайта является и владельцем авторских прав. А если имя автора ввести в строку поиска, то поисковик выдаст на первых местах те страницы, на которых имя (или ФИО) есть в тексте самой страницы и уже только потом в мета-тегах.
Тег, определяющий адрес страницы
<META NAME="Address" content="...">
Если честно, то этот тег вызывает у меня смех. Зачем указывать адрес страницы в мета-тегах, если его можно набрать в адресной строке. Или его придумали в те времена, когда поисковые машины находились на зачаточной стадии развития?
Тег, определяющий домашнюю страницу
<META NAME="home_url" content="...">
Сложно судить о смысле этого тега, но каков бы он ни был, использовать данный тег всё равно нецелесообразно. Причина проста — мета-теги не видны обычным посетителям страницы, их видят только поисковики!
Пока компьютер не занят другими заданиями, Windows XP может провести индексацию файлов, чтобы повысить гибкость и скорость поиска.
Помимо текста в файлах, в индекс входят свойства файлов, поэтому можно вести поиск по таким критериям, как имя автора и заголовки.
Если вы нечасто пользуетесь функцией поиска, то службу индексации лучше отключить, так как индексированные файлы занимают место на жестком диске.
Но чем востребованнее функция поиска, тем полезнее служба индексации. Чтобы ознакомиться с текущими параметрами Windows XP, следует выбрать пункт Preferences из списка в левой стороне меню Start - Search. Отыщите слова With Indexing Service, означающие, что в данный момент служба отключена, или Without Indexing Service —служба активна. (Именно так, хотя должно быть наоборот.)
Чтобы изменить текущий режим, выберите параметр и щелкните на кнопке Yes. Пользователи Windows 2000 могут открыть диалоговое окно из меню Start - Search - Files/Folders - Search Options - Indexing Service.
На данный момент интернет - это огромная сеть, которая содержит в себе бесконечное множество различной информации. Пользователи получают ее путем серфинга веб-браузеров - программ, предназначенных для просмотра сайтов. Ну а каждый сайт непременно должен содержать контент - то, за чем и приходит на его страницы посетитель.
Как правило, при создании новых сайтов у веб-мастера появляется потребность в его информационном наполнении. Многие из них знают, что лучше всего ценится именно уникальный и качественный контент. Но, то ли в силу своей лености или ограниченности авторских способностей, не все создают его самостоятельно.
Да, зачем сидеть сутками за экраном монитора и сочинять какие-то тексты, которые потом еще будет кто-то читать. Можно просто скопировать этот самый контент с других сайтов.
Остановлюсь на причинах, почему так не стоит делать.
Первая - Престиж сайта, особенно, если он корпоративный. Тут можно провести аналогии с рекламой компании на шариковых ручках, чашках и прочих недорогих, но столь нужных вещей. Почему-то на них логотипы и название компании не копируются, а стараются создать свой, уникальный стиль.
Вторая - Незаконность. Множество статей и обзоров являются собственность их авторов. Поэтому публикация без их разрешения является незаконной и охраняется законом об авторском праве. К сожалению, наше несовершенное законодательство не позволяет в полной мере защитить интеллектуальную собственность.
Третья - поисковые машины уже давно научились находить настоящий источник статьи. Это уже проверено на своем сайте. Еще поисковики очень ценят уникальный контент, а не его дубликаты.
Автору данной статьи на одном из форумов о seo доводилось видеть приблизительные алгоритмы определения оригинальности контента. Благо, 5 лет университета не прошли даром - через мрак матриц, векторов и теории вероятности стало ясно, что на самом деле это не так и сложно. Для ЭВМ, конечно. А уж поверьте, что у того же Яндекса или Гугла вычислительные мощности уже исчисляются десятками тысяч(!) машин.
Думаю, этих доводов пока будет достаточно. Тут главное - понять саму суть проблемы, а не все ее мелочи. Еще в последнее время получили распространение сервисы, которые предлагают бесплатный контент. Это как нельзя кстати для новых и малобюджетных проектов. Единственным условием использования такого контента является наличие ссылки на первоисточник.
Но тут есть и обратная сторона медали - от этого выигрывает лишь сайт, предоставляющий контент. Ведь, по сути дела - это просто ссылка на его ресурс. Такие ссылки расползаются по всему инету, создавая для первоисточника просто сказочное количество бек-линков.
Бесплатный сыр, как говорится, может оказаться вовсе не бесплатным. Так и вышло, когда поисковики научились находить дубликаты и убирать содержащие их сайты из результатов выдачи.
К сожалению, на данный момент ситуация такова, что процент оригинального количества контента к общему так и остается на уровне 10-15% . И это только то, что смогли подсчитать поисковые машины, а ведь они по всему инету не ходят (на индексацию всего инета нужно от 300 до 400 лет).
Но все же есть люди, которые стараются создавать уникальный контент, а не копируя уже напечатанное. К некоторым понимание значимости оригинального контента приходит лишь со временем.
Помните, что оригинальный и свежий контент - это курица, которая несет золотые яйца. Не верите - попрактикуйтесь на реальных сайтах.
Множество владельцев малого бизнеса просто не имеют достаточно ресурсов для проведения рекламной компании, которая бы позволила раскрутить их интернет-ресурс. Именно для решения этой проблемы в интернете существует множество online сервисов, которые позволяют владельцу сайта самостоятельно (DIY, do-it-yourself) заняться популяризацией своей веб-странички.
На сайтах подобного рода специалисты по поисковой оптимизации могут дать вам множество полезных советов и рекомендаций. Эта статья предоставляет возможность мне поделиться с вами своим опытом в области поисковой оптимизации. Назовем эти рекомендации как "10 минут для поисковой оптимизации".
Эти советы будут полезны для каждого, у кого есть хотя бы несколько страничек, сверстанных на HTML, но все же главной темой данной статьи будет привлечение посетителей на вашу домашнюю страничку.
Первые шаги
Перед тем, как начать, следует рассмотреть несколько моментов, которые необходимо знать перед началом оптимизации. Только вот для этого может потребоваться и более 10-ти минут. Итак, следует учесть следующее:
Определитесь со своей целью:
99% из вас знают, какой именно товар вы собираетесь рекламировать, поэтому вам нужно только определиться с ключевыми словами, по которым посетитель и попадет на ваш сайт. Вот несколько полезных советов. Во-первых, нужно проанализировать статистику посещаемости сайта, чтобы узнать, по каким ключевым словам посетители попали на ваш сайт. Во-вторых, посетите сайт вашего конкурента, который широко известен в просторах интернета.
Посмотрите на заголовки нескольких его страничек и попытайтесь определить, какие именно ключевые слова используются. Также посмотрите исходный текст странички (в Internet Explorer'е его можно посмотреть с помощью пункта меню View (Вид) - > Source (Просмотр html-кода)) и скопируйте информацию, содержащуюся в META-тегах. На своей страничке же вы должны определиться с частотой (разумной) использования наиболее запрашиваемых ключевых слов.
Здесь очень важно заметить, что профессиональные оптимизаторы имеют у себя под рукой гораздо больше инструментов, да и информации для установки нужных ключевых слов (с высокой их частотой в тексте страницы).
Дизайн сайта - привлекателен ли он для покупателя?
Вот тут-то и находится один из подводных камней. Суть его в том, что непривлекательный дизайн сайта - это прямой путь к низкой посещаемости ресурса. Безусловно, на тему разработки юзабилити сайта (т. е его дизайна), написано очень много и книг, и статей. Но пусть в рамках данной статьи все аспекты юзабилити рассмотреть и не получиться, то несколько замечаний тут не помешает:
1. Избегайте использовать в цветовой гамме сайта необычные и странные цвета. В противном случае посетителю будет тяжело прочитать информацию на вашем ресурсе (красный текст на голубом фоне - вот вам и яркий пример ужасного дизайна). Также не рекомендуется использовать текст мелкого шрифта; старайтесь придерживаться размера шрифта в пределах от 10 до 12 (2 или 3 в Macromedia Dreamweaver).
2. Использование на сайте рекламных блоков (как графических, так и текстовых), будут только отвлекать ваших посетителей. К примеру, если вы продаете автомобили BMW, то рекламировать на сайте средство для повышения потенции "Виагра" будет очень некстати.
Каждый графический элемент на вашей страничке может как повышать, так и понижать доверие посетителей к вашему ресурсу. Старайтесь использовать это место на сайте очень мудро и пользователи это оценят.
10 минут на раскрутку
1. Проверка на спам
Перед началом работ по оптимизации одним из ключевых моментов является тот факт, для раскрутки своего сайта вам не следует использовать приемы, которые могут быть восприняты поисковой машиной как спам. Но самое неприятно в этом то, что вы можете об этом и не подозревать! Некоторые веб-мастера (с устаревшими знаниями о принципах работы поисковых машин) используют на веб-страницах скрытый текст. Они ошибочно полагают, что таким методом помогут сайту подняться в глазах поисковика. Но это в корне неверно и данный прием может только добавить проблем для поисковой оптимизации.
Для обнаружения скрытого текста нужно всего лишь с нажатой левой кнопкой мыши провести от начала до конца страницы. Выделив таким образом всю страничку, можно легко найти скрытый текст (как правило, цвет шрифта у скрытого текста совпадает с цветом фона странички) - он просто будет выглядеть как подсвеченный.
Также вам захочется проверить частоту ключевых слов, которые встречаются на страничке. В данном случае является недопустимым повторение 5-6 ключевых слов, которые расположены друг за другом. Таким образом поисковую машину уже не проведешь, так что лучше таких приемов не использовать.
Для получения более детальной информации о нечестных методах раскрутки, которые приводят только к негативным результатам, можно ознакомиться с документом: "Inspecting your Web Site for Spam."
2. Проверка на релевантность (значимость) сайта для поисковой машины
Очень важно для вашего ресурса всегда быть в фокусе у поисковика. Для примера, если ваш ресурс будет ассоциироваться с ключевой фразой "Продажа автомобилей BMW", то ссылка или информация о продаже недвижимости будет совершенно излишней. Имейте в виду, что большинство поисковых машин будут судить о вашем ресурсе именно в зависимости его тематики. А она в первую очередь зависит от текстовой информации, которая содержится на страницах вашего сайта.
3. Подбор правильного содержания сайта
Текстовая информация на вашем сайте является решающей для удержания на сайте человека, который только что на него зашел. К слову, что это так важно, хочу добавить, что у множества компаний есть свой профессиональный копирайтер, который и занимается контентом (информацией на сайте). Поэтому так важно при написании статей придерживаться ключевых слов, которые вы выбрали в качестве цели для поисковой оптимизации своего ресурса. Но, в свою очередь, размещать ключевые слова в тексте без связи с остальной информацией (т. е ключевые слова не соответствуют тематике статьи) - верный путь потерять посетителя вашего сайта.
Важное замечание: очень часто первые 25-30 слов вашего сайта - это то, что каждый поисковик будет использовать для его описанию. Постарайтесь использовать ваши ключевые слова внутри этой области, не забывая при этом, чтобы это самое описание выглядело разборчиво и наглядно.
4. Работа над заголовком сайта (Title)
В заголовок вашей странички очень желательно поместить те ключевые слова или фразы, которые наиболее полно характеризуют предмет рекламы на ней. Для примера: "Продажа автомобилей BMW - MeBMW.com" Для поисковых машин заголовок является очень важным, а ключевые слова (фразы) в нем только помогут выше подняться в рейтингах. Но здесь главное не переусердствовать и использовать ключевые слова в пределах разумного. Заголовок также играет большую роль и в релевантности сайта. Именно его содержание будет сравниваться с текстовой информацией (контентом) остальной части веб-страницы. Чем больше будет совпадений у заголовка страницы с ее контентом, тем более она будет значимой для поисковой машины.
6. Навигация сайта... Сделайте ее интуитивно понятной
Могу предположить, что вы, как и большинство, используете для навигации на своем сайте графические элементы или текстовые ссылки. Здесь вам один мой небольшой совет - создайте меню для навигации на своем сайте предпочтительнее в виде текстовых ссылок его разделы. А разместить его лучше внизу страницы - так удобнее для посетителя. Теперь, при добавлении разделов, вы их можете называть, используя ключевые слова/фразы для лучшей информативности описания вашего раздела. Для примера сравним два варианта меню:
Аксессуары к автомобилям BMW | Продажа автомобилей BMW | Подробнее о MyBMW.com
и как после этого смотрится вот такое:
Аксессуары | Продажа автомобилей | О нас
7. Проверьте работоспособность ссылок и орфографию/грамматику
Совсем уж не помешает еще разок проверить все ссылки на сайте и правописание. После чего, если вы уверены, что это уже окончательный вариант, можете смело загружать сайт в интернет.
Спешить нужно медленно
А что же дальше? Сейчас много поисковых машин предлагают такую платную услугу, как предоставление вашему новому веб-сайту постоянную или срочную индексацию. В противном случае неизвестно, когда же до него доберется поисковый паук и проиндексирует его в своей базе. Если же вы воспользуетесь услугой срочной индексации, что уже через пару дней можно пожинать плоды в виде посетителей. Правда, у каждой поисковой машины здесь свои сроки.
Но все же эта статья посвящена тем, у кого денег для такой услуги попросту нет (да и стоит она недешево, вот может с первой прибыли ею и воспользуемся). Тем не менее, если ваш сайт уже посетил поисковый робот и внес его в свою базу, то вам остается теперь только ждать, когда он опять посетит его вновь на предмет наличия нового материала. Вот поэтому так важно своевременно обновлять контент на сайте - добавлять новые статьи, заводить новые разделы и т.д. (все зависит от вашей фантазии и сообразительности).
Но что же делать, если же вы желаете уменьшить это время или если до вашего сайта робот еще и не добрался? Вот для этого и придется кропотливо регистрировать все ваши новые странички вручную на сайте поисковика. А перед регистрацией (первой или повторной) не помешает также внимательно ознакомиться с правилами, которые очень подробно расписаны у каждого поисковика. Так, на всякий случай.