Компоненты 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 вы можете получить доступ к .MDB-файлам Microsoft Access, используя драйверы ODBC. Delphi действительно может дать все необходимое, но некоторые вещи не столь очевидные. Вот шаги для достижения вашей цели.
Что вам нужно: Первое: проверьте, установлен ли ODBC Administrator (файл ODBCADM.EXE в WINDOWS\SYSTEM, вам также необходим файл DBCINST.DLL для установки новых драйверов и ODBC.DLL). Администратор ODBC должен присутствовать в Панели Управления в виде иконки ODBC. Если у вас его не было, то после установки Delphi он должен появиться. Если вы получаете сообщение типа "Your ODBC is not up-to-date IDAPI needs ODBC greater then 2.0", у вас имеется старая версия администратора и вы должны обновить ее до версии, включенной в поставку Delphi. Проверьте, имеете ли вы доступ к драйверу Access ODBC, установленному в Windows. Вы можете сделать это, щелкнув на "Drivers" в диалоговом окне "Data Sources", появляющемся при запуске ODBC Administrator. Delphi должна в диалоге добавить пункты Access Files (*.mdb) и Access Data (*.mdb), работающие с файлами Access 1.10 и использующие драйвер SIMBA.DLL (имейте в виду, что для данного DLL необходимы также файлы RED110.DLL и SIMADMIN.DLL, устанавливаемые для вас Delphi). Данные файлы должны поставляться с дистрибутивом вашей программы как часть ReportSmith Runtime библиотеки. Если вы хотите работать с файлами Access 2.0 или 2.5, вам необходимо иметь другой набор драйверов от Microsoft. Ключевой файл - MSAJT200.DLL, также необходимы файлы MSJETERR.DLL и MSJETINT.DLL. В США набор ODBC Desktop Drivers, Version 2.0. стоит $10.25. Он также доступен в январском выпуске MSDN, Level 2 (Development Platform) CD4 \ODBC\X86 как часть ODBC 2.1 SDK. Очевидно есть обновление этих драйверов для файлов Access 2.5 на форуме MSACCESS CompuServe. Имейте в виду, что драйвер Access ODBC, поставляемый с некоторыми приложениями Microsoft (например, MS Office) могут использоваться только другими MS-приложениями. К сожалению, они могут сыграть с вами злую шутку: сначала заработать, а потом отказать в совершенно неподходящий момент! Поэтому не обращайте внимания (запретите себе обращать внимание!) на строчку "Access 2.0 for MS Office (*.mdb)" в списке драйверов ODBC Administrator. Вы можете установить новые ODBC драйверы с помощью ODBC Administrator в Панели Управления.
Добавление источника данных ODBC (Data Source): если у вас имеются все необходимые файлы, можете начинать. Представленный здесь пример использует драйвер Access 1.10, обеспечиваемый Delphi. Используя ODBC Administrator, установите источник данных для ваших файлов Access: щелчок на кнопке "Add" в окне "data sources" выведет диалог "Add Data Source", выберите Access Files (*.mdb) (или что-либо подходящее, в зависимости от установленных драйверов). В диалоге "ODBC Microsoft Access Setup" необходимо ввести имя в поле "Data Source Name". В данном примере мы используем "My Test". Введите описание "Data Source" в поле Description. Щелкните на "Select Database" для открытия диалога "Select Database". Перейдите в директорию, где хранятся ваши Access .MDB-файлы и выберите один. Мы выберем файл TEST.MDB в директории C:\DELPROJ\ACCESS. Нажмите OK в диалоге "Setup". Теперь в списке источников данных (Data Sources) должен появиться "My Test" (Access Files *.mdb). Нажмите Close для выхода из ODBC Administrator. Используя этот метод, вы можете установить и другие, необходимые вам, источники данных.
Настройка Borland Database Engine: загрузите теперь Borland Database Engine (BDE) Configuration Utility. На странице "Drivers" щелкните на кнопке New ODBC Driver. Имейте в виду, что это добавит драйвер Access в BDE и полностью отдельное управление дополнительно к драйверам Access в Windows, устанавливаемым при помощи ODBC Administrator. В открывшемся диалоге Add ODBC Driver в верхнем поле редактировании введите ACCESS (или что-то типа этого). BDE автоматически добавит на первое место ODBC_. В combobox, расположенном немного ниже, выберите Access Files (*.mdb). Выберите Data Source в следующем combobox (Default Data Source Name), это должен быть источник данных, который вы установили с помощью ODBC Administration Utility. Здесь можно не беспокоиться о вашем выборе, поскольку позднее это можно изменить (позже вы узнаете как это можно сделать). Нажмите OK. После установки драйвера BDE, вы можете использовать его более чем с одним источником данных ODBC, применяя различные псевдонимы (Alias) для каждого ODBC Data Source. Для установки псевдонима переключитесь на страницу "Aliases" и нажмите на кнопку "New Alias". В диалоговом окне "Add New Alias" введите необходимое имя псевдонима в поле "Alias Name". В нашем примере мы используем MY_TEST (не забывайте, что пробелы в псевдониме недопустимы). В combobox Alias Type выберите имя ODBC-драйвера, который вы только что создали (в нашем случае ODBC_ACCESS). Нажмите OK. Если вы имеете более одного ODBC Data Source, измените параметр ODBC DSN ("DSN" = "Data Source Name") в списке "Parameters" псевдонима на подходящий источник данных ODBC Data Source, как установлено в ODBC Administrator. Имейте в виду, что вы не должны ничего добавлять в параметр Path (путь), так как ODBC Data Source уже имеет эту информацию. Если вы добавляете параметр Path, убедитесь, что путь правильный, в противном случае ничего работать не будет! Теперь сохраните конфигурацию BDE, выбирая пункты меню File|Save, и выходите из Database Engine Configuration Utility.
В Delphi: Создайте новый проект и расположите на форме компоненты Table и DataSource из вкладки Data Access палитры компонентов. Затем из вкладки Data Controls выберите компонент DBGrid и также расположите его на форме. В Table, в Инспекторе Объектов, назначьте свойству DatabaseName псевдоним MY_TEST, установленный нами в BDE Configuration Utility. Теперь спуститесь ниже и раскройте список TableName. Вас попросят зарегистрироваться в базе данных Access MY_TEST. Обратите внимание, что если бюджет не установлен, то User Name и Password можно не заполнять, просто нажмите на кнопку OK. После некоторой паузы раскроется список, содержащий доступные таблицы для ODBC Data Source указанного псевдонима BDE. Выберите TEST. В DataSource, в Инспекторе Объектов, назначьте свойству DataSet таблицу Table1. В DBGrid, также в Инспекторе Объектов, назначьте свойству DataSource значение DataSource1. Возвратитесь к таблице, и в том же Инспекторе Объектов установите свойство Active в True. Данные из таблицы TEST отобразятся в табличной сетке. Это все! Одну вещь все-таки стоит упомянуть: если вы создаете приложение, использующее таблицы Access и запускаете его из-под Delphi IDE, то при попытке изменения данных в таблице(ах) вы получите ошибку. Если же вы запустите скомпилированный .EXE-файл вне Delphi (предварительно Delphi закрыв), то все будет ОК. Сообщения об ошибках ODBC, к несчастью, очень туманные и бывает достаточно трудно понять его источник в вашем приложении, в этом случае проверьте установку ODBC Administrator и BDE Configuration Utility, они также могут помочь понять источник ошибки. Для получения дополнительной информации обратитесь к ODBC 2.0 Programmer's Reference или SDK Guide от Microsoft Press (ISBN 1-55615-658-8, цена в США составляет $24.95). В этом документе вы получите исчерпывающую информацию о возможных ошибках при использовании Access-файлов посредством ODBC. Также здесь вы можете найти рапорты пользователей о найденных ошибках, в том числе и при использовании Delphi. Более того, я выяснил, что большинство описанных проблем возникает при неправильных настройках ODBC, т.е. те шаги, которые я описал выше. Надеюсь, что с развитием технологии доступа к базам данных такие сложности уйдут в прошлое. Кроме того, имейте в виду, что если вам необходимо создать новую таблицу Access 1.10, вы можете воспользоваться Database Desktop, включаемый в поставку Delphi.
Авторы данной технологии Ralph Friedman (CompuServe 100064,3102), Bob Swart и Chris Frizelle.
Взято из Советов по Delphi от Валентина Озерова
--------------------------------------------------------------------------------
Может кто-нибудь, предпочтительно из персонала Borland, ПОЖАЛУЙСТА, дать мне ПОЛНЫЙ рассказ о том, как с помощью Delphi и сопутствующего программного обеспечения получить доступ и работать с базами данных MS Access. Среди прочего, мне необходимо узнать...
Нижеследующая инструкция в точности повторяет ту технологию, с которой я работаю на данный момент, надеюсь, что это поможет.
Драйвер ODBC, предусмотренный для доступа к Access 2.0, разработан только для работы в пределах среды Microsoft Office. Для работы со связкой ODBC/Access в Delphi, вам необходим Microsoft ODBC Desktop Driver kit, part# 273-054-030, доступный через Microsoft Direct за $10.25US (если вы живете не в США, воспользуйтесь службой WINEXT). Он также доступен в январском выпуске MSDN, Level 2 (Development Platform) CD4 \ODBC\X86 как часть ODBC 2.1 SDK. Имейте в виду, что смена драйверов (в частности Desktop Drivers) может негативно сказаться на работе других приложений Microsoft. Для информации (и замечаний) обращайтесь в форум WINEXT.
Также вам необходимы следующие файлы ODBC:
Минимум:
ODBC.DLL 03.10.1994, Версия 2.00.1510
ODBCINST.DLL 03.10.1994, Версия 2.00.1510
ODBCINST.HLP 11.08.1993
ODBCADM.EXE 11.08.1993, Версия 1.02.3129
Рекомендуется:
ODBC.DLL 12.07.1994, Версия 2.10.2401
ODBCINST.DLL 12.07.1994, Версия 2.10.2401
ODBCINST.HLP 12.07.1994
ODBCADM.EXE 12.07.1994, Версия 2.10.2309
Нижеследующие шаги приведут вас к искомой цели:
1. Используя администратора ODBC, установите источник данных (datasource) для вашей базы данных. Не забудьте задать путь к вашему mdb-файлу. Для нашего примера создайте источник с именем MYDSN.
2. Загрузите утилиту BDE Configuration.
3. Выберите пункт "New Driver".
4. Назначьте драйверу имя (в нашем случае ODBC_MYDSN).
5. В выпадающем списке драйверов выберите "Microsoft Access Driver (*.mdb)
6. В выпадающем списке имен выберите MYDSN
7. Перейдите на страницу "Alias" (псевдонимы).
8. Выберите "New Alias" (новый псевдоним).
9. Введите MYDSN в поле имени.
10. Для Alias Type (тип псевдонима) выберите ODBC_MYDSN.
11. На форме Delphi разместите компоненты DataSource, Table, и DBGrid.
12. Установите DBGrid1.DataSource на DataSource1.
13. Установите DataSource1.DataSet на Table1.
14. Установите Table1.DatabaseName на MYDSN.
15. В свойстве TableName компонента Table1 щелкните на стрелочку "вниз" и вы увидите диалог "Login". Нажмите OK и после короткой паузы вы увидите список всех имен ваших таблиц. Выберите одно.
16. Установите свойство Active Table1 в True и данные вашей таблицы появятся в табличной сетке.
С появлением и продвижением микрософтом OLE DB и реализацией в Дельфи ADO (начиная с версии 5.0) работа с MS Access через ODBC перестала быть актуальной. За исключением особых случаев рекомендуется пользоваться именно ADO линейкой компонентов для связи с MS Access
Доступность оборудования и простота организации делают беспроводные локальные сети всё более популярными. Даже небольшие компании стараются идти в ногу со временем и избавляются от традиционных кабельных "локалок". Использование беспроводных сетей не ограничивается небольшими офисами и домашними системами - крупные же фирмы применяют Wi-Fi для подключения к корпоративным сетевым ресурсам в тех местах, где технически невозможна прокладка кабелей.
Однако решение об устройстве беспроводной сети далеко не всегда оправданно, тем более что во многих случаях безопасности таких сетей уделяется слишком мало внимания. По оценкам специалистов, почти 70 процентов удачных хакерских атак через беспроводные сети связаны с неправильной настройкой точек доступа и клиентского программного обеспечения, а также с установкой чересчур низкого уровня безопасности при слишком сильном сигнале, с лёгкостью "пробивающего" стены офиса.
По каким-то необъяснимым причинам организаторы беспроводных сетей нередко считают, что при их включении автоматически обеспечивается надлежащий уровень безопасности. Производители оборудования, в свою очередь, устанавливают низкие настройки безопасности "по умолчанию", либо вовсе отключают их, чтобы при развёртывании сети клиенты случайно не столкнулись с невозможностью доступа. При минимальных настройках безопасность оборудование лучше всего совместимо с самым широким спектром других устройств и практически с любым современным программным обеспечением. Поэтому после настройки и проверки сети на совместимость с существующей инфраструктурой системный администратор должен изменить настройки безопасности, для того чтобы предотвратить несанкционированное проникновение в корпоративную сеть.
В отличие от проводных сетей, беспроводные требуют повышенного внимания к безопасности, поскольку проникнуть в них гораздо проще, поскольку для этого не нужен физический доступ к каналу. Радиоволны можно принимать на любое совместимое устройство, а если данные не защищены, то их сможет перехватить любой желающий. Разумеется, не стоит отказываться от паролей прочих традиционных средств авторизации, однако их явно недостаточно для защиты от несанкционированного доступа. Рассмотрим вкратце несколько способов повышения защищённости беспроводных сетей.
Отключаем передачу SSID
Последовательность цифр и букв, называемая SSID (Service Set Identifier) - это уникальный идентификатор вашей беспроводной сети. Передача идентификатора сети является встроенным средством защиты, по умолчанию включённым в большей части продающегося сегодня оборудования, и оно позволяет с лёгкостью обнаружить имеющиеся точки доступа в процессе развёртывания сети. Передача SSID требуется именно для того, чтобы ваше оборудование смогло подключиться к сети.
Точки доступа, которые являются базовыми станциями для подключаемых к сети компьютеров, являются потенциальным слабым местом, через которое злоумышленник может проникнуть в сеть. На уровне точек доступа отсутствует система авторизации по умолчанию, что делает внутренние сети незащищёнными, поэтому системные администраторы должны реализовать существующую корпоративную систему в беспроводных базовых станциях.
Для обеспечения повышенной безопасности можно запретить трансляцию точками доступа идентификатора сети. При этом возможность подключения к сети остаётся только у тех, кто знает правильный SSID, то есть, у сотрудников вашей компании, а случайные пользователи, обнаружившие вашу сеть при помощи сканирования, просто не смогут получить к ней доступ. Отключение передачи SSID возможно в подавляющем большинстве устройств ведущих производителей, что позволяет фактически скрыть вашу сеть от чужих. Если ваша сеть не передаёт идентификаторов, и если вы не афишируете использование беспроводной технологии, то этим вы осложните задачу злоумышленников. Подробные инструкции по отключению SSID обычно приводятся в руководствах по эксплуатации беспроводных точек доступа или маршрутизаторов.
Включаем средства шифрования
Уже давно используемое при пересылке важной электронной корреспонденции шифрование данных нашло применение и в беспроводных сетях. Для защиты данных от чужих глаз, в аппаратуре для беспроводной связи реализованы различные криптографические алгоритмы. При покупке оборудования важно убедиться в том, что оно поддерживает не только низкоуровневое 40-разрядное шифрование, но и 128-битный шифр повышенной стойкости.
Чтобы включить криптографическую защиту можно задействовать системы WEP (Wired Equivalent Privacy - "эквивалент проводной безопасности") или WPA (Wi-Fi Protected Access - "защищённый доступ к Wi-Fi"). Первая система менее стойкая, поскольку в ней используются статические (постоянные) ключи. Защищённые по этому протоколу сети взламываются хакерами без особого труда - соответствующие утилиты нетрудно найти в интернете. Тем не менее, по оценкам специалистов, даже этот протокол не задействован в более половины работающих корпоративных беспроводных сетей. Одним из средств повышения действенности WEP является регулярная автоматическая смена ключей, но даже в этом случае сеть не получает стопроцентной защиты. Попытки проникнуть в такую сеть оставят лишь случайные люди, обнаружившие её, но злонамеренных специалистов WEP не остановит, поэтому для полноценной защиты корпоративных сетей данный протокол использоваться не может.
В недалёком прошлом у организаторов беспроводных сетей не было иного выбора, как использовать протокол WEP, поддержка которого сохраняется в современных устройствах как в целях обеспечения совместимости оборудования, так и для обеспечения хотя бы минимального уровня безопасности в случае невозможности использования более современных протоколов. Сегодня WEP реализуется в двух модификациях: с 64- и 128-разрядным шифрованием. Однако корректнее было бы говорить о ключах длиной 40 и 104 бит, поскольку 24 бит из каждого ключа содержат служебную информацию и никак не влияют на стойкость кода. Однако это не столь важно, поскольку главным недостатком WEP являются статические ключи, для подбора которых злоумышленникам необходимо лишь в течение определённого времени сканировать сеть, перехватывая передаваемую информацию.
Повторим, что более-менее приемлемый уровень безопасность можно лишь при помощи регулярной смены ключей и при использовании 128-битного шифрования. Частота смены ключей зависит от частоты и длительности соединений, при этом необходимо обеспечить отработанную защищённую процедуру передачи новых ключей тем сотрудникам, которые пользуются доступом в беспроводную сеть.
Более эффективное шифрование обеспечивает протокол WPA, в котором реализовано динамическое создание ключей, что исключает возможность перехвата или подбора ключа, а также система идентификации (логин-пароль) при подключении к сети на основе протокола EAC (Extensible Authentication Protocol - "расширяемый протокол аутентификации"). В протоколе WPA 128-разрядные ключи генерируются автоматически при передаче каждых десяти килобайт данных, причём число этих ключей достигает сотен миллиардов, что делает практически невозможным подбор при помощи сканирования даже при отработанной методике перехвата информации. Кроме того, в этом протоколе реализован алгоритм проверки целостности данных MIC (Message Integrity Check), предотвращающий возможность злонамеренного изменения передаваемых данных. А вот выбору паролей следует уделять особое внимание: по мнению экспертов, для обеспечения высокого уровня безопасности длина пароля должна составлять не менее 20 знаков, причём он не должен представлять собой набор слов или какую-то фразу, поскольку такие пароли легко вскрываются методом словарного подбора.
Проблема с WPA заключается в том, что официально он был внесён в спецификации IEEE 802.11 лишь в середине 2004 года, поэтому далеко не всё беспроводное оборудование, выпущенное более полутора лет назад, способно работать по этому стандарту. Более того, если в сети есть хотя бы одно устройство, не поддерживающее WPA, будет применяться простое шифрование WEP, даже если WPA включён в настройках всего прочего оборудования.
Тем не менее, оборудование постоянно совершенствуется и в современных устройствах поддерживается новая, ещё более защищённая версия WPA2, работающая с динамическими ключами длиной 128, 192 и 256 бит. К таким устройствам, относится, например, трёхдиапазонный контроллер Intel PRO/Wireless 2915ABG.
Регулируем силу сигнала и его направленность
Технология беспроводной связи сама по себе по своей природе меньше защищена от постороннего вмешательства, поэтому при организации таких сетей особенно важно максимально затруднить несанкционированное проникновение в них. Среди чисто технических способов самым эффективным является снижение мощности транслируемого сигнала, ведь радиоволны с лёгкостью преодолевают стены зданий, а в сельской равнинной местности могут преодолевать весьма большие расстояния. Злоумышленники могут поставить свой автомобиль рядом со зданием, в котором расположен ваш офис, и в комфортной обстановке неторопливо подбирать ключ к вашей сети. Поэтому важно отрегулировать мощность сигнала, чтобы он не проникал за границы вашей территории. Кроме того, точки доступа следует располагать вдалеке от окон, внешних стен зданий, общих коридоров, холлов и лестниц.
Беспроводные сети являются очень удобным средством связи быстрого развёртывания, позволяющим объёдинить в сеть компьютеры даже в тех местах, где по тем или иным причинам невозможна прокладка кабеля. Однако поскольку незащищённые беспроводные сети куда проще поддаются взлому, чем проводные, следует уделять повышенное внимание защите от постороннего проникновения. Разумеется, стопроцентной гарантии безопасности дать невозможно, но некоторые действенные способы затруднения несанкционированного доступа в беспроводные сети мы описали в данном материале. Более подробные инструкции по реализации этих методов на практике обычно приводятся в документации к сетевому оборудованию, поэтому мы не ставили перед собой цели описать конкретные действия, тем более что они различаются в зависимости от модели и производителя беспроводных точек доступа и маршрутизаторов. Надеемся, что этот материал привлечёт внимание к проблеме обеспечения защиты беспроводных сетей.
Часто программисту приходится сталкиваться с задачей написания приложения, работающего в фоновом режиме и не нуждающегося в месте на Панели задач. Если вы посмотрите на правый нижний угол рабочего стола windows, то наверняка найдете там приложения, для которых эта проблема решена: часы, переключатель раскладок клавиатуры, регулятор громкости и т. п. Ясно, что, как бы вы не увеличивали и не уменьшали формы своего приложения, попасть туда обычным путем не удастся. Способ для этого предоставляет shell api.
Те картинки, которые находятся на system tray — это действительно просто картинки, а не свернутые окна. Они управляются и располагаются панелью system tray. Она же берет на себя еще две функции: показ подсказки для каждого из значков и оповещение приложения, создавшего значок, обо всех перемещениях мыши над ним.
Весь api system tray состоит из 1 (одной) функции:
Код:
Параметр dwmessage определяет одну из операций: nim_add означает добавление значка в область, nim_delete — удаление, nim_modify — изменение.
Ход операции зависит от того, какие поля структуры tnotifyicondata будут заполнены.
Обязательным для заполнения является поле cbsize — там содержится размер структуры. Поле wnd должно содержать дескриптор окна, которое будет оповещаться о событиях, связанных со значком.
Идентификатор сообщения windows, которое вы хотите получать от системы о перемещениях мыши над значком, запишите в поле ucallbackmessage. Если вы хотите, чтобы при этих перемещениях над вашим значком показывалась подсказка, то задайте ее текст в поле sztip. В поле uid задается номер значка — каждое приложение может поместить на system tray сколько угодно значков. Дальнейшие операции вы будете производить, задавая этот номер. Дескриптор помещаемого значка должен быть задан в поле hicon. Здесь вы можете задать значок, связанный с вашим приложением, или загрузить свой — из ресурсов.
Примечание
Изменить главный значок приложения можно в диалоговом окне project/ options на странице application. Он будет доступен через свойство application.icon. Тут же можно отредактировать и строку для подсказки — свойство application.title.
Наконец, в поле uflags вы должны сообщить системе, что именно вы от нее хотите, или, другими словами, какие из полей hicon, ucallbackmessage и sztip вы на самом деле заполнили. В этом поле предусмотрена комбинация трех флагов: nif_icon, nif_message и nif_tip. Вы можете заполнить, скажем, поле sztip, но если вы при этом не установили флаг nif_tip, созданный вами значок не будет иметь строки с подсказкой.
Два приведенных ниже метода иллюстрируют сказанное. Первый из них создает значок на system tray, а второй — уничтожает его.
Код:
Примечание
he забывайте уничтожать созданные вами значки на system tray. Это не делается автоматически даже при закрытии приложения. Значок будет удален только после перезагрузки системы.
Сообщение, задаваемое в поле ucallbackmessage, по сути дела является единственной ниточкой, связывающей вас со значком после его создания. Оно объединяет в себе несколько сообщений. Когда к вам пришло такое сообщение (в примере, рассмотренном выше, оно имеет идентификатор wm_mytraynotify), поля в переданной в обработчик структуре типа tmessage распределены так. Параметр wparam содержит номер значка (тот самый, что задавался в поле uid при его создании), а параметр lparam — идентификатор сообщения от мыши, вроде wm_mousemove, wm_lbuttondown и т. п. К сожалению, остальная информация из этих сообщений теряется.
Координаты мыши в момент события придется узнать, вызвав функцию api getcursorpos:
Код:
Обратите внимание, что при показе всплывающего меню недостаточно просто вызвать метод popup. При этом нужно вынести главную форму приложения на передний план, в противном случае она не получит сообщений от меню.
Теперь решим еще две задачи. Во-первых, как сделать, чтобы приложение минимизировалось не на Панель задач (taskbar), а на system tray? И более того — как сразу запустить его в минимизированном виде, а показывать главную форму только по наступлении определенного события (приходу почты, наступлению определенного времени и т. п.).
Ответ на первый вопрос очевиден. Если минимизировать не только окно главной формы приложения (application.mainform.handle), но и окно приложения (application.handle), то приложение полностью исчезнет "с экранов радаров". В этот самый момент нужно создать значок на панели system tray. В его всплывающем меню должен быть пункт, при выборе которого оба окна восстанавливаются, а значок удаляется.
Чтобы приложение запустилось сразу в минимизированном виде и без главной формы, следует к вышесказанному добавить установку свойства application.showmainform в значение false. Здесь возникает одна сложность — если главная форма создавалась в невидимом состоянии, ее компоненты будут также созданы невидимыми. Поэтому при первом ее показе установим их свойство visible в значение true. Чтобы не повторять это дважды, установим флаг — глобальную переменную shownonce:
Код:
Теперь у вас в руках полноценный набор средств для работы с панелью system tray.
В заключение необходимо добавить, что все описанное реализуется не в операционной системе, а в оболочке ОС — Проводнике (explorer). В принципе, и windows nt 4/2000, и windows 95/98 допускают замену оболочки ОС на другие, например dashboard или lightstep. Там функции панели system tray могут быть не реализованы или реализованы через другие api. Впрочем, случаи замены оболочки достаточно редки.
Для отправки электронного письма, без использования почтового клиента, мы будем использовать компонент TNSMTP, который находится на вкладке FastNet.
Компонент TNSMTP позволяет отправлять электронную почту через почтовый сервер или выполнять другие команды, описанные в стандарте RFC 821. Данный компонент работает по протоколу SMTP (Simple Mail Transfer Protocol). По стандарту RFC 821 протокол SMTP использует порт 25. При подключении к почтовому серверу необходимо знать учетную запись (login) своего почтового ящика. Чаще всего, имя пользователя - это начальная часть вашего почтового адреса – до символа «@». Так же для подключения к SMTP серверу необходимо знать его адрес. Адрес своего почтового сервера указывается при создании на нем почтового ящика. Стоит заметить, что адрес почтового ящика и адрес сервера – это совершенно разные вещи.
Создадим небольшой пример. Добавим на форму стандартную кнопку и компонент TNSMTP.
Собственно, Вы можете и не добавлять на форму данный компонент, а просто прописать его в строках Uses. Такой вариант очень полезен, если Вы пишете программу в «консольном» режиме.
Код:
Но этого мы делать не будем. В обработчик кнопки поместим код расположенный ниже.
Код:
Для корректной работы компонента необходимо заполнить свойства Host и Port. Для того чтобы подключиться к серверу, необходимо вызывать метод Connect, а для отключения - Disconnect. Главное свойство компонента TNSMTP - PostMessage. Это свойство содержит в себе информацию об отправляемом письме: ToAddress (адрес получателя), FromAddress (адрес отправителя), Body (текст письма), Subject (тема письма) и FromName (имя отправителя). После отправки письма необходимо отключиться от сервера, используя метод Disconnect.
Ваш сайт доходчиво объясняет посетителям, что заказывать нужно именно у вас, а не у ваших конкурентов? На нем хорошо видны контакты, а сделать заказ легко? Есть ли у вас возможность отслеживания активности посетителей и коэффициента конверсии? И последнее: вы знаете, сколько стоит ваш посетитель? Если вы смело можете ответить "да" на эти воспросы - ваш сайт готов к приему посетителей. Если нет - проработайте их, иначе много денег будут уходить впустую.
Все хотят "бесплатный" (поисковый) трафик, но находиться в топе поисковых систем - очень трудоемкое занятие. Однако, если вы создадите богатый контентом сайт и последуете советам из этого списка, ваш трафик будет увеличиваться сам собой и PR будет расти.
*Pay-Per-Click (PPC) - оплата за клики. Трафик с PPC-систем можно получить почти мгновенно! Google и Overture (теперь еще и Yahoo) - вот основные источники PPC-трафика, но можно попробовать и FindWhat.com. На что следует обратить внимание: Держите в голове цену своего посетителя, ставьте объявления по сотням неконкурентным ключевым словам и фразам, и отслеживайте статистику по каждому слову или фразе отдельно.
*Распространяйте свой контент в сети - пишите полезные статьи, интересные целевой аудитории. Распространяйте их среди веб-мастеров, разрешите им перепечатывать ваши тексты в обмен на размещение ссылки на ваш ресурс вида "источник: " или "по материалам сайта: ". Распространяйте ваши статьи и через каталоги статей, электронные журналы и ваш блог. На что следует обратить внимание: полезное, по возможности уникальное, содержание статей.
*Публикуйте свои пресс-релизы - периодически публикуйте пресс-релизы с новостями, которые будут интересны вашей целевой аудитории и вашим потенциальным покупателям. Поскольку пресс релизы это, фактически, новости, они публикуются быстро, и вы можете так же быстро заполучить сотни ссылок на свой сайт. На что следует обратить внимание: желательно писать пресс-релиз из 300-500 слов, и включить в него ссылку на свой ресурс. Желательно доверить распространение релизов профессионалам, которые смогут оптимизировать их по ключевым словам.
*Сделайте блог с RSS - чтобы приносить пользу, блог должен часто пополняться новыми материалами. Пусть ваш блог содержит информацию, полезную для ваших покупателей, но не заостренную на продажах и специальных предложениях. Последнее нужно делать очень аккуратно, мы советуем вообще заострять на продажах внимание, если не можете посвятить этому достаточное количество времени. Seth Godin говорит, что составляющие успешного блога это: (1) Беспристрастность, (2) Мгновенное реагирование, (3) Своевременность, (4) Тематичность - коротко и "в кассу", и (5) Дискуссия, полемика. На что следует обратить внимание: блог должен быть интересен посетителям, добавьте его во все каталоги блогов, проверяйте ваши блоговые посты в поисковиках, распространяйте свой контент через RSS.
*Набирайте односторонние входящие ссылки - все вышеперечисленное создаст хорошие входящие односторонние ссылки на ваш сайт, хотя Вы можете дополнительно покупать ссылки на других сайтах, напрямую и через биржи ссылок. Не занимайтесь обменом ссылками - от этого уже никакого толка. Убедитесь, что ссылки на ваш сайт ведут со страниц, PR которых выше 0. Если у страницы PR0, возможно Google пессимизировал ее по каким-либо причинам, в результате ссылка может нести в себе отрицательную силу. На что следует обратить внимание: удостоверьтесь, что в текстах входящих ссылок есть ключевые слова, и что ссылки текстовые. Ссылки должны быть с тематических и околотематических сайтов, а не с линкопомоек или немодерируемых каталогов. Лучшие ссылки - со страниц, количество ссылок на которых невелико.
*Разрешите другим сайтам использовать ваши материалы. Разрешайте им делать это до тех пор, пока они будут ссылаться на вас. Это позволит вам получить одностороннюю ссылку с сайтов, который бы не согласились поставить ее в других случаях. На что следует обратить внимание: старайтесь вести диалог с вебмастерами кратко, и по делу.
*Реклама через E-mail - Рекламируйтесь в электронных журналах, размещайте рекламу в почтовых рассылках, если среди получателей есть ваша целевая аудитория. На что следует обратить внимание: внимательно отслеживайте эффективность рассылок.
*Используйте возможности партнеров по бизнесу. Рекламируйтесь, используя базу клиентов ваших партнеров. John Reese продал информационный товара на $1 млн. за 24 часа, используя только базу клиентов своих партнеров, рассылая им свои предложения. Он платил партнерам 50% с продаж. На что обратить внимание: нужно знать цену своего посетителя, и хорошо проверить в действии точку продаж перед тем, как обращаться к партнерам с предложениями.
*Заведите партнерскую программу. Если Вы продаете что-нибудь, предложите партнерам комиссию за каждого привлеченного покупателя. Ссылки с сайтов партнеров будут приводить на сайт посетителей, а также увеличивать вес сайта в глазах поисковиков. На что следует обратить внимание: предложение должно быть привлекательным, обеспечьте партнеров всеми рекламными и сопуствующими материалами, дайте им доступ к статистике, чтобы они могли отслеживать переходы и активность посетителей самостоятельно, сделайте регистрацию в партнерской программе легкой. Дайте им проверенные баннеры, рекламные письма и другой инструментарий, облегчающий их задачу.
*Покупайте готовые, хорошо раскрученные сайты. Найдите сайты, которые занимают высокие позиции по вашим запросам в поисковиках, проверьте качество трафика через владельцев этих сайтов и принимайте решение о покупке. Позаботьтесь о том, чтобы права собственности на домен полностью принадлежали Вам. Вы можете разрешить бывшим владельцам использовать контент сайта, если хотите. Проверьте deleteddomains.com на предмет доменов, брошенных владельцами, которые можно зарегистрировать всего за несколько долларов. На что обратить внимание: проверьте Google PR, Alexa rank, и бэклинки сайтов до их покупки. (Я знал одного продавца, который поспорил с профессиональными оптимизаторами на предмет того, кто займет самое высокое место в поисковике за 24 часа. Он выиграл спор, просто купив сайт, который занимал первое место).
И напоследок то, с чего начинается большинство статей...
*Поисковая оптимизация (SEO). Здесь есть много технических моментов, которые следует изучить, если Вы собираетесь оптимизировать сайт самостоятельно, поэтому я советую нанять профессионала, который все сделает за вас. Не доверяйте тем, кто гарантирует вам первые места, потому что нельзя гарантировать высокие позиции в Google или Yahoo, потому что алгоритмы постоянно меняются. (Они могут гарантировать места в топе по словосочетаниям типа названия вашей компании, но это не конкурентная фраза, и она не принесет особого толка). Дизайн и структура вашего сайта - также обратите на это внимание.
3 кита поисковой оптимизации это:
*Контент
*Тематические внешние ссылки с хорошим PR
*Правильный дизайн сайта
Все перечисленное в этих 10 пунктах помогает и с контентом, и с односторонними входящими ссылками, поэтому остается только хороший дизайн. На что следует обратить внимание: не думайте о сайте как об одной странице, думайте о сайте как о сотне оптимизированных страниц, с определенной тематикой и интересных целевой аудитории.
Как вы знаете, большинство скриптов, представленных в Web, ориентированы на работу с пользователем. Но для того, чтобы её начать, нужно, как правило, заполнить форму (в Интернете они встречаются повсеместно). Наивно полагать, что искушенный юзер с первого раза выдаст правильную, а главное корректную, информацию о себе. Конечно, правильность его имени и реальность земного адреса проверить мы не сможем, но вот то, как они введены, пожалуйста.
Представим, нам нужно создать программу, спрашивающую у посетителя его имя, e-mail. А также попросим придумать пароль и ввести по желанию комментарий. Если вы знакомы с HTML, то должны знать, что каждое поле в форме должно иметь имя. Итак, имена: name (Имя), mail (E-mail), password (Пароль), rpassword (Повторный пароль), comment (Комментарий). Для тех, кто ничего не понял, приведу исходный код нашей формы (кстати, его мы будем вставлять прямо в код PHP):
Фрагмент form.php
Непонятная с первого взгляда строка <input type = hidden name = seenform value = yes> поможет нам узнать, заполнялась ли форма данным пользователем или ещё нет. А вот значение $form = "…" объясняется тем, что мы собираемся интегрировать форму напрямую с PHP.
Теперь, когда готова основа, можем начинать её наполнение. Вспомним про поле с именем "seenform". Итак, вот зачем оно было нужно:
Если значение формы не равно ‘yes’, отобразить форму. В обратном случае работает код, следующий за словлм else. Форма заполнена, можно начинать проверку. Но для начала условимся, что
1. Кол-во символов в поле «Имя» и «E-mail» не больше, чем 40;
2. Кол-во символов в поле «Пароль» не меньше, чем 3;
3. Кол-во символов в поле «Комментарий» не больше, чем 450;
4. «Пароль» должен состоять только из латинских букв или цифр;
5. Все поля, кроме «Комментарий» должны быть заполнены!
Проверка на заполнение полей:
Переменная $er = 1 значит, что была ошибка. В конце проверки мы это учтём.
Мне приходится часто менять клиентов, потому что работаю удаленно. Сделал одному – иди к другому. А еще я продаю свои программы через Интернет. При имеющейся специфике работы, заметил одну странность: примерно в двадцати пяти процентов случаев, предприятие, оплатившее работу программиста и принявшее его работу, не пользуется ею.
Начну с примеров
Фирма, продающая компьютеры, купили внушительный комплект программного обеспечения, все своевременно оплатили, купили необходимое торговое оборудование... Мы, соответственно, все им установили и приготовились запускать. Остановились на этапе, когда сотрудники фирмы, ответственные за ввод в эксплуатацию нового программного комплекса, должны внести в информацию по имеющимся в отделах остаткам. Для справки – это примерно пара сотен наименований. Но на этом все работы по проекту остановились, потому что остатки не были внесены к намеченному сроку, ни через неделю после срока, ни через месяц. Не внесены они и до сих пор, хотя прошло уже пол года. Официально мы договорились, что клиент нам позвонит, когда сотрудники освободятся и найдут время внести остатки. Сами понимаете, на небольших фирмах менеджеры – по совместительству еще и продавцы, еще и грузчики, и кассиры…
Еще пример
Достаточно крупный комбинат решил автоматизировать учет обедов собственным сотрудникам в счет зарплаты. Систему подготовили, протестировали, поставили. Обучили их специалиста. Все как обычно. Недавно узнал, что конечный пользователь нашу систему не использует. Оказывается, по весьма банальной причине: на приобретение нового компьютера руководство не выделяет средств, а на имеющемся оказалось недостаточно мощности. В свое время мы указывали им на необходимость более мощного компьютера, но в силу не совсем понятных мне внутренних интриг, этот вопрос был замят на уровне IT-отдела. В результате, автоматизация стала не эффективной, и от использования новой программы решено было отказаться.
Третий пример
Производственная фирма заказала автоматизацию учета. От фирмы был назначен специалист – постановщик ТЗ и в будущем - внедренец. Работу сделали, сдали, провели обучение внедренца (на углубленное внедрение и обучение нами всех сотрудников не выделили бюджет). Я перезвонил клиенту через пол года, чтобы узнать, не было ли замечено каких-либо багов в работе системы. С удивлением услышал, что учет по-прежнему ведется в Excel-е, потому что на глубокое, самостоятельное освоение новой системы у сотрудников нет времени, а специалист, которого мы обучали, уволился…
Хотелось бы обобщить имеющийся, скромный опыт по таким случаям, и порассуждать на тему, когда автоматизация учета становится не эффективной по вине заказчика.
Уже из приведенных примеров можно сделать одно важное заключение: во всех трех случаях явно, что администрация не была заинтересована в результате. В первом – директор не захотел останавливать продажи даже не день, чтобы довести начатое до конца, во втором и третьем был урезан бюджет, и решили сэкономить там, где этого делать было нельзя.
1. Незаинтересованность руководства в результатах
Для меня всегда было загадкой, зачем руководство той или иной фирмы вообще тратится на автоматизацию, если отчетов в excel-е достаточно, и нет желания доводить начатое до конца? Чего дирекция хочет добиться? Дань моде? Надоел ноющий главбух? Решили, что что-то пора менять, но что менять – не выяснили? Стоит напомнить, что грамотно поставленная автоматизация учета в торгово-производственных фирмах способна увеличить прибыль и уменьшить затраты. Хорошая автоматизация окупается достаточно быстро, и уже скоро начинает приносить прибыль и экономию. Но если руководство не оценило перспектив автоматизации или, что еще хуже, считает, что новый стол из красного дерева топ-менеджеру важнее нового сервера сисадмину, то вряд ли на такой фирме автоматизация будет успешной.
2. Ограниченный бюджет
Как правило, из первого следует второе. Когда руководство не совсем отдает себе отчет в том, чего они ждут от автоматизации, тогда возникают идеи, наподобие: «а давайте пригласим студента, и он все сделает, как надо», или «давайте посадим главбуха на сервер»... Я, конечно, не против подработки студентов и не сомневаюсь в потенциале российского студенчества, но хочу лишь сказать о том, что для внедрения серьезной системы учета простого умения программировать очень мало. Хороший внедренец должен уметь просчитать возможные последствия выбора той или иной стратегии автоматизации. Это достаточно кропотливая работа, требующая, прежде всего, большого практического опыта, понимание не только специфики учета предприятия, но и его неочевидных нюансов. В конце концов, такая работа требует настойчивости, потому что часто решения внедренцев могут встретить сопротивление со стороны заказчика, и нужно уметь отстоять свои предложения, основываясь, опять же, на собственном опыте, защищая интересы сопротивляющегося клиента. Вряд ли какой-либо студент, понимающий, что занимается временным, не свойственным ему делом, способен на такое. Поэтому, считаю, что экономия на уровне исполнителя – это почти гарантия неудавшейся автоматизации.
Это же относится и к неоправданной экономии на оборудовании. Как правило, сбой системы происходит в самом слабом ее звене и в самый неподходящий момент… Помню, как у одного моего клиента, смотрящего «сквозь пальцы» на предложение обновить сервер, этот сервер вдруг однажды сгорел, когда бухгалтерия делала годовой отчет. Печально было то, что архивирование данных не велось должным образом, опять же, не смотря на рекомендации: директор считал покупку пишущего cd-room (в то время) – не особенно необходимыми затратами. Систему, конечно, восстановили. Но я помню, как бухгалтерии пришлось две недели работать чуть ли не по ночам, чтобы восстановить потерянные за год данные по первичным документам. Кстати, после этого случая руководство все-таки купило в то время жутко дорогой сервер с райд-массивом…
3. Тендер на откатах
Где-то встречал в сети примерную статистику, какой процент тендеров на IT услуги в России выигрывается за счет откатов ответственному лицу. Статистика – не утешительна. Печально, что на откаты попадают в основном крупные заказчики, где сумма договора внушительна, и руководство напрямую не занимается подбором исполнителя, а поручает это собственному специалисту, который не всегда бывает доволен уровнем своей заработной платы. Практика показывает, что при таком раскладе, все работы бывают выполнены в срок, все документы подписаны, но сотрудники фирмы остаются недовольны результатами и не могут использовать внедренную систему в планируемом объеме по разным причинам. Соответственно, руководство не имеет требуемой аналитической базы и начинает выяснять, в чем причина. Такие разбирательства затягиваются надолго, часто сопровождаются кадровыми движениями и, в конечном итоге, поисками того, кто бы систему довел до ума…
4. К вопросу о лидерах отрасли
Хотел бы привести еще один пример, достаточно типичный. Фирма готова тратить деньги на автоматизацию, но не сориентировалась на рынке IT-услуг и обратилась к кому-то очень известному. В результате затраты превысили все разумные пределы, а итог оказался не совсем ожидаемым, хотя, возможно, приемлемым с натяжкой.
К сожалению, это только при покупке автомобиля можно руководствоваться рекламными буклетами, и, если позволяют средства, выбирать самое последнее из модельного ряда. В сфере IT-услуг, как показывает практика, все далеко не так, особенно в сфере автоматизации на базе продуктов фирмы «1С» фирмами-франчайзи. Если исполнитель – не на уровне масштабов компании «Intel Corporation», то его раскрученность совсем может не соответствовать качеству предлагаемых им услуг, а объемы клиентской сети, требующей постоянного сопровождения, могут не позволить заниматься новым клиентом на должном уровне. На фоне этого, стоило бы вспомнить о небольших фирмах, менее раскрученных, а потому не выигравших тендер, которые были бы просто счастливы получить крупного заказчика IT-услуг, даже с меньшей суммой договора, и были готовы отдать все силы на то, чтобы клиент остался доволен. Амбиции небольших коллективов, уровень их специалистов и заинтересованность в результатах работы часто оказываются выше, чем у раскрученных, больших компаний. Небольшие фирмы не могут допустить в работе того, что позволят себе монополии, потому что любая неудача может грозить такой фирме банкротством.
Я назвал лишь четыре, пожалуй, основных фактора, когда автоматизация не достигает результатов, и присходит это, отчасти, по вине заказчика. Наверняка, имеются и другие причины, но корень проблем, на мой взгляд, следует искать, прежде всего, в неправильной позиции руководства компании, которая выражается или в непонимании, зачем нужна автоматизация, или в неправильно выбранной стратегии решения этого вопроса. Там, где решения принимаются трезво и взвешенно, где оценивается уровень специалиста, а не его раскрученность на рынке, где руководство четко понимает, чего оно ждет от автоматизации в итоге – там все будет нормально, чего всем и желаю…
Flash и трехмерная графика, становятся всё более популярными и востребованными. Программа Swift 3D совместила в себе обе популярные технологии. В пятой версии возможности программы вплотную приблизилась к настоящему 3D-редактору и при этом она не стала громоздкой. Программа не требует от пользователя знаний программирования так же, разработчикам удалось сделать ее легкой в освоении даже для того, кто никогда не имел дело с 3D.
Два в одном, флеш и 3D.
Flash и трехмерная графика, становятся всё более популярными и востребованными. Программа Swift 3D совместила в себе обе популярные технологии. В пятой версии возможности программы вплотную приблизилась к настоящему 3D-редактору и при этом она не стала громоздкой. Программа не требует от пользователя знаний программирования так же, разработчикам удалось сделать ее легкой в освоении даже для того, кто никогда не имел дело с 3D.
Для того чтобы начать работу с программой, необходимо знать «азбуку» создания трехмерной графики. Во-первых, на основе простейших трехмерных объектов строятся трехмерные модели. Затем, для этих моделей настраивается освещение, подбираются материалы. На следующем этапе, если это необходимо, создается анимация и, наконец, последний этап – сохранение визуализированного изображения или анимации в файл.
Scene Editor.
На этапе работы с редактором сцены, выполняется общая настройка объектов, задаются геометрические размеры, выбирается их положение и освещение.
В программе можно использовать стандартный набор простейших шаблонов. Помимо этого, в сцену можно импортировать трехмерные модели в формате 3ds, а также изображения в векторном формате. Такие изображения будут автоматически открываться как трехмерные объекты.
Один из самых востребованных типов объектов, который часто используется при создании логотипов это текст. Для получения объемного текста в каком-нибудь полноценном 3D-редакторе (например, в 3ds Max) сначала нужно создать 2D-форму, а затем придать ей объемность при помощи модификатора Bevel или Extrude. В Swift 3D этот процесс упрощен – текст становится объемным сразу же после нажатия кнопки Create Text. Используя панель свойств, можно выбрать профиль фаски, подходящую гарнитуру шрифта и задать другие параметры.
Несмотря на то, что в программе есть базовый набор 3D-объектов, разработчики также предоставили пользователю возможность создавать трехмерные модели самостоятельно. В зависимости от того, какой метод будет выбран, можно использовать одну из вкладок - Extrusion Editor, Lathe Editor или Advanced Modeler.
Extrusion Editor.
Принцип работы редактора выдавливания, прост: создается некоторая сплайновая форма, которая используется для создания трехмерного объекта с заданным сечением. Такой метод очень удобен для моделирования предметов, имеющих постоянное поперечное сечение вдоль одной из осей.
Принцип построения сплайна по точкам мало чем отличается от создания кривой в любой программе для векторной графики. Для каждой точки можно выбрать один из трех типов излома, а форму линии можно корректировать с помощью касательных. На панели инструментов редактора выдавливания можно найти инструмент для замыкания кривой, а также кнопки для быстрого создания 2D-форм самых распространенных типов: звездочки, стрелки, значка "плюс" и прочих.
Чтобы увидеть результат работы с этим инструментом, нужно вернуться на этап работы с редактором сцены.
Выдавливание можно также производить со скосом, что даст возможность получить несколько иной профиль конечной модели.
Lathe Editor
Еще один инструмент для создания трехмерных поверхностей, на этот раз образованных вращением профиля вокруг некоторой оси. Lathe Editor напоминает редактор выдавливания. Тут опять требуется создать кривую определенной формы, основные инструменты те же самые, разве что нет кнопок для быстрого создания кривых часто используемой формы.
В окне редактора поверхностей вращения следует нарисовать профиль, который будет иметь будущая трехмерная модель. Затем нужно перейти на вкладку Scene Editor и при необходимости настроить параметры созданного объекта, например, указать угол поворота профиля модели или определить число радиальных сегментов. Если в строке Sweep Angle изменить угол, заданный по умолчанию, поверхность вращения будет незамкнутой.
Интересно, что и при работе с редактором выдавливания, и при использовании редактора поверхностей вращения можно анимировать форму кривой.
Advanced Modeler
Режим Advanced Modeler – это настоящая гордость Swift 3D. Главная особенность этого режима – редактирование оболочки трехмерных объектов. Перед вами раскрываются неограниченные возможности управления их формой.
Для перехода в режим редактирования оболочки используется кнопка Edit Mesh. После этого на панели инструментов становятся активными кнопки для редактирования модели на разных уровнях подобъектов.
Можно выделять вершины, ребра, поверхности, а затем выполнять с выделенными подобъектами разные действия, такие как выдавливание, уплотнение сетки, зеркальное отражение, округление и пр.
Возможность работы в режиме редактирования поверхности дает еще одно преимущество – появляется возможность использовать разные материалы для разных частей объекта.
Добавление материалов
После завершения работы над формой объекта нужно выбрать для него материал. Материалы в Swift 3D выбираются исходя из имеющихся в наличии заготовок, которые находятся в палитре материалов. Библиотека пестрит разнообразием. Материалы разделены на несколько категорий: с прозрачностью, блестящие, имитирующие дерево, кирпич, мрамор, камень и т.д.
Назначается материал очень просто: нужно перетащить выбранный образец на объект. При необходимости, настройки материала можно подкорректировать. Для этого нужно дважды щелкнуть по образцу. Можно создать и собственный материал, используя для этого растровое изображение.
Освещение и камеры
Разработчики Swift 3D уделили достаточно много внимания системе освещения. По умолчанию, в виртуальном пространстве используется двухточечная система освещения, причем, положение источников света, добавленных программой по умолчанию, можно изменять (в большинстве 3D-редакторов такой возможности нет). Для этого используется схематический трекбол с двумя отметками источников света. Центр трекбола соответствует центру сцены. С его помощью также удобно подбирать угол освещения объектов трехмерной сцены новыми источниками.
Несмотря на то, что для такой нереалистичной визуализации, как «рисованный» флэш, освещение не очень важно, авторы Swift 3D добавили в программу четыре разных типа источника. Комбинируя их, можно имитировать освещение в разное время суток.
Для того чтобы иметь возможность точно и гибко выбрать угол съемки, в сцене можно использовать виртуальные камеры. Камеры могут быть двух видов – свободные и направленные, с мишенью.
Анимация объектов
Работа с анимацией выполняется на вкладке Scene Editor. Оживление трехмерных объектов происходит благодаря режиму автоматического создания ключей анимации. Этот режим активируется на временной шкале кнопкой Animate. Для того чтобы заставить двигаться объекты сцены, достаточно в этом режиме передвинуть ползунок на нужный кадр и попробовать изменить положение объекта в сцене, например, повернуть его на некоторый угол.
Если выделить в сцене объект, на шкале анимации отобразится список анимируемых параметров. При дальнейшем создании анимации выбранного объекта напротив каждого параметра, который будет анимироваться, будут появляться метки – ключи анимации. Ключи анимации можно перемещать и копировать. Кроме этого, есть возможность изменять характер протекания анимации.
Анимацию объектов можно также создавать, устанавливая траекторию их движения. Для этого служит режим Animation Path Mode, который также активируется кнопкой на временной шкале. Траекторию движения можно установить вручную, хотя в большинстве случаев удобнее использовать готовые варианты движений, находящиеся в библиотеке предварительных заготовок, о которой мы говорили выше.
Поскольку флэш-анимация в большинстве случаев используется для создания анимированного логотипа, как правило, движения такой эмблемы можно заранее предвидеть – логотип может вращаться, перемещаться вдоль окружности или другой геометрической фигуры.
Чтобы воспользоваться заранее заданными параметрами анимации, достаточно перетащить образец анимации из библиотеки на объект в сцене.
Сохранение проекта
Последний этап работы в Swift 3D – предварительный просмотр анимации и экспорт в выбранный формат. Все это выполняется на вкладке Preview And Export Editor. Тут можно покадрово просмотреть анимацию, задать параметры экспорта и выбрать формат файла.
Программа работает с большим числом форматов и дает возможность сохранить анимацию как файл Mov, Flv, Swf, Avi. Кроме этого, возможно сохранение в виде графического файла или в один из форматов векторной графики – Ai или Eps.
Сразу хотим отметить, что при помощи демонстрационной версии программы сохранить проект не удастся. Она дает возможность оценить все функции Swift 3D, однако результат работы можно просматривать только в окне предварительного просмотра, сохранение в файл не работает. Кроме этого, не удастся экспортировать созданные в программе модели в 3ds.
Триал-версию программы можно скачать с официального сайта. Полная версия Swift 3D оценивается в $250. Кроме версии для Windows, существует также версия для Mac OS.
Сам термин «фоторобот» и метод был придуман еще в 1952 году во Франции криминалистом Пьером Шабо. Первый фторобот предполагаемого преступника был сделан из фрагментов разных фотографий и переснятый в отдельный снимок. Постепенно фотографии заменили на рисунки.
Программы и инструменты, которые помогают создавать фотороботы.
Сам термин «фоторобот» и метод был придуман еще в 1952 году во Франции криминалистом Пьером Шабо. Первый фоторобот предполагаемого преступника был сделан из фрагментов разных фотографий и переснятый в отдельный снимок. Постепенно фотографии заменили на рисунки.
Казалось бы зачем нам нужен фоторобот, ведь его основное применение это розыск преступников? Ответов может быть несколько. Возможно кому то захочется вернутся в детство к играм в сыщиков а кому то захочется нарисовать шарж или смешного человека.
Есть и еще одно применение с помощью физиогномического анализа можно создавать не только визуальный портрет но и психологический.
Ultimate Flash Face 0.42 beta.
Ultimate Flash Face (http://flashface.ctapt.de) — это онлайн-фоторобот, лучший из бесплатных сервисов подобной тематики. Лицо человека разделяется на десять составляющих (если смотреть сверху вниз): прическа, форма головы, брови, глаза, очки, нос, усы, рот, подбородок, борода. Каждую «деталь» надо подобрать в соответствующей картотеке.
Чтобы добиться наилучшего результата, фрагменты портрета можно не только перемещать в пространстве, но и растягивать/сжимать по вертикали и горизонтали. Еще одна полезная возможность — выравнивание всего лица относительно выбранного элемента по вертикали. Она пригодится, если вы захотите переместить портрет внутри рамки или не уверены, что удачно расположили тот или иной фрагмент.
Полученный портрет можно распечатать или сохранить на сервере — он будет доступен для просмотра всем желающим. Соответственно, можно изучить и чужие работы. Единственным серьезным недостатком сервиса является невозможность сохранить рисунок на свой компьютер.
«Фоторобот 1.00»
Эта утилита предназначена для создания шаржей и рожиц, так что пытаться добиться с ее помощью портретного сходства бесполезно. Портрет предельно упрощен: глаза, уши, нос и рот — вот и все, с чем можно работать. Перемещаются эти «детали» по лицу с помощью четырех кнопок-стрелок, внутри которых спрятаны кнопки переключения на следующий вариант «детали». К изображению можно добавить подпись.
Веб-сайт: http://superperls.narod.ru/photorobot
Виртуальные стилисты.
Многие женщины часто задают себе и окружающим такие вопросы. Какую прическу мне выбрать? В какой цвет покрасится? Пойдут ли мне очки? Чтобы помочь им с выбором используют метод копирующий фоторобот. Только здесь берется фотография реального человека и «гримируется» с помощью накладных париков, макияжа, головных уборов и т. д.
Именно так устроены специализированные онлайн-сервисы предложенные порталом iVillage Makeover-o-Matic (http://beauty.ivillage.com/stc/hair-styllst/halrstyllst.htlm) или русскоязычный «Виртуальный салон красоты» (http://virtualmakeover.ru).
Загружаем свое фото или выбираем подходящий портрет другого человека, если понравился создаем образ - сохраняем изображение. В «Виртуальном салоне» мужчинам уделено не мало внимания.
Digital Physiognomy 1.60
В этом редакторе представлено необычное использование фоторобота — изучение лица с точки зрения физиогномики. Относиться к этой области знания можно по-разному, сами же разработчики честно предупреждают: «Полученная диагностика свидетельствует не столько о действительно вашем характере и возможном поведении, а о том, как вас в большинстве случаев воспринимает незнакомый, непредубежденный человек, увидевший вас впервые».
Составить фоторобот в Digital Physiognomy можно двумя способами: подбирая подходящие кусочки по картинкам или на основании «словесного портрета» — предложенного программой текстового описания той или иной черты лица (лоб узкий, низкий, глаза маленькие, глубоко посаженные). Когда портрет готов, утилита предлагает три варианта его расшифровки: текст, диаграмма с психологическими характеристиками и типы с точки зрения соци-оники.
Есть в Digital Physiognomy интересная функция — подбор портрета по заданным психологическим характеристикам. Можно узнать, как выглядит самый невезучий человек или самый хитрый. Кроме того, разработчики подготовили около 500 портретов исторических деятелей, политиков, известных актеров, во внешности которых можно детально разобраться.
Мультроботы.
Фотороботы бывают и мультяшными. Это те же составные картинки. Благодаря им можно представить себя художником-мультипликатором.
Наиболее мощным мультяшным фотороботом является South Park Studio (http://sp-studio.de). Этот сервис на основе известного сериала позволяет создавать персонажей в духе мультфильма. К услугам пользователей огромные запасы шаблонов рук, ног, туловищ, глаз, ртов... Всего, чего душе угодно.
Мультробот Dream Avatar (www.tek-tek.org/ dream/dream.php) посвящен ани-ме — фрагменты человечка прорисованы в соответствующей манере. Еще один ресурс такого типа инструментов — Avatares (www.buscarmessenger.com/ avatars. html). Правда, не известно, к какому стилю или направлению его отнести. Но то, что всеми чертами фоторобота он обладает — это точно.
Все-таки хорошая идея пришла в голову Пьеру Шабо. Вроде пустяк, а какова область применений!
Как только появляется желание перейти с Windows на другие платформы или на веб-приложения, возникает проблема: там же нет «Фотошопа»! Этот популярный графический пакет благодаря пиратам есть сейчас на большинстве компьютеров в СНГ. И найти альтернативу этой программе сложно. Но как мы используем такую мощную программу? В основном это изменить размеры, подкорректировать яркость, иногда убрать лишние детали, да отправить на е-мейл подружке.
Лучшие графические редакторы, написанные на Flash.
Как только появляется желание перейти с Windows на другие платформы или на веб-приложения, возникает проблема: там же нет «Фотошопа»! Этот популярный графический пакет благодаря пиратам есть сейчас на большинстве компьютеров в СНГ. И найти альтернативу этой программе сложно. Но как мы используем такую мощную программу? В основном это изменить размеры, подкорректировать яркость, иногда убрать лишние детали, да отправить на е-мейл подружке.
Разве нужен для этого полноценный Photoshop? Конечно же, нет, если только вы не дизайнер-профессионал высокого класса. Поэтому найти аналог будет намного проще. Но искать аналог среди настольных программ скучно и неинтересно. Мы живем в век Web 2.0 и поэтому искать аналоги будем среди веб-приложений. Развитие графических возможностей Flash позволяет получить весьма интересные результаты. Описываемые редакторы не станут полной заменой «Фотошопа», но для небольших фотокоррекций они пригодятся.
72photos
Это скорее не редактор а фотогалерея с возможностью слегка подредактировать сохраненные снимки. Функции рисования здесь нет. Можно наложить эффекты на снимок, подправить цветопередачу, яркость и обрезать лишнее. Также есть размытие/резкость и несколько стандартных фильтров. Все достаточно среднее, ничего выдающегося, но как интересное применение возможностей Flash подойдет. Из полезных особенностей стоит отметить возможность работы с картинками, сохраненными на других фотохостингах, впрочем, из очень небольшого списка. FotoFlexer
Редактор, обладающий рядом неоспоримых достоинств, но есть и некоторые недостатки.
Это абсолютный лидер по реализованным функциям. Он поддерживает большое количество фотохостингов, с которых можно загрузить фотографии для редактирования, возможна загрузка просто по URL, что позволяет редактировать любую картинку, также есть загрузка картинок с компьютера пользователя. Чтобы сохранять файл, куда вам надо, придется регистрироваться. И просто на компьютер файл не отдадут. Придется выдирать с какой-то файлопомойки. Или регистрироваться. Мелочь, но неприятно.
Огромное количество эффектов и инструментов. Можно рисовать, накладывать эффекты, трансформировать картинку. Есть готовые для добавления графические примитивы, позволяющие создавать фотографии со вставкой лиц друзей. Здесь же можно и рамочки прикрутить и постер оформить. В общем, раздолье для бытового фотографа. Правда подписать фотографии не получится, русский текст программа не понимает.
Есть инструменты и для более серьезной публики. Сложные трансформации, инструменты выделения и перекрашивания, аналогичные привычным инструментам, даже кое-какая поддержка слоев.
Аналогов по функциональности среди онлайн-сервисов на сегодня нет.
Phoenix
Редактор с продуманным интерфейсом. Без регистрации работать отказывается. Зато потом способен открывать файлы не только со своего сервера и компьютера пользователя, но и со сторонних сервисов и по URL. Неплохой набор фильтров и эффектов. Есть полноценное рисование с возможностью русских надписей. Поддерживаются слои. Правда иногда серверная часть дает сбои при сохранении. Да и само приложение могло бы работать побыстрее. В остальном же отличный редактор.
Photoshop Express
Эта программа считается аналогом настольного Photoshop от создателей Photoshop. Но на самом деле она больше напоминает вышеупомянутый редактор 72photos, только более качественно исполненный. Это фотохостинг, можно просматривать галереи других пользователей, комментировать их. При этом интеграции со сторонними сервисами нет, работать можно только с фотографиями, загруженными с компьютера пользователя. Возможности редактора скромны, изменение размеров, повороты, немного эффектов. Рисования нет.
И все-таки, имеющиеся функции реализованы качественно, работает все очень быстро. Сказывается, что авторы разрабатывали не только Photoshop, но и собственно Flash. Получившимся продуктом приятно пользоваться. И, вероятней всего, следует ожидать дальнейшего развития. PicMagick
Самый элементарный и примитивный из рассматриваемых редакторов. Позволяет только загрузить картинку с компьютера, наложить стандартный набор эффектов и получить обратно свою фотографию. Возможностей сохранения на сервере, рисования и интеграции с другими сервисами нет. Минимализм в чистом виде. Даже регистрации нет. Редактор сразу готов к работе. При этом особой скоростью работы не отличается. Единственная особенность, выделяющая из ряда прочих редакторов — фильтр коррекции кожи. Впрочем, достоинство сомнительное, того же можно добиться и другими инструментами. Picnik
Этим редактором пользуются на популярном фотохостинге Flickr в качестве стандартного. Пользоваться этим редактором могут все желающие. Даже без регистрации. Закачать картинки можно с компьютера, из популярного фотохостинга или блога, с любого URL. Редактор понимает не только стандартные web-типы графики, но и большое количество других распространенных форматов. По этому параметру Picnik — абсолютный лидер.
Хорош он и в реализации. Долгий старт приложения компенсируется большим количеством эффектов и инструментов. Несколько уступая FotoFlexer, он опережает остальных конкурентов. Вот только рисования в чистом виде нет. Можно только накладывать готовые графические примитивы. И ввести русский текст нельзя, получаются сплошные вопросительные знаки.
Сохранять полученный результат можно тоже как у себя на компьютере, так и на популярных хостингах. А можно и сразу на е-мейл. Причем в разнообразных форматах. Pixer.us
Правда это в общем-то и не совсем Flash-редактор. Он написан на Javascript, что уже само по себе интересно. Да и на полноценный редактор сервис не тянет. Вы можете загрузить фотографию со своего компьютера, применить к ней ряд эффектов и сохранить обратно. И все. Работает все достаточно быстренько, но без изысков. Рисования нет. Но как демонстрация возможностей безфлешевых технологий, редактор интересен. К примеру, если сравнивать его с Picmagick, то поединок будет как минимум равным.
Pixlr
Это редактор в чистом виде, без хостинга. Зато есть API, что возможно позволит встраивать редактор в сторонние приложения. Редактор один из семейства клонов фотошопа. Есть русская локализация, чего нет у многих других редакторов. Соответственно, русские надписи делать тоже можно.
Отличная оптимизация работы. Все открывается быстро. Отличный функционал. Есть даже столь любимый Magic Wand. Слои и фильтры тоже на месте, хотя набор инструментов мог бы быть побольше. Впрочем, все основные примочки на месте. Да и интерфейс опять-таки навевает воспоминания о фотошопе. Приятный в работе, продуманный редактор.
Splashup
Очередной гибрид фотохостинга и неплохого редактора. Есть слои, эффекты, полноценное рисование. Русский язык не работает, а вот все остальное на достойном уровне. Можно загрузить свою картинку с компьютера, из интернета (поддержка фотохостингов и прямых URL), отредактировать и сохранить в различных местах.
Очень удобный, приятный интерфейс, отличная скорость работы. Достойный представитель онлайн-редакторов, пытающихся копировать Photoshop.
SUMO Paint
Солидный редактор, близок к настольному приложению как по внешнему виду, так и по функциональному. Правда, оторван от большого интернета. Ни загрузки по URL, ни интеграции с другими сервисами нет. Только аккаунт на собственном сервере и загрузка с компьютера (которая работает не очень уверенно).
Зато функционал впечатляет. Тут нет приевшихся рамочек и цветочков, только серьезные инструменты. Полноценная поддержка слоев, разнообразные эффекты и фильтры. Чем-то напоминает старые версии Photoshop. Очень достойная разработка. И даже поддержка русских шрифтов в наличии. Если поправят проблемы с загрузкой фотографий, будет замечательно.
Конечно неодин из онлайн-редакторов не составит конкуренцию Photoshop. Если в базовых инструментах как-то еще можно соперничать, то когда речь заходит о сложных фильтрах, Photoshop в не конкуренции. А представить себе в онлайн варианте пакетную обработку или плагины и вовсе невозможно. И, конечно, профессионалы не откажутся от привычного инструмента. Зато для обычных пользователей возможности онлайн-редакторов уже сегодня могут вполне пригодиться.
И будущее у этого направления весьма светлое.
Анимированное кино существует и развивается уже сто лет. Оно стало считаться одним из видов искусства. Год от года неуклонно возрастет число анимационных проектов. Такие картины, как Final Fantasy, Shrek, Little Stuart, The Incredibles, Finding Nemo претендуют на престижную премию Оскара. Возможно наступит момент, когда актеров заменят их трехмерные двойники.
Трехмерные сцены становятся все реалистичными, а их себестоимость снижается. Без трехмерных декораций не обходится ни один современный экшн.
Как создается трехмерная анимация.
Анимированное кино существует и развивается уже сто лет. Оно стало считаться одним из видов искусства. Год от года неуклонно возрастет число анимационных проектов. Такие картины, как Final Fantasy, Shrek, Little Stuart, The Incredibles, Finding Nemo претендуют на престижную премию Оскара. Возможно наступит момент, когда актеров заменят их трехмерные двойники.
Трехмерные сцены становятся все реалистичными, а их себестоимость снижается. Без трехмерных декораций не обходится ни один современный экшн.
Трехмерная анимация постепенно вытесняет классическую двухмерную мультипликацию. Многие мультяшные герои или "уходят на пенсию" (с ними просто больше не делают новых мультфильмов), или обретают новую жизнь в 3D. Например, мультфильм с моряком Папаем, сделанный при помощи 3D-редактора Softimage|XSI.
В 2004-ом году известная анимационная студия Blur Studio представила первый анимационный трехмерный проект про Микки Мауса и других диснеевских героев.
Три мультфильма общей продолжительностью 40 минут стали самым крупным проектом за девятилетнюю историю Blur Studio.
Работа над проектом велась совместно 3D-аниматорами Blur и художниками Disney Studios, которые в свое время рисовали Дональда, Плуто и прочих персонажей. Для того чтобы максимально сохранить особенности движения и внешнего вида персонажей при переносе их в трехмерный мир, ведущий аниматор студии Disney Андреас Дежа (Andreas Deja) все время давал советы коллегам-3D-художникам. Результатом остались довольны все, и в Blur и в Studio надеются, что проект не будет последним.
Метод ключевых кадров.
Современная техника анимации кардинально отличается от анимационных фильмов выпускавшихся двадцать, пятьдесят лет назад.
А до появления трехмерной графики существовала так называемая кукольная анимация. Делалась она так: снимался один кадр с мультипликационным героем, затем, например, руку персонажа передвигали на очень небольшое расстояние и опять снимали один кадр. Вся работа состояла в том, чтобы снять на пленку все положения руки мультяшного героя. Что же касается рисованной анимации, каждый кадр рисовался вручную.
В компьютерной анимации все гораздо проще. Аниматор задает в программе только два положения руки - верхнее и нижнее, а все промежуточные положения просчитываются компьютером. Кадры, которые фиксируют начальное и конечное положение тела, называютсяключевыми.
Используя метод ключевых кадров, можно "оживить" практически любые параметры анимационной сцены. Продолжительность анимации зависит от количества промежуточных кадров между ключевыми.
Если математически отобразить зависимость анимированного параметра (или ключа анимации, как его еще называют) от времени, каждый ключевой кадр будет характеризоваться двумя кривыми, которые определяют функциональные зависимости анимированного параметра на промежутке между текущим ключевым кадром и предыдущим, а также настоящим ключевым кадром и следующим. Во многих редакторах для работы с трехмерной графиков подобной графической зависимостью можно управлять, определяя характер анимации.
Преимущество метода ключевых кадров перед классической техникой создания анимации очевидно: аниматор тратит на создание проекта гораздо меньше времени. Большая часть рутинной работы, которая ранее выполнялась вручную, сегодня переложена на компьютер.
Проблемы при создании анимации методом ключевых кадров.
Несмотря на универсальность и простоту техники ключевых кадров, существуют случаи, когда использование этого метода не позволяет добиться желаемого результата. Это касается тех сцен, в которых необходимо отобразить эффекты, подчиняющиеся законам физики.
В реальной жизни все, что нас окружает, постоянно изменяется - шторы слабо двигаются, по озеру бежит мелкая рябь и так далее. Аниматору очень трудно воссоздать такую картину методом ключевых кадров.
Если сцена содержит большое количество анимированных объектов, установить для каждого из них свой набор ключевых кадров очень сложно. Поскольку подбор параметров значений анимированных параметров в каждом из ключевых кадров производится методом проб и ошибок, на подгонку такой сцены уйдет очень много времени.
Кроме этого, при помощи ключевых кадров 3D-аниматору бывает очень сложно воссоздать реалистичную анимацию некоторых объектов: жидкости, материи, огня, волос, разбивающихся предметов. Алгоритм решения этих проблем настолько сложен, что его разработкой занимаются целые институты.
Каждая программа для создания динамики в трехмерных сценах по-своему уникальна, имеет свои преимущества и недостатки. Поэтому при выборе программного обеспечения руководитель анимационного проекта обычно учитывает задачи, которые планируется выполнить на данном этапе.
Помимо проблем, связанных с моделированием физических процессов, существует еще одна трудность, связанная с анимированием большого количества объектов в сцене. Создать простую, на первый взгляд, сцену с горящим бенгальским огнем при помощи ключевых кадров невозможно. Вручную задать траекторию движения для каждой из огромного количества разлетающихся искр - задача практически невыполнимая. В этом случае в трехмерной анимации используются так называемые источники частиц. Их особенность в том, что они позволяют одновременно управлять большим количеством объектов. Значимость частиц в трехмерной графике столь велика, что некоторые 3D-редакторы имеют сложные системы управления источниками частиц, которые позволяют тонко настроить анимационные эффекты с учетом изменения скорости движения частиц, размера, цвета, формы, изменения положения в пространстве и т.д.
Персонажная анимация.
Создание персонажной анимации - это один из важнейших этапов создания трехмерного проекта.
Любую анимацию можно условно разделить на два типа: реалистичная и нереалистичная. Персонажная анимация может быть как реалистичной, так и нереалистичной, однако, зрителем она лучше воспринимается, если напоминает движения, совершаемые реальными существами. Даже если персонаж анимации - это вымышленное существо, плод воображения художника, лучше, чтобы его движения были правдоподобны. В противном случае персонаж будет выглядеть безжизненным манекеном.
Характер движения любого существа определяется анатомическим строением его скелета. Поэтому при создании трехмерной анимации сначала создается модель скелета существа, на который позже "одевается" оболочка.
"Одевание" оболочки - это тоже достаточно трудоемкий процесс, ведь нужно "привязать" кости к соответствующим частям тела таким образом, чтобы при изменении положения скелета оболочка деформировалась реалистично.
Создавать анимацию скелета будущего персонажа можно двумя способами: вручную, с помощью ключевых кадров, и используя систему захвата движения Motion Capture. Последний способ получил широкое распространение и используется практически по всех коммерческих анимационных проектах, так как имеет ряд преимуществ перед методом ключевых кадров.
Технология Motion Capture использовалась, например, в анимационном фильме - <Полярный экспресс> (The Polar Express). В этом фильме известный актер Том Хенкс, играл сразу несколько ролей: маленького мальчика, проводника поезда, бродягу и Санта Клауса. При этом, во многих анимационных сценах актер играл сам с собой. Конечно же, все герои мультфильма были трехмерными, но Том Хенкс управлял их действиями, жестами и даже мимикой. Актер одевал специальное одеяние с датчиками, напоминающее гидрокостюм, совершал действия перед специальным устройством, а компьютер получал информацию об изменении положения отметок на костюме и моделировал, таким образом, движения трехмерного персонажа. Подобные датчики были установлены и на лице актера, что позволило переносить на анимационных героев его мимику.
Понятно, что анимация персонажей, созданная с использованием технологии Motion Capture, более реалистична, чем полученная методом ключевых кадров.
Мимика персонажа.
Для создания мимики трехмерного персонажа, кроме метода Motion Capture, используется также метод морфинга. Все современные 3D-редакторы обычно имеют средства для создания морфинга.
Добиться высокой реалистичности при имитации мимики методом Motion Capture не всегда удается. Чтобы она была правдоподобной, необходимо имитировать движения огромного количества мускулов, а ведь на каждый мускул датчик повесить невозможно.
Поэтому для имитации мимики используется метод морфинга. Он заключается в том, что на основе модели, которая будет анимирована, создается определенное количество клонированных объектов. Затем каждый из этих объектов редактируется вручную - форма лица изменяется таким образом, чтобы на нем присутствовала та или иная гримаса. При создании мимики очень важно, чтобы лицо персонажа при анимации не выглядело однообразным. Для этого необходимо использовать модели-заготовки с самыми разными гримасами. Пусть на одной заготовке персонаж будет моргать, на другой - щуриться, на третьей - надувать щеки и т.д.
На основе этих моделей при помощи метода морфинга создается анимация. При этом, просчитывается, как изменяется лицо персонажа при переходе от выражения лица одной модели до гримасы, созданной на второй модели и т.д. Таким образом, каждая из моделей служит ключом анимации, в результате использования морфинга форма объекта изменяется, и создается мимика персонажа.
3D-аниматор, который профессионально занимается "оживлением" персонажей, должен быть не только художником, но и знатоком анатомии. Знания о строении тела и работе мускулов помогают создать реалистичные движения и выражения лица.
Если же персонаж не только ходит и кривляется, но еще и говорит, 3D-аниматор обязан превратиться еще и в лингвиста. Каждый звук, который произносит человек, сопровождается определенными движениями его губ, языка, челюсти. Для того чтобы перенести эти движения на трехмерную анимацию, нужно уметь разбивать речь на фонемы и создавать соответствующие их произношению движения на лице персонажа.
Виртуальные камеры.
Многие трехмерные анимационные эффекты создаются с помощью виртуальных камер. Эти вспомогательные объекты предназначены для того, чтобы изменять положение точки съемки в виртуальном пространстве.
Виртуальные камеры обладают всеми основными параметрами, которые присущи настоящим камерам. Так, например, для виртуальной камеры можно указать фокусное расстояние, установить свой тип линз и т.д.
Виртуальная камера, в отличие от настоящей, - это лишь вспомогательный объект, которого вы никогда не увидите на трехмерной анимации.
Трехмерная анимация заметно упрощает реализацию многих спецэффектов. Так, например, хорошо всем известный "эффект Матрицы", когда, камера медленно объезжает вокруг человека, замершего в прыжке, гораздо проще создать при помощи виртуальной камеры. Для реализации этого эффекта в фильме "Матрица" использовалось большое количество камер, расположенных вокруг объекта съемки. Все они зафиксировали положение человека в один и тот же момент времени. Из этих кадров была создана анимация, имитирующая "облет" вокруг объекта.
В трехмерной анимации законы физики не действуют, поэтому для создания такого эффекта достаточно зафиксировать в прыжке трехмерную модель человека и задать плавное движение виртуальной камеры вокруг него.
В реальном мире при съемке фото или видеокамерой быстро движущиеся объекты остаются на полученном изображении смазанными. Причем, размытие изображения в конкретном кадре указывает на направление движения заснятого объекта. Присутствие этого эффекта в трехмерной анимации делает ее более реалистичной.
Эффект смазанного движения (Motion Blur) позволяет создать в трехмерных анимированных сценах смазанный шлейф от быстродвижущихся объектов, и отобразить их такими, какими они выглядят при реальных съемках. Возможность использования эффекта смазанного движения имеется практически во всех модулях просчета изображения, которые используются в 3D-графике.
Сегодня 3D-анимация находится на ранней стадии своего развития но за ней большое будущее. Потребуется еще немало времени, пока в 3D будут созданы анимационные шедевры, которые можно будет сравнить с лучшими образцами классической анимации.
А пока все с удовольствием смотрят мультфильмы, выпущенные много лет назад. Такой например как мультфильм "Бемби", созданный студией Диснея шестьдесят три года назад и отреставрированный при помощи современных средств видеообработки.
Хочется надеяться, что такую же популярность, нерушимую временем, смогут снискать и трехмерные анимационные проекты будущего.
Информация в локальных сетях, как правило, передается отдельными порциями, кусками, называемыми в различных источниках пакетами (packets), кадрами (frames) или блоками. Причем предельная длина этих пакетов строго ограничена (обычно величиной в несколько килобайт). Ограничена длина пакета и снизу (как правило, несколькими десятками байт). Выбор пакетной передачи связан с несколькими важными соображениями.
Назначение пакетов и их структура
Информация в локальных сетях, как правило, передается отдельными порциями, кусками, называемыми в различных источниках пакетами (packets), кадрами (frames) или блоками. Причем предельная длина этих пакетов строго ограничена (обычно величиной в несколько килобайт). Ограничена длина пакета и снизу (как правило, несколькими десятками байт). Выбор пакетной передачи связан с несколькими важными соображениями.
Локальная сеть, как уже отмечалось, должна обеспечивать качественную, прозрачную связь всем абонентам (компьютерам) сети. Важнейшим параметром является так называемое время доступа к сети (access time), которое определяется как временной интервал между моментом готовности абонента к передаче (когда ему есть, что передавать) и моментом начала этой передачи. Это время ожидания абонентом начала своей передачи. Естественно, оно не должно быть слишком большим, иначе величина реальной, интегральной скорости передачи информации между приложениями сильно уменьшится даже при высокоскоростной связи.
Ожидание начала передачи связано с тем, что в сети не может происходить несколько передач одновременно (во всяком случае, при топологиях шина и кольцо). Всегда есть только один передатчик и один приемник (реже – несколько приемников). В противном случае информация от разных передатчиков смешивается и искажается. В связи с этим абоненты передают свою информацию по очереди. И каждому абоненту, прежде чем начать передачу, надо дождаться своей очереди. Вот это время ожидания своей очереди и есть время доступа.
Если бы вся требуемая информация передавалась каким-то абонентом сразу, непрерывно, без разделения на пакеты, то это привело бы к монопольному захвату сети этим абонентом на довольно продолжительное время. Все остальные абоненты вынуждены были бы ждать окончания передачи всей информации, что в ряде случаев могло бы потребовать десятков секунд и даже минут (например, при копировании содержимого целого жесткого диска). С тем чтобы уравнять в правах всех абонентов, а также сделать примерно одинаковыми для всех них величину времени доступа к сети и интегральную скорость передачи информации, как раз и применяются пакеты (кадры) ограниченной длины. Важно также и то, что при передаче больших массивов информации вероятность ошибки из-за помех и сбоев довольно высока. Например, при характерной для локальных сетей величине вероятности одиночной ошибки в 10-8пакет длиной 10 Кбит будет искажен с вероятностью 10-4, а массив длиной 10 Мбит – уже с вероятностью 10-1. К тому же выявить ошибку в массиве из нескольких мегабайт намного сложнее, чем в пакете из нескольких килобайт. А при обнаружении ошибки придется повторить передачу всего большого массива. Но и при повторной передаче большого массива снова высока вероятность ошибки, и процесс этот при слишком большом массиве может повторяться до бесконечности.
С другой стороны, сравнительно большие пакеты имеют преимущества перед очень маленькими пакетами, например, перед побайтовой (8 бит) или пословной (16 бит или 32 бита) передачей информации.
Дело в том, что каждый пакет помимо собственно данных, которые требуется передать, должен содержать некоторое количество служебной информации. Прежде всего, это адресная информация, которая определяет, от кого и кому передается данный пакет (как на почтовом конверте – адреса получателя и отправителя). Если порция передаваемых данных будет очень маленькой (например, несколько байт), то доля служебной информации станет непозволительно высокой, что резко снизит интегральную скорость обмена информацией по сети.
Существует некоторая оптимальная длина пакета (или оптимальный диапазон длин пакетов), при которой средняя скорость обмена информацией по сети будет максимальна. Эта длина не является неизменной величиной, она зависит от уровня помех, метода управления обменом, количества абонентов сети, характера передаваемой информации, и от многих других факторов. Имеется диапазон длин, который близок к оптимуму.
Таким образом, процесс информационного обмена в сети представляет собой чередование пакетов, каждый из которых содержит информацию, передаваемую от абонента к абоненту.
Передача пакетов в сети между двумя абонентами
Рис. 4.1. Передача пакетов в сети между двумя абонентами
В частном случае (рис. 4.1) все эти пакеты могут передаваться одним абонентом (когда другие абоненты не хотят передавать). Но обычно в сети чередуются пакеты, посланные разными абонентами (рис. 4.2).
Передача пакетов в сети между несколькими абонентами
Рис. 4.2. Передача пакетов в сети между несколькими абонентами
Структура и размеры пакета в каждой сети жестко определены стандартом на данную сеть и связаны, прежде всего, с аппаратурными особенностями данной сети, выбранной топологией и типом среды передачи информации. Кроме того, эти параметры зависят от используемого протокола (порядка обмена информацией).
Но существуют некоторые общие принципы формирования структуры пакета, которые учитывают характерные особенности обмена информацией по любым локальным сетям.
Чаще всего пакет содержит в себе следующие основные поля или части (рис. 4.3):
Типичная структура пакета
Рис. 4.3. Типичная структура пакета
* Стартовая комбинация битов или преамбула, которая обеспечивает предварительную настройку аппаратуры адаптера или другого сетевого устройства на прием и обработку пакета. Это поле может полностью отсутствовать или же сводиться к единственному стартовому биту.
* Сетевой адрес (идентификатор) принимающего абонента, то есть индивидуальный или групповой номер, присвоенный каждому принимающему абоненту в сети. Этот адрес позволяет приемнику распознать пакет, адресованный ему лично, группе, в которую он входит, или всем абонентам сети одновременно (при широком вещании).
* Сетевой адрес (идентификатор) передающего абонента, то есть индивидуальный номер, присвоенный каждому передающему абоненту. Этот адрес информирует принимающего абонента, откуда пришел данный пакет. Включение в пакет адреса передатчика необходимо в том случае, когда одному приемнику могут попеременно приходить пакеты от разных передатчиков.
* Служебная информация, которая может указывать на тип пакета, его номер, размер, формат, маршрут его доставки, на то, что с ним надо делать приемнику и т.д.
* Данные (поле данных) – это та информация, ради передачи которой используется пакет. В отличие от всех остальных полей пакета поле данных имеет переменную длину, которая, собственно, и определяет полную длину пакета. Существуют специальные управляющие пакеты, которые не имеют поля данных. Их можно рассматривать как сетевые команды. Пакеты, включающие поле данных, называются информационными пакетами. Управляющие пакеты могут выполнять функцию начала и конца сеанса связи, подтверждения приема информационного пакета, запроса информационного пакета и т.д.
* Контрольная сумма пакета – это числовой код, формируемый передатчиком по определенным правилам и содержащий в свернутом виде информацию обо всем пакете. Приемник, повторяя вычисления, сделанные передатчиком, с принятым пакетом, сравнивает их результат с контрольной суммой и делает вывод о правильности или ошибочности передачи пакета. Если пакет ошибочен, то приемник запрашивает его повторную передачу. Обычно используется циклическая контрольная сумма (CRC). Подробнее об этом рассказано в главе 7.
* Стоповая комбинация служит для информирования аппаратуры принимающего абонента об окончании пакета, обеспечивает выход аппаратуры приемника из состояния приема. Это поле может отсутствовать, если используется самосинхронизирующийся код, позволяющий определять момент окончания передачи пакета.
Вложение кадра в пакет
Рис. 4.4. Вложение кадра в пакет
Нередко в структуре пакета выделяют всего три поля:
* Начальное управляющее поле пакета (или заголовок пакета), то есть поле, включающее в себя стартовую комбинацию, сетевые адреса приемника и передатчика, а также служебную информацию.
* Поле данных пакета.
* Конечное управляющее поле пакета (заключение, трейлер), куда входят контрольная сумма и стоповая комбинация, а также, возможно, служебная информация.
Как уже упоминалось, помимо термина "пакет" (packet) в литературе также нередко встречается термин "кадр" (frame). Иногда под этими терминами имеется в виду одно и то же. Но иногда подразумевается, что кадр и пакет различаются. Причем единства в объяснении этих различий не наблюдается.
В некоторых источниках утверждается, что кадр вложен в пакет. В этом случае все перечисленные поля пакета кроме преамбулы и стоповой комбинации относятся к кадру (рис. 4.4). Например, в описаниях сети Ethernet говорится, что в конце преамбулы передается признак начала кадра.
В других, напротив, поддерживается мнение о том, что пакет вложен в кадр. И тогда под пакетом подразумевается только информация, содержащаяся в кадре, который передается по сети и снабжен служебными полями.
Во избежание путаницы, в данной книге термин "пакет" будет использоваться как более понятный и универсальный.
В процессе сеанса обмена информацией по сети между передающим и принимающим абонентами происходит обмен информационными и управляющими пакетами по установленным правилам, называемым протоколом обмена. Это позволяет обеспечить надежную передачу информации при любой интенсивности обмена по сети.
Пример простейшего протокола показан на рис. 4.5.
Пример обмена пакетами при сеансе связи
Рис. 4.5. Пример обмена пакетами при сеансе связи
Сеанс обмена начинается с запроса передатчиком готовности приемника принять данные. Для этого используется управляющий пакет "Запрос". Если приемник не готов, он отказывается от сеанса специальным управляющим пакетом. В случае, когда приемник готов, он посылает в ответ управляющий пакет "Готовность". Затем начинается собственно передача данных. При этом на каждый полученный информационный пакет приемник отвечает управляющим пакетом "Подтверждение". В случае, когда пакет данных передан с ошибками, в ответ на него приемник запрашивает повторную передачу. Заканчивается сеанс управляющим пакетом "Конец", которым передатчик сообщает о разрыве связи. Существует множество стандартных протоколов, которые используют как передачу с подтверждением (с гарантированной доставкой пакета), так и передачу без подтверждения (без гарантии доставки пакета). Подробнее о протоколах обмена будет рассказано в следующей главе.
При реальном обмене по сети применяются многоуровневые протоколы, каждый из уровней которых предполагает свою структуру пакета (адресацию, управляющую информацию, формат данных и т.д.). Ведь протоколы высоких уровней имеют дело с такими понятиями, как файл-сервер или приложение, запрашивающее данные у другого приложения, и вполне могут не иметь представления ни о типе аппаратуры сети, ни о методе управления обменом. Все пакеты более высоких уровней последовательно вкладываются в передаваемый пакет, точнее, в поле данных передаваемого пакета (рис. 4.6). Этот процесс последовательной упаковки данных для передачи называется также инкапсуляцией пакетов.
Многоуровневая система вложения пакетов
Рис. 4.6. Многоуровневая система вложения пакетов
Каждый следующий вкладываемый пакет может содержать собственную служебную информацию, располагающуюся как до данных (заголовок), так и после них (трейлер), причем ее назначение может быть различным. Безусловно, доля вспомогательной информации в пакетах при этом возрастает с каждым следующим уровнем, что снижает эффективную скорость передачи данных. Для увеличения этой скорости предпочтительнее, чтобы протоколы обмена были проще, и уровней этих протоколов было меньше. Иначе никакая скорость передачи битов не поможет, и быстрая сеть может передавать файл дольше, чем медленная сеть, которая пользуется более простым протоколом.
Обратный процесс последовательной распаковки данных приемником называется декапсуляцией пакетов.
Информация в кабельных локальных сетях передается в закодированном виде, то есть каждому биту передаваемой информации соответствует свой набор уровней электрических сигналов в сетевом кабеле. Модуляция высокочастотных сигналов применяется в основном в бескабельных сетях, в радиоканалах. В кабельных сетях передача идет без модуляции или, как еще говорят, в основной полосе частот.
Правильный выбор кода позволяет повысить достоверность передачи информации, увеличить скорость передачи или снизить требования к выбору кабеля. Например, при разных кодах предельная скорость передачи по одному и тому же кабелю может отличаться в два раза. От выбранного кода напрямую зависит также сложность сетевой аппаратуры (узлы кодирования и декодирования кода). Код должен в идеале обеспечивать хорошую синхронизацию приема, низкий уровень ошибок, работу с любой длиной передаваемых информационных последовательностей.
Некоторые коды, используемые в локальных сетях, показаны на рис. 3.8. Далее будут рассмотрены их преимущества и недостатки.
Наиболее распространенные коды передачи информации
Рис. 3.8. Наиболее распространенные коды передачи информации
Код NRZ
Код NRZ (Non Return to Zero – без возврата к нулю) – это простейший код, представляющий собой обычный цифровой сигнал. Логическому нулю соответствует высокий уровень напряжения в кабеле, логической единице – низкий уровень напряжения (или наоборот, что не принципиально). Уровни могут быть разной полярности (положительной и отрицательной) или же одной полярности (положительной или отрицательной). В течение битового интервала (bit time, BT), то есть времени передачи одного бита никаких изменений уровня сигнала в кабеле не происходит.
К несомненным достоинствам кода NRZ относятся его довольно простая реализация (исходный сигнал не надо ни специально кодировать на передающем конце, ни декодировать на приемном конце), а также минимальная среди других кодов пропускная способность линии связи, требуемая при данной скорости передачи. Ведь наиболее частое изменение сигнала в сети будет при непрерывном чередовании единиц и нулей, то есть при последовательности 1010101010..., поэтому при скорости передачи, равной 10 Мбит/с (длительность одного бита равна 100 нс) частота изменения сигнала и соответственно требуемая пропускная способность линии составит 1 / 200нс = 5 МГц (рис. 3.9).
Скорость передачи и требуемая пропускная способность при коде NRZ
Рис. 3.9. Скорость передачи и требуемая пропускная способность при коде NRZ
Передача в коде NRZ с синхросигналом
Рис. 3.10. Передача в коде NRZ с синхросигналом
Самый большой недостаток кода NRZ – это возможность потери синхронизации приемником во время приема слишком длинных блоков (пакетов) информации. Приемник может привязывать момент начала приема только к первому (стартовому) биту пакета, а в течение приема пакета он вынужден пользоваться только внутренним тактовым генератором (внутренними часами). Например, если передается последовательность нулей или последовательность единиц, то приемник может определить, где проходят границы битовых интервалов, только по внутренним часам. И если часы приемника расходятся с часами передатчика, то временной сдвиг к концу приема пакета может превысить длительность одного или даже нескольких бит. В результате произойдет потеря переданных данных. Так, при длине пакета в 10000 бит допустимое расхождение часов составит не более 0,01% даже при идеальной передаче формы сигнала по кабелю.
Во избежание потери синхронизации, можно было бы ввести вторую линию связи для синхросигнала (рис. 3.10). Но при этом требуемое количество кабеля, число приемников и передатчиков увеличивается в два раза. При большой длине сети и значительном количестве абонентов это невыгодно.
В связи с этим код NRZ используется только для передачи короткими пакетами (обычно до 1 Кбита).
Большой недостаток кода NRZ состоит еще и в том, что он может обеспечить обмен сообщениями (последовательностями, пакетами) только фиксированной, заранее обговоренной длины. Дело в том, что по принимаемой информации приемник не может определить, идет ли еще передача или уже закончилась. Для синхронизации начала приема пакета используется стартовый служебный бит, чей уровень отличается от пассивного состояния линии связи (например, пассивное состояние линии при отсутствии передачи – 0, стартовый бит – 1). Заканчивается прием после отсчета приемником заданного количества бит последовательности (рис. 3.11).
Определение окончания последовательности при коде NRZ
Рис. 3.11. Определение окончания последовательности при коде NRZ
Наиболее известное применение кода NRZ – это стандарт RS232-C, последовательный порт персонального компьютера. Передача информации в нем ведется байтами (8 бит), сопровождаемыми стартовым и стоповым битами.
Три остальных кода (RZ, манчестерский код, бифазный код) принципиально отличаются от NRZ тем, что сигнал имеет дополнительные переходы (фронты) в пределах битового интервала. Это сделано для того, чтобы приемник мог подстраивать свои часы под принимаемый сигнал на каждом битовом интервале. Отслеживая фронты сигналов, приемник может точно синхронизовать прием каждого бита. В результате небольшие расхождения часов приемника и передатчика уже не имеют значения. Приемник может надежно принимать последовательности любой длины. Такие коды называются самосинхронизирующимися. Можно считать, что самосинхронизирующиеся коды несут в себе синхросигнал.
Позволю себе предоставить на конструктивный суд общественности список хорошо зарекомендовавших себя архитектурных решений и практик. Сегодня поговорим о базах данных MySQL.
Повелитель CHAR
Если есть возможность, используем поле CHAR для текстовых полей. И искать будет быстрее, и защита от дурака будет. Так, например, для MD5-хэша пароля это CHAR(32), для тикера валюты (USD, EUR) – CHAR(3). Есть ещё масса примеров: если ваше приложение работает с данными по аэропортам, то кандидатом на тип CHAR будет ICAO-код аэропорта (4 символа) или IATA-код (3 символа), если с банками, то код BIC.
Приручаем TIMESTAMP
Часто требуется хранить дату создания и/или модификации сущности (поля stamp_created и stamp_updated). Не все пользуются фреймворками типа Symfony, где система сама отвечает за их наполнение — и так как порой их актуальность обеспечивается вручную, были случаи, когда эти поля оставались просто пустыми — некогда было возиться. Можно объявить поле так, что этот функционал будет работать сам. Правда, в случае MySQL придётся выбирать: автоматически будет работать либо дата создания, либо дата модификации. Для этого нужно создать поле типа TIMESTAMP; в первом случае (created) указываем инициализацию текущим временем, во втором (updated) — указываем авто-обновление поля при каждой модификации текущей записи. Оба варианта умеет делать PHPMyAdmin.
Каскады FOREIGN KEY
Конечно, это касается не только MySQL. Удаление данных в иерархии сущностей можно автоматизировать с помощью каскадного удаления FOREIGN KEY (да, это банально, но часто на это кладут). Например, у меня в Rival Alert есть пользователи, у пользователей есть графики, у графиков есть данные. Без FOREIGN KEY функция удаления пользователя должна сначала удалить все данные по графикам этого пользователя, потом все его графики, и только потом — самого юзера. При использовании FOREIGN KEY вся соответствующая информация удалится сама, причем логикой на стороне сервера БД, и без дополнительных запросов от сервера приложений.
Кстати, FOREIGN KEY поддерживаются только в InnoDB-движке. Перейдя на него, вы получите возможность использовать транзакции, но потеряете полно-текстовый поиск (он в MyISAM).
Есть ещё идейка, которую держу про запас. В той же “Building Scalable Web Sites” пишут, что для ускорения работы приложения базу данных можно немножко де-нормализовать, например, рейтинги статей считать не налету на каждый запрос, а держать в отдельном поле таблицы статей уже в посчитанном виде и время от времени обновлять, ну или скажем вам нужно дублировать название/ссылку статьи в каждой записи рейтинга. Так вот идейка состоит в том, чтобы использовать CASCADE UPDATE для обновления полей в зависимой таблице — тогда целостность данных при такой денормализации будет выше.
INSERT + UPDATE в одном запросе
Частый кейс: если нет такого записи — вставить (INSERT), если есть — обновить для неё пару полей (UPDATE). Часто это решается через предварительный SELECT, чтобы установить факт наличия такой записи. Можно сделать это одним запросом, лишь бы был PRIMARY KEY или UNIQUE KEY.
Приведу пример. В том же Rival Alert у меня у одного графика за один день может быть только одно значение (такое вот условие). Сколько раз в базу будет класться это значение — не важно. Так вот, если значения “за сегодня” нет — мы его добавляем, если есть — обновляем (в поле `date` хранится текущая дата; пара `id_graph`+`date` — уникальна для каждой записи, что было указано через UNIQUE при создании таблицы).
Кстати, чтобы запрос стал красивее, и вам не нужно было два раза указывать значение вставки/обновления (в моём примере — это 4444), можно в разделе UPDATE указать, что нужно взять значение из раздела INSERT:
Оба запроса делают то же самое, только теперь вам нужно будет лишь в одном месте подставлять фактическое значение, а не в нескольких.
И последнее. Если вам нужно работать по сути с одними и теми же данными, но из разных баз данных, посмотрите в сторону Federated Storage Engine. Полезно иметь такую фичу на примете.
Надеюсь, эта заметка поможет вам кода писать меньше, а успевать больше.