vr-online (may 2009)

99

Upload: igor-antonov

Post on 13-Mar-2016

232 views

Category:

Documents


9 download

DESCRIPTION

Майский выпуск бесплатного журнала для программистов и всех тех, кто интересуется околокомпьютерными темами.

TRANSCRIPT

Page 1: VR-Online (May 2009)
Page 2: VR-Online (May 2009)

Интервью с М.Фленовым

1С: Предприятие 7.7 Пакетный режим Отчет по аудиту безопасности интернет сайтов

VML: Быстрое знакомство USB-модем от Билайна: (не)зависимое мнение

Так ли плоха Vista как ее малюют? WEB-сервер на Delphi

Zend Framework: Начало начал Adept framework: Нестандартный CMF

Первое знакомство с 1С:Предприятие 8.1 Слои vs таблицы. КреатиF. Интервью

FAQ

Page 3: VR-Online (May 2009)

ИНТРО Выход этого номера совпал с нашим днем рождения. Если ты уже несколько лет посещаешь VR-Online, то должен знать, что 15 мая, является днем рождения нашего проекта. В этом году нам стукнуло не много, не мало, а целых 9 лет. Для проекта основанном на голом энтузиазме это весьма неплохой срок. Надеюсь, это мы еще долго будем расти и приносить пользу всем тем, чья работа или увлечения связаны с компьютерами. Этот номер мы постарались сделать особенным: мы серьезней отнеслись к качеству статей и наконец-таки создали постоянную структуру рубрик. Теперь, все последующие номера будут выдержаны (по структуре) в духе этого номера. Т.е. если ты любишь программировать, то при скачке журнала можешь быть уверенным, что в нем обязательно будет несколько статей, посвященных программированию. Надеемся, что после прочтения этот номер произведет приятные впечатления, и ты с удовольствием придешь на наш сайт за следующим. Приятного чтения! P.S. В этот номер не вошла одна из анонсированных на обложке статей (про поднятие VPN сервера). По тех причинам она будет опубликована через пару дней на нашем сайте.

Игорь Антонов

Идея: Фленов Михаил Редакторы номера: Антонов Игорь ([email protected]) Костенко Роман ([email protected]) Графика в журнале: Васючков Андрей aka Soffrick ([email protected]) Текущий состав VR-Team: Neon_Kaligula, Soffrick, Egoiste, FrIToOll, Lord_of_fear, Spider_NET Вопросы и предложения по журналу: [email protected], [email protected]

Page 4: VR-Online (May 2009)

Железные новости Подготовил Lord_of_Fear ([email protected]) Новая ёмкость на новых пластинах Недавно произошло очень важное событие в мире дискостроения. Производители перешли на 500-гигабайтные пластины. Первым был WD со своей зеленой серией, за ним подтянулся Seagate с линейкой 7200.12 и Samsung со своим Spinpoint F2. Это открыло новые горизонты ёмкости. И тут WD опередили всех - жесткий диск Caviar Green WD20EADS и более быстрый «корпоративный» вариант WD2002FYPS RE4-GP с кэшем 64 МБ и двумя процессорами.

Вот такого красавца теперь можно вставить в свой системный блок и ощутить всю силу новой ёмкости. Однако, не каждому по карману будет сие удовольствие J. Искренне надеюсь, что Samsung и Seagate быстро наверстают упущенные позиции. AMD: наши чипы за шесть лет стали в 35 раз быстрее

Компания AMD приступила к поставкам 14 новых четырехъядерных процессоров, изготовленных на базе 45-нм технологии. Двенадцать процессоров предназначены для серверов, два - для настольных систем.

Наибольшего внимания заслуживают процессоры Opteron EE 2377 и Opteron EE 2373 с тактовой частотой 2,3 и 2,1 ГГц, потребляющие 40 Вт. В сравнении с AMD Opteron HE новые ЦП расходуют на 13% меньше энергии в режиме

работы и на 14% меньше в режиме простоя. При этом производительность процессоров осталась на прежнем уровне. Таким образом, производительность чипов в расчете на один ватт потребляемой мощности удалось повысить на 62%. Достичь этого удалось, в том числе, за счет использования технологий Smart Fetch, CoolCore. Первая выключает ядра при отсутствии нагрузки, вторая регулирует питание отдельных частей процессора.

Page 5: VR-Online (May 2009)

Помимо серверных процессоров, в продажу поступил Phenom X4 955 Black Edition для настольных игровых систем. Это самый быстрый чип AMD, его тактовая частота составляет 3,2 ГГц с возможностью безопасного разгона до 3,6 ГГц. Некоторые энтузиасты смогли увеличить тактовую частоту процессора до 6,7 ГГц. Разгон осуществляется с помощью ПО OverDrive. Практически всю свою компьютерную карьеру я использую процессоры AMD. На данный момент сердцем моего домашнего ПК является AMD Athlon 64 x2 6000+. Надеюсь, что компания будет далее развиваться и выпускать новые процессоры. Новое от Intel

Не так давно в оптовом прайс-листе компании появилось две новых 45-нм четырёхъядерных модели: Core 2 Quad Q8400 (2,66 ГГц, 4 МБ L2, 1333 МГц FSB) и его экономичный 65-Вт близнец Core 2 Quad Q8400S. Оптовая стоимость Core 2 Quad Q8400 — 183 доллара, а эффективного Core 2 Quad Q8400S — 245 долларов.

С обоими процессорами на равных может конкурировать топовый Phenom II X4 940 (3,0 ГГц) Black Edition, но его цена пока держится в официальном прайс-листе AMD на уровне 225 долларов. Исключая серверные процессоры, модели Xeon L3360, X3330 и X3320, которые тоже подешевели на 10%, список уценённых решений выглядит весьма интересно. Некоторые модели подешевели почти на 50 вечнозелёных американских рублей. Следует отметить важность информации о скором появлении первых представителей линейки Core i5. По предварительным данным, первыми представителями линейки Intel Core i5 станут четырехъядерные процессоры, работающие на частотах 2,66 GHz, 2,8 GHz и 2,93 GHz. Ну и, конечно, не следует забывать об анонсе процессоров Atom. Судя по предварительным данным, их характеристики энергопотребления и тепловыделения будут идеальны для использования в нетбуках.

1GHz – рабочая частота GPU видеокарт Radeon К знаковым событиям можно отнести появление на рынке видеоадаптера ATI Radeon HD 4890 с частотой графического процессора, повышенной до 1GHz.

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

Page 6: VR-Online (May 2009)

разъемами дополнительного питания, 6-ти и 8-ми контактными. Частота работы памяти равна 4200MHz. Так же ждём двуядерные варианты данной модели. Высокое энергопотребление заставило отказаться AMD от производства HD4890 X2 видеокарт. За эту работу взялись тайваньские партнеры ATI. Не знаю, правда, как производители собрались бороться с таким колоссальным тепловыделением. Время покажет. Geforce GTX 285. 2Gb памяти на борту Нельзя пройти мимо такого события. Недавно компании Palit Microsystems, Gainward, Galaxy Technology, SPARKLE Computer Co, Point of View и MSI заявили о выпуске собственных версий графических адаптеров NVIDIA GeForce GTX 285, укомплектованной сразу двумя гигабайтами памяти GDDR3 с 512-битным интерфейсом.

Пока этих видеокарт в продаже нет. Так что остаётся ждать и облизываться. J

Page 7: VR-Online (May 2009)

IT-новости Подготовил Игорь «Spider_NET» Антонов ([email protected]) Релиз Windows 7 RC1

Пятого мая компания Microsoft предоставила всем желающим скачать первый релиз кандидат новой Windows. Финальный релиз новой ОС планируется на конец 2009 года. Все желающие попробовать новую ОС на практике, могут скачать ее с официального сайта компании Microsoft.

Компанию Borland выкупили В мае, компанию Borland купили за 75 миллионов вечно зеленых американских президентов. Покупателем стала компания Micro Focus International (http://www.microfocus.com/). В последние года, у компании Borland дела шли мягко говоря неважно. Даже продажа убыточных продуктов, таких как – Delphi, C++ Builder и сосредоточивание на разработке решения для управления жизненны циклом, не смогли спасти компанию. Сегодня можно уверенно сказать, что сегодня, от некогда серьезной компании остался лишь - бренд. Китай создал национальную операционную систему

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

Page 8: VR-Online (May 2009)

Гигабит без проводов Ведущие производители компьютеров и мобильных устройств сообщили о создании организации WiGig Alliance. Главная цель этого союза будет разработка совершенно новой беспроводной технологии передачи данных, пропускная способность которой будет от 1Гбит/сек. Чтобы достичь таких скоростей, компании приняли решении использовать 60-гигагерцевый частный диапазон. Разработчики дали новой технологии имя - WiGig. Планируется, что эта разработка станет универсальной и позволит объединить в единую сеть сотовые телефоны, компьютеры и всевозможную домашнюю электронику. Создатели технологии не собираются ограничиваться скоростью передачи данных в 1 Гбит/сек. В будущем, скорость будет увеличена до 6 Гбит/сек. Пятая бета iPhone OS 3.0

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

Проблема с режимом эмуляции XP в Windows 7 Microsoft, для стимулирования перехода на Windows 7, создала в ней возможность режима эмуляции Windows XP. Этот режим признан обеспечить комфортное пребывание в новой ОС и безболезненно перейти с Windows XP. Однако, на практике эта затея оказалось все не так хорошо. После того как пользователи скачали и установили на свои ПК RC1, выяснилось, что у многих обещанная функция не работает. Как выяснилось чуть позже, "режим XP" не может работать на ПК, основанных на чипах Core 2 Duo P7350/7450, а также на T5200/5250/5270/5300/5450/5470.

Первая заплатка для Windows 7 Не успела Microsoft представить первый релиз-кандидат Windows 7, как в нем был обнаружен первый баг. Как сообщается, найденная ошибка может вызвать сбои в работе программ. В официальном описании проблемы сказано, что в английской версии 32-битной Windows 7 RC, папка, установленная как корневой каталог (%SystemDrive%), не имеет ряда дескрипторов безопасности. Из-за этого, доступ к вложенным подпапкам для пользователей, не имеющих прав админа, может быт запрещен. MS оперативно отреагировала на проблема

и выпустила соответствующий патч.

Page 9: VR-Online (May 2009)

ODF в MS Office 2007 SP2 несовместим с другими программами Во время тестирования качества поддержка формата ODF 1.1 в Microsoft Office 2007 SP2 было обнаружено, что пакет правильно читает лишь табличные файлы, созданные при помощи плагина CleverAge в MS Office. Все электронные таблицы, созданные в OpenOffice.org Calc 2.4, Google Spreadsheets, KSpread, IBM Lotus Symphony 1.1 корректно прочитаться не смогли. Проблема кроется в чтении формул, описаных с помощью техники Open Formula. Данна техника, определена в спецификации ODF 1.2, но на сегодняшний день, она еще не принята в качестве стандарта. Novell и Intell разрабатывают компактный дистрибутив Linux

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

пределах 10 секунд. Zend Framework 1.8

В самом начале мая состоялся релиз новой версии PHP фреймворка - Zend Framework 1.8. Среди всех изменений, особенно выделяются: * Набор утилит Zend_Tool для быстрой разработки web-приложений

* Готовые средства для создания сервисов для работы в "облачных-окружениях". * Сервис виртуализованных хранилищ данных S3 (Simple Storage Service). Помимо новинок, во фреймворке исправлено множество багов (около 180) и внесено куча мелких изменений. Intel оштрафовали на 1 миллиард евро На компанию Intel, был наложен штраф в размере 1,06 миллиарда евро. истцом в этом деле стала Еврокомиссия, которая признала компанию виновной в нарушении антимонопольного законодательства. По данным Еврокомиссии, Intel блокировала доступ компании AMD на европейский рынок. Блокировка проявлялась в виде значительных скидок, которые Intel делала для производителей компьютеров. Кроме того, имеются сведения, что Intel занималась подкупом продавцов техники, которые отказывались продовать компьютеры с чипами AMD.

Page 10: VR-Online (May 2009)

VVrrIIPP--PPeerrssoonn

Page 11: VR-Online (May 2009)

Релиз этого номера совпал с нашим днем рождения проекта, поэтому мы с тимовцами посовещались и решили, что первой персоной нашей новой рубрики должен быть непременно М.Фленов. Итак, разрешите представить, интервью с «отцом» VR-Online. О книге VR-Team: На какой стадии подготовки сейчас находится книга? Когда ее можно будет увидеть на прилавках магазинов? М. Фленов: Книга сдана, прошла редактирование и если я не ошибаюсь, то издательство выполнило все, что от них зависит. Но типографии обладают некоторой бюрократией, которая требует планирования работ на месяц и поэтому книга попала в план только на июнь. Когда появится книга на полках уже будет зависеть от типографии, в какой последовательности они будут выполнять свой план. VR-Team: Михаил, на какой уровень подготовки читателя будет рассчитана ваша книга? М. Фленов: От начинающего. Если кто-то считает себя профи, то книгу лучше не покупать, потому что ничего нового не узнают. Если кто-то уже программирует на C#, но чувствует, что что-то осталось непонятым, то книга может оказаться очень полезной. VR-Team: Многим читателям было бы интересно взглянуть на содержание книги. Можете привести хотя бы черновой вариант оглавления? М. Фленов: Содержание не особо скажет, что в книге, лучше я просто расскажу, какие темы я освещал. Как и в Библии Delphi я начал с основ, в которой я рассказываю о программировании, о логике выполнения программ и о том, как выполняет код .NET. После этого, я начинаю рассказывать о самом языке и его операторах. Тут я постарался дать как можно больше интересных и полезных примеров. Именно полезных. Например, при объяснении рекурсии можно часто увидеть пример расчета факториала рекурсивным вызовом. Это ужасный пример, и я сам так же поступал, потому что он прост. Некоторые читатели могут подумать, что факториал действительно нужно рассчитывать рекурсией. Это будет ошибкой, поэтому я старался выбирать более полезные примеры. Та же рекурсия показывается на примере алгоритма сортировки quicksort. Большое количество жизненных и полезных примеров будет отличать книгу от других. VR-Team: Почему у вас возникла идея написать книгу именно по C#? Насколько известно, почти все ваши книги были посвящены Delphi. М. Фленов: Я не знаю будущего Delphi и я не использую нелицензионное ПО, поэтому мне пришлось отказаться от Delphi. Вместо этого я перешел на Visual Studio, который дешевле и доступнее. Язык C# обладает мощью C++ и при этом простотой и элегантностью Delphi, потому что этот язык проектировал тот же человек, что и создавал Delphi+VCL. На мой взгляд, C# является наиболее современным языком из всех существующих. Тут у него преимущество не только в том, что он создавался последним и впитал все лучшее из C++, Java и Delphi, но и в том, что его создавали гениальные люди из разных компаний. Microsoft удалось переманить к себе великих людей на создание гениального языка. VR-Team: Какую версию C#/Visual Studio вы рассматриваете в книге?

Page 12: VR-Online (May 2009)

М. Фленов: Я использовал Visual Studio и .NET 3.5. Большая часть кода будет работать и на платформе 2.0, но не видел смысла ограничиваться ей только потому, что до сих пор .NET 3.5 стоит не у всех. Я думаю, уже пора изучать именно последнюю версию К моменту выхода книги, эта версия будет уже достаточно распространенной. К моменту, когда книгу прочитают и читатель начнет писать свои программы, уже появится .NET 4.0, а 3.5 будет стоять уже почти на всех Windows компьютерах. VR-Team: Название новой книги будет "Библия C#" или другое? М. Фленов: На сколько я слышал, именно Библия C#. VR-Team: Какое издательство будет издавать книгу? М. Фленов: Я работаю только с БХВ-Петербург. У меня с ними эксклюзивные отношения и для других издательств я не пишу. VR-Team: Насколько известно, у вас есть одна книга (Delphi в шутку и всерьез), изданная издательством "Питер". Почему вы больше не сотрудничаете с этим издательством? М. Фленов: У меня две книги выпущены в издательстве Питер. Продажи книг в этом издательстве оказались в несколько раз ниже чем в БХВ. Даже самая провальная книга в БХВ (PHP глазами хакера) была продана тиражом в 5 тысяч. VR-Team: Михаил, вы написали много отличных книг. Какая эта книга уже по счету? Намерены ли вы на этом остановиться? Есть идеи для следующей книги? М. Фленов: Если мне не изменяет память, то не считая переизданий это будет 14-я книга. Я уже давно решил не писать ничего нового, но потом посчитал и понял, что у меня 13 книг. Не очень счастливое число, поэтому я и решился написать еще одну книгу. Ничего нового с нуля писать не планирую в ближайшее время, потому что число 14 меня вполне устраивает. Но планы есть. Я никогда не раскрываю их заранее, но тебе и читателям сайта vr-online.ru конечно же скажу. Сейчас идет работа над книгой WEB сервер глазами хакера 2.0. Информация в книге сильно устарела, поэтому я ее обновляю, добавляю описание более интересных примеров с реальными ошибками, добавляю современные атаки и описание защиты от этих атак. В общем книга будет изменена как минимум на 50% и будет интересна даже тем, кто читал первое издание. О работе VR-Team: Скажите, какие языки программирования вы применяете в своей работе? Почему именно эти? М. Фленов: Сейчас только C# и в основном в связке с WinForms, но один из проектов готовлю на WPF. Мне кажется, что связка C# + WPF будет определять будущее ПО. VR-Team: Какой из языков программирования вам больше всего по душе? Какая IDE больше всего привлекает? М. Фленов: На данный момент VisualStudio и C#. Все в жизни меняется и может быть скоро появится что-то лучше.

Page 13: VR-Online (May 2009)

VR-Team: Какое программное и аппаратное обеспечение вы используете в работе? М. Фленов: Программное уже говорил - Visual Studio. А аппаратное - ноутбуки HP. У меня нет собственной квартиры и приходится часто переезжать, поэтому просто приходится работать с ноутбуками, а марка HP просто понравилась своим дизайном и качеством. О прогнозах VR-Team: Ваш прогноз о будущем технологии .NET и C# в частности. М. Фленов: Тяжело давать прогнозы, но судя по усилиям, которые применяет MS, будущее будет счастливым. VR-Team: Ваш прогноз ИТ в России. Что нас ждет в ближайшем будущем? М. Фленов: В самом ближайшем времени большую популярность начнут получать тач-экраны. VR-Team: Михаил, есть ли на ваш взгляд, необходимость перехода на С# с языка Delphi? Вы раньше всегда скептически относились к технологии .NET, почему вы все таки решили мигрировать в мир .NET? М. Фленов: Я плохо относился к .NET 1. Мигрировать имеет смысл, если ты видишь необходимость. Если тебя устраивает Delphi, то можно оставаться в нем и не повторять моих миграций. О жизни VR-Team: С чего началось ваше увлечение программированием? М. Фленов: Первые программы, которые я начал писать были экономическими. В 1993-м году с программистами в Ростове были серьезные проблемы и то, что я заинтересовался этой темой сразу открыло мне хорошие перспективы в работе. Меня сразу взяли в хороший отдел на заводе-гиганте Ростсельмаш, где я смог набраться опыта. VR-Team: Кем вы хотели быть в детстве, и почему стали программистом? М. Фленов: Хотел быть когда-то сварщиком. VR-Team: Вы хотели бы чтоб ваши дети или один из них стал программистом. Почему? М. Фленов: Я хотел бы, чтобы они нашли себя и занимались тем, чем им нравится. Если это будет программирование, то я буду не против. VR-Team: Какие у вас есть увлечения, отличные от мира высоких технологий? М. Фленов: Даже не знаю. Если бы были деньги и время, я бы с удовольствием путешествовал бы. Я объехал на машине половину России и был немного заграницей. Если бы позволяли финансы, я бы наверно путешествовал. VR-Team: Сколько часов в день вы проводите за ПК и с какой целью?

Page 14: VR-Online (May 2009)

М. Фленов: 10 часов минимум и в основном работаю. В перерывах между работой читаю новости, веду блог и обновляю сайт. VR-Team: Вы считаете себя больше теоретиком или практиком в программировании? М. Фленов: Практиком VR-Team: Вы написали книги о многих языках программирования. Неужели один человек способен быть специалистом в нескольких языках? М. Фленов: Нет. Я не являюсь специалистом в C++, хотя и писал по этому языку книгу. Чтобы писать книгу вообще не нужно быть специалистом в языке. Как ты думаешь, как появляются книги по языку или технологии еще до или сразу после появления этой технологии? Я еще на третьем курсе в институте писал дипломы для шестикурсников по тем темам, которые абсолютно не понимал. И писал их на отлично. Автор должен уметь писать, должен уметь быстро разбираться в технологии и должен уметь находить примеры, которые будут интересны читателям. Я реалист и понимаю, что не все мои работы оказались хорошими. В любом случае, тут решать не мне, на сколько я хорошо описал то, о чем пытался рассказать. VR-Team: В прошлом году вы запустили несколько WEB-проектов (Персональный блог, обновили cydsoft, heapofsoftware и т.д.), что планируете в этом году в плане WEB-проектов? М. Фленов: У меня уже давно зарегистрировано два домена www.funniestworld.com и www.dphotoworkshop.com. На первом домене я еще не решил что сделать, а на втором хочу выложить бесплатную программу для работы с фотографиями. Что она будет делать - пока секрет. По свободе я иногда работаю над ней. Помимо этого на сайте будет много материалов по фотоделу, каталог бесплатных фото и т.д. VR-Team: Вы еще посещаете VR-Online? Почему в прошлом году вы решили отойти от поддержке этого проекта? М. Фленов: Иногда заглядываю, но времени все меньше. Я отказался от него, потому что ничего не мог дать ему. По этой причине уходило много народу. У каждого были свои причины, но все они чаще сводились к тому, что народ уставал просто числится. Так и я. Я уже долго просто числился. Я уже давно не писал новых статей и сейчас не пишу ни для VR ни для других сайтов. Мне проще написать заметку для блога. VR-Team: Пользуешься ли ты сервисом Twitter? Твое мнение о сервисе? М. Фленов: Не пользовался, поэтому не могу ничего сказать VR-Team: Ну и в самом конце традиционный вопрос. Чтобы бы вы хотели пожелать нашим читателям? М. Фленов: А что я могу пожелать? Конечно же удачи. Учиться, учиться и еще раз учиться.

Page 15: VR-Online (May 2009)
Page 16: VR-Online (May 2009)

11СС:: ППррееддппрриияяттииее 77..77 ППааккееттнныыйй рреежжиимм 1С версии 7.7 до сих пор является очень популярным ПО в организациях. Поэтому с ней нужно уметь обращаться. Данная статья будет полезна начинающим системным администраторам. Да, и вообще, такое стоит знать для общего развития. А расскажу я о пакетном режиме работы конфигуратора 1С. Для чего Предназначен данных режим для выполнения каких либо действий (загрузка/выгрузка, автобекап, восстановление), требующих монопольной работы с базой в то время, когда на рабочих местах никого нет. Ведь как классно придти на работу, а у тебя обмен с вышестоящими и нижестоящими подразделениями уже с утра пораньше прошёл, база отбекапилась, пофиксилась (если были необходимость). Остаётся только налить чашечку чая и приступить к разбору почты, что успела накопиться за ночь J

Для запуска конфигуратора в пакетном режиме необходимо в строке запуска указать параметр config. Для автовыбора базы необходимо следом указать путь к ней после параметра /D. Имя пользователя и пароль для автологина указываются следом, используя, соответственно, параметры /N и /P. Последним указывается путь к конфигурационному пакету с параметром /@. Получившуюся строку можно просто сохранить в bat файле и запускать его по расписанию. Благо “назначение заданий” средствами Windows прекрасно с этой задачей справляется. Итак, пример получившейся строки:

"C:\Program Files\1Cv77\BIN\1cv7s.exe" config /D"D:\1C_Data\My_base\" /NAdministrator /Ppassword /@"c:\configuration.prm"

Сам файл пакетного режима является по сути текстовым файлом, имеющий по умолчанию расширение .prm. Структура файла .prm Секция “General” – предназначена для описания основных параметров работы пакетного режима. Возможные параметры:

Page 17: VR-Online (May 2009)

• Output – путь к лог-файлу • Quit – нужно ли завершить работу конфигуратора после выполнения всех

заданий • AutoExchange – нужно ли выполнять автообмен • SaveData – нужно ли выполнять бэкап базы • UnloadData – нужно ли выполнять выгрузку • CheckAndRepair – нужно ли протестировать и пофиксить базу.

Возможными значениями данных параметров могут быть 1(Y) или 0(N). Думаю, что тут всё понятно. Секция “AutoExchange” – предназначена для определения параметров автообмена. Параметры:

• SharedMode – указывает режим работы с базы данных. Если параметр не задан, то будет по дефолту использоваться монопольный режим.

• ReadFrom - указывает от каких баз следует получать данные. Идентификаторы баз необходимо указывать через запятую. Если же необходимы все, то ставится * (звёздочка).

• WriteTo - указывает для каких баз следует выгружать данные. Если же необходимо для всех, то ставится * (звёздочка).

Секция “SaveData” – предназначена для определения параметров сохранения базы. Возможные параметры:

SaveToFile – указывает путь, куда будет производиться сохранение. FileList – указывает список сохраняемых файлов. Перечисляются имена файлов через

пробел или запятую. Секция “ UnloadData” – предназначена для определения параметров выгрузки данных. Параметры:

UnloadToFile – указывает путь сохранения, включая имя файла. IncludeUserDef – указывает нужно ли в файл переноса включать список пользователей. Password – указывает пароль, которым будет залочен файл переноса.

Секция “ CheckAndRepair” – предназначена для определения параметров восстановления базы данных. Возможные параметры:

• Repair – указывает, необходимо ли проводить восстановление базы данных. • PhysicalIntegrity – указывает, нужно ли проводить проверку физической

целостности таблиц информационной базы. • Reindex – указывает необходимость проведения реиндексации базы. • LogicalIntegrity – указывает, необходимо ли проводить проверку логической

целостности таблиц. • RecalcTotals – указывает, необходимо ли производить пересчет итогов

бухгалтерского и оперативного учета. • Pack – указывает, необходимо ли освобождать место, занятое удаленными

записями. • SkipUnresolved – указывает, пропускать неразрешенные ссылки или их

исправлять. • CreateForUnresolved – указывает, способ разрешения неразрешенных ссылок.

Если 1, то для неразрешенной ссылки будет создан объект соответствующего типа. Если же 0, то ссылка будет очищена.

Page 18: VR-Online (May 2009)

Теперь такой пример, чтоб было всё понятнее: пусть у нас во владении подчинённый филиал и в нём необходимо настроить автообмен с основной базой, а так же автосохранение. Файлы обмена будут забираться и выкладываться на ftp сервер в корень (ip для подключения - 92.92.92.92, логин - User, пароль - Pass). Итак, сначала создадим файл пакетного режима configuration.prm.

Если внимательно прочитать описание каждой секции, приведённое выше, то всё проще некуда: [General] Output = "c:\logs\log_mybase_2009.log" Quit=1 AutoExchange=1 UnloadData=1 [UnloadData] UnloadToFile="\\Server\backup\MyBase\Архив_2009\daily.zip" IncludeUserDef=1 [AutoExchange] SharedMode=0 ReadFrom=* WriteTo=* Лог будет писаться в файл log_mybase_2009.log, а бекап сейвиться на машине Server. Пусть у нас данные будут выгружаться в папку C:\Exchange. Для этого нужно сделать соответствующую настройку в конфигураторе в панели “Администрирование”. Соответственно, и загружаться данные будут из файла, скопированного в эту директорию. Теперь создадим файл, загружающий наш файл обмена (SG11.zip) на ftp сервер. Пусть он именуется ftp.put. Сохраним его в корень диска С. Рассказывать про команды работы по ftp я не буду, т.к. в рассматриваемую мною тему это не входит. Кому не понятно - разберитесь сами. open 92.92.92.92 User Pass

Page 19: VR-Online (May 2009)

lcd " C:\Exchange\" delete SG11.zip binary put SG11.zip quit Таким образом мы удалили старый файл обмена и загрузили новый. Теперь нам нужно загрузить себе файл обмена (SG10.zip) с ftp сервера. Содержимое файла ftp.get : open 92.92.92.92 User Pass lcd " C:\Exchange\" binary get SG10.zip quit Собственно, всё J. Остаётся лишь поочерёдно выполнить 3 команды:

1. ftp -s:C:\ftp.get 2. "C:\Program Files\1Cv77\BIN\1cv7s.exe" config /D"D:\1C_Data\My_base\"

/NAdministrator /Ppassword /@"c:\configuration.prm" 3. ftp -s:C:\ftp.put

Можно каждую из них засунуть в bat файл и запускать по расписанию последовательно, учитывая время, требуемое на выполнение каждой операции. И напоследок, могу из личного опыта посоветовать создать bat файл следующего содержания и запускать его после выполнения всех 3-х шагов:

move /Y "\\Server\backup\MyBase\Архив_2009\daily.zip" "\\Server\backup\MyBase\Архив_2009\%DATE%_daily.zip"

Таким образом все бекапы базы будут в своём имени иметь дату их создания. Кстати, и не стоит беспокоиться насчет расхода места на жестком диске – для базы размером в 1Gb бекап получится примерно в 60Mb. Written by: Костенко Роман aka Lord_of_fear Email: [email protected] WWW: http://vr-online.ru

Page 20: VR-Online (May 2009)

Отчет по аудиту безопасности интернет сайтов Одной из компаний, в которой я работаю ВЕБ-программистом, я предложил руководству заняться «Аудитом безопасности интернет сайтов». Так как сейчас это перспективно, тем более, что этим делом в моем регионе еще не кто не занимается. Директору понравилась идея и меня назначили специалистом информационной безопасности, и попросили меня создать шаблон отчета для клиентов. И в этой статье я расскажу тебе как составлять подобный отчет. Так как мы работаем с клиентами которые умеют только в одноклассниках тусить, то в отчете обязательно нужно все разжевывать, не писать сокращениями и не использовать компьютерный сленг. В отчете должны присутствовать скрины с ошибками для того что бы клиент видел наглядно, что его сайт дырявый. В отчете не нужно описывать уязвимости которых нет на сайте, это введет в заблуждение клиента. У документа должно быть обязательно содержание. Отчет стоит начинать писать после того как ты уже проверишь сайт и найдешь в нем уязвимости, так ты себе уже будешь мысленно представлять содержание документа. Структура отчета Вот мое содержание отчета:

1. Проверка на XSS. a. Что такое XSS b. Найденные уязвимости c. Устранение уязвимостей

2. Проверка фильтра для загружаемых файлов a. Для чего нужен фильтр на загружаемые файлы b. Найденные уязвимости c. Устранение уязвимости

3. Проверка на SQL Injection a. Что такое SQL Injection b. Найденные уязвимости c. Устранение уязвимостей

4. Тестирование формы авторизации для административного комплекса a. Какой должны бать форма авторизации b. Найденные уязвимости c. Устранение уязвимостей

5. Вывод

Как видишь по содержанию, я описываю каждую уязвимость, где нашел и как избавиться от уязвимости. Только сейчас пришла идея добавить в документ «Введение», в котором будет какое ни будь лирическое вступление об информационной безопасности. Пример реального отчета А вот и мой отчет (Имя сайта и скрины с ошибками я убрал в целях безопасности, так как ошибки я еще не исправил):

Page 21: VR-Online (May 2009)

1. Проверка на XSS

a. XSS (англ. Сross Site Sсriрting — «межсайтовый скриптинг») — тип уязвимости компьютерной системы, используется при хакерской атаке. Специфика подобных атак заключается в том, что вместо непосредственной атаки сервера, они используют уязвимый сервер в качестве средства атаки на клиента. XSS-атака обычно проводится путём конструирования специального URL, который атакующий предъявляет своей жертве.

b. При добавлении или изменении любой позиции в административном комплексе сайта, возможно внедрить вредоносный код для пользователя. На пример добавим новый раздел в каталоге, в название раздела введем код «<script>alert(“Проверка на XSS атаку”);</script>». Добавляем категорию. При просмотре каталога мы увидим следующие: Тут у меня скрин

c. Для устранение XSS атак не обходимо фильтровать принятые данные от пользователя.

2. Проверка фильтра для загружаемых файлов

a. Если фильтр на загружаемые файлы будет отсутствовать или не корректно работать, то у злоумышленника будет возможность закачать PHP скрипт на сервер и выполнять любые действия на сервере (Удалять, Изменять, Создавать файлы на сервере), а так же закачать «Shell» на сервер, что даст злоумышленнику полный контроль над сервером.

b. При добавлении или изменении любой позиции в административном комплексе интернет сайта, есть возможность закачать любой тип файла, что дает возможность злоумышленнику закачать любой PHP скрипт, в том числе и «Shell». Пример: Создадим файл (info.php), и добавим в него следующий код: <?php phpinfo(); ?>. Добавим раздел в каталог, и прикрепим наш файл(info.php) к разделу. Загруженный нами файл будет доступен по ссылке http://site.ru/img/catalog/up/info.php. Если перейти по ссылке по увидим следующее:

Тут у меня скрин

Это доказывает нам то, что злоумышленник может выполнять на сервере любые команды, что способствует к полному уничтожению данных.

c. Для устранения данной уязвимости, не обходимо разработать фильтр загружаемых файлов на сервер, и разрешить загрузку только изображений(jpg, jpeg, png).

3. Проверка на SQL Injection

a. Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода. Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на

Page 22: VR-Online (May 2009)

атакуемом сервере. Атака типа внедрения SQL может быть возможна из-за некорректной обработки входящих данных, используемых в SQL-запросах.

b. В ходе исследования данного сайта было обнаружено, что передаваемые параметры в строке запроса(URL), не фильтруются и передаются без какой либо обработки MySQL серверу, что способствует внедрению произвольного запроса, на пример: удаление, изменение и вывод данных. Пимер: если перейти по ссылке http://site.ru/catalog.php?show=makers&idpart=2&idmaker=%27%22 то мы увидим множество ошибок, из не корректных значение параметров переданных посредством запроса(URL). Тут у меня скрин

c. Что бы избежать SQL Injection, необходимо разработать фильтр для передаваемых

данных в строке запроса, удалять или экранировать опасные для sql символы.

4. Тестирование формы авторизации для административного комплекса

a. Форма авторизации должна быть устойчива к XSS атаке и к SQL Injection. b. Проверим форму на SQL Injection. Введем в оба поля(Логин и Пароль), по два

символа «’”»(Одинарная кавычка и двойная кавычка) и нажмем на кнопку «Вход». Мы замечаем, что промелькнула ошибка, после чего происходит переход на страницу авторизации. Из этого следует, что переход осуществляется средствами JavaScript у пользователя, отключаем поддержку JavaScript у браузера. И обновляем страницу. И мы видим, что мы без авторизации попадаем в административный комплекс сайта, после чего злоумышленник может использовать выше перечисленные уязвимости.

Тут у меня скрин

c. Для того, что бы избежать не сонкцианированного доступа к административному комплексу, необходимо доработать модуль авторизации: проверять на корректность вводимые данные и осуществлять перенаправление средами PHP на стороне сервера.

5. Вывод

При помощи найденных уязвимостей злоумышленник может:

• внедрить свой вредоносный код в сайта • удалять, изменять и добавлять файлы на сервере • удалять, изменять и добавлять данные в Базу данных (MySQL) • скачать всю информацию на свой компьютер • не зная данных для авторизации получить доступ к административному

комплексу сайта • повлиять на работоспособность интернет сайта • уничтожить сайт

Еще пару советов:

• Выделяй красным цветом и жирным слова которых боится клиент (например: уничтожить сайт)

• Всегда заключай договор на оказание услуг, так как могут заказать тебя конкуренты той компании чьей сайт будешь проверять

Page 23: VR-Online (May 2009)

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

• Делай бэкап сайта который будешь тестировать, на всякий случай

Удачи тебе в нашем не легком деле… Written by FriTOol aka Анатолий Скорняков E-mail: [email protected]

Page 24: VR-Online (May 2009)

VML: Быстрое знакомство Язык XML на сегодняшний день, имеет большое распространение и заявляет о себе всему миру до сих пор (XML выигрывает за счет расширяемости), к примеру, возьмем протокол jabber - XMPP, который на сегодняшний день является одним из самых известных, стандартный формат файлов OpenOffice.org, а также MS Office 2007, которые состоят из некоторого количества XML-файлов, удобно упакованных в архив. На основе этого формата был создан язык векторной разметки VML, тот в свою очередь дал развитие графическому формату SVG. Тем самым конструктивно изменив подход к веб-дизайну в целом. Вот на этих, последних, двух форматах и остановимся, более подробно. Как все начиналось Шел 1998 год, в это время, Microsoft, совместно с компанией Macromedia, представляют W3C (организация, разрабатывающая и внедряющая технологические стандарты для "Всемирной паутины") язык векторной разметки - VML (Vector Markup Language), который без особых проблем встраивался в html-код, т.е. помещался внутрь обычных web-страниц, тем самым, позволяя вручную описывать графические элементы, довольно сложной конструкции. Как я уже упоминал, VML берет свое начало от языка XML, и построен с учетом правил последнего, который разрабатывался как альтернативная замена БД. Про ХМЛ. Поэтому формат XML представляет для издателей и разработчиков особый интерес, но вернемся к истории. Немного позже, компанией Adobe началось продвижение в массы нового формата векторной графики – SVG (Scalable Vector Graphics). Важной особенностью, которой являлось то, что поддерживалась как неподвижная, так и анимированная (декларативная) и интерактивная (скриптовая) графика. В основу SVG легли языки разметки VML и PGML (язык прецизионного выделения и структурирования документов). Формат файлов был традиционно текстовый, и поэтому имело место возможность редактирования с помощью различных текстовых редакторов (большинство браузеров, тоже позволяют просматривать код svg-документа), но существует ряд программ, которые специально приспособлены для создания SVG-документов: IkivoIDE, IkivoAnimator. SVG может включать в себя не только графику, которая, кстати, меньше по весу JPEG/GIF/PNG изображений, но в некоторых случаях лучше по качеству, но и java-код, который позволит анимировать изображения, отдельно стоит отметить возможность использования мофикаторов, т.е. попросту фильтров (любителям различных эффектов посвящается), к примеру: размытие, выдавливание, сложные системы трансформации и др. При возможности в документы можно вставлять изображения (PNG, GIF или JPG), в качестве отдельных элементов. Очень широкий спектр перехвата событий (это возможно благодаря java-скриптам), от нажатия кнопки мыши до изменения параметров страницы, на котором расположен svg-документ, эта интерактивность позволяет присваивать каждому элементу отдельные скрипты, а легкая интегрированность с HTML и XHTML - документами делает этот формат более привлекательным. Не говоря уже о совместимости с CSS (Cascading Style Sheets – каскадная таблица стилей), можно предположить, что этот формат является более преемственным для web -разработчиков, чем скажем тот же крупногабаритный тяжеловесный Flash. Наконец, можно сказать, что вырисовываются четкие грани, на которые стоит обратить особое внимание:

• рисунки VML/SVG допускают масштабирование и редактирование; • быстро загружаются и занимают меньше места на диске;

Page 25: VR-Online (May 2009)

• совместимость с CSS; • интегрированность с HTML и XHTML; • никаких искажений данных при передаче через Интернет; и прибавьте сюда еще все

плюсы языка-прародителя XML. Рисуем Теперь плавно перейдем к тому, как рисовать с помощью VML. Предупрежу, что мы не будем погружаться в синтаксис языка, а рассмотрим его лишь поверхностно, тем более, что в Интернете полно ресурсов посвященных изучению VML/SVG, а если тебе лень искать, то в последнем разделе данной статьи грех не заметить ссылки на рекомендуемые мной ресурсы. Для того чтобы, включить элементы VML в свою веб-страницу, вы должны задать пространство имен VML, делается это путем дополнения тега <html>, который определяет тип документа, до <html xmlns:v ="urn:schemas-microsoft-com:vml">, и не забываем задать стиль: v\:* {behavior: url(#default#VML) }, без которого ничего далее не получится. Если ты хоть немного знаком с html, то без труда разберешься в следующем коде (Листинг 1). Здесь мы задействуем три элемента, с помощью которых создаем графические примитивы:

• roundrect (прямоугольник со скругленными углами); • arc (дуга эллипса); • textpath (текст); •

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

ниже, покажет результат нашей работы. Кроме того, можно вырисовывать объекты по точкам. Листинг 1 <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:t = "urn:schemas-microsoft-com:time"> <head> <style> v\:* {behavior: url(#default#VML) } </style> </head> <body> <v:roundrect style='position:absolute; left: 100; top: 100; width: 200px; height: 75px; rotation: 0 ' arcsize="0.55" fillcolor="yellow" strokecolor="black" strokeweight="5px"> </v:roundrect> <v:arc style='position:absolute; left: 100; top: 130; width: 200px; height: 75px;'

Page 26: VR-Online (May 2009)

strokecolor="red" strokeweight="1px" fillcolor="blue" startangle="-50" endangle="50"> <v:path textpathok="true"/> <v:textpath on="true" string="VR-online.ru" style='v-text-align: letter-justify'/> <v:textpath> </v:arc> </body> </html> Возможности языка VML не ограничиваются только рисованием двумерных объектов, очень легко можно отобразить, к примеру, и 3D-объекты (диаграммы, объемные детали, модели и т.д.). Кроме того, описав несколько графических фигур, можно объединить их в одну группу, а уже над этой группой проводить различные преобразования. Например, задать определенный угол поворота, произвести опрокидывание фигур (ы) как относительно оси «Y», так и относительно оси «X». К сожалению, хорошей поддержкой SVG и VML обладает только Internet Explorer, для всех остальных браузеров придется устанавливать плагины, для более корректной и правильной работы VML/SVG. Чтобы прочувствовать всю важность происходящего смотрим архив «svgvml3d.rar», который изобилует хорошими примерами построения объемных моделей и их позиционирование в пространстве. Заглянем в файл cubicksrubik, перед нами до боли знакомый кубик-рубик, который мы можем поворачивать и крутить, как захотим. В других примерах можем менять освещение, увеличивать/уменьшать — все это возможно благодаря java-скриптам. Основной библиотекой является файл "svgvml3d.js", который содержит необходимые функции, чтобы легко отображать 3D-объекты, определять позицию объектов, масштабировать, поворачивать, опрокидывать, задавать освещение и т.д., в своих проектах его обязательно нужно использовать , все это вы можете задействовать в своих проектах, для этого нужно просмотреть исходный код HTML соответствующих файлов. Эта библиотека, а также ряд других дополнительных файлов являются отличнейшим учебным материалом, для создания своих собственных объектов.

У заядлых java-кодеров возникнет необходимость, а она несомненно возникнет, в создании своего собственного класса, который можно определить для конкретных 3D объектов. К сожалению, как бы не был хорош VML (а таким он несомненно является), он нигде особо не задействован, разве, что Google Maps использует его опционально, для прорисовки маршрутов в IE. Обратное можно сказать о SVG, который уже успел облюбовать мобильные телефоны (тихо, но планомерно). Напоследок скажу, что я всегда открыт для общения, если вы заметили какие-либо ошибки в статье, может хотели бы дополнить ее — присылайте мне свои

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

Page 27: VR-Online (May 2009)

Ссылки по теме Подробная информация о VML (англ.) http://msdn.microsoft.com/en-us/library/bb250524(VS.85).aspx http://msdn.microsoft.com/en-us/library/bb264280(VS.85).aspx VML в энциклопедии: http://ru.wikipedia.org/wiki/XML Все, что вы хотите знать о технологии VML (англ.): http://www.w3.org/TR/1998/NOTE-VML-19980513 Все, что вы хотите знать о технологии SVG (англ.): http://www.w3.org/Graphics/SVG/ Впечатляющие примеры графики с библиотекой «jsxgraph»: http://jsxgraph.uni-bayreuth.de/wp/examples/ Written by Козлов Антон Email: [email protected]

Page 28: VR-Online (May 2009)

USB-модем от Билайна: (не)зависимое мнение Подумать только, совсем недавно чтобы выйти в сеть Интернет нужно было провести телефонную линию, затем купить модем. После этого нужно приобрести карту своего провайдера, чтобы пополнить баланс и естественно настроить соединение с сетью Интернет. Такой вариант был не из самых лучших, но на то время лучше ничего не предвиделось, по крайней мере, доступнее и дешевле. Однако современные информационные технологии не стоят на месте и постоянно ищутся другие альтернативные пути, которые заменят или дополнят существующие ныне решения. Одним из таких альтернатив стал USB-модем от Билайна. Целью данной статьи не является реклама и продвижение продуктов Билайна. Все описанное является моим субъективным мнением. Не ждите от меня критики, но и не будет незаслуженной похвалы. Экскурс Для начала стоит определиться с тем, что же такое на самом деле USB-модем. Да что тут говорить, это модем, работающий с помощью USB. Каламбур, но тем не менее все расставляется по своим местам. Другими словами, USB-модем – неплохое решение для тех, кто постоянно путешествует, но и для домашнего пользователя он не будет в тягость. Как бы я не описывал модем, его сложно представить без фоторобота, поэтому обратите внимание на рисунок № 1:

Рисунок 1 (USB-модем)

Как видите, он напоминает флеш-память, но в отличие от накопителя, внутри у него бьется механическое сердце. Через это сердце каждую секунду проходят тысячи бит и заполняют все дисковое пространство на компьютере пользователя. После чего, пользователю ничего не

Page 29: VR-Online (May 2009)

остается, кроме как докупить еще один жесткий диск либо удалить все лишнее и ненужное из недр жесткого диска. По заявлениям компании Билайн, метры проводов в прошлом. Это так, но без проводов и здесь не обошлось (далее вы поймете почему). Довольно ходить вокруг да около, пора начать вводить вас в суть дела. Итак, узнав что есть такая штука как USB-модем, я затеял социологический опрос, точнее пытался узнать более подробнее о модеме у своих знакомых. К сожалению, на тот момент никто ничего не знал об сей удивительной штучке, которая может навсегда избавить меня от того Интернета, который предоставляет локальная сеть в моем подъезде. Не добыв полезных сведений, решено было не спешить, а продолжить мучить себя и компьютер нестабильным соединением с помощью локальной сети. Чуть позже, я все-таки решился испытать новинку. Поднакопив стипендию, мне пришлось обойти несколько офисов Билайна в поисках модема. Как я понял, он только начал наращивать свою популярность в нашем городе, поэтому USB-модем так быстро исчезал с прилавка. Существует несколько исполнений модема, например как на первом рисунке в виде флешки и есть другой, который напоминает мыльницу. Она же в свою очередь подключается не напрямую к USB, а посредством короткого провода. У модема в виде флеш-памяти есть одно преимущество – это наличие Card Reader’a, которого лишена «мыльница». Card Reader способен работать с картой MicroSD. Поставляются USB-модемы в комплекте двумя USB-удлинителями – 20 сантиметров и второй – 3 метра, что вполне достаточно, если вы желаете чтобы модем не выглядывал из системного блока, а лежал перед вами на столе. Помимо всяких бумаг, купив модем, вас подключат к тарифному плану на ваш выбор. Перечислять все тарифные планы нет смысла, так как они постоянно изменяются и в разных регионах они различаются по цене. Запустим модем? Чтобы воспользоваться USB-модемом, вам нужен только сам USB-модем и компьютер. Никаких установочных дисков и танцев с бубном вам не потребуется. Все предельно просто, как установить обычную программу. В принципе, вам и необходимо установить таковую. Искать ее нигде не нужно, просто вставляете модем в USB и вам будет предложено установить программу «Билайн Интернет Дома» на жесткий диск. Кроме этого, вам не потребуется дополнительных настроек вроде прописывания IP-адреса. В программе «Билайн Интернет Дома» все уже настроено. После всей процедуры установки перед вами появится само окно программы, показанное на рисунке № 2:

Page 30: VR-Online (May 2009)

Рисунок 2 (Окно программы «Билайн Интернет Дома»)

От вас потребуется нажать на кнопку «Подключить» и через несколько секунд можно бродить по просторам Интернета. Вполне возможно, что по умолчанию соединение с Интернетом будет осуществлено через EDGE. Данное подключение представляет собой некую надстройку над 2G сетью, то есть GPRS сеть. Это не совсем удобно, так как GPRS сеть работает на заметно малых скоростях. Как было заявлено Билайном, скорость Интернета по технологии EDGE достигает до 236 Кбит/с. Заявлять можно что угодно, но в моем городе такая технология еле-еле набирала 150 Кбит/с. Это еще не все. Если вам повезло, и в вашем городе предоставляется технология 3G, то у вас на вооружении будет доступ в сеть с помощью HSDPA и UMTS. Подключиться через соединение 3G вы сможете изменив настройки соединения, нажав на кнопку «Настройки», затем «Настройки сети» и выбрав предпочтительный режим – «Только 3G»:

Page 31: VR-Online (May 2009)

Рисунок 3 (Настройка выбора сети)

После этого, сохраните изменения, нажав на кнопку «Сохранить». Как я уже сказал, у вас в распоряжении HSDPA и UMTS. UMTS – это та самая сеть 3G, которая у всех на слуху благодаря ее высокоскоростному соединению и рекламе сотовых операторов. Не знаю, как в вашем городе, но у меня UMTS едва ли переваливало за отметку в 100-150 Кбит/с. Оно и понятно, когда уже на подходе 4G, то нет смысла на полную мощь вводить в работу сеть 3G. Что-то сильно запутанно я выражаюсь? Просто UMTS – это сеть третьего поколения, но есть еще HSDPA, которая расценивается как переходное звено к сети 4-го поколения (4G). И уже за HSDPA можно порадоваться – в моем регионе скорость колеблется в пределах 400-600 Кбит/c. Не сильно уж густо, но и не слабо. Возможно, вам повезло больше, и у вас в городе 3G задействована во всю мощь. В таком случае вы можете спокойно гонять на 3 Мбит/с., и через некоторое время выкачаете весь Интернет. Мне же предстоит это сделать в ближайшее время.

Page 32: VR-Online (May 2009)

Рисунок 4 (Соединение UMTS и HSDPA)

Теперь снимем розовые очки и посмотрим на мир таким, каков он есть на самом деле. Суровая реальность

Суровая реальность – это сильно преувеличенно. На самом деле реальность не такая уж и суровая. У каждой разработки есть свои плюсы и недостатки. USB-модем также не лишен их. За недостатки, а точнее недоработки я посчитал плохой, на мой взгляд, интерфейс. Мне он не особо нравится. Гораздо симпатичнее смотрелось, если бы программа «Билайн Интернет Дома» была выполнена в классическом стиле. Конечно, настоящий интерфейс программы «Билайн Интернет Дома» придает ей некоторую индивидуальность. И тут многие мне могут возразить и во многом я могу согласиться с вами, но и во многом я предрасположен к «классике», поэтому всякие «навороты» я воспринимаю с неудовольствием. Чтобы не быть голословным, приведу снимок программы (рисунок 5). На рисунке пункты меню выделены красной линией. Такое меню действительно очень неудобное. Надо быть снайпером, чтобы попасть мышкой на нужный вам пункт. Поневоле думаешь: а нельзя ли было на крайний случай просто поставить кнопки на форму и растянуть их? Например, на рисунке № 3 смогли реализовать подобное.

Page 33: VR-Online (May 2009)

Рисунок 5 (Неудобный интерфейс программы)

В программе «Билайн Интернет Дома» предусмотрено обновление самой программы, но для того чтобы обновить ее, посылают на официальный сайт Билайна. Можно было хотя бы автоматизировать этот процесс. Иногда, при запуске программа зависает примерно на полминуты. Думаю это связано с получением динамического IP-адреса, так как в нашем случае используется динамический IP. На этом заканчиваем перечислять минусы модема. Хотя если службу технической поддержки отнести к этому разделу, то можно отметить надоедливые шаблонные фразы, которыми любят бросаться работники технической поддержки. Иногда такая речь заготовленными фразами начинает раздражать, а просить поддержку ответить своими словами не стоит – они просто перескажут смысл написанной ранее шаблонной фразы. При этом их не особо волнует, если они отвечают невпопад.

Итого На этом пора заканчивать наше повествование. В заключение позвольте добавить, что в последнее время работа модема начинает радовать. USB-модем работает все стабильнее, и вот уже последние два месяца связь при скачивании не обрывается, как это было раньше. Покупать USB-модем или нет - решать вам. Written by Hidden E-mail: [email protected]

Page 34: VR-Online (May 2009)

Так ли плоха Vista как ее малюют? Сегодня поговорим об ОС под названием Windows Vista. Многим данная статья покажется несвоевременной, так как уже подходит к концу разработка Windows Seven, которая станет преемницей висты. Но, тем не менее, лучше поздно, чем никогда. Так что давайте немного поумерим свой пыл и по-новому взглянем на эту переходную систему, которая в силу своих новых функций стала предметом многочисленных разговоров и ругани. Когда то об операционной системе под названием Vista слышали только из новостей из мира IT. Далее появились ноутбуки с предустановленной системой Vista. После того, как пользователи, привыкшие к XP, начали раздражаться такой функцией как UAC (User Account Control) эта операционная система завоевала дурную славу. Немаловажной причиной, по которой многие пользователи невзлюбили висту, было комплектование машин несоответствующим железом, которое необходимо для нормальной работы висты. В следствие этого, даже те кто не видел висту в глаза, стали говорить о ее глючности и ругали во всех земных грехах программистов Microsoft. Некоторое время так считал и я. По моему мнению, висту просто выбросили на рынок недоработанной, поэтому я всем советовал брать компьютеры с XP. Но как только стала доступна тестовая версия Windows Seven, я решил все-таки установить висту и поработать на ней до тех пор, пока не выйдет окончательный релиз Windows Seven. В силу такого перехода было несколько причин. Одной из них был тот факт, что Windows Seven многое переняла из висты и, чтобы этот переход был не так болезнен я выбрал висту. Другой не менее важной причиной послужило желание изучить систему, так как, например Windows Server 2008 имеет много общего с Windows Vista, а знать Server 2008 не помешало бы. Словом, мне захотелось одним выстрелом убить два зайца. Вопреки традиционной трактовке этой поговорки, мне удалось это сделать. Установил я Windows Vista на свой ноутбук, который должен заметить не из самых мощных. Смотрите сами:

Как видите, оперативной памяти только 1 ГБ, да и процессор не сильно мощный.

Page 35: VR-Online (May 2009)

При всем этом, на этой конфигурации Vista работает как часы. Нет, нет, я говорю не про китайские часы. Но и сказать, что работает как швейцарские будет, несправедливо. Бывают иногда «странности», но по большому счету они связаны со сторонними программами. В общем, беру на себя смелость сказать, что виста работает чуть-чуть хуже, чем швейцарские часы, но в сотни раз лучше, чем китайские. Напрашивается вопрос: почему система, столь ненавистная всем и при этом недоработанная работает не хуже, чем ее предшественница XP? Что ж, попытаюсь вспомнить, как я добился нормальной работы висты. Вы скажите: почему ты пытаешься вспомнить, как настраивал ее? Все просто: я установил висту сравнительно давно и с тех пор она у меня не вылетает. Сужу по себе, XP быстрее начинала тормозить чем виста, по крайней мере у меня. Лишние службы Я совсем не преувеличиваю, говоря о висте, факты они и в Африке факты. Начнем по порядку. Обычно, при установке новой системы я убираю лишние программы из автозагрузки, ну это все делают. Оставляю только антивирус, драйвер для тачпада (если у кого ноутбук), драйвер для боковых клавиш и драйвер функциональных клавиш. Больше ничего мне там не нужно. Та же ситуация и со стационарным компьютером. Уберите из автозапуска встроенный Защитник Windows и боковую панель. Результат будет заметен даже при первой перезагрузке. Это еще не все, запустите оснастку «Службы» (services.msc) и проделаем следующее: Примечание: Некоторые могут со мной не согласиться по поводу необходимости рассмотренных ниже действий, но пусть каждый поступает в соответствии со своими потребностями. Рассматривать службы, которые появляются после установки сторонних продуктов мы не будем . Информация приведена для опытных пользователей ,поэтому каждый для себя решает что необходимо пропустить, а что принять к сведению. Службу «Автономные файлы» ставим в состояние запуска «Вручную», службу Архивация Windows» я обычно отключаю, так как за компьютером работаю только я и никто, кроме меня не может запороть систему. «Журнал событий Windows» не имеет смысла отключать, можно лишь выставить в ручной режим запуска, но результат будет тем же: служба автоматически запустится после загрузки операционной системы. Что касаемо службы «Журналы и оповещения производительности», то я так и не увидел полезных для меня свойств, поэтому службе суждено было больше не запускаться с моей машины. Вот мы незаметно подошли к рассмотренной выше службе «Защитник Windows». Данная служба представляет собой некоторое подобие антивируса. На мой взгляд - это бесполезная функция. Обычный антивирус прилично грузит систему, а тут их два. Причем этот работает в фоновом режиме и неопытные пользователи грешат на Microsoft, не подозревая, что система в этот момент, просто проверяется на наличие вредоносных программ. Если же вы со мной согласны, то отключайте ненужную вам функцию. Следующая служба – это «Клиент отслеживания изменившихся связей». Работает эта служба так: у вас есть любимая программа, к примеру, в директории «C:\Program Files\QIP\ qip.exe» и для быстрого ее запуска вы поместили ярлык на рабочий стол. Но через пару дней за ваш компьютер садится другой человек и переименовывает файл запуска «qip.exe». Когда вы попытаетесь запустить программу, то появится следующее сообщение:

Page 36: VR-Online (May 2009)

Все предельно ясно, не найден путь, по которому находится наша программа, точнее не найден сам файл запуска, потому что он переименован. Такое происходит при отключенной службе «Клиент отслеживания изменившихся связей». Если же она работает, то путь к программе будет автоматически изменен и ваша любима программа запустится. Надо отключать ее или же нет – решать вам. Лично я отключил ее, потому что кроме меня никто не работает за компьютером. «Планировщик заданий» в XP мы привыкли отключать, но не стоит этого делать в висте, после этого пропадает языковая панель. «Поиск Windows» А вы часто ищите файлы? Если нет, отключайте. «Политика удаления смарт-карт» и также служба «Смарт-карта» предназначена для управления смарт-картами. Службы полезны тем, у кого есть смарт-карты, в таком случае их можно оставить как есть, в противном случае – отключить за ненадобностью. Если пользуетесь беспроводной сетью, вам будет необходима служба «Проводная автонастройка». «Сетевой вход в систему» я отключил, потому что не хочу, чтобы компьютер был уязвим и кто пользовался им помимо меня. Еще я не пользуюсь рукописным вводом на планшетных ПК, поэтому отключил «Служба ввода планшетного ПК». Время я могу настроить сам, и дома у меня нет сервера, поэтому служба «Служба времени Windows» в этом случае бесполезна, лучше ее отключить. «Служба загрузки изображений Windows (WIA)» отвечает за получение изображений со сканеров и цифровых камер. Многие ли пользуются стандартными средствами сканирования? Обычно вместе в фотоаппаратом и сканером поставляются драйвера, которые намного функциональнее и удобнее в использовании. Отключайте данную службу, если вы согласны со мной. «Службы терминалов» и «Удаленный реестр» я все-таки решил отключить. Удаленные помощники мне не требуются, а если что-то нужно, можно поискать в Интернете. Часто бывает ситуация, когда работаешь над каким-нибудь проектом, или же написанием курсовой работы, а важные данные находятся только в компьютере. Не редко мы ленимся сохранять данные на другой носитель и, удалив случайно важный файл, начинаешь метаться в поиске выхода из ситуации. А можно просто заставить систему делать теневую копию важных данных.

Page 37: VR-Online (May 2009)

Служба «Теневое копирование тома» как раз за это и отвечает. Как пользоваться ей я не буду рассказывать, так как эта тема выходит за рамки нашего повествования. Скажу лишь одно, если вы дорожите своими данными, то оставьте службу «Теневое копирование тома» в состоянии «Авто». В противном случае, отключив службу, мы можем незначительно увеличить производительность операционной системы. Еще я очень люблю отключать «Центр обновления Windows». С медленным Интернетом – это выглядит просто убийственно, когда и без того долго ждешь открытия страницы в браузере, а тут еще масла в огонь подливает загрузка обновлений для системы, которые имеет достаточно большой размер. В таком случае лучше отключить данную службу, но тем самым мы снизим уровень безопасности компьютера. В Windows XP ситуация с планировщиком заданий обстояла несколько иначе, можно было просто отключить его в оснастке «Службы» и он больше бы не беспокоил бы вас. Но в висте картина выглядит несколько иначе. Во-первых, просто так отключить «Планировщик заданий» вам не удастся. Придется применить бубен. Сейчас отключать его мы не будем, а займемся отключением ненужных заданий. Что я подразумеваю под ненужными заданиями? Для меня это все задания, кроме «TextServicesFramework monitor task». Это та самая языковая панель, которая отображается на панели задач. Для начала откройте «Планировщик заданий» (taskschd.msc). Слева окна планировщика вы увидите библиотеку планировщика заданий, задания которой сгруппированы по категориям. Необходимо учесть, что есть также и скрытые задачи, которые можно увидеть, если выбрать в пункте меню «Вид» строку «Отображать скрытые задачи». Теперь посмотрите на список заданий и удалите ненужные на ваш взгляд задания. Советую удалить задание дефрагментации диска, чтобы не было такой ситуации, когда компьютер начинает жутко тормозить, а вам необходимо работать в ресурсоемкой программе. Можно конечно запланировать запуск дефрагментации на время, когда вы не работаете за компьютером, тогда дефрагментация не помешает вам, а наоборот увеличит производительность. Повторюсь, что нужно оставить скрытую задачу «TextServicesFramework monitor task», иначе будут проблемы с раскладкой клавиатуры. Если с планировщиком заданий вы закончили, примемся за «косметические работы». Откройте свойства компьютера (Панель управления\Система). Откроется окно, отображающее сведения о вашем компьютере. Слева окна есть задача, под названием «Дополнительные параметры системы». Нас интересует вкладка «Дополнительно», в котором необходимо открыть параметры загрузки и восстановления. Если вы все сделали правильно, вы увидите примерно следующее:

Page 38: VR-Online (May 2009)

В группе «Отказ системы», снимите галочку с «Записать событие в системный журнал» и в группе «Запись отладочной информации» следует убрать дамп памяти. Если вы занимаетесь отладкой, то запись файла дампа можно отставить. Если вас не устраивает цветовая схема Aero и прочие визуальные эффекты, то можно вообще отключить службу «Темы». После этого на слабых компьютерах увеличится производительность, а вас не будет раздражать излишняя красота. Что ж, затронем за больное, а именно UAC (User Account Control). На мой взгляд - это очень нужное нововведение, но чуточку не обточенное. Мой совет - не отключать его, но если же вы надумали отключить, то, пожалуйста. Откройте учетные записи пользователей в Панели управления, найдите пункт «Включение и отключение контроля учетных записей (UAC)», затем уберите галочку с «Используйте контроль учетных записей (UAC) для защиты компьютера» нажмите «Ok» и перезагрузите компьютер. Больше вам не будет надоедать Контроль учетных записей, но компьютер будет менее защищен. Вот собственно и все, что я хотел вам рассказать. Буду искренне рад, если вам поможет эта статья разобраться в некоторых трудных для вас вопросах. Удачи. Written by Hidden Email: [email protected]

Page 39: VR-Online (May 2009)
Page 40: VR-Online (May 2009)

WEB-сервер на Delphi В качестве WEB-сервера, практически все без исключения привыкли юзать мощный и тяжелый Apache. Да, это хороший и качественный продукт, но согласись, зачем использовать такую махину для какой-нибудь одноразовой и мелочной операции (например, дать доступ к файлам по http)? Я думаю не зачем, поэтому я предлагаю тебе взять в руки молоток с гвоздями и сколотить свой собственный WEB-сервер. Как работает WEB-сервер Перед тем как начать размахивать молотком, давай потратим немного времени и разберемся с теоретической частью, иначе есть сильно большой шанс отбить себе пальцы. Итак, Web-сервер – прежде всего обычная программа. Такие программы висят на 80 порту и ждут подключения клиентов – web-браузеров. Как только клиент устанавливает соединение (используется протокол HTTP), начинается обмен данными. Клиент формирует запрос на получения документа/файла и посылает его серверу (пример такого запроса мы рассмотрим чуть позже). Полученную информацию сервер тщательно анализирует и если все тип-топ, то возвращает положительный ответ (коды ответов сервера смотри в таблице № 1) и собственно сам документ. Закончив передачу документа, web-сервер разрывает соединение с клиентом (если не было иной договоренности) и ждет следующего запроса. Тонкости HTTP Протоколом HTTP (HyperText Transfer Protocol) каждый из нас пользуется ежедневно. Мы уже привыкли, что для получения нужного web-документа от нас лишь требуется ввести адрес сервера в своей бродилке и ожидать результата. Само собой, о том, какие данные в этом время браузер передает серверу, мало кто задумывается. Но поскольку сегодня нам предстоит выступать в роли сервера, мы просто обязаны уделить несколько минут на рассмотрение внутренностей HTTP. HTTP – протокол прикладного уровня и как и многие другие работает поверх TCP/IP. В основе протокола лежит до боли известная технология клиент-сервер. Ты уже должен знать, кто выступает клиентом, а кто сервером, поэтому двадцать раз одно и тоже я повторять не стану. Для получения информации по HTTP, клиенту необходимо подготовить запрос, которой должен содержать идентификатор запрашиваемого ресурса (Uniform Resource Identifier). По URI сервер и будет искать нужный документ. По правилам хорошего тона, каждый HTTP запрос должен состоять из трех неотъемлемых частей: 1. Стартовая строка. Она определяет тип запроса. 2. Заголовок. В заголовке содержаться дополнительные сведения (название программы, поддерживаемые кодировки и т.д.). 3. Тело. Для наглядности, ниже я привел реальный текст запроса, который я отснифал у FireFox при попытке зайти на локальный сайт. Для более удобного восприятия и комментирования, каждую строку запроса я снабдил порядковым номером. //Стартовая строка 1. GET / HTTP/1.1 //Заголовки 2. Host: localhost:8080 3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9) Gecko/2008052906 Firefox/3.0 4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 5. Accept-Language: ru,en-us;q=0.7,en;q=0.3 6. Accept-Encoding: gzip,deflate 7. Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 8. Keep-Alive: 300

Page 41: VR-Online (May 2009)

9. Connection: keep-alive 1. Первая строка является ключевой. В ней мы должны указать метод (команду) и его параметры, определяющие наши дальнейшие действия. В данном примере использован метод GET (применяется для запроса документа), а в качестве URI обратный слеш, который говорит о том, что нас интересует индексная страница. После имени запрашиваемого ресурса, указана версия протокола, по правилам которой будет происходить обмен данными. 2. Со второй строки начинается описание заголовков. В первую очередь определяется адрес и порт сервера, у которого будут запрошены данные. 3. Строка носит чисто информативный характер и предназначена для идентификации программы, которая отправила запрос. 4. Эта строка определяет тип содержимого, который может быть принят клиентом. 5. Смысл этой строки такой же, как и у предыдущей, но с одним отличием – она определяет национальные языки. 6. В этой строке задается тип кодирования страницы. 7. В Accept-Charset устанавливается предпочтительная кодировка. 9 и 10, в этих строчках устанавливается режим работы с WEB-сервером. В частности здесь определяется, есть ли необходимость производить отключение после окончания передачи данных. Получив такой запрос, WEB-сервер должен его проанализировать и отправить ответ (смотри таблицу ответов сервера). Примерный ответ выглядит так: HTTP/1.0 200 OK Server: Apache Content-Length: 1341 Content-Type: text/html Connection: close Формат ответа от сервера идентичен формату запроса клиента. Главное отличие в используемых директивах. Как видно из примера, в качестве стартовой строки указывается лишь версия протокола и код состояния. В приведенном примере записан код 200. Далее идут заголовки. Подробней мы их рассмотрим на практике. Код Описание 100 Continue Первая запись запроса принята, клиент может начинать слать

остальные 200 OK Запрос успешно обработан 201 Create Создан новый URI 202 Accepted Запрос принят, но обработан будет позже 400 Bad Request Неправильный запрос, обнаружена лексическая ошибка 403 Forbidden Запрос отклонен 500 Internal Server Error

При обработке запроса, один из компонентов выдал ошибку

501 Not Implemented

Сервер не может выполнить запрошенное клиентом действие

502 Bad Gateway Недопустимый ответ от посредника (например, Proxy) 505 HTTP Version Сервер не поддерживает указанную в запросе версию HTTP

Page 42: VR-Online (May 2009)

not supported Выбираем гвозди С введением в основы HTTP покончено и этих знаний тебе вполне хватит для дальнейшего понимания сегодняшнего урока. Теперь самое время определится с набором необходимого инструментария, которым сегодня нам предстоит воспользоваться. Сегодняшний пример, мы будем целиком писать на Delphi и с использованием одних лишь WinAPI функций. Такой путь более труден, но зато позволяет забыть о неудобстве и тормознутости многих компонентов (особенно тех, которые «помогают» создавать сетевые сервисы) и разработать более гибкое и функциональное приложение. Все функции для работы с сетью, определены в наборе WinSock API. Эта билиотека содержит множество функций на любой случай жизни. Про функции входящие в эту библиотеку я уже не раз рассказывал, поэтому сегодня я особо останавливаться на них не буду. Всю дополнительную информацию, ты можешь найти в предыдущих выпусках нашего журнала. Куем индейца Запускай Delphi и создавай новый проект. Для сегодняшнего примера нам не потребуется форма, поэтому сразу ее удали: «Project -> Remove Form Project», а затем открой исходник проекта – «View -> Source». Во избежание курьезных ситуаций, вроде внезапного отключение света, потрать пару секунд и сохрани проект.

Рисунок 1 (Никаких форм, только код и еще раз код)

Создаем настройки

Page 43: VR-Online (May 2009)

У любого WEB-сервера как минимум должны существовать три настраиваемые опции: 1. Путь к корневой директории. В ней располагаются файлы и папки, доступные для клиенту. 2. Порт. По умолчанию, все WEB-сервера для своей работы используют 80 порт, но к сожалению, этот порт может быть занят другим приложением, поэтому в своей программе это нужно учесть и предоставлять возможность выбирать произвольный порт. 3. Имя индексной страницы. Когда клиент в своем запросе указывает / или просто имя папки, то это означает, что он желает получить основную страницу каталога. Обычно индексную страницу именуют как index.html (расширение может быть любым), но многие любят отступать от правил и выдумывать другие имена, поэтому желательно иметь возможность изменять наименование индексного файла. В своем примере я не стал париться и реализовал эти опции с помощью трех констант (DOCUMENT_ROOT, PORT и DIRECTORY_INDEX). Для реального приложения такой способ не удобен (т.к. тебе придется поставлять свое творение в исходниках, а бедному пользователю мучиться с их компиляцией), но для демонстрационного он вполне подойдет. С константами разобрались, двигаемся дальше. Если ты читаешь наш журнал постоянно, то уже должен знать, что перед тем как начинать использовать WinSock API, нужно проинициализировать сетевую библиотеку с помощью функции WSAStartup(). Ей нужно передать всего лишь два параметра:

• Версию библиотеки • Структуру типа TWSAData. Пример вызова этой функции я приводить не стану, т.к. ты

уже должен знать, как это делается. На крайний случай у тебя под рукой архив журнала, а в нем лежит полный исходник.

Проинициализировав сетевую библиотеку, у нас появляется возможность, использовать абсолютно любые WinSock API функции, а значит, мы можем открыть порт и запустить цикл ожидания новых клиентов. Для удобства использования и эстетичности, код «прослушки» я вынес в отдельный поток и обозвал его TListenThread. Если ты вдруг решишь написать WEB-сервер с графическим интерфейсом, то тебе обязательно придется выполнять прослушивание в отдельном потоке, иначе твое приложение заснет непробудным сном. Содержимое моего потока приведено в листинге №1. Листинг 1 (Прослушивание порта). var _listenSocket, _clientSocket:TSocket; _listenAddr, _clientAddr: sockaddr_in; _clientThread:TClientThread; _size:integer; begin _listenSocket := socket (AF_INET, SOCK_STREAM, 0); if (_listenSocket = INVALID_SOCKET) then begin MessageBox (0, 'Socket create Error', 'warning!', 0); Exit; end; _listenAddr.sin_family := AF_INET;

Page 44: VR-Online (May 2009)

_listenAddr.sin_port := htons(ListenPort); _listenAddr.sin_addr.S_addr := htonl(INADDR_ANY); if (Bind(_listenSocket, _listenAddr, sizeof(_listenAddr)))=SOCKET_ERROR then begin MessageBox (0, 'BIND Erorr', 'warning!', 0); Exit; end; if Listen(_listenSocket, 4) = SOCKET_ERROR then begin MessageBox (0, 'Listen Error', 'warning', 0); Exit; end; while true do begin _size := sizeof(_clientAddr); _clientSocket := accept(_listenSocket, @_clientAddr, @_size); if (_clientSocket = INVALID_SOCKET) then Continue; _clientThread := TClientThread.Create(true); _clientThread._Client := _ClientSocket; _clientThread.DocumentRoot := DocumentRoot; _clientThread.DirectoryIndex := DirectoryIndex; _clientThread.Resume; end; Начинай его переписывать и краем глаза заглядывай в мои комментарии. В самом начале листинга, я создаю новый сокет, который будет использоваться для прослушивания. Для его создания, я использую функцию socket. В качестве параметров ей требуется передать: 1. Семейство протоколов. Мы собираемся использовать Интернет протокол, поэтому указываем AF_INET. 2. Тип сокета. В WinSock API выделяется два типа сокета: SOCK_STREAM (для протокола TCP/IP) и SOCK_DGRAM (для протоколов, не требующих установки соединения, например UDP). Мы работаем с TCP/IP и поэтому указываем SOCK_STREAM. 3. Протокол. Для TCP нужно указать IPPROTO_TCP. Выполнив функцию, нужно обязательно проверить ее результат. Для проверки достаточно сравнить возвращенное значение с константой INVALID_SOCKET. Если они равны, то 100% произошла ошибка, и нет смысла продолжать работу. Если бог миловал и сокет таки создался, нужно заполнить структуры типа sockaddr_in. У этой структуры 3 поля для заполнения:

• sin_family - семейство протоколов. Указываем тоже значение, как и для первого параметра функции socket.

• sin_port – используемый порт. Номер порта, который мы будем «слушать» содержится в

переменной ListenPort, поэтому в это свойство присваиваем значение этой переменной.

Page 45: VR-Online (May 2009)

• sin_addr.S_addr – интерфейсы, с которых мы будем принимать соединения. Чтобы не заморачиваться, нужно просто указать константу INADDR_ANY, которая говорит, что нас интересуют абсолютно все интерфейсы.

Теперь у нас есть заполненная структура и созданный сокет. Для дальнейших действий их нужно связать. Связь устанавливается с помощью функции Bind(), которая принимает всего лишь три параметра:

• созданный сокет • заполненная структура sockaddr_in • размер структуры.

Если Bind() не вернула ошибок, то значит все готово для вызова функции Listen(). После этого, наш сокет перейдет в состояние ожидания новых подключений. В качестве параметров, функция Listen() принимает: - сокет. - длина очереди соединений. Поскольку мы создаем WEB-сервер, то изначально подразумевается, что клиентов может быть несколько, причем несколько одновременно. Поэтому чтобы никто не стоял в очереди я запускаю бесконечный цикл, в котором вызывается функция Accept(). Если после выполнения данной функции не возникло ошибок, то значит, новый клиент успешно подключился и для него нужно создать отдельный поток – TClientThread. В этом потоке и будет происходить обработка запросов пользователя и отправка соответствующих документов. Исходный код потока TClientThread приведен в листинге 2, поэтому не засиживайся и начинай его переписывать, а я постараюсь, как можно тщательней его прокомментировать. Листинг 2 (Взаимодействие с клиентом) var _buff: array [0..1024] of char; _request:string; _temp: string; _path: string; _FileStream : TFileStream; begin Recv(_client, _buff, 1024, 0); _request:=string(_buff); if _request='' then begin CloseSocket(_client); exit; end; AddToLog(_request); _path := GetFilePath (Copy(_request, 1, pos(#13, _request))); _path := ReplaceSlash(_path); if ((_path = '') or (_path = '\')) Then _path := DocumentRoot +'\' + DirectoryIndex; if (FileExists(_Path)) Then begin _FileStream := TFileStream.Create(_Path, fmOpenRead); SendStr(_Client, 'HTTP/1.0 200 OK');

Page 46: VR-Online (May 2009)

SendStr(_Client, 'Server: xSrV'); SendStr(_Client, 'Content-Length:' + IntToStr(_FileStream.Size)); SendStr(_Client, 'Content-Type: ' + GetTypeContent(_Path)); SendStr(_Client, 'Connection: close'); SendStr(_Client, ''); SendFile(_Client, _FileStream); _FileStream.Free; end else begin _path := ExtractFilePath(ParamStr(0)) + '404.html'; _FileStream := TFileStream.Create(_Path, fmOpenRead); SendStr(_Client, 'HTTP/1.0 404 Not Found'); SendStr(_Client, 'Server: xSrV'); SendStr(_Client, 'Content-Length:' + IntToStr(_FileStream.Size)); SendStr(_Client, 'Content-Type: ' + GetTypeContent(_Path)); SendStr(_Client, 'Connection: close'); SendStr(_Client, ''); SendFile(_client, _FileStream); end; Terminate(); Сразу после старта потока TClientThread, я вызываю функцию Recv(), которая позволяет читать данные, прилетевшие на сокет. Из параметров я передаю: - Сокет, с которого нужно читать. - Буфер, в который нужно читать. - Размер буфера. После чтения, все полученные данные я копирую в переменную _request и сразу же проверяю ее значение. Если она пуста, то значит, клиент не отправил запрос и ничего не остается, как закрыть сокет и прервать выполнения процедуры. Ну а если данные все-таки есть, то их нужно добавить в лог (надо же знать, кто к нам подсоединялся), и приступить к анализу запроса. Весь анализ заключается в выдергивании из заголовка стартовой строки и получения из нее пути и имени запрашиваемого документа. Для вытаскивания этой информации я создал простенькую функцию и назвал ее GetFilePath(). В качестве одного единственного параметра ей требуется передать первую строчку полученного от пользователя запроса (именно в ней находится стартовая строка). Получив эту строку, функция начнет ее проверять на предмет наличия метода GET. Если он будет найден, то указанный в нем URI будет вырезан и возвращен в качестве результата. Я не стал приводить в статье код этой функции, так он очень простой и в нем лишь использованы известные каждому Delphi-программисту функция для работы со строками. Полученный путь к документу, я скармливаю еще одной самописной функции -ReplaceSlash(), которая заменит все обратные слэши (/), используемые в nix системах, на их win братьев – (\). Путь запрашиваемого документа у нас есть, теперь остается только получить полный путь, относительно директории определенной в DocumentRoot. Для этого я проверяю переменную

Page 47: VR-Online (May 2009)

_path. Если ее значение пустое, либо равно “\”, то пользователю нужно отправить индексную страницу или индексную страницу определенной папки. Теперь, когда мы знаем полный путь к документу, нам не составит труда отправить его клиенту. Но перед отправкой обязательно нужно убедиться в существовании требуемого файла. Ведь вполне возможно, что пользователь просто ошибся, набирая адрес в своей бродилке, и такого документа у нас может и вовсе не быть. Что в этом случае делать? Молчать? Нет, отмалчиваться не стоит, иначе клиент подумает, что сайт просто недоступен. Чтобы этого не случилось, достаточно просто оправить страницу, содержащую код ошибки. В данной ситуации это будет ошибка 404. Для определения наличия файла, я использую стандартную функцию FileExists(). Если она вернет, тру, то значит все Ok и следует начать отправку запрошенного файла, а если нет, то передать заранее подготовленную страницу с ошибкой 404. Давай взглянем на случай, при котором файл найден, а действия при отсутствия файла аналогичны. Для передачи файла клиенту, необходимо загрузить этот файл в поток (объект типа TFileStream). Объект инициализируется стандартным способом, т.е. через метод Create(). Из параметров этот метод просит: 1. Путь к файлу. 2. Тип доступа. Нам нужен файл только для чтения, поэтому я указываю fmOpenRead. После загрузки файла, нужно приступать к формированию и отправлению ответа для клиента. Вся текстовая часть заголовка отправляется с помощью самописный функции SendStr(). В качестве параметров ей нужно передать: - Сокет, которому нужно послать данные. - Отправляемая строка. В принципе не обязательно объявлять свою функцию для отправки данных. Я это сделал лишь для удобства. Моя реализация функции избавляет от постоянного добавления к отправляемой строке символов завершения строки (#13) и перевода каретки (#10). Т.е. проще говоря, выполнять отправку данных ты можешь с помощью примерно такой конструкции: var _buff: array [0..255] of char; _temp: AnsiString; begin _temp :=str+#13+#10; CopyMemory(@_buff, PChar(_temp), Length(_temp)); send(s, _buff, Length(_temp), 0); С функцией отправки текста заголовка разобрались, теперь давай вернемся к самому заголовку. Как ты помнишь из теории, запрос клиента и ответ от сервера начинается со стартовой строки, содержащей версию HTTP и код ответа от сервера. Поскольку запрашиваемый файл у нас есть, и мы готовы им поделиться, то в качестве кода нужно указать 200 OK. Сразу после отправки стартовой строки, необходимо сформировать и отправить заголовки. В заголовке я указываю: - Server. Определяет имя и версию сервера, отправившего документ. - Content-Length. Размер отправляемого документа - Content-Type. Тип документа. - Connection. Есть ли необходимость после передачи закрывать соединение. Передав заголовки, можно отправлять сам файл. Для отправки файла используется процедура SendFile(), код который приведен в третьем листинге. Перед тем как начать рассматривать содержимого последнего листинга, я хочу, чтобы ты обратил внимание на строчку, в которой происходит отправка типа

Page 48: VR-Online (May 2009)

содержимого передаваемого файла. Эта строчка играет огромную роль и от нее зависит, как поведет себя браузер клиента. Например, если пользователь запросил архив, а мы в content-type указали text/html, то наверняка браузер просто-напросто начнет загружать архив как обычную страницу и пользователь увидит всякие непонятные символы. Чтобы этого не произошло, я написал функцию, GetTypeContent(), которая по расширению отправляемого файла будет определять его тип. Например, если передать этой функции в качестве параметра file.zip, то она вернет: application/x-zip-compressed. Получив такую строку, браузер не будет пытаться загрузить и отобразить этот файл, а просто запросит у пользователя путь для сохранения и спокойно начнет его скачивать. Думаю, с этим моментом мы разобрались и теперь готовы приступить к рассмотрению последнего листинга. Функция SendFile() написана для более удобной отправки файлов клиенту. В качестве параметров ей необходимо передать сокет, которому будем отправлять файл и поток, содержащий файл. Передавать файл мы будем маленькими частями. Для этого я определяю буфер размером 5000 байт и запускаю бесконечный цикл. В теле цикла я читаю кусок отправляемого файла в наш буфер и выполняю передачу клиенту с помощью уже знакомой тебе функции send(). Чтобы узнать момент отправки файла и выйти из цикла, после очередного чтения, я проверяю переменную _ret на равенство 0. Если ее значение равно нулю, то значит, файл уже полностью отправлен клиенту и следует прервать цикл. Листинг 3 (Процедура SendFile()) var _buff:array [0..5000] of char; _ret:integer; begin while true do begin _ret := FileStream.Read(_buff, sizeOf(_buff)); if (_ret = 0) Then Break; Send(s, _buff, _ret, 0); end; Протестим Наш пример готов и чтобы убедиться, что все работает как надо, его нужно хорошенечко протестировать. Для теста я подготовил две самодельные WEB-страницы и один zip архив и поместил их в папку, путь которой определен в константе DocumentRoot. Скомпилировав и запустив пример, я попробовал запросить эти страницы с помощью моего любимого FireFox. Не успел я, и моргнуть, как огненный лист успешно соединился с моим web-сервером и получил индексную страницу. Мне этого показалось мало, и я решил запросить созданный мной архив. К счастью и этот запрос был правильно выполнен. Результаты моего тестирования ты можешь увидеть на рисунках 2-4.

Page 49: VR-Online (May 2009)

Рисунок 2 (Индексная страница успешно загружена!)

Рисунок 3 (И по ссылкам ходит правильно)

Page 50: VR-Online (May 2009)

Рисунок 4 (FireFox успешно определил, что передается архив)

Coding complete На этом лекцию по созданию нового конкурента для Apache считаю оконченной. Наш простенький WEB-сервер готов и уже сейчас может выполнять простейшие операции. Тем не менее, перед использованием сервера в боевых условиях, я рекомендую тебе немного его доработать. Лично я бы первым делом снабдил код проверками на ошибки, добавил бы красивое ведение лога и реализовал поддержку остальных HTTP методов и т.д. В общем, плацдарм для творчества немалый. Мне теперь остается лишь пожелать тебе удачи и попрощаться. Исходники примера находятся в папке source/web-сервер на Delphi Written by Игорь «Spider_NET» Антонов E-mail: [email protected] WWW: http://vr-online.ru

Page 51: VR-Online (May 2009)

Zend Framework: Начало начал

Ты еще мучаешься и в n-раз пишешь однотипные модули для сайта? Изобретаешь велосипед и пытаешься отделить дизайн проекта от кода? Ищешь реализацию необходимой функции в сомнительных форумах? Если на один из этих вопросов ты ответил да, то эта статья однозначно для тебя. В ней я расскажу тебе про мощный бесплатный фреймворк (Content Managment Framework), изучив который ты не только будешь экономить время на разработку проекта, но и поднимешь качество своих работ на новый уровень. Итак, усаживайся по удобнее, и читай мою первую статью из цикла "Учимся работать с Zend Framework".

Зачем использовать Zend Framework?

Основная задача любого CMF сократить время разработки проекта. Используя данный продукт, ты сможешь добиться:

1. Постоянной структуры проектов. Проблема большинства проектов, разрабатываемых с нуля - отсутствие постоянной структуры. Сначала ты засунул нужную функцию в один модуль, в следующем проекте ты понял, что сделал ошибку и решил все поменять. В итоге, чем больше ты создаешь сайтов/web-приложений, тем больше ты совершенствуешь свои знания, а значит вносишь изменения в структуру новых проектов. А вот теперь попробуй представить, что тебе рано или поздно придется вернуться к поддержке/доработке своего самого старого проекта. Уверен, что ты просто запутаешься или потратишь много времени на разбор кода. При создании web-приложений на базе фреймворков эта проблема отпадает, т.к. ты всегда руководствуешься правилами. Такой подход может гарантировать, что даже при необходимости доработать самый старый проект, ты всегда будешь знать его структуру и без труда сможешь внести доработки.

2. Повысить скорость разработки. В ZF реализовано множество классов, позволяющих реализовать множество типовых действий. Тебе не нужно будет изобретать очередной велосипед, т.к. у тебя имеется целый КАМАЗ уже готовых великов :).

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

А это не сложно?

Кто то говорит что ZF слишком сложен для понимания, тяжеловесный, требует много ресурсов сервера. В реале это не так. Если ты смог освоить php, то разобраться с ZF сможешь и подавно, а что касается тяжеловесности, то хорошая диета без проблем устранит этот недостаток.

Плюсы и минусы ZF

Идеальных решений не бывает и ZF не исключение. У него есть свои минусы и плюсы, о которых мы сейчас и поговорим. Начнем с минусов:

Page 52: VR-Online (May 2009)

1. Тяжеловесный, версия 1.8.a весит 17 с копьем метров (так, не нужно бояться), хотя это не так уж и много. Если тебя напугал размер, то посмотри готов размеры многих коммерческих CMS. Почти все они переваливают за 10 метров и это неудивительно, ведь функций у них до фига. С ZF аналогичная история. Возможностей он предоставляет массу, но не факт, что ты ими всеми сможешь воспользоваться.

2. Требует много времени для изучения. На самом деле здесь все индивидуально. Одни могут целый год топтаться на месте, а другим достаточно несколько дней и они уже готовы писать свои первые приложения.

3. Ресурсоемкий. Если честно, то я не видел еще не одного хостера который бы загнулся от ZF.

Это все, что я обнаружил из минусов. Теперь плюсы:

1. ZF — набор классов, большинство которых не привязаны к друг другу, а значит можно использовать как по запчастям в других проектах так и полностью. В данном каркасе есть все, что нужно в современном ВЕБ проекте.

2. Наличие компонентом для работы со сторонними сервисами.

3. Объектно ориентированный подход.

4. Основывается на идеях MVC.

5. Хорошая документация.

Так, хватит. Не будем больше грузиться теорией и перейдем сразу к практике. Оценим так сказать возможности гиганта :) Для работы нам понадобиться сам ZF, его можно взять от http://framework.zend.com/download/latest, HTTP север с поддержкой mod_rewrite, PHP не ниже версии 5.2, и MySQL5. Скачиваем последнею стабильную версию. Кстати чуть не забыл, скачать ZF можно в двух разных сборках Full и Minimal.

Full Package — содержит в себе Dojo Toolkit, и демки по работе с каркасом. Поскольку ты только приступаешь к изучению этого фреймворка, то рекомендую скачать именно этот вариант. Изучение демок еще никому не повредило.

Minimal Package — содержит только библиотеку ZendFramework.

Распаковываем папку с каркасом(/library/Zend), ZF лучше держать на несколько уровней выше, что бы не плодить файлы для каждого проекта, у меня на пример получилось так в нутрии этой папочки D:\library\ZF\1.7.8\Zend\ .

Page 53: VR-Online (May 2009)

Делаем структуру проекта

Организуем файловую структуру для нашего будущего проекта. В корне приложения создаем два каталога, application — там будут храниться все наши программные модули проекта и public в которой будут находиться обще доступные файлы. Так же в корне создадим index.php и .htaccess в который сразу добавим правила перенаправления.

Файл .htaccess:

RewriteEngine on RewriteRule .* index.php

В папку public тоже нужно добавить .htaccess только с другим содержанием. Файл /public/.htaccess: RewriteEngine off В папки application создадим 3 папки: configs, library, modules. configs — тут будут файлы конфигураций проекта. library — здесь будут дополнительные библиотеки. modules — а тут будут находиться модули нашего приложения. После всех этих нехитрых манипуляций у меня получилась вот такая структура: Корень: application configs library modules public .htaccess .htaccess index.php

Раз структура готова, то можно переходить к кодингу ;-)

Открываем наш индексный файлик — index.php. Указываем интепритаору, что сейчас начнется php код и определим четыре константы:

PATH_TO_ZF — путь до ZF PATH_TO_APPLICATION — путь к нашей папочки application PATH_TO_LIBRARY – путь к нашем библиотекам PATH_TO_MODULES – путь к нашим модулям

Page 54: VR-Online (May 2009)

Код:

define('PATH_TO_ZF', '../../../ZF/1.7.7/'); define('PATH_TO_APPLICATION', './application/'); define('PATH_TO_LIBRARY', PATH_TO_APPLICATION . 'library/'); define('PATH_TO_MODULES', PATH_TO_APPLICATION . 'modules/');

Теперь укажем интепритатору от куда подгружать все наше добро:

Код:

set_include_path(PATH_TO_ZF . PATH_SEPARATOR . PATH_TO_APPLICATION . PATH_SEPARATOR . PATH_TO_LIBRARY);

Так, следующим шагом нужно подгрузить Zend_Loader (чуть позже мы к нему вернемся) и зарегистрируем автозагрузку классов

Код:

require_once 'Zend/Loader.php'; Zend_Loader::registerAutoload();

Так, Zend_Loader подгрузили, теперь проинициализируем Zend_Controller_Front (о нем тоже чуть позже) и укажем диспетчеру местонахождения наших модулей. После этого запустим процесс диспетчеризации.

Код:

$controller = Zend_Controller_Front::getInstance(); $controller->addModuleDirectory(PATH_TO_MODULES) ->dispatch();

В итоге должно получиться что-то вроде этого:

<?php define('PATH_TO_ZF', '../../../ZF/1.7.7/'); define('PATH_TO_APPLICATION', './application/'); define('PATH_TO_LIBRARY', PATH_TO_APPLICATION . 'library/'); define('PATH_TO_MODULES', PATH_TO_APPLICATION . 'modules/'); set_include_path(PATH_TO_ZF . PATH_SEPARATOR . PATH_TO_APPLICATION . PATH_SEPARATOR . PATH_TO_LIBRARY); require_once 'Zend/Loader.php'; Zend_Loader::registerAutoload(); $controller = Zend_Controller_Front::getInstance(); $controller->addModuleDirectory(PATH_TO_MODULES) ->dispatch();

Page 55: VR-Online (May 2009)

Как вы заметили Zend_Controller_Front нигде не подгружается, т.к. Zend_Loader подгрузил Controllet автоматически. Узнает Zend_Loader расположение контроллера по его имени:

Zend_Controller_Front лежит в Zend/Controller/Fron.php

Немного о контроллере

Zend_Controller_Front реализует паттерн Синглетон, а значит он может быть инициализирован в проекте только один раз. При вызове метода dispatch(), диспетчер уходит в цикл диспечерезации, проходящий три события: 1. Маршрутизация — определяет какой модуль, контроллер и событие вызвать. Если не прописаны другие пути, то: site.ru/modules/controller/action/var1/value1/var2/value2/. Возможно также переопределение путей при помощи Zend_Controller_Route, но об этом в следующей статьей. 2. Диспетчеризация — проверка на наличие вызываемого модуля, контроллера и события, и вызов события. 3. Ответ — Рендеринг вида.

Делаем модуль

В нашей папке modules создадим папку default, это будет наш первый модуль. Если мы обратимся к нашему сайту по ссылке site.ru то будет выполняться наш дефолтный модуль. Имя дефолтного модуля можно изменить на пример на "index". Делается это с помощью метода -setDefaultModule(), объекта Zend_Controller_Front. Вызывать метод нужно обязательно перед диспетчеризацией. В качестве параметра методу нужно переадать имя модуля, которую будет использоваться по умолчанию.

Код: $controller->setDefaultModule('index');

Едем дальше. В папке модуля создадим еще две папки:

controllers — тут будут контроллеры модуля views — а здесь все что связано в видом (представлением)

Создадим новый контроллер(IndexController.php), и вставим в него вот этот код:

<?php

class IndexController extends Zend_Controller_Action

{

public function indexAction()

{

return;

Page 56: VR-Online (May 2009)

}

}

Теперь нужно создать скрипт вида для нашего контроллера. Для этого создадим в папке views папочки scripts/index. Должно получиться примерно так: default controllers IndexController.php views scripts index

В папке views/scripts/index/ создадим файлик index.phtml. Все, можно пробовать запускать! Если ошибок нету, то значит ты меня хорошо слушал :) Теперь добавим событие:

$this->view->var = ‘ZendFramework’;

Общий вид контроллера у меня выглядет так:

<?php

class IndexController extends Zend_Controller_Action

{

public function indexAction()

{

$this->view->var = ‘ZendFramework’;

}

}

А в файл вида добавим:

<?php echo $this->var; ?>

И обновляем страницу.

Page 57: VR-Online (May 2009)

Создадим 404 страницу

Создаем еще один контроллер в нашем модуле, ErrorController.php

Содержание ErrorController.php:

<?php

class ErrorController extends Zend_Controller_Action

{

public function errorAction()

{

return;

}

}

Теперь сделаем представление для ошибки: /default/views/scripts/error/error.phtml

Содеражание error.phtml:

<h1>404</h1>

Для тестирования перейдем по site/qwerty. Такой страницы у нас нет, поэтому резульат будет соответствующий. Для того что бы включит выводить ошибки из-за которой остановлена работа скрипта перед диспечерезаций вызываем метод throwExceptions() и передавем соответствующий парамер, если хотим видить ошибку, то true и если хотим видить при ошибка созданную нами страницу то false.

Coding Compleate

Для начала думаю, что хватит. Для первого знакомства мы рассмотрели достаточно много интересных вещей. Пока может быть не все понятно, но не волнуйся. Мастерство приходит со временем. Главное не лениться и пытаться что-то сделать. В статьей я упомнялу, что ZF базируется на архитектуре MVC. В статье я не стал делать упор на теорию, т.к. ее написано уже в достаточном объеме и ты можешь найти ее в инете самостоятельно. Если тебя испугали или ввели в тупик слова "вид", "контроллер", то бегом открывай гугл и читай основы MVC. Все, на этом разрешите откланяться. До скорой встречи!

Written by FriTOol ([email protected]) Edited by Spider_NET ([email protected])

Page 58: VR-Online (May 2009)

Adept framework: Нестандартный CMF Профессиональные WEB-программисты не любят тратить свое время зря и писать один и тот же код несколько раз. С этой проблемой все борются по-разному: некоторые пытаются изобрести универсальный набор модулей на все случаи жизни, другие, используют проверенные временем CMF базирующиеся на архитектуре MVC, а третьи подыскивают абсолютно новые, еще не набравшие популярность решения. Об одном из таких решений мы и попробуем рассказать вам в этой статье.

Почему нужно использовать CMF?

Использовать или не использовать – каждый решает сам, но когда разработка приложений для WEB основная работа, то шаг знакомства с фреймворками неизбежен. Это очевидно, ведь с течением времени, требования к приложениям «из браузера» возрастают и угнаться за всеми технологиями, необходимыми для комфортной работы – задача не из легких. В таких случаях без начального фундамента обойтись невозможно и волей-неволей приходится обращаться к помощи CMF, позволяющих забыть о мелочах, и сосредоточится на самом главном – созданием бизнес логики приложения. Восхищаться плюсами CMF можно долго, вот только пользу это не принесет. Лучше выделим девять основных причин, ради которых стоит отбросить пережитки прошлого на свалку жизни и сделать выбор в пользу CMF:

1. Гибкая адаптация. Под очередной новый проект не нужен отдельный инструмент. Потратив один раз время, и выбрав наиболее подходящий для большинства ваших задач фреймворк, отпадает необходимость в поисках нового решения.

2. Только качественный код. CMF – творение рук мастера (относится к качественным

продуктам), знающего на «отлично» свое дело, а значит, нет необходимости волноваться за «начинку» фреймворка и пытаться лезть в его «кишки» с целью оптимизации. Все уже сделано за вас, остается только пользоваться. Конечно, это относится не ко всем CMF. Зачастую попадаются такие «решения», от использования которых лучше воздержаться. Присмотрев конкретный экземпляр, лучше сразу пробежаться по форумам соответствующей тематики и посмотреть отзывы пользователей. Уместно также взглянуть на готовые проекты, созданные на основе выбранного решения. В общем, нужно проявить инициативу и изучить мнения людей, имеющих опыт работы с данным продуктом. Иначе легко впустую потратить время на обучение, а впоследствии разочароваться в выборе.

3. Помощь специалистов. У всех популярных свободных проектов рано или поздно

образуются сообщества – community. Цель таких групп – поддержка пользователей, поиск исправление, ошибок и улучшение продукта. Сталкиваясь с «трудной» задачей, не нужно начинать биться головой о стену. Намного лучше сразу же обратится за помощью к представителям сообщества. Вполне возможно, что кто-то уже сталкивался с похожей проблемой и готов поделиться решением. 3. Единая структура. Все проекты, созданные на основе одного CMF – идентичны по структуре. Это очень удобно, когда приходиться заниматься поддержкой нескольких проектов. Вы только представьте, что вам больше не придется задавать себе вопросы вроде: «В каком модуле объявлена такая-то, функция?» или «В какой папке лежит модуль для форматирования текста». Придерживаясь единой структуры, существенно увеличивается производительность разработки и объединение кода нескольких независимых разработок.

4. В ногу со временем. Создать WEB-проект, отвечающий современным требованиям с

использованием одного языка/технологии практически нереально. Зачастую приходится пользоваться разными «инструментами», на должное изучение которых требуется слишком

Page 59: VR-Online (May 2009)

много времени. Различные фреймворки (сейчас речь не только о CMF), могут существенно сэкономить временные ресурсы, из-за простоты использования. На изучение «каркаса» уйдет намного меньше времени, чем на знакомство с технологией на «низком» уровне.

5. Хороший проект – безопасный проект. Несомненно, главное требования для любого

WEB-проекта – безопасность. Грош цена тому ресурсу, который предоставляет сверхудобные и необходимые сервисы, но вместе с удобством есть вероятность лишиться конфиденциальных данных. Хакеры постоянно придумывают новые типы атак, а значит, разработчик должен быть начеку и писать код, неподверженный для различных уязвимостей. Используя фреймворки, эта проблема частично решается. Как правило, CMF уже содержат механизмы (функции, классы и т.д.), предназначенные для организации всевозможных проверок и вам не придется писать громоздкий код проверок.

6. Повторное использование кода. Практически у любого CMF есть правила по

оформлению кода, следуя которым можно писать универсальный код, пригодный для будущих проектов.

7. Возможности на любой размер кошелька. Фреймворки, как и любое другое ПО бывают

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

8. Командная работа. Создавать новые проекты в команде на основе CMF гораздо проще,

чем работать над самописным решением. Например, если требуется передать проект на поддержку или принять в команду нового программиста, то при использовании фреймворков нехило сокращается временные затраты на эту процедуру. Новичку достаточно потратить время на изучение CMF и он сразу же будет в «теме».

9. Разделение бизнес-логики и представления. Большинство CMF базируются на

архитектуре MVC (Model View Controller), а это подразумевает, что верстальшики и программисты могут работать параллельно. Изменения, внесенные в логику программистом, никак не заденут работу верстальщика. А раз, так, то все могут заниматься своим делом и добиться максимальной производительности при работе в команде.

Кратко об Adept

Плюсы использования фреймворков очевидны. Остается только определиться с выбором.

А сделать это, мягко сказать непросто. На сегодняшний день, CMF создано огромное количество. Имеются как качественные разработки, так и ошибки природы. В самом начале мы упомянули, что собираемся рассказать о не совсем стандартном решении. И это действительно так. Большинство CMF базируется на знакомой каждому программисту архитектуре MVC. У таких решений есть свои плюсы и минусы, но сегодня мы не будем их затрагивать, а поближе познакомимся с компонентными фреймворками. Пока этот тип не пользуется колоссальной популярностью, но вполне возможно, что в скором времени ситуация в корне изменится. В качестве компонентного фреймворка мы рассмотрим достаточно свежую разработку от наших соотечественников – Adept Framework.

Adept Framework – полноценная платформа для создания web-приложений с

использованием php 5. На основе этой платформы легко создавать приложения различной сложности: будь это простой персональный сайт или сложный проект типа социальная сеть, сравнимый по функционалу с «одноклассниками». Простата использования – одно из главных

Page 60: VR-Online (May 2009)

преимуществ Adept. Разработчики сделали все возможное, чтобы даже начинающий web-программист мог сразу начать пользоваться их продуктом. Смеем заметить, что простата использования никак не относится к непрофессионализму. Мы уже говорили, что на Adept можно реализовать как простые, так и сложные приложения. В этом легко убедиться, если взглянуть на готовые проекты, созданные с помощью Adept. Ссылки на некоторые из них мы привели в третьей врезке. Легкость использования – это не единственное преимущество перед остальными фреймворками. Среди других преимуществ можно выделить:

1. Компонентная модель. Пожалуй, это главное преимущество платформы. Разработчики

отказались от MVC и пошли совершенно другим путем – сделали по-настоящему компонентный фреймворк. Такой подход повышает возможность многократного использования кода. Есть определенный набор компонент, доступный для разных проектов. Написав один раз код для работы с компонентом, можно без труда перенести его в другой проект. Если попытаться провести аналогию, то на мой взгляд, Adept попадает под сравнение с некогда популярной средой разработки под Win32 – Delphi. Принцип использования компонент – точно такой же (за исключением визуального проектирования).

2. Современные технологии. Разработчики следят за бурным ростом web-технологий,

поэтому стараются реализовать поддержку всех новинок в этой области. Уже сегодня Adept дружит с такими вещами как: RPC, AJAX, AOP, ORM (готовится собственный ORM). Разумно предположить, что это только начало и в будущем охват технологий будет больше.

3. Расширяемая библиотека компонент. Богатство Adept – библиотека компонент.

Сегодня она насчитывает порядка 50 штук экземпляров. И это не придел! Библиотека постоянно расширяется как авторами Adept, так и Community. К тому же, вам ничего не мешает создавать свои собственные компоненты, тем самым расширит функционал Adept самостоятельно.

4. Тестирование и отладка. Любое приложение, разрабатываемое на основе Adept очень

легко тестировать и отлаживать. И все потому, что в платформе есть инструменты для полноценной отладки и тестирования приложения.

5. Оптимизация. Очень важной особенностью Adept является наличие компонент для

оптимизации приложения при высоких нагрузках WEB-сервера. Эту возможность особенно оценят начинающие разработчики, не имеющие должного опыта.

За работу!

О достоинствах Adept мы сказали достаточно, теперь самое время испытать его в боевых

условиях. В качестве примера мы подробно рассмотрим процесс создания новостной ленты. Почему в качестве примера мы решили выбрать именно этот? Все просто. Новостная рубрика есть у 99% сайтов. А это означает, что при создании очередного проекта волей-неволей приходится уделять время на создания такого простейшего сценария. Да, в этой задаче нет ничего тривиального и сложного. Мы просто рассмотрим один из вариантов ее решения с использованием расхваленного Adept Framework.

Итак, приступим. Процесс создания новостной ленты начнем рассматривать с установки

фреймворка. Для использования Adept вам потребуется: 1. Стандартный набор Web-разработчика (Apache, PHP, MySQL). 2. Adept Framework и Zend Framework.

Page 61: VR-Online (May 2009)

3. Eclipse IDE. С первым и вторым пунктом все должно быть понятно, а про третий я расскажу в

отдельности. Любой, пусть даже маломальский проект удобнее разрабатывать в специально предназначенной для этого среде. Мы уверенны, что у вас уже есть своя любимая IDE, но для пробы Adept, вам придется (или не придется) изменить своим вкусам и попробовать в действии мощный и универсальный Eclipse IDE. Причиной этому – специализированная сборка для повышения удобства работы с Adept. Eclipse всегда выделялся на фоне конкурентов – универсальностью и стабильностью работы. Универсальность заключается в том, что Eclipse непривязан к конкретному языку программирования. Он подойдет как для Perl, Java, PHP как и для других программистов. Главное - попытать удачу и найти соответствующий плагин. А сегодня с этим нет проблемы. Для самых топовых языков уже давно созданы плагины.

Разработчики Adept решили не отставать и не выдумывать велосипед, а просто взяли и

создали надстройку для Eclipse, которая позволяет значительно улучшить работу с их главным детищем – фреймворком. На наш взгляд они выбрали правильный путь – работать с Adept становится действительно проще и комфортнее. Именно поэтому вам придется смириться и скачать эту IDE, вместе с плагином. Если вы уже используете Eclipse, то просто скачайте плагин, иначе идите на официальный сайт Adept Framework и качайте дистрибутив уже настроенной среды. На этом подготовительный этап окончен и пора двигаться дальше и начать рассматривать установку самого фреймворка. Скачайте архивы с фреймворками, распакуйте их в папки Adept и Zend соответственно. Местонахождение этих папок не играет никакой роли. Можете создавать там, где вам удобно. Для эстетичности, подобные вещи удобнее всего хранить в папке lib (или что-то в этом роде), которая расположена в директории www, содержащей все необходимые сервисы для разработки WEB-приложений.

Фреймворки у нас на месте, теперь необходимо рассказать Eclipse IDE о его

местонахождении. Для этого запустите его и пройдите в Window -> Preferences. Перед вами откроется окно как на рисунке 1.

Page 62: VR-Online (May 2009)

Рисунок 1. Настройка Eclipse В этом окне вам предстоит объявить две новые переменные, содержащие путь к

фреймворкам. Для этого проследуйте по этому пути: PHP -> Path Variables. В правой части окна (Path Variables) давите на кнопку New. В открывшемся окне (рисунок 2) заполните поля Name и Path. Как и следует из названия, в первое вводится имя создаваемой переменной, а во втором вводится путь до фреймворка. Создайте две переменных: ADEPT_HOME (<путь к фреймворку\lib>) и ZEND_HOME (<путь к фреймворку\library>).

Рисунок 2. Создание переменных

Page 63: VR-Online (May 2009)

Проверка работоспособности

Установку фреймворка можно считать оконченной, а раз так, то самое время протестировать его работоспособность. Для этого попробуем создать новый проект типа Adept Framework Project в Eclipse. Папку для сохранения проекта можете выбирать любую, главное чтобы на директорию public ссылалась переменная Document Root WEB-сервера Apache. Проделанных действий уже достаточно, чтобы увидеть фреймворк в действии. Откройте браузер и попробуйте зайти на свой виртуальный сервер. Если вы сделали все правильно, то в браузере увидите такую же картинку как на рисунке 3.

Рисунок 3. Framework готов к применению

Page 64: VR-Online (May 2009)

Рисунок 4. Правим конфиг

Структура Adept

Фреймворк установлен, и мы уже попробовали его в действии. Казалось бы, самое время приступить к созданию реального и самое главное полезного приложения. Но нет! Рациональней всего на данном этапе ознакомится со структурой папок Adept. Без этого дальнейшая работа не будет продуктивной.

Итак, давайте взглянем на структуру папок. Удобнее всего знакомиться со структурой с

помощью Project Explorer среды разработки Eclipse. Каждый вновь созданный проект на Adept Framework состоит из шести папок:

1. Config – эта папка предназначена для хранения конфигурационных файлов приложения.

По умолчанию всегда создается только один файл настроек – application.xml. В этом файле задаются основные настройки для проекта, такие как: - Название проекта. - Кодировка. - Фильтры.

Page 65: VR-Online (May 2009)

2. Lib – в папке хранятся все используемые библиотеки. Например, на реальном хостинге, в этой папке удобнее всего хранить Zend Framework и Adept Framework, а также все остальные дополнения, которые вы планируете использовать.

3. Public – вот в этой папке должны хранится все так сказать файлы, которые будут

передаваться клиенту – изображения (img), таблицы каскадных стилей (css), ява-скрипты (js). Как мы уже говорили, на эта директория должна быть корневой и на нее должна ссылать директива DocumentRoot установленного WEB-сервера.

4. Src – пожалуй это одна из ключевых папок. В ней хранятся все основные файлы проекта

– контроллеры, модели баз данных, фильтры и т.д. 5. Teamplate – здесь хранятся все шаблоны представления данных или проще говоря все

страницы сайта. В этой директории есть подпапка «Page». Все ваши новые страницы должны располагаться именно в ней. При желании, вы можете создавать любое количество вложенных папок, тем самым структурировать содержимое вашего проекта. Например, в проекте по умолчанию уже есть одна вложенная папка – Errors. Которая содержит шаблоны для вывода ошибок.

6. var – в эту папку компилируются шаблоны при обращении к страницам сайта. При

работе проекта, в этой папке создаются две подпапки: Cache и Compiled. В первой хранится данные кэширования, а во второй шаблоны скомпилированных страниц. Помимо папок, в корне проекта есть два файла: - project.php. - project.override.php. В первом файле определяются константы, определяющие различные пути. А второй файл предназначен для переопределения констант, объявленных в первом конфигурационном файле. Кроме того, в файле project.php, вы можете определить профили «разработки». Например, по умолчанию в целях безопасности, да и удобства в целом, вывод любых сообщений об ошибках в браузер отключен. Во время разработки проекта это очень неудобно. Для такого случая достаточно всего лишь изменить в файле настроек значение одной константы и все – сообщения об ошибках будут отображаться на всех страницах сайта.

Новостная лента

На этом с теорией пора заканчивать и приступать непосредственно к практике – к

созданию полноценного приложения на платформе Adept Framework. Как мы уже говорили, в качестве примера мы рассмотрим создание новостной ленты, с

возможностью добавления новостей, показом капчи, ну и отображением самих новостей. Запускайте, если у вас еще не запущен Eclipse и создавайте новый проект типа Adept PHP Project. Теперь немного отвлекитесь от Eclipse и скачайте с официального сайта Adept - клиентскую библиотеку (http://adept-project.com/files/js.zip). По этой ссылке распологается сама библиотека, а также JS фреймворк Prototype и Script.aculo.us. Все это добро необходимо для работы с Ajax и создания неповторимого пользовательского интерфейса. С помощью SAU, легко создавать сложные и красивые пользовательские интерфейсы без лишних телодвижений.

Итак, будем считать, что архивы по приведенной нами ссылке вы скачали и распаковали в

соответствующую папку (<папка проекта>/public/js). Ok. Двигаемся дальше. Создайте новый шаблон (template). В нем будет написан код, который будет инклудится ко всем остальным страницам. Этот шаблон не должен быть доступен для пользователя, поэтому он должен распологаться в корне папки "Template" вашего проекта. Напишите в этом шаблоне код из листинга 1.

Page 66: VR-Online (May 2009)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN" "http://www.w3c.org/TR/1999/REC-html401- 19991224/loose.dtd"> <head xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" id="adeptproject"> <meta http-equiv="Content-Type" content="text/html"; charset=windows-1251" /> <title>Основной шаблон</title> <c:jsPlace pattern="/js/*?version = 1" /> </head><body> <tpl:place name="content"></body></html>

Листинг 1. Основной шаблон Давайте подробней рассмотрим код первого листинга. Мы уже говорили, что это

основный шаблон и он будет инклудится ко всем остальным страницам, а раз так, то именно в нем мы должны описать базовый набор html тегов. Именно это мы и делаем в первых строчках. После этого, нам нужно подключить скачанную js библиотеку. Это можно сделать стандартным способом или с помощью средств Adept. Само собой, мы выбрали второй вариант. Подлючение выполняется посредством тега jsPlace. Ему необходимо задать два атрибута:

1. Pattern - путь до JS. 2. Packged - (необязательный). Значение true для этого атрибута определяет будут ли собраны js файлы в пакет. Для

нашего примера в этом нет необходимости, поэтому этот атрибут опускаем. Похожим способом выполняется подключение CSS файлов. Только для них используется тег cssPlace.

Подключив все необходимые внешние файлы, нам остается выполнить последний шаг -

выделить место, где будет располагаться весь остальной контент. Данная операция выполняется посредством тега place. В качестве атрибутов ему нужно задать лишь name - имя места подключения. Основной шаблон готов, теперь сделаем страницу, с которой будет взаимодействовать пользователь. Создавать новый шаблон мы не станем, а задействуем уже имеющийся index.tpl. Откройте этот шаблон в Eclipse и напишите в нем код из листинга 2.

<tpl:capture name="content"> <tpl:object name = "MainController" class = "NewsController" /> <center><h1>Новости:</h1> <c:form ajax = "true"> <c:messageList /> <!-- Таблица для ввода новых новостей --> <table width="500" align="center" border = "0"> <tr><td width = "150"><c:label for="titleNews"> Заголовок</c:label></td> <td width="350"> <c:textBox binding = "#MainController-> property[title]" id="titleNews" title="Заголовок новости" /></td></tr> <tr><td width = "150">

Page 67: VR-Online (May 2009)

<c:label for="textNews">Текст</label></td> <td width="350"> <c:textArea binding= "#MainController-> property[content]" id="textNews" title="Текст новости" /></td></tr> <tr><td width="150">&nbsp;</td> <td width="350"> <c:button action="MainController-> onSubmit" title="Добавить новость" /></td></tr> </table><hr><hr> <!—лента --> <table width = "800" align = "center" border="0"> <c:list value="record" from "{MainController->getAllRecords()}" <tr><td width="300"><b>{$record['title']}</b> <br />{$record['date']}</td> <td width="500"><b>{$record['content']}</b> </td></tr><tr> <td colspan="2"><hr></td> </tr><c:default> <center><h1>Пусто</h1> </c:default></c:list></table></c:form> </tpl:capture>

Листинг 2. Страница для взаимодействия с пользователем В листинге два создается одна единственная страница, содержащая форму для добавления

новости, а также вывод всей новостной ленты. Перед тем как создать сами элементы управления нам необходимо подключить контроллер, который и будет выполнять все необходимые функции, а именно добавление, удаление и вывод списка новостей. Инициализация контроллера происходит с помощью тега object. Из атрибутов он принимает: - name – имя создаваемого объекта. - class – соответствующий класс (т.е. сам контроллер). Имя для объекта можно указать любое, а вот имя класса должно реально существовать.

Во втором параметре мы указали NewsController, который описан в файле news.php,

расположенный в папке src/controller. Его код представлен в листинге 4, который мы рассмотрим чуть позже. Подключив контроллер – можно начинать создавать элементы управления и подгонять шаблон. Первым делом создаем таблицу с формой. Тег для создания таблицы используется стандартный, а вот сама форма строится средствами Adept.

Любая форма в Adept создается через компонент form. У этого компонента есть 9 свойств,

но в нашем примере мы воспользуемся только одним из них – ajax, установка которого в true говорит фреймворку, что данная форма должна обрабатываться Ajax. С помощью ajax мы будем проверять введенные в форму данные и в случае их некорректности выводить соответствующее сообщение. Объявив форму можно приступить к ее заполнению. В нашем примере она будет содержать элементы управления: надписи и строки для ввода информации. Их мы тоже создаем с помощью Adept. Например, чтобы создать поле для ввода текстовой информации нужно воспользоваться компонентом textbox. Во всем втором листинге, при вызове этого компонента мы не устанавливаем ему свойств, а только присваиваем обработчик события (binding). В качестве обработчиков событий мы устанавливаем метод (для кнопки «Отправить») нашего контроллера.

Page 68: VR-Online (May 2009)

После описания таблицы для добавления новости, мы определяем область (шаблон) для вывода всей новостной ленты. Вывод списка новостей реализован с использованием компонента list. Он специально создан для вывода данных спиского типа, а значит идеально подходит для решения нашей задачи. Из обязательных для заполнения свойств, задействуем только from, которое определяет источник выборки данных. Мы указываем метод getAllRecords() контроллера, который возвращает все записи из бд – т.е. новости. Как видите, строить шаблоны на базе Adept очень легко.

Теперь посмотрим на процесс создание контроллеров – логики нашего приложения. Но

перед этим, создадим базу данных и фильтр для работы с ней. В качестве СУБД используем MySQL. Создайте базу “new_test”, а в ней всего лишь одну таблицу – News с типичными для новостных лент полями: - date (DateTime). - дата публикации. - Content (Text) – текст новости. - Tittle (char 100) – заголовок новости. - id (int) – автоинкремент, ключевое поле. С созданием базы данных разобрались, теперь нужно создать код для установки соединения с ней. Для этого создайте новый фильтр в папке src/filter с содержимым идентичным листингу 3.

<?php class Filter_DbConnection extends Adept_Filter_Abstract { public function process($chain) { $conn = Zend_DB::factory(PDO_MYSQL, array( ('host' => '127.0.0.1', 'username' => '', 'password' => '', 'dbname' => 'news_test' )); Zend_Db_Table_Abstract::setDefaultAdapter($conn); $conn -> query('SET CHARSET cp1251'); $chain-> next(); } } ?>

Листинг 3. Делаем фильтр для соединения с базой В третьем листинге приведен код класса, унаследованный от Adept_Filter_Abstract –

родителем всех фильтров. В этом классе мы определяем всего лишь один публичный метод – process, выполняющий соединение с базой. В теле метода описывается подбор параметров для подключения к БД и инициализация соединения. Фильтр для установки соединения с БД создан. Все что остается с ним сделать – добавить ссылку (<filter class=”Filter_DbConnection” />) в конфигурационный файл проекта. Теперь двинемся дальше и рассмотрим создание контроллера. Для этого создайте php файл news в src/Controller. Перепишите в него весь код из листинга 4 и возвращайтесь за объяснениями.

<?php class NewsController extends Adept_Controller_Base { protected $props = array(); protected $table = null; protected $records = null; public function __construct() {

Page 69: VR-Online (May 2009)

$this->initProps(); } protected function initP() { $this -> props = array ( 'title' => '', 'content' => '', 'date' => new Zend_Db_Expr('CURDATE()'); ); } public function getTable() { if ($this->table === null) { $this->table = new TableNews(); } return $this->table; } public function getProperty($index) { return $this->props[$index]; } public function setProperty($index, $value) { $this->props[$index] = $value; } public function getAllRecords() { $this->records = $this->getTable->fetchAll()->toArray(); return $this->records; } public function onSubmit() { $this->getTable()->insert($this->props); $this->initP(); } }

Листинг 4. Код контроллера В листинге четыре нет вещей специфичных для adept и при разборе его кода проблем

возникнуть не должно. Самое интересное в листинге – объявление public методов, посредством которых и происходит взаимодействие с описанным нами ранее шаблоном. Например, метод getAllRecords() выбирает все записи из таблицы с новостями. Как вы помните, его вызов происходит в шаблоне index.tpl. Аналогичным способом работает обработчик события для кнопки добавления новости. Для нее объявлен метод onSubmit().

Итог

К сожалению, рассмотреть все возможности Adept Framework в рамках одной журнальной

статьи невозможно. В начале статьи мы поставили цель познакомить вас с нестандартным фреймворком для ускоренной разработки web-приложений. Думаю, свою цель мы выполнили, а дальше дело за вами. Попробуйте реализовать на Adept один из своих будущих проектов и оцените его удобство и колоссальные возможности! Нам остается только пожелать вам успехов и фортуны! P.S. В статье мы рассмотрели упрощенную версию новостной ленты. Более

Page 70: VR-Online (May 2009)

продвинутый вариант (поддержка комментариев, создание капчи) вы сможете скачать с www.vr-online.ru/t_vr/spider_net/full_news.rar.

Альтернатива

1С-Битрикс (http://1c-bitrix.ru) – один из самых мощнейших платных CMF. Обладает

колоссальными возможностями. Назвать Битрикс CMF в чистом виде язык не поворачивается. А все потому, что на нем можно создавать типовые проекты, не прибегая к программированию. Для нетипичных задач всегда доступен богатый API, посредством которого решаются все возникающие задачи.

Безопасность Битрикса также на высоте. По мнениям большинства экспертов – это один из

самых безопасных web-продуктов на сегодняшний день. Именно поэтому известный каждому российскому IT-специалисту сайт – www.securitylab.ru полностью построен на базе Битрикса. Ruby On Rails (http://www.rubyonrails.org/) – один из лучших на сегодняшний день фреймворков для разработки WEB-приложений с использованием языка Ruby. Сегодня это язык все больше и больше набирает популярность среди web-разработчиков. Из особенностей RoR можно выделить следующее: полностью построен на архитектура MVC; динамичный ajax-интерфейс; качественный код, написанный по всем правилам ООП; высокая производительность. CakePHP (http://www.cakephp.org) - бесплатный фреймворк для быстрого создания WEB-приложений любой сложности. Этот фреймворк примечателен тем, что является клоном известного всем Ruby программистам - Ruby on Rails. Если вы попробовали в действии RoR и хотели бы почувствовать его мощь в PHP, то обязательно обратите внимание на этот проект. Сразу предупреждаем, в силу ограничений php, CakePHP никогда не сможет достичь той гибкости и функциональности, которыми обладает оригинальный RoR. Mzz (http://mzz.ru) – новая платформа для разработки WEB-приложений, основанная на классической идее разделения бизнес логики и представления (MVC).

Обладая необычайной гибкостью, на основе данного пакета можно собрать любое

приложение для WEB. Из особенностей Mzz можно выделить: поддержка всех современных технологий; собственный ORM. PRADO (http://pradosoft.com) – один из немногоих CMF, использующий событийно-компонентную модель. В чем, то похож на Adept, но все же уступает ему по по функционалу.

Adept в реальных проектах

Page 71: VR-Online (May 2009)

http://livents.ru – Социальная афиша.

Page 72: VR-Online (May 2009)

http://www.leasingnow.ru/ - Лизинговый консультант

Page 73: VR-Online (May 2009)

http://tv-express.ru – Телеканал экспресс

Written by Spider_NET ([email protected])

Page 74: VR-Online (May 2009)
Page 75: VR-Online (May 2009)

Первое знакомство с 1С:Предприятие 8.1

Уже достаточно давно я планировал написать цикл статей, посвященных разработке решений на 1С Предприятия, но все как-то руки не доходили. Да и думал я, что посетителям VR-Online данная тема будет вряд ли интересна. Как-никак, но основная наша аудитория — Delphi-программисты, многие из которых очень негативно относятся к платформе 1С. Честно говоря, меня когда-то и самого воротило от слова 1С, но поработав 1С-программистом больше года, я изменил свое мнение и теперь уже не могу представить как я раньше обходился без этого чудесного инструмента.

Что мы будем рассматривать в статьях

Перед тем, как приступить к раскрытию темы статьи, я хотел бы немного рассказать про свои планы касательно этого цикла статей. Итак, как и следует ожидать, тема статей будет 1С: Предприятие и все, что с ним связано. Обрати внимание, в нашем журнале эти статьи публикуются в разделе «Школа». Это означает, что рассматривать мы будем все по порядку - от простого к сложному. Читая каждую статью, ты будешь немножечко продвигаться в изучении возможностей платформы «1С:Предприятие».

Я всегда считал и буду считать, что изучать язык программирования всегда следует на

реальных примерах. Лишь практикуясь, можно добиться настоящего мастерства. Поэтому настоятельно рекомендую тебе повторять все описанные мной примеры.

Примеров будет достаточно много (запасись терпением :)), точнее в рамках этого цикла

статей я рассмотрю процесс создания рабочей конфигурации, которую мы условно назовем «Видео-прокат». Как и следует из названия, разработанное нами решение будет предназначено для автоматизации деятельности видеосалона. Пока не буду раскрывать всех карт, но обещаю, что рассматриваемый пример будет максимально приближен к реальным условиям, а значит полученные знания ты запросто сможешь применить в своих проектах.

Теперь несколько слов о содержании первой статьи. В самом первом уроке я познакомлю

тебя самыми основами 1С:Предприятие. Ты узнаешь, для чего собственно нужна 1С (как оказалось, многие до сих пор считают, что 1С — это непременно бухгалтерия или торговля) и терминами, понимание которых необходимо для изучения. В конце статьи мы рассмотрим установку 1С:Предприятие, создание новой информационной базы и пробежимся по основным объектам, с которым нам предстоит работать.

Что такое 1С?

Ответ на этот вопрос очень простой, но почему-то многие затрудняются его дать, а если и отвечают, то в большинстве случаев неправильно. Итак, 1С — это компания. Поэтому вопросы типа: «А сложно ли научиться программировать на 1С?», «Требуется 1С-Программист» - построены некорректно и равносильны: «А сложно ли научиться программировать на Microsoft» или «Требуется Embarcadero программист». Запомни раз и навсегда, 1С — это компания, у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. «1С:Предприятие» - конкретный продукт, который выпускает компания 1С.

Предназначение 1С:Предприятия

Page 76: VR-Online (May 2009)

Для успешного изучения платформы 1С:Предприятия важно понимать для чего собственно она нужна. А нужна она для автоматизации экономической и организационной деятельности предприятия. Заметь, о бухгалтерии и торговле речь не идет. 1С:Предприятие — это универсальная платформа, которую можно приспособить к деятельности абсолютно любого предприятия. Такая универсальность достигается за счет гибкой конфигурируемости. Каждое решение на 1С:Предприятие представляет собой отдельную конфигурацию. Если говорить простым языком, то конфигурация представляет из себя программу (так говорить не совсем верно, но для начала сойдет), для работы которой необходима платформа.

Если ты когда-нибудь слышал про язык программирования Java, то ты должен знать, что

для работы написанных на нем программ необходима виртуальная машина. С 1С:Предприятием ситуация аналогичная. Когда мы начнем разрабатывать нашу первую конфигурацию ты сможешь в этом убедиться. Пока тебе главное запомнить, что для работы любой конфигурации (программы) необходимо наличие платформы (1С:Предприятие).

«1С:Бухгалтерия» и т. д.

На основании полученных знаний в прошлом разделе раз и навсегда узнаем и запомним. 1С:Бухгалтерия — это на самом деле платформа 1С:Предприятие и типовая конфигурация (программа) «Бухгалтерия», назначение которой понятно из названия. Следовательно если ты в газете/на сайте видишь объявление «требуется 1С-программист», то это означает, что возможно тебе придется столкнуться или конфигурацией «бухгалтерия» или с «Управление торговлей» или вообще с самописным решением.

Когда я говорил, про конфигурацию «Бухгалтерия», то я применил к ней слово

«типововая». Все конфигурации, разработанные на платформе «1С:Предприятие» принято классифицировать как типовые и не типовые. Типовые конфигурации — это те, которые выпускаются и поддерживаются компанией 1С. Среди таких: 1С:Бухгалтерия, 1С:Управление торговлей, 1С:Зарплата и кадры и т. д. Не типовые — это все те которые разработаны другими компаниями или отдельными программистами. Я уже говорил, что знакомится с 1С:Предприятие мы будем на примере разработке своей собственной конфигурации. Наш проект будет является не типовой конфигурацией. Типовые конфигурации я рассматривать не планирую, но в будущем может что-то измениться и мы поковыряем бухгалтерию.

Когда лучше использовать 1С:Предприятие?

Все, что можно сделать на платформе 1С:Предприятие, можно повторить на любых других системах разработки. Например, возможностей Delphi, Visual Studio без проблем хватит, на любую задачу. А раз возможностей Delphi (например) хватает, то зачем использовать 1С? Ответ прост до безобразия (во всяком случае это ответ, который я дал сам себе). Главная причина использования 1С — скорость разработки решения. Если на Delphi тебе придется писать ту же бухгалтерию с нуля, то на 1С:Предприятие у тебя уже есть готовая основа — типовая конфигурация «Бухгалтерия», которую ты можешь либо использовать полностью, либо взять отдельные элементы. Кроме того, 1С:Предприятие аппетитно выделятся на фоне альтернативных решений. Среди ключевых особенностей платформы можно выделить:

1. Большое количество объектов метаданных, которых хватит для решения самых разнообразных задач. Тебе не нужно возиться с создание таблиц в самой БД. Все что ты делаешь — оперируешь объектами платформы, а она в свою очередь использует готовую структуру сервера БД.

Page 77: VR-Online (May 2009)

2. Поддержка разных СУБД. 1С:Предприятие хорошо работает как с MS SQL Server, так и с бесплатной СУБД — PostgreSQL. Это означает, что делая выбор в пользу 1С:Предприятие, ты можешь сэкономить деньги на лицензиях. Считай, все, что тебе потребуется — купить сам 1С:Предприятие (+сервер приложений). PostgreSQL является бесплатной кросс-платформенной системой, а значит, для сервера с БД тебе подойдет любая unix-like ОС. Получается, что экономия более чем заметна — тебе не требуется серверная ОС от Microsoft, а также MS SQL Server.

3. Простота использования. Как ни крути, а работать с 1С:Предприятие проще, чем с

голым СУБД. Встроенный язык программирования по синтаксису похож на паскаль (basic), большинство функций по конфигурированию выполняются мышкой и не представляют сложности. И самое главное - простота использования не сказывает негативного влияние на возможности системы. Они действительно большие и их хватит для многих проектов.

4. Наличие огромного числа специалистов. Сегодня найти специалиста по 1С:Предприятие

гораздо проще, чем например, по C#. С одной стороны, такое положение дел весьма неплохое, т. к. найти человека, способного поддерживать/дорабатывать уже работающий проект очень легко.

5. Поддержка со стороны компании 1С. Компания «1С» как никто другой заинтересована

в продвижении своих программных продуктов. И продвигает она не рекламой, а качеством и сервисом. По своему опыту могу сказать, что поддержка работает на должном уровне и большинство проблем решается быстро. Программисты компании также не сидят на месте и постоянно фиксят ошибки в платформе, выпуская новые релизы.

6. Поддержка типовых конфигураций. Законодательство в нашей стране меняется со

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

При использовании 1С:Предприятие и типовой конфигурации «Бухгалтерия» проблема «доработки» стандартных отчетов отпадает раз и навсегда. Программисты компании «1С» оперативно выполняют все необходимые модификации отчетов (и всех остальных элементов) и поставляют клиентам обновленные версии конфигурацией. Вот с обновлением конфигурации бухгалтер может справится самостоятельно (хотя тут все зависит от конкретного представителя этой расы пользователей :)). На крайний случай, всегда можно подыскать специалиста из франчайзи, услуги которого будут стоить намного дешевле, чем работа программиста. Почему программисты 1С:Предприятия так востребованы?

Ответ на этот вопрос частично дан в предыдущем разделе, но если ты так и не понял сути,

то сейчас я все повторю вновь. Итак, разработчики бизнес решений, создаваемых на платформе 1С:Предприятие так нужны, потому что решения, созданные на «1С:Предприятие» сильно распространены и сегодня используются почти в каждой компании. Под каждой подразумеваются даже очень маленькие предприятия. Бухгалтерию требуется вести везде и 1С:Предприятие с типовой конфигурацией — одно из лучше решений. Благодаря такой распространенности необходимость в специалистах возникает постоянно и если ты освоишь типовые конфигурации, то 90% будешь востребован и без работы сидеть не будешь (особенно в небольших городах). Универсальность платформы и соответствующая реклама делают

Page 78: VR-Online (May 2009)

1С:Предприятие универсальным решением для многих отраслей. Практически все предприниматели знают, что 1С:Предприятие — это программа, необходимая в любом предприятии, а раз так, то по их мнению ее обязательно нужно приобретать. Ну а раз так, то специалисты будут.

Именно из-за популярности и распространенности, разработчики, специализирующиеся на

данной платформе будут востребованы еще очень долгое время. Реально сильных конкурентов, среди подобных решений можно пересчитать по пальцам. Не стоит думать, что 1С:Предприятие — это идеальное ПО. Есть гораздо более мощные системы, но они очень мало распространены на российском рынке. Никто не решится создавать бухгалтерию для небольшой компании на той же монструозной Аксапте от Microsoft.

Еще один из плюсов 1С:Предприятие, влияющий на постоянный рост специалистов в этой

области — проста изучения платформы. Если ты более-менее знаешь какой-нибудь язык программирования, то со встроенным языком платформы 1С:Предприятие ты разберешься очень быстро. При его создании, разработчики приложили колоссальные условия и сделали его синтаксис похожим на одни из самых простых и популярных языков программирования среди начинающих — Basic и Pascal.

Первая боевая готовность

Все около 1С'ные нюансы мы рассмотрели, теперь пора переходить к практике. Я настоятельно рекомендую самостоятельно повторять всем описываемые мной действия. Только постоянная практика сможет сделать из тебя специалиста.

Что нам потребуется для тренировок?

Все что тебе потребуется — платформа 1С:Предприятие 8.1 и доступ в инет. Потребность в платформе, думаю ясна, а вот инет тебе обязательно пригодится для посещения нашего и около 1С'ных сайтов для получения новой информации поиска ответов на свои вопросы :).

Где взять 1С:Предприятие?

Ты знаешь, что продукт 1С:Предприятие является платным, следовательно, для тренировок тебе придется немного раскошелиться и приобрести специальную редакцию платформы - «Для обучения программированию». Ее цена достаточно низкая (около 500 руб), кроме того, вместе с платформой ты получишь дополнительные полезные материалы, которые будут способствовать ускорению твоего обучения.

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

Установка 1С:Предприятие

Установка платформы 1С:Предприятие не отличается от установки всех остальных Windows-приложений и заострять на ней внимание нет смысла. Я больше, чем уверен, что ты справишься с ней самостоятельно.

Page 79: VR-Online (May 2009)

Создаем информационную баз данных

Чтобы начать разрабатывать свое первое решение на платформе 1С:Предприятие, в первую очередь надо создать информационную базу. Если тебя смутили слова «информационная база данных», то расслабься. Понятие ИБ тождественно привычному «БД».

Создать новую проще некуда. Запускай 1С:Предприятие. После запуска твоему взору предстанет окно как на рисунке 1. Кроме окна выбора ИБ, 1С:Предприятие спросит тебя, «А не желаешь ли ты создать новую ИБ». У нас пока их нет ни одной, поэтому любезно согласимся.

Рисунок 1 (Окно «Запуск 1С:Предприятия»)

Если ты быстренько нажал на кнопку «Нет», то в этом случае, для создания новой БД тебе придется клацнуть по кнопе «Добавить». Справившись с этим простым действием, ты увидишь новое окно, в котором тебе предложат вариант создания новой ИБ. Среди вариантов тебе доступно целых два:

1. Создание новой информационной базы. Выбирая этот вариант, ты создаешь ИБ с нуля.

2. Добавление в список существующей ИБ. Вариант подойдет тем, у кого уже есть созданная ИБ.

Page 80: VR-Online (May 2009)

Рисунок 2 (Добавление информационной БД)

Для нашего случая (как бы это странно не звучало) идеален второй вариант. Выбирай его и нажимай «Далее».

В третьем окне, мастер добавления новой ИБ попросит тебя ввести название для новой

базы. Указанная здесь информация не на что не влияет и требуется лишь для того чтобы, ты сам мог различить одну базу от из другой. Поскольку мы собираемся проводить тренироваться м «ы будем на создании конфигурации «Видеосалон», то логичнее всего в качестве наименования логичнее всего ввести «Видеосалон». Вводим и опять жмем на «Далее».

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

Выбирай любую и жми «Готово». На этом шаге, создание новой информационной базы можно считать оконченным.

Режим работы 1С:Предприятия

Чтобы двигаться дальше тебе потребуется познакомиться с режимами работы платформы 1С:Предприятия. Их всего два (в отличии от версии 7.7) :

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

2. Конфигуратор. По другому его можно назвать режимом разработки. Именно в нем происходит процесс программирования, настройки и отладки конфигурации.

Начинаем работать с нашей ИБ

Page 81: VR-Online (May 2009)

Сегодня мы не будем рассматривать серьезных вещей, а просто немного пощупаем платформу и познакомимся с некоторыми ее возможностями. Запускай свою базу в режиме «Конфигуратор». Сейчас перед тобой должно появиться окно вопроса с текстом «Информационная база не обнаружена! Создать новую?». Когда мы добавляли новую базу, то фактически определили лишь место ее хранения. Именно поэтому 1С:Предприятие и задала нам этот вопрос. Отвечаем утвердительно - «Да» и теперь перед тобой отобразиться окно конфигуратора (рисунок 3).

Рисунок 3 (1С:Предприятие в режиме «Конфигуратор»)

Пока оно особого интереса не представляет, т. к. выглядет совершенно пустым. Сейчас мы

эту ситуацию поправим. Заходи в главном меню «Конфигурация» → “Открыть конфигурацию». Произведя это действие, в левой части окна конфигуратора появится панель, на которой представлено дерево конфигурации. Древо конфигурации — это главный инструмент разработчика решений на платформе 1С:Предприятие. В нем перечислены все объекты из которых состоит конфигурация. В нашем случае она пуста, т. к. мы только приступаем к ее созданию. Все объекты конфигурации относятся к какой-либо группе. Например, объект «Справочник Сотрудники» будет относиться к группе объектов «Справочники». Едем дальше.

Я уже говорил, что лучше всего знакомиться с новой технологией на практике. Поэтому

давай сейчас немного попрактикуемся и рассмотрим первый пример — создание нового справочника. Поскольку мы создаем конфигурацию «Видеосалон», то нам необходимо учитывать список наших клиентов. Вот сейчас мы и посмотрим как это можно сделать средствами платформы 1С.

Знакомимся со справочниками

Page 82: VR-Online (May 2009)

Перед тем как схватить мышку и выполнить несколько кликов, необходимых для создания нового справочника, давай разберемся, для чего же собственно предназначен объект типа «Справочник».

Объект конфигурации типа «Справочник» необходим для хранения списков данных.

Грубо говоря, справочник в платформе «1С:Предприятие» представляет из себя обычную таблицу. Для каждой такой таблицы (отдельного справочника) разработчик может определить дополнительные поля – реквизиты. Сразу после создания у справочника имеется два предопределенных реквизита (их удалить нельзя):

1. Код. Хранит код (номер) элемента справочника. 2. Наименование. В этом поле (реквизите) содержится текстовое представление элемента

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

них всевозможную информацию. Все справочники подразделяются на: 1. Иерархические и не иерархические. Первые могут иметь группы и соответственно

вложенность элементов. 2. Подчиненные. Такие справочники имеют должны иметь своего родителя –

определенный разработчиком справочник.

Создаем первый справочник

О том, что представляют эти странные «справочники» мы рассмотрели, теперь самое время потренироваться и создать свой первый справочник. Ставлю задачу:

Создать справочник «Клиенты», в котором будет храниться список всех клиентов

нашего видеосалона. В созданном справочнике должна быть возможность вносить отдельно полное наименование клиента. Кроме того справочник должен предусматривать создание групп элементов.

Условие задачи очень простое. Сейчас мы ее решим J. Ну-с, приступим к реализации.

Итак, найди в «Дереве конфигурации» группу объектов «Справочники». Щелкни по ней правой кнопкой крысы и выбери «Добавить». Откроется окно как на рисунке 4.

Page 83: VR-Online (May 2009)

Рисунок 4 (Окно создания нового справочника)

В этом окне происходит вся настройка объекта типа справочник. Первым делом давай

сменим имя нашего справочника. Сотри название «Справочник1» и впиши в этой поле название «Клиенты». Пока не обращаем внимания на поле ввода «Синоним» и оставляем все как есть. Переходим на закладку «Иерархия». Логично предположить, что всех клиентов мы как-нибудь должны классифицировать. Самый простой способ это делать – распределить их по группам. Для поддержки создания групп в справочнике нам нужно сделать справочник иерархичным, поэтому установи флажок для «Иерархический справочник». Остальные настройки иерархии я оставил по умолчанию. Если есть желание, то можешь с ними поэкспериментировать самостоятельно.

Одно условие задачи (я про создание групп) мы выполнили. Теперь остается добавить

новый реквизит, который позволит хранить полное наименование клиента. Зачем, ведь мы можем хранить все в реквизите «наименование»? Да, можем, но лучше сделать отдельный реквизит для хранения полного наименования. Краткое наименование у нас будет отображаться в форме списка всех элементов справочника. По нему мы будем выполнять основной поиск. А полное наименование будет содержать полные инициалы клиента, а значит при необходимости, мы сможем отличить Иванова Ивана Ивановича от Иванова Игоря Игоревича.

Все новые реквизиты создаются на закладке «Данные» (рисунок 5), поэтому поспеши

перейти на нее.

Page 84: VR-Online (May 2009)

Рисунок 5 (Создание новых реквизитов)

Выдели группу «Реквизиты» и щелкни по ней правой кнопкой мыши. В появившейся

менюшке выбирай «Добавить» и сразу смотри в правую часть окна конфигуратора. Там должна появиться панель свойств нового реквизита (рисунок 6).

Каждый реквизит должен иметь уникальное имя (в пределах одного объекта). Мы

собирались хранить в созданном реквизите полное наименование клиента, а раз так, то в качестве имени укажем «Полное Наименование». Если у тебя уже есть опыт разработки БД, то ты должен знать, что каждое поле в таблице имеет определенный тип. С реквизитами в 1С:Предприятие то же самое. Для нашего реквизита подойдет тип «Строка». Этот тип ставится по умолчанию всем создаваемым реквизитам, поэтому менять на панели «Свойств реквизита» ничего не нужно. Строки могут быть большие, а могут быть короткие. Если в качестве типа реквизита используем «Строка», то мы должны указать максимальную длину хранимой строки. Длина задается в одноименном свойстве. Мы собираемся хранить в этом реквизите ФИО клиента, поэтому установим значение для свойства «длина» равным 50. Пятьдесят символов без проблем хватит для хранения даже самых длинных фамилий и имен. Остальные свойства мы пока трогать не будем, поэтому закрывай панель свойств и окно настроек справочника «Клиенты». Условия задачи мы выполнили в полном объеме, и неплохо было бы провести первый тест. Находясь в конфигураторе, нажми клавишу F5. Эта горячая клавиша предназначена для запуска режима «Предприятие». Как ты помнишь, именно в этом режиме происходит вся работа с созданной конфигурацией. Перед тем как запустить режим «Предприятие», конфигуратор задаст тебе вопрос о необходимости обновления конфигурации базы данных. Мы внесли в конфигурацию изменения, поэтому обновление просто необходимо. Уверенно отвечаем «Да» и видим, что режим «предприятие» так не запустился, но возникло еще одно окно – «Реорганизация

Page 85: VR-Online (May 2009)

информации», в котором отображается созданный нами объект «Справочник. Клиенты». Нажимаем в этом окне на кнопку «Принять» и вот только теперь начинается загрузка режима «Предприятие».

Рисунок 6 (Панель свойств нового реквизита)

Рисунок 7 (Вопрос о сохранении изменений конфы)

Окно платформы, работающей в режиме «Предприятие» ты можешь увидеть на рисунке 8.

Рисунок 8 (Режим «Предприятие»)

Page 86: VR-Online (May 2009)

Пока мы создали только один объект – справочник для хранения клиентов. Доступ ко всем

справочникам можно получить через меню «Операции» => «Справочники». Пройдя по этому пути, откроется окно «Выбор объекта: Справочник». В нем будут перечислены все созданные в конфигурации справочники. В нашем случае, он всего лишь один. Кликни по нему два раза и перед тобой во всей красе предстанет его форма (Рисунок 9).

Рисунок 9 (Основная форма справочника)

Вид формы сгенерирован платформой. При желании мы можем его изменить (но об этом

не сегодня). Давай попробуем создать новую группу – VIP клиенты, а в ней любого клиента. Для добавления группы воспользуйся кнопкой «Добавить группу» на панели инструментов ока нашего справочника. После нажатия, появится окно, в котором необходимо заполнить реквизиты новой группы:

1. Код. Уникальный код группы. 2. Наименование. Название группы. 3. Родитель. Если мы создаем подгруппу, то здесь нужно указать родителя.

Значение поля «код» не трогай, а в качестве наименования вводи “VIP клиенты” и

нажимай на кнопку Ok. Все, группа создалась (смотри в правую часть окна справочника). Теперь заходи в нее и нажимай либо кнопку «Добавить» на панели инструментов, либо клавишу Insert на клавиатуре. После этого действия, на экране появится примерно такое же окно, как и при добавлении новой группы. В нем тебе также нужно заполнить все те же поля, как и при добавлении группы «VIP клиенты», а также созданный нами реквизит полное наименование (Рисунок 10).

Page 87: VR-Online (May 2009)

Рисунок 10 (Создание нового элемента).

Заполняй все поля и нажимай Ok. Все, новый элемент создан.

Сделай паузу

На этом первый урок можно считать оконченным. Мы рассмотрели всю необходимую

вводную часть и даже попробовали немножечко попрактиковаться. Правда наша практика свелась к нескольким кликам мышкой, но для первого раза хватит. Главное, чтобы у тебя появился интерес к изучению этого прекрасного продукта. В следующем номере нашего журнала, я продолжу знакомить тебя с платформой 1С:Предприятие. P.S. Все возникшие вопросы можешь задавать на нашем форуме, либо мне на мыло. Written by Spider_NET ([email protected])

Page 88: VR-Online (May 2009)

Слои vs таблицы.

Учебные пособия по HTML для начинающих практически в один голос уверяют, что верстка страницы, состоящая из нагромождения вложенных друг в друга таблиц - это единственно возможный способ верстки.

Я согласен, что непосредственно во время разработки табличная верстка проста и наглядна, но есть у нее такие недостатки, на которые мы с вами просто не имеем права закрывать глаза, в частности:

1. Противоречие стандартам W3C(World Wide Web Consortium) - эти самые стандарты настойчиво рекомендуют использовать таблицы исключительно для размещения табличных данных, а никак не для разметки страницы и уж тем более не для создания различных невидимых "растяжек".

2. Большое количество "мусорной" разметки. Поисковые системы, как известно, "читают"

веб-страницу вместе с тегами, и свято верят в то, что важная информация находится на странице как можно выше. Наверное, они очень удивляются, видя сплошные <table><tr><td></td></tr></table> и выкапывая из всей этой шелухи хоть какой-то контент. Кроме того, увеличивается (иногда довольно значительно) вес страницы.

3. Сплошная табличная разметка = верстка в визуальном редакторе. Конечно, сие

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

Использование CSS вместо табличных нагромождений считается, как минимум, хорошим

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

Но увы, даже в Датском королевстве не все прекрасно, что уж говорить о Всемирной

Паутине. По закону подлости именно самый популярный браузер (на момент написания статьи это MS Internet Explorer) хуже всего поддерживает стандарты верстки. Еще одна плохая новость - теперь этих Explorer'ов целых 3, и каждый поддерживает какие-то, одному ему понятные стандарты. Лично я сначала верстаю страницу для корректного отображения в Opera, Firefox, ну и до кучи Konqueror, затем с помощью условных комментариев IE подключаю файлы стилей для IE6 и IE7 (IE8, стыд мне и позор, еще не пользую), и подгоняю верстку под них с помощью CSS-хаков. Получается примерно такое: <link rel="stylesheet" href="/css/style.css" type="text/css" /> <!--[if gte IE 7]> <link rel="stylesheet" href="/css/style_ie.css" type="text/css" /> <![endif]-->

Page 89: VR-Online (May 2009)

<!--[if lt IE 7]> <link rel="stylesheet" href="/css/style_ie_old.css" type="text/css" /> <![endif]-->

Тем не менее иногда не спасает даже это. Зачастую требуется сделать верстку в несколько колонок с заголовочной часть страницы и подвалом, причем подвал вседа должен быть прибит к низу страницы, а количество контента на странице заранее неизвестно. Эту проблему можно было бы решить, указав, что слои должны располагаться как ячейки таблицы, то есть без наложений друг на друга. Увы и ах, но так всеми горячо любимый IE не понимает таких свойств как display:table;, а значит, не может отображать слои с возможностями таблицы. Так что в настоящее время это полезное и замечательное свойство использовать не получится, по крайней мере в данном контексте.

Подводя итог, хочу сказать так: не нужно выбирать между версткой слоями и табличной версткой, используйте и то, и другое. Самое главное, чтобы и люди, и поисковые системы легко находили ту информацию, ради которой данная страница, собственно, и висит в Интернете. Written by ZeroXor

Page 90: VR-Online (May 2009)
Page 91: VR-Online (May 2009)

- Вот так вот, пожалуйста, здесь прикрепим. Очень хорошо. Всё готово. В камеру не смотрите, как будто её тут нет, смотрите на Аню. Говорите обычным голосом, кричать или шептать не обязательно. - Здравствуйте, Анна. - Здравствуйте, Алексей. Оператор, впрочем, говорил спокойно и негромко, почти шептал и постоянно старался быть либо позади камеры, либо где-то сбоку от ближайших людей. Руки держал близко к телу, и, если и поднимал, то только до локтя. Вообще он старался как можно меньше выделяться, что ему удавалось. Довольно крупная комплекция слегка портили его усилия. Этакий человек-камера, стоящий на трёх ногах и плавно вращающий головой. Аня была гораздо меньше его как по росту, так и по комплекции - в светлом платье до колен и такой же светлой кофточке. Волосы короткие или как-то хитроумно заплетены сзади, ибо сложно было увидеть её со спины. Она постоянно стояла так, чтобы видеть всех, и чтобы все при случае видели её максимум сбоку, но никак не со спины. И она постоянно улыбалась. А ведь они оторвали меня от моей музыки. Не то, чтобы я очень любил музыку или был очень занят, но меня раздражало то, что меня не предупредили, и теперь было поздно бежать. Она мне улыбалась. Совсем чуть-чуть. Мне вспомнилась цитата из чьего-то реферата: "Сократ был постоянно добродушен и радостен, чем раздражал, вызывал нападки, его били." Она стала задавать мне какие-то вопросы, и, стоило мне открыть рот, начинала отчаянно кивать. Начиная со второго вопроса, я уже не воспринимал её всерьёз, решив, что ей, в общем-то, всё равно кто я, зачем я здесь, чем занимаюсь и что ем на завтрак. Она придумала набор вопросов, которые могут быть интересны её зрителю, и задаёт их мне. И плохо то, что я не знаю кто этот зритель и что он хочет. И факт в том, что они не будут думать обо мне или о той мысли, что я хотел бы донести до зрителя. Они возьмут то, что я наговорил тут, нарежут кусками, возьмут то, что, по их мнению, больше вписывается в общую концепцию, а всё остальное отбросят. Наговорите мне алфавит, я потом сделаю из него радиопередачу. - А чем вы занимаетесь в свободное от работы время? Я задумался. Мой брат на 12 лет старше меня, и он мой начальник. На этот же вопрос он ответил: "Ничем. (многозначительная пауза) У меня семья, ребёнок. Поэтому... ничем." Как же ты тогда сказала, Ксюш? "Стандартная модель современного успешного человека: семья-работа-семья." Что-то типа того. Я не верил тогда, что так возможно, но оказалось, что именно так и есть. Мне стало грустно. - В свободное от работы время я пишу прозу. - А что бы вы хотели сказать тем, кто выбирает эту профессию? - Если вам она нравится, то вы добьётесь много, - на тот же вопрос брат ответил "Надо любить свою работу, и тогда всё будет". Кажется, это неправильно. Любовь или нелюбовь - это не законодательное понятие. Нельзя вот так взять и полюбить. Впрочем, какое ей дело до моих мыслей? Студентка, только практикуется, будет искать лучшее и выбирать за других.

Page 92: VR-Online (May 2009)

... Все они достойны смерти. Кто-то больше, кто-то меньше. Хотя, о какой градации идёт речь, если результат один и тот же? Ну, может, разница только в очерёдности. Они закончили свою работу, вежливо попрощались и ушли. - Я уже когда-то это говорил. Скажи, ты никогда не плясал с дьяволами при лунном свете? Нет, нет, рано, это рано, потом. - Здравствуйте, Анна. - Здравствуйте, Алексей. Вот так это начиналось. Вечером она пришла домой - всё продолжат завтра, Вера к тому времени набросает уже примерный план смонтированного фильма, потом они ещё над ним все вместе поработают, а потом... А потом очередной шаг к высокооплачиваемой работе. Родителей ещё не было дома, она приняла душ и пошла утянуть из холодильника йогурт. Зазвонил телефон. Захлопнул на ходу дверь холодильника, с ложкой в одной руке и с нераскрытым ещё йогуртом в другой она пошла брать телефон. Но, когда она подняла трубку, там уже были короткие гудки. "Нет, вот это глупо. Серьёзно, глупо. Это только в фильмах играет страшная музыка, и от звонящего телефона зрителя кидает в дрожь, а главного героя фильма заставляет либо в панике биться головой об стенку, либо готовить гранаты и выставлять в бойницы пулемёты. А вот поди-тка ты испугай человека, когда он дома, спокойный, готовится слямзить йогурт и посмотреть телевизор." Потом она увидела в углу у балкона маленького плюшевого медвежонка. Почти как в детстве - маленький, плюшевый и мягкий. Может только чуть-чуть модернизированный - с голубой ленточкой и якобы небрежно пришитым грубыми нитками сердечком. Радостно она подбежала к игрушке, радуясь столь уместному подарку. "Странно. А ведь ты всё ещё ребёнок." Когда она держала его в руках, ей послышалась издалека какое-то классическое трубно-органное музыкальное произведение, причём, апогейная его часть. Музыка еле доносилась, но орган был настолько силён и реален, что дрожь от рёва его труб была весьма ощутима, аж мурашки по спине побежали. Тогда-то краем глаза она и заметила на открытом балконе какие-то новые предметы. Беглого взгляда было достаточно, чтобы разглядеть там обезглавленных родителей, аккуратно положенных друг на друга, и их головы рядом на деревянных подставках для горячей посуды. Fortune, fame Mirror vain Gone insane But the memory remains. Песня напевалась мягко, без музыки вовсе, как колыбельная.

Page 93: VR-Online (May 2009)

В темноте она проснулась от жгущего чувства в затылке, как будто лежала на раскалённых углях. - Ах, я вижу, что Вы проснулись. Прекрасно. Не беспокойтесь за своих родителей - они мертвы, они не мучились. Вас я тоже не намереваюсь мучить, мне нужно просто сказать Вам кое-что, и Вы уйдёте. Она попыталась двигаться, но что-то было не так. Было ощущение, как после сна - иногда затекает какая-нибудь рука так, что её не чувствуешь. Смотришь на неё, знаешь, что она есть, но не чувствуешь. Как резиновая лежит она и не реагирует. - Пожалуйста, не утруждайтесь. Вы сейчас ничего не в состоянии сделать. Не мог же я дать Вам возможность не выслушать меня. Вы живы пока что, но не сможете уже двигаться, говорить и видеть. Вы можете только слушать. Я скажу Вам то, что хочу сказать. И на этот раз получится не так, как Вы со своими знакомыми делаете - в этот раз не получится выбрать то, что по Вашему вкусу, а остальное отбросить. Вы же не слушаете людей. И врёте им. Улыбаетесь, киваете головой. Так они лучше говорят, так они чувствуют, что их слушают, и слушают внимательно. А Вы их обманываете. Вы ждёте, чтобы они ответили на Ваши вопросы как можно полнее, а Вы уж потом сможете вытащить их отдельные высказывания, подогнать под какой-то шаблон. А ведь они владеют своими словами, которые говорят Вам, а вы их нагло отбираете. "Я хочу ещё кое-что сказать. Тот, кто знает - тот делает молча. Кто не знает, тот болтает. Мне хотелось сказать, что они меня просто раздражают, меня раздражает их настырность и их ложь. Все они достойны смерти, все они, вопрос только во времени. На войне как на войне, не я эту войну объявил. И то, что будут страдать невинные люди - это лишь малая жертва." Прощайте. Если Вы верите в бога, то помолитесь ему мысленно, у Вас одна минута. Через минуту на Вас упадёт лезвие гильотины. А орган всё играл где-то вдалеке. Не я его завёл, просто совпадение. ... - Вот примерно такое я и пишу, - очень тихо сказал Алексей после интервью вслед уходящим студентам. - Только вас это не интересует, а заинтересует только если это будет приносить вам доход или вы будете на грани смерти. Второе проще воплотить в жизнь. Written by Neon_Kaligula ([email protected])

Page 94: VR-Online (May 2009)
Page 95: VR-Online (May 2009)

Вопрос: Как написать плагин для ZendFramework’a, который подключает стили и JavaScript’ы? Ответ: Для плагина надо зарегистрировать в Zend_Registry два параметра: pathStyle — путь к стилям pathJS — путь к JavaScript’ам Плагин проверяет на существование файлы. Например мы обратились к странице

fritool.ru/modules/controller/action/. Скрипт будет проверять следующие файлы на существование:

pathStyle/modules.css pathStyle/modules/controller.css pathStyle/modules/controller/action.css pathJS/modules.js pathJS/modules/controller.js pathJS/modules/controller/action.js Код плагина: <?php class Dev_Plugin_View extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $view =

Zend_Controller_Action_HelperBroker::getExistingHelper('ViewRenderer')->view; $pathStyle = Zend_Registry::get('pathStyle'); $pathJS = Zend_Registry::get('pathJS'); //----------------------------- Styles ----------------------------- $view->headLink()->appendStylesheet($pathStyle . 'site.css?'); if (file_exists($_SERVER['DOCUMENT_ROOT'] . $pathStyle . $this-

>_request->module . '.css')) { $view->headLink()->appendStylesheet($pathStyle . $this->_request-

>module . '.css'); } if (file_exists($_SERVER['DOCUMENT_ROOT'] . $pathStyle . $this-

>_request->module . DIRECTORY_SEPARATOR . $this->_request->controller . '.css')) { $view->headLink()->appendStylesheet($pathStyle . $this->_request-

>module . DIRECTORY_SEPARATOR . $this->_request->controller . '.css'); } if (file_exists($_SERVER['DOCUMENT_ROOT'] . $pathStyle . $this-

>_request->module . DIRECTORY_SEPARATOR . $this->_request->controller . DIRECTORY_SEPARATOR . $this->_request->action . '.css')) {

$view->headLink()->appendStylesheet($pathStyle . $this->_request->module . DIRECTORY_SEPARATOR . $this->_request->controller . DIRECTORY_SEPARATOR . $this->_request->action . '.css');

} //----------------------------- Scripts ----------------------------- if (file_exists($_SERVER['DOCUMENT_ROOT'] . $pathJS . $this->_request-

>module . '.js')) {

Page 96: VR-Online (May 2009)

$view->headScript()->appendFile($pathJS . $this->_request->module . '.js');

} if (file_exists($_SERVER['DOCUMENT_ROOT'] . $pathJS . $this->_request-

>module . DIRECTORY_SEPARATOR . $this->_request->controller . '.js')) { $view->headScript()->appendFile($pathJS . $this->_request->module

. DIRECTORY_SEPARATOR . $this->_request->controller . '.js'); } if (file_exists($_SERVER['DOCUMENT_ROOT'] . $pathJS . $this->_request-

>module . DIRECTORY_SEPARATOR . $this->_request->controller . DIRECTORY_SEPARATOR . $this->_request->action . '.js')) {

$view->headScript()->appendFile($pathJS . $this->_request->module . DIRECTORY_SEPARATOR . $this->_request->controller . DIRECTORY_SEPARATOR . $this->_request->action . '.js');

} } } Для того, чтобы плагин заработал его надо зарегистрировать в приложении. Код: $frontController->registerPlugin(new Dev_Plugin_Main());

Written by FriTOol ([email protected])

Page 97: VR-Online (May 2009)

Вопрос: Расскажите как работать с логическими операторами. Ответ: Не думал, что логические операции и вообще понятие алгебры логики может в наши дни

кого-то заинтересовать - последний раз я сталкивался с этой темой, наверное, в книге "ZX Spectrum: Как написать игру на ассемблере", современные же учебники и прочие самоучители уверяют, что время такого низкоуровнего кодинга прошло давно и безвозвратно. Но вот буквально вчера наткнулся в форуме на вопрос о работе логических операторов. Поэтому, наверное, как раз на том примере из форума и будем разбираться.

Теория.

Для начала разберемся немного с такой нудистикой как теория - потому как совсем без нее

- никуда. Я не буду рассматривать все логические операции, остановимся на самых основных: AND - поразрядное логическое "И". Как можно понять, два числа в этом случае

складываются по разрядам (поразрядное) (вспомните сложение в столбик, единицы складываем с единицами, десятки - с десятками и т.д.). Теперь "логическое" - значит, сложение идет не арифметическое, а логическое, то есть нет переносов из разряда в разряд. А логика "логического "И"" такова: единица может получиться только тогда, когда оба разряда равны единице.

0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1 OR - поразрядное логическое "ИЛИ". Что значит "поразрядное" и "логическое" - уже

понятно, нужно лишь понять, как работает "логическое "ИЛИ"". А эта операция вернет ноль только тогда, когда оба разряда будут равны этому самому нулю.

0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1 NOT. Эта логическая операция в PHP, как правило, применяется для определения

существования переменной либо ее проверки на ноль/пустую строку. Логика ее очень проста: !0 = 1 !1 = 0 Пример: if (!$name) { echo('имя не указано'); } else { echo('ваше имя: '.$name); }

Практика.

Page 98: VR-Online (May 2009)

Ну вот, уважаемый читатель, нагуляв аппетит, мы и добрались до вкусняшек. Для начала надо понять условие поставленной перед нами во всю свою ширь и высь задачи. Имеем такой вот скрипт:

<?php define(CREATE, 1); //Создание записи define(DELETE, 2); //Удаление записи define(ALTER, 4); //Изменение записи define(ADMIN, 8); // Пользователь являеться администратором $user_permission = CREATE | ALTER; echo (($user_permission & CREATE) ? "Пользователь может создавать записи <br>":"" ) ; echo (($user_permission & DELETE) ? "Пользователь может удалять записи <br>":"" ) ; echo (($user_permission & ALTER) ? "Пользователь может изменять записи <br>":"" ) ; echo (($user_permission & ADMIN) ? "Пользователь является администратором <br>":"" ) ; ?>

Теперь разберем его по косточкам: Первым идет блок “define”, определяющий 4 константы. Запомним, что для права

создания записей в байте прав пользователя (обзову его так) должен быть установлен нулевой бит (1), для удаления – первый бит (2), для изменения записей – 2-й и для особо крутых админов – 3-й бит. Взглянем на это все в двоичной системе счисления:

0001b = 1d 0010b = 2d 0100b = 4d 1000b = 8d

Создаем права для пользователя:

$user_permission = 1 | 4 Здесь используется логическое “ИЛИ”. Посмотрим, что получится:

0001b 0100b 0101b = 5d

Не обольщайтесь, что 1 | 4 дало то же значение, что и 1 + 4 – на самом деле это

совершенно разные операции, так что следите внимательно в дальнейшем. Ну а мы идем дальше.

Теперь у нас начинается логика по AND. Для сокращения количества кода использован тернарный оператор, так что выражение

echo (($user_permission & CREATE) ? "Пользователь может создавать записи <br>":"" );

аналогично

if ($user_permission & CREATE) { echo “Пользователь может создавать записи <br>”;

Page 99: VR-Online (May 2009)

} else { echo “”; } или даже if (($user_permission & CREATE) > 0) { echo “Пользователь может создавать записи <br>”; } else { echo “”; }

Ну а теперь посмотрим, что же выдает нам это условие. Складываем по AND

$user_permission и CREATE: 0101b - $user_permission 0001b - CREATE 0001b Единица действительно больше нуля, значит, выводим сообщение. Теперь проверим на

возможность удаления записей: 0101b - $user_permission 0010b – DELETE 0000b Получили ноль, значит данная операция запрещена. Не поленитесь, проверьте и остальные

значения, их там всего два осталось. На сем можно подвести итог: не так страшны логические операторы, как их объясняют в

самоучителях. Главное – понять один раз, а потом будете с закрытыми глазами и сонным мозгом это все считать. Надеюсь, теперь скрипт не кажется таким уж ужасным? ;-)

Written by ZeroXor