Описывается работа в новой версии визуального Web-редактора Macromedia Dreamweaver 8. Книга организована в виде 14-ти занятий по Web-дизайну. Рассмотрены современные стандарты Интернета, интерфейс программы, создание страниц и сайтов, работа с текстами, графикой, таблицами и стилями, различные виды Web-дизайна: фреймовый, табличный и контейнерный. Освещены вопросы использования шаблонов, плавающих и свободно позиционируемых контейнеров, разработки Web-сценариев.
Уже с первых страниц начинающий пользователь может быстро приступить к работе и создать простейший Web-сайт. Изучение всего материала книги позволит читателю создавать современные Web-сайты с оформлением, приближенным к полиграфическому. Особую ценность имеют полезные советы автора, маленькие хитрости и нетрадиционные приемы Web-верстки.
Каким браузером вы пользуетесь? лично я уже давно юзаю на мой взгляд самую быструю и безопасную оперу. Больше всего мне нравиться, как в ней организован быстрый набор сайтов. Он представляет из себя сетку из 9 эскизов наиболее любимых сайтов, а увидеть его можно при создании новой пустой вкладки. В общем предлагаю вашему вниманию исходник эмулирующий быстрый набор сайтов как в браузере Opera.
В книге, написанной создателем языка C++ Биерном Страуструпом, представлено описание процесса проектирования и разработки языка программирования C++. Здесь изложены цели, принципы и практические ограничения, наложившие отпечаток на структуру и облик C++, обсужден дизайн недавно добавленных в язык средств: шаблонов, исключений, идентификации типа во время исполнения и пространств имен. Автор анализирует решения, принятые в ходе работы над языком, и демонстрирует, как правильно применять "реальный объектно-ориентированный язык программирования". Книга удобно организована, поучительна, написана с юмором. Описание ключевых идей даст начинающему пользователю ту основу, на которой позже он выстроит свое понимание всех деталей языка. Опытный программист найдет здесь обсуждение принципиальных вопросов проектирования, что позволит ему лучше понять язык, с которым он работает.
Прежде всего, микроконтроллер это процессор со всеми его "атрибутами", плюс встроенная, энергонезависимая память (программ и данных), что позволяет отказаться от внешней памяти программ и поместить программу в его энергонезависимую память.
Это позволяет создавать очень простые (в схемотехническом отношении) и компактные устройства, выполняющие, тем не менее, достаточно сложные функции. Иногда даже диву даешься: эта маленькая "штучка" заменяет целую "груду старого железа"
Любой микроконтроллер, по своим возможностям, конечно же, уступает процессору компьютера, но тем не менее, существует весьма обширный класс устройств, которые преимущественно реализуются именно на микроконтроллерах. И в самом деле, компьютер в карман не положишь и от батареек его не запитаешь. Поэтому, во многих случаях, микроконтроллерам просто нет альтернативы. "Сердцем" микроконтроллера является арифметико - логическое устройство (АЛУ).
Проще всего его представить в виде банального калькулятора, кнопками которого управляет программа, написанная на языке ассемблер (то есть, программист). Если вдуматься, то ничего особо сложного, в механизме управления такого рода калькулятором, нет. И в самом деле, если нужно, например, сложить числа А и В, то в тексте программы сначала задаются константы А и В, а затем дается команда "сложить". Программисту вовсе не обязательно знать, что происходит с нулями и единицами (разве только только для общего развития), ведь калькулятор он на то и калькулятор, чтобы избавить пользователя от "возни" с машинными кодами и прочими "неудобоваримостями".
Когда Вы работаете с компьютером, Вам и не нужно детально знать, что происходит в дебрях операционной системы.
Если Вы туда "полезете", то "с ума сойдете", а микроконтроллер, по своей сути, есть тот же самый компьютер, но только простой. Программисту только нужно детально знать, каким именно образом "приказать железяке" сделать то, что необходимо для достижения задуманного. Микроконтроллер можно представить себе как некий универсальный "набор" многофункциональных модулей (блоков), "рычаги управления" которыми находятся в руках программиста. Этих "рычагов" достаточно большое количество, и естественно, их нужно освоить и точно знать, что именно произойдет, если "дернуть" (дать команду на языке ассемблер) за тот или иной "рычаг". Вот здесь-то уже нужно знать, как "отче наше", каждую деталь и не жалеть на это "узнавание" времени. Только таким образом пустую "болванку" (незапрограммированый ПИК) можно "заставить"
выполнять какие-то "осмысленные" действия, результат большей части которых можно проверить в симуляторе MPLAB (об этом - позднее), даже не записывая программу в ПИК.
Итак, необходим переход к "модульному" мышлению. Любой микроконтроллер можно уподобить детскому конструктору, в состав которого входит множество всяких предметов, манипулируя с которыми, можно получить тот или иной конечный "продукт". Давайте с ними разберемся и "разложим все по полочкам". В качестве примера я буду использовать один из самых распространенных PIC контроллеров PIC16F84A. Он является как бы "проматерью" более сложных ПИКов, содержит минимальный "набор" модулей и как нельзя лучше подходит для первичного "въезда в м/контроллеры".
Энергонезависимая память.
Начнем с энергонезависимой памяти (память программ и память данных).
Информация, заложенная в энергонезависимую память, сохраняется при выключении питания, и поэтому именно в нее записывается программа.
То "место" энергонезависимой памяти, куда записывается программа, называется памятью программ. Объем памяти программ может быть различен. Для PIC16F84A, он составляет 1024 слова. Это означает, что он предназначен для работы с программами, объем которых не превышает 111024 слов.
Слово памяти программ не равно одному байту (8 бит), а больше его (14 бит). Отдельная команда, которую ПИК будет в дальнейшем выполнять, занимает одно слово в памяти программ. В зависимости от названия этой команды в ассемблере, слово принимает то или иное числовое значение в машинном коде. После записи в ПИК "прошивки" программы, слова памяти программ (машинные коды) как бы "превращаются" в команды, которые располагаются, в памяти программ, в том же порядке, в котором они следуют в исходном тексте программы, написанном на языке ассемблер, и в том же порядке им присваиваются адреса, при обращении к которым, та или иная команда "извлекается" из памяти программ для ее выполнения. Последовательность же их выполнения определяется логикой программы. Это означает то, что выполнение команд может происходить не в порядке последовательного возрастания их адресов, с шагом в одну позицию (так называемый инкремент), а "скачком". Дело в том, что только уж самые простейшие программы, в пределах одного их полного цикла, обходятся без этих "скачков", называемых переходами, и выполняются строго последовательно. В остальных же случаях, так называемая (мной) "рабочая точка программы" "мечется по тексту программы как угорелая" (как раз благодаря этим самым переходам).
Термин "рабочая точка программы" - моя "самодеятельность". В свое время, я был очень сильно удивлен отсутствием чего-то подобного в информации, связанной с объяснением работы программ. Казалось бы, чего проще, по аналогии, например, с рабочей точкой транзистора, сделать более комфортным "въезд в механику" работы программ? Так нет же, как будто специально, придумываются такие "головокружительные заменители", причем, в различных случаях, разные, что запутаться в этом очень просто. Итак, рабочую точку программы можно представить себе в виде некоего "шарика от пинг-понга", который "скачет" по командам текста программы в соответствии с алгоритмом (логикой) исполнения программы. На какую команду "шарик скакнул", та команда и исполняется. После этого он "перескакивает" на другую команду, она исполняется, и т.д. Эти "скачки" происходят непрерывно и в течение всего времени включения питания устройства (исполнения программы).
Любая более-менее сложная программа разбивается на части, которые выполняют отдельные функции (своего рода программки в программе) и которые называются подпрограммами. Атрибут любой подпрограммы - функциональная законченность производимых в ней действий.
По сути своей, эта "выдумка" введена в программирование для удобства реализации принципа "разделяй и властвуй": "врага" ведь гораздо легче "разгромить по частям, чем в общей массе". Да и порядка больше.
Безусловные переходы (переходы без условия) между подпрограммами (если они последовательно не переходят одна в другую), осуществляются при помощи команд безусловных переходов, в которых обязательно указывается адрес команды в памяти программ (косвенно - в виде названия подпрограммы или метки), на которую нужно перейти. Существуют также переходы с условием (условные переходы), то есть, с задействованием так называемого стека. Более подробно о переходах я расскажу позднее. Адреса команд определяются счетчиком команд (он называется PC). То есть, каждому состоянию счетчика команд соответствует одна из команд программы. Если команда простая, то счетчик просто инкрементируется (последовательно выполняется следующая команда), а если команда сложная (например, команда перехода или возврата), то счетчик команд изменяет свое состояние "скачком", активируя соответствующую команду.
Примечание: инкремент - увеличение на единицу величины числа, с которым производится эта операция, а декремент - уменьшение на единицу (так называемые комплиментарные операции). В простейшем случае, то есть в случае отсутствия в программе переходов, счетчик команд PC, начиная с команды "старта" (нулевой адрес), многократно инкрементируется, 12 последовательно активизируя все команды в памяти программ. Это означает, что в большинстве случаев, за каждый так называемый машинный цикл (такт работы программы: для ПИКов он равен четырем периодам тактового генератора) работы ПИКа, происходит исполнение одной команды. Есть и команды исполнение которых происходит за 2 машинных цикла (м.ц.), но их меньше. Команд, которые исполняются за 3 м.ц. и более нет. Таким вот образом, на большинстве участков программы (я их называю "линейными участками"), последовательно и перебираются адреса в памяти программ (команды последовательно исполняются).
В более сложных программах, с большим количеством условных и безусловных переходов, работу счетчика команд PC можно охарактеризовать фразой "Фигаро здесь, Фигаро там". 1 машинный цикл (м.ц.) равен 4-м периодам тактового генератора ПИКа. Следовательно, при использовании кварца на 4 Мгц., 1 м.ц.=1 мкс. Выполнение программы, в рабочем режиме (кроме работы в режиме пониженного энергопотребления SLEEP), никогда не останавливается, то есть, за каждый машинный цикл (или за 2, если команда исполняется за 2 м.ц.) должно выполняться какое-либо действие (команда). Тактовый генератор, формирующий машинные циклы, работает постоянно. Если его работу прервать, то исполнение программы прекратится.
Может сложиться ложное представление о том, что работу программы можно на какое-то время остановить, используя одну или несколько команд – "пустышек", не производящих полезных действий (есть такая команда NOP). Это представление не верно, так как в этом случае, речь идет только о задержке выполнения следующих команд, а не об остановке исполнения программы. Программа исполняется и в этом случае, так как "пустышка" есть та же самая команда программы, только не производящая никаких действий (короткая задержка). Если же нужно задержать выполнение каких-либо последующих команд на относительно длительное время, то применяются специальные, циклические подпрограммы задержек, о которых я расскажу позднее. Даже тогда, когда программа "зависает" ("глюк"), она исполняется, просто только не так, как нужно. Остановить (в буквальном смысле этого слова) исполнение программы можно только прекратив работу тактового генератора. Это происходит при переходе в режим пониженного энергопотребления (SLEEP), который используется в работе достаточно специфических устройств. Например, пультов дистанционного управления (и т.д.).
Отсюда следует вывод: программы, не использующие режим SLEEP (а таких - большинство), для обеспечения непрерывного выполнения команд программы, обязательно должны быть циклическими, то есть, иметь так называемый полный цикл программы, причем, многократно повторяющийся в течение всего времени включения питания. Проще говоря, рабочая точка программы должна непрерывно (не останавливаясь) "мотать кольца" полного цикла программы (непрерывно переходить с одного "кольца" на другое).
Общие выводы:
1. Команды программы "лежат" в памяти программ в порядке расположения команд в тексте программы.
2. Адреса этих команд находятся в счетчике команд PC и каждому адресу соответствует одна из команд программы.
3. Команда активируется (исполняется), если в счетчике команд находится ее адрес.
4. Активация команд происходит либо последовательно (на "линейном" участке программы), либо с переходом ("скачком") на другую команду (при выполнении команд переходов), с которой может начинаться как подпрограмма (переход на исполнение подпрограммы), так и группа команд, выделенная меткой (переход на исполнение группы команд, которой не присвоен "статус" подпрограммы).
5. Выполнение команд программы никогда не останавливается (за исключением режима SLEEP), и поэтому программа должна быть циклической.
Кроме памяти программ, PIC16F84A имеет энергонезависимую память данных (EEPROM память данных). Она предназначена для сохранения данных, имеющих место быть на момент выключения питания устройства, в целях их использования в дальнейшем (после следующего включения питания). Так же, как и память программ, память данных состоит из ячеек, в которых "лежат" слова. Слово памяти данных равно одному байту (8 бит). В PIC16F84A, объем памяти данных составляет 64 байта. Байты, хранящиеся в памяти данных, предназначены для их считывания в стандартные 8-битные регистры, речь о которых пойдет далее. Данные из этих регистров могут быть записаны в EEPROM память данных, то есть, может быть организован обмен данными между памятью данных и регистрами. Например, именно EEPROM память данных я использовал в своем частотомере для сохранения последних, перед выключением питания, настроек. Она же используется и для установки значений промежуточной частоты. Во многих программах, память данных вообще не используется, но это "вещь" исключительно полезная, и далее я расскажу о ней подробнее.
На сегодняшний день музыкальные магазины online, наподобие Musikload[1], становятся все более распространенными и пользуются бешенной популярностью. В этой статье мы расскажем как можно читать мета-информацию mp3-файла средствами PHP, что поможет вам в создании каталога музыки. Это очень просто, поддержка базы данных не нужна.
Откуда знает MP3-Player, например Winamp информацию об исполнителе или названии композиции, которую он проигрывает? Может быть, он сам каким-то чудным образом узнает название песни и альбома? Нет, здесь нет никакого волшебства! Подобная информация содержится в самих файлах. Музыкальные файлы других форматов таких как WMA или Ogg Vorbis также содержат подобную информацию, но здесь речь пойдет о файлах в формате mp3.
Спецификация mp3 определяет способ хранения музыкальных данных, однако не предусматривает никакой возможности для сохранения метаданных композиции, таких как название и исполнитель. Чтобы обойти это ограничение был разработан стандарт ID3. Согласно этой спецификации, метаданные должны быть помещены в так называемые ID3-теги, которые независимо от используемого стандарта ID3, помещаются в конец или начало файла. ID3-теги версии 1 (ID3v1-Tags) представляют собой простейшую конструкцию, которая дописывается в конец файла. Ее объем не должен превышать 128 байт. Структура тега такова: после строкового значения “TAG» следует информация о названии (30 символов), исполнителе (30 символов), альбоме (30 символов), годе записи (четырехзначное число), комментарий (30 символов), жанр (1 байт). Тег с подобной структурой обозначается как ID3v1.0-Tag. В дополнение к этому существует еще стандарт ID3v1.1-Tag, который встречается значительно чаще, поскольку позволяет сохранять информацию о порядковом номере композиции в альбоме. Вследствие этого был урезан до 28 символов размер комментария. Сразу после комментария следует нуль-байт, а последующий байт содержит информации о номере трэка. На иллюстрации один и два видна структура обоих стандартов.
PEAR придет на помощь!
Для считывания информации из ID3v1 тегов, в библиотеку PEAR уже был включен пакет MP3_Id[3], который поможет Вам без проблем извлекать информацию из тега, или наоборот записывать. Если в файл отсутствует ID3-тег, вы можете его создать. Листинг 1 показывает как можно считывать информацию из тегов. Создается объект класса MP3_ID, считывается файл, а затем метод getTag() извлекает данные, которые помещаются для дальнейшей обработки в отдельные поля объект. Листинг 2 показывает результат действия программы листинга 1. Общий обзор доступных полей вы найдете в документации по пакету на домашней странице PEAR.
Листинг 1:
Листинг 2:
Листинг 3 показывает как просто можно изменять содержимое ID3-тегов и создавать их. Сначала, как это было показано в Листинге 1, создаем объект класса MP3_ID, считываем файл, а с помощью метода setTag($fieldname, $value) помещаем в тег нужную информацию. Хотите удалить все теги? Тогда посмотрите на листинг 4, где показано как можно сделать это. Для удаления тегов используется метод remove(), а остальное вы уже знаете. Необходимо дополнить, что MP3_Id обладает другими полезными функциями, которые вам позволят перенести содержимое тега из одного файла в другой или сформировать массив, содержащий все музыкальные направления. Для получения дополнительной информации смотрите документацию.
Listing 3:
Listing 4:
Используем PECL
В конце лета 2004 года появилось расширение PHP ext/id3[7]. Разрабатывается в рамках PECL[6]. В отличие от MP3_ID эта библиотека написана не на PHP, а на C, поэтому она должно работать несколько быстрее. Однако библиотека не входит в стандартный комплект PHP-исходников, к тому же на сегодняшний день отсутствует стабильная версия, хотя функции отвечающие за чтение и запись ID3-тегов считаются стабильными.
Если вы хотите использовать именно это расширение, для установки необходимо воспользоваться либо PEAR-installer, либо откомпилировать php, включив поддержку данного расширения. Если вы используете WINDOWS, существует возможность скачать уже откомпилированную DLL для версии php 5.0 или 5.01 с сайта PHP-Snapshot[9], поместить ее в каталог с расширениями php (например c:phpext), подключить через php.ini. Чтобы воспользоваться расширением, вы должны иметь PHP 4.3 или более позднюю версию, поскольку библиотека использует Streams-API.
Само собой разумеется, библиотека позволяет изменять содержимое ID3-тегов. Для этого вам не нужно ничего, кроме массива, представленного в листинге 6, и функции id3_set_tag(). В качестве первого параметра функция принимает имя изменяемого mp-3 файла, а в качестве второго - массив с необходимыми данными. Третий параметр необязателен и представляет собой константу, указывающую версию ID3-тега. В существующей версии библиотеки функция id3_set_tag() может работать только с тегами версии 1.0 или 1.1. Листинг 7 содержит необходимый php-код. В дополнение к этому, листинг 8 показывает как с помощью функции id3_remove_tag можно удалить существующий ID3-тег.
Ext/id3 содержит еще несколько полезных функций, которые позволяют определить версию ID3-тега (id3_get_version) или манипулируют со списком музыкальных направлений и их id, представленных в виде целого числа типа integer. Надо сказать, что данное число мало подходит для указания музыкального направления.
Listing 5:
Listing 6:
Listing 7:
Следующее поколение
Несмотря на то, что с помощь ID3v1-тегов уже можно сохранять важнейшую информацию о содержимом mp3-файла, уже проявляются ограничения версий 1.0 и 1.1:
из-за фиксированного размера тега ограничен объем сохраняемой информации
ограничено количество сохраняемых атрибутов
Как мы видим, расширить объем пространства, отведенный под ID3v1 теги нельзя, Существую трудности с сохранением информации о названии композиции, исполнителе, альбоме, комментарии, если размер данных превышает 30 символов. Допустим, вам нужно указать название The Hitchhiker's Guide to the Galaxy, используя стандарт ID3v1, вы можете сохранить лишь The Hitchhiker's Guide to. Та же ситуации наблюдается с указанием музыкального направления. Для этого выделяется только один байт, вследствие этого количество музыкальных направлений не может превышать 256. Наверное, сегодня этого достаточно, но кто знает, сколько в будущем появится еще музыкальных направлений.
Чтобы преодолеть указанные ограничения был введены ID3-теги версии 2[2], или короче ID3v2. ID3v2-теги записываются в начало файла, собственно перед самими аудио данными. Информация организована в отдельные единицы, которые обозначаются как фреймы. ID3v2 - это формат-контейнер, то есть, существует возможность при изменении тега вводить новые фреймы. Из этого следует, что ID3v2 может содержать значительно больше информации, чем ID3v1. Это может быть информация об авторских правах, битрейте, (BMP) или, наконец, полный текст песни или изображения. В дополнение к этому можно по желанию добавлять новые фреймы. Вот важнейшие достоинства данного формата:
Никаких ограничений на объем сохраняемой информации
Гибкость и расширяемость
Возможность сжатия содержимого тегов
Поддержка Unicode
Возможность хранить бинарные данные, например изображения и файлы.
Из-за расширенных возможностей ID3v2-теги, несколько труднее поддаются считыванию, чем ID3v1-теги. Хорошая новость состоит в том, что ext/id3 уже позволяет извлекать важнейшую информацию. Если вы исполните код, помещенный в листинг 9, вы получите тот же результат, что и в листинге 10. Проделав это, вы сможете убедиться, что объем выводимых данных значительно шире, чем тот, что показан в листингах 5 и 6.
Каждый фрейм ID3v2-тега обладает уникальным ID. Ext/id3 содержит две функции, которые позволяют узнать содержимое фрейма. Это id3_get_frame_short() и id3_get_frame_long_name(). В качестве параметра они принимают id фрейма и возвращают его описание.
В будущих версиях ext/id3 будет содержать другие полезные функции, которые позволят считывать или записывать фреймы, соответствующие спецификации ID3.
Листинг 8:
Listing 9:
Дополнительная информация
Прежде чем вы организуете бизнес, связанный с продажей музыкальных композиций online, мы вам расскажем еще о нескольких полезных возможностях библиотеки MP3_Id. С помощью нее можно не только считывать информацию ID3- тегов, она позволяет получить некоторую интересную информацию о самом mp3-файле. Речь идет о битрейте, длительности звучания и других полезных свойствах. Подобные сведения можно получить при помощи метода study(), а дальше посредством метода getTag(), можно выбирать необходимые данные. Листинг 12 показывает как это работает. Результат работы программы показан в листинге 13. К сожалению, эти возможности недостаточно документированы, т.е. трудно разобраться какой атрибут можно считать при помощи getTag() или изменить посредство setTag(). В этом случае необходимо изучить код модуля MP3/Id.php.
Listing 10:
Listing 11:
Listing 12:
Listing 13:
Выводы
В этой статье мы рассмотрели существующие возможности извлечения информации из mp-3 файлов средствами PHP. Обе библиотеки (MP3_Id и id3) легки в использовании и содержать необходимые функции. Одна библиотека написана на PHP, другая на C. Выбор того или иного варианта определяется вашими предпочтениями и возможностями хостинга.
Авторы
Карстен Луке изучает информатику в высшей школе Бранденбурга. Совместно со Стефаном Шмидтом разработывает расширение id3. Вы можете связаться с ним по e-mail ( luckec@php.net ) или посетить его сайт ( www.tool-gerade.de ) Стефан Шмидт - разработчик веб-приложений фирмы 1&1 Internet AG, активно учавствует в развити PEAR и PECL. Вы можете связаться с ним по e-mail ( schst@php.net )
Конечно же вы попадали в такую ситуацию, когда приложение, разработанное вами ранее, могло быть снова использовано в рамках другого проекта. Вначале вы конечно же подумали, что это не создаст никаких проблем. Всего-то необходимо скопировать код из одного каталога в другой! Со временем вы осознали, что проекты могут различаться между собой различными параметрами, пусть даже самыми незначительными. Например, это может быть e-mail адрес на который отсылаются сообщения. В таком случае вам ничего не остается, как открыть множество файлов в редакторе и изменить их содержимое, вставляя нужный e-mail при помощи функции найти/заменить. Эта статья расскажет вам о том, как можно избавить себя от подобной работы, а так же порекомендует ряд дополнительных средств для создания и чтения конфигурационных файлов.
Повторное использование кода
Компьютер был изобретен для того, чтобы избавить человека от лишней работы. Развитие компьютерных технологий привело к тому, что человек стал стремиться все меньше времени проводить за компьютером. Допустим, вы программист. Не будь компьютера, вы бы остались без работы. Но в то же время вы стараетесь с помощью компьютера упростить свою ежедневную работы, с этой целью вы используете, например, функцию автозавершения кода в редакторе. Мы хотим подвести вас к той мысли, что код созданный вами, должен быть организован так, чтобы работы по его модификации были сведены к минимуму. Чаще всего это удается, когда вы создаете код, автоматизирующий рутинные операции, такие как создание и прорисовка формы, а так же отправка e-mail. Однако не стоит забывать, что функции для выполнения рутинных операций никогда не бывают на 100% идентичными в различных приложениях. Один формуляр не похож на другой, а сообщения электронной почты предназначены разным адресатам. Однако логика на уровне приложения остается прежней, функции различаются между собой только некоторыми параметрами. Таким образом, вы должны ясно представлять свою цель – разработать код, параметры которого можно было бы определять извне.
Модульная организация
Для решения этой задачи, планируя структуру приложения, вы должны позаботиться о модульности. То есть вам необходимо поместить часто используемые функции или классы в отдельный файл, который будет подключаться через require_once. В этом случае файлы приложения не будут наполнены избыточным кодом. Допустим, вы часто осуществляете запись в лог-файл. В таком случае было бы неплохо код, выполняющий эту операцию, заключить в рамки класса или функции. Будет еще лучше, если вы воспользуетесь уже готовым классом, взятым из какой-нибудь библиотеки исходных кодов, например PEAR.
Параметры процедурального кода
После того, как вы проанализировали код, выделили повторяющиеся фрагменты, распределили их по классам и функциям, необходимо подумать о выделении необходимых параметров, значения которых будут устанавливаться извне. Если речь идет о процедуральном коде, самым простым решением является использование глобальных переменных, которые необходимо определить в отдельном файле. Это позволит в дальнейшем без проблем изменять их значения.
Листинг 1 демонстрирует функцию, которая занимается отправкой e-mail. В ее теле содержится только одна php-функция - mail(). Таким образом, мы избавляемся от необходимости каждый раз указывать получателя при отправке сообщения. Следующая переменная, которую мы определяем, обозначает префикс, предшествующий теме сообщения. Конфигурационный файл, подключаемый через require_once, мог бы выглядеть следующим образом.
Listing 1
Есть способ лучше
Даже если рассмотренный выше способ и является действенным, однако это не самое лучшее решение. По мере того как код вашего приложения будет усложняться, вырастет и число опций, тогда могут возникнуть следующие проблемы:
Глобальные переменные, которые мы используем, могут породить конфликты в пространстве имен.
В том случае, если конфигурационные файлы редактируются не программистом, а дилетантом, в системе могут возникнуть синтаксические ошибки, например из-за незакрытых кавычек.
Для того, чтобы получить доступ к различным переменным, необходимо обращаться к массиву $_GLOBALS.
Вместо php-модулей существуют другие форматы, которые могут быть легко поняты и изменены дилетантами, а так же php-скриптами. Мы имеем в виду два формата: этого широко используемые операционной системой Windows ini-файлы, а так же формат XML.
PHP уже содержит функцию parse_ini_file(), которая без проблем читает ini-файлы. Такой файл имеет очень простую структуру. Каждой опции может быть присвоено только одно значение, а в качестве оператора присваивания используется знак равенства. Конфигурационный файл из предыдущего примера выглядел бы следующим образом в ini-формате.
После считывания ini-файла, имя которого передается в качестве параметра функции parse_ini_file(), мы получаем ассоциативный массив, имеющий вид:
В листинге 2 находится функция отправки почты, основанная на ini-файлах:
Listing 2
Если вы уже прочитали документацию по функции parse_ini_file(), вы кончено же заметили, что она может принимать и второй параметр. Он необходим, если вы хотите разделить ini-файл на несколько разделов или секций. Предположим, вам необходимо сохранить несколько настроек электронной почты. Тогда ini-файл будет выглядеть следующим образом:
"
Если вы при вызове parse_ini_file() передаете true в качестве второго параметра, в этом случае php будет искать в файле секции, а затем вернет многомерный массив, в котором каждой секции (errors и contact) будет соответствовать определенный набор значений:
Особые значения в ini-файлах
При использовании ini-файлов вы должны иметь в виду, что некоторые особые значения могут быть представлены строками. Допустим, вы определяете значение опции как true или yes (без кавычек), в таком случае они автоматически конвертируются в число 1, а false или no – в пустую строку. К сожалению, при этом не генерируется никакой ошибки. Поэтому не пытайтесь использовать no для сокращенного обозначения Норвегии.
Listing 3
Безопасность
Вы должны понимать то, что если конфигурационный файл используется для хранения важных данных, например паролей, необходимо позаботиться о том, чтобы содержимое такого файла не попало в web-браузер. Простейший выход из положения заключается в том, чтобы хранить конфигурационные файлы вне корневой директории сайта, например здесь: /etc/myApp/config
Если этого сделать нельзя, в таком случае можно изменить расширение файла. Для конфигурационного файла в формате модуля php необходимо всегда выбирать расширение .php. В этом случае сервер проанализирует php-файл, а пользователь увидит пустую страницу. С ini-файлами такое не пройдет, однако сервер Apache предоставляет возможность защитить данные. Просто поместите в каталог, где хранятся ini файл с именем .htaccess В него нужно поместить следующие строки:
Теперь сервер перестанет выдавать файлы с расширением ini, а опции приложения будут скрыты от пользователей.
Другие средства
Кончено же вы не являетесь единственным разработчиком, который сталкивается с проблемой обеспечения гибкости настроек веб-приложения. Поэтому некоторые программисты уже разработали библиотеки классов, которые переводят работу с конфигурационными файлами на абстрактный уровень, а так же упрощают запись и чтение различных форматов конфигурационных файлов.
PEAR::Config
Одним из классов, который может пригодится при чтении и записи конфигурационных файлов является PEAR::Config [3]. Как и все классы PEAR, PEAR::Config инсталлируется при помощи PEAR-Installer по команде
Этот класс является многоформатным, поскольку работает с конфигурационными файлами в форматах XMIL, ini, Apach-Style (гибрид XML и ini), а также php-массивами. Достоинством данного класса является то, что API для взаимодействия со всеми форматами одинаков. Т.е. логика работы с конфигурационными файлами в формате XML ничем не отличается от логики работы с ini-файлами. Вследствие этого необходимо, чтобы все форматы имели одинаковую структуру. Конфигурационные файлы, с которыми работает PEAR::Config, состоят, как и ini-файлы из секций.
Изменим снова наш пример. Сначала мы создаем объект Config, а затем вызываем его метод parseConfig(). Поскольку метод позволяет считывать различные форматы файлов, при вызове его необходимо передавать параметр, уточняющий формат. Для конфигурационных файлов в формате ini в качестве такого параметра используется строка iniFile. После считывания файла, мы не получаем опции в виде массива, вместо этого создается объект-контейнер, который дает доступ ко всем настройкам. Хотя во многих случаях бывает желательно получить опции в форме массива. Для этого используется метод toArray(). Листинг 4 демонстрирует считывание ini-файла:
Listing 4
С первого взгляда это может показаться несколько запутанным. Однако преимущество данного подхода заключается в том, что один и тот же метод используется для чтения всех форматов файлов, поддерживаемых PEAR::Config. Измененные опции могут быть также сохранены в любом формате:
Листинг 5 содержит код, где серия опций помещается в массив, который затем сохраняется в формате XML. Если вы хотите побольше узнать о PEAR::Config необходимую информацию вы сможете найти в документации по PEAR[5] или в DevShed-Tutorial [6].
Listing 5
patConfiguration
Альтернативным классом для работы с конфигурационными файлами является patConfiguration[7], однако он предназначен исключительно для работы с файлами в формате XML. После скачивания архива, его необходимо распаковать. Сам класс находится в директории include. patConfiguration предварительно определяет Tag-Set, который затем наполняется данными. К тому же этот класс предоставляет возможность указать тип опции: целое число, число с плавающей точкой, булевское значение. Типичный конфигурационный файл, созданный patConfiguration, имеет следующую структуру:
После создания объекта класса, может быть вызван метод parseConfigFile(). Доступ к опциям осуществляется через getConfigValue(). В качестве параметра этот метод может принимать путь к нужной опции. Вернемся к нашему примеру. Допустим, мы хотим получить e-mail адрес, на который высылается сообщение об ошибке. В этом случае используется путь errors.email. Если путь не указан, тогда все параметры передаются в массив. Листинг 6 демонстрирует код, который можно использовать для считывания файлов.
patConfiguration 2.0.0
В данный момент многоформатная версия patConfiguration находится в стадии разработки. Возможно, при публикации статьи эта версия уже станет доступной. Впрочем, самую новую версию для разработчиков вы можете скачать с сайта snaps.php-tools.net/downloaden.
В этом примере вы уже заметили, что внутри тега указывается тип значения. Названия типов идентичны тем, что используются в php-функции settype(). Если тип не указан, тогда значение интерпретируется как строка. Для часто используемых опций можно определить отдельный тег.
Наряду с функцией getConfigValue, существует функция setConfigValue(), с помощью которой можно изменить значение опции. Затем конфигурационный файл может быть заново записан с помощью writeConfigFile() (см листинг 7).
patConfiguration предлагает также серию дополнительных возможностей. Например, наряду с тегами, существует возможность определять атрибуты и пространства имен (Namespace), а к тегу можно привязать внешний файл, таким образом, опции будут распределены по нескольким файлам. Кроме этого patConfiguration включает систему кэширования, благодаря которой пропадает необходимость в многократном считывании конфигурационного файла.
Дополнительную информацию вы сможете найти на PHP Application Tools-Homepage и в patConfiguration-Tutorial на DevShed [8].
Listing 7
Заключение
Забота о гибкости настроек приложения может сберечь много времени, особенно если его компоненты предполагается использовать в других проектах. Вы потратите еще меньше времени, если доверите работу с конфигурационными файлами одному из готовых классов. Выбор между PEAR::Config и patConfiguration зависит от задачи. Преимуществом PEAR::Config является поддержка различных форматов конфигурационных файлов, в то время как patConfiguration прекрасно работает с XML, так же предоставляет ряд дополнительных возможностей. Однако с появлением версии 2.0.0 этот пакет будет иметь одинаковый API для считывания ini и wddx файлов. PHP-массив поддерживаются уже в текущей версии.
Поисковая оптимизация – одна из важнейших составляющих в продвижении сайта. И если вы вебмастер или блоггер, то вам в первую очередь нужно понимать основы SEO. Ниже приведены 10 простых правил по оптимизации, которые помогут вам подготовить ваш сайт к продвижению.
Правило 1: Не пытайтесь обмануть системы.
Если вы войдете в комнату, где будут одни ученые с докторскими степенями, думаете, вы сможете обмануть их? Нет. Так и Google имеет тысячи таких комнат с учеными, поэтому будьте уверены, что их обмануть вам не удастся. Избегайте любых советов, которые рассказывают, что вы сможете попасть в top5 за пару дней, при этом иметь великолепный сайт и уникальный контент.
Правило 2: Используйте ключевые слова.
Выберите несколько ключевых слов или фраз для вашего сайта. Используйте их, и слова связанные с ними в своих текстах, статьях. Повторять их постоянно – плохая идея (см. Правило 1).
Правило 3: Его величество «Контент».
Пользователей интересует содержание сайта, а не дизайнерские фишки. Если содержание сайта не уникально и не привлекает пользователей – не ждите их вообще.
Каждая страница вашего сайта должна строиться по схеме перевернутой пирамиды: начинаться с релевантного[1] заголовка H1, который обязательно содержит одно из ключевых слов; и первый абзац текста как краткое описание всей страницы.
Правило 4: Чистый код – правильный код.
Код вашего сайта должен быть читабелен для поисковых систем также как и для пользователей. Выделите основные блоки сайта: навигационное меню, заголовок, текст и т.д. Старайтесь использовать описательные названия классов и идентификаторов для тегов. Для списков используйте тег UL, для текста тег P, H1-H6 для заголовков, и STRONG для жирного текста (для ключевых слов и фраз). И конечно же, используйте верстку на DIV.
Правило 5: Самая важная страница – главная страница.
Как правило, в первую очередь нам необходимо, чтобы поисковые системы увидели главную страницу сайта. Поэтому ее содержание должно быть как можно более содержательным. Заголовки, текст и ссылки должны содержать самые важные ключевые слова, по которым пользователь обязательно будет ее искать.
Правило 6: Ссылки имеют значение.
Поисковые системы обращают особое внимание на ссылки и анкоры[2] ссылок. Старайтесь избегать таких ссылок как «Смотри здесь» или «Далее…». Лучше делать их неиндексируемыми. Анкор ссылки должен быть содержательным, т.е. краткий заголовок страницы на которую она ведет. Например: “Примеры и уроки для вебмастеров” или “Как сделать многоуровневое горизонтальное меню”. Не забывайте и об околоссылочном тексте.
Чем более релевантна ссылка, тем быстрее поисковая система найдет страницу с этой ссылкой. Не злоупотребляйте внешними ссылками[3], которые уведут пользователя на другой сайт. Если ваша страница ориентирована на дизайнерский минимализм, то ссылка на «Минимализм в дизайне» будет иметь место, а вот ссылка с картинки с кошкой будет бесполезной.
Правило 7: Заголовок заголовку рознь.
Каждая страница вашего сайта должна иметь свой уникальный заголовок – Title и краткое описание - Description. Достаточно всего 60 символов, но их значение будет огромным. Помните, что заголовок страницы – это то, что пользователь увидит в ответ на его поисковый запрос, поэтому по заголовку он должен понять найдет он ответ на вашей странице или нет.
Также не забывайте приписывать атрибут title у ссылок:
И атрибут Alt у изображений. Он также должен максимально кратко описывать то, что изображено на картинке:
Казалось бы мелочи, но для SEO это еще один важный способ оптимизации.
Правило 8: Лишним тегам – нет.
Давным-давно теги meta были секретом для SEO, но те дни прошли. Наиболее важным для поисковых систем и пользователей является тег description. Поисковые системы могут использовать его как подпись к ссылкам в результатах поиска. Поэтому убедитесь что вы дали грамотное описание каждой странице.
Правило 9: Карта сайта – лучший путеводитель.
Обязательно сделайте на вашем сайте карту сайта, которая будет содержать ссылки на все страницы сайта. Вы можете создать sitemap для Google с помощью генереаторов, например www.xml-sitemaps.com.
Правило 10: Дизайн – для людей.
Поисковые системы организованы так, чтобы пользователю было сразу понятно, что данный сайт - поисковик. Это значит, что и ваш сайт должен иметь дизайн, который будет говорить сам за себя, сразу давая понять какова тематика сайта. Поэтому чтобы сайт было легко найти, и он привлекал пользователей – сделайте его дизайн по максимуму приближенным к тематике сайта. Задача дизайнера – скорее решить проблему юзабилити, нежели нарисовать еще один шаблон для портфолио.
Думать о продвижении сайта надо еще до его создания. Все начинается с постановки задач и опредления целей. Многие люди, которые собираются продвигать (рекламировать) свой сайт в Интернет, не знают зачем им это, нужен ли им сайт вообще, не знают как оптимизировать свое детище для того, чтобы было возможным осуществлять его продвижение, чтобы достичь поставленных целей и отдых под Киевом, каталог баз отдыха. Если вы относитесь к ним, то это статья для вас.
Сразу хочу уточнить, что в этой статье речь не идет о несерьезных ресурсах вроде домашних страниц. Свое мнение о том, стоит ли рекламировать домашную страницу, почему и как, я высказала в первой части вводной статьи к разделу Реклама. Настоятельно рекомендую всем владельцем домашних страниц перечитать первую часть вводной статьи раз 20-ть, а лучше сто, прежде чем пускаться во все тяжкие.
Теперь, когда я погрозил пальцем недобросовестным гражданам для очистки своей совести, перейдем непосредственно к делу.
Прежде, чем создавать сайт вы должны понять, нужен ли он вам вообще. Зачем, что, для чего.
К неверным мотивам создания сайта можно отнести следующие:
* У всех есть сайт. Чем я хуже?
* Я создам самый лучший ресурс, он поразит воображение всех нынеживущих в интернет, я буду популярным, ко мне придет много людей!
* У наших конкурентов есть сайт. Сваяем и мы что-нибудь по быстрому. Полагаю, прайс-листа и контактов хватит.
* Я сделаю себе сайт, раскручу его, и срублю много денег, ничего особо не делая…
Если, вас сподвигает на создание сайта что-то вроде того, что я только что перечислила - то вам сайт еще не нужен, если вы коммерческая организация. Почему? Потому что цель коммерческого сайта помочь вам завязать и упрочить отношения, которые помогут развитию вашего бизнеса. Подход, чтобы было - это не серьезный, не деловой подход, с таким долго не живут. Что же касается остальных, тщеславных граждан с домашними страничками - куда они идут я уже указывала в самом начале этой статьи. Никогда не забывайте, что интернет - прежде всего информационная сеть, человек сюда приходит за информацией, ему нужна интересная и качественная информация, так зачем же плодить мусор?
К правильным мотивам создания сайта можно отнести следующие:
* Привлечение новых посетилей (для комерческой организации: клиентов, потенциальных клиентов).
* Расширить свой бизнес, увеличить прибыль.
* Получить поддержку, склонить людей и общественное мнение к чему-либо.
* Найти единомышленников по какой-либо проблеме, поделиться инересной и нужной информацией с другими.
Только, когда у нас есть определенная цель, только тогда можно и нужно создавать ресурс, опираясь на нее. Когда есть цель - есть возможность правильно продумать и осуществить разработку ресурса. А при правильно разработанном ресурсе уже можно совершать успешные действия по его продвижению.
Итак, как же правильно осуществить разработку сайта, если мы хотим, чтобы было потом возможным продвигать его в сети:
1. Определите цели вашего сайта. Зачем вы его создаете? (об этом мы уже поговорили).
2. Определите вашу стратегию. Что вы хотите достичь? Как вы собираетесь добиться своих целей? Какие приемы вы будете использовать, чтобы показать себя, чтобы удержаться и развиваться, чтобы продвигать свой сайт? У вас есть конкуренты (фирмы-конкуренты, другие информационные сайты, сообщества). Вам надо исследовать, что они предлагают, какие методы используют для продвижения своего ресурса. На основе исследования определить, какие методы будете использовать вы для продвижения своего сайта. При составлении плана также нужно учесть, какие ресурсы вы имеете в наличии (люди, деньги, знания, время и т.д.), чтобы добиться своих целей.
3. Определите аудиторию вашего сайта. Для кого вы его создаете? Какова целевая аудитория вашего сайта (например, деловая современная женщина, с доходом средний и выше от 20 до 40 лет). В зависимости от того какова ваша аудитория вы решаете какие сервисы вы ей предложите, какие материалы разместите на сайте, каким будет языком вестись изложение материалов (согласитесь, язык научного сайта неприемлим для сайта с детской аудиторией, если детский ресурс будет написан на слишком непонятном его аудитории языке, то популярностью он пользоваться никогда не будет). Если у сайта широкая аудитория, то можно сделать несколько крупных разделов для каждой группы посетителей. Для сайтов, где аудитория говорит на разных языках делается несколько версий на разных языках, причем язык изложения может адаптироваться в зависимости от страны (допустим, что считается приличным в одной стране, может вызвать возмущение у жителей других стран, нужно обязательно учитывать национальные особенности, чтобы не потерять потом посетителя).
4. Доменое имя. То, каков адрес вашего сайта, решает многое. Согласитесь, что сайт с адресом http://firma.com или http://community.com внушает гораздо больше доверия и уважения, чем http://narod.ru/tut/tam/firma или http://freehosting.com/was/here/community, первые два доменных имени говорят о серьезности фирмы или организации, о том, что завтра она никуда не исчезнет, это важно, особенно если учесть, что есть злоумышленники, которые любят пользоваться доверием людей, и поэтому люди стали сейчас гораздо осторожнее и настороженнее относится к предлагаемым им услугам и информации.
Более того, адрес http://firma.com легче продвигать в поисковых системах и рейтингах. Кроме того, адрес http://firma.com, гораздо легче запомнить, чем http://narod.ru/tut/tam/firma. Старайтесь, чтобы в названии домена присуствовало название организации. Имя домена = имя фирмы - очень легко запоминается. Если у фирмы или организации сложное имя, то имя домена может символизировать область деятельности фирмы или организации. Допустим, комбинату по производству хлеба со сложным названием “Комбинат №4 по производству хлебо-булочных изделий “Серебрянный бор” никак не подобрать запоминаемое сокращение, чтобы его можно было использовать в качестве доменного имени, но зато можно зарегистрировать домен типа: http://hleb.ru или http://bulka.ru - запоминаемо и связано с деятельностью предприятия.
5. Презентабельность. Внешний вид вашего сайта не должен отталкивать. Наооборот, он обязан быть привлекательным. Помните - по одежке встречают. Первое впечатление - очень важно. Если оформление вашего сайта отталкивающее, то вы можете потерять посетителя, он уйдет, даже не попытавшись ознакомиться с представленной информацией.
6. Удобство. Вся информация на сайте должна быть организована так, чтобы ее было легко находить, чтобы было легко ориентироваться по сайту. Навигация должна быть простой и понятной. Желательно, чтобы до самого дальнего подраздела можно было дойти не более, чем в несколько кликов. Струтура сайта должна быть четкой и ясной посетителю.
7. Нужная информация. Какой бы ни был ваш сайт просто информационный, посвященный какой-либо проблеме, или коммерческий сайт, предназначенный продвигать вашу компанию посредством Интернет, самое главное - это содержимое сайта. Ваш посетитель приходит к вам за информацией, и поэтому, разрабатывая содержимое сайта, вы должны подумать, какую информацию хотела бы получить ваша аудитория, какую информацию они будут искать. Желательно, чтобы информация была уникальная. Только присуствие уникальной информации или сервисов на ресурсе может привлечь к вам посетителя, только наличие постоянно добавляемой и обновляемой уникальной информации может привлечь и убедить его зайти к вам на сайт еще раз, и не один раз. Именно поэтому, даже коммерческой организации не стоит делать сайт из серии “прайс-лист+контакты”, потому что такой сайт практически никому не будет интересен и не приведет к организации новых клиентов. Зато интересный портал, связанный с сферой деятельности фирмы, это то, что нужно. Он привлечет много посетителей, которые потом могут стать клиентами фирмы.
8. Интересные сервисы и предложения. Конечно, не только информацией единой жив сайт. Обязательно нужно учесть необходимость создания связи с посетителем, в этом вам помогут форум, или гостевая книга. Иногда необходимо напоминать о себе своим посетителям, для этого возможно стоит ввести рассылку новостей вашего сайта, чтобы каждый желающий мог на нее подписаться. Но это все стандартные, хотя и нужные ходы. Нужно еще что-то оригинальное и инетересное. Предложите поучавствовать посетителям в жизни сайта. Например, на популярных сайтах с кулинарными рецептами, вы можете найти не только миллион и один рецепт, а также прислать свой собственный, ваш рецепт могут оценить и обсудить другие посетители сайта. Кроме того, периодически устраиваются конкурсы на лучший рецепт, с призами, незайтейливыми, но приятными.
Однако, такое возможно не только для некоммерческого ресурса. Подобные ходы может взять себе на вооружение сайт какой-нибудь ресторанной сети, расчитанной на обывателя с средним доходом. Сборник рецептов, возможность посетителям его пополнять, обсуждать, учавствовать в конкурсах - все это не только не повредить коммерческому сайту, но и поможет в продвижении компании не только в сети интернет, Сходить на выходные с семьей в любимый ресторан, на сайте которого вечерами общаешься с подругой - думаю, это может стать традицией для многих женщин.
Итог:
Главная выгода, которую вам дает интернет - это непосредственное общение с вашим посетителем (потенциальным клиентом). Задача хорошего ресурса (как коммерческого, так и нет) быть ближе к посетителю, соотвествовать его нуждам. Вы должны думать о своей аудитории - это единственно правильный подход. Реклама в интернет не сводится к банальной баннерной рекламе, рассылке е-майл, продвижению сайта компании или организации в поисковиках, рейтингах, каталогах - это далеко не основные способы, эти способы как раз не так эффективны, как хотелось бы, хотя их все равно не стоит сбрасывать со счетов. Основное - это как раз создание неких взаимоотношений со своей аудиторией. Таким отношениям есть даже определенное название - PR - что означает Public Relations - связь с общественностью. Именно PR - есть самый эффективный способ продвижения чего-либо в Интернет, именно благодаря Public Relations вы сможете добиться своих целей и извлечь выгоду для своей организации или компании.
В этой статье я лишь затронула тему PR, и надеюсь, это было для вас интересным и познавательным. По традиции в правой колонке вы найдете ссылки по теме, и сможете ознакомиться с ней дальше сомостоятельно.