Уроки для начинающих программистов
Выпуск N 21
10 апреля
Ведущий рассылки Эдуард Дмитриев.
Сайт: http://prog.agava.ru/

Здравствуйте, уважаемые подписчики!
Это письмо желательно читать в броузере или развернуть на весь экран, тогда легче ориентироваться и приятнее читать!

В ВЫПУСКЕ:
1. Избранные новости и обновления
2. Программирование на Паскале
3. HTML: META тэги

1. ИЗБРАННЫЕ НОВОСТИ И ОБНОВЛЕНИЯ

Уважаемые друзья! Сразу хочу выразить огромную благодарность всем, кто прислал свои работы. Благодаря вам я сегодня могу представить много интересных и полезных исходников. Также хочу сообщить, что на сайте http://prog.agava.ru/ открылся новый раздел в категории "Исходные тексты на Паскале". Новый раздел называется "Исходники игрушек", в нем, как вы поняли, собираются исходные тексты игр. Были пополнения и в другие разделы, ниже обо всем по порядку.

Также обращаю ваше внимание, что свой файл Вы можете добавить прямо на сайте "Библиотека программиста" - по адресу http://prog.agava.ru/add.html

Итак, пополнения раздела "Исходники игрушек на Паскале":

  • Карточная игра "Козел"     Автор:   Романько В.С.
    Одна из самых интересных и распространенных карточных игр. Красивая графика, удобный интерфейс. Отлично написанная и красивая программа, которую можно использовать не только для изучения работы ее алгоритма, но и по назначению - просто, посидеть, поиграться...

  • Игра "Cave Dweller"     Автор:   Black Dog Software. Добавил: Dmitry
    Трехмерная игра в стиле DOOM. Программа относиться к разряду моделирования 3D миров. Если ее хорошо изучить, можно попробовать написать Quake :)
    Включает модуль просмотра .PCX, проигрывания Sound Blaster. На мой вгзляд очень хорошо иллюстрирует некоторые аспекты программирования графики.

  • Игра "ТЕТРИС"     Автор:   unknown. Самая знаменитая компьютерная игра. Данный релиз выполнен в текстовом режиме, очень простой, понятный и оптимизированный алгоритм. В принципе - неплохой движок Тетриса, можете попробовать самостоятельно развить более совершенный вариант.

  • Игра "МИНЕР"     Автор:   Mudbutt. Добавил: Art
    Практический полный аналог Windows игры Miner, только под ДОС. Написана в графическом режиме, довольно несложно. Демонстрирует несложный алгоритм, работу с мышью и графикой. Рекомендую!

  • Игра "МОРСКОЙ БОЙ"     Автор:   Окулов Николай. Игра "Морской бой" - написана на Паскале, в графическом режиме. Отличный алгоритм решения. Возможности: Игра с компьютером; Изменение хода игры и т.п.

  • Игра "DIG"     Автор:   Александр Циликин Довольно забавная игра, созданная в текстовом режиме. Смысл игры - избегать столкновения с противником(звездочка), двигаясь по лабиринту.Игра предназначена для одного игрока. Имеет встроенный редактор уровней.

  • Игра "Крестики-нолики"     Автор:   Романько В.С.
    Замечательная и простая игра. Данный ее вариант отличается серьезной "разумностью", вследствие чего выиграть у компьютера практически невозможно.

Пополнения раздела "Работа с графикой":
  • Библиотека графического интерфейса аля Windows     Автор:   Новак Сергей Николаевич
    Событийное управление аля ObjectVision. Родная BGI графика. Обработка исключительных ситуаций. Около 16 000 строк из них около 4 000 на ассемблере. Очень мощная, полезная и интересная библиотека!
    Помимо файлов модулей, архив включает довольно много примеров создания приложений с помощью этой библиотеки.

  • Вывод графических изображений     Автор:   Михаил
    Кто изучал высшую математику поймет что именно рисуется. Раньше была игрушка с зубчатыми кружочками, вставляешь ручку и рисуй. Тут рисует сам компьютер.И на простом уровне написания, без хитростей.

Это что касается исходников. Напомню еще раз, все эти замечательные работы можно найти на сайте Библиотека программиста. Как видите - большинство работ авторские, то есть вы не найдете их больше нигде в Сети. Далее - появилось несколько новых, интересных тем в форуме. Обращаю ваше внимание и приглашаю к участию:

Новые, самые интересные темы в форуме:

  • Автор: flea, Тема: Trouble
  • Автор: Программист, Тема: Сравнивая С++ и DELPHI
  • Автор: Андрей, Тема: IE и ссылки на локальные диски
А также появилось небольшое обсуждение по поводу CGI скриптов на Паскале, с моим, кстати, участием. Кто что добавит? Милости просим:
  • Автор: Слава, Тема: Как написать Cgi скрипт на Паскале
    • Автор: flea, Тема: re: Как написать Cgi скрипт на Паскале
      • Автор: Админ, Тема: re: Как написать Cgi скрипт на Паскале
Также произошли некоторые другие изменения и дополнения, всего понемножку. В частности, улучшилась навигация, правда, пока не во всех разделах.

Теперь хочу сообщить кое-что по поводу организации рассылки. В этом выпуске будет два задания, которые я предлагаю на этот раз мне прислать. Я подумал и решил, что было бы неплохо публиковать все ваши работы, на всеобщее обозрение. Так что если вы сделали задание, обязательно присылайте!

Ждем ваших работ, сообщений и участия!

 

2. ПРОГРАММИРОВАНИЕ НА ПАСКАЛЕ

В прошлом выпуске мы в вами научились работать с основными типами файлов - текстовыми и типизированными. Сегодня нам предстоит освоить еще одну разновидность файлов, а именно "нетипизированные" файлы, то есть файлы без типа. В прошлом выпуске я уже рассказывал о них, тогда же упомянул о том, что работа с этими файлами несколько отличается от работы с текстовыми и типизированными. Отмечу еще раз, что это действительно так и сегодня я постараюсь вас этому научить и показать особенности их применения.

Итак, в чем же разница? Чтобы лучше это понять, советую вспомнить как производиться чтение из типизированных файлов. Работая с ними, мы заранее знаем с переменными какого типа мы имеем дело и, соответсвенно, без проблем читаем эти переменные. Здесь же все наоборот: работая с файлами без типа мы не знаем, что за данные в них находятся и в переменные какого типа их надо помещать. Вы не поняли? Вот смотрите. Имеем файл, в котором находиться два элемента: 1) число "100" (символ "d" - насчет ASCII кодов см. пред. выпуски), 2) строка - "Here is string". Как прочитать из этого файла две переменные разных типов? Вспомните еще раз - если мы зададим этот файл как типизированный или текстовый, то сможем читать либо только числа (File of Integer) либо символы и строки (Text).
Вот мы и подошли к определению нетипизированных файлов. Итак, их суть в следующем: имея файл без определенного типа, мы можем читать из него любые данные, будь то строки, символы или записи. Запомните это и при необходимости используйте.

Как же реализуется чтение данных разного типа? Дело в том, что читая данные из файла без типа мы получаем блоки информации, которые составляют обычный набор байт. Указывая переменную, в которую эти байты надо поместить, мы как бы "на ходу преобразуем" эти данные к нужному типу. Вернемся к примеру выше. Имеем файл с такой строкой:

dHere is string

Номер буквы "d" в таблице символов - 100. Если мы прочитаем из файла один байт, указав, что его нужно поместить в переменную типа Byte, эта переменная приобретет значение 100. Если же мы будем читать этот байт в переменную типа Char, то получим символ "d". Вот и вся особенность, согласитесь, иногда довольно полезная. Скажу, что таким образом очень удобно читать записи, особенно разные.

Ну а теперь давайте посмотрим, каким образом производиться работа с файлами без типа.

  Чтение из файлов без типа

Сама процедура связывания файловой переменной с внешним файлом и его открытие ничем чем отличаются от обычного порядка действий. Разве что переменная в данном случае должна иметь тип File; , то есть быть файлом без типа.



var

  F: File;



begin

  { связываем файл с переменной }

  Assign(F, '1.txt');

  Reset(F);

end.



Чтение происводиться с помощью процедуры BlockRead. Посмотрим, как она работает:

BlockRead(F: File, Buf: Var, Size: Word, Result: Word)

F: File; - переменная типа File; Именно из этой переменной и происходит чтение данных.
Buf: Var; - переменная любого типа. В эту переменную помещаются прочитанные данные.
Size: Word; - количество считываемых байт.
Result: Word; - в эту переменную помещается реальное количество байт, которые были прочитаны.

Работает эта процедура следующим образом: из файла F считывается Size записей, которые помещаются в память, начиная с первого байта переменной Buf. После выполнения процедуры реальное количество прочитанных байт помещается в переменную Result. Здесь надо сказать, что эта переменная совсем не обязательно должна присутсвовать в качестве параметра, то есть ее попросту можно опустить. Однако иногда она довольно полезна и даже необходима - например, если чтение было окончено до того, как было прочитано требуемое количесто байт (достигнут конец файла), мы можем это отследить через переменную Result. Если же в этом случае (чтение данных после конца файла) переменная Result не будет указана, то образуется ошибка времени выполнения N100 "Disk read error" (Runtime error 100).

Вот пример использования этой процедуры:



{ допустим имеем такой файл:



dЦHello!



Здесь:

d - ASCII 100

Ц - ASCII 150

Hello! - строка из 6ти символов



}



type

   R = record

     A: Byte;

     C: Array[1..6] of Char;

   end;



var

  F: File;

  I: Byte;

  Rec: R;

  Result: Word;



begin

{ связываем файл с переменной }

  Assign(F, '1.txt');

{$I-}

  Reset(F, 1);

{$I+}

  if IOResult<>0 then Halt;



  BlockRead(F, I, Sizeof(I), Result);

  BlockRead(F, Rec, Sizeof(Rec), Result);



  Writeln(I);

  Writeln('Rec values: ');

  Writeln('A: ', Rec.A);

  Writeln('S: ', Rec.C);

  Readln;

  Close(F);

end.

Обращаю ваше внимание на новую функцию, которую я использовал в этой программе: Sizeof. Эта функция принимает в качестве параметра любую переменную и возвращает ее размер в байтах. Размер переменных стандартных типов (Integer, Byte....) можно найти в таблицах типов из пред. выпусков, в то время как размер определяемых пользователем типов, таких как запись иногда подсчитать довольно не просто. Поэтому SizeOf иногда очень выручает, упрощая работу.

Далее хочу указать вам на дополнительный параметр процедуры Reset. Он указывает размер буфера, который используется для передачи данных. В прошлом выпуске, когда я говорил о текстовых файлах и рассказывал о процедуре Reset я не упоминал об этом параметре. Дело в том, что с текстовыми файлами он не используется.

Буфер по умолчанию равен 128 байт. Если его явно не указывать, то Паскаль устанавливает это значение.

  Запись в файлы без типа

Ну чтож, с чтением данных вроде разобрались, пора переходить к записи. Для этого в Паскале имеется еще одна, отдельная процедура, а именно BlockWrite. Она очень похожа на предыдущую BlockRead, по крайней мере параметры у этих двух процедур абсолютно одинаковы.

BlockWrite(F: File, Buf: Var, Size: Word, Result: Word)

F: File; - переменная типа File;
Buf: Var; - переменная любого типа. Начиная с этой перменной, данные будут записываться в файл.
Size: Word; - количество записываемого блока данных в байтах.
Result: Word; - в эту переменную помещается реальное количество байт, которые были записаны.

Как видите, сходство с BlockRead действительно имеется. Здесь все абсолютно аналогично предыдущей процедуре, поэтому подробно разбирать параметры не будем. Сразу приведу пример использоваться этой процедуры. Что сделаем? Давайте запишем в файл сразу четыре переменных: символ, число, строку и запись. Программа будет иметь примерно такой вид:



uses Crt;



type

  R = record

    A: Integer;

    B: Word;

  end;



var

  F: File;

  Result: Word;

  C: Char;

  I: Integer;

  S: String;

  Rec: R;



begin

  ClrScr;

{ считываем и задаем исходные данные }

  Write('Enter CHAR: '); Readln(C);

  Write('Enter INTEGER: '); Readln(I);

  Write('Enter STRING: '); Readln(S);

  Randomize;

  Rec.A := Random(1000);

  Rec.B := Random(1000);

  Writeln('Rec.A: ', Rec.A);

  Writeln('Rec.B: ', Rec.B);

  Readln;



{ выполняем действия по записи в файл }

  Assign(F, '1.txt');

  ReWrite(F, 1);



  BlockWrite(F, C, SizeOf(C)+SizeOf(I)+255+SizeOf(Rec), Result);



  Close(F);

end.

Как видите, в процедуре BlockWrite я использовал целое выражение в качестве указания размера записываемого буфера. Составлено оно из сумы 3х результатов функции SizeOf и числа 255, которое является длиной строки S. На мой взгляд использование в таких ситуациях выражений гораздо более рационально, чем использование, например, предварительно посчитанной переменной. См. подчеркнутые моменты:



uses Crt;



type

  R = record

    A: Integer;

    B: Word;

  end;



var

  Size: word;

  F: File;

  Result: Word;

  C: Char;

  I: Integer;

  S: String;

  Rec: R;



begin

  ClrScr;

{ считываем и задаем исходные данные }

 .......



{ выполняем действия по записи в файл }

  Assign(F, '1.txt');

  ReWrite(F, 1);



  Size := SizeOf(C)+SizeOf(I)+255+SizeOf(Rec); { я это имею в виду }

  BlockWrite(F, C, Size, Result);



  Close(F);

end.

А вы как считаете? Кстати, здесь хочу напомнить лишний раз о функции Length, которая возвращает длину строки. С ее помощью можно было бы написать так:

Size := SizeOf(C)+SizeOf(I)+Length(S)+SizeOf(Rec);

Собственно говоря, это все о работе с файлами без типа. Как видите, вся тема укладывается в две процедуры, довольно не сложные. В качестве последнего примера приведу программу из стандартного help-а Паскаля - Копирование файлов. Программа очень хорошо демонстрирует применение процедур BlockRead и BlockWrite, а также некоторые другие моменты, возможно, вам не известные. Об этом - после программы.



{ Программа быстрого копирования файлов }

Uses Crt;



Var

  FromF, ToF : File;

  NumRead, NumWritten : Word;

  Buf : Array [1..2048] Of Char;



Begin

{ Открываем входной файл }

 Assign(FromF, ParamStr(1));

 Reset(FromF, 1);



{ Размер буфера записи = 1 байт }

{ Открываем выходной файл }

 Assign(ToF, ParamStr(2));

 ReWrite(ToF, 1);



{ Размер буфера записи = 1 байт }

 WriteLn('Копирую ', FileSize(FromF), ' байт...');

 Repeat

   BlockRead(FromF, Buf, SizeOf(Buf), NumRead);

   BlockWrite(ToF, Buf, NumRead, NumWritten);

 Until (NumRead = 0) Or (NumWritten <> NumRead);

 Close(FromF);

 Close(ToF);

end.

Обратите внимание на функцию ParamStr. Эта функция возвращает параметр командной строки под номером, который ей задается. К примеру, если данная программа запускается так:

C:\copy.exe 1.txt A:\1.txt

То функция ParamStr(1) вернет строку "1.txt". Функция ParamStr(2) - строку "A:\1.txt". Разобрались? Все очень просто!

  Продолжаем

Как видите, сегодня опять маловато практики, если не считать примеров. Данная тема (работа с файлами) требует определенного количества теории, поэтому практиковаться мы будем отдельно. Тем не менее я не хочу оставлять вас наедине с теорией и, чтобы сделать сегодняшний урок поинтереснее, я расскажу о так называемых "символах псевдографики". В частности, вы увидите как можно строить собственные таблицы в текстовом режиме и выполните небольшое задание.

Итак, псевдографика. Что же это такое? Собственно говоря, это обычные символы, которые имеются в стандартном наборе ASCII. Что такое ASCII коды я уже говорил, но случаев непосредственного применения и работы с ними не показывал. К сожалению, корректно отобразить эти символы в броузере и почтовой программе затруднительно, поэтому для понимания дальнейшей работы вам нужно запустить такую программку, по которой и будем работать:



Program Border;

uses Crt;



Procedure MakeWindow(X, Y, X1, Y1: Byte);

var

  I: Byte;



begin

  GotoXY(X, Y);  Write(#201);

  GotoXY(X1, Y);  Write(#187);

  GotoXY(X, Y1);  Write(#200);

  GotoXY(X1, Y1);  Write(#188);

  For I := X+1 to X1-1 do

  begin

    GotoXY(I, Y); Write(#205);

    GotoXY(I, Y1); Write(#205);

  end;

  For I := Y+1 to Y1-1 do

  begin

    GotoXY(X, I); Write(#186);

    GotoXY(X1, I); Write(#186);

  end;

end;





var

  B: Byte;



begin

  ClrScr;



  B := 187;

  Writeln('201: ', #201);

  Writeln('205: ', chr(205));

  Writeln('187: ', chr(B));

  Write('186: ', #186, #13, #10);

  Write('188: ', #188);

  Write(#$0d, #$0a, '200: ', #200);



  MakeWindow(10, 10, 40, 20);



  Readln;

end.

Она выводит несколько ASCII символов из стандартного набора. Это - символы рамки, которые нам и потребуются. В качетсве наглядного примера есть процедура (MakeWindow), которая рисует рамку по заданным координатам. Запустили? Посмотрели? Тогда для начала давайте разберем, как работает эта программа.

Как вы уже поняли, она демонстрирует символы псевдогрфики, с помощью которых стрятся рамки. В теле программы (не в процедуре) я пытаюсь продемонстрировать все возможные способы вывода символа по его коду. Разберем эти варианты.

Writeln('201: ', #201);
Вывод числа с предшествующим знаком # - это не что иное, как вывод символа по его коду. Используется чаще всего, что и вам рекомендую делать.

Writeln('205: ', chr(205));
Функция Chr(byte): Char; - возвращает символ, номер которого в ASCII таблице заданный параметром. В этом выражении мы сразу выводим возвращаемый символ на экран.

Writeln('187: ', chr(B));
То же самое - выводим символ, номер которого задан переменной.

Write('186: ', #186, #13, #10);
Интересный вариант. Вы видите, я использую процедуру Write, т.е. она не переносит после своей работы строку? Но строка переносится. Это - совокупный вывод символов #13 (перенос строки) и #10 (возврат каретки).

Write(#$0d, #$0a, '200: ', #200);
Не пугайтесь внешнего вида таких символов. На самом деле это просто символа с номером, который задан числом в 16й системе. В этом случае числа: $0d - 13, $0a - 10. Вот и все, как и в пред. примере - просто моделируем Writeln.

Как видите, нет ничего сложного. Ну и, естественно, налицо пример использования всех жти символов на практике. Процедура MakeWindow - построение окошек по заданным координатам. Работает очень просто:

  • Сначала печатаем уголки рамки;
  • После циклами выводим бока, т.е. поля окна.
В обоих случаях курсор позиционируется процедурой GotoXY на координаты, заданные параметрами.


Ну а теперь хочу предложить вам выполнить два задания, которые, как я уже говорил выше, мы все будем с нетерпением ждать. Обращаю еще раз ваше внимание - над каждым заданием есть ссылка "Добавить ответ", так что когда выполните его - не забудьте поделиться с другими!

Задание N1: Смастерите процедуру создания окна с заголовком: наподобие тех, которые использует сам Turbo Pascal. Естественно, без служебных символов и областей, просто заголовок, расположенный посередине. Сделаете? Конечно!
[ Добавить ответ ]

Задание N2: Помните "записную книжку"? Сегодня я хотел привести более полный вариант программы, которая бы писала все записи в файл. Однако после передумал. На мой взгляд это будет хорошим самостоятельным заданием по файлам. Итак: сделайте программу "Записная книжка" (задание см. в пред. выпусках), с возможностью сохранения информации в файл.
[ Добавить ответ ]

Пока все, жду ваших работ. До встречи!

 

3. HTML: META ТЭГИ

Возвращаемся к гипертекстовому языку. Я уже говорил, что нами пройдена большая часть HTML, которая служит для визуального оформления документов. Однако остались некоторое вещи, которые необходимо знать каждому, кто изучает HTML. Одни из них - это так называемые тэги META, которые не влияют на то, как документ выглядит в броузере, однако имеют большое значение, например, для поисковых систем. Что это за тэги и какой смысл они несут - читайте ниже.

  Что такое META тэги

Итак, приступаем к изучению META-тэгов. В первую очередь скажу, что их довольно много, сегодня мы пройдем самые основные и необходимые. В дальнейших выпусках я постараюсь рассказать и о других вариациях этих тэгов.

META - это отдельная часть документа, которая размещается внутри конструкции <head> - </head>. Основная смысловая нагрузка - это предоставление информации о документе, его авторе, дате создания и т.п., то есть чисто информационная необходимость. Однако среди META встречаются и другие типы тэгов, например тэг, позволяющий осуществлять редирект (об этом смотрите ниже). С помощью META можно задать такие вещи как, например, описание документа, ключевые слова, которые будут учтены при индексации сайта поисковыми машинами, имя автора, его email... В первую очередь эта информация нужна для поисковых машин, которые часто определяют содержимое документа на 90% исходя их информации, заключенной в META. Среди посетителей мало кто читает эти тэги :)

Уметь правильно оформлять эти тэги очень важно для дальнейшего развития вашего сайта. Об этом я еще расчитываю поговорить отдельно, пока же лишь о синтаксисе и оформлении.

  Оформление META

Я уже сказал, что META размещаются внутри головной части документа - разделе HEAD. Основной синтаксис этих тэгов сводиться к следующему:

<META name="имя META тэга" content="содержание META тэга">

или:

<META HTTP-EQUIV="имя META тэга" content="содержание META тэга">

Давайте теперь разберем по порядку состав тэга META:
  • После скобки, открывающей тэг указывается слово META;
  • Далее идет параметр name либо http-equiv, содержимое которого указывает имя тэга или его тип;
  • Следующий параметр content задает содержимое текущего имени тэга. Именно он и несет основную информационную нагрузку.
Вот такой, согласитесь, не сложный синтаксис. Еще раз - в нем можно выделить две части: "имя тэга" и "содержание тэга". Надо сказать, что параметр HTTP-EQUIV, которым заменяется параметр NAME указывается в служебных тэгах, которые обрабатываются броузером, в то время как тэги с параметром NAME им (броузером) пропускаются. Теперь все, что нам осталось разобрать - это список имеющихся зарезервированных META имен, которые являются самыми основными и необходимыми. Переходим к следующему разделу, где и будем этому учиться.

  Имена META

Среди стантартных имен META хочу отметить самые распространеннные и на мой взгляд необходимые. Вот их список:

Тэги с параметром NAME:

  • <META name="description"> - описание содержимого документа;
  • <META name="keywords"> - список ключевых слов документа;
  • <META name="author"> - имя автора документа и его email, координаты;
  • <META name="generator"> - название программы, создавшей документ;
  • <META name="Copyright"> - почти тоже самое, что и author. Описание авторских прав на документ.
Тэги с параметром HTTP-EQUIV:
  • <META HTTP-EQUIV="Refresh" CONTENT="0; URL=http://someurl.com"> - это очень хороший пример использования HTTP-EQUIV, причем один из самых полезных. Позволяет осуществлять редирект через заданный прмежуток времени на определенный адрес, без использования всяческих JS-скриптов и т.п.
  • <META HTTP-EQUIV="Content-Type" content="text/html; charset=windows-1251"> - тип содержимого документа и кодировка;
  • <META HTTP-EQUIV="expires" CONTENT="Tue, 3 Apr 2001 21:41:41 GMT"> - время "устаревания" документа;
Теперь давайте по порядку разберем эти тэги.

<META name="description">
Описание содержимого документа в произвольном формате. Здесь от вас требуется действительно творческий подход. Описание стоит составлять в виде небольшого текста, рекомендуется не более 250-300 символов. Я планирую написать о составлении описания отдельную статью, когда это сделаю - обязательно дам анонс в рассылке.
Предназначено в большей степени для поисковых машин, которые любят заносить данное описание себе в базу и в дальнейшем осуществлять поиск исходя именно из него. Вот пример описания с сайта Библиотека программиста:


<META name="description" content="Библиотека программиста - Книги и статьи по программированию - языки программирования, программирование для WEB, WEB-дизайн, множество другой разнообразной литературы. Каталог бесплатных рассылок, каталог ресурсов. Большие коллекции исходых текстов программ и скриптов на различных языках программирования.">
Только что обратил внимание (так, кстати, нельзя! :) - описание-то устарело маленько :))) Надо менять!

<META name="keywords">
Список ключевых слов, указываемых через пробел или запятую. Очень похоже на предыдущее описание, за тем исключением, что в этом тэге в содержимом content вы указываете список ключевых слов, которые максимально информативно должны описывать ваш сайт. Здесь опять же - вам карты в руки. Советую хорошо подумать перед составлением этого тэга, так как он играет огромное значение при индексировании вашего сайта ищейками. Чтобы лучше это усвоить, вспомните, как вы сами ищете через поисковики. Зайдя на сайт, чаще не набирается фраза вроде "сайт, содержащий описание стандартов протокола esmtp", зачастую это просто словосочетание или вообще слово, вроде "esmtp" или "протокол esmtp", на крайний случай я мог бы набрать "стандарт протокола esmtp", чтобы сократить размер мусора (хотя он, возможно, наоборот возрастет - я не очень большой специалист по поиску, больше каталоги люблю :).
В общем, думаю, ясно - стоит подбирать именно отдельные слова, по принципу "чем оригинальней, тем лучше". Вот пример текущей картины этого тэга сайта Библиотека программиста:


<META name="keywords" content="библиотека программиста, программисту, библиотека дизайнера, библиотека, вебмастера, webmaster, www, programming, progs, prog, for, programmer, programmers, turbo, asm, tasm, assembler, pascal, c, си, borland, hack, hacks, tpascal, perl, web, design, java, php, php3, программирование на php, книги, статьи, литература, подписка, рассылка, free, реклама, ассемблер, html, hypertext markup language, practical extraction and report language, программы">
Надо сказать, что этот набор совсем не блещет совершенством. Я составлял его очччень давно - около года назад, когда картина сайта сильно отличалась от текущей. На сегодня он требует 100%-й корректировки.

<META name="author">
Имя автора, его email, домашний адрес, любые другие координаты.... Не скажу, что очень обязательный тэг. В частности я его никогда не использую.

<META name="generator">
Тэг, крайне любимый HTML редакторами. В совершенно произвольной форме указывается название HTML редактора. Кому оно надо - совершенно не ясно. Надо сказать, меня жутко раздражает этот довольно никчемный тэг, который, почему-то все везде лепят. Однажды даже наблюдал примерно такую картину:
<META name="generator" content="Vasya Ivanov">
В данном случае в роли generator'а выступает некий Vasya. Bидел и такое:
<META name="generator" content="Notepad">
Это тоже никому не надо, но получается довольно весело :)

<META name="Copyright">
Подобие параметра author. Указывайте все авторские права на документ - на полную катушку!

Теперь переходим к тэгам с атрибутом HTTP-EQUIV. Эти тэги в некотором роде умеют управлять состоянием документа, давайте разберем, как именно.

<META HTTP-EQUIV="Refresh" CONTENT="0; URL=http://someurl.com">
Это тэг редиректа. Здесь параметр content составляется следующим образом:

CONTENT="время; URL=адрес"

Объясняется эта картина просто: через заданное время броузер изменит URL на заданный адрес. Часто подобный редирект реализуется через java-скрипты. Лично я отдаю предпочтение этому META тэгу.

<META HTTP-EQUIV="Content-Type" content="text/html; charset=windows-1251">
Этот тэг задает тип содержимого (MIME) и его кодироку. В данном случае тип указывается как "text/html" - то есть гипертекст, кодировка (charset) - windows-1251. Вообще, указывать явно кодировку не рекомендуется. Броузеры и сами неплохо справляются с ее выбором.

<META HTTP-EQUIV="expires" CONTENT="Tue, 3 Apr 2001 21:41:41 GMT">
Время и дата устаревания документа. Указывается в формате RFC-850 (стандарт электронной почты). Объясняется так:

  • Tue - день недели;
  • 3 Apr - день месяца и месяц;
  • 2001 - год;
  • 21:41:41: - время. Часы:минуты:секунды;
  • GMT - время московское. Тип временного пояса.
При истечении указанной даты документ будет удален из кэша и повторном обращении заново запрошен из сети. Это выполняется и броузером и прокси сервером. Обратите внимание - если дата указана как 0, то документ будет удален сразу же после загрузки, то есть он вообще не храниться в кэше. Если вы решили использовать этот параметр, то знайте, что могут возникнуть проблемы с индексированием в поисковых машинах, например, документ не будет проиндексирован вообще.

Вот так, изучили основные типы META тэгов. На этом сегодня закончим, разберитесь если что непонятно и подучите на будущее, если все ясно. На последок еще раз скажу - META, хоть и часто игнорирумая, но все равно очень важная часть документа. Тем не менее никогда не злоупотребляйте этими тэгами - они могут сильно увеличить размер страницы, совершенно не прибавив толку. Здесь важно найти некую "золотую середину" между размером META информации и ее качеством. Последнее, естественно, предпочтительнее.

Строго говоря, среди всего разнообразия META я бы рекомендовал оставить только два тэга: keywords и description.

До встречи!

 

Назад

Hosted by uCoz