Спецвыпуск Xakep, Содержание номера # 027

Cover 027 |
Статья | Стр.
Концепт |
Концепт номера | 004
FAQ |
Web FAQ | 006
Cover Story |
Место красит человека | 012
Обзор провайдерских хостингов | 014
PHP-nuke | 018
31337 CLAN Page | 022
Жемчужный сайт | 026
CSS | 032
SSI | 036
Flash-preloader | 038
Веселая тусовка | 042
Веб-тусовка на халяву | 046
Flash-навигатор | 050
Эксплорер вместо фотошопа | 054
Вся правда об ASP | 056
Встроенные объекты ASP | 058
Не дают скрипты? Использую яву! | 060
Сборка точки | 062
Flash и готово! | 066
haXOrz4haXOrz |
Инфа по web development'у | 072
Offtopic |
Особенности бутаритарского варчока | 076
Банктенна | 080
Паяльник |
Payalnik: радиомысли | 082
Winformation |
Пока баг не грянет | 084
X-desktop | 088
FAT32 и NTFS5 | 092
Update | 094
Креатив |
Голливуд у тебя дома | 096
Гоним золотую волну | 100
Tips of flash | 104
Tips of web | 106
Стори |
Каждый раз... | 108
Relax |
Хакни Египет | 116
Обзор книг |
Буки по web-у | 120
E-mail |
E-mail | 122
Комикс |
Комикс | 124
Анонс |
Анонс | 128


Спецвыпуск Xakep, номер #027, стр. 027-004-1, КОНЦЕПТ СТРАНИЧКИ-НОМЕРА - Веб-полигон

КОНЦЕПТ СТРАНИЧКИ-НОМЕРА - Веб-полигон

Дронич (dronich@real.xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-004-1

Когда-то, давным-давно, когда я учился в обычной московской школе №777 (гы, именно так), я решил, что мне просто необходимо завести свою страничку в жутко глобальной и не менее компьютерной сети интернет %). Так как я тогда занимался только кодингом, вариант обычной статичной паги меня никак не устраивал. И тогда я сел за JavaScript. Насмотревшись чужих примеров и начитавшись мануалов, я зафигачил мегадинамическую (по тем временам) пагу. Она вела учет посетителей, обращалась к зашедшим по имени и имела динамический контент (который зависел от броузера и операционки зашедшего).

Прошло всего несколько лет, а технологии уже успели шагнуть далеко вперед. Новые языки программирования под веб, скрипты, базы данных – все это изначально было атрибутами крутых сайтов крутых контор с крутыми дядьками-разработчиками. А теперь все то, чем занимались они, доступно и нам. Можно хранить досье на друзей в MySQL-базе данных, генерировать страницы на лету при помощи Perl’овых скриптов, собирать форумы по кусочкам из готовых компонентов на PHP и модифицировать данные прямо на сайте по технологии ASP. А привязать большинство из этих фич к своему сайту можно даже на бесплатном хостинге. Мог ли ты представить себе такое лет пять назад, когда бегущая строка на HTML была верхом «кульфичесов» бесплатного хостинга типа BOOM.ru или CHAT.ru?

Теперь у любого здравомыслящего и пряморукого индивидуума есть возможность реально покодить прямо в сети. У всех, и у тебя в том числе, есть шанс сделать настоящую пагу-робот. Не знаешь, что это такое? Тогда в FAQ, к Добрянскому, он это исправит :). Ты готов показать всем, что шаблоны в сети недопустимы? Тогда тебе просто необходимо создать нечто неповторимое, высокотехнологичное и одновременно стильное. И если ты готов к созданию своего первого настоящего робота, значит, ты не зря держишь в руках этот журнал.

Мы решили начать очередную серию спецов - «WEB» - как раз-таки с общего обзора имеющихся на данный момент веб-технологий. А чтобы тебе не было скучно, для каждой из них мы подготовили стильную реализацию ака пример :). Мне кажется, именно таким простым путем, созерцая чужое мастерство и впитывая чужие знания, можно по-настоящему чему-то научиться и стать махагуру веб-разработки. Спросишь, почему этот номер несет кодовое название ВЕБ-ПОЛИГОН? Да потому что испытав на своем полигоне – домашней страничке – все вышеперечисленное, ты сможешь и дальше воплощать свои более серьезные идеи с применением тех фич, о которых ты узнаешь из этого номера. К слову, в этом мы тоже будем тебе помогать, ведь в следующем Спеце... хотя нет, пусть это будет для тебя сюрпризом. Хотя бы до того, как ты прочтешь анонс :).

Содержание


Спецвыпуск Xakep, номер #027, стр. 027-006-1, WEB-ROBOT-FAQ

WEB-ROBOT-FAQ

Матушка Лень

Спецвыпуск Xakep, номер #027, стр. 027-006-1

MatushkaLEN'[LoveTech]

Что такое HTML?

HyperText Markup Language - гипертекстовый язык разметки - базовая WEB-технология. Основная идея HTML - гипертекстовые ссылки (hypertext links), которые позволяют перемещаться по тексту, кликнув на нужное слово.

Например, ты листаешь обычный бумажный учебник по научному коммунизму, в конце каждого листа гора ссылок на страницы в томах Ленина, Маркса, в материалах заседаний очередного съезда КПСС. Тебе придется вручную находить нужные издания, нужные тома, нужные страницы и нужные абзацы. Язык гипертекстовой разметки позволяет автоматически перемещаться в нужное место электронной страницы в любом месте глобальной паутины. Нужно только кликнуть на ссылку.

По ходу развития гипертекстового языка HTML от него потребовались возможности верстки страниц. Электронный документ, так же как и бумажная книга, должен быть красиво сверстан. Web-верстальщик должен выбрать нужный шрифт, размер текста, расположение текста, расставить заголовки, иллюстрации и подписи к иллюстрациям. Однако компьютер позволяет интегрировать в электронные документы звук, анимацию, интерфейсы управления страницей. Поэтому в HTML-код можно в виде объектов встроить массу современных WEB-технологий. Сегодня язык HTML - каркас, корпус для Паги-Робота. Появилось множество новых технологий, но принцип остался один - кликни на нужный объект, и ты попадешь в нужное место.

Что такое Пага-Робот?

До сих пор многие интернет-страницы (паги) создаются вручную. Как до появления книгопечатания, некоторые лица (рожи) из каменного века вручную пишут страницу за страницей в текстовом редакторе. Можно согласиться, что такой способ наиболее качественный. Однако все они безнадежно отстали от прогресса. Ведь в современном Интернете важно как можно чаще обновлять информацию. Потому твоя пага должна быть автоматизирована! Пока троглодиты будут программировать HTML, ты будешь сочинять обновления для сайта, ведь ты оставил HTML для Паги-Робота. У жителей мелового периода, безнадежно застрявших в 90-х годах конца прошлого тысячелетия, уйдут месяцы на смену дизайна своей огромной HTML страницы. Ты же можешь менять дизайн своей Паги-Робота по несколько раз в день, в зависимости от времени суток. Ведь пагу можно полностью автоматизировать!

Как работает автоматизация на стороне сервера?

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

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


Спецвыпуск Xakep, номер #027, стр. 027-006-2, WEB-ROBOT-FAQ

WEB-ROBOT-FAQ

Матушка Лень

Спецвыпуск Xakep, номер #027, стр. 027-006-2

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

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

Как работает автоматизация на стороне клиента?

Мы уже не раз рассказывали тебе, что сервер - это механизм, который выдает инфу (странички) по запросам. А клиент - это механизм, который запрашивает и принимает инфу. Веб-клиент еще называют браузером. Браузер получает HTML код от сервера и преобразует его в страничку, которую можно посмотреть. В HTML можно встраивать специальные инструкции для браузера, специальные объекты. Это еще один способ автоматизировать твою страницу. Только в этом случае пагу из полуфабрикатов формирует не сервер, а браузер пользователя.

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

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

Например, я и многие мои друзья лазают по инету даже с отключенными картинками. Только текст. Ну а нужно посмотреть картинку, то ее отдельно показывают нажатием на кнопку мыши. Почему? Да потому, что если ты сидишь на модеме, то так паги грузятся быстрее. А если ты сидишь на выделенной линии и платишь за трафик, то так дешевле. Конечно, люди, сидящие на быстром халявном инете, париться не будут, но могут возникнуть проблемы несовместимости. Многим надоели мелькания банеров, назойливость рекламы; отключаешь эти технологии в своем браузере, и рекламное давление на мозги уменьшается.


Спецвыпуск Xakep, номер #027, стр. 027-006-3, WEB-ROBOT-FAQ

WEB-ROBOT-FAQ

Матушка Лень

Спецвыпуск Xakep, номер #027, стр. 027-006-3

Что такое VRML?

Virtual Reality Modeling Language - язык моделирования виртуальной реальности. HTML рассчитан на двумерные странички. Но даже на плоскости HTML дает очень мало возможностей, потому-то его и наращивают дополнительными технологиями.

VRML позволяет создавать трехмерные миры любой сложности. Можно конвертировать в VRML и обратно из таких трехмерных редакторов, как Light Wave или 3dMAX. VRML поддерживает спецификации, разработанные Silicone Graphics, есть возможность текстурирования и создания спецэффектов. Только, в отличие от других трехмерных стандартов, VRML продолжает традицию гиперсссылок HTML: кликнул на объемный объект и попал в другой виртуальный мир. Так же как в HTML, VRML позволяет внедрять в свои трехмерные сцены текст, графику, скрипты и другие объекты.

Уже сейчас интернет-разработчики могут полностью отказаться от HTML и строить свои порталы на основе связанных между собой ссылками VRML виртуальных комнат. Путешествие по такому порталу похоже на фильм "Газонокосильщик" или "Джони Мнемоник", когда ты ищешь инфу и кликаешь на ссылки в трехмерном пространстве.

Почему же до сих пор VRML не завоевал Интернет? Все упирается в медленные каналы связи и совместимость. VRML действует на стороне пользователя, то есть браузер преобразует текст языка в трехмерное изображение. Браузер должен правильно понимать этот язык, потому многие трехмерные VRML-порталы имеют обычную двухмерную страничку при входе, на которой требуется скачать браузер или плагин для нормального просмотра VRML. Чем качественнее трехмерная сцена, тем больше она занимает места, тем больше пользователю придется ждать загрузки VRML-комнаты. Поэтому многие виртуальные VRML-миры выглядят отстало по сравнению с современными трехмерными играми, их 3D выглядит просто убого. Так что до возможности бродить по домашним страницам и порталам Интернета, как по трехмерному красивому квесту, нам еще очень далеко.

Что такое XML?

eXtensible Markup Language - расширяемый язык разметки. HTML показал всему миру пользу от разметки документов. Действительно, HTML это не только гиперссылки "кликнул на объект и попал в нужное место", это также структура документа. Хорошо структурированные данные удобно читать, удобно по ним производить поиск, удобно их преобразовывать, дополнять, перерабатывать. HTML заточен под WEB, однако WEB развивался настолько стремительно, что новые HTML-стандарты безнадежно отстали. Новые Internet технологии растут как грибы, и их нужно структурировать и увязывать друг с другом. Появились новые WEB-терминалы, такие как мобильные телефоны с WAP браузером, домашние телевизоры с интернет-функциями и т.д. XML позволяет просто и понятно структурировать информацию, увязывать технологии. Это очень простой, удобный и быстрый язык. Быстрый в том смысле, что позволяет тебе быстро и просто описать, например, HTML средствами XML. Здесь ты можешь сам придумывать и описывать новые конструкции языка (теги).

Благодаря такой гибкости и простоте этот язык проник практически во все технологии. Уже сейчас есть возможность использовать XML совместно с JavaScript, Flash, HTML, SQL, со многими другими серверными и клиентскими технологиями. Если ты начнешь c изучения XML, то тебе будет проще разобраться с более сложными WEB-технологиями и увязать их между собой. Этот язык позволит тебе разработать удобный формат хранения для баз данных, для поисковых форм. Позволит разбить твою Пагу-Робота на удобные и понятные полуфабрикаты. Позволит удобно организовать полуфабрикаты при сборке странички в браузере пользователя.


Спецвыпуск Xakep, номер #027, стр. 027-006-4, WEB-ROBOT-FAQ

WEB-ROBOT-FAQ

Матушка Лень

Спецвыпуск Xakep, номер #027, стр. 027-006-4

Что такое CSS?

Cascading Style Sheets - каскадные таблицы стилей. Таблицы стилей - попытка отделить детали дизайна странички от ее структуры и содержания. В классическом HTML мы валим все в одну кучу: рядом с текстовым абзацем его цвет, размер шрифта, тип шрифта и т.п. Если ты захочешь изменить такой простой параметр, как размер шрифта на своем портале, - придется переписывать все странички. CSS позволяет назначить всем объектам стили, описание которых может храниться вообще в отдельном файле. Используя CSS, ты сможешь изменить размер шрифта во всех страницах портала, исправив только один файл с описанием стилей. Чем больше разных стилей ты придумаешь, тем круче можно менять дизайн. Самое главное, что не придется для этого менять уже готовые HTML документы, лежащие на сервере. Браузер пользователя сам обратится к файлу (по ссылке) со стилями и придаст каждой страничке нужный облик.

Что такое VBS?

Visual Basic Script - язык сценариев, основанный на вижуал Бэйсике (VB). VB - благодаря своей простате стал универсальным языком макросов в среде Windows. У пользователей офиса всегда есть желание расширить возможности Excel, Word, Outlook и других офисных программ. Каждый может дописать к офису какой-нибудь простенький макрос с элементарным алгоритмом. Ничего удивительного, что VB стали использовать для написания макросов к серверу, к браузеру, к базе данных. Если VBScript встроен в HTML страничку, то его использует браузер как алгоритм для работы со страничкой. Этот алгоритм может запускаться, например, при перемещении курсора мыши. Если VBS работает на сервере, то он может реализовывать алгоритмы сборки страниц из полуфабрикатов, механизм доступа к базе данных и поиска в ней. Если ты делаешь Пагу-Робота на базе Windows, то VBS - одно из самых простых решений твоих задач. А в качестве базы данных можно использовать ACCESS. Со всем этим можно разобраться просто и быстро, только будет ли такое решение эффективно, безопасно и совместимо?

Что такое JS?

JavaScript и JScript - скриптовые языки на основе Java. J разрабатывался как язык, не зависимый от платформы, поэтому многие браузеры совместимы с ним, независимо от операционный системы. Если ты автоматизируешь страничку на стороне пользователя, у которого непонятно какой браузер, то лучше использовать JS.

В среде Windows JS может полностью заменить VBS. JS чаще используется на стороне пользователя и редко для работы сервера. Однако сам язык Java очень широко используется в серверных приложениях.


Спецвыпуск Xakep, номер #027, стр. 027-006-5, WEB-ROBOT-FAQ

WEB-ROBOT-FAQ

Матушка Лень

Спецвыпуск Xakep, номер #027, стр. 027-006-5

Что такое DHTML?

Dynamic HTML - динамический HTML. Позволяет как раз то, чего так не хватало статичному HTML. DHTML - превращает загруженную страницу в живой интерфейс, который способен реагировать на каждое движение пользователя, на каждое его действие. Технология DHTML основана на технологии динамических стилей. Скрипт (VBS либо JS) динамически меняет стиль объекта в зависимости от происходящих событий. То есть в DHTML совмещаются технологии VBS/JS и CSS.

Что такое FLASH?

Фактически FLASH - это принципиально новый движок для интернет-интерфейсов. В отличие от традиционных WEB-технологий, Flash позволяет работать с векторной графикой. То есть изображение прорисовывается не точка за точкой (растр), а в виде линий (векторов) с заданными вершинами, кривизной, толщиной и другими параметрами. Векторами намного проще манипулировать, задавая их координаты и другие параметры. Flash также может иметь встроенные тексты, скрипты, растровые изображения, ссылки. Такая технология дает большие возможности, но вряд ли ей удастся полностью заменить HTML.

Что такое PHP?

PHP (Professional Home Page Tools) Hypertext Preprocessor - гипертекстовый препроцессор на базе Professional Home Page Tools. Скорее всего, PHP будет одним из основных инструментов для создания Паги-Робота. Работает он так: на сервере лежит HTML-шаблон с PHP вставками. С учетом запросов пользователя PHP-сервер обрабатывает эту заготовку, задействуются PHP-вставки и подгружают вместо себя нужные текстовые блоки, картинки, куски HTML. То есть в итоге пользователь получает страничку, сформированную на лету, где вместо PHP-вставок самый обычный HTML.

С помощью этого механизма ты можешь на базе одного HTML шаблона c PHP вставками сделать целый портал.

Что такое ASP?

Active Server Page - активная серверная страница. Технология, сходная с PHP, только в качестве вставок используются языки VBscipt, JavaScript, PerlScript. Такая технология работает только под Windows (хотя есть редкие исключения).

Что такое JSP?

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

PHP, ASP, JSP, что выбрать?

Все эти технологии хорошо подходят для автоматизации на стороне сервера. PHP и JSP могут работать как на Windows, так и на UNIX-платформах. ASP - только для Windows (за редким исключением). ASP и Java - платные технологии. PHP - open source (открытый код, распространяемый бесплатно). PHP и ASP - достаточно популярны в России, можно найти много примеров кода и хостингов, поддерживающих эти технологии. JAVA-технологии достаточно популярны на западе, и если хочешь программировать для западных компаний, то знание JSP может пригодиться.

Что такое CGI?

Common Getaway Interface - единый шлюзовый интерфейс. Только это не шлюз между сетями. Программа CGI, или CGI-скрипт, - это шлюз, который позволяет передать данные от клиента через сервер к приложению. Когда ты заполняешь поисковую форму, вводишь пароль, пишешь сообщение в гостевую книгу или чат, вводишь свои данные для регистрации, то, скорее всего, используешь CGI-скрипт. Этот скрипт записывает полученные данные в файл, формирует запрос к базе данных или считает статистику. Такой скрипт может участвовать в сборке странички из полуфабрикатов или даже формировать новые полуфабрикаты на лету.


Спецвыпуск Xakep, номер #027, стр. 027-006-6, WEB-ROBOT-FAQ

WEB-ROBOT-FAQ

Матушка Лень

Спецвыпуск Xakep, номер #027, стр. 027-006-6

Что такое cookies?

Автоматические технологии на стороне сервера позволяют пользователю настроить страничку под себя. Например, я все время заставляю Яндекс выводить 30 ссылок на страницу, а Google - 100 ссылок. Такие параметры передаются по HTTP протоколу, как и другие переменные. Однако их нужно передавать при каждом новом HTTP-соединении, то есть настройки будут постоянно сбрасываться. Для того чтобы пользователю не приходилось каждый раз заново передавать информацию вручную, она сохраняется браузером в специальных текстовых файлах (cookies). Чтобы заставить браузер сохранить нужные данные, в HTML-код страницы встраивают специальную директиву.


Спецвыпуск Xakep, номер #027, стр. 027-012-1, МЕСТО КРАСИТ ЧЕЛОВЕКА - обзор бесплатных хостингов

МЕСТО КРАСИТ ЧЕЛОВЕКА - обзор бесплатных хостингов

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-012-1

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

Хостинги различаются количеством халявного места, фишками типа PHP и CGI, готовыми скриптами, возможностью доступа по FTP и прочими фишками. Но есть правила, общие для всех хостингов. И за их нарушение бесплатный хостинг отключают.

Для всех бесплатных хостингов трафик неограничен, но на хороших хостингах (с поддержкой скриптов и прочими прелестями) нельзя размещать архивы, pdf-файлы, фильмы или музыку. А если и можно, то трафик html-файлов должен превосходить трафик архивов. Часто вместе с бесплатным хостингом дается возможность делать почтовые рассылки. Но если тебя обвинят в спаме, то отключат сразу и навсегда. Без предупреждения.

Место, выделяемое тебе на диске, тоже ограничено. Как правило, дают 10-50 Мб. На хороших хостингах можно договориться об увеличении места. Только аргументы должны быть убедительными.

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

Продвинутые бесплатные хостинги с поддержкой CGI, PHP или ASP, как правило, являются тестовыми. В том смысле, что, заплатив небольшие деньги, ты можешь получить существенно больше возможностей и сервисов. Что касается бесплатного хостинга на ASP, то он есть большая редкость. А у нас в стране он просто отсутствует. Это связано с тем, что IIS входит в состав W2K Server, а эта ось вовсе не бесплатна...

PHP/CGI хостинги

H1.RU

Бесплатный хостинг от компании Аgava. Используют Апач в качестве веб-сервера. Железо: 2хPIII-1000, 1Gb RAM, канал 100Mb/s.

Доступ по FTP, нет интерактивных конструкторов сайта, так что придется все делать самому :). Есть возможность конфигурировать файл .htaccess (авторизация, управление типами кодировок файлов, индексирование каталогов) и доступ к серверным логам. Поддерживается SSI для файлов с расширением shtml. Документы кешируются с помощью отдельного прокси-сервера сроком на 1 час, кроме сгенерированных скриптами и shtml файлов. Как плата за «бесплатность» хостинга на всех страницах сверху присутствует баннер. Это может испортить весь дизайн, если не знать об этом заранее.

Из стандартных сервисов предлагают форум, чат, гостевую книгу, онлайн игры и психологические тесты (нафига? :)).

О неприятном: если страница не посещается месяц, ее удаляют, место ограничено 60 метрами (об увеличении надо договариваться отдельно). За 4-7 у.е. в месяц можно перейти в разряд платного хостинга, избавиться от надоедливых баннеров и получить MySQL базу данных.

SSI - да

CGI скрипты - да

PHP - нет

Резюме - неплохой бесплатный хостинг с поддержкой скриптов. Скорость временами невысока, но в целом удовлетворительна.

HOLM.RU

Еще один бесплатный хостинг от компании Аgava. От предыдущего варианта отличается тем, что на holm.ru имеется возможность использовать одну MySQL базу (для полноценной работы с которой тебе нужен shell) и позиционировать баннер на странице.


Спецвыпуск Xakep, номер #027, стр. 027-012-2, МЕСТО КРАСИТ ЧЕЛОВЕКА - обзор бесплатных хостингов

МЕСТО КРАСИТ ЧЕЛОВЕКА - обзор бесплатных хостингов

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-012-2

SSI - да

CGI скрипты - да

PHP - да

Резюме - один из лучших бесплатных хостингов. Для полноценной работы нужен Unix-shell.

WEBSERVIS.RU

Предлагают на выбор домен третьего уровня из списка: webservis.ru, al.ru, vipcentr.ru, vippochta.ru, viptop.ru, vipshop.ru, bos.ru, bip.ru, dem.ru, far.ru, fud.ru, hobi.ru, hop.ru, r2.ru, bloomberg.ru. Используют Апач в качестве веб-сервера. Железо: 2хPIII-1000, 1Gb RAM, канал 100Mb/s.

Доступ по FTP, есть возможность использовать SSI, CGI и PHP скрипты. А вот за доступ к базе данных MySQL, файлу .htaccess и прочим прелестям жизни придется заплатить.

На всех страницах сверху стоит «бесплатный» баннер. За его снятие надо заплатить 5 зеленых президентов в месяц. Итого - для нормального платного хостинга с поддержкой MySQL надо заплатить около 8 у.е., что совсем не дешево.

Стандартные сервисы: Гостевые книги, Форумы, Чаты, Email формы, Служба знакомств, Поиск по серверу, Email подписка/рассылка, Открытки, Голосования, Счетчики, Каталог.

SSI - да

CGI скрипты - да

PHP - да

HUT.RU

Тоже достойный хостинг. Железо: 2хPIII-850, 1Gb RAM, российский канал 100 Мбит/с, зарубежный - 155 Мбит/с.

Дают 30 метров, при необходимости добавляют еще, но только если количество посетителей больше 12 в день. Доменное имя третьего уровня hut.ru. Поддерживается ftp-доступ, SSI, CGI и PHP скрипты. Автоматически дается один почтовый адрес. Дают полный доступ к файлам .htaccess и .htpasswd и логам сайта. Доступ к MySQL базе данных дается только после заявки в службу технической поддержки. Для получения доступа к sendmail нужно обратиться к службе технической поддержки с мотивированной просьбой об открытии доступа. Но даже в этом случае почтовые рассылки запрещены. Обязательным является условие, чтобы скрипт отсылал письмо не чаще одного раза в минуту. Есть уникальная возможность запускать скрипты по расписанию. Разрешение опять через службу технической поддержки.

SSI - да

CGI скрипты - да

PHP - да

Резюме - хостинг борется за звание лучшего бесплатного хостинга. Если тебя не пугает переписка со службой технической поддержки, то тебе сюда.

HTML хостинги

NAROD.RU

Легендарный бесплатный хостинг от yandex.ru. Сразу дают 100 метров места. При нехватке места добавляют еще, но нельзя хранить файлы больше 5 Мб. Никакие скрипты не поддерживаются. Из стандартных сервисов есть форум, чат, гостевая книга, счетчик посещений. Дают почтовый ящик @narod.ru. Для доступа используется ftp. Скорость от средней до низкой. Из приятностей: есть более 100 шаблонов, и можно создать сайт, ничего не зная о html.

SSI - нет

Резюме - самое то для начинающих веб-дизигнеров.

BY.RU

Неограниченное пространство, доступ по ftp. Статистика, чат и форум доступны в виде стандартных скриптов. Есть возможность использовать SSI, что сильно облегчает создание сайтов, состоящих больше чем из 10 страничек.

SSI - да


Спецвыпуск Xakep, номер #027, стр. 027-012-3, МЕСТО КРАСИТ ЧЕЛОВЕКА - обзор бесплатных хостингов

МЕСТО КРАСИТ ЧЕЛОВЕКА - обзор бесплатных хостингов

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-012-3

Резюме - рекомендовано для использования немного продвинутыми юзерами.

BOOM.RU

Бесплатный хостинг от mail.ru. Предлагают домены третьего уровня на boom.ru, mail.ru, bk.ru, list.ru и inbox.ru. Полный аналог narod.ru. Доступ по ftp и через web-интерфейс. Сервисы: гостевая книга, форум, голосования, счетчик посещений, рассылки. Рекламные окошки внизу. Гадость.

SSI - нет

Резюме - кастрированный клон "Народа".

KM.RU

Стандартный хостинг с доменным именем третьего уровня на km.ru. Дают 70 метров места. Есть доступ по ftp. Размещают один баннер на главной странице и могут использовать всплывающие окна.

Прием заявок временно приостановлен.

SSI - нет

ASP хостинги

HOSTING.GOTDOTNET.RU

Этот хостинг выпадает из ряда бесплатных хостингов - это пробный хостинг. Точнее промо-акция великой и ужасной MS по раскрутке ASP.NET (это то, что ждет тебя в будущем). Железо: сервера разные, начиная от PIII-866, российский канал 100 Мбит/с, зарубежный - 10 Мбит/с.

Дается 20 метров места на диске, что, казалось бы, совсем немного. Но даже для супер-пупер кода вполне достаточно. Ты вряд ли напишешь больше за всю свою жизнь. Еще дают 10 метров в базе данных MS SQLServer2000 с доступом через ММС, а это очень хорошо даже для платного хостинга. Поскольку это промо-акция, нет никаких баннеров, окошек и прочей фигни.

Зарубежные ASP хостинги

BRENKSTER.COM

Бесплатный хостинг сильно урезан в сервисах. Дают 30 метров места на диске и 500 метров месячного трафика. Есть поддержка ASP.NET. Никаких баз данных, asp-компонент, ftp-доступа или доступа через FrontPage. Даже mail не дают. В общем, ничего нет, только доступ через web-интерфейс.

Резюме - полный отстой. А за платный хостинг сдерут три шкуры.

CFM-RESOURCES.COM

Условно-бесплатный хостинг. За установку требуют 29,95 американских рублей. Дают ftp-доступ, одна ODBC база данных, один адрес электронной почты. Место на диске ограничено 10 метрами, месячный трафик - 25 гектарами.

1ASPHOST.COM

Хороший хостинг по западным меркам: 100 метров и неограниченный трафик, одна mdb база данных. К сожалению, нет поддержки FrontPage Extensions, ASP.NET и нет никаких установленных asp-компонент. Еще один большой минус - нет ftp-доступа. Доступ только через web-интерфейс, но с поддержкой online zip/unzip.

DOTNETPLAYGROUND.COM

Суперхостинг. 30 метров места, 500 метров ежемесячного трафика. Одна mdb база данных, поддержка ftp-доступа, XML, ASP.NET и инструментов разработки. К сожалению, регистрация временно прекращена.


Спецвыпуск Xakep, номер #027, стр. 027-014-1, Обзор провайдерских хостингов - Постим сайт. Недорого

Обзор провайдерских хостингов - Постим сайт. Недорого

ХрымZ

Спецвыпуск Xakep, номер #027, стр. 027-014-1

(hrimz@xyligan.ru)

Дарова! Ну как Новый год отметил? Ага, понятно, чего спрашивать, если сам знаю, что угарно :). Праздники закончились, и начался новый год. Опять взлом и все такое. Специально для тебя я подготовил обзор хостингов у московских ISP. Ценовая политика не должна была превышать 20 баков. И за свои кровные ты должен получить качественный товар, а не фуфло какое-нибудь.

Как да что?

Как уже было сказано выше - не более 20 убитых енотов. Также подразумевался 100-меговый минимальный размер на винте. Проверка на качество и стойкость велась по нескольким критериям. Во-первых, личный опыт и опыт знакомых. Отзывы на официальных форумах провов и на всем известном www.providerz.ru. На последнем обычно народ не просто критикует, а чаще всего аргументирует свое веское мнение. Мнений много, так что вполне можно было решить, что есть отстой, а что - гуд.

Да, подразумевается, что у всех нижеперечисленных тарифов есть ftp-доступ, а у большинства и web-интерфейс для заливки файла. И самое последнее: перед самим обзором хочу сказать насчет неограниченного трафика. Вообще-то, не все так просто :). Если у тебя будут ежедневно гигабайтные скачивания, то пров попросит денежки. Никто не собирается за просто так фарцевать трафиком, так что будь начеку.

Название: ORC (Online Resource Center)

Цена: 8-20$ ежемесячно

Дисковая квота: 100-200Мб

Скорость: 155mbps

Ось: Линукс

Скрипты: да

Средства разработки: перл

СУБД: MySQL

www: http://www.orc.ru

Инфа:

Честно говоря, довольно известный московский пров, но как-то не было возможности потестить его профессиональные возможности. Зато про хостинг все подробно узнал. Тарифных планов много. Начиная от бесплатного подключения и 2 баксов ежемесячно (без скриптов, СУБД etc) до самого, имхо, клевого. Их есть целых два :). За 8 и 20 долларов в месяц. Первый от второго отличается только размером дисковой квоты и наличием MySQL. 100 и 200 мегов соответственно. По отзывам юзеров, работает стабильно. Скорость очень хорошая, но все пишут, что радуешься-радуешься, а потом - "бац", и место кончилось. Имхо, для серьезного проекта 100 мегов маловато будет.

Плюсы: Неограниченный трафик (правда, не у всех тарифных планов), хорошая скорость работы, нет платы за подключение. Собственный httpd-daemon. SSI, гостевуха, форум, голосование - все на халяву :).

Минусы: Жесткая дисковая квота (превышение - бакс за 5 мегов), из языков только перл.

Название: Combellga

Цена: 10$ ежемесячно

Дисковая квота: 100Мб

Скорость: не указана

Ось: Unix

Скрипты: да

Средства разработки: перл, с/c++, php4

СУБД: MySQL

www: http://www.combellga.ru

Инфа:

Как говорит в КВН Масляков: "Связь в удовольствие!". Ну что же, проверим. Стандартный вариант выглядит соблазнительно. СиПэПэ компилятор, php, доступ к логам, unix shell, полная поддержка SSI, доступ к cron и так далее. Огорчает, опять же, размер на винте - все те же 100 мегов. Но! Отсутствие жесткой дисковой квоты!

Здесь уже юзера не так добры к ISP. Среди отзывов есть жалобы на скорость работы. У некоторых перцев бывало, что целыми днями в браузере светилось "404 not found". Еще подозрительно скрывают инфу о скорости каналов. Может на мопедах сидят? :).


Спецвыпуск Xakep, номер #027, стр. 027-014-2, Обзор провайдерских хостингов - Постим сайт. Недорого

Обзор провайдерских хостингов - Постим сайт. Недорого

ХрымZ

Спецвыпуск Xakep, номер #027, стр. 027-014-2

Плюсы: Дополнительные доменные имена (www aliases), неограниченный траффик.

Минусы: Полное отсутствие почтовых ящиков и, соответственно, редиректов :). Все CGI-скрипты должны проходить обязательную предварительную проверку. Скорость связи оставляет желать лучшего.

Название: Телекоммуникационная компания Синхролайн

Цена: 10$ ежемесячно

Дисковая квота: 400Мб

Скорость: 155mbps

Ось: Linux

Скрипты: да

Средства разработки: перл

СУБД: MySQL

www: http://www.sl.ru

Инфа:

Ура! Наконец-то достойное дисковое пространство. На 400 мегах уже можно развернуться со своей небольшой домашней страничкой :). Но, с другой стороны, слишком уж мало фишек, и серьезными вещами здесь вряд ли займешься. Хотя наличие моего любимого перла может исправить положение :). Теперь поговорим о качестве работы, проверенной сотнями юзеров. Тут мнения самые разные. Многие говорят, что сервис обалденный и всем сюда, другие, наоборот, говорят, что заплатили, но ничего не получили. В смысле того, чего ожидали - халявностей дополнительных мало! Вердикт. Недорогое решение для действительно небольших проектов.

Плюсы: log access server, stat, SSI htaccess и все такое... 100 почтовых ящиков и 300 редириктов... а еще там Андрюша Каролик зажигает веб-мастером :))).

Минусы: Противоречивые мнения пользователей - чем не минус? :)

Название: Компания ATLEX.RU

Цена: 17$ ежемесячно

Дисковая квота: 600Мб

Скорость: суммарная пропускная способность по России - более 3Гб

Ось: Linux

Скрипты: да

Средства разработки: C, Perl, Embedded Perl, PHP/FI, TCL, Pithon, ASP

СУБД: MySQL

www: http://www.atlex.ru

Инфа:

А вот это пример провайдера, у которого фишек различных - просто завались. Быстрые сервера, куча поддерживаемых языков программирования, веб-почта с sms-уведомлением, удобная контрольная панель управления, обработчик логов и т.д. и т.п. Отсутствие ограничений по трафику и жесткой дисковой квоты только поднимает настроение! А все это связано с тем, что этот ISP предлагает размещать у него mp3-архивы и варезные залежи. Правда, не все тут чисто. По отзывам пиплов, за горы софта он требует работу в баннерной сети. Так что для убивания рекламы надо думать головой. Хотя, для примера, посмотри на любой буржуйский архив кряков - рекламы до попы, и не стыдно ведь :).

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

Минусы: Отсутствие почтовых ящиков, отсутствие шелла (вот это бы здесь точно не помешало).

Название: ISP Caravan

Цена: 15$ ежемесячно

Дисковая квота: 100Мб

Скорость: 355Mbps + трехкратное резервирование каналов

Ось: FreeBSD

Скрипты: да

Средства разработки: C, Perl, Php/FI

СУБД: MySQL

www: http://www.caravan.ru

Инфа:

Посмотрим, чем нас может порадовать всем известный Караван за 20 баков. Да-а-а... Не густо. В указанную сумму входят тарифы, которые вряд ли устроят хацкерскую душу :). Жалкая сотки мегов под порнухи - это не дело, но зато есть хорошие скидки при оплате сразу больше чем за месяц. Радует, что все держится на фришке+апач - надежность и безопасность чуть ли не первый фактор для приватных проектов. Не знаю даже, что в вердикте сказать. Как-то не густо за 15 убитых енотов, хотя кого-то, может, и устроит.


Спецвыпуск Xakep, номер #027, стр. 027-014-3, Обзор провайдерских хостингов - Постим сайт. Недорого

Обзор провайдерских хостингов - Постим сайт. Недорого

ХрымZ

Спецвыпуск Xakep, номер #027, стр. 027-014-3

Плюсы: 32767 почтовых ящиков и редиректов :) (для тех, кто в бронепоезде, - неограниченное количество). Неограниченный трафик, причем пров гарантирует, что все без обмана.

Минусы: Мало места, 2 цента в сутки за лишний мегабайт на винте. Жестко проверяется контент паг, то есть некропедозоофилию и исходники WinXP разместить не дадут :(.

Название: ООО "ВебХостинг.ру"

Цена: 20$ ежемесячно

Дисковая квота: 230Мб

Скорость: 10Gb/sec

Ось: FreeBSD

Скрипты: да

Средства разработки: C, Perl, Php/FI

СУБД: MySQL, PgSQL

www: http://www.webhosting.ru

Инфа:

Очень хороший хостинг. Никаких нареканий по работе у пользователей нет. Вообще. Итак, если 230 мегов тебе хватит за глаза, то бегом покупать, потому что здесь есть все, что душа может пожелать. Доступ к информации по протоколам http, ftp, pop3, telnet. Неограниченный трафик и неограниченное число web aliases, отсутствие жесткой дисковой квоты, бесплатная поддержка DNS, основные языки программирования, личная cgi-bin директория, поддержка Java Servlets, все скрипты без предварительной проверки, неограниченное число почтовых алиасов, два доменных имени третьего уровня в подарок и 20%-скидка, если сразу платишь за год.

Плюсы: см. выше :).

Минусы: 230 мегов все-таки не очень густо за двадцатник...

Название: WebRider

Цена: 20$ ежемесячно

Дисковая квота: 200Мб

Скорость: GigabitEthernet (1Gb/s), STM-1 (155 Mb/s)

Ось: Linux

Скрипты: да

Средства разработки: C, Perl, PHP/FI, TCL, Pithon

СУБД: MySQL

www: http://www.webrider.ru

Инфа:

Тоже очень заманчивый тариф. Есть несколько экзотические, но нужные настоящему хацкеру фишки. Например, автоматическая перекодировка кириллицы или поддержка Wap. Последнее тоже довольно актуально, так как в наше время под самой "дешевой и простой" мобилой понимается труба с Wap`ом, инфракрасным портом, Gprs`ом и видеокамерой ;) (Воистину! Я на Горбухе пару раз был свидетелем покупки "чего-нибудь попроще" баков за 300 :) - прим. ред.). Конечно, 200 мегов не очень-то много, но зато смотри, на скольком кодить можно :). И не смотри на цену - у компании очень много различных скидок - главное уметь договориться ;). Кроме домена второго уровня, тебе подарят поддержку НЕОГРАНИЧЕННОГО количества поддоменов третьего уровня. Имхо, можно самому заняться продажей имен. Типа регишь ivanov.ru и за 10 долларов "даришь" любому желающему vasya/petia/masha.hacker.ru :). И ведь куча народу поведется.

Плюсы: Unix shell, guestbook, forum, counter, log access, SSI, 200 мыл-боксов и столько же редириктов.

Минусы: Не очень удобная контрольная панель управления.

Название: Ин-Солв

Цена: 20$ ежемесячно

Дисковая квота: 300Мб

Скорость: 1Gb/sec - M9, 34Mbps - международный траффик

Ось: win2k

Скрипты: нет

Средства разработки: PHP/FI ASP

СУБД: MySQL, MS SQL, MS Access

www: http://www.in-solve.ru

Инфа:


Спецвыпуск Xakep, номер #027, стр. 027-014-4, Обзор провайдерских хостингов - Постим сайт. Недорого

Обзор провайдерских хостингов - Постим сайт. Недорого

ХрымZ

Спецвыпуск Xakep, номер #027, стр. 027-014-4

Тут конечно все по-скромному. Еще здесь основное отличие от других провов в том, что все вертится под винтукеем, а хорошо это или не очень - решать не мне (Эй, Дронич, твоя работа разбираться с виндами. :) (винды на М9 - ням-ням, мечта поэта :) - прим. Дронича). Насчет пользовательских отзывов - в основном положительные. Хотя есть пара-тройка мессаг, где этот ISP поливается нечистотами за нестабильность работы. Отличительной особенностью является свобода выбора сервера - дырявый Апач или совсем стремный IIS ;). Также от этого зависит, на чем будешь кодить - PHP vs ASP.

Плюсы: 20 почтовиков и целая "тыща" редириктов, SSI, поддержка MS Frontpage (тоже мне плюс - прим. совести). Если сразу затовариваешься на год вперед, цена - 90 убитых енотов + домен в подарок.

Минусы: Полное отсутствие скриптов, а без них сейчас некуда. Шелл тоже бы не помешал.

Название: ООО "Компания Азз.ру"

Цена: 14.95$ ежемесячно

Дисковая квота: 400Мб

Скорость: 100 Мб/сек на М9, 100 Мб/сек на Ростелекоме, 10 Мб/сек на C & W

Ось: linux

Скрипты: да

Средства разработки: Perl PHP/FI

СУБД: MySQL PostgreSQL

www: http://www.azz.ru

Инфа:

Давно что-то не говорили о траффике, так вот знай - у этого провайдера он неограничен :). Дисковая квота в самый раз для приличного проекта, конечно, если ты не собираешься выкладывать ISO`шки новых виндов. В общем, по большому счету самый "обычный" тариф. Имеется в виду, что большинство провов имеет такую же конфигурацию. Юзверу говорят, что работает все стабильно, но все-таки бывают странные баги с настройкой скриптов. Также есть практически личный опыт поломки этого прова (только тс-с-с!). Один хороший знакомый имел результат повышения привилегий после покупки хостинга. Но, вообще-то, это ни о чем не говорит, так как поиметь все можно. Что ж, уже из-за этого отказываться от веб-проекта ;)?

Плюсы: Гибкая система скидок. Часто на халяву раздаются домена, главное - поймать момент. Присутствует шелл.

Минусы: Нету мыльца, так что мыться нечем, как и редириктиться.

Название: ПАРКИНГ.ру

Цена: 19.95$ ежемесячно

Дисковая квота: 500Мб

Скорость: 100Мбит, пиковая загрузка 25%.

Ось: win2k

Скрипты: да

Средства разработки: C, Perl, ASP

СУБД: MySQL PostgreSQL

www: http://www.parking.ru

Инфа:

Насчет 25% процентов пиковой загрузки - немного прогон, так как бывали случаи, что четырехкилобайтная пага грузилась ТРИ минуты. Ну да ладно, такое вроде редко бывает, так что перейдем к вкусностям. 500Мб - рулез. На серверах стоит Windows 2000, есть поддержка XML 3.0. Условие превышения квоты (вряд ли грозит небольшим проектам) - 1 бакс за мегабайт в месяц. Неплохое решение, особенно на фоне общей картины.

Плюсы: Есть поддержка ASP.NET, поддержка DNS, ежедневное резервное копирование, размещение собственных COM-объектов, PERL, SSI, компоненты отправки почты etc. 10 ящиков и 100 редириктов.

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


Спецвыпуск Xakep, номер #027, стр. 027-018-1, PHP-NUKE - быстро и легко!

PHP-NUKE - быстро и легко!

ManderX

Спецвыпуск Xakep, номер #027, стр. 027-018-1

(forother@fromru.com)

Какие ассоциации возникли у тебя, когда ты прочитал слово "Php-nuke"? "PHP - известный язык кодинга, а nuke - это банальный нюкер", - скажешь ты, но после прочтения моего труда у тебя будут возникать совсем другие ассоциации, поверь мне.

ВоЦ ВиС?

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

Ready2install

Итак, великий и ужасный пхп-нюк требует всего лишь Apache+php+MySQL (придется тебе искать хостинг с MySQL =). А взять можешь на офпаге - http://phpnuke.org.

Кстати, это яркий пример самого движка, красиво? Погоди, ты еще админ-меню не видел =). Для начала, я думаю, надо его поставить на локалхост, а потом заливать уже на хостинг, надо же подправить дизигн и т.д. Сначала надо создать БД (надеюсь, ты смог разархивировать =), а посему коннектимся к MySQL-серверу, например, юзая клиент mysql (сначала надо ввести cmd в Пуск>Выполнить, потом cd С:\MySQL\bin\): mysql -h имя_хоста -u логин -p, после этого у тебя спросят пароль, и усе). Конечно, можешь заюзать какой-нить графический клиент, например, Navicat под винду (берем тут - http://www.mysqlstudio.com/), но я буду описывать действия с mysql, который у тебя должен быть уже установлен (С:\MySQL\bin\mysql.exe, примерно по такому пути). После успешного прохода создаем БД с именем nuke: create database nuke;. Теперь надо создать таблицы в этой БД и заполнить их, вручную писать мы ничего не будем =), все уже написано и находится в файле sql/nuke.sql, для этого надо этот файл поместить в ту же диру, что и mysql.exe (С:\MySQL\bin\), и ввести следующую команду, предварительно разорвав соединение командой quit:

mysql -h имя_хоста -u логин -p nuke < nuke.sql

У тебя спросят пароль, и все, таблицы созданы. Все проделанные действия можешь увидеть на первом скрине (у меня БД называется не nuke, а nuke_bd).

После этого надо подправить config.php, открывай его блокнотом (советую тебе заменить стандартный блокнот на Edit+, можешь его лицезреть на скрине, а слить можешь тут - http://www.editplus.com/). Там тебе надо будет установить хост, на котором стоит сервер MySQL, логин и пароль к серваку, а также имя ДБ (если ты делал все так же, как я, то тебе имя ДБ менять не нужно). Осталось самое простое - скопировать файлы из html в www (в диру хтмл файлов на твоем серваке или хостинге; если заливаешь на хостинг, то не забудь про chmod). Скажу пару слов еще про один момент, про upgrade. Допустим, у тебя стоит версия 5.6, а ты хочешь проапргейдить до 6.0 (последняя на момент написания статьи), тогда ты копируешь файлы их html в www, кроме config.php, далее копируешь опять в диру www следующий скрипт - upgrades/upgrade56-60.php, запускаешь его из браузера и усе!


Спецвыпуск Xakep, номер #027, стр. 027-018-2, PHP-NUKE - быстро и легко!

PHP-NUKE - быстро и легко!

ManderX

Спецвыпуск Xakep, номер #027, стр. 027-018-2

Юзаем!

На самом деле установка еще не завершена! Открывай браузер и вводи урлу - localhost, перед тобой откроется готовый портал (скрин 3), где тебе будет предложено зарегистрироваться как админу:

Сделаю маленькое отступление. Если у тебя вместо этой страницы появилась куча ошибок, то:

1. Проверь, работает ли MySQL сервер.

2. Скорей всего, это не ошибки, а нотисы (предупреждения); чтобы от них избавиться, следует в php.ini заменить:

error_reporting = E_ALL; display all errors, warnings and notices

на

error_reporting= E_ALL & ~(E_NOTICE|E_USERNOTICE)

Теперь продолжим. Заходи на localhost/admin.php, и ты увидишь анкетку (скрин 4), которую ты должен заполнить и отправить:

Далее ты должен авторизоваться, используя тока что введенный Логин/Пасс, и попадаешь в админ-меню:

Впечатляет? Без пива не разобраться =). Интерфейс должен быть русским (корявым русским, но русским =), если нет, то в блоке (блоки расположены по бокам, в левом верхнем блоке перечислены модули) "Languages" поставь Russian. Выйдя из админ-меню (http://localhost/admin.php?op=logout), ты будешь видеть только те блоки/модули, которые разрешено видеть штатным =). А авторизовавшись как админ, сразу получишь два новых блока слева - "Administration" и "Waiting Content". В первом содержатся часто посещаемые (могут быть установлены тобой) ссылки админ-меню, а во втором содержится Контент, который ждет =). Например, если кто-то из посетителей оставил новость, то она будет отображаться в этом блоке; после прочтения ты ее можешь подтвердить или удалить, в общем это нужный блок :). Само админ-меню должно быть понятно даже на таком русском. Оттуда ты можешь добавить новость/сообщение, бэкапнуть ДБ, управлять баннерами (перевода там ваще нет, так что или сам делай, или юзай инглиш =), редактировать блоки/модули, добавить прогу, редактировать пользователей/админов и многое другое. После того как все сделаешь, не забудь выйти (по сайту можешь ходить как админ). И еще, советую походить тебе по порталу под юзером и под админом (отдельно), чтобы освоиться. Также полазь по админ-меню, подобавляй чего-нить, тогда все поймешь.

Модули, блоки и темы

Скорей всего, тебе не захочется иметь такой же дизайн, как у других проектов, поэтому ты захочешь создать свою тему. Темы хранятся в дире /themes/, там они рассортированы (важно помнить, что в названии темы/модуля/блока не должно быть пробелов, заменяй их на "_"), делать тему заново будет трудновато, да и зачем все заново колбасить, лучше уж переделать какую-нибудь темку, да и все! Для примера возьмем NukeNews (в DeepBlue все в одном файле, в theme.php, а в NukeNews html и php раздельно). В \themes\NukeNews\images находятся используемые картинки, можешь переделать или заменить на свои. Открывай \themes\NukeNews\theme.php, поясняю первые переменные:


Спецвыпуск Xakep, номер #027, стр. 027-018-3, PHP-NUKE - быстро и легко!

PHP-NUKE - быстро и легко!

ManderX

Спецвыпуск Xakep, номер #027, стр. 027-018-3

1. $bgcolor1 - цвет фона в таблице, т.е. там, где написаны новости и т.д. А открывает таблицы функция OpenTable() (смотри в файле themes/NukeNews/tables.php), посмотри на эту функцию, точнее на html код, который образует таблицу, используя $bgcolor1 и $bgcolor2.

2. $bgcolor2 - это цвет границ таблицы.

Так, если ты не знаешь, что такое хедер и футер, то поясняю: хедер - это шапка, заголовок, в общем - то, что вверху сайта, а футер это то, что внизу =). Поэтому тебе только надо изменить эти футеры и хедеры под себя, то есть редактировать файлы header.html и footer.html. Тут по сценарию должно проснуться твое вдохновение =). Также отредактируй все html-файлы, на скрине 6 изображен blocks.html темы NukeNews. Еще раз повторюсь, в некоторых темах (например, DeepBlue) все скинуто в один php-скрипт, так что там надо уже редактить html-код внутри. А если будешь делать свою тему, то и знания пхп тебе нужны, хотя если хотя бы чуть-чуть его знаешь, то быстро освоишься, так как кое-что надо оставлять одинаково, например, функции Opentable(), переменные различные, для того, чтобы можно было менять перевод.

Теперь про блоки. Блоки ты можешь создать из веб-интерфейса в меню админа. Или же в дире /blocks/ ручками. Названия блоков должны быть такими - block-Name_of_your_block (как я уже сказал - никаких пробелов). И еще одно правило: в блоке обязательно должна присутствовать переменная $content, которая содержит сам контент (читай содержание). Взгляни, например, на блок \blocks\block-Login.php, там $content содержит html-код, который будет выводиться при таких-то условиях. И чуть не забыл, для того чтобы блок видели тока в блоке =), в начало каждого блок-скрипта следует писать:

if (eregi("block-Sample_Block.php",$PHP_SELF)) {

Header("Location: index.php");

die();

}

С блоками и темами разобрались, остались модули. И тут же наводящий вопрос - "Где находятся модули?" =), правильно, в /modules/ =). Если ты заслуженный танкист танка T-34, то повторяю: никаких пробелов в названиях не употребляй! =) При добавлении модуля ты сразу сможешь им управлять из админ-меню, и он станет виден в блоке "Modules". Наверняка ты хочешь изменить этот корявый русский на нормальный, потому лезь в \modules\Name_of_Module\language\lang-russian.php и там меняй перевод; иногда модуль бывает просто-напросто не переведен, тогда тебе придется открывать lang-english.php, копировать в lang-russian.php (который ты уже создал) и переводить, а иногда допереводить. С языками все понятно, теперь про устройство. В дире с модулем должен быть файл index.php, в котором и будет сам пхп-код модуля. Линк к модулю будет - http://localhost/modules.php?name=Your_module. Для создания модуля ты должен хорошенько знать пхп, но я все-таки скажу пару слов о девелопменте модулей:

1. Если ты хочешь, что бы модуль был многоязычным, то создай диру language и воткни это в index.php:

require_once("mainfile.php");


Спецвыпуск Xakep, номер #027, стр. 027-018-4, PHP-NUKE - быстро и легко!

PHP-NUKE - быстро и легко!

ManderX

Спецвыпуск Xakep, номер #027, стр. 027-018-4

$module_name = basename(dirname(__FILE__));

get_lang($module_name);

И у тебя должны быть языковые файлы с переводами в language.

2. index.php должен начинаться со строк:

if (!eregi("modules.php", $PHP_SELF)) {

die ("Еще раз, и в глаз!=)");

}

3. Когда юзаешь функцию switch() не используй $mop (она используется для modules.php switch), юзай другую переменную, например, $op (switch - переключение; когда у модулей несколько функций, то ему надо как-то их различать, например, если $op будет равна Add, то и функция выполнится соответствующая).

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

Для девелОпера

Как сделать нормальный русский в модулях, мы разобрались, а как в самом нюке? Да так же! В дире language лежат файлы с переводами, так что дерзай! В дире /images/ лежат картинки, который используются. Хотя это все просто, щас разберем, что и в каком файле лежит:

1. auth.php - скрипт аутентификации.

2. admin.php - скрипт Администраторской, в нем находятся функции входа (используется файл auth.php для аутентификации), функции админ-меню. И тут же скажу еще кое-что про модули. В дире admin (про диру /admin/language говорить не буду) содержатся части модулей для управления модулями (\admin\modules), в \admin\case находятся файлы, который указывают на админ-части модулей, когда указывается $op (вспомни switch()). А в \admin\links находятся линки, достаточно убрать файл-линк, и в меню админа не будет линка (визуального) на админ-часть модуля.

3. config.php - уже говорили про него, в версиях раньше 6.0 можно менять настройки в этом файле, но с приходом версии 6.0 настройки хранятся в БД, а в этом файле надо указывать только логин, пасс и хост к MySQL-серверу.

4. modules.php - должны же как-то различать Php-nuke, к каком модулю надо обратиться, вот именно этот скрипт это и делает.

5. mainfile.php - и правда, это основной файл (глянь на его размер), в нем содержатся основные функции.

6. index.php - первый файл, который мы видим при заходе на страницу, он выводит модуль, который был выбран как индексный, а также собирает REFERER-ы, дабы знать, с какого сайта к нам пришли, т.е. кто поместил ссылку на нас.

7. header.php - хедер, но не тот, про который я уже говорил, в этом содержится информация, которую можно увидеть, просмотрев только сорсы паги (META и JavaScript, который он берет из /include/, но об этом позже); также если существует themes/$ThemeSel/images/favicon.ico (сделай сам), то у сайта будет иконка (как на www.xakep.ru).

8. footer.php - футер, наверняка ты уже заметил рекламу внизу и копирайты, хочешь удалить? Половину из них можешь удалить в админ-меню, а остаток именно в этом файле, тебе надо удалить вот эту строку (перед ней не написано, что ее не нужно удалять и что тебе не дозволено ее удалять, какие они самоуверенные =):

echo "$copyright<br>$totaltime<br>\n</font>\n";

9. banners.php - из названия все ясно. Это банерная система.

Теперь про диру /includes/, к которой я обещал вернуться. В файле \includes\meta.php - содержатся META, меняй там все по своему вкусу, а в \includes\javascript.php - содержатся javascript-ы. Оба этих файла включены в header.php. counter.php - это счетчик, sql_layer.php - здесь switch() между типами БД, смотря какой тип БД, такие функции и будут выполнятся; my_header.php - пустой файл =), еще один хедер, тут ты можешь поместить все что хочешь, короче, благодаря этому файлу тебе не придется редактировать код в главных файлах. Но ведь это не по-нашенски, так что этот файл ваще не нужен :Р. Оп-а, install.php, это че за фокусы? Как-то я его пропустил (в версии 5.6 его не было, а в 6.0 появился), в общем - это еще один вариант заполнения nuke (БД), просто после создания БД запускаешь в брузере этот файл, а потом удаляешь его (дабы хацкеры не похацкали). Вот и все, вроде бы разобрались =).


Спецвыпуск Xakep, номер #027, стр. 027-018-5, PHP-NUKE - быстро и легко!

PHP-NUKE - быстро и легко!

ManderX

Спецвыпуск Xakep, номер #027, стр. 027-018-5

Жучки

Когда этот движок только родился, он был настолько БАЖНЫМ, причем я на 100% уверен, что в версии 6.0 тоже найдут ошибки, жуки были, есть и будут в этом движке (и вообще везде =), так как его сорцы доступны всем. В Х была статья про баги в движках, и пхп-нюку там было уделено много внимания (больше, чем другим), так что если хочешь узнать больше про баги, то прямиком читать X ver. 05.02 или в инете на void.ru, security.nnov.ru, так как все баги описать - это надо целый Спец отгрохать. ИМХО, самый лучший способ защиты от всех багов - это создание своего движка на основе этого, только чтобы его не узнали, потому что сорцы будут только у тебя. Чем я и занимаюсь в свободное время =).

Finish!

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

P.S. Но Perl тоже не стоит забывать! =)

Полезные ЛинКи

www.phpclub.info - русский сайт, посвященный пхп, здесь ты найдешь много полезного по пхп.

www.ru-board.com - сайт, единственный хороший сайт, посвященный пхп-нюке.

www.forum.ru-board.com - у них есть форум, посвященный пхп-нюке, а в нем есть топики, посвященные поиску модулей, блоков и т.д. Форум достаточно посещаемый.

Примеры популярных сайтов, которые используют Php-Nuke:

Wzor.net - без комментариеff

www.ru-board.com - он еще и на пхп-нюке стоит =), правда модулей много отрублено, даже не узнать с первого раза.

www.cs.ab.ru - известный сайт, посвященный КС-у, тоже на пхп-нюке, вообще многие сайты, посвященные КС-у, используют этот движок.


Спецвыпуск Xakep, номер #027, стр. 027-022-1, 31337 CLAN PAGE: - мутим реальную страницу клана

31337 CLAN PAGE: - мутим реальную страницу клана

НКВД (nkvd@zapisi.ru)

Спецвыпуск Xakep, номер #027, стр. 027-022-1

Здравствуй, о Маха Гуру веб-дизайна и хтмл'я! Сегодня мы не будем мазать тебе мозги, как и в какой фрейм засунуть фотографию твоей любимой собачки, не будем пересказывать ру.ководство Лебедева, флеш со всей своей анимацией тоже идет отсасывать у резиновой Масяни - речь пойдет не о дизайне и не о мультах. Сегодня мы обсудим техническую сторону вопроса - как сделать сайт автоматизированным, а для примера замутим реальную страничку клана! Ты уже состоишь в каком-нибудь клане или кряко-фряко-группе? Думаю, да. А не задавался ли ты вопросом, как продвинуть или расширить состав мемберов твоей тимы?

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

КОНЦЕПЦИЯ

Да, да. Ты, наверняка, слышал это слово на сайте какой-нибудь дезигн-студии, когда в очередной раз пытался содрать дизайн из портфолио. Ладно, давай теперь посмотрим, что нам понадобится для создания солидного представительства твоей тимы. В принципе сейчас пока не важно, к чему относится твоя секта - к гамезам типа КС или к хаку - я буду давать пояснения к обоим случаям. Но по-любому у тебя должно быть припасено следующее: 1)клан и мемберы, естественно; 2)прямые руки (обнови самзнаешькакие драйвера); 3)дизайн (тебе его поможет сделать самзнаешькто за 7000 уев, или читай предыдущие СПЕЦы); 4) хостинг с поддержкой php3/4, типа wallst.ru или hut.ru (поищи в поисковиках). Продвинутые пепсы могут заказать и платный - до ста грин в год почти у всех хостеров. 5) скрипты. Вообще, советую писать скрипты самому, так как сразу уменьшается возможность элементарно тебя похачить, но это только в том случае, если и ты будешь писать без багов. Ну а если нереально накодить самому - возьмем готовые кирпичи. Вот, собственно, и вся концепция: взять и настроить.

ЧТО АВТОМАТИЗИРОВАТЬ

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

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

Наверняка ты хочешь, чтобы не все было доступно глазу смертному, я имею в виду тех, кто не состоит в твоей команде. Правильно, нужно разделение доступа: помнишь, Moof писал про Manager LITE в новогоднем Спеце за 2002 год? Только этот cgi скрипт, а у нас будет все попроще - мы не будем заморачиваться с .htaccess и .htpasswd или еще того хуже с mySQL'ем - не у всех такая возможность есть. Логины и пассы о юзверях будут находиться в отдельном файле. Вообще все наши скрипты будут хранить информацию либо в текстовиках, либо в каких других файлах. Не сцы, не сопрут - chmod 666 твой друг.


Спецвыпуск Xakep, номер #027, стр. 027-022-2, 31337 CLAN PAGE: - мутим реальную страницу клана

31337 CLAN PAGE: - мутим реальную страницу клана

НКВД (nkvd@zapisi.ru)

Спецвыпуск Xakep, номер #027, стр. 027-022-2

Далее, ты просто обязан проинклудить рулесы клана. Сделать это можно через новостную ленту или просто на отдельной странице (<!--#include virtual="path_to/rules.txt" --> - так тебе будет удобнее вносить в правила изменения). Ты ведь в курсе, что не надо перегружать пагу - у юзверя могут выпасть глаза, и он будет носить их в коробочке и уже никогда не присоединится к твоей тиме.

Если пипл все-таки захочет это сделать - флаг ему в руки, пусть идет заполнять форму: какие поля, в принципе решать тебе. Но я посоветую самое оптимальное: имя, возраст, ник, нумбер ICQ, город, что умеет, приаттачивание фотки и прочее, прочее, прочее.

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

Также очень полезным будет сделать у себя галерею (опять же - заполняем формочку с подписью к изображению и через кнопку browse грузим с винта фотографию или картинку), например, выкладывать туда фоты с чемпионатов или со всяких сходок умных людей типа Defense Condition'а.

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

Итак, на первое время это все, что тебе пригодится для поддержки более-менее серьезного проекта по продвижению твоей 31337 TeAm.

ИНСТРУМЕНТАРИЙ

Если у тебя "народовский" хостинг, съезжай немедленно - там нам ловить нечего. Для работы скриптов, как я уже говорил, потребуется поддержка php3/4. Сейчас все ставят себе на серверы последние версии. Повторяю, mySQL не потребуется! Пока ты будешь все настраивать, придется очень много раз лазить в Интернет и тестить. Это не страшно, если ты сидишь на анлиме, а вот для не таких одаренных - линк: http://dklab.ru/chicken/web/ - качаем "Денвер-2" в обязательном порядке. С ним не нужно будет выходить в Интернет - сможешь все настроить и потестить прямо на своей локальной машине. Размер дистрибутива около 2 мегов, к тому же на сайте Денвера подробный мануал и фак по настройке. Скачал, установил? Не забывай про вордпад и блокнот. Все, теперь ты настоящий девелопер. Можем приступать.


Спецвыпуск Xakep, номер #027, стр. 027-022-3, 31337 CLAN PAGE: - мутим реальную страницу клана

31337 CLAN PAGE: - мутим реальную страницу клана

НКВД (nkvd@zapisi.ru)

Спецвыпуск Xakep, номер #027, стр. 027-022-3

ЛЕНТА.РУ

Новостная лента: http://fusionphp.com/fusion.php?id=2, ИМХО, лучший готовый кирпич. К тому же бесплатный! Ни фига не требует mySQL - абсолютно все хранится в txt, а инсталляция сравнима с инсталлом твоей любимой гамезы. Настройка проста до бита: загружаем файлы на сервер, запускаем install.php и следуем его инструкциям. Он сразу же попросит проCHMODить папки, php и txt файлы; сделал? Дави пимпу "next". Оно должно сказать тебе, что все нормуль, и попросит настроить директории и создать аккаунт для тебя. Тут проблем возникнуть не должно. Чтобы подстроить скрипт под свой дизайн, дави на "edit templates/headers/footers", и будет тебе счастье: в этом разделе тебя спросят, какой шаблон ты хочешь изменить. Не теряйся в выборе и опять смело дави на "archive templates (short/full news)". Видишь в фигурных скобках переменные? На них и держится вывод наполнителя: кто, когда, название статьи. Теперь обрати внимание на формы - самая первая отвечает за вывод short-новости. Ты видел на новостных сайтах, что сначала пишут какой-нибудь сочный кусок, который обрывается на самом интересном месте с ссылкой "[дальше]", - это и есть short-новость. Вторая форма отвечает как раз за всю новость целиком. Скрипт дает возможность комментировать статьи и отсылать по почте контент друзьям - так что настрой шаблоны и под эти дела. Шаблоны header/footer я не трогал - инклудить-то все равно будем на отдельную страницу. Делается это так: открывай страницу с дезигном и там, где хочешь, чтобы появлялись статьи, пиши это: <!-- #include virtual="path_to/news.txt" -->; там где заголовки: <!--#include virtual="path_to/headlines.txt" -->; вывод архива: <!--#include virtual="path_to/archive.txt" --> Единственный недостаток - нет разбивки по категориям, но тебе ничто не мешает создать самому отдельные папки для разделов, запихнуть туда ленту и заинсталлить ее еще раз. Так же ты можешь редактировать и отвечать на комментарии к статьям других юзеров. Можно разрешить или отменить хтмл, поддержку смайлов и bbcode. Короче, настроек много, так что ты покопайся сам и посмотри. Все просто.

401 AUTHORIZATION REQUIRED

Теперь поговорим о разделе доступа. Закрыть можно все, что душе угодно, - от главной страницы до форума или гостевой книжки. Я обещал не заморачиваться с .htaccess? Получай линк: http://i-core.udaff.com/spez/authme2.zip. Качай и загрузи все на сервер, сделай правильный chmod и набивай в браузере http://yoursite.ru/path_to/admin.php - перед тобой будет форма "введите логин и пароль". Не надо только кричать, что ты их не знаешь. Присмотрись! Нашел? Пиши их. Вот ты и вошел в админ-фейс - с самого начала создай свою учетную запись и установи уровень доступа на "0", далее убери к чертям пользователя под именем "admin" - оно более не нужно. Вроде бы все настроили, теперь, чтобы запаролировать страницу, нужно вставить в самый ее топ код: <? php include "path_to/auth.inc.php"; verifyAccess(0); ?>. Где ноль - это уровень доступа, а auth.inc.php - файл с логинами и паролями. Тут стоит рассказать, как это все работает: создал ты аккаунт "chmo" c уровнем доступа 1, потом вставляешь вышеуказанный код в топ страницы, которую хочешь закрыть от посторонних глаз. Юзверь "chmo" на эту страницу уже не попадает, а попадет только пользователь с уровнем 0. Доступно?


Спецвыпуск Xakep, номер #027, стр. 027-022-4, 31337 CLAN PAGE: - мутим реальную страницу клана

31337 CLAN PAGE: - мутим реальную страницу клана

НКВД (nkvd@zapisi.ru)

Спецвыпуск Xakep, номер #027, стр. 027-022-4

ПУСКАЙ ЗАПЛАЧЕТ ГЕЛЬМАН

Был на гельман.ру? Галерею помнишь? Вот и мы сейчас займемся тем же, но только не для коммерческих целей. Скачивай вот это: http://sad-raven.ru/scripts/download.php?script=2. Настроишь скрипт сам - вместе с ним идет мощный мануал. Заходи в админ-фейс, нам надо в настройки. Посмотри на последние три строчки: да, да, юзеры тоже могут добавлять свои картинки. Но сначала пикчура должна пройти фейс-контроль. Очень сильно сомневаюсь, что тебе это надо, поэтому меняй все значения этих строк на 1. Далее ныряй в index.php и ищи строчку, где присутствует "index.php?add". Нашел? Убирай к чертям. Таким образом мы обезопасили себя от дебильных приколов грязных проходимцев. Под дизайн все настраивается через index.php галереи. Предостережение только одно: дрочи html сколько душе угодно, только не надо трогать сам php код, то есть стринги и прочие переменные, если не знаешь, что они означают. Также, если у тебя есть возможность пользовать mySQL, непременно зайди по этому линку: http://slooze.com/. Для галереи очень даже неплохо. Вроде как сканит папку на наличие картинок, работает с подкаталогами, генерит страницы автоматом. Юзеры могут оставлять комментарии и ставить оценку пикчуре. Вместе с архивом идет хелп, так что проблем возникнуть не должно.

J0IN US!

Да, угадал, теперь мы предоставим соискателю заджойниться в команду. Делается это, как два пальца об асфальт. Даже еще легче, так что дуй-ка по линку и качай этот скрипт: http://i-core.udaff.com/spez/form.zip. Грузи на сервер и выставь правильные права доступа - мало ли что. Процессор формы состоит из двух файлов: хтмл страницы, где прописываются строчки о юзере, и загрузка фотки. Также там можно наставить чекбоксы, чтобы, например, при ответе на вопрос "занимался ли раньше сношениями с домашними животными" чел мог поставить галочку. Короче, отредактируешь все формы с вопросами по своему желанию. Это же относится и к дизайну. Самое главное, что скрипт проверяет при отсылке форму на валидность: размер картинки, заполнены ли поля и так далее. Вот об этом подробнее. Ты можешь сам отметить, что должно проверяться (лично я поставил бы все). Открывай form.html любым текстовым редактором и ищи такую строчку: <input type="hidden" name="require" value="email,name">. Нашел? Видишь слова "email" и "name" - скрипт проверяет на валидность только строки, в которых написаны эти переменные: <input type=text name="name"> и <input type=text name="email"> - вот они то и проходят проверку. Теперь найди вот это: "<input type="hidden" name="path_to_file" value="/www/uploaded/files">" и впиши полный (НЕ урл) адрес, куда будут грузиться пикчуры, а уже потом отправляться тебе. И не забудь прочмодить папку (chmod 777). Ты можешь изменять и добавлять строки, делать проверку на правильность хоть до самого термоядерного конца света. Если ты залезешь в formmail.php, то поймешь, как забанить чей-нибудь емейл адрес. Владельцам shareware драйверов (которые уже истекли) для мозгов поясню: переменная "$banlist" банит, если ввести в скобках рядом с ней через запятые адреса ненавистных приколистов. Советую спуститься ниже по исходнику и изменить буржуйские английские записи, которые говорят юзеру, правильно ли он все заполнил, на русские.


Спецвыпуск Xakep, номер #027, стр. 027-022-5, 31337 CLAN PAGE: - мутим реальную страницу клана

31337 CLAN PAGE: - мутим реальную страницу клана

НКВД (nkvd@zapisi.ru)

Спецвыпуск Xakep, номер #027, стр. 027-022-5

ГОЛОСУЙ ЗА ЧЕ ГЕВАРУ!

Ну что? С формами разобрались вроде бы. Давай делать местные выборы у себя на сайте. Вообще, я считаю, что подобный скрипт должен по-любому использовать БД, ибо и быстрее это, и проще. Но поскольку не у всех есть такая возможность, приведу пример, не требующий mySQL, сорца голосования: http://manliks.ru/manlix/?downloads, качай Manlix SW Vote v0.1. Открывай config.inc.php и отредактируй там все по своему вкусу. Сделал? Теперь избавимся от идиотского mnlxswvote.php, так как все могут понять, где взять исходник: не, конечно, можно его переименовать, только вот ни черта работать после этого не будет. Поэтому лезем в admin.php и ищем вот эту последовательность букв: mnlxswvote. Изменяем на свое и ТАК ЖЕ переименовываем сам скрипт голосования. Сценарий таков: при создании опроса тебя просят залить вопрос, который ты хочешь задать, и количество ответов на него; дальше ты пишешь сами эти ответы. В конце тебе генерируется хтмл код - вставляешь в его страницу. Как видишь, все просто. Эта фишка тебе поможет узнать, что хотят/не хотят видеть люди на твоем ресурсе.

ZOOFILEZ

Да, сейчас мы займемся тем самым... Файлами. Ты же хочешь порадовать народ своими реплеями и эксплоитами? Но тут не так все просто, как с другими скриптами: все достойные сценарии используют базу данных mySQL. А поскольку я обещал не использовать БД, будем выходить из положения... при помощи новостной ленты обыкновенной. Можем воспользоваться и нашей Fusion, но это непрактично и неэкономично, так как она занимает много места и имеет кучу функций, которые нам не нужны для листинга файла. Так что идем по этому линку: http://i-core.udaff.com/spez/zoofilez.zip. На самом деле это модифицированный скрипт (Кузя Райский, привет!) новостей от Manlix SW. Теперь там есть возможность вписать урл. Делаем так: загружаешь все на сервер, чмодишь и настраиваешь по мануалу, который идет в архиве. После установки идешь в "шаблоны" и настраиваешь под свой дизайн. Наполнитель, в нашем случае файлы, добавляется так: "Добавить новость", пишем в "урло" путь к файлу, а ниже в большой форме его описание. Полностью я его не адаптировал - скрипт все-таки был новостной. Предоставляю эту прерогативу тебе - сам изменишь все ссылки.

MEMBER INFO

Итак, займемся самими мемберами. Что нам надо? Вывести список мемберов с их инфой: мыло, ицку, имя, пага (если есть). Делается это все опять просто: помнишь форму, которую тебе должны прислать соискатели, чтобы вступить в тиму? Вот берем оттуда текст и обыкновенным copy-past' ом вставляем через скрипт zoofilez.zip.


Спецвыпуск Xakep, номер #027, стр. 027-022-6, 31337 CLAN PAGE: - мутим реальную страницу клана

31337 CLAN PAGE: - мутим реальную страницу клана

НКВД (nkvd@zapisi.ru)

Спецвыпуск Xakep, номер #027, стр. 027-022-6

Распаковываем его и загружаем в папку, допустим, "/files". Снова настраиваем, чмодим, правим темплеты и спокойно пользуемся. Если чего-то не хватает из формы, можно там же дописать самому.

FIN

Как видишь, совсем не сложно создать страницу своей секты в Интернете, даже если у тебя говно хостинг. Сегодня мы обошлись без всяких майэскуэлев и прочей фигни - вся инфа хранилась в txt, вывернулись скриптом, который совершенно для других целей предназначен, но, тем не менее, все работает и всем хорошо. Конечно, это не все, чем можно наполнить 31337 clan page, а только необходимые фишки. Читай инет и СПЕЦ. Дозззвидания!

Линки по теме:

http://hotscripts.com

http://scripts.woweb.com

http://webscript.ru

http://manliks.ru/manlix

http://www.sad-raven.ru


Спецвыпуск Xakep, номер #027, стр. 027-026-1, ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

Леха ББ ака Alexys

Спецвыпуск Xakep, номер #027, стр. 027-026-1

(alex-sun@mtu.ru)

В результате долгой муторной работы типа сканирования и распознавания книжки оказалась у тебя куча интересных статей, которыми ты не прочь поделиться с другими. Ходить и спрашивать, кому надо, кому нет, - не пойдет, вариант спам-рассылки всем подряд неплохой, но за это можно и люлей неплохих схватить. Остается вариант выкладывания всего этого хозяйства на сайте. А как его сделать так, чтобы и не слишком долго париться с созданием сайта, но при этом чтобы он симпатично смотрелся и, может, даже принес немного денег? Заинтригован? Тогда читай об одном из таких методов - методе написания cgi-скрипта на языке Перл.

Нахрена учить чего-то еще?

Да, я точно так же спрашивал одного друга, который меня надоумил заняться перлингом :). К тому моменту я владел HTML уже почти в совершенстве и знал, что любую страницу по готовому шаблону смогу сделать за минуту-другую. Но как-то раз приперло меня немного поменять дизайн на сайте, который состоял на тот момент из страниц эдак ста. Весь мой энтузиазм по редизайну закончился после десятой паги ;). А таких еще предстояло много. Вот тогда я в экстренном порядке вытащил другана и запряг его в общих чертах объяснить мне, что как работает.

В переводе с инглиша "скрипт" означает сценарий. CGI-скрипт - это не только сценарий, а полноценная программа. Чем будут твои скрипты, зависит от твоего желания и умения. Обрабатывая полученные данные, скрипт выдает результаты работы. В отличие от JavaScript, который является "client-side application", то есть приложением, выполняющимся у клиента, на наличие CGI-скриптов броузеру просто положить. CGI-шники исполняются на сервере, а броузер лишь получает ответ в виде результата работы скрипта, чаще всего представленного как уже знакомый до боли HTML.

Синтаксис и права

Любой скрипт на перле начинается с указания места, где находится обработчик perl:

#!/usr/bin/perl

На разных серваках этот путь может немного отличаться, но на большинстве юниховых серваках он именно такой. На крайняк можно либо спросить хостера, либо, воспользовавшись shell'ом (если такой будет), вбить команду whereis perl. А еще надо указать, в какой форме должен будет передаваться ответ от скрипта броузеру. Ответ может быть разным - и HTML-текст, и обычный текст, и картинки разных форматов, и музыка, и что твоей душе угодно.

print "Content-type: text/html; charset=windows-1251\n\n"; # - для выдачи ответа в виде html-текста с кодировкой 1251 (кириллица наша).

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

print "Content-type: multipart/alternative; boundary=osdjgsdihgdkjdfklh\n\n"; # - boundary - это разделитель, в его значение надо ввести как можно более бестолковый набор символов.

Для работы скриптов на юниховых серваках необходимо указать права доступа к ним. Делается это разными способами:

в системной утилите FTP: chmod права_доступа имя_файла (chmod 0755 myscript.cgi);

при помощи ftp-клиента, например, BPFTP:

Чаще всего права на скрипт должны выглядеть как 755 (если непонятно, что это - посмотри описалово к юниховой команде chmod), то есть - полный доступ владельцу и разрешение на чтение и выполнение всем остальным, но у некоторых хостеров требования к правам другие, поэтому поинтересуйся, что нужно выставлять на твоем хостинге. Хранятся перловые cgi-шники отдельно от обычных страниц и файлов - обычно в папке cgi-bin.


Спецвыпуск Xakep, номер #027, стр. 027-026-2, ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

Леха ББ ака Alexys

Спецвыпуск Xakep, номер #027, стр. 027-026-2

Блочно-табличная структура страниц

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

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

require './values.pl'

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

$mydir='http://'.$ENV{'HTTP_HOST'}; # - указание имени хоста, к которому будет обращаться броузер.

$maindir="../html/"; # - относительный путь к html-папке.

А самое главное - засунуть процедуру для обработки форм! Без нее нет смысла использовать cgi-шники, ибо просто нечего будет скрипту обрабатывать.

# ----------------------------

# function: FormInput

# ----------------------------

sub FormInput

{

local (*qs) = @_ if @_;

# заводим локальную переменную, приравниваем ее к переданному функции массиву (в данном случае - к строке запроса)

if ($ENV{'REQUEST_METHOD'} eq "GET")

{

$qs = $ENV{'QUERY_STRING'};

}

elsif ($ENV{'REQUEST_METHOD'} eq "POST")

{

read(STDIN,$qs,$ENV{'CONTENT_LENGTH'});

}

# в этом куске проги мы выясняем, каким методом - POST или GET - мы читаем нашу строку, так как способы передачи данных в этих методах совершено разные

@qs = split(/&/,$qs);

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

foreach $i (0 .. $#qs)

# организуем цикл, начальное значение - 0, конечное - количество элементов в массиве qs

{

$qs[$i] =~ s/\+/ /g;

# меняем все плюсы в строке на пробелы (поверь, так надо)

$qs[$i] =~ s/%(..)/pack("c",hex($1))/ge;

# раскодируем юникодовые символы (такие как "%20" - кстати, это обозначает "пробел")

($name,$value) = split(/=/,$qs[$i],2);

# а теперь разбиваем значения массива на пары, разделитель - знак "="

if($qs{$name} ne "")

{

$qs{$name} = "$qs{$name}:$value";

}

else

{

$qs{$name} = $value;

}


Спецвыпуск Xakep, номер #027, стр. 027-026-3, ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

Леха ББ ака Alexys

Спецвыпуск Xakep, номер #027, стр. 027-026-3

}

# здесь мы проводим некоторые манипуляции с парами "ПАРАМЕТР:ЗНАЧЕНИЕ", зависящие от того, есть ли у параметра название или названия нет, а передано только значение (такое тоже бывает, но редко)

return 1;

}

Для работы этой процедуры где-нибудь в начале скрипта пропиши строку:

&FormInput(*input);

После этого ты сможешь обрабатывать все переменные из формы. Но об этом чуть позже. А пока начнем писать скрипт, точнее - делать рыбу с помощью скрипта. Такие вещи, как генерацию title'ов, я оставлю тебе на самостоятельное изучение.

Во избежание путаницы забей на values.pl - его ты сделал, пусть он лежит себе спокойно в папке cgi-bin. Займись написанием основного скрипта.

$script="arts.pl";

# имя скрипта

$homedir=$maindir.'arts/';

# папка, где хранятся статьи

print "<html><head>\n";

# знак \n означает переход на другую строку. Попробуй без нее посмотреть html-текст, нажав куда надо в броузере :)

print "<link rel=\"stylesheet\" href=$mydir/styles.css>\n";

# путь к css-файлу и его имя

print "</head>\n";

print "<body>\n";

Верхушка страниц наверняка будет повторяться на всех страницах. Рекомендую запихнуть html-код шапки страниц в отдельный файл и обозвать его как header.txt.

$headerfile=$maindir.'header.txt';

# переменная с путем к файлу шапки

open(HEA, "$headerfile");

# открываем файл шапки на чтение

@header=<HEA>;

# засовываем весь контент файла в массив

close (HEA);

# закрываем файл

foreach (@header) {print $_;}

# выводим весь массив

Под шапкой пусть будет горизонтальная менюшка с линками на основные разделы сайта. Ее опять же можно засунуть в отдельный файл, но только не полностью. Создай файл navi.txt, в который запихни html-код с ссылками на основные разделы:

<div>

<a class="navibar" href="/link1">link 1</a> |

<a class="navibar" href="/link2">link 2</a> |

<a class="navibar" href="/link3">link 3</a> |

<a class="navibar" href="/link4">link 4</a> |

<a class="navibar" href="/link5">link 5</a> |

</div>

В скрипте же напиши следующее:

print "<table cellspacing=0 cellpadding=0 border=0 width=100% bgcolor=#99CCFF>\n";

print "<tr><td>\n";

# сюда будет вставлен контент из файла navi.txt

$navifile=$maindir.'navi.txt';

# переменная с путем к файлу шапки

open(NAV, "$navifile");

@navi=<NAV>;

close (NAV);

foreach (@navi)

{

print $_;

# $_ - переменная по умолчанию, т.е. главная переменная текущего цикла

}

print "</td></tr></table>\n";

А вот теперь настала пора вспомнить об обработке форм FormInput. Если быть точнее, то генерация тысяч страниц одним скриптом возможна только благодаря передаче параметров. Когда-нибудь обращал внимание на странные адреса, типа http://winfo.org/cgi-bin/arts.pl?raz=updates&subj=sp4win2k&id=al&act=read (ссылка не работает по причине конфискации нашего сервака спецслужбами ламерикосов. Пользуясь случаем, передаем им привет :) - прим. ВИНфо-крю). Параметры скрипта будем передавать полностью в строке адреса (то, что идет после вопросительного знака). Точно так же обрабатываются параметры, передаваемые формой методом GET, но про формы и методы можно написать не только статью, но и целый журнал :). В указанном примере вместе с адресом скрипту передаются сразу 4 параметра, которые разделены амперсандом (значок &). Только все эти параметры были сгенерированы скриптом на основе файла с каким-то списком. От тебя потребуется только придумать имена таких "типа форм", а также как-нибудь придумать имя переменной, которая будет отвечать за действие скрипта. Я обычно обзываю ее как act (action - действие), поэтому и здесь будет так. В зависимости от значения act'а будет меняться контент страниц.


Спецвыпуск Xakep, номер #027, стр. 027-026-4, ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

Леха ББ ака Alexys

Спецвыпуск Xakep, номер #027, стр. 027-026-4

Динамическая генерация линков

Делал ли когда-нибудь в обычном ручном html'е список однотипных ссылок? Или прайс-лист компьютерной конторы? Немного утомительно каждый раз писать <a href=...>pos 1</a>, особенно если позиций более сотни. На перле это модно сделать, приложив к этому намного меньше усилий. Рассмотрим это на примере создания списка статей, которыми тебе захотелось поделиться с людьми, выложив их на сайте. Все, что нужно сделать, - это создать текстовый файл, который будет собой представлять своеобразную текстовую базу данных, в полях которой будут указаны: название статьи, имя файла с текстом, автор, время написания. Все эти поля должны быть чем-то отделены друг от друга, например, двумя точками с запятой (;;). Нечасто в тексте встречается такое сочетание знаков, так что ;; подходит на роль разделителя, тем более что он не сильно будет маячить перед глазами при редактировании файла ручками. Хватит теории, пора переходить к скрипту.

# если параметр act пустой или отсутствует, то будет выводиться список имеющихся у тебя статей

if ($input{'act'} eq "")

{

$artindfile=$homedir.'index.txt';

open(AA1, "$artindfile");

@ind=<AA1>;

close(AA1);

print "<h1>Список статей</h1>\n";

print "<table>\n";

print "<tr><td><div>\n";

for($q=0; $q<@ind; $q++)

{

chomp($ind[$q]);

# избавление от символа новой строки

($date, $razdel, $name, $author, $filename)=split(/;;/,$ind[$q]);

# разбивка строки на части

print "<a href=\"$script?art=$q&act=read\"><b>$name</b></a>\n";

print "<br>\n";

print "<div>Автор статьи: $author.\n";

print "Дата написания: $date\n";

print "<hr width=80% align=center></div>\n";

}

print "</td></tr>\n";

print "</table>\n";

}

Функция chomp() помогает избавиться от символа новой строки на ее конце. Такой символ может сотворить такое с именем файла, что потом запаришься думать, почему у тебя ничего не работает :).

Функция split() служит для разбивки строки на части, разделенные каким-то знаком. Существует и ей обратная функция join().

Ссылки на будущие страницы со статьями сделаны, но после клика на них пока никаких статей видно не будет (потому что самих файлов просто нет). Скрипт еще не знает, что ему обрабатывать и как. Значит, надо написать сценарий для обработки и вывода содержания самих статей.


Спецвыпуск Xakep, номер #027, стр. 027-026-5, ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

Леха ББ ака Alexys

Спецвыпуск Xakep, номер #027, стр. 027-026-5

Обработка текста статей

Для начала создай папку, где будут находиться тексты статей (например, папка arts). Если их много и у них есть свои тематики, то можно раскидать их по рубрикам, точнее по вложенным папкам. Картинки, прилагаемые к статьям, запихни в папку arts/screens. В верхней строке файла с текстом статьи на всякий случай оставь ее название - если потом кто-то найдет ошибку в статье, то ее придется исправить ручками, а с указанным вверху названием статьи ты наверняка не ошибешься с выбором файла. В местах, где идут картинки, укажи имя файла картинки и через ;; напиши к ней комментарий:

library.gif;;Библиотеки разные бывают

Это, конечно, утомительная работенка, но это лучше, чем писать полностью пути к картинкам:

<img src="/screens/library.gif" border=0><br>Библиотеки разные бывают

Немного ниже расскажу, как все обрабатывать.

if ($input{'act'} eq "read")

{

$chart=$input{'art'};

# $input{'art'} - значение параметра art, который был передан скрипту из списка

# это уже знакомо

$artindfile=$homedir.'index.txt';

open(AA1, "$artindfile");

@ind=<AA1>;

close(AA1);

for ($q=0; $q<@ind; $q++)

{

chomp($ind[$q]);

}

($date, $folder, $chname, $chauthor, $fname)=split(/;;/,$ind[$chart]);

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

# $folder - имя папки (вложенной в arts), к которой относится статья

# $chname - название выбранной статьи

# $fname - имя файла выбранной статьи

# $chauthor - автор статьи

$artfolder=$homedir.$folder;

# путь к папке с выбранной статьей

$artfile=$artfolder.'/'.$fname.'.txt';

# путь к файлу с выбранной статьей

open(AA2, "$artfile");

@arts=<AA2>;

close(AA2);

print "<center>\n";

print "<h1>$chname</h1>\n";

print "<div><b>Автор статьи</b>: $chauthor</div>\n";

print "<br></center>\n";

print "<div>\n";

for ($qw=0; $qw<@arts; $qw++)

{

chomp($arts[$qw]);

# так как имена файлов картинок идут с расширением gif или jpg, находятся они на отдельных строках, а следом через ;; идет комментарий, то все подобное, что встретится в тексте статьи, будет преобразовано в тэги с подставленными путями к картинкам и комментариям к ним

if (($arts[$qw]=~".gif;;") || ($arts[$qw]=~".jpg;;"))

{

($imgname, $subscr) = split(/;/,$arts[$qw]);

print "<center>\n";

print "<img src=$mydir\/arts/screens\/$imgname border=0 alt=\"$subscr \">\n";

print "<div style=\"font-size: 11px;\">";

print "$subscr";

print "</div>\n";

print "</center>\n";

$qw++;

}

print " $arts[$qw]\n<br>\n";

}

print "</div>\n";

print "<br><center>\n";

print "<a class=\"a1\" href=\"$script\">Вернуться к списку статей</a>\n";

print "</center>\n";

}

В результате имеем быстро генерящийся список статей с линками на них и сами статьи, которые весьма неплохо выглядят. Осталось только вниз страниц запихнуть дубль навигации. Это, конечно, прибавит веса html-страницам, которые выдаются в ответе, но разницу в килобайт, а то и еще меньше, мало кто заметит. А не прокручивать страницу наверх для перехода в другой раздел - это уже хоть какая-то забота о посетителях сайта. Тебе это теперь сделать легко, а другим приятно будет. Менюшка опять будет браться из файла navi.txt, как и верхняя. Но для внесения разнообразия можно немного поменять цвет фона меню. Для этого в свойствах таблицы просто укажи другой цвет.


Спецвыпуск Xakep, номер #027, стр. 027-026-6, ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

Леха ББ ака Alexys

Спецвыпуск Xakep, номер #027, стр. 027-026-6

print "<table cellspacing=0 cellpadding=0 border=0 width=100% bgcolor=#FFCC99>\n";

print "<tr><td>\n";

$navifile=$maindir.'navi.txt';

open(NAV, "$navifile");

@navi=<NAV>;

close (NAV);

foreach (@navi)

{

print $_;

}

print "</td></tr></table>\n";

Остались закрывающие HTML-тэги и завершение работы скрипта.

print "</body></html>";

exit;

Это еще не конец.

Написанный скрипт один из самых простых. Его еще можно много как модифицировать, например, заставить его вести учет просмотренных страниц.

#--ведение---файла--статистики----

$statfile=$maindir.'stat.txt';

$adres=$ENV{'QUERY_STRING'};

$lock='~ci-temp.tmp';

# Проверка на существование файла статистики; если такого файла нет, то скрипт его создаст

open(FILE, ">>$statfile");

close(FILE);

# теперь файл стопудуво существует, поэтому открываем его для чтения,

open(FILE, "$statfile");

@indata = <FILE>;

close(FILE);

$onoff = 0;

&Lock;

#Ставим блокировку, чтобы несколько копий скрипта не писали одновременно в один и тот же файл - иначе такая каша может получиться :(

open(FILE, ">$statfile");

foreach $temp (@indata)

{

chomp($temp);

($name, $uri, $count) = split(/;;/, $temp);

if ($uri eq $adres)

{

$count++;

$onoff = 1;

print FILE "$name;;$uri;;$count\n";

}

else

{

print FILE "$name;;$uri;;$count\n";

}

}

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

if ($onoff eq 0)

{

print FILE "$chname;;$adres;;1\n";

}

#Если выясняется, что текущего адреса мы никогда не видели (ну, вдруг ты новую статью только что добавил или кто-то пытался своими кривыми ручонками поиграть с параметрами твоего скрипта), то мы добавляем в файл статистики новую строку и ставим ее счетчик в единицу.

close(FILE);

#Файл закрыли, теперь снимаем блокировку

&Unlock;

#-------------------------------------------------------------

# Lock: Проверка блокировки

#-------------------------------------------------------------

sub Lock {

$timecheck = 0;

while(-e $lock)

{

sleep(5);

$timecheck = $timecheck + 1;

if ($timecheck >= 6)

{

unlink("$lock");

}

}

open(LOCKFILE,">$lock");

close(LOCKFILE);

return;

}

#-------------------------------------------------------------

# Unlock: Снятие блокировки

#-------------------------------------------------------------

sub Unlock {

unlink("$lock");


Спецвыпуск Xakep, номер #027, стр. 027-026-7, ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле

Леха ББ ака Alexys

Спецвыпуск Xakep, номер #027, стр. 027-026-7

return;

}

#--конец ведения файла статистики

Вышеприведенный код будет вести в файле stat.txt учет посмотренных статей. В него будут вноситься: название статьи;;параметры скрипта;;количество просмотров. При таком способе подсчета просмотров не будет глюков, если одновременно несколько человек что-то захотят посмотреть (из-за использования временного файла). А вставить код надо в то место, где происходит обработка и выдача текста статьи (после строки print "<a href=\"$script\">Вернуться к списку статей</a>\n";). К файлу stat.txt уже сам сможешь написать скрипт-обработчик, который будет сортировать строки файла так, как тебе захочется. Неплохо будет смотреться на сайте топ-лист статей, да и самому интересно будет. Кстати, можно модифицировать ведение статистики так, что ты сможешь узнавать айпишники заходящих! А уж как этим можно воспользоваться, сам должен знать.

Подводя итог

После освоения перла в твоих руках окажется бoльшая власть, чем ты можешь даже представить. Рассмотренный в статье пример - лишь малая часть реальных возможностей языка. На перле можно написать не только сценарии страниц, но и форумы, чаты, скрипты для работы почтовых серваков и т.д. Это воистину всемогущий язык. Но для его работы как веб-языка нужно заиметь программу веб-сервера (рекомендую Apache). Настройке веб-сервера можно посвятить не одну статью, поэтому могу посоветовать читать мануалы к подобного рода вещам.


Спецвыпуск Xakep, номер #027, стр. 027-032-1, CSS - средство для создания лучших сайтов

CSS - средство для создания лучших сайтов

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-032-1

(alex-sun@mtu.ru)

Для создания хотя бы мало-мальски приличного сайта нужно подумать о виде страниц под разными броузерами. У каждого броузера стоят по дефолту какие-то шрифты и их размеры под различные тэги. Не будет приятно видеть всякие висящие или не умещающиеся в колонки таблиц строки при просмотре сайта. Тут понадобится средство для управления всякими font'ами - CSS.

Что есть CSS, или введение

CSS - аббревиатура Cascading Style Sheets. Только этот Sheets далеко не Shits, а даже наоборот. Переводится CSS как "Каскадные Таблицы Стилей". Только не надо думать, что на тебя рухнут всякие таблицы или еще какая нечисть - хотя это что-то типа маленькой базы данных. CSS создан для управления не только внешним и внутренним видами таблиц (как кажется из названия), а также туевой хучей других вещей, таких как шрифты, цвета, фоны.

Задачи CSS'а сходны с обычным html'ным кодом. Например, строка <font color="blue">CSS RULEZ</font> или <font style="color: blue;">CSS RULEZ</font> дадут в результате текст "CSS RULEZ" синего цвета. Спросишь, на хрена надо использовать какой-то CSS, раз все равно результат один? Не торопись с выводами, CSS имеет намного больше возможностей, да еще и помогает уменьшить объем html-страниц.

3 варианта записи CSS

Существует 3 вида использования CSS - внутренние, глобальные и связанные таблицы стилей. Каждый из видов имеет свои + и -, а выбор использования того или иного вида зависит от конкретных задач. Не жди, что добрый дядя будет советовать тебе каждый раз, когда надо будет использовать CSS. Это чем-то похоже на оптимизацию программы. Но чтобы знать, что из чего выбирать, ознакомься с тем, кто есть ху.

а) Глобальные таблицы

Допустим, надо тебе на странице сделать 20 подчеркнутых надписей красного цвета. Надо бы 20 раз писать <font color="red"><u>Текст 1<u></font> ... <font color="red">Текст 20</font>. Не до хрена ли писать? А размер странички как? Конечно, с появлением быстрого инета не так уж это и важно, но ведь не всем пока так хорошо живется. Лучше уж выигранное от кода место использовать под порнографику или чего там еще взбредет в голову. Но можно сделать проще, лучше и быстрее. Между тэгом <head> и </head> пишется следующее:

<style type="text/css">

<!--

font {color: red; text-decoration: underline;}

-->

</style>

В этих строчках был переопределен весь вид тэга <font>. На этой странице весь текст между тэгами <font></font> будет красным и подчеркнутым, причем будет выиграно в коде примерно 2 килобайта. Если потом захочется убрать подчеркивание и сделать наклонный шрифт, то надо будет лишь исправить одну строчку с описанием свойств font'а на font {color: red; font-style:Italic;}. Комментаторы (<!-- -->) нужны для того, чтобы какой-нибудь старенький броузер (ИЕ 3 или другой старичок) окончательно не двинул кони от невиданного ранее CSS'а. Если ты думаешь, что таких броузеров много, то ошибаешься. Примерно 99.9% броузеров нормально понимают CSS.


Спецвыпуск Xakep, номер #027, стр. 027-032-2, CSS - средство для создания лучших сайтов

CSS - средство для создания лучших сайтов

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-032-2

Если бы можно посредством CSS'а менять стиль одного тэга только один раз, то CSS умер бы в зародыше. Главное, что можно делать - это самому вводить классы и описывать их свойства. Самое трудное - это выбрать, как обозвать классы. Рекомендую обзывать их так, чтобы ты сам понимал, какой для заголовков, какой для текста и т.п. От вышеописанного примера отличается наличием точки перед названием класса:

.hdr1 {font-style: Arial; font-size: 16px; font-weight: bold; text-align: center;}

После описания класса надо бы его использовать в своих целях. Для вызова класса нужно указать его имя:

<div class="hdr1">Вот такой заголовок</div>

Броузер выдаст жирный текст шрифтом Arial, размером 16 пикселей и выровненный по центру. Для повторного использования на странице класса просто напиши опять <div class="hdr1">еще какой-то текст</div>. Старайся как можно реже использовать тэг <font></font>, а лучше вообще забыть про него. Юзай вместо него <div></div> - с CSS он намного лучше дружит, да и обрабатывается пошустрее.

б) Связанные таблицы

Если на твоем сайте есть (или будет) хотя бы 20-30 страниц, а CGI и SSI не дает юзать хостер, то тут только связанные таблицы облегчат твое бедовое положение. Вдруг тебе захочется немного поменять внешний вид сайта. Править даже 20 страниц будет очень утомительно (знакомо по своему первому опыту еще года 4 назад, когда я захотел поменять цвет заголовков на сайте). Используются связанные таблицы почти так же, как и внутренние, только описание всех классов заносится в отдельный файл some_name.css, а на странице указывается путь к нему:

<link rel="stylesheet" href="some_name.css">

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

в) Внутренние таблицы

Внутренние таблицы вставляются в html-странице в месте непосредственного их применения. Как правило, такой стиль используется 1-2 раза на странице, и не хочется наваливать в CSS-ник еще один стиль. Для использования внутренних таблиц ничего специального описывать не нужно. Единственное, что нужно, - это записать стиль для нужного тэга в том месте, куда ты его решил засунуть:

<div style="font-family: Verdana; font-size: 12px; color: #000066;">попробуем внутренние таблицы</div>

Еще один резон использовать внутренние таблицы есть в том случае, если нужный в каком-то месте стиль отличается немного от уже описанного. Например, описано у тебя выравнивание по центру для класса "hdr2" (.hdr2 {font-family: Verdana; font-size: 16px; font-weight: bold; color: red; text-align: center;}), а тебе надо то же самое, но сдвинутое влево. Тогда нужно только во внутренней таблице указать новое выравнивание:


Спецвыпуск Xakep, номер #027, стр. 027-032-3, CSS - средство для создания лучших сайтов

CSS - средство для создания лучших сайтов

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-032-3

<div class="hdr2" style="text-align: left;"> Хочу налево :)</div>

Оживление страниц с помощью CSS

Выше описаны 3 формы использования CSS'а. Какую когда и куда совать - решать тебе. Но с помощью CSS'а можно не только управлять шрифтами. CSS может частично заменить Java Script, но намного более интересных вещей можно добиться при совместном использовании CSS с Java Script'ом, SSI и др.

Не стоит раскатывать губы по поводу того, что CSS может полностью заменить JS или Flash. Не для того он предназначен. Да и не было бы тогда ничего кроме CSS'а. Но вот изменение вида ссылки при наведении и нажатии на нее мыши - очень даже легко. Для этого нужно описать стили для линков (тэг <a>, если еще не забыл) в нескольких состояниях: новые ссылки - куда не ступал броузер человека, посещенные ссылки - куда уже ступал раз или больше, ссылки при наведении мыши. Начни описывать стили ссылок с общего описания (фактически все новенькие линки):

a {font-family: Tahoma; color: black; font-size: 11px; font-weight: normal; text-decoration: none; font-style: normal; text-align: left;}

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

a:visited {font-family: Tahoma; color: magenta; font-size: 11px; font-weight: normal; text-decoration: none; font-style: normal; text-align: left;}

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

a:hover {color: blue; text-decoration: underline;}

При наведении ссылка будет становиться синей и подчеркнутой. Можно также сделать и изменение цвета фона под ссылкой, смещение ссылки в сторону и т.п. (a:hover {color: blue; text-decoration: underline; margin-left: 20px; background-color: yellow;}), только по ходу экспериментов следи, чтобы у тебя ничего не уезжало.

a:active описывает вид ссылки в момент нажатия на нее. Лично у меня такой момент длится намного меньше секунды (столько же длился даже на первом пне), так что я почти ничего не успеваю заметить. Уж не для тормозов ли ее придумали :)?

Если хочешь сделать новые и старые линки одинаковыми, то можно сделать запись более компактной:

a, a:visited {font-family: Tahoma; color: black; font-size: 11px; font-weight: normal; text-decoration: none; font-style: normal; text-align: left;}

При надобности использовать несколько видов ссылок на странице используй классы. Обзови их для удобства a1, a2 и т.д.

.a1, .a1:visited {font-family: Arial; font-size: 12px; color: blue;}

.a1:hover {color: black;}

Вызов таких классов происходит как обычно:

<a class="a1" href="http://www.xakep.ru">www.xakep.ru</a>


Спецвыпуск Xakep, номер #027, стр. 027-032-4, CSS - средство для создания лучших сайтов

CSS - средство для создания лучших сайтов

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-032-4

Кроме обычного изменения вида ссылок при наведении, можно заодно добавить изменение курсора с привычной всем лапой на "часы зависания" или другой курсор, а также сделать всплывающие подсказки (правда в нетскейпе 100 пудов не работает изменение курсора, а подсказки всплывают только для картинок).

<a href="http://www.xakep.ru" style="cursor:sw-resize" title="сайт журнала ХАКЕР">www.xakep.ru</a>

Вместо курсора sw-resze можно вставить другой:

crosshair - прицел;

hand - щупальца;

text - как в текстовом редакторе;

help - вопросительный знак;

wait - висим;

e-resize, ne-resize, nw-resize, n-resize, w-resize - стрелки в противоположные стороны в различных направлениях.

Изменение скроллбара броузера

Переопредели с помощью CSS свойства тэга <body>, и тогда сможешь добиться изменения стандартного вида скроллбара. Если правильно раскрасить скроллбар, т.е. вписать расцветку в дизайн, то тогда даже броузер станет частью дизайна сайта.

<style type="text/css">

body

{

scrollbar-3dlight-color: #666666;

scrollbar-arrow-color: #FF9900;

scrollbar-darkshadow-color: #333333;

scrollbar-face-color: #000000;

scrollbar-highlight-color: #FFFFFF;

scrollbar-shadow-color: #000000;

scrollbar-track-color: #CCCCCC;

}

</style>

"Не слишком ли много составных частей скроллбара?" - спросишь ты. На самом деле, наиболее заметными являются scrollbar-face-color, scrollbar-arrow-color и scrollbar-track-color. Остальные же не сильно влияют на внешний вид скроллбара.

Один умелец сделал на сайте http://www.remstroy-dm.ru/ при помощи JS и CSS появляющийся только при наведении скроллбар. Забавно получается, зайдет так чайник на сайт, а скроллбара нету. Сразу там мысли о вирусах и хакерах, боится :). А подведя мышу на место, обнаруживает его. Вот радости-то :).

Разные CSS-ники под разные разрешения

Обычно при создании сайта выбирают, под какое разрешение его клепать. Но можно ведь сделать его и резиновым, а размеры шрифтов сделать так, что они под разными разрешениями будут смотреться примерно одинаково. Для этого надо сделать css-ники под разные разрешения и как-нибудь определить разрешение. Можно, конечно, сделать по-ламерски: повесить для выбора разрешения на странице 2 кнопочки - на одной написать "800х600 и менее", на другой - "1024х768 и более", и ожидать правильного ответа от зашедшего. А вдруг у него знаний о разрешении еще меньше, чем у тебя будет :)? Как бы там ни было, не стоит уподобляться ламероподобным. Маленькая помощь от Java Script'а, и нет никаких проблем с определением разрешения. А заодно можно и CSS-ник сразу нужный загрузить.

<script language="JavaScript" type="text/javascript">

<!-- //

if ((screen.width <= 800) && (screen.height <= 600))

var resol = 800

else if ((screen.width >= 1024) && (screen.height >= 768))

var resol = 1024

document.write ('<link rel="stylesheet" href="/' + resol + '.css">')

// -->

</script>

Для пользования скриптиком обзови один css-ник - "800.css", а 2-ой - "1024.css", которые должны лежать в корневой директории html-страниц (на разных серваках по-разному - WWW, html и т.п.). Пусть броузер сам определяет разрешение каждого пришедшего, а ты займись более важными делами - распитием пива, встречами с девушками... сам придумаешь, чем, не все же меня слушать :).


Спецвыпуск Xakep, номер #027, стр. 027-032-5, CSS - средство для создания лучших сайтов

CSS - средство для создания лучших сайтов

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-032-5

Кастомайзинг таблиц и надписей

Забавные фишки можно сотворить с таблицами при помощи CSS, например, быстро, качественно и недорого сделать рамку для таблицы. Для этого надо вспомнить про существование border'ов, только не табличных, а CSS'ных. Синтаксис описания бордера таков:

border (-right, -left, -bottom, -top): width color style

width - ширина border'а, color - цвет, style - способ окрашивания.

Создавая таблицу, нужно просто описать свойства, такие как ширина, цвет и способ окрашивания border'а. Насчет ширины и цвета решать уже тебе самому, а сейчас речь пойдет о способах окрашивания бордеров. Насколько мне известно, существует 8 стилей border'а: Groove, Dotted, Inset, Outset, Dashed, Solid, Double и Ridge. Стили Groove, Inset, Outset и Ridge придают border'у объемный эффект, а остальные закрашивают border пунктирными или сплошными линиями.

Для создания обрамления как на рисунке воспользуйся следующим:

<table border=1 style="border: #000000 3px dotted;">

...

</table>

Кроме создания рамок, с помощью CSS'а можно создавать эффект свечения надписей, находящихся в ячейке таблицы (типа как на рисунке). Для создания такого эффекта нужно в свойствах тэга <td> использовать filter:glow(color=some_color strength=X).

<table>

<tr>

<td style="filter:glow(color=#0000ff strength=5); font-weight:bold; font-size:24px; font-family:Tahoma; color:FFFFFF">

<div>CSS RULEZ!</div>

</td>

</tr>

</table>

В результате использования вышеизложенного кода получилась надпись, внешне очень схожая с применением стиля Outer Glow в Photoshop'е:

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

<table bgcolor="#999999" style="border: coral 3px groove;"><tr>

<td style="filter:shadow(color=blue)">

<div class="color: yellow;">CSS снова Rulez!</div>

</td>

</tr></table>

Один есть недостаток от использования таких надписей - работают они только в ИЕ (4.0 и выше). Так что, если ты еще считаешь ОПЕРу лучшим броузером, то подумай, чего ты можешь лишиться.

Совместимость шрифтов

Все-таки главным назначением CSS'а модно назвать управление свойствами шрифтов, причем выбор шрифта является наиболее важным достоинством. А вдруг ты после установки очередной тысячи новых шрифтов решишь один из них использовать? Не самая лучшая картина предстанет перед тем, кто увидит сайт с совершенно не теми шрифтами, под которые все делалось. Поэтому актуален вопрос о выборе универсальных шрифтов.

Многие вебмастеры используют шрифты, входящие в MS Office. Простите пожалуйста, а кто сказал, что каждый просто обязан ставить Офис? А почему вообще только про винды в первую очередь думают? Линуха еще пока никто не отменял, они жили и живут. Так что не стоит выбирать Verdana, Tahoma, Arial и т.п. Хотя, бесспорно, эти шрифты очень хорошо вписываются почти в любой сайт. Намного лучше будет указать в семействе шрифтов (font-family) одно из следующих:


Спецвыпуск Xakep, номер #027, стр. 027-032-6, CSS - средство для создания лучших сайтов

CSS - средство для создания лучших сайтов

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-032-6

serif - шрифты с закорючками;

sans-serif - шрифты без закорючек;

cursive - курсивы;

fantasy - видеть надо!

monospace - с одинаковой шириной символов (типа Courier'а).

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

.id {font-family: Verdana, Tahoma, Sans-serif;}

Если на чьем-то компе не будут стоять 2 первых шрифта, то тогда будет задействовано семейство Sans-Serif. Только если уж будешь указывать подобным образом несколько шрифтов, то посмотри, какую картину даст каждый из них, оставив его одного. В смысле в одиночестве :).

Время действовать

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


Спецвыпуск Xakep, номер #027, стр. 027-036-1, SSI - НЕ ТОЛЬКО КИРПИЧИКИ ДЛЯ САЙТА

SSI - НЕ ТОЛЬКО КИРПИЧИКИ ДЛЯ САЙТА

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-036-1

Сейчас даже некоторые бесплатные хостинги дают возможность использовать SSI. А использовать SSI при создании больших сайтов со сложной структурой сам Бог велел. Их использование может сильно облегчить тебе жизнь при изменении структуры или контента сайта.

ЧТО ЭТО?

SSI это аббревиатура, которая расшифровывается как Server Side Include (включения на стороне сервера). Эта технология, которая позволяет не только использовать несколько файлов при формировании html документа для вывода пользователю, но и работать с переменными сервера и даже выполнять скрипты.

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

ЗАМОРОЧКИ С РАСШИРЕНИЯМИ

Чтобы не задавать в конференциях глупых вопросов типа:

- У меня <!--#include virtual="myfile.txt"--> не работает...

- А какое расширение у файла?

- html...

Запомни, что Apache по умолчанию обрабатывает документы с расширением shtml, а виндовый IIS - stm.

Если у тебя есть доступ к настройкам сервера, то Apache можно настроить так, чтобы он обрабатывал html-файлы как SSI-файлы. Главное, чтобы не было конфликтов. Для этого надо залезть в файл настроек сервера httpd.conf и найти в нем строку, начинающуюся с AddHandler server-parsed. Добавь в нее те расширения, которые тебе нужны, например: AddHandler server-parsed .shtml .shtm .sht .html .htm. И не забудь указать типы файлов, которые ты добавил в строке AddType text/html .shtml .shtm .sht .html .htm. Для Apache 2.0, который сейчас набирает обороты, в файле httpd.conf надо найти строки

AddType text/html .shtml

AddOutputFilter INCLUDES .shtml

и добавить в них нужные расширения файлов.

К сожалению, для php-файлов нельзя юзать SSI-инструкции без заморочек. В PHP есть функции include() и require(), действие которых аналогично <!--#include.

Для IIS все значительно проще: ему по барабану, так что пусть все твои файлы с html-кодом, SSI-инструкциями имеют расширение .asp. В скорости обработки файлов ты не потеряешь, а головная боль от некорректных расширений файлов исчезнет навсегда.

КТО ПОСЛЕДНИЙ?

Запомни только, что SSI-инструкции сервер обрабатывает раньше скрипт-кода. И маза типа

Response.Write("<!--#include virtual = "inc/menu.aspl" -->")

есть бредятина. Для использования вставки инклудов по условию юзай закрывающие и открывающие дескрипторы кода. Например:

<%if Condition1 then%>

<!--#include virtual="inc/test1.html"-->

<%elseif Condition2 then%>

<!--#include virtual="inc/test2.html"-->

<%else%>

<!--#include virtual="inc/test3.html"-->

<%end if%>

СИНТАКСИС

Синтаксис SSI-инструкций одинаков для всех серверов:

<!--#ssi_инструкция[пробел]=[пробел]"параметры"[пробел]-->.

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


Спецвыпуск Xakep, номер #027, стр. 027-036-2, SSI - НЕ ТОЛЬКО КИРПИЧИКИ ДЛЯ САЙТА

SSI - НЕ ТОЛЬКО КИРПИЧИКИ ДЛЯ САЙТА

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-036-2

Теперь посмотрим, какие SSI-инструкции ты можешь использовать.

КОНФИГУРИМ SSI

CONFIG помогает настроить формат вывода сообщений об ошибке (errmsg), формат вывода информации о размере файла (sizefmt) и времени (timefmt).

Синтаксис:

<!--#config output = string -->.

Пример:

<!--#config errmsg="Ошибка ssi, пишите <a href=mailto:zero@null.ru>автору</a>"-->

В случае возникновения ошибки в любой SSI-инструкции в этом файле на экран выведется сообщение: Ошибка ssi, пишите автору. Максимальный размер сообщения об ошибке 1024 байта.

Инструкция <!--#config sizefmt="abbrev"--> позволит вывести тебе размер файла в килобайтах, а <!--#config sizefmt="bytes"--> - в байтах.

И, наконец, инструкция <!--#config timefmt="%d.%m.%Y %H:%M:%S"--> позволит вывести информацию о дате и времени модификации файла в читабельном виде: 20.07.2002 16:31:33.

А вот перечень всех параметров, используемых в config timefmt:

Формат

Описание

Пример

%a

Аббревиатура названия дня недели

Sun

%A

Полное название дня недели

Sunday

%b

Аббревиатура названия месяца

Jan

%B

Полное название месяца

January

%d

День месяца

01 (не 1)

%D

Дата в формате "%m/%d/%y"

01/31/90

%e

День месяца

1

%H

Часы в 24-часовом формате

13

%I

Часы в 12-часовом формате

01

%j

День года

235

%m

Номер месяца

01

%M

Минуты

03

%p

AM|PM

AM

%r

Время в формате "%I:%M:%S %p"

11:35:46 PM

%S

Секунды

34

%s

Время в секундах с 01.01.1970

957228726

%T

Время в формате "%H:%M:%S"

14:05:34

%U

Неделя года

49

%w

Номер дня недели

5

%y

Год в формате ГГ

95

%Y

Год в формате ГГГГ

1995

%Z

Временная зона

MSK

ECHO - ВЫВОДИМ ПЕРЕМЕННЫЕ СЕРВЕРА

SSI-инструкции позволят тебе выводить переменные сервера (если для тебя словосочетание переменные сервера не пустой звук) в html-файл. Синтаксис таков:

<!--#echo var = VariableName -->. Для разных серверов список переменных разный, но некоторые из них могут быть общими.

Например, <!--#echo var="HTTP_REFERER"--> выведет адрес страницы, с которой ты пришел, а <!--#echo var="HTTP_USER_AGENT"--> - кодовое название твоего браузера.

Есть еще одна SSI-инструкция, которая позволяет выводить все переменные сервака:

<!--#printenv -->.

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

РАЗМЕР ИМЕЕТ ЗНАЧЕНИЕ И ВРЕМЯ ТОЖЕ

Еще одно применение SSI-инструкций - вывод информации о размере и дате изменения указанного файла. Формат вывода конфигурируется инструкцией config. Синтаксис:

<!--#flastmod (fsize) PathType = FileName -->. Например, инструкция <!--#fsize file="ssi.shtml"--> выведет инфу о размере файла ssi.shtml, лежащего в одной директории с текущим файлом, а инструкция <!--#flastmod virtual="ssi.shtml" --> - дату изменения файла ssi.shtml из корневой директории.

ЗАПУСКАЕМ СКРИПТЫ И ПРОГИ

Инструкция запускает внешнюю программу (exec cmd) или cgi-скрипт (exec cgi) и вставляет в содержимое страницы вывод. Синтаксис:

<!--#exec CommandType = CommandDescription -->.

Пример:

<!--#exec cgi="/cgi-bin/test.pl" -->


Спецвыпуск Xakep, номер #027, стр. 027-036-3, SSI - НЕ ТОЛЬКО КИРПИЧИКИ ДЛЯ САЙТА

SSI - НЕ ТОЛЬКО КИРПИЧИКИ ДЛЯ САЙТА

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-036-3

КИРПИЧИ

И, наконец, инструкция include поможет тебе собрать свой сайт по кусочкам. Вставив во все файлы конструкцию <!--#include virtual = "inc/menu.shtml" --> ты сможешь менять, например, ссылки в меню на всех страницах сайта, изменяя всего лишь один файл. И это правильно. Синтаксис:

<!--#include PathType = FileName -->. PathType может быть virtual (указывается виртуальный путь к файлу) или file (указывается относительный путь к файлу, то есть файл должен находиться или в текущем каталоге, или во вложенном каталоге). Virtual работает немного медленнее, но обладает более крутыми возможностями.

ЮЗАЙ ИНКЛУДЫ ПРАВИЛЬНО!

Вот тебе пара советов:

1) Используй в инклудах только законченные куски кода, то есть открывающий и закрывающий теги должны совпадать. Если код начинается с <table>, он должен заканчиваться </table> и никак иначе.

2) Если все же возникла необходимость разделить код на неравнозначные куски, например, нужно везде вставить оформление до и после твоего контента, используй похожие имена инклудов с разными окончаниями (blablabla_start.shtml и blablabla_end.shtml - подойдут идеально, но ты всегда можешь использовать что-то свое). А в середине используй blablabla_middle[n].shtml. И опять же следи, чтобы твои инклуды составляли законченный кусок кода.

3) Смело используй вложенные инклуды.

ЧЕГО НЕТ В ВИНДАХ

Apache позволяет использовать инструкцию set var для установки переменных сервера (!). Йоу, можно гнать лажу! Например, <!--#set var="SERVER_NAME" value="www.dhls.ru" --> позволит вместо настоящего имени сервера вывести www.dhls.ru.

Синтаксис: <!--#set var = VariableName value = Value -->.

И еще одной важной инструкции лишены поклонники MS: конструкция с использованием if/else. Наличие такой команды не может не радовать... Применяется для управления выводом страницы по условию. Синтаксис такой:

<!--#if expr=" Condition " -->

HTML-код, который будет выводиться, если Condition1 истинно

<--#elif expr=" Condition2" -->

HTML-код, который будет выводиться, если Condition1 ложно, а Condition2 истинно

<--#else -->

HTML-код, который будет выводиться, если все условия ложны

<--#endif -->

Condition - это либо строка, которая является истинной, если не пустая, или набор операторов сравнения строк. Операторы стандартны для логических операций: =,!=,<,<=,> и >. Если вторая строка заключена в "/"(слэши), то условие истинно, если в первой строке встречается хоть одно вхождение второй строки. Можно объединять несколько операторов сравнения с помощью операторов &&(И) и ||(ИЛИ). Для группирования условий используются "()"(скобки). Например, код:

<!--#if expr="$HTTP_USER_AGENT=/Nav/ || $HTTP_USER_AGENT=/Mozilla/" -->

Netscape Navigator

<!--#elif expr="$HTTP_USER_AGENT=/MSIE/" -->

Internet Explorer

<!--#else -->

Неизвестный (<!--#echo var="HTTP_USER_AGENT" -->)

<!--#endif -->

выведет "Netscape Navigator", если у тебя стоит "Навигатор" или "Мозилла", "Internet Explorer" - если у тебя IE и "Неизвестный ИМЯ_БРОУЗЕРА", если еще что-то (например, "Опера").


Спецвыпуск Xakep, номер #027, стр. 027-036-4, SSI - НЕ ТОЛЬКО КИРПИЧИКИ ДЛЯ САЙТА

SSI - НЕ ТОЛЬКО КИРПИЧИКИ ДЛЯ САЙТА

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-036-4

Вот, собственно, и все. Понял, что жить с SSI становится легко и приятно? Тогда юзай на здоровье!


Спецвыпуск Xakep, номер #027, стр. 027-038-1, FLASH-PRELOADER - до полного загруза...

FLASH-PRELOADER - до полного загруза...

ilich (ilich@atrus.ru)

Спецвыпуск Xakep, номер #027, стр. 027-038-1

"И дух WINformation долго витал над его страницами..."

/откровения от Донора и Доктора, опус 139/

В инете часто бываешь? А грузил ли ты когда-нибудь пагу, выполненную на Великом Flash'e, с размахом хотя бы кило так на двести без прелоадера? Нет? А знаешь, почему? Да потому, что это жалкое зрелище! Т.к. посмотреть первые три кадра анимации за минуту загрузки не всегда бывает приятно. А посему и ты такого не твори.

Основной вопрос

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

Существует два вида прелоадеров. Одни следят за всем процессом загрузки, другие могут профиксить лишь только момент, когда загрузка окончена. И те, и те нам с тобой пригодятся. Грузи Flash.

Итак, давай разберемся, что к чему, начина с самого главного прелоадера. Инфа в флешке организованна сверху вниз (технология data streaming), короче говоря, фильм начинает воспроизводиться еще до (!) полной загрузки. Это полезно хотя бы тем, что дает возможность создания прелоадера. Суть оного состоит в том, что загружаемые первыми кадры являются фактически отдельной частью Flash-страницы, говорящей пользователю, сколько еще осталось ждать.

Самое время тебе выслушать пару технических особенностей. Во-первых, сцены. Сцены грузятся в таком порядке, в каком они у тебя в окошке "Scene", сверху вниз. Ит минз, что сцена с прелоадером (да-да, лучше его запихнуть на одну сцену, например, "PRE", а основное действо на другую (-ие), например, "MAIN") должна быть самой верхней. Во-вторых, слои. Слои грузятся не разом, а по одному, это очевидно :). Причем порядок их загрузки ты устанавливаешь при публикации. По умолчанию стоит загрузка слоев снизу вверх. Так и оставим.

Сделай на сцене для прелоадера два слоя, один для графы, другой для скрипта. Т.к. вначале грузится нижний слой - рисуй там горизонтальную линию цвета, отличного от фона, длиной 100 пикселей, дабы к моменту загрузки и действия кодов графа уже присутствовала. Загоняй линию в клип "C - PREline" и дай мувику на сцене имя "status". Проследи за тем, чтобы центр мувика был в начале линии. Рядом с линией рисуй шкалу таким раком, чтобы наша линия (100 пикселей) показывала бы 100 процентов загрузки. Загоняй шкалу в мувик "C - Mark". Т.к. у нас в прелоадере нет никакой посторонней графики, то можно обойтись всего двумя кадрами. Если ты, как реальный мачо, замутишь вместо линии что-нибудь посложнее и покрасивее, то и кадров в прелоадере будет побольше. Растягивай кадр с художествами еще на один.

В верхнем слое делай два пустых ключевых кадра. В первом из них пиши:


Спецвыпуск Xakep, номер #027, стр. 027-038-2, FLASH-PRELOADER - до полного загруза...

FLASH-PRELOADER - до полного загруза...

ilich (ilich@atrus.ru)

Спецвыпуск Xakep, номер #027, стр. 027-038-2

x=_root.getBytesTotal ();

y=_root.getBytesLoaded ();

status._width=int (y/x);

if (x==y) {

_root.gotoAndPlay ("MAIN",1);

}

Во втором то же самое, только в конце добавляется строка "gotoAndPlay(1);".

Вот и все, а ты боялась... Я старался, чтобы код был как можно легче. Итак, объясняю. Фишка "_root.getBytesTotal()" дает общий размер флешки, а "_root.getBytesLoaded()" - размер загруженной части. Далее ширина (т.е. у нас длина) линии устанавливается равной проценту загрузки, и идет, собственно, проверка на окончание закачки.

Сам я всю эту хрень обычно успешно запихиваю в отдельный мувик, а сам этом мувик просто выношу в первый кадр сцены "PRE".

Вопрос мувика

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

Если есть закачка, значит должен быть и прелоадер! Ибо уж если быть красивым, то быть красивым со всех сторон (и даже там!). А инет у нас так устроен, что красота порой поважнее контента бывает. Так что в путь.

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

Итак, процесс. Создай новый мувик "C - Loader" и тащи в него 2 штуки нашей линии aka "C - PREline" и, соответственно, то, что к одной из них прилагается, - шкалу загрузки. Одну из линий вместе со шкалой, не медля, организуй так же, как и в нашем основном прелоадере, т.е. задай имя линии "status" и поставь ее правильным образом напротив "C - Mark", которому на этот раз тоже надо дать имя - "mark" :). Второй полоске дай имя "target" и забей на нее, оттащив за пределы рабочей области. Сотвори новую кнопку для отдачи команды на загрузку "B - Starter", стартер то бишь. И суй ее туда же, в "C - Loader" на новый слой. Скриптуем кнопень:

on (press) {

loadMovie ("about_me.swf", target);

mark._visible=true;

status._visible=true;

gotoAndPlay (2);

}

Все понятно, как 347*1329 :). Мы по нажатию пимпы грузим "about_me.swf" на место мувика "target", т.е. нашей второй линии. При этом, когда файл загрузится, новый клип заменит старый, переняв некоторые его свойства, такие, как положение на экране, видимость и др. Мы чуваки не глупые и скроем загружаемый мувик до момента его полного появления. Вот сказал-то :)! Сам поразился. Далее мы делаем элементы прелоадера видимыми. Ну и напоследок действием "gotoAndPlay(2)" мы идем играть второй кадр. Вот именно с кадрами нам и осталось поработать.


Спецвыпуск Xakep, номер #027, стр. 027-038-3, FLASH-PRELOADER - до полного загруза...

FLASH-PRELOADER - до полного загруза...

ilich (ilich@atrus.ru)

Спецвыпуск Xakep, номер #027, стр. 027-038-3

В нашем родном "C - Loader" надо сделать следующую кадровую конструкцию. Самый верхний слой должен состоять из трех пустых ключевых кадров для ActionScript. Первый из них нужен для некоторых приготовлений к загрузке клипа и, соответственно, к действию прелоадера. Пиши в нем:

mark._visible=false;

status._visible=false;

target._visible=false;

target._x=0;

target._y=0;

mark._x=10;

status._x=10;

mark._y=50;

status._y=60;

stop ();

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

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

Кадр 2

x=target.getBytesTotal ();

y=target.getBytesLoaded ();

status._width=int (y/x);

if (x==y) {

status._visible=false;

mark._visible=false;

target._visible=true;

stop ();

target.gotoAndPlay (1);

}

Кадр 3

x=target.getBytesTotal ();

y=target.getBytesLoaded ();

status._width=int (y/x);

if (x==y) {

status._visible=false;

mark._visible=false;

target._visible=true;

stop ();

target.gotoAndPlay (1);

}

gotoAndPlay (2);

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

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

Смотрим на конец

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


Спецвыпуск Xakep, номер #027, стр. 027-038-4, FLASH-PRELOADER - до полного загруза...

FLASH-PRELOADER - до полного загруза...

ilich (ilich@atrus.ru)

Спецвыпуск Xakep, номер #027, стр. 027-038-4

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

Некоторые умные и не очень дядьки, секущие вопрос, делают сей процесс таким путем. Они ручками совершают ряд действий, ведущих к созданию на серваке некоего текстового файла. В этот текстовичок запихиваются все разделы текста, присвоенные каким-либо переменным. Эти чудо-переменные грузятся во время работы флешки и используются по ее усмотрению. Кто скажет, что старый добрый текстовик править не легче, чем откровенно геморроиться с различными операциями с текстом в окне "Actions" во Flash'e, пусть первый надругается над своими руками в особо жесткой форме. Т.к. у такого человека руки растут явно не оттуда, откуда это требуется по мануалу.

Переходим от теории к практике. Допустим, нам во флешку вдруг приспичило грузануть некий набор переменных, весящий где-нибудь кило так сто. И не смейся мне тут! Помни, что сайты разные важны, сайты разные нужны. Где-то много текста и мало дизайна, где-то мало текста и много дизайна... а где-то много текста и много дури. Если ты все еще смеешься, то третий вариант как раз для тебя! В любом случае, сделай-ка эти сто кило переменных (ну или одну текстовую переменную) в "loads.txt", используя правила:

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

2) Присвоение значения каким-либо переменным должны отделяться символом "&".

3) Значение текстовой переменной должно быть в двойных кавычках.

Например, у меня это одна большая текстовая переменная "bred" в таком же интеллектуальном текстовике "bred.txt".

В нашей тренировочной флешке сделай новый клип "C - LoaderText" и тащи в его первый кадр на второй слой кнопочку "B - Starter". В слой для ActionScript (верхний) в первый кадр пиши "stop()", а для кнопки:

on (press) {

loadVariables ("bred.txt");

gotoAndPlay (2);

}

Сие значит, что действо, остановившись сперва на первом кадре, резво двинет ко второму кадру лишь только при нажатии на мегакнопку. Попутно кнопка запустит загрузку переменных из файла "bred.txt" в текущий мувик.

Начиная со второго кадра, надо забацать какую-нибудь бестолковую незамысловатую анимацию, в цикле говорящую о том, что загрузка все еще продолжается. Сделаем ее со второго по девятый кадр. Сейчас не надо строить из себя великого аниматора, сейчас просто надо написать слово "Loading...", плавно меняющее свой цвет с #000000 на #444444 и обратно, а в девятом кадре поставить ссылку на второй ("gotoAndPlay(2)"). В десятом кадре делай большое динамическое (см. панель "Параметры текста") текстовое поле. Дай ему имя "TF1" и расслабься. Осталось чуть-чуть. В скриптах для десятого кадра пиши:


Спецвыпуск Xakep, номер #027, стр. 027-038-5, FLASH-PRELOADER - до полного загруза...

FLASH-PRELOADER - до полного загруза...

ilich (ilich@atrus.ru)

Спецвыпуск Xakep, номер #027, стр. 027-038-5

TF1=bred;

stop ();

Теперь выходи в редактирование основной сцены и аккуратно выноси туда мувик "C - LoaderText". Дави на него правой кнопкой мыши и в меню выбирай пункт "Actions". Пиши:

onClipEvent (load) {

gotoAndStop (10);

}

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

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

Конец по кличке XML

XML... Знающие перцы меня поймут. Они-то знают наверняка, что если твоя пага общается не только с самой собой, а ты настолько крутой флешер, что аж волны на ногтях кругами пошли, то будешь юзать XML во Flash'e до полного посинения. Ну что ж, кое-чем помогу. Как я говорил выше, при отсутствии красоты количество ожидающих обратно пропорционально времени ожидания. Так что на загрузку XML мы тоже налепим старый добрый прелоадер. Принципы его построения я тебе говорить сейчас не буду, ибо уже рассказал на предыдущем примере. Расскажу технические детали.

Создай новый мувик "C - LoaderXML". Дабы не особо нагружать руки в целях создания очередного примера прелоадера, скопируй в него все кадры из "C - LoaderText". Так нам останется изменить всего ничего. Лезь в первый кадр и до операции "stop()" вставляй:

load_xml = new XML ();

load_xml.onLoad = function () {

gotoAndStop (10)

};

Первая строка творит новый объект XML (само собой, если он уже сделан ранее, эту строку в моем скрипте следует убить самой первой) "load_xml". У этого чудо-объекта есть прекрасные фишки, такие как "onLoad" и "loaded". Обе могут быть успешно использованы в прелоадерах для XML. Свойство объекта "loaded" до и во время загрузки равно "false" (т.е. "дело дрянь"), а после того как последний нужный бит прилетел к тебе, изменяется на "true" (т.е. "танцуют все!"), что в процессе слежки за загрузкой бывает весьма полезно :). Мы же используем аппарат "onLoad" - метод, действующий, в принципе, как обработчик событий, работающий лишь в одной ситуации - при окончании загрузки данных. Этот вариант мне нравится гораздо больше потому, что не надо в каком-то там цикле проверять значение какого-то там свойства. Написал функцию один раз - и прога сама все сделает. Ладушки, разобрались. В скриптах для кнопки меняй "loadVariables("bred.txt")" на "load_xml.load ("loads.xml");". Сечешь? Маладес, правильно! Эта хрень начинает грузить нашу XML-ку, которая называется "loads.xml".


Спецвыпуск Xakep, номер #027, стр. 027-038-6, FLASH-PRELOADER - до полного загруза...

FLASH-PRELOADER - до полного загруза...

ilich (ilich@atrus.ru)

Спецвыпуск Xakep, номер #027, стр. 027-038-6

Ну, вот и все. Хотя стоп! В скриптах десятого кадра тебе осталось произвести нужные обращения к переменным из загруженного XML.

P.S.: Как ты, наверное, понимаешь и как я говорил тебе в начале, все это лишь теория. Причем я рассказал тебе далеко не все. Есть еще что почитать и поучить. Скажу лишь напоследок, что, по-моему, писать прелоадеры на различные емкие по времени процессы во Flash'e очень легко. С точки зрения функций скрипта. И в то же время достаточно сложно. С точки зрения привлекательности и смысла дизайна твоего прелоадера. Помни, в чем суть прелоадера. Суть в том, чтобы не дать чувакам убежать с твоей паги во время загрузки самой ядерной части.

И да пребудет с тобой Великий Flash!


Спецвыпуск Xakep, номер #027, стр. 027-042-1, ВЕСЕЛАЯ ТУСОВКА - веб-сервисы для создания современного сайта

ВЕСЕЛАЯ ТУСОВКА - веб-сервисы для создания современного сайта

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-042-1

(alex-sun@mtu.ru)

Что подразумевают под современным сайтом? Стильный дизайн, информативность и интерактивность. Добиться сочетания этих 3-х частей невозможно, клепая каждую страницу сайта отдельно. Для этого нужны прибамбасы, от которых работа сайта автоматизировалась по полной, т.е. нужно писать программы под веб. Любой программер при помощи CGI сделает тысячестраничный сайт, пока ты склепаешь во Front Page одну-две жалких паги. А если потом захочется что-то переделать? Неужели все переделывать? Вот так и гибнут нераскрытые таланты, ибо они еще не знают о современных веб-технологиях.

Выбор сложности доступа

Прежде всего надо определиться, будет ли сайт корпоративным (вход строго по паролю) или быть ему общедоступным. Вдруг там будут фотки пьяных оргий? :) Такими делами лучше не светиться, а то еще и органы на тебя глаз положат. С тем, как сделать вход на сайт фришным, проблем не должно быть никаких, главное не забыть зарегить хороший домен и залить index.(s)htm(l) в html-директорию аккаунта. А если сайт должен быть скрыт от посторонних? Можно либо просто спрятать сайт куда подальше (взять, к примеру, домен 10 уровня - такой случайно хрена-с-два вобьешь :)) или сделать вход на сайт по паролю. При выборе последнего варианта появится возможность вести учет, кто куда и когда лазил (хотя такое можно делать и с помощью cookies, но сейчас их слишком легко можно блокировать). Таким образом можно даже вычислить личные пристрастия каждого участника. Для создания входа на сайт по паролю используется форма аутентификации:

<FORM onSubmit="return false;">

Логин:

<input name="login" size=15>

Пароль:

<input type="password" name="yourpass" size=15>

</FORM>

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

Нужны ли технологии?

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

Ежу понятно, что сидеть и осваивать какие-то новые языки программирования - не самое приятное занятие, особенно в самом начале, когда не поймешь, ошибся ты в тексте исходника или в настройке компилятора. С языками под веб еще немного сложнее. Для них еще сначала надо поставить и настроить программу веб-сервера на своем компе, которую надо сначала выбрать. Намного более половины серваков в сети работают на веб-сервере Apache. Причем есть апач не только под юнихоподобные оси, но и под виндовые платформы. Причем к апачу довольно легко подрубаются различные веб-языки программирования (Perl, PHP3, PHP4), дополнительные модули (криптозащиты - mod_ssl или же apache_ssl, базы данных - SQL, mySQL, Oracle, всякие аутентификационные механизмы).


Спецвыпуск Xakep, номер #027, стр. 027-042-2, ВЕСЕЛАЯ ТУСОВКА - веб-сервисы для создания современного сайта

ВЕСЕЛАЯ ТУСОВКА - веб-сервисы для создания современного сайта

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-042-2

В более половины случаев можно обойтись без использования баз данных. Точнее, их вообще нужно начинать использовать, если материал на сайте достигнет ну очень большого размера или если ты полный извращенец (Ильич, хе-хе :)).

Возможности и желания

При рассмотрении вопроса о выборе инструментов для создания сайта нужно подумать, какая цель преследуется от проекта, на какую аудиторию он рассчитан, ожидаемая посещаемость сайта и ожидаемая прибыль. Для возможности юзать хоть что-то, кроме обычного html'я, нужно найти хостера, дающего такие возможности. Да не просто хостера, а стабильного, шустрого, с большой квотой. Только вот одна проблемка - такие хостинги обычно денежек стоят, причем иногда очень немаленьких. Хотя есть и бесплатные хостинги, которые дают право на использование многих веб-технологий, таких как SSI и CGI (Perl, PHP), но за это хостеры суют рекламу в самый верх страниц. Уродство, конечно, а что делать. А вот фришный виндовый сервак, на котором будут работать ASP, JSP и им подобные, навряд ли ты где на халяву подцепить сможешь.

SSI

SSI (Server Side Include) - небольшая кучка команд для засовывания в html-страницу содержимого из других файлов, результата работы CGI-шного скрипта, переменных окружения и информации о файлах (размер файла, время создания). Можно засунуть в отдельные файлы шапку страницы (header), низ страницы (footer), а также любую часть, которая должна присутствовать на многих страницах сайта (например, меню основных разделов сайта). Это немного облегчит полностью ручную работу по выдержке сайта в какой-то стилистике.

Все возможности SSI - это лишь мизерная часть от возможностей CGI, но есть и свои достоинства. Надо тебе, к примеру, указать размеры файла на странице. Можно, конечно, написать целый скрипт (маленький, конечно, но все же), а можно справиться одной строкой прямо в html-странице.

<!--#fsize file="myphoto.jpg....exe"-->

Аренда сервака, поддерживающего только SSI, обойдется намного дешевле, чем с полноценной поддержкой CGI. Если повезет, может даже получится найти бесплатный безрекламный хостинг. Хотя придется долго искать такой. Использование только SSI будет наиболее оптимальным соотношением цена-качество при создании и ведении небольших и средних по размерам сайтов, таких как фотогалереи, сайты обоев, небольшие собрания статей. Тем более, что осваивать новый язык программирования не понадобится - SSI состоит из небольшого набора команд. Но в таком случае можно забыть про создание поиска по сайту, гостевых книг, форумов и т.д.

CGI

CGI придумали для внесения интерактивности в процесс создания и пользования сайтами. Если в адресной строке ввести путь к CGI-программе (Common Gateway Interface - программа Общего Шлюзового Интерфейса), то результат ее работы будет передан броузеру. CGI-шники запускаются на сервере в момент удаленного обращения к ним. В результате работы CGI-шника юзер получает сообщение о выполнении скрипта почти в любом виде - это может быть и текст, и картинка, и музыка, и все, что твоей душе угодно. Без CGI весь Интернет был бы местом для примитивного перетаскивания файлов с места на место, даже без возможности производить поиск информации.


Спецвыпуск Xakep, номер #027, стр. 027-042-3, ВЕСЕЛАЯ ТУСОВКА - веб-сервисы для создания современного сайта

ВЕСЕЛАЯ ТУСОВКА - веб-сервисы для создания современного сайта

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-042-3

Для написания CGI-шников в основном используются 2 языка - Perl и PHP. Более сложные CGI-шники, для которых важны скорость обработки и надежность, пишутся на C. Оба языка (Perl и PHP) - мультиплатформенные и фриварные, в отличие от мелкософтовского ASP. По результатам опроса, проводившегося на www.hotscripts.com, выяснено, что на ПХП пишет побольше народу (56%), чем на Перле (15.6%). Это и понятно, ведь ПХП будет попроще Перла, да и встраивать пхп-шные скрипты в html-код намного проще. ПХП-шные скрипты даже хранятся не в папке cgi-bin, как перловые скрипты, а в папке с гипертекстовыми документами.

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

Perl или PHP?

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

Perl (Practical Extraction а Report Language - практический язык для извлечения и составления отчетов) был создан Larry Wall'ом в 1986 году для автоматизации обработки текстовой информации. По заявлению создателя, "Perl создан, чтобы сделать решение простых задач простым и решение сложных задач возможным". С появлением инета Perl стали использовать как язык для написания cgi-шников. Поэтому регулярные выражения просто рулят в Перле. Собственно, из-за них Перл и стал "родным" языком программеров под веб. Записываются они между двух слэшей: /regular_expression/, а сделать с их помощью можно ой как много. Одним из простых, но полезных примеров является замена в тексте кусков http://some_url на готовенькие ссылочки:

$string=~s/http:\/\/\S+/<a href=$string>$string<\/a>/g;

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

PHP (Hypertext Preprocessor), появившийся несколько позже Перла (в 1997 году), создан для написания веб-приложений, в отличие от Перла. Уже поэтому о ПХП можно сказать, что он меньше нагружает сервак. Основное его отличие от Перла - это встраивание пхп-шного кода в html-код. Этот код просто отделяется специальными тэгами (<?php ... ?>). На мой взгляд, PHP смог объединить в себе Perl и SSI, но он не настолько хорош в работе с регулярными выражениями.


Спецвыпуск Xakep, номер #027, стр. 027-042-4, ВЕСЕЛАЯ ТУСОВКА - веб-сервисы для создания современного сайта

ВЕСЕЛАЯ ТУСОВКА - веб-сервисы для создания современного сайта

Леха ББ aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-042-4

Если бы Перл, будучи таким могучим, не так сильно жрал ресурсы сервера, то цены бы ему не было (хотя ему и так нет цены - он фриварный!). И Перл, и ПХП распространяются бесплатно не только в виде откомпиленных программ, но и в открытом коде. Почти все серваки, поддерживающие Perl, поддерживают PHP и SSI.

Базы данных для твоего сайта

Если тебе когда-нибудь надо будет делать форум или сайт Интернет-магазина, то очень может быть, что придется тебе пописать скрипты для обработки сообщений или прайс-листов фирмы, чтобы можно было устраивать по ним поиск, делать разные запросы и т.д. На это уйдет не один день. Но такой рутинной работы можно будет и избежать, если вовремя вспомнить о том, что базы данных используются и под веб. Если хостер не сделал доступ к системам управления базами данных (СУБД), то попинай его немного, чтобы такой доступ появился. Иногда может понадобится немного раскошелиться для этого :(. Из наиболее часто используемых БиДэ можно выделить Oracle, MySQL, mSQL. Для обращения к СУБД юзается SQL - структурированный язык запросов. Расположение данных на серваке, их хранение и обработка - не должны волновать обратившегося к ним. Это схоже с тем, что броузер понятия не имеет ни о SSI, ни о CGI - он просто выдает ответ на запрос. Скрипт обращается к базе данных через функции библиотек, которые служат для передачи запросов к серверу СУБД.

Каждая СУБД отличается от другой своими требованиями и возможностями. Oracle - самая мощная СУБД, которая может выдержать, наверное, любой запрос. Не каждый хостер потянет такую СУБД - для нее рекомендуется отводить отдельный комп. Ставят ее только очень серьезные хостеры с очень мощными машинками. Это полностью профессиональная СУБД, новички с такой не начинают. Из-за своих необъятных размеров Oracle не часто встречается на веб-серверах. А вот MySQL намного менее требовательная БД, что и послужило ее распространению в сети. Мускля достаточно будет для выполнения большинства задач, которые свалятся на твою голову.

Подводя итоги

В рамках данной статьи рассматривались только вопросы выбора сервисов, используемых для создания реальных веб-проектов. К таким не относятся CSS, которому посвящена отдельная статья, и Java Script, который кроме как геморроем веб-разработчиков назвать трудно из-за частичной несовместимости с разными броузерами. Другое дело CGI, который класть хотел на твой броузер и операционку. Сервиса никогда не бывает мало! Если уж решил заняться реальными веб-делами, то, во избежание дальнейших проблем, требуй как можно большего. Главное, не забудь проверить, насколько быстрые каналы у хостера, ибо если трафик будет идти медленно, то никакие сервисы не помогут привлечь к твоему сайту посетителей.


Спецвыпуск Xakep, номер #027, стр. 027-046-1, ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

Спецвыпуск Xakep, номер #027, стр. 027-046-1

Pingvinov (mailto:$echo cvativabi@znvy.eh|rot13)

..::R0m@n AKA D0ceNT::.. (romanakadocent@yandex.ru)

Дарова, старик... Хочешь замутить стильный сайт для своей тусы? Сегодня, сейчас, немедленно? Ломает писать хтмл и кодить? Нет проблем - подними на своем сайте один из бесплатных форумов, и твоя туса может тусить почти сразу :). Напрягает стандартный прикид форума, который ты уже видел на трех десятках сайтов? Вообще нет проблем - залезь на сайт с модами и выбери для твоего форума свежий стильный скин. Или тебя уже прикалывает твоя форумная туса, но к ней не хватает автоматического встроенного напоминателя? Все просто - залезь на форум поддержки своего форума, отыщи у вольных кодеров подходящий хак и установи его. Ты будешь смеяться, но именно так делаются многие хорошие сайты.

ФОРУМЫ НА PHP

Найти разные команды, которые кодят форумные проекты на php, очень легко. Ты ведь продвинутый, ты понимаешь, что когда сотня команд пишет одно и то же, то имеет смысл повыбирать среди результатов... Так что ищи Яндексом или Гуглом что-нибудь типа "php веб форум бесплатный" или на ангельском "php web forum free". На свете, разумеется, существуют и "not free", на случай, если тебе не терпится расстаться со своими кровными, но за деньги, имхо, стоит покупать всего один форум и о нем чуть позже.

ЧАЛКИН, МАЛКИН, ПАЛКИН...

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

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

А ПО-РУССКИ?

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

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


Спецвыпуск Xakep, номер #027, стр. 027-046-2, ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

Спецвыпуск Xakep, номер #027, стр. 027-046-2

ПРИМЕР ТЕОРЕТИЧЕСКИЙ: PHPBB

Это один из самых популярных бесплатных форумов на php, пишет его большая команда, в основном из Германии. Официальный сайт http://www.phpbb.com, и на нем, вполне традиционно, есть файловая зона и зона поддержки. Мне этот форум очень нравится, и на его примере я немного расскажу тебе про установку и настройку. Первые два теста он выдерживает легко: на сайте phpbb есть официальный пакет русификации и огромный форум поддержки. Именно огромный: на нем зарегено больше 40 000 ников и, как правило, тусуется не меньше полсотни челов одновременно. При этом у phpbb есть и крупный недостаток: мне пока не удалось найти в рунете заметной тусы, посвященной поддержке phpbb на русском.

СТАВИМ

Чуть не забыл: перед тем как ставить форум (любой) на php, убедись, что твой провайдер позволяет тебе заводить на сервере базы данных в каком-нибудь из популярных форматов: mySQL, postgreSQL, MS SQL. Дело в том, что форумы на php хранят всю свою инфу в базе данных, а не в виде файлов, как многие скрипты на Perl. До установки форума создай базу и заведи в ней локального пользователя, имеющего полный доступ к базе.

Когда ты распакуешь .tar.gz с форумом, обратись через браузер к файлу install.php (он лежит в основном каталоге) и заполни все необходимые поля, в том числе платформу баз данных (выбери из списка) и имя и пароль пользователя базы, которую ты создал для форума. Заполнив все, дави на "Start Install", скрипт сам заведет в базе все необходимые таблицы и создаст config.php. Когда форум заработает, отстрели все установочные файлы типа install, upgrade и так далее, если не хочешь, чтобы тебя регулярно дефейсили.

АДМИНИМ

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

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


Спецвыпуск Xakep, номер #027, стр. 027-046-3, ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

Спецвыпуск Xakep, номер #027, стр. 027-046-3

ДОБАВЛЯЕМ

Некоторые настройки phpbb, старик, не делаются мышью с админской панели :). Например, установка дополнительного языка или прикида для форума. Для такой настройки надо распаковать правильные файлы в правильные места на сервере и (для форумного прикида) дать команду "Установить прикид" из админской панели.

Вообще, разных украшалок на phpbb есть великое множество, несколько перцев даже организовали сайт http://www.phpbbhacks.com для сбора всей шняги в одном месте. Несмотря на грозное название, на сайте выложены не только хаки кода форума, но и пакеты стильного оформления, по ним можно полазить и выбрать себе подходящий.

БАГА

Мелких багов в phpbb хватает, есть и такие, которые сама команда за баги не считает и собирается исправить "когда-нибудь". Один из самых вредных - это переполнение таблицы сессий, что может случиться меньше чем за сутки, если твой сайт - хорошо посещаемый. Форум при переполнении отвечает белым экраном c текстом "phpBB: Critical Error creating new session" и не позволяет ни читать форум, ни писать в него. Экстренное решение в таком случае - очистить таблицу вручную. Постоянное решение - использовать хак, разработанный Ashe. Это дополнительный код, который регулярно проверяет и чистит эту таблицу. Посмотреть на код хака можно вот в этой статье на форуме поддержки http://www.phpbb.com/phpBB/viewtopic.php?p=229157.

А ЭТО, ВООБЩЕ-ТО, В РУНЕТЕ ЮЗАЮТ?

Не сомневайся, в рунете phpbb юзают и еще как! Смотри сюда: http://www.sufism.ru/forum, http://www.piercing.ru/phpBB/. Очень трогательно выглядит phpbb на http://www.gets.ru - с форума начисто срублена надпись о том, что это phpbb, и в библиотеке веб-скриптов на сайте про phpbb нет ни слова. Присмотрись к phpbb и походи по рунету, перец, ты его много где увидишь. Наши умельцы, правда, очень любят спилить с любого софта все намеки на настоящих авторов и написать, типа, все права принадлежат Васе, но ты ведь внимателен и скептичен, и давно научился различать, кто такой этот Вася.

ТО ЖЕ, НО ЗА ДЕНЬГИ

Не думаю, что тебе захочется кому-то платить за софт для форума, ведь халявных скриптов вокруг море. Но все же немного про vBulletin сказать надо обязательно. По мнению многих уважаемых в рунете людей, это лучший из форумов на php, а, может быть, и просто лучший среди форумов. На нем работают тусы на таких известных сайтах, как http://www.exler.ru и http://www.webscript.ru. К сожалению, для него нет официального русского пакета, каждый переводит как придется, и на некоторых сайтах с vBulletin серферы видели, например, такие перлы: "Вы можете not создавать новые сообщения". Но если без стеба, то стоит помнить, что возможности по настройке vBulletin в два или три раза превосходят любой другой форум и сайты поддержки и хаков для этого форума огромны. Так что если у тебя вдруг образовались две-три сотни пользователей, то подумать про vBulletin за полторы сотни енотов - можно и нужно.

ПРИМЕР ПРАКТИЧЕСКИЙ: YABB

Наверно, ты слышал и о YaBB - довольно известном свободно распространяемом движке для форума. Это, в общем, одна из разновидностей движков BB, но сделанная на Perl, а не php. Какой из них выбрать, решать, конечно, тебе. А я пока что расскажу о том, где ты можешь найти этот замечательный движок, а также всяческие примочки и апгрейды к нему, что он собой представляет и как его установить и админить.


Спецвыпуск Xakep, номер #027, стр. 027-046-4, ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

Спецвыпуск Xakep, номер #027, стр. 027-046-4

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

КАЧАЕМ И СТАВИМ

Скачать последнюю версию YaBB можно, например, тут: http://support.hpb.ru/apportal/index.php (в разделе "Файловый архив", примерно 900 кил). Там же найдешь и разнообразные примочки. Я скачал версию YaBB XXL A.4.2.1. и буду объяснять все на ее примере. Но принцип работы с YaBB для любой версии и модификации примерно одинаковый. Если что-то не так, прочитай инструкцию, которая обычно прикладывается к архиву.

Прежде чем устанавливать его на свой сайт, убедись, что твой хостер поддерживает Perl, а также узнай, где там каталог для CGI-скриптов (как правило, cgi-bin). Но я буду считать, что ты эти все тонкости уже выяснил и можешь закачивать форум на сервер.

Сам форум представляет собой набор скриптов (pl), html-файлов и графических элементов, уже оптимальным образом рассортированных по каталогам с прописанными путями, также к нему прикладываются инструкции. Ты это увидишь, когда распакуешь скачанный архив. Все, что надо закинуть в cgi-bin-директорию, находится, соответственно, в архиве в cgi-bin, но о том, что и куда закачивать, мы поговорим позднее. Первое, что необходимо сделать, это отредактировать пути к интерпретатору Perl (вспомни сам или уточни у админа сервера). Обычно и по умолчанию это каталог #!/usr/bin/perl (на Unix-серверах). Ищем и открываем блокнотом файлы YaBB.pl, Reminder.pl и PrintPage.pl. В самом их начале есть строчка-путь к Perl. Правим ее в соответствии с путем к Perl на сервере. Я тестировал это на домашнем компьютере с установленным на нее сервером Apache и Perl под Windows XP. Поэтому у меня этот путь выглядел так: #!d:/Perl/bin/Perl.exe (да, если сервер работает на Win NT/2000/XP, то там желательно указать все в подобном виде и с расширением).

Теперь пришло время для установки настроек. Собственно, все можно настроить с админской страницы форума. Но то, что нам надо сделать сейчас, - это по любому придется делать сразу, иначе форум не заработает, а следовательно, и до админской страницы тебе не добраться. Итак, ищем файл Settings.pl, он должен быть в корне форума, там же, где и основной файл YaBB.pl. Но в некоторых версиях, как, например, это было в моей, он назывался - path.pl. В нем ищем и настраиваем следующее строки (обычно в качестве параметра уже прописан какой-нибудь пример - тебе его надо только изменить):


Спецвыпуск Xakep, номер #027, стр. 027-046-5, ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

Спецвыпуск Xakep, номер #027, стр. 027-046-5

$mbname - название твоего форума.

$boardurl - URL к директории с исполнительными файлами (там, где находится файл YaBB.pl).

$cookieusername - имя файла cookie, содержащего регистрационное имя участника (не требует изменения).

$cookiepassword - имя файла cookie, содержащего пароль участника (не требует изменения).

$mailprog - расположение программы sendmail на сервере (проконсультируйся с админом, где у него это на сервере).

$webmaster_email - мыло администратора форума (адрес обязательно должен содержать перед собакой обратный слэш "webmaster\@mysite.ru").

$boarddir - путь к директории с исполнительными файлами (можно оставить в виде '.', что означает текущую директорию).

$datadir - путь к директории Messages (оставь без изменений или проконсультируйся с админом).

$memberdir - путь к директории Members (то же самое, что и выше).

$boardsdir - путь к директории Boards (то же самое).

$sourcedir - путь к директории Sourses (эх, устал повторять).

$vardir - путь к директории Vareables (аналогично).

$facesurl - URL к директории avatars (без заключающего '/').

$facesdir - путь к директории avatars (без этого не сможет отображаться страница профиля участника).

$imagesdir - URL к директории YaBBImages (без заключающего '/').

$helpfile - URL к директории YaBBHelp с расположенным в ней файлом index.html (например: http://www.mysite.ru/yabbhelp/index.html).

Собственно, это основное. Некоторые строчки могут отсутствовать, также могут быть строчки, не описанные в этой статье (смотря какая версия). Что-то может следовать не в том порядке. Но по любому, все что найдешь, сделай так, как я написал, иначе что-нибудь может не работать или работать неправильно. Вообще же, вся эта инфа взята из официального хелпа к YaBB. Но если уж тебе посчастливилось скачать версию без хелпа, что маловероятно, то вот я тебе все и написал. Если же хелп есть, то советую все равно в него заглянуть, так как я мог что-нибудь упустить.

Чуть не забыл напомнить тебе: посмотри где-нибудь в том же файле, как правило внизу, есть такие строки:

$servertype - устанавливается в 0, если сервак работает по Unix, и в 1, если под Windows.

$use_flock - устанавливается в 0, если запрещается просмотр файлов, и в 1, если разрешается.

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

Остался заключительный штрих перед тем как запустить твой форум в тестовом режиме. Рассортируем все по каталогам и, наконец, закачаем форум. На сервере в каталоге cgi-bin создай папку yabb, хотя можешь назвать ее, как сочтешь нужным, но для примера я буду объяснять именно так. Теперь в этот каталог копируй основные файлы, такие как yabb.pl, settings.pl (path.pl). И папки boards, messages, variables, members, sources и все остальные, короче говоря, примерно так же, как они все лежат в твоем скаченном архиве (скорее всего, в архиве все уже было разложено нужным образом). При этом сверься с путями, которые ты прописал в settings.pl (path.pl). Теперь в папку, где лежат страницы твоего сайта (html-файлы), надо скопировать папки yabbimages и yabbhelp с твоего жесткого диска вместе со всем их содержимым на сервер. Там же должны находиться папки images и avatars. Запомни, не в cgi-bin, а там, где находятся твои странички и файл index.html. В общем, не забудь указать правильно пути к ним в settings.pl (path.pl). В корне того каталога, там же, где и index.html, должны быть ubbc.js и fader.js, а также все другие js-файлы. Собственно, в скачанном архиве, наверно, уже так же все было распределено, останется только залить это на сервер. В крайнем случае почитай хелп. Если сервак работает под Unix, то надо также выставить для каждого файла права доступа. Рассказывать об этом тут я не стану, так как подробно про это должно быть написано в хелпе, приложенном к форуму.


Спецвыпуск Xakep, номер #027, стр. 027-046-6, ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

ВЕБ-ТУСОВКА НА ХАЛЯВУ - выбираем и ставим на твой сайт бесплатный форум

Спецвыпуск Xakep, номер #027, стр. 027-046-6

EINS, ZWEI, DREI, ВЗЛЕТАЕМ!

После загрузки всех файлов и установки прав доступа, если это было нужно, можно проверить работоспособность форума, набрав адрес типа: http://www.mysite.com/cgi-bin/yabb/YaBB.pl. Если все правильно настроено, то должно сразу заработать. Если не заработало, почитай все внимательно еще раз, проверь, так ли все настроено, и обязательно загляни в хелп (настоятельно рекомендую сделать это еще на этапе настройки параллельно с этой статьей, у каждой версии свои особенности).

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

Осталось напоследок упомянуть еще вот что. Дизайн форума ты можешь менять, редактируя соответствующие html-файлы. Если ты хорошо шаришь в Perl, то тебе не составит труда вообще перекроить весь форум по-своему. Также можно перерисовать графические элементы, такие как кнопочки, стрелочки и прочие фишки. Кроме этого всего, в сети можно найти множество готовых модов. Вот, собственно, и все самое основное, что можно сказать по форуму YaBB. Все остальное ты сможешь почерпнуть в хелпе, в конфах и FAQ, коих в сети очень много. Также много инфы есть и на том сайте, ссылку на который я тебе дал в самом начале. Удачного администрирования!


Спецвыпуск Xakep, номер #027, стр. 027-050-1, Flash-навигатор

Flash-навигатор

ilich

Спецвыпуск Xakep, номер #027, стр. 027-050-1

(ilich@atrus.ru; http://ilich.fly.to)

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

От простого к... меню

В сильно-сильно упрощенном виде любой сайтец представляет собой набор соответствующим образом представленной информации и средств ее потребления. Как правило, эта самая инфа разбита на некоторые разделы по тематике, временному и другим факторам. Само собой, пользователь хочет иметь быстрый доступ к любому разделу. И дизайнер (а вернее сказать, не только он один...) ему в этом помогает, пичкая паги множеством пимпочек. Эти пимпы при нажатии хватают инетчика за... мышку и тащат его к какой-то инфе. Это есть гуд, ибо удобно и полезно. А полезно это тем, что когда эти ссылочки красиво выглядят и красиво стоят на странице, пользователь брызгает ферментами от счастья :). Ряд кнопок, выстроенных в каком-то определенном порядке, принято именовать термином "меню". Во Flash'e сие реализуется так.

Как известно, технология Flash появилась на свет, дабы облегчить бремя современного дизайнера, запихнув и текст, и графу в один файл, и чтобы значительно сократить размер этого файла. Значительность эта достигается несколькими путями, как то: векторная графика, символы, отношение к тексту не как к графе и прочее... Для начала воспользуемся такой фишкой, как символы. В случае, когда пункты меню, т.е. кнопки, выглядят одинаково (за исключением текста на них), зачем платить больше?.. Я хотел сказать, зачем делать для каждой ссылки отдельный символ? Ведь это обходится элементарно за счет запихивания кнопки с динамическим текстовым полем в мувик. Т.е. тебе достаточно просто заглянуть в панель "Параметры текста" и, ментально не напрягаясь, подвигать руками, как я говорю :). Ряд этих кнопок выносится на сцену. Посредством ActionScript каждому такому клипу дается название, ну то есть подпись на кнопку и собственно ссылка. Можно было бы вообще извратиться по полной программе и изначально оставить лишь один пункт меню, а потом его дублировать старым добрым "duplicateMovieClip" с последующим присвоением названий, но, так устроен наш мир, размер флешки от этого хоть и незначительно, но увеличится :(. Проверял неоднократно.

Чтобы этот край темы стал совсем ясен, приведу пример. Во Flash'е рисуем прямоугольник, поверх него текстовое поле. В Параметрах текста ставим "Dynamic Text" и имя переменной "t". Важно также не забыть убрать возможность выделения текста, иначе выглядеть будет не очень приятно.

Выделяем все и конвертируем для начала в кнопку. Даем этой кнопке наряд:

on (press) {

getURL(myurl)

}

А потом эту кнопку - еще и в клип. Клип выносим на сцену N раз и, не забывая делать глоточки холодненького пивка, даем всем копиям имена (пусть это будут "c1", "c2"..."cn"). В первом кадре сцены пишем:


Спецвыпуск Xakep, номер #027, стр. 027-050-2, Flash-навигатор

Flash-навигатор

ilich

Спецвыпуск Xakep, номер #027, стр. 027-050-2

c1.t="О моей заднице";

//задаем название кнопки

c1.myurl="http://ilich.fly.to";

//задаем url

c2.t="О задницах моих преподов";

c2.myurl="http://www.mesi.ru";

c3.t="О задницах моих сослуживцев";

c3.myurl="http://www.winfo.org";

// ну и так далее до N

stop();

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

С конструкцией меню разобрались. Перейдем к функциям. Логично, что ссылки с кнопок ведут не только на другие сайты, но и на разделы данного. Допустим, у тебя есть туча текста про себя любимого, разбитого на темы. Замутим-ка мы переход в таком меню от темы к теме.

От темы к теме

Для реализации просмотра текста прежде всего нужно текстовое поле. Да не простое, а динамическое и опять же без возможности выделения текста. Сделай это поле на отдельном слое под кнопками и дай ему (полю) банальное имя "text". Теперь надо выделить на каждый раздел по столько кадров, сколько нужно для анимации перехода к разделу (если ее нет, то дочитай до конца и сделай :)), начиная с третьего. Растягивай кадр с "text" на все эти кадры. Кадр с нашими пунктами меню перетащи на отдельный самый высокий слой и растягивай на тот же объем, что и "text". Сделано это для того, чтобы меню было доступно и во время просмотра очередного раздела, и при этом нам не приходилось бы заново тащить из библиотеки символы кнопок - и этих хватит. Это ж мувики, а значит, мы можем ими манипулировать из ActionScript абсолютно без спазмов. Теперь слушай сюда. Нам надо изменить скриптец для кнопки пункта меню:

on (press) {

_root.text="";

if (_root.f==false) {

_root.loadVariables("texts.txt");

_root.f=true;

//грузим тексты

};

for (i=1;i<=N;i++) {

_root["c"+i]._x=0-_root["c"+i]._width-10;

//выносим мувики

}

_root.gotoAndPlay(myurl)

//идем на дело

}

Хе-хе. Ща все объясню.

Основная миссия пимпы в том, чтобы безболезненно перейти к разделу. Для этого вначале проводится некоторая подготовка. Сам переход выражен в последней строчке, где мы смело идем к кадру "myurl". Это номер кадра, где начинается полет к разделу, т.е. анимация. Для каждого клипа пункта меню этот номер должен быть задан в первом кадре основной сцены точно так же, как мы задавали там урлы.

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


Спецвыпуск Xakep, номер #027, стр. 027-050-3, Flash-навигатор

Flash-навигатор

ilich

Спецвыпуск Xakep, номер #027, стр. 027-050-3

Самое главное - тексты. В конечном кадре конкретной анимации должно стоять присваивание текстовому полю значения, соответствующего данному разделу. Т.е. переменной "text" присваивается собственно текст, содержащийся в данном разделе. Замечу, лишь только присваивается. А будет ли реально сам текст там набран - загадка. Фишка в том, что текст текстом, а килобайты он, гад, жрет только в путь! Что, естественно, ни тебе, ни твоему потенциальному посетителю на фиг не нужно. Поэтому мы чтиво сразу грузить не будем, а замутим его закачку лишь только при обращении, т.е. при клике по какой-нибудь кнопке раздела, что, собственно, и делается перед переходом к анимации посредством штучки "_root.loadVariables("texts.txt")". Причем загруз будем вести на основную сцену, т.е. в мувик "root", для легкости обращения. Для примера пусть переменные с текстами разделов имеют имена "text1", "text2"...

Кстати, об анимации. Как только я начал говорить про отдельную закачку текста, ты, наверняка, как продвинутый флешер, сразу все просек. И угадал! Прелоадер здесь нужен не меньше, чем на закачке основной флехи. Только здесь есть некоторые подводные камни. Например, то, что текстовик должен грузиться один раз. Это мы отслеживаем флажком "_root.f". Или то, что во избежание ошибок лучше было бы все кнопки на время анимации отрубить или хотя бы скрыть, например, утащив за экран. Скрытие кнопок происходит в цикле "for". Там горизонтальным координатам всех мувиков кнопок задается такое значение, что они оказываются далеко влево от края флешки.

У себя на сайте я вообще все сделал через ж...

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

Я не говорю, конечно, что надо кастрировать свою флешку всеми известными способами и со всех сторон, но неплохо было бы некоторым Flash-дизайнерам :) взглянуть на свои детища со стороны пользователя. Там, наверняка, много чего можно урезать...

Взад - вперед

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


Спецвыпуск Xakep, номер #027, стр. 027-050-4, Flash-навигатор

Flash-навигатор

ilich

Спецвыпуск Xakep, номер #027, стр. 027-050-4

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

Забацаем прокрутку так. На каждый раздел, где она должна быть, делается не один, как мы договаривались, а три конечных кадра. Сразу после анимации перехода или прелоадера действие переходит к первому конечному кадру, в котором текстовым полям присваиваются нужные значения. Там же, в этом самом кадре, стоит проверить, может быть у тебя текста достаточно мало и автокастрации не будет. Посмотри, на сколько символов рассчитан твой "text", отними от этого числа по символов пять на каждую строку текстового поля (на случай переноса слов) и смело сравнивай с длиной текста. Если текст меньше, не задумываясь, тащи кнопки прокрутки (предварительно вполне разумно засунутые в мувики по примеру пунктов меню) за край сцены. И в этом же кадре необходимо задать начальное значение для переменной, указывающей шаг прокрутки:

per=0;

//шаг

if (text1<=(7*(43-5))) {

_root.button_up._x=0-_root.button_up._width-10;

_root.button_down._x=0-_root.button_down._width-10;

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

}

_root.text=text1

//присваиваем текст

Второму конечному кадру дай имя "text1f2". В нем должна быть конструкция, осуществляющая собственно прокрутку:

_root.text.scroll=Number(_root.text.scroll)+per;

А в третьем - gotoAndPlay("text1f2"), и все. Последние два кадра, очевидно, работают в цикле, постоянно прокручивая текст. Но так как шаг равен нулю, мы этого пока не видим. И хорошо.

Кнопки прокрутки. Их должно быть как минимум две. Та, что прокручивает вверх, должна быть в мувике "button_up", та, что вниз - в "button_down". Как расположить их на экране, я полагаю, ты догадываешься. Для верхней пиши:

on (release, releaseOutside) {

_root.per = 0;

}

on (press) {

if (Number(_root.text.scroll)>1) {

_root.per = -1;

}

}

Для нижней:

on (release,releaseOutside) {

_root.per=0

}

on (press) {

if (Number(_root.text.scroll)<Number(_root.text.maxscroll)) {

_root.per=1

}

}

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

Теперь напряги память и вспомни, что еще нам надо было прокручивать. Правильно, мувик. Сделай два новых слоя над слоем с текстовым полем. И соверши над ними следующее надругательство: верхний из них надо сделать маскирующим для нижнего (залезь в свойства верхнего слоя, там все увидишь). Маскирующий слой должен содержать простой прямоугольник ровно над нашим основным текстовым полем. Получится такой эффект, будто мувик прокручивается в текстовом поле точно так же, как обычный текст других разделов. В нижний тащи мувик, подлежащий прокрутке, располагай его так, чтобы его верхний край совпадал с верхним краем основного текстового поля, и давай ему имя "mov_text2" (типа того раздел второй). В ситуации с мувиком скрипты меняются лишь только в первом и втором конечных кадрах анимации. В первом оставляем присвоение переменной "per" начального значения 0, проверку на высоту мувика и присвоение переменной "mov_y" значения начальной вертикальной координаты мувика:


Спецвыпуск Xakep, номер #027, стр. 027-050-5, Flash-навигатор

Flash-навигатор

ilich

Спецвыпуск Xakep, номер #027, стр. 027-050-5

per=0;

if (_root.mov_text2._height<=420) {

_root.button_up._x=0-_root.button_up._width-10;

_root.button_down._x=0-_root.button_down._width-10;

}

mov_y=_root.mov_text2._y;

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

if ((_root.mov_text2._y<=mov_y)and(_root.mov_text2._y>=(mov_y+_root.mov_text2._height-420))) {

_root.mov_text2._y=_root.mov_text2._y-(per*10);

if (_root.mov_text2._y<( mov_y+_root.mov_text2._height-420)) {

_root.mov_text2._y= mov_y+_root.mov_text2._height-420;

};

if (_root.mov_text2._y>mov_y) {

_root.mov_text2._y=mov_y;

};

}

Короче говоря, мувик мечется между своим изначальным положением (в маску видна его верхняя часть) и положением, когда он сдвинут вверх (видна его нижняя часть). Иногда клип нагло пытается вылезти за установленные для него пределы. В таких случаях он карается насильственной установкой в крайнюю верхнюю или нижнюю точку.

Мышиный навигатор

Экстремальное извращение - отсутствие кнопок :). А ведь это реально возможно и, что немаловажно, удобно, честное слово :). Суть метода в том, что экран виртуально (хотя можно это и графически показать) делится на зоны. Когда курсор попадает в какую-то определенную зону, происходит переход в нужный раздел сайта. Кнопки, в принципе-то, можно использовать и здесь. Только использоваться они будут не стандартно. Преимущественно юзаются тогда такие события кнопок, как "rollOver" и "rollOut", т.е. мышка НАД и НЕ НАД. Но, когда я сам этим занимался, я, как всегда, сделал все через... непросто, короче :). Я у некоторого мувика, который постоянно присутствовал во всех кадрах на сцене, на событие "mouseMove" поставил проверочку, которая, в зависимости от координат мыши, запускала тот или иной ролик, прокручивала тот же самый текст или посылала к какому-то другому разделу. Важно лишь отследить момент перехода в зону. Посмотри пример:

onClipEvent (mouseMove) {

x=_root._xmouse;

y=_root._ymouse;

if (x>=_root._width/2) {

if (f==1) {

f=0;

mov2.removeMovieClip();

_root.attachMovie("C - MovieClip1", mov1, 1);

_root.mov1._x=_root._width/2;

_root.mov1._y=0;

_root.mov1.play();

}

} else {

if (f==0) {

f=1;

mov1.removeMovieClip();

_root.attachMovie("C - MovieClip2", mov2 2);

_root.mov2._x=0;

_root.mov2_y=0;

_root.mov2play();

}

}

}

Все очень легко.

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


Спецвыпуск Xakep, номер #027, стр. 027-050-6, Flash-навигатор

Flash-навигатор

ilich

Спецвыпуск Xakep, номер #027, стр. 027-050-6

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

И да пребудет с тобой Великий Flash!


Спецвыпуск Xakep, номер #027, стр. 027-054-1, ЭКСПЛОРЕР ВМЕСТО ФОТОШОПА: визуальные фильтры в HTML 4.0

ЭКСПЛОРЕР ВМЕСТО ФОТОШОПА: визуальные фильтры в HTML 4.0

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-054-1

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

Визуальные фильтры появились в HTML 4.0, чтобы мутить всякие красивые фишки для оформления странички. Основным их недостатком является только то, что бродилки ниже 4 версии их не поддерживают, к тому же по "странному стечению обстоятельств" :) большинство фильтров нормально поддерживаются только IE 4.x и выше. Я расскажу тебе про 13 наиболее интересных на мой взгляд фильтров.

ПОШКОДИМ

Прежде всего давай настучим небольшой код тестовой паги. Основной синтаксис применения фильтров: STYLE="filter:имя_фильтра(параметр1, параметр2...)"

Для каждого фильтра собственные параметры. Для примеров будем юзать стандартные события onMouseOver (мышь въехала) и onMouseOut (мышь отъехала). При подведении указателя мыши к объекту сработает фильтр, а при удалении все вернется взад.

<HEAD>

<STYLE TYPE="text/css">

<!--

.Filter {filter : [Фильтр] }

.NoFilter {filter : #804040}<!-- Это не описано ни в одном справочнике по CSS, но как факт вызов: filter : #rrggbb - работает, что очень сильно облегчает написание динамичных страничек!!! -->

-->

</STYLE>

</HEAD>

<BODY>

<A HREF="onMouseOver='divFilter.className='Filter'" onMouseOut=" divFilter.className='NoFilter'">

<DIV ID="divFilter">

Здесь добавляем объект, над которым будет издеваться наш садо-мазо фильтр :).

</DIV>

</A>

</BODY>

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

ФИЛЬТРЫ В НАТУРЕ

Фильтр Alpha

Фильтр Alpha устанавливает уровень прозрачности.

Синтаксис:

filter:Alpha(Opacity=0-100, FinishOpacity=0-100, Style=0|1|2|3, StartX=pixels, StartY=pixels, FinishX=pixels, FinishY=pixels)

где:

Style (0 - Uniform; 1 - Linear; 2 - Radial; 3 - Rectangular;) - регулирует стиль градиента;

Opacity - начальный уровень прозрачности в процентах;

FinishOpacity - конечный уровень прозрачности в процентах;

StartX - начальная координата по Х для градиента Linear;

StartY - начальная координата по Y для градиента Linear;

FinishX - конечная координата по Х для градиента Linear;

FinishY - конечная координата по Y для градиента Linear;

Пример:

filter:alpha(opacity=20, finishopacity=100, style=1, startx=0, starty=0, finishx=140, finishy=270)

Фильтр Blur

Фильтр Blur смазывает изображение. Имеет множество полезных применений. Например, при помощи него можно размазывать пункты меню.

Синтаксис:

filter:Blur(Add=true|false, Direction=0|45|90|135|180|225|270|315, Strength=pixels)

где:

Add - принимает значение true или false;

Direction - устанавливает направление смазывания (0 - вверх; 45 - вверх и вправо; 90 - вправо; 135 - вниз и вправо; 180 - вниз; 225 - вниз и влево; 270 - влево; 315 - вверх и влево);

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


Спецвыпуск Xakep, номер #027, стр. 027-054-2, ЭКСПЛОРЕР ВМЕСТО ФОТОШОПА: визуальные фильтры в HTML 4.0

ЭКСПЛОРЕР ВМЕСТО ФОТОШОПА: визуальные фильтры в HTML 4.0

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-054-2

Пример:

filter:blur(add=true, direction=90, strength=6);

Фильтр Сhroma

Фильтр Chroma делает заданный цвет прозрачным. Незаменим во многих ситуациях, в особенности, когда у тебя на странице есть чужая картинка, которая лажает весь дизигн, например, счетчик посещений. И даже, в принципе, все в нем ОК за исключением мерзкой зеленой обводки. Натравив на него этот фильтр, ты можешь сделать любой отвратный цвет прозрачным. Более того, фильтр можно применять даже к картинкам типа .jpg, что иногда бывает очень кстати.

Синтаксис:

filter:Chroma(Color=color)

где:

Color - любой именованный цвет или заданный как #RRGGBB

Пример:

filter: chroma(color="#C8A1A1")

Фильтр Dropshadow

Фильтр Drop Shadow создает эффект подвешенности в воздухе. Можно намутить великолепные эффекты и при этом не извращать саму картинку.

Синтаксис:

filter:DropShadow(Color=color, OffX=pixels, OffY=pixels, Positive=true|false)

где:

Color - цвет тени, любой именованный цвет или заданный как #RRGGBB;

OffX - смещение тени по Х;

OffY - смещение тени по Y;

Positive - принимает значение true или false;

Пример:

filter:dropshadow(color=#ff0000, offx=5, offy=5, positive=true);

Фильтры Flip Horizontal и Flip Vertical

Фильтр Flip Horizontal зеркально отражает объект по горизонтали, Flip Vertical - по вертикали.

Синтаксис:

filter:FlipH() для Flip Horizontal

filter:FlipV() для Flip Vertical

Фильтр Glow

Фильтр Glow создает эффект свечения.

Синтаксис:

filter:Glow(Color=color, Strength=1-255)

где:

Color - цвет свечения, любой именованный цвет или заданный как #RRGGBB;

Strength - интенсивность свечения.

Пример:

filter:glow(color=#ff0000, strength=5);

Фильтр Gray

Фильтр Gray Scale представляет изображение черно-белым. Незаменимый фильтр, если тебе вдруг взбрело в голову сделать версию для печати на своей паге. Еще этот фильтр иногда полезен для приведения атцтойных счетчиков в соответствие с твоим дизайном :).

Синтаксис:

filter:Gray()

Фильтр Invert

Фильтр Invert инвертирует цвета и значения яркости, что делает объекты похожими на негатив.

Синтаксис:

filter:Invert()

Фильтр Light

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

Синтаксис:

filter:light()

Пример:

Чтобы заставить фильтр Light, нормально работать, нужно заюзать один из следующих методов:

AddAmbient(R,G,B,strength) - добавляет "окружающий" источник света к изображению. Этот вид света является не направленным и освещает все изображение.

Синтаксис:

object.filters.light.addAmbient(R,G,B,strength)

где R, G и B - значения от 0 до 255, определяющие цвет света, и strength - значение, определяющее количество света, то есть его силу.

Пример:

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

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

function (){

divFilter.filters.light.addAmbient(255,200,50,100)

}

</SCRIPT>

<form>

<input type="Button" value="Дать Свет" onclick="addAmbient()">


Спецвыпуск Xakep, номер #027, стр. 027-054-3, ЭКСПЛОРЕР ВМЕСТО ФОТОШОПА: визуальные фильтры в HTML 4.0

ЭКСПЛОРЕР ВМЕСТО ФОТОШОПА: визуальные фильтры в HTML 4.0

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-054-3

</form>

AddCone(x1,y1,z1,x2,y2,R,G,B,strength,spread) - добавляет "конусообразный" источник света к изображению. Этот вид света является направленным и освещает только определенный участок изображения.

Синтаксис:

object.filters.light. (x1,y1,z1,x2,y2,R,G,B,strength,spread)

где x1, y1,z1 устанавливают положение источника света, x2 и y2 устанавливают координаты, которых достигает свет, R, G и B - значения от 0 до 255, определяющие цвет света, strength - сила источника света, и spread - угол распространения (от 0 до 90 градусов).

Пример:

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

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

function addCone(){

divFilter.filters.light.addCone(1,1,1,150,100,50,100,50,100,25)

}

</SCRIPT>

<form>

<input type="Button" value="Применить" onclick="addCone()">

</form>

AddPoint(x,y,z,R,G,B,strength) - добавляет "точечный" источник света к изображению.

Синтаксис:

object.filters.light.addPoint(x,y,z,R,G,B,strength)

где x, y и z (чем больше z, тем больше диаметр точки) устанавливают координаты источника света, R, G и B - значения от 0 до 255, определяющие цвет света, strength - сила источника света.

Пример:

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

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

function (){

divFilter.filters.light.addPoint(90,60,50,200,250,100,200)

}

</SCRIPT>

<form>

<input type="Button" value="Применить" onclick="addPoint()">

</form>

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

Фильтр Mask

Фильтр Mask создает прозрачную маску.

Синтаксис:

filter:Mask(Color=color)

где Color - любой именованный цвет или заданный как #RRGGBB.

Пример:

FILTER: Mask (Color="#00FF00")

Фильтр Shadow

Фильтр Shadow создает тень.

Синтаксис:

filter:Shadow(Color=color, Direction=0|45|90|135|180|225|270|315)

где:

Color - любой именованный цвет или заданный как #RRGGBB;

Direction - устанавливает направление тени (0 - вверх, 45 - вверх и вправо, 90 - вправо, 135 - вниз и вправо, 180 - вниз, 225 - вниз и влево, 270 - влево, 315 - вверх и влево).

Пример:

filter:shadow(color=#ff0000, direction=180);

Фильтр Wave

Фильтр Wave создает вертикальные искривления (гонит волну).

Синтаксис:

filter:Wave(Add=true|false, Freq=number, LightStrength=0-100, Phase=0-100, Strength=0-255)

где:

Add - принимает значения true или false;

Freq - частота искривлений;

LightStrength - интенсивность света;

Phase - точка начала искривлений;

Strength - сила искривлений.

Пример:

filter:wave(add=true, freq=1, lightstrength=3, phase=0, strength=5)

Фильтр Xray

Фильтр Xray изменяет оттенки, насыщенность и яркость цветов.

Синтаксис:

filter:Xray()

Все, быстро забивай на Фотопопу и юзай фильтры во имя оптимизации сетевого траффика!


Спецвыпуск Xakep, номер #027, стр. 027-056-1, ВСЯ ПРАВДА ОБ ASP

ВСЯ ПРАВДА ОБ ASP

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-056-1

Йоу, мэн, ты решил научиться программировать под web :)! Решил, но не знаешь, за что хвататься. Ты часто слышишь об ASP, слышишь много хорошего и много плохого. Работодатели требуют знания ASP, а ты не знаешь, ни что это за зверь, нужно тебе оно или нет, а главное, с чего начать. Сейчас я познакомлю тебя с технологией ASP и столкну ее с конкурентами лбами.

CGI VS СЦЕНАРНЫЕ ЯЗЫКИ

Начнем от пращуров. Самым первым решением для генерации динамических web-страниц были CGI-приложения. CGI-приложение - это программа (обычно написанная на Perl или C/С++), которая запускается по запросу клиента и формирует содержание web-страницы. Преимущества метода заключаются в скорости выполнения приложения (особенно если оно написано на C/С++ и откомпилировано) и прекрасной расширяемости системы (добавлять в систему новые функциональные возможности легко и приятно). Написал скрипт, скопировал в нужный каталог, выставил permission-ы, и все заработало, даже web-сервер перегружать не надо. Ограничения на расширяемость системы накладывают только используемые языки программирования. Чтобы понять недостатки CGI, надо посмотреть, что происходит при исполнении CGI-приложения. По запросу клиента CGI-прога загружается, выполняет определенные действия (например, генерирует html-код), а после завершения работы удаляется из памяти. Если 100 клиентов одновременно обратятся к одному и тому же CGI-приложению, то в памяти будет создано 100 копий одного и того же приложения. А создание и удаление процесса в операционной системе очень ресурсоемкая операция. В этом основной недостаток генерации страниЦек через CGI'шки. В общем, тормоза и жор ресурсов. Так что оптимальным использованием CGI-приложения будет чат с web-интерфейсом: приложение загружается один раз для каждого пользователя, а выгружается только после выхода пользователя из чата. Однако с учетом гигабайт свободно лежащего в Интернете кода, CGI-приложения до сих пор остаются очень популярны. А универсальность кода, написанного на Perl'е для разных ОС, позволяет кодить приложения для UNIX-серверов дома виндовой тачке.

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

Начнем с PHP, но не потому, что он был первым, а потому, что на сегодняшний день это самый распространенный язык сценариев. PHP (первоначальная аббревиатура Personal Home Page Tools) лишен недостатков CGI-приложений. И хотя первая версия была разработана Расмусом Лендорфом в 1994 году, PHP начал рулить с 1997 года. Именно тогда группа разработчиков во главе с Зивом Шураски и Энди Гутмансом закончила работу над новым синтаксическим анализатором, легшим в основу PHP 3. У PHP есть два огромных плюса по сравнению со своими конкурентами. И оба эти плюса не имеют никакого отношения к производительности, масштабируемости и расширяемости системы:


Спецвыпуск Xakep, номер #027, стр. 027-056-2, ВСЯ ПРАВДА ОБ ASP

ВСЯ ПРАВДА ОБ ASP

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-056-2

1) PHP совершенно бесплатен (камень в огород MS);

2) как язык программирования PHP существенно проще конкурентов. Чтобы начать кодить на нем, нужно быть знакомым только с общим синтаксисом, который сам по себе предельно прост.

Не вдаваясь подробно в архитектуру PHP, расскажу про его недостатки:

1) Нулевая расширяемость системы. Добавить реализацию новых функций можно только, переписав и перекомпилировав сам анализатор. Правда, встроенных функций PHP тебе может хватить на всю жизнь.

2) Низкая масштабируемость системы. Именно это определяет тормознутость систем на PHP в условиях высокой загрузки. Хотя одиночные скрипты на PHP могут пахать быстрее их аналогов, например, на ASP.

3) Используемая обычно связка PHP+MySQL лишена возможности осуществлять, например, транзакции. Это, конечно, недостаток MySQL, но кто же будет использовать бесплатный PHP с MSSQL (платным) или, например, с Oracle (очень дорогим)?

Microsoft, почекав все недостатки CGI'шек, намутила свою архитектуру - ISAPI (Internet Server Application Programming Interface). Вместо исполняемых файлов в ISAPI используются DLL-библиотеки. В ISAPI существуют два вида DLL-библиотек: ISAPI-расширения и ISAPI-фильтры. Так, например, поддержка PHP в Internet Information Server (рис. 1) реализована с помощью ISAPI-фильтра. В ISAPI пофиксили траблы CGI-приложений: ISAPI-расширения и ISAPI-фильтры загружаются вместе с загрузкой сервера и, как правило, выполняются в процессе сервера. И поддержка ASP в Internet Information Server реализована тоже с помощью ISAPI-расширения. За нее отвечает asp.dll, которая лежит в C:\WINNT\System32\inetsrv\ (рис. 2).

ЧТО ТАКОЕ ASP И С ЧЕМ ЕГО ЕДЯТ

ASP (Active Server Page) язык сценариев, придуманный Microsoft. Поддерживаются 2 языка написания сценариев VBScript (Visual Basic Scripting Edition) и Jscript. Реальное распространение получил только VBScript. И все скрипты, которые ты можешь найти в сети, написаны на VBScript. Как отличить asp-код в файле? Очень просто: все блоки кода начинаются с <% и заканчиваются %>. Есть еще один экзотический способ: блок кода начинается с <script language="VBScript(JScript)" RunAt="Server"> и заканчивается </script>. Но я встречал только первый вариант. Файлы, содержащие исполняемый код, имеют расширение .asp. Кроме кода на VBScript, эти файлы могут содержать обычный html-код и SSI-инструкции. Важно помнить, что SSI-инструкции исполняются раньше asp-кода.

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


Спецвыпуск Xakep, номер #027, стр. 027-056-3, ВСЯ ПРАВДА ОБ ASP

ВСЯ ПРАВДА ОБ ASP

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-056-3

Какие преимущества есть у технологии ASP по сравнению с другими языками сценариев?

1) Полная интеграция с web-сервером и операционной системой. ASP есть только для Internet Information Server под Windows. Все разработки сторонних производителей имеют сильно урезанную функциональность (например, ASP ChiliSoft по функциональности аналогична ASP 2.0 от MS, а IIS 5.0 в комплекте W2K поддерживает ASP 3.0).

2) Поддержка технологии COM (Component Object Model) - вот они, подключаемые внешние файлы. Дает возможность неограниченно расширять функциональность системы. При наличии физического интерфейса ты даже сможешь написать программу для включения любимой кофеварки через Интернет. В сети большое количество и платных, и бесплатных компонентов.

3) Интеграция ASP с технологией ADO (ActiveX Data Object). Доступ к данным осуществляется через OLEDB и возможен для любой базы данных, для которой есть ODBC драйвер. Эта фишка позволяет, при необходимости, поменять источник данных (например, вместо файла MS Access использовать MS SQL Server), изменив в коде только одну (!) строчку, которая описывает источник данных. А теперь подумай, сколько кода тебе пришлось бы переколбасить, переписывая форум на PHP. Бережное отношение MS к соединениям с базами данных (которые являются самым узким местом в web-приложениях) позволяет системам, основанным на ASP, иметь неплохую масштабируемость.

Вот сколько плюсов: хорошая расширяемость, неплохая масштабируемость, в целом приличная скорость. А есть ли недостатки? Конечно, есть!

1) Большая часть недостатков ASP - недостатки VBScript. Здесь и низкая скорость выполнения команд (язык-то интерпретируемый), и отсутствие типов переменных, и отсутствие нормальной поддержки ООП.

2) Исполняемый код и html-код находятся в одном файле, а это достаточно неудобно. Чтобы избежать смешения кода нужно строить сложную систему инклудов.

3) Для того чтобы научиться писать программы на ASP, тебе надо не только знать VBScript, но и быть знакомым с принципами объектно-ориентированного программирования. Трудно считать это недостатком, но писать ASP-проги надо по правилам.

И все равно, несмотря на недостатки, ASP остается одним из столпов Интернета. Реально у этой технологии сейчас нет конкурентов. Все больше и больше крупных корпоративных сайтов для решения серьезных задач используют ASP. А на горизонте уже видна ASP.NET. Так что пора приобщаться, будешь ли ты строить web за баблос или ломать его.


Спецвыпуск Xakep, номер #027, стр. 027-058-1, ВСТРОЕННЫЕ ОБЪЕКТЫ ASP

ВСТРОЕННЫЕ ОБЪЕКТЫ ASP

pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-058-1

Я полагаю, что ты знаком с синтаксисом VBScript, знаешь, чем отличаются конструкции Do-Loop и While-Wend, и оператор ElseIf не ставит тебя в тупик. Ты пробовал писать asp-скрипты и знаешь, что программный блок должен быть заключен в теги <% и %>. Но у тебя нет опыта объектно-ориентированного программирования (ООП) и часто в скриптах лезут ошибки, смысл которых ты не можешь понять. Мы поможем тебе, старик :).

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

Внутренние объекты ASP не надо инициализировать, поэтому не всегда понятно, откуда они берутся. Эти объекты инициализируются при запуске сервера и живут своей жизнью до следующей перезагрузки. Они в любой момент готовы для использования на любой странице.

Внутренних объектов ASP всего 7 штук:

объект Response - выполняет пересылку информации клиенту,

объект Request - обрабатывает информацию, поступающую с запросом от клиента,

объект Server - обеспечивает взаимодействие с сервером,

объект Application - кэширует информацию о приложении,

объект Session - кэширует информацию о пользователе,

объект ObjectContext - используется для запуска транзакций и управления их выполнением,

объект ASPError - обеспечивает информацию об ошибках, возникающих в процессе обработки asp-сценария.

ОБЪЕКТ RESPONSE

Этот объект один из самых важных. Он позволяет из скрипта получить полный контроль над содержимым файла, пересылаемого клиенту. Не только к тому, что лежит между тегами <body> и </body>, но и к заголовку файла. Теперь обо всем по порядку.

Метод Response.Write позволяет выводить строку в любом месте документа. Например:

<% Response.Write "ASP - это круто!!!" %>

выведет в браузере строку "ASP - это круто!!!". Кстати, код:

<% str = "ASP - это круто!!!"

Response.Write str %>

выведет то же самое :).

Это самый распространенный метод. Несколько советов:

1) В циклах не надо накапливать результат выполнения операций (типа result = result & "еще какая-то строка"), надо сразу выводить результат методом Response.Write. Накопление конкретно отжирает память.

2) Для вывода кавычек используй двойные кавычки, например:

Response.Write "<table width=""100%"">". При этом в файл будет выведено <table width="100%">.

3) Используй вместе с Response.Write строковые константы (например, vbNewLine) и функию Chr(). Это позволит тебе создавать методом Response.Write читаемый html-код. В противном случае весь html-код, выведенный этим методом, будут размещен в одну строку.

Второй по важности метод - Response.Redirect. Команда <% Response.Redirect "http://www.microsoft.com" %> отправит тебя непосредственно в гости к дяде Биллу. При использовании команды, так же как и при модификации заголовка файла, следи, чтобы в начале страницы стояла команда <% Response.Buffer = true %>. Buffer является свойством объекта Response и определяет, будет ли кэшироваться файл до отправки его клиенту.


Спецвыпуск Xakep, номер #027, стр. 027-058-2, ВСТРОЕННЫЕ ОБЪЕКТЫ ASP

ВСТРОЕННЫЕ ОБЪЕКТЫ ASP

pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-058-2

Response.End - еще один замечательный метод. Полностью прекращает выполнение сценария. Response.Clear - очищает буфер на сервере (если, конечно, буферизация установлена). А его зеркальная противоположность Response.Flush отправляет все содержимое буфера клиенту.

Метод Response.AddHeader добавляет заголовок в страницу. Пример: команда

<% Response.AddHeader "Refresh" "5" %>

установит период обновления страницы в 5 секунд.

Метод Response.AppendToLog позволяет записать строку в лог сервера. И, наконец, метод Response.BinaryWrite позволяет передавать клиенту нетекстовые файлы.

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

<% Response.Cookies("mycookie")("type1") = "summer" %>

или

<% Response.Cookies("mycookie") = "summer" %>.

В первом случае используется ключ type1, и значение cookie, равное "summer", будет установлено для этого ключа.

Теперь о свойствах объекта Response.

Response.CacheControl - может быть или Public, или Private. Дает инфу для прокси-сервера о необходимости кэширования файлов.

Response.CharSet - позволяет добавлять имя кодовой таблицы символов в HTML заголовок.

Response.ContentType - позволяет указывать тип содержимого HTML-файла, по умолчанию text/html.

Response.Expires - указывает промежуток времени в минутах, пока страница HTML, закешированная браузером, считается не утратившей силу.

Response.ExpiresAbsolute - указывает время и дату, после которого страница HTML, закешированная браузером, считается утратившей силу.

Response.Status - позволяет указывать строку состояния, возвращаемую сервером. Значения статуса определены в спецификации HTTP.

ОБЪЕКТ REQUEST

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

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

Request.Cookies - позволяет получать значения cookies, переданных в запросе HTTP. Тебе всего лишь нужно помнить имя cookie и ключ.

Request.Form - позволяет получать значения из формы элементов, посланных HTTP запросом при использовании метода POST. Синтаксис интересен:

Request.Form( элемент ) [ ( индекс ) | .Count ].

Например, конструкция


Спецвыпуск Xakep, номер #027, стр. 027-058-3, ВСТРОЕННЫЕ ОБЪЕКТЫ ASP

ВСТРОЕННЫЕ ОБЪЕКТЫ ASP

pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-058-3

<% for i=1 to Request.Form("myForm").Count

Response.Write(Request.Form("myForm ") (i) & "<br>")

next %>

позволит тебе вывести все поля формы myForm. Поскольку Request.Form - это коллекция, при организации циклов можно использовать конструкции for each.

Request.QueryString - тоже коллекция. Открывает доступ к параметрам, переданным с помощью метода GET или просто в строке запроса (это то, что идет после знака вопрос в адресе http://www1.e-shop.ru/actions/item.asp?code_cat=COF12753). В нашем случае

<% Response.Write(Request.QueryString("code_cat")) %>

выдаст COF12753.

Свойство у объекта Request только одно - TotalBytes. Request.TotalBytes выдаст тебе полное количество байт, полученных от клиента в результате запроса.

ОБЪЕКТ SESSION

Ты можешь использовать данный объект для хранения информации о пользовательских сессиях. Переменные, хранящиеся в объекте Session, не уничтожаются, когда пользователь осуществляет переходы между страницами в приложении, а хранятся на протяжении существования данной сессии. Веб-сервер автоматически создает объект Session, когда страница приложения востребуется пользователем, который до сих пор не имел сессии (когда он первый раз зашел на страницу). Сервер разрушает объект Session, когда время существования сессии истекает (обычно 20 минут, устанавливается с помощью свойства Session.TimeOut) или же сессия разрушается принудительно (с помощью метода Session.Abandon). Установить значение в переменной сессии легко:

<% Sesion("se_myvar") = "mycontent" %>.

Так же легко переменной присвоить значение из сессии:

<% myvar = Sesion("se_myvar") %>.

Совет: чтобы не путаться, называй переменные в сессии с каким-нибудь префиксом.

С помощью коллекции Session.Contents можно легко получить доступ ко всем элементам сессии:

<% for each sessitem in Session.Contents

Response.Write(sessitem & " : " & Session.Contents(sessitem) & "<br>")

next %>.

ОБЪЕКТ APPLICATION

Ты можешь использовать данный метод для того, чтобы сделать доступной информацию между всеми пользователями данного приложения (приложение - это все .asp-файлы в виртуальной директории и всех ее поддиректориях). Из-за того, что объект Application может быть доступен более чем одному пользователю, то в нем предусмотрено два метода - Lock и Unlock (заблокировать и разблокировать) для того, чтобы быть уверенным, что сразу несколько пользователей не смогут попытаться изменять свойства одновременно. Запись информации в Application может быть сделана так:

<% Application.Lock

Application("VisitsCount") = Application("VisitsCount") + 1

Application.Unlock %>

А в остальном объект Application очень похож на объект Sesion (у него, например, есть коллекция Application.Contents).

На практике не часто приходится применять объект Application. При не очень большой загрузке сервера его, например, можно использовать для кэширования результатов запросов к базе данных (особенно если база данных медленная - типа mdb) или простенького счетчика посещений.

ОБЪЕКТ SERVER

Очень нужный объект. Именно он дает возможность функционального расширения IIS как web-сервера. И самый важный его метод - Server.CreateObject. Код


Спецвыпуск Xakep, номер #027, стр. 027-058-4, ВСТРОЕННЫЕ ОБЪЕКТЫ ASP

ВСТРОЕННЫЕ ОБЪЕКТЫ ASP

pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-058-4

<% Set MyAd = Server.CreateObject("MSWC.AdRotator") %>

инициализирует (создает экземпляр) на сервере компонента MSWC.AdRotator, который может быть использован для создания баннерной сети. Экземпляр объекта будет уничтожен после выполнения скрипта. Чтобы этого не произошло, экземпляр можно кэшировать в Application. Правила хорошего тона (а также правила снижения нагрузки на сервер) требуют, чтобы после окончания использования объект был уничтожен:

<% Set MyAd = nothing %>.

Еще несколько методов:

Server.HTMLEncode - установить HTML-кодировку указанной строке.

Server.URLEncode - методы кодирования URL, включая escape-последовательности, к заданной строке (два обратных метода).

Server.MapPath - позволяет вывести полный физический путь для виртуальной директории. Например, такой скрипт:

<% = Server.Mappath(Request.ServerVariables("SCRIPT_NAME "))%>

выведет тебе физический путь к текущему файлу.

И единственное свойство Server.ScriptTimeout дает тебе возможность устанавливать максимальное время, прежде чем выполнение скрипта должно будет прерваться (по умолчанию 90 секунд). Поэтому перед длинным скриптом ставь значение ScriptTimeout побольше, а после возвращай значение по умолчанию.

Ну, вот и все. На прощание последний совет:

Пусть первым оператором у тебя всегда будет <% option explicit %>. Его использование не даст тебе возможности использовать переменные без объявления (и тем самым не даст утонуть в океане стульев), а заодно сохранит кучу свободной памяти серверу.


Спецвыпуск Xakep, номер #027, стр. 027-060-1, НЕ ДАЮТ СКРИПТЫ? ИСПОЛЬЗУЙ ЯВУ!

НЕ ДАЮТ СКРИПТЫ? ИСПОЛЬЗУЙ ЯВУ!

Андрей Каролик

Спецвыпуск Xakep, номер #027, стр. 027-060-1

(andrusha@sl.ru)

БЕГУЩИЕ НОВОСТИ (JAVA-APPLET)

Нужны новости, чтобы оживить свою пагу, рассказать об изменениях на ней, подсказать новичку, куда и как пройти? Встает вопрос, а как их сделать. Расспросы знакомых инетоманов сводятся к тому, что треба знание cgi-скриптинга. А что делать, если ты совершенно не втыкаешь в cgi-скриптинг (или просто не хочешь втыкать) или хостинг, на котором живет твоя пага, cgi-скрипты не поддерживает? Есть альтернативное решение - сделать (читай использовать уже сделанные) новостные Java-апплеты. В инете их можно надыбать предостаточно, а по функциональным возможностям они на голову выше cgi-скриптов. Минус только один: в браузере чаще всего по дефолту Ява отключена. Поэтому не забудь сообщить своим посетителям, чтобы включили (во многих браузерах предлагается автоматом при загрузке паги с апплетами). Плюсов зато - выше крыши.

Для наглядного примера я выбрал Advanced Newsticker. Прежде всего потому, что новости можно брать из обычного текстового файла, а не только из параметров апплета в html'е, как обычно. Представь, сколько у тебя будет весить хтмл, если там будет много-много новостей. Да и редактировать удобнее текстовой файлик, а не весь хтмл-код. Апплет сделан очень аккуратно и весит всего 15 Кб (вместе с примерами и документацией 35 Кб). Настроек - как у навороченного девайса: любой размер апплета, любой шрифт и цвет текста, любой цвет заднего фона и рамки, любые отступы от краев и ориентация внутри апплета, возможность загрузки текста из файла, постепенно исчезающий или появляющийся текст, эффект печатающегося текста, использование бегущего текста в виде гиперссылок, при наведении на которые мыши можно менять цвет рамки, фона и самого текста, любые временные задержки и скорость бегущего текста. Документация тоже не подкачала: все параметры подробно расписаны и сопровождаются примерами.

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

http://javaboutique.internet.com/AdvNewsticker/

http://javaboutique.internet.com/AcuteScroller/

http://javaboutique.internet.com/AdvTypeW2/

ДИНАМИЧЕСКИ ГЕНЕРИРУЕМОЕ МЕНЮ (JAVA-SCRIPT)

Любая пага имеет разделы. Необходимость навигации встает достаточно остро. С одной стороны, нужно сделать меню как можно компактнее, а с другой стороны, в нем должны присутствовать все разделы и подразделы, чтобы не было проблем с переходом к любому из них. Но сделать меню один раз - это только полдела, а как его менять в дальнейшем? Хорошо, если твоя пага состоит из пяти html'ек и меню меняется раз в десять лет. А если это интересный и большой проект, который состоит из кучи подразделов и постоянно растет? Решить проблему можно с помощью Java-Script. Существует множество подобных скриптов, позволяющих организовать на своей паге меню, которое собирается динамически, используя файлы настроек. Очень рекомендую - HierMenus (www.webreference.com/dhtml/hiermenus). Одно из самых удачных решений, поддерживается целый проект и, самое приятное, постоянно обновляется. Для установки прилагается целая документация в html'ном виде, где разжевано пошагово, что, как и куда прописать для полноценной работы (www.webreference.com/dhtml/hiermenus/instructions/noframes).


Спецвыпуск Xakep, номер #027, стр. 027-060-2, НЕ ДАЮТ СКРИПТЫ? ИСПОЛЬЗУЙ ЯВУ!

НЕ ДАЮТ СКРИПТЫ? ИСПОЛЬЗУЙ ЯВУ!

Андрей Каролик

Спецвыпуск Xakep, номер #027, стр. 027-060-2

Как работает HierMenus? Имеются три файла: hierMenus.js, hierSetups.js и hierArrays.js (имена могут быть и другие). В первом файле (hierMenus.js) находится код Java-скрипта, его не нужно менять вообще. Второй файл (hierSetups.js) - общие настройки, которые задают ширину меню, цвет и шрифт текста, цвет фона и рамки, толщину рамки, вертикальные и горизонтальные отступы, способ активации (при наведении мышкой или только кликом), временные задержки срабатывания и возможность использовать рисованные указатели в пунктах меню (можно вообще не использовать). А с помощью третьего файла (hierArrays.js) идет динамическая сборка твоего меню. В этом файле указываются названия всех разделов и подразделов меню с указанием различных параметров для каждого. Некоторые параметры можно не указывать, тогда действуют установки из hierSetups (по умолчанию). Для отдельных пунктов меню параметры, заданные в hierSetups, можно еще раз переопределить, тем самым сделав их отличными от остальных. Кроме того, в файле hierArrays.js указывается, какие пункты меню - разделы, а какие - подразделы. Какие из них являются гиперссылками, а какие - выпадающими меню с новыми подразделами. Загрузка этих трех файлов прописывается в основном html-коде.

Немаловажно, что скрипт работает под многими версиями браузеров, учитывая их особенности. Есть даже версия для работы с фреймами. В документации описано, как предусмотреть работу паги, если использование Java-Script в настройках браузера отключено. И, конечно же, экспериментируй с установками ;).


Спецвыпуск Xakep, номер #027, стр. 027-062-1, СБОРКА ТОЧКИ - поднимаем веб-тусовку на базе phpBB

СБОРКА ТОЧКИ - поднимаем веб-тусовку на базе phpBB

Pingvinov

Спецвыпуск Xakep, номер #027, стр. 027-062-1

(mailto:$echo cvativabi@znvy.eh|rot13)

Это практическая инструкция по установке и настройке phpBB. Когда ты закончишь настройку, на твоем сайте будет действовать очень хороший веб-форум, и ты будешь его админом. Для работы тебе потребуются: эта статья - 1 штука, веб-хостинг (желательно Apache с поддержкой php и MySQL) - 10 Мб, свежий дистрибутив движка phpBB, русских файлов и русских кнопок к нему - по 1 штуке каждого, голова и руки, растущие из плеч, - 1 комплект. Двигайся последовательно, и тебе будет сопутствовать удача.

ГОТОВИМ БАЗУ

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

Найди на хостинге страницу управления базами, придумай какое-нибудь название (я выбрал forumdb) и создай базу, нажав кнопку "Create..." на веб-форме. Страница будет выглядеть не так, как на моем скриншоте, но суть не меняется. Не теряйся.

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

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

На некоторых хостингах разрешается настраивать доступ юзера к базе. Имхо, имеет смысл не мудрствовать и давать полный доступ (у меня такой доступ дается автоматом). После нажатия "Add User to Db" сервер сгенерил коды на Perl и php, которыми можно пользоваться в скриптах для доступа к базе. Очень удобно.

Обрати внимание: я создавал базу с именем forumdb и юзера по имени bbuser, но на самом деле получились имена с префиксом pupkin_ (настоящий префикс, конечно, был другой :). Дело в том, что сервер сам добавляет префикс (как правило, имя хостинг-аккаунта), чтобы не возникало конфликтов имен с другими аккаунтами на том же сервере.

КАЧАЕМ ФАЙЛЫ

Теперь скачай дистрибутивы со страницы http://www.phpbb.com/downloads.php. Тебе понадобятся: свежая версия движка phpBB, русский перевод и русские кнопки. Смотри скриншоты.

Русских переводов два, из них более новый Russian[TU] разговаривает с тобой на "ты". Его автор Святозаръ написал мне про это так: «Не люблю, когда на "вы" обращаются, поэтому на своем форуме все это переделал на "ты"». Выбирай сам, что тебе больше нравится.

Все файлы есть в двух популярных форматах: .zip и .tar.gz. Для дальнейшего рассказа я взял файлы .tar.gz потому, что распаковывал файлы прямо на сервере, под Linux.

Загружать файлы на хостинг удобнее всего по FTP, например, при помощи CuteFTP или Far Manager. Другой популярный вариант - загрузка через веб (если с FTP напряги). На скрине ты видишь загрузку через веб-форму. С основной страницы хостинга вызывай диспетчера файлов, из него открывай форму для загрузки.

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


Спецвыпуск Xakep, номер #027, стр. 027-062-2, СБОРКА ТОЧКИ - поднимаем веб-тусовку на базе phpBB

СБОРКА ТОЧКИ - поднимаем веб-тусовку на базе phpBB

Pingvinov

Спецвыпуск Xakep, номер #027, стр. 027-062-2

$ tar xvfz phpBB-2.0.3.tar.gz

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

Распакуй движок форума в вершину сайта. Проверь, там должно появиться множество файлов типа .php и несколько каталогов: templates, language, includes и другие. Распакуй файл lang_russian.tar.gz внутри каталога languages (при этом в languages по соседству с lang_english должен появиться lang_russian). Распакуй файл subSilver_russian.tar.gz внутри каталога templates (в templates/subSilver/images/lang_russian должны появиться русские кнопки). Так, с файлами вроде все.

ЗАПУСКАЕМ ФОРУМ

Теперь открой браузером инсталляционную страницу http://www.tvoy_sait.ru/install.php. (Кстати, одна из популярных ошибок при инсталляции - закинуть форум в один каталог, а потом искать его в другом. Но тебе опасность спутать http://www.tvoy_sait.ru/phpBB2 и http://www.tvoy_sait.ru/phpbb2 не грозит, ты ставишь форум в вершину.)

В открывшемся окне инсталляции аккуратно заполни все строчки:

Language - оставь английский. Русский настроим позже.

Database type - выбери свою СУБД (у меня MySQL 3.23.54).

Installation method - поскольку ставишь с нуля, выбирай Install.

Database server hostname - имя сервера с базой данных. У меня база на этом же сервере, так что localhost. У тебя, скорее всего, будет так же.

Your Database name - сюда пиши имя той базы, которую ты завел в начале статьи. Ты ведь прилепил бумажку на монитор, да?

Database Username - сюда впиши юзера, которого ты завел для работы с базой.

Database Password - и пароль этого юзера.

Prefix for tables in database - можно оставить phpbb_, как предлагается по умолчанию. Если базу будут использовать другие скрипты, ты отличишь таблицы форума по этому префиксу.

Admin email address - твое мыло (должно работать!).

Domain name - твой домен.

Server port - номер порта HTTP твоего сервера. Скорее всего, просто 80. Спроси у админов хостинга, если ты не уверен.

Script path - путь к форуму относительно вершины твоего сайта. Ставим форум в вершину сайта, так что здесь просто "/". Если ты решишь сделать форум одним из разделов сайта, поставь здесь путь к нему (например, /forum/).

Administrator username - придумай ник админу форума.

Administrator password - придумай пароль админу форума.

Administrator password [Confirm] - подтверди пароль админа форума, запиши ник и пароль, скоро мы будем логиниться.

Инсталлятор готов к запуску! Дави на Start Install. Инсталлятор заведет в базе все необходимые таблицы, создаст админа и конфигурационный файл. Затем он скорее всего скажет тебе, что переписать config.php на сервере ему не удалось и тебе имеет смысл сделать это самостоятельно. Соглашайся, сгружай себе новый конфиг (смотри скриншот), сразу закидывай его на сервер поверх старого config.php.


Спецвыпуск Xakep, номер #027, стр. 027-062-3, СБОРКА ТОЧКИ - поднимаем веб-тусовку на базе phpBB

СБОРКА ТОЧКИ - поднимаем веб-тусовку на базе phpBB

Pingvinov

Спецвыпуск Xakep, номер #027, стр. 027-062-3

Если ты все делал правильно, то по адресу http://www.tvoy_sait.ru ты увидишь форум с одной мессагой, примерно как на скриншоте. Он работает! Займись безопасностью: через файловый менеджер прибей на сервере файлы install.php upgrade.php и update_to_FINAL.php. Логинься к форуму с помощью ника и пароля, которые ты придумал админу форума при инсталляции.

Теперь перейди по ссылке Profile в личный профиль админа и установи язык интерфейса Russian. Нажми Submit.

Теперь сделай русский основным языком форума. Переходи в административный раздел и через ссылку Configuration вызови настройки форума. Установи язык по умолчанию Russian. Нажми Submit. Вроде все. Дальше сам. Будь здоров :).


Спецвыпуск Xakep, номер #027, стр. 027-066-1, FLASH, И ГОТОВО! Красивое меню-трансформер

FLASH, И ГОТОВО! Красивое меню-трансформер

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-066-1

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

LET'S XML!

Решить все это одним махом можно, используя XML + FLASH. Заодно поглядишь, как поддержка XML реализована во Flash MX.

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

В обычном блокноте пишем тестовый xml и сохраняем под именем flash_menu.xml.

<?xml version="1.0" encoding="windows-1251" ?>

<MENU target="mainFrame">

<FOLDER name="моим фанам">

<FOLDER name="тусовка">

<ITEM name="наливай" url="drink.html"/>

<ITEM name="девчонки" url="girls.html"/>

<ITEM name="вечеринки" url="party.html"/>

<ITEM name="с утра по пиву" url="bier.html"/>

</FOLDER>

<ITEM name="последние фотки" url="photos.html"/>

</FOLDER>

<ITEM name="оторвись" url="fun.html"/>

<FOLDER name="музон">

<ITEM name="продиги" url="prodigy.html"/>

<ITEM name="стрекачи" url="strekachi.html"/>

</FOLDER>

</MENU>

Затем проверяем на правильность открытием в IE.

ПОЛУЧАЕМ XML

Пора открывать flash. Причем MX. Сразу же сохраним файло в той же папке, что и наш XML под именем "xml_menu.fla". Добавляем прототипную функцию для обхода XML дерева:

// (c) Ivan Dembicki, dembicki@narod.ru

XMLNode.prototype.nextNode = function() {

if (this.firstChild != null) {

this.firstChild.attributes.tab = ++_root.nodeDepth;

return this.firstChild;

}

var n = this;

while (n.nextSibling == null) {

if (n.parentNode) {

_root.nodeDepth--;

n = n.parentNode;

} else {

return null;

}

}

n.nextSibling.attributes.tab = _root.nodeDepth;

return n.nextSibling;

};

Следом пишем загрузку xml с проверкой на успешность загрузки и корректность полученного xml.

System.useCodePage = true;

XML.prototype.ignoreWhite = true;

this.input_xml = new XML();

this.input_xml.load("flash_menu.xml");

this.input_xml.onLoad = function(success) {

if (success) {

if (this.status != 0) {

trace("invalid xml");

} else {

// trace("successfull");

this.addAttributes();

_root.menu_mc.createMenu(this);

}

} else {

trace("error opening URL");

}

};

Теперь тестани загрузку (Ctrl+Enter), если в output вывелось сообщение "successfull", то все в порядке, и можно идти дальше. Если что-то не так, trace тебе подскажет, в каком направлении искать ошибку.

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

Если ты читал мою статью про елочку, то уже знаешь, зачем этот ID нужен, если не читал, то открою тайну: в дальнейшем мы собираемся обращаться к узлам xml, используя синтаксис: _root.input_xml[номер узла]. Что касается атрибута tab, то он нам понадобится для установки отступа каждого элемента дерева от левого края ролика. Этот атрибут мы будем добавлять, слегка видоизменив функцию nextNode (которая лежит в библиотеке прототипов на layer51.com), добавив всего три строчки кода (здесь она уже изменена).


Спецвыпуск Xakep, номер #027, стр. 027-066-2, FLASH, И ГОТОВО! Красивое меню-трансформер

FLASH, И ГОТОВО! Красивое меню-трансформер

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-066-2

this.input_xml.addAttributes = function() {

var i = 0;

var nod = this.firstChild;

while (nod) {

nod.attributes.ID = i++;

nod = nod.nextNode();

}

delete _root.nodeDepth;

this.parseXML(this.firstChild);

};

Если тестануть сейчас ролик и забраться в листинг переменных, то можно будет увидеть, что все узлы дерева имеют свой атрибут ID и tab. К примеру, вот так должны выглядеть первые несколько строк:

<MENU ID="0" target="mainFrame">

<FOLDER ID="1" tab="1" name="моим фанам">

<FOLDER ID="2" tab="2" name="тусовка">

<ITEM ID="3" tab="3" name="наливай" url="drink.html" />

Заметь, что самый первый узел не имеет атрибута tab, но имеет атрибут ID, равный нулю. Так надо.

Теперь можно создать функцию генерации меню, но перед этим создадим пустой мувик, в котором это меню будет жить:

_root.createEmptyMovieClip("menu_mc", 0);

и генерим меню:

_root.menu_mc.createMenu = function(menu_xml) {

var mc;

var i = 0;

var nod = menu_xml[i];

while (nod) {

i++;

nod = menu_xml[i];

mc = this.attachMovie(nod.nodeName, "m"+i+"_mc", i);

nod.attributes.mc = mc;

mc.i = i;

}

};

Заметь, что строкой переменной nod.attributes.mc = mc мы в соответствующий узел помещаем ссылку на вновь созданный мувиклип. А строчкой mc.i = i помещаем в мувиклип ID узла xml. То есть связываем каждый мувиклип со своим узлом xml. Благодаря этому в дальнейшем, зная узел xml, мы можем узнать соответствующий ему мувиклип вот так:

mc = node.attributes.mc

И наоборот, зная мувиклип, мы можем с легкостью обратиться к соответствующему узлу xml:

node = _root.input_xml[mc.i]

Сейчас можешь даже не пробовать тестить - attachMovie не будет работать без соответствующих мувиков в библиотеке. Давай их создавать, раз такое дело...

Но тут есть один важный момент: мы аттачим мувик из библиотеки с linkage name, соответствующим имени узла xml (nod.nodeName). То есть в зависимости от имени узла (а у нас их всего два варианта) будет аттачиться мувик "folder" или "item". Поэтому создадим два мувика, один для папки, второй для элемента меню. Они будут практически одинаковыми, отличаться будут только иконка и скриптинг.

Приступим. Создаем мувик (Ctrl+F8) с именем "folder" и таким же linkage name (не забудь поставить галочки export for action script и export in first frame). Аналогично создаем мувик с именем "item". В результате у тебя в библиотеке должны появиться два пустых мувика: folder и item. Вот теперь, если тестануть, то, естественно, на сцене ничего не увидим, но в листинге переменных появится список приаттаченных мувиклипов и значений переменных i в этих мувиках.

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


Спецвыпуск Xakep, номер #027, стр. 027-066-3, FLASH, И ГОТОВО! Красивое меню-трансформер

FLASH, И ГОТОВО! Красивое меню-трансформер

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-066-3

Movie Clip: Target="_level0.menu_mc.m1_mc"

Variable _level0.menu_mc.m1_mc.i = 1

Movie Clip: Target="_level0.menu_mc.m2_mc"

Variable _level0.menu_mc.m2_mc.i = 2

ВИЗУАЛИЗИРУЕМ

Пора бы и визуализировать наши усилия.

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

Создай мувик "folder_icon" и помести в первом его кадре рисунок иконки папки в открытом виде (минус), во втором кадре рисунок иконки папки в закрытом виде (плюс). Рисунки размести так, чтобы их центр находился в координатах x = -5, y = 5. Размер иконки не должен превышать 20 по высоте (у меня 10), и иконка не должна залезать в положительную область по оси x. То же самое с иконками элемента меню: создай мувик "item_icon", в первый кадр кружок, во второй треугольник. Теперь в мувик folder воткни folder_icon, а в мувик item, соответственно, folder_icon, совмести начала координат мувиков. Самое время добавить текстовые поля в оба мувика. Создай в обоих мувиках динамические текстовые поля и задай им имя "name_txt". Можешь даже что-нибудь написать в этих текстовых полях, чтобы подобрать подходящий фонт, и самое время заинклудить этот фонт.

Ура! Мы готовы создать классы для folder и icon. Страшно? Многие, кто не сталкивался с классами, боятся их, как черт ладана. Хотя все значительно проще, чем кажется. И ощутить это лучше всего "руками" - в процессе создания этих самых классов. Для пущей важности пример сделаем чуток сложнее - с наследованием классов. Еще страшнее? Не боись, прорвемся!

КЛАССЫ

Для начала создадим класс, который будет общим как для folder, так и для item. Мы продолжаем писать скрипт прямо в руте:

GeneralClass = function () {

};

g_tmp = GeneralClass.prototype=new MovieClip();

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

Хоть мы и создали GeneralClass, но, за исключением функций и свойств мувиклипа, в нем ничего нет. Давай для начала пропишем событие onLoad - оно должно быть одинаковым для обоих мувиклипов. И для того чтобы увидеть эффект, временно назначим GeneralClass обоим мувиклипам - при этом главное не забыть после теста снести это назначение. Я по ходу статьи скажу, когда нужно снести, и чтобы долго это место не искать, в скрипте я обозначил это комментариями start to delete и end to delete.

g_tmp.onLoad = function() {


Спецвыпуск Xakep, номер #027, стр. 027-066-4, FLASH, И ГОТОВО! Красивое меню-трансформер

FLASH, И ГОТОВО! Красивое меню-трансформер

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-066-4

var nod = _root.input_xml[this.i];

this._y = (this.i-1)*20;

this._x = nod.attributes.tab*20;

this.icon.stop();

this.name_txt.autoSize = true;

this.name_txt.text = nod.attributes.name;

};

// START TO DELETE

Object.registerClass("folder", GeneralClass);

Object.registerClass("item", GeneralClass);

// END TO DELETE

Вот теперь можно тестануть.

НАПОЛНИМ ФУНКЦИОНАЛЬНОСТЬЮ

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

Подсветка при наведении мыши:

g_tmp.onRollOver = function() {

this.name_txt.textColor = 0xFF0000;

};

g_tmp.onRollOut = function() {

this.name_txt.textColor = 0x339999;

};

А теперь для создания раздельной функциональности создадим отдельные классы для folder и item.

FolderClass = function () {

};

ItemClass = function () {

};

Теперь пора сносить регистрацию мувиков на GeneralClass в скрипте (то место, которое мы выделяли). И зарегистрируем мувики каждый на свой класс:

Object.registerClass("folder", FolderClass);

Object.registerClass("item", ItemClass);

Добавим наследование этими классами функциональности из GeneralClass:

f_tmp = FolderClass.prototype=new GeneralClass();

i_tmp = ItemClass.prototype=new GeneralClass();

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

папка:

FolderClass -> GeneralClass -> MovieClip -> Object

элемент:

ItemClass -> GeneralClass -> MovieClip -> Object

Знак "->" здесь можно читать как "помимо своих функций и свойств имеет функции и свойства класса". При этом первые два класса созданы нами, вторые два класса это встроенные классы.

Итак, в результате мы имеем три созданных нами класса. А также ссылки на их прототипы: g_tmp, f_tmp, i_tmp, созданные для упрощения обращения. Прежде чем двинуться дальше, давай разберем маленький пример для понимания свойств наследования:

f_tmp.onRollOver = function() {

this.name_txt.textColor = 0x0000FF;

};

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

1. как только ее найдет;

2. если не нашел в самом верхнем по иерархии родителе.

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


Спецвыпуск Xakep, номер #027, стр. 027-066-5, FLASH, И ГОТОВО! Красивое меню-трансформер

FLASH, И ГОТОВО! Красивое меню-трансформер

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-066-5

Если мне не удалось тебя усыпить разглагольствованиями о классах, то давай снесем подсветку текста папки синим цветом (функцию f_tmp.onRollOver), если тебе она не нравится, и приступим к организации перехода по страницам:

i_tmp.onRelease = function() {

getURL(_root.input_xml[this.i].attributes.url, "mainFrame");

this._parent.released_item.icon.gotoAndStop(1);

this.icon.gotoAndStop(2);

this._parent.released_item = this;

};

Не слишком сложно? Мы взяли url странички из xml, обратившись к атрибуту соответствующего узла xml, а узел нашли по его ID. Затем в ранее кликнутом элементе иконку отправляем на первый кадр (если это первый клик, то никого никуда не отправляем). Иконку текущего мувика отправляем на второй кадр и следующей строкой скрипта сохраним линк на текущий мувик как на кликнутый мувик.

Тестани. Кликни на элемент дерева, но не на папку. Браузер наругается - скажешь "OK", он и откроется. И будет прав, если у тебя нет в той же папке нужного хытымыля.

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

f_tmp.onRelease = function() {

if (this.icon._currentframe-1) {

this.icon.gotoAndStop(1);

this.openFolder();

} else {

this.icon.gotoAndStop(2);

this.closeFolder();

}

};

Можно опять тестануть.

РАЗДВИНЕМ ДЕРЕВО

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

f_tmp.closeFolder = function(folder_only) {

var old_mc, mc;

var i_xml = _root.input_xml;

var i = this.i;

var tab = i_xml[i].attributes.tab;

while (i_xml[++i].attributes.tab>tab) {

mc = i_xml[i].attributes.mc;

mc._visible = mc._y=0;

}

if (folder_only) {

return i;

}

mc = this;

while (i_xml[i].attributes.mc) {

old_mc = mc;

mc = i_xml[i++].attributes.mc;

mc._y = old_mc._y+20;

}

};

f_tmp.openFolder = function() {

var old_mc, mc, nod, atr;

var i_xml = _root.input_xml;

var i = this.i;

mc = this;

while (i_xml[++i].attributes.tab>tab) {

nod = i_xml[i];

atr = nod.attributes;

old_mc = mc;

if (nod.nodeName.toUpperCase() == "FOLDER") {

if (atr.mc.icon._currentframe == 2) {

atr.mc._y = old_mc._y+20;

old_mc = atr.mc;

atr.mc._visible = 1;

i = atr.mc.closeFolder(1);

}

}

mc = i_xml[i].attributes.mc;

mc._visible = 1;

mc._y = old_mc._y+20;

}

var r = i;

while (mc) {

old_mc = mc;

mc = i_xml[++i].attributes.mc;

mc._y = old_mc._y+20;

}

};

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

Во-первых, функции closeFolder и openFolder создаем в прототипе папки. Линк на этот прототип - f_tmp.

ФУНКЦИЯ ЗАКРЫТИЯ ПАПКИ


Спецвыпуск Xakep, номер #027, стр. 027-066-6, FLASH, И ГОТОВО! Красивое меню-трансформер

FLASH, И ГОТОВО! Красивое меню-трансформер

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-066-6

Функция закрытия папки имеет аргумент folder_only, который нужен для предотвращения обсчета дерева за пределами папки. Это нам понадобится, чтобы дважды, трижды и так далее не обсчитывать позиции мувиков, когда этим занимается другая функция.

Первый перебор мувиков (while) скрывает все мувики в папке. Второй перебор - только расставляет последовательно все оставшиеся мувики по оси _y. Если аргумент folder_only равен true, то второй перебор мувиков не выполняется.

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

ФУНКЦИЯ ОТКРЫТИЯ ПАПКИ

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

Функция закрытия папки при вызове с true аргументом возвращает ID первого не обсчитанного узла. Это значение присваивается счетчику, и дальнейший обход начинается с этого узла по прежнему принципу.

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

ОБРАБОТКА НАПИЛЬНИКОМ

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

Но перед этим сделаем еще одно: подготовим к публикации. Поскольку предполагается, что это меню будет в отдельном фрейме и будет занимать его целиком, то есть мы установим его размеры 100% на 100%, то нам необходимо сделать так, чтобы ролик не ресайзился и нулевая точка координат не гуляла, где попало. Используем объект Stage:

Stage.scaleMode = "noScale";

Stage.align = "TL";

Тестани. Менюха переместилась в верхний левый угол благодаря тому, что align установлен Top Left (TL). При изменении размеров размеры объектов не будут изменяться, мы это установили в scaleMode.

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

Stage.onResize = function() {

trace("w="+(Stage.width+4)+" h="+(Stage.height+4));

};

Stage.addListener(Stage);

Теперь, зная высоту и ширину ролика, легко пересчитать координаты скроллера, определить - скрыть скроллер или отобразить, какая часть меню вышла за пределы ролика, рассчитать высоту лифта и так далее.


Спецвыпуск Xakep, номер #027, стр. 027-066-7, FLASH, И ГОТОВО! Красивое меню-трансформер

FLASH, И ГОТОВО! Красивое меню-трансформер

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-066-7

Обрати внимание, что я добавил 4 к значениям ширины и высоты ролика. Дело в том, что почему-то размер ролика всегда определяется на 4 пиксела меньше. В этом легко убедиться, если восстановить окно из полноэкранного режима в обычный (нажать кнопочку рядом с кнопкой закрытия окна). И если ролику установлены размеры, например, 100х200, то Stage.width и Stage.height примут значение 96х196.

Тебе осталось насоздавать свои странички, переделать xml, воткнуть это меню в левый фрейм, а правый фрейм обозвать "mainFrame" во фрейсете.

АНТИКЭШ

Ты обязательно должен учесть то обстоятельство, что у юзверя закэшируется и меню, и запрашиваемый xml. Поэтому, если будешь вносить изменения в меню, рекомендую его просто переименовывать, добавляй, например, номер версии в имя. А чтобы не кэшировался xml, такое решение будет не лучшим. Я бы рекомендовал просто добавить в запрос уникальный параметр. Идеально для этого случая подходит количество миллисекунд, возвращаемое функцией getTime. Замени запрос на получение xml на this.input_xml.load("flash_menu.xml?r="+new Date().getTime());

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

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

function antiCash(address) {

if (_url.substr(0, 4) == "file") {

return address;

}

if (address.indexOf("?") != -1) {

return address+"&r="+new Date().getTime();

} else {

return address+"?r="+new Date().getTime();

}

}

Теперь можно заменить запрос на получение xml на:

this.input_xml.load(_root.antiCash("flash_menu.xml"));

Заметь, если ты захочешь получать xml от серверного скрипта с параметрами, то запрос вида:

this.input_xml.load(_root.antiCash("flash_menu.php?page=main"));

обработается корректно, строка url соберется в такую:

flash_menu.php?page=main&r=237546894375

В процессе написания статьи у моего бета-тестера (мои благодарности, mr.Donor) возник закономерный вопрос: "А как сделать, например, анимацию появления элементов меню?". Я согласен с тем, что для неопытного человека это может вызвать массу затруднений. Давай разбираться. Первым делом изменим функцию onLoad общего класса: расставим мувиклипы слева от экрана, но каждый на своем месте по высоте.

g_tmp.onLoad = function() {

var nod = _root.input_xml[this.i];

this._y = (this.i-1)*20;

// эта строка изменилась

this.x = nod.attributes.tab*20;

// эти 2 строки добавились

this._x = -100;

this.counter = this.i*5;

//

this.icon.stop();

this.name_txt.autoSize = true;

this.name_txt.text = nod.attributes.name;

};

Итак, что мы сделали? мы не стали расставлять мувики сразу по оси _x в нужные места, а только установили им цель: this.x Также задали this.counter - переменная, которая будет определять задержку старта движения мувиклипа. Эта переменная рассчитывается как номер мувика, умноженный на любое число (попробуй поизменять это число и посмотри, что получится).


Спецвыпуск Xakep, номер #027, стр. 027-066-8, FLASH, И ГОТОВО! Красивое меню-трансформер

FLASH, И ГОТОВО! Красивое меню-трансформер

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-066-8

g_tmp.onEnterFrame = function() {

if (this.counter) {

this.counter--

return;

}

this._x += (this.x-this._x)/5;

if (this._x == this.x) {

this.onEnterFrame = null;

delete this.counter;

delete this.x;

}

};

Первая фаза - на onEnterFrame каждый мувик будет ждать свое число кадров, пока его counter не станет равным нулю. Тогда наступит вторая фаза - движение. В каждом кадре элементы будут приближаться на 1/5 расстояния между текущей позицией и целью. Ты сам можешь добавить в этой части эластичное движение. И третья фаза наступит, когда мувик достигнет своей цели. Тут же убиваем лишние переменные и перекрываем видимость функции onEnterFrame в прототипе суперкласса функцией onEnterFrame в каждом конкретном объекте.

Но больше рассказывать не буду. Я не сторонник братьев близнецов в сети. Главное, ты - крут, потому что заюзал xml и намутил супер-энджин для навороченного меню, который можешь эксплуатировать на своем паге-роботе. Оставляю тебе простор для творчества, с чем и откланиваюсь.


Спецвыпуск Xakep, номер #027, стр. 027-072-1, haX0rz4haX0rz

haX0rz4haX0rz

Frozen

Спецвыпуск Xakep, номер #027, стр. 027-072-1

(frozen@real.xakep.ru)

Как всегда, помимо обычного Спец-чтива, мы предлагаем тебе ознакомиться с кучей полезных сайтов по теме. На этот раз тебя ждут талмуды по веб-дизайну, полное руководство по HTML, глобальному сайтостроительству и даже философии. Вот такой микс на сегодня %).

http://www.artlebedev.ru/kovodstvo/

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

Рекомендуется: начинающим строить свою страничку.

http://html.manual.ru/book/html.php

Если ты решил создавать свою страничку не в каком-нибудь FronPage или прочем Дреамвьювере, а в обычном архисложном редакторе - блокноте, то, бесспорно, тебе пригодится этот справочник по тэгам хтмл, ведь их нереальное количество, и практически каждый с кучей параметров, запомнить которые не под силу обычному мозгу (попробуй-ка лучше стать необычным - прим. ред.). А имея под рукой данный линк, тебе не придется больше напрягать свою серую жижицу, легко и непринужденно в любой момент ты получишь полные сведения о нужном тебе тэге. Ну а уж если у тебя проблемы со временем в инете или вообще его нету %), то, в виде бонуса, есть возможность скачать себе на винт копию этого полезнейшего сайта.

Рекомендуется: абсолютно всем веб-относящимся людям.

http://www.wpdfd.com/index.htm

Да, но все-таки мы сегодня строим мегапагу-робот, и, как следствие, нам нужны всякая интерактивность, красивости с информацией. Гордое название Web Page Design for Designers даже оправдывает свое название, радуя глаз информацией о каскадных стилях aka CSS и скрещенном с ними JavaScript'ом, различными приблудами со шрифтами, немного информации по тэгам и прочие фишечки, которые можно прикрутить к своей паге, особо не парясь со всякими сложными технологиями (вроде флэша и другой какой анимации). Присутствует и раздел для только начинающих свой сложный путь в области дизайна, поэтому всем интересно будет сюда заглянуть, только вот каплю дегтя добавит полное отсутствие русского языка на паге, но пусть тебя это не пугает, если ты хоть немного знаком с аглицким - понять основную идею не составит труда.

Рекомендуется, говоря словами авторов сайта: "Дизайн для дизайнеров"...

http://www.lib.ru/koi/WEBMASTER/

Знаменитая на весь рунет либа дяди Мошкова отметилась и здесь, обрадовав наличием информации практически по любому вопросу, который может образоваться у тебя в мозгу :))). Это даже нельзя назвать сборищем книг, скорее один большой фак, или нереальной величины талмуд, объединивший в себе просто-таки монструозное количество текстов и ссылок на близкие к тематике ресурсы. Обнаружить здесь можно доки по темам, начиная от для самых маленьких ("из чего делать хтмл", "язык хтмл") и до серьезных статей вроде "спецификации хтмл", "rfc по хтмл" (и перевод к нему), есть и особо ценная инфа вроде "правила хорошего тона", "о браузерах и багах в них" и прочие вещи, на которые так часто не обращают внимания даже опытные дизайнеры.


Спецвыпуск Xakep, номер #027, стр. 027-072-2, haX0rz4haX0rz

haX0rz4haX0rz

Frozen

Спецвыпуск Xakep, номер #027, стр. 027-072-2

Рекомендуется: от мала до велика, очень многим будет интересно сюда зайти, практически все найдут тут что-то нужное.

http://www.webreference.com/dlab/

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

Рекомендуется: более-менее знакомым с дизайном людям.

http://www.566.org/~masha/psigilogiya_cveta.html

http://www.566.org/~masha/collor.html

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

Рекомендуется: всем для общего ознакомления.

http://hci.psychology.ru/guide.htm

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


Спецвыпуск Xakep, номер #027, стр. 027-072-3, haX0rz4haX0rz

haX0rz4haX0rz

Frozen

Спецвыпуск Xakep, номер #027, стр. 027-072-3

Рекомендуется: всем, начинающим строить свой домик в инете.

http://www.shortway.to/zenweb/

Искусство Дзэн поможет тебе составить реально хороший и красивый во всех отношениях ресурс, уверен автор этого материала. Отличный талмуд, и непременно я советую тебе с ним ознакомиться, восточная философия (которую я очень уважаю, наверное поэтому мне так приглянулась эта книга) как нельзя лучше вписывается в принципы сайтостроительства. Разложено тут все по полочкам - от советов будущему пагодержателю и до философских замечаний и аспектов по всему вебу и инету вообще, must read однозначно.

Рекомендуется: всякому, интересующемуся веб-дизайном и увлеченному восточной философией :).


Спецвыпуск Xakep, номер #027, стр. 027-076-1, ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

Dead.Moroz

Спецвыпуск Xakep, номер #027, стр. 027-076-1

<dead.moroz@xyligan.ru>

Дарова, старик, снова дарова! Как ты помнишь, декабрьский "Спец" за прошлый год вызвал сильное брожение умов в широких массах хацкеров и админов столицы славного королевства Бутаритари. Хацкеры собирались в реале и в чатах, пили пиво и мылили бутаритарскому королю, прося, чтобы он организовал во всех пивных Инет по радио на халяву. Админы собирались в чатах и реале, пили пиво и тоже мылили королю, требуя, чтобы за мел и ноутбук в руках давали пожизненный эцих с гвоздями. Всесильное агентство АПЧХИ по ошибке арестовало наследного принца за знак открытой сети на стене королевского дворца. Принц заявил, что просто собирался написать слово из трех букв и выводил первую. В киоски "Бутаритарпечати" стояли очереди, "Спец" отпускали по два в руки по записи. На четвертый день весь тираж "Спеца" раскупили, и директор "Бутаритарпечати" стала звонить в редакцию и заказывать еще, что-то бормоча про толпы у киосков и здоровье продавщиц.

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

НАШ ТОМАГАВК

В Бутаритари продается огромное количество беспроводной шняги, достаточно залезть на любимый сайт www.price.bu (как известно, Бутаритари недавно получила в свое распоряжение домен BU) и набрать в окошке для поиска 802.11b - это самый популярный стандарт беспроводных локалок, подробнее читай о нем в декабрьском "Спеце" за прошлый год. Все бы хорошо, но даже среди 802.11b для хака подходит далеко не все оборудование. Ну вот, Дронич с Федором уже ездили c D-Link DWL-650 и почти ничего не увидели. Имхо, им просто мощности сигнала не хватило, карточки рассчитаны на работу в пределах 50-100 метров, и не может быть, чтобы они ездили по местам, где не было сетей. Мы выбрали карту с подключаемой внешней антенной за восемьдесят енотов и прикрутили к ней радиобанку Радиатора (читай его статью в этом же номере). Фирменный кабель продавался отдельно и стоил сорок пять енотов, больше половины карточки :(. Согласись, обидно платить за провод длиной полметра такой баблос... Увы, но такого разъема, какой был на карте, я никогда раньше не видел, и уверенности, что его можно достать на Mitinobazaar'е или на улице Ремесленных товариществ в "Буром бутаритарском медведе", никакой не было, поэтому, чуть помаявшись, мы скинулись и на кабель. Со стороны антенны кабель заканчивался стандартным ВЧ разъемом типа N, так что проблем стыковки с радиобанкой вообще не было, Радиатор на нее такой разъем и поставил.

Я стрельнул ноут на выходные у одного банкира (он метал на нем пасьянс по дороге с работы и на работу), пообещав привезти ему банку варенья и корзину печенья. На ноуте уже стоял Win2k со вторым сервиспаком, осталось скачать и поставить искалку для радиосетей Netstumbler (с сайта http://www.stumbler.net), купить соса-солы и чебуреков и двигаться в дорогу. Повозить нас любезно согласился Перец с www.auto.bu, он сам заядлый рыбак и к проекту отнесся с пониманием.


Спецвыпуск Xakep, номер #027, стр. 027-076-2, ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

Dead.Moroz

Спецвыпуск Xakep, номер #027, стр. 027-076-2

ПРЕДВАРИТЕЛЬНЫЙ ВАРВОК

Ну, в общем-то, перед тем, как жечь бензин, стоило проверить систему в сборе и походить пешочком в тех местах, где, по идее, должно будет хорошо клевать. Лазить по улице с ноутом было неудобняк и не клево (сейчас в Бутаритари такая жара, какой в Москве холод), и мы с Хрымзом решили посидеть внутри кафе на площади Нерукотворного памятника, устроиться возле окна и поводить оттуда банкой. Пришли, взяли по "Дыханию красного дракона", присели, достали ноут, прикрутили банку... Нацелились в Нерукотворный памятник. Пусто. Нацелились в Факдоналдс. Аналогично.

Хлебнули "Дыхания..." и закусили головоногими. Карта подмигивала лампочками, некоторые моргания казались очень длинными, мы с надеждой смотрели на окно Stumblera, но там было пусто. Scanning... Нацелились в кинотеатр "Бутаритари". Аналогично. В магазин "Горец-монофизит". Аналогично. Мазафака, что мы делаем не так?

Сетей не было, но зато были две симпатичные девушки, глядевшие на нас во все глаза из-за соседнего столика. На двух бедно одетых мужчин с ноутбуком и пустой консервной банкой на столе. "Извините, здесь посылают на Луну?" - "Здесь посылают на енг, а резидент живет этажом выше". Наконец, одна из них не вытерпела, подошла к нам и сказала, что сейчас умрет от любопытства, если мы не расскажем ей, чем мы занимаемся. "Вы сэмплингом занимаетесь, да?" - сказала она. Наверное, банка в моих руках была похожа на очень хитрый авангардный микрофон. "Не-а, варчокингом", - сказал Хрымз и очаровательно улыбнулся. Мы подарили ей кусочек мела на память. И девушка ушла, умирая и разлагаясь от любопытства на наших глазах, и на ее лице и маленьких тонких ручках проступали красные пятна. Наверное, трупные.

ВАРДРАЙВ

Настроение после пустого варвока, честно говоря, было так себе. И Дронич с Федором уже съездили с почти нулевым результатом, и вот теперь в самом, казалось бы, перспективном месте было пусто. Я выразил Радиатору свои сомнения в качестве конструкции антенны, на что он ответил, не зди, мол, все по науке рассчитано, должон сигнал быть. Я немного успокоился, а в субботу позвонил Перец и сказал - "по коням". Отступать было некуда, Перец заехал, я сел к нему в машину, и мы поехали на вардрайв. Радиобанка мирно лежала на передней панели, ноут тускло светился в донельзя экономном режиме. "Начнем с какого-нибудь навороченного бизнес-центра", предложил Перец и повернул к Парк Плейс.

ПРОСПЕКТ НЕТЛЕННОГО ВОЖДЯ

Красивое здание на углу проспекта Нетленного вождя и улицы Мухлюй-Мухлюя давно обжили представительства разных иностранных фирм. Рассчитывать на то, что кто-то из них догадается купить себе Wi-Fi, было очень даже можно. Мы остановились на проспекте прямо возле объекта, и Перец прицелился банкой в здание. Я почувствовал себя полным идиотом и запустил Stumbler. Он открылся и тут же радостно хрюкнул, сообщив, что нашел две сетки. Это было кул, рулез, gr8... Солнце засветило ярче, на улице стало еще теплее и мир снова стал хорошим и правильным. Мы поздравили друг друга с первым уловом и поехали по Нетленному в центр столицы.


Спецвыпуск Xakep, номер #027, стр. 027-076-3, ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

Dead.Moroz

Спецвыпуск Xakep, номер #027, стр. 027-076-3

Через километр Stumbler нашел еще одну точку, которая выгодно отличалась от предыдущих двух пометкой "WEP" в соответствующей колонке и знаком замочка. Админ этой сети (назовем ее SSID "first") включил встроенное в радиошнягу средство шифрования по имени WEP (Wireless Encryption Protocol). Молодец, админ. Поехали дальше.

Точки стали попадаться гуще, но устойчивого сигнала ни от одной пока не было, поэтому оценить эффективность антенны было довольно трудно. Радиобанка лежала на переднем стекле и смотрела вперед. Наконец, возле "Электроники" в списке появилась точка с SSID "second", и сигнал от нее начал неторопливо расти по мере нашего продвижения в центр и достиг максимума через 1500 метров. Вот это был результат!!! То есть притом, что оборудование Wi-Fi рассчитано на дальность порядка пятьдесят-сто метров, c радиобанкой Stumbler "взял" точку доступа на расстоянии более километра. Правда, неизвестно, какой мощности там стоял передатчик, наверное, очень неслабый, так как мы, похоже, проехали от "second" очень далеко, он нашу карту так и не увидел и коннекта не получилось. Рядом с "second" в списке появились и потухли еще две точки, но мы на них почти не обратили внимания, так нам понравилось качество нашей антенны.

ЕСТЬ КОННЕКТ!

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

Мы проигнорировали несколько мелких точек и свернули на Огородное кольцо в сторону Поганки. Почти сразу появился слабый сигнал от точки "third". Мы поехали вперед, стараясь держать радиобанку по сигналу. Повторилась история с "second": оказалось, что мы увидели "third" примерно с полутора километров. В этот раз все получилось рулезно, мы остановились, когда сигнал стал уверенно зеленым и Stumbler сказал нам "Connect at 11Mbps". Хе-хе. Ну мы, как ты понимаешь, тут же вспомнили, что за взлом сетей в Бутаритари осужденного сажают на черных муравьев и до последней минуты читают ему вслух произведения Виктора Пелевина под музыку Андрея Макаревича. В общем, мы решили не шутить с законом, варчокнули для тебя мелом "third" и поехали дальше.

СИНИЕ ВОРОТА

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

Проехали под Поганкой. За речушкой, возле банка "Нефтяной", на экране мелькнула и погасла точка "fourth". Радиобанка смотрела в сторону "Иллюзиона", я повернул ее по движению и мы двинулись к Синим воротам. На Синих воротах возле высотки нас ждал второй коннект, да какой... Сигнал немного поломался и уверенно встал на максимум, Stumbler сообщил, что точку зовут "fifth", скорость коннекта была 11 Mbps, но выходить к парадному подъезду высотки и варчокать прямо перед камерами наблюдения не хотелось - не люблю дешевой популярности.


Спецвыпуск Xakep, номер #027, стр. 027-076-4, ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

Dead.Moroz

Спецвыпуск Xakep, номер #027, стр. 027-076-4

Мы поехали на улицу Даши Отрываевой, где расположены Тутабанк, Тамабанк и Вонабанк. Улица нас разочаровала - Stumbler увидел только одну точку и та была слабой и шифрованной. Возможно, мы были далеко - все-таки стояли на противоположной стороне. Так или иначе, мы развернулись и поехали через Честные Труды к Дубянке, стараясь не смотреть радиобанкой в сторону королевских учреждений. Возле Япона-города снова засветилась точка "fourth" со стороны "Иллюзиона". Вот это сигнал! Расстояние между двумя точками, на Огородном кольце и Япона-городе, с которых мы видели "fourth", было почти два километра, и "Иллюзион" прямо посредине, в километре от каждой... Ох и зверская же у нас антенна, какой Радиатор молодец... Мы проехали по набережной, тактично отворачиваясь от королевского дворца, и снова достали и положили на переднее стекло радиобанку только на экс-улице Сладкого (ныне Панельной).

ШИФРОВАННЫЙ СЛАДКИЙ

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

Пока я варчокал точку на стене какого-то сарая, рядом остановилась "Тойота", и сидевшая за рулем тетка потребовала, чтобы я немедленно загрузил обратно паллеты с пивом и убрал фуру из переулка. Я пообещал ей, что все будет сделано, и вернулся к Перцу в машину. Увы, посмотрев на индикатор зарядки, мы увидели, что батарея ноута почти закончилась. Оказывается, незаметно пролетели два часа. Вардрайв остался позади, настала пора подводить итоги.

МЫ НАРАВНЕ С ПЛАНЕТОЙ ВСЕЙ

Ну, если судить по картам западных городов, развешанным в Инете, столица пока что уступает Нью-Йорку или Лондону, но уверенно держится на уровне других западных городов, за час с небольшим мы наловили больше двух десятков точек. Иными словами, прогресс нас стороной не обошел, все в порядке, на волнах 802.11b и у нас есть кого хакать (и кому - тоже, судя по тому, что ты это читаешь :). Как и в других крупных городах, радио вовсе не сосредоточено в центре, а встречается везде, в том числе и на окраинах города, порой довольно далеко от центра. Разумеется, плотность точек в центре заметно больше. Скорее всего, если бы мы поехали по другим крупным трассам столицы, картина была бы очень похожей.


Спецвыпуск Xakep, номер #027, стр. 027-076-5, ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

Dead.Moroz

Спецвыпуск Xakep, номер #027, стр. 027-076-5

С применением средств шифрования и защитой информации от нас с тобой все очень хорошо (то есть очень плохо :), примерно так же, как и за рубежом - шифрование радиоканала включили лишь около 30% админов, остальные не стали связываться с настройкой ключей во всех картах. (Возможно, конечно, что вместо WEP наши админы включают другие механизмы шифрования, но мне что-то подсказывает, что это не так. Наверное, старик, ты понимаешь, почему мне так кажется. :) Мировая статистика еще хуже - в Штатах шифрованием пользуется около 20% админов. Возможно, что наши админы включают шифрование чаще западных из-за наследственной отечественной паранойи. Ну хоть где-то она пригодилась, и то хорошо.

Кстати, как уже писал Радиатор, WEP тоже не является серьезной преградой (хотя и сильно затрудняет получение халявного доступа к сети, так как требует заметной подготовки для взлома). Проект Airsnort на http://airsnort.shmoo.com посвящен разработке ломалки для WEP под Пингвина. Ломалка работает в иксах и подбирает ключ к WEP после просмотра достаточного количества шифрованных пакетов. Хрымз собирается встретиться с хозяевами одной из тех сетей, где был включен WEP, и провести с ними совместный эксперимент - сломать защиту, сидя с ноутом и радиобанкой в кафе напротив.

Во время нашего вардрайва мы не пытались приближаться для коннекта к тем точкам, которые оставались в стороне от нашего пути, и не пытались настроить IP-адрес нашей машины в тех случаях, когда удавалось получить полноценный коннект, то есть двустороннюю связь с точкой доступа по радио. Подозреваю, что если бы мы съезжали в стороны, то количество коннектов было бы значительно больше, а если бы мы озаботились получением IP-адресов, то довольно часто просто получали бы их от серверов DHCP в увиденных нами сетях. И получали бы вместе с адресами DNS, роутеров и Интернет-прокси, если админ хорошо настроил DHCP :).

ПАРА СЛОВ ДЛЯ АДМИНА

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

Админ, дружище, мы тебя иногда беспокоим сканами, иногда дефейсим твой сайт, но, в общем, желаем тебе добра и по-крупному не гадим. Старина, ты завел себе радиоточку, а мы уже хорошо и уверенно умеем ее ломать. Мы на лету определим SSID, подберем ключ к WEP и для обхода аппаратных привязок можем спуфить MAC-адрес карты. Вся защита этого железа годится только для лапши на уши твоего начальника. Ты беззащитен не только перед нами, но и перед теми, кто очень хочет покопаться именно в твоей сетке, почитать именно твою базу и именно твою почту. Единственный выход для тебя - относиться к радиосетке так же, как ты относишься к любой другой внешней сети, так же, как ты относишься к Инету. Считай, что твои пользователи в радиосети - это удаленные пользователи, среди которых могут быть и не совсем твои пользователи. Например, могут быть совсем не твои, а чужие. И да пребудет с тобой сила.


Спецвыпуск Xakep, номер #027, стр. 027-076-6, ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

ОСОБЕННОСТИ БУТАРИТАРСКОГО ВАРЧОКА - мы поехали и нашли открытые радиосети!

Dead.Moroz

Спецвыпуск Xakep, номер #027, стр. 027-076-6

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


Спецвыпуск Xakep, номер #027, стр. 027-080-1, БАНКТЕННА - простая антенна для Wi-Fi

БАНКТЕННА - простая антенна для Wi-Fi

Radiator

Спецвыпуск Xakep, номер #027, стр. 027-080-1

<radiator@supermail.ru>

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

Wi-Fi ПИШЕМ С БУКВОЙ "Ы"

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

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

"А может, ты вообще в радио не разбираешься?" - ехидно поинтересовался Dead.Moroz. "По радиолабам тройка была," - честно признался я. "А кто тогда грузил Ноа, что сделает правильную антенну для 802.11b?" - загонял меня в угол он. "Ну, ладно, - сдался я, - ставим задачу".

Стандарт 802.11b работает на нескольких каналах в диапазоне от 2412 МГц до 2462 МГц, то есть со средней длиной волны около 12,3 см. Это диапазон СВЧ, или, по-буржуйски, microwave. Антенну варчокера желательно сделать направленной, чтобы можно было определить направление, и умеренно усиливающей, чтобы не ограничиваться расстоянием в сотню метров до точки.

СТАРОЕ - ЭТО ВЕЧНО НОВОЕ

Для работы с Wi-Fi нам подойдет конструкция СВЧ-антенны, хорошо известная примерно с 30-х годов XX века - цилиндрический стакан с плоским дном. Размеры цилиндра для длин волн 802.11b очень удачно совпадают с размерами жестяных банок из-под некоторых популярных продуктов.

"Вот это клево! - восхитился Moroz. - Побегу в магазин за банкой, что ли?!" "Беги, - разрешил я, - и постарайся взять ровную банку диаметром 100 миллиметров и длиной не меньше 130 мм."

Когда банка направлена открытой стороной на источник радиоволн, внутри нее образуются зоны максимального и минимального сигнала. Это немного похоже на то, как меняется сигнал от FM-станции, когда ты идешь с приемником по улице. Максимумы сигнала внутри банки расположены вдоль оси банки, в строго определенных местах, и их положение можно довольно точно вычислить, если знать диаметр банки и частоту сигнала. Наша задача - вычислить положение одного из таких максимумов и соединить эту точку с радиокартой с помощью подходящего кабеля. Диаметр банки следует выбирать от 0,6 до 0,9 длины волны сигнала, такая антенна будет иметь угол обзора около 40 градусов.

Moroz вернулся из "Перекрестка" с банкой Twisties. "Отлично, - сказал я, померив ее линейкой и наливая нам по чаю. - Размеры те самые, теперь надо вычислить максимум".


Спецвыпуск Xakep, номер #027, стр. 027-080-2, БАНКТЕННА - простая антенна для Wi-Fi

БАНКТЕННА - простая антенна для Wi-Fi

Radiator

Спецвыпуск Xakep, номер #027, стр. 027-080-2

В наших магазинах продается несколько типов банок. При покупке внимательно смотри на стенки (ровные - рулез, рифленые - сакс), дно (аналогично) и на размеры (смотри табличку, не стоит покупать банки короче рекомендуемых). Стенки Twisties оказались ровными без рифления, дно было неровным, но в пределах допустимого, внутренний диаметр банки оказался равен 98 мм, а длина - 140 мм. Расстояние от дна до максимума для такой банки получается примерно 46 мм.

СБОРКА МОДЕЛИ

Порывшись в столе, я выудил из него пару мама-папа высокочастотных разъемов типа N (смотри на фото). Для банки имеет смысл специально поискать разъем, предназначенный для установки на корпусах приборов, они выпускаются с крепежными отверстиями и коротким контактом, к которому нам будет удобно припаять пробник (на фото правильный разъем обведен корявой зеленой линией). Найти такой разъем можно на Mitinobazaar'е или в "Буром медведе" на Калужской.

Отступи от дна банки на "расстояние до максимума" (смотри табличку), аккуратно наметь место для крепления разъема, проковыряй дырку и постепенно расширяй ее так, чтобы задница разъема полностью садилась в получившуюся дырку, а центральный контакт на разъеме не касался стенок. Избежать появления жестяных заусенцев внутри банки можно, расширяя дырку остро заточенным сверлом.

Приложи разъем к банке и наметь через него четыре отверстия для крепежных винтов. Чтобы не нарушать волновую картину внутри банки, имеет смысл вставлять винты изнутри банки и затягивать гайки на наружной стороне. Прикрути разъем к банке и проверь расстояние от дна банки до контакта. Если оно отличается от "расстояния до максимума" не больше, чем на миллиметр, - все в порядке.

"Так все просто, - поразился Dead.Moroz. - И все, что ли?" - "Ну, не совсем, - сказал я, - еще надо приделать пробник".

Для оптимального съема сигнала из максимума нам понадобится медный штырь, мы припаяем его к контакту на разъеме и обрежем так, чтобы он выступал внутрь банки ровно на четверть длины волны стандарта 802.11b, то есть на 31 мм. У меня не было подходящего к центральному контакту толстого штыря, и я скрутил три медных жилы потоньше и пропаял их по всей длине.

Да, кстати, обрати внимание: пластмассовая вставка, удерживающая в разъеме центральный контакт, очень легко плавится. Чтобы не испортить разъем, паять его надо очень быстро, желательно это делать мощным паяльником в одно короткое касание. Если потребуется исправить пайку, не делай этого сразу, дождись, пока все остынет.

"Все, - сказал я Morozy, - вот твоя антенна, пробуй в деле". Кстати, моделей Wi-Fi карточек, позволяющих подключать выносные антенны, на свете не очень много. Наиболее известные марки - Cisco и Avaya Orinoco - комплектуются специальными переходными кабелями к внешним антеннам. И со стороны антенны эти кабели (ну кто бы мог подумать :), ага, заканчиваются разъемом типа N. К которому наша банка просто прикручивается. И вот второй разъем, лежавший у меня на столе, остался без дела. Такие дела.

Настраивать антенну имеет смысл возле известного источника излучения. Основных параметров для настройки у банки два - поляризация настраивается поворотом банки вокруг оси, а положение пробника относительно максимума настраивается небольшими смещениями разъема и подгибанием самого пробника внутри банки. Когда банка будет прилично отрегулирована, закрой ее полиэтиленовой крышкой - для волн 2,4 Ггц крышка прозрачна, а выглядит закрытая банка очень мирно и совсем не по-хакерски. Что и требовалось получить.


Спецвыпуск Xakep, номер #027, стр. 027-082-1, PAYALNIK Доктора Добрянского

PAYALNIK Доктора Добрянского

Спецвыпуск Xakep, номер #027, стр. 027-082-1

Если у тебя есть свои радио-

новости,

приколы,

методы,

решения,

инструменты,

устройства,

мнение,

поделись с нами. Прием радиомыслей на Dr.Cod@online.ru

новость:

СПАЯЙ СВОЙ ПРОЦЕССОР

Что будет с IBM-совместимыми компьютерами через несколько лет? Наверное, стоит посмотреть, что готовит нам IBM. А IBM вовсю интегрирует свои процессоры в FPGA XILINX Virtex II Pro. Что такое FPGA? Field Programmable Gate Array - программируемая пользователем вентильная матрица. На этой матрице можно собрать практически любую цифровую схему, например: процессор, видеокарту, аудиокарту, сетевое устройство, нейросеть, контроллеры почти всех известных интерфейсов.

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

Конечно, программируемые кристаллы всегда будут уступать заводским по скорости. Зато, чтобы оптимизировать АППАРАТНО новый сетевой протокол, новый формат видео/аудиосжатия, новый набор графических команд или встроить поддержку нового интерфейса, не придется менять все железо!

А как же будут рады ЮНИКС-программисты, которые смогут оптимизировать под свои задачи не только операционную систему, но и ЖЕЛЕЗО! Возможно, вскоре появится процессор с открытой архитектурой, которую смогут модифицировать (допаивать/перепаивать) все желающие. А может кто-то захочет дома, как Линус Торвальдс, спаять свой собственный процессор (Торвальдс паял процы? :) - прим. ред.), и история начнется снова!

прикол:

МАНУАЛ К ПРОДАВЦУ

Недавно я потащил Юрикса в магазин "Электроника", коих много в Москве. Юрикс сопротивлялся, пришлось насильно склонить его к знакомству с последними новинками бытовой техники и электроники. В этом магазине и завязался интересный разговор с продавцом (П).

П: Чем могу помочь?

Д (громко): Ничем!

П: Ну может все-таки чем-то помочь могу?

Д (громко): Есть ли трекболы оптические?

П: Че?

Д(громко): Не знаете, что такое трекболы, - значит, помочь не можете.

Добрый Юрикс несколько минут объясняет, что такое трекбол

П: ААААА!!! Я знала, знала. Просто вы еле мямлите.

Д (громко): Классно вы умеете с клиентами разговаривать.

П: Мы-то умеем, вот только вы не умеете с продавцами разговаривать.

На этом наше общение с торговым работником закончилось, а мы с Юриксом решили составить мануал по использованию продавцов, открыть курсы, принимать экзамены и выдавать сертификаты.

Или вот еще случай, неэлектронный, но высокотехнологичный:

Д: Я хочу купить прочные грязеустойчивые штаны из полиамида!

П: Возьми эти.

Д: Так они же из хлопка с полиэстером.

П: А че те еще надо? Зато все дышит!

метод:

СМЕРТЬ ДОМОФОНА

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


Спецвыпуск Xakep, номер #027, стр. 027-082-2, PAYALNIK Доктора Добрянского

PAYALNIK Доктора Добрянского

Спецвыпуск Xakep, номер #027, стр. 027-082-2

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

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

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

решение:

ОХ УЖ ЭТИ МОНТЕРЫ

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

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

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

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


Спецвыпуск Xakep, номер #027, стр. 027-082-3, PAYALNIK Доктора Добрянского

PAYALNIK Доктора Добрянского

Спецвыпуск Xakep, номер #027, стр. 027-082-3

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

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

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

устройство:

ИНДИКАТОРНАЯ ОТВЕРТКА

Если речь зашла об устранении результатов труда горе-электриков, то тебе пригодится индикаторная отвертка. Этот нехитрый девайс можно купить на любом углу по цене от 10 до 50 рублей. Такая отвертка с лампочкой и металлическим контактом на макушке. Если ты зажмешь металлический контакт рукой, то отверткой можно определить присутствие высокого напряжения 100-250 вольт. Этой отверткой ты сможешь проверить, правильно ли у тебя заземлен компьютер, электроплита, паяльник. Если денег на покупку индикаторной отвертки нет, то собрать ее проще простого. Для этого тебе понадобится стартер от лампы дневного освещения (такой маленький алюминиевый цилиндр с двумя контактами). Из стартера нужно отковырять неоновую лампочку. Чтобы не треснуло током, нужно к лампочке прикрутить сопротивление в 1 МегаОм. Такое сопротивление можно найти в старом телике на помойке или купить за 50 копеек. 50 копеек реально наклянчить у друзей. Схема проста: одним концом лампочка подсоединяется к отвертке, которой проверяют высокое напряжение, а другим через сопротивление - на палец. Если на отвертке появляется напряжение, то лампочка светится.

мнение:

ПОЧЕТНЫЙ ДОНОР

Первым читателем первого выпуска нового ПАЯЛЬНИКА стал ДОНОР. Его особенно порадовал сказ о монтерах. А метод с домофоном он опробовал сам: пришел домой, а агрегат показывает Err, ну он протер платочком по бокам - не помогло. Все дело было в том, что какой-то урод плюнул, плевок замерз и образовал ледяной нарост. После того как нарост был брезгливо удален палочкой, домофон ожил! Прикол с продавцами Донора не приколол, а устройство он хотел бы поподробнее.


Спецвыпуск Xakep, номер #027, стр. 027-082-4, PAYALNIK Доктора Добрянского

PAYALNIK Доктора Добрянского

Спецвыпуск Xakep, номер #027, стр. 027-082-4

Присылай свое мнение об этой рубрике, возможно, мы его опубликуем!

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


Спецвыпуск Xakep, номер #027, стр. 027-084-1, ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

Kirion (kirion@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-084-1

Ты настоящий гик. Ты не можешь представить себе жизнь без компа. Твоей многогигабайтной коллекции музыки позавидовали бы ведущие радиостанции, а коммерческого вареза накопилось на несколько десятков тысяч долларов. У тебя хранится обширная коллекция различной документации и книг, тысячи обоев с самыми красивыми девушками мира. Твоя отточенная до совершенства система не падала уже года два. И в один ужасный день этому всему приходит конец. По собственной ли дурости, из-за случайных действий родных, из-за виря или из-за трагического стечения обстоятельств - это не важно. Будешь размышлять над этим риторическим вопросом потом. И еще над одним: почему я не сделал бэкап?

ЧТО ЦЕННЕЕ ВСЕХ НА СВЕТЕ?

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

ЧТО В ОБРАЗЕ ТЕБЕ МОЕМ...

Знаешь, как переустановить любую винду за десять минут? Ставишь систему, настраиваешь, устанавливаешь основные драйвера. А потом делаешь образ системного диска. Если у тебя упадет система - достаточно загрузиться с дискетки и перезаписать системный раздел образом. "Погоди, а как этот образ сделать-то?" - спросишь ты. А очень просто: существует класс программ, которые не размениваются на такие мелочи, как копирование отдельных файлов. Они копируют сразу весь диск, ну или хотя бы раздел диска. Ну, например программы от Acronis (www.acronis.com). Программа, которая непосредственно занимается копированием, называется Acronis TrueImage, но я посоветовал бы тебе посмотреть еще пакет Acronis power utilites. Дело в том, что у этой компании немного странная политика в отношении программного обеспечения. Если у Powerquest такие функции собраны в одной программе, то у Acronis они раскиданы по нескольким. И за каждую они, естественно, хотят денег :). Доходит до смешного: в уже упомянутом пакете Power utilites каждая из входящих программ требует собственный лицензионный ключ. Я надеюсь, для тебя это не является преградой :). Итак, в пакет входит много ценного, но нас сейчас интересуют только: DiskEditor, RecoveryExpert, MigrateEasy. RecoveryExpert - занимается восстановлением разделов диска. Бывает, что в результате различных деструктивных действий или неправильной разбивке диска повреждается partition table. Recovery expert занимается тем, что ищет на неиспользованном дисковом пространстве (имеется в виду не свободное место, а место, свободное от разделов диска) признаки удаленного раздела. Если он находит таковой - тебе остается только выбрать, куда восстановить найденный раздел. К сожалению, проверить работоспособность проги мне не удалось - удаленных разделов у меня нет, а запарывать свой диск специально я почему-то не очень хочу :). Далее MigrateEasy - программа переносит данные с одного диска на другой. А вот это уже наглость: подобная опция есть во всех известных программах для создания образов. Почему ее нет в Acronis TrueImage? Работа проста: у тебя стоят два жестких диска. Программа полностью переносит данные и структуру исходного диска на новый. Причем новый диск не нужно форматировать или разбивать, программа об этом позаботится. Естественно, новый диск должен быть не меньше старого. Если же новый диск больше, то ты можешь выбрать, оставить на нем нераспределенное место или разбить его в тех же пропорциях, что и исходный. Если же ты выберешь в опциях manual upgrade, то сможешь вручную распределить место на новом диске, указать файловую систему и типы разделов. Главное - не забудь, что на новом диске не должно быть никакой информации, иначе MigrateEasy ее потрет (правда, она предупредит тебя об этом). DiskEdit - ну что тут можно сказать. Если ты научишься хорошо пользоваться этой программой, тебе не страшны более никакие сбои на диске. Я, правда, больше привык к строму доброму нортоновскому Diskedit'у, но этот будет посимпатичнее. Возможности у программы очень большие. Ты можешь копировать информацию с физически поврежденных дисков, восстанавливать загрузочный сектор, partition tabel и fat, восстанавливать структуру директорий и искать удаленную информацию. Другое дело, что все это требует больших усилий и очень прямых рук, иначе можно очень легко окончательно запороть диск :). Я не могу сказать про себя, что умею работать с DiskEdit. Было, конечно, один раз, fat у себя восстанавливал. Ничего, правда, не вышло, но в том моей вины нет :). Хочешь научиться - читай доки, их в сети достаточно. Переходим к главному, TrueImage. С помощью этой программы ты можешь создать образ всего диска или отдельных разделов и поместить их на другой диск, сетевой диск или записать на болванку. Образ может быть разрезан на части фиксированного размера. Жаль только, нельзя создать загрузочный диск с образом. Восстановить раздел также не сложно. Выбираешь образ, место, куда будешь восстанавливать, и процесс пошел. Если же ты хочешь восстановить не весь раздел, а только несколько файлов, выбери в меню explore an image archive. Образ будет подключен к компу, и ты сможешь работать с ним, как с обычным логическим диском. Кстати, все программы от Acronis прекрасно работают под виндами, но не все функции смогут выполнить. Сам понимаешь, доступ к диску под виндами ограничен (особенно под NT-осями). Так что придется создавать загрузочные дискетки и грузиться в ДОС. Правда, тут у меня есть один вопрос: мне, конечно, приятно, что моя USB-мыша заработала в ДОСе, но почему тот же TrueImage требует четыре дискеты? Хотя в целом - очень неплохой выбор для домашнего компьютера.


Спецвыпуск Xakep, номер #027, стр. 027-084-2, ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

Kirion (kirion@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-084-2


Спецвыпуск Xakep, номер #027, стр. 027-084-3, ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

Kirion (kirion@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-084-3

Ну а если тебе нужно что-то посерьезнее... Могу предложить PowerQuest DeployCenter. Установив ее, ты сможешь легко управлять созданием образов на компьютерах твоей организации, не выходя из дома. Не веришь? Достаточно лишь поставить IIS (веб-сервер от мелко-мягких). Ну и SQL-сервер или Microsoft Data Engine. В комплект DeployCenter входит программа ControlCenter ST. Он позволяет управлять созданием образов у всех компьютеров, на которых установлен и настроен соответствующий клиентский софт. А если компьютеры поддерживают PXE (pre-boot execute) и WOL (wake on lan), то можно будет по сети включать компы, проводить операции с образами и выключать. А используя Powercast можно транслировать образ сразу на несколько компов в сети. Находка для ленивого админа :). Но такие навороты тебе могут и не понадобиться. В отличие от своего младшего брата PQ DriveImage, ImageCenter, входящий в поставку DeployCenter, работает только под ДОСом (по крайней мере, его пятая версия; шестая вроде как недавно вышла, но найти ее нет возможности). Доступно создание образов любых разделов, запись разделов на CD (кстати, он будет загрузочным) и другие записывающие устройства (за полным списком - на www.powerquest.com). Программа имеет несколько степеней сжатия образа и по умолчанию включает технологию SmartSector (будут копироваться только кластеры, содержащие данные, нужно отключить, если диск зашифрован). Естественно, доступно копирование по сети, нужно просто указать тип нужного загрузочного диска и иметь ДОСовские драйвера для сетевухи (ndis2 или com). Поддерживается и Netware. И займет он максимум две дискетки. Можно копировать и целиком диск на диск, как в MigrateEasy. А еще ImageCenter может изменять структуру разделов, хотя доступны и не все функции, но для этого есть PartitionMagic от того же производителя. Для просмотра, модификации и восстановления отдельных файлов из образов служит программа ImageExplorer. С нею связан неприятный баг: она не понимает русские названия директорий и файлов. Ну и до кучи, в программе есть неплохой шедулер, который можно использовать и с другими программами от PQ. Я описал далеко не все фишки проги, слишком уж она навороченная. Если есть желание - читай мануал, там всего-то 320 страниц :).

Корпоративный софт - это мечта любого варезника, но достать его бывает сложновато :). Хотел порадовать тебя корпоративной версией Symantec Ghost, ну или хотя бы Ghost 2003, но, видимо, не судьба. Придется рассказать тебе про легко доступный Norton Ghost 2002 :). Практически классика жанра. Часто идет в поставке с материнскими платами. Это и не удивительно, программа удобная и достаточно мощная. Начиная с 2003 версии, Ghost умеет работать под виндами, а не из ДОСа, но я не считаю это особым достижением. Все равно ведь не все операции выполняются. Ghost отлично пишет образы на CD (чтобы сделать их загрузочными, нужно создать две разные загрузочные дискеты: boot disk with cd-r/rw support и cd-rom boot disk) и работает с удаленными компьютерами. Главное - задать нужные настройки при создании загрузочного диска. Не забыли и про поддержку USB и LPT устройств, исключение составляют пишущие USB-резаки. Ну и ленты, конечно же, Ghost поддерживает. Кстати, когда будешь делать образ - запиши номер лицензии Ghost. Программа может потребовать его ввод при выполнении некоторых функций. Интерфейс у Ghost немного необычный, но достаточно удобный. Все действия выполняются из выпадающих менюшек, разбитых по категориям. Основные же операции обычны: диск в образ, диск в диск, раздел в образ, раздел в раздел. Ну и наоборот, соответственно. Не забудь заглянуть в опции. Основные настройки просты, отмечу только создание ключа для образа, основанного на различных параметрах биоса, и создание контрольной суммы для образа. Да, чуть не забыл, по умолчанию Ghost копирует в образы только сектора, содержащие данные. Если тебе вдруг понадобится абсолютно точная копия, то это можно отключить. А еще в поставку Ghost входит маленькая консольная утилита GDisk. Создатели считают ее полноценной заменой format и fdisk. Так оно и есть. Единственный минус - программа работает полностью из командной строки или файла со сценарием, а ключей к ней очень много. GDisk умеет создавать, удалять, активировать и прятать, форматировать и секьюрно уничтожать (wipe'ить) диски. Умеет работать с boot.ini и MBR. Можешь смело добавлять эту утилитку на свою загрузочную дискетку :).


Спецвыпуск Xakep, номер #027, стр. 027-084-4, ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

Kirion (kirion@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-084-4

АРХИВАРИУСЫ, К БОЮ!

И все-таки копирование образов требуется далеко не всегда, да и обновлять их сложновато. Существует масса программ, занимающихся резервным копированием данных в меньших объемах. Если не можешь или не хочешь ничего искать - можешь обратить внимание на встроенную в 2k/XP утилиту "Архивация данных". Утилита проста и вполне может подойти многим пользователям. Указываешь, что сохранять, куда сохранять, тип архива, и все. На типе стoит остановиться поподробнее, он еще будет нам встречаться. Основные типы архивов такие: обычный, добавочный (инкрементный) и разностный (дифферентный). Инкрементный архив содержит те файлы, которые изменились со времени последнего инкрементного архива. Разностный архив содержит в себе все файлы, изменившиеся со времени последнего обычного архива. Для полного восстановления информации тебе понадобятся последний обычный архив и все инкрементные или последний обычный и последний разностный архивы. По какой схеме ты будешь архивировать - это уже зависит от твоих потребностей и частоты архивирования. Ну, вернемся к проге. С помощью стандартного виндового планировщика ты можешь запускать архивацию по расписанию. Если в системе есть установленные ленточные устройства - ты сможешь копировать на них. А в ХР можно даже записывать на CD с помощью встроенных средств. Если же ты не очень доверяешь встроенным программам (что, в общем-то, правильно :)), то можешь обратить внимание на продукцию такого известного производителя, как Veritas. Veritas производит профессиональные системы резервного копирования для различных осей и для виндов в том числе, но я полагаю, что тебе они не понадобятся (есть желание читать 1000-страничный мануал Backup Exec Pro?). У него есть отличная домашняя программа Backup MyPC (бывшее Backup Exec Desktop, www.stomp.com), которая должна вполне тебе подойти. Да и разобраться с ней не в пример легче. Задаем нужные фичи для бэкапа (можно сохранить системные настройки - поставь галку напротив system state) и лезем в опции. Задаем сжатие, проверку архива, пароль, ну и тип архива. Типы стандартные: обычный, инкрементный, дифферентный. Архив может быть записан на диск, на CD, удаленный компьютер, на ленту. На закладке Compare можно сверить содержимое архива с исходными файлами. А в Recovery wizard можно создать загрузочный диск для восстановления информации, но по какой-то странной причине он недоступен под ХР :(. У проги имеется планировщик, так что архивирование можно автоматизировать.


Спецвыпуск Xakep, номер #027, стр. 027-084-5, ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

Kirion (kirion@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-084-5

Если же ты любишь консольные проги - обрати внимание на nnBackup. Утилитка от создателей известного планировщика nnCron (www.nncron.ru). Попалась он мне случайно, когда я искал виндовый вариант утилки Dump. Dump - утилита для архивирования, входящая почти во все юнихи. У нее есть одна удобная фишка: уровни инкрементного копирования. Смысл в том, что в архив будут добавлять все файлы, изменившиеся со времени создания архива с уровнем на единицу меньше. Ты можешь создавать каждый год архив нулевого уровня, каждый месяц - архив третьего уровня, каждую неделю - архив шестого уровня, каждый день - архив девятого уровня. Чтобы полностью восстановить систему, тебе понадобится всего четыре архива. Эта функция в nnBackup есть, жаль, нет пока поддержки других устройств, кроме жестких дисков. Но прога развивается, может еще и добавят. Если же ты хочешь простую прогу, которая и создавала бы и архивы, и образы, можешь посмотреть NTI backup Now (www.ntius.com), но не жди от нее такой же работоспособности, как от Ghost. Прога поддерживает большое число резаков и оптимизирована под запись архивов на CD. Опции стандартны, интерфейс не вызывает отвращения, так что вперед.

РОСНО ПОПАЛО

Ну а что делать, если система все-таки упала, а бэкапа нет? Ну, чувак... при должном уровне везения можешь воспользоваться одной из прог для восстановления данных. Это и Norton Unerase, и серия программ от Ontrack (который теперь ничем другим и не занимается). Я пользуюсь Recover4all (www.recover4all.com). Хотя лучше до этого не доводить... Ну и напоследок послушай кое-какие советы, основанные на жизненном опыте :).

1. Не ленись, архивы нужно делать, это окупается.

2. Старайся придерживаться какого-то плана или периодичности архивирования.

3. Маркируй архивы, создавай каталоги архивов.

4. Если ты используешь NTFS - обратись к документации по проге для бэкапа, могут быть проблемы с полным восстановлением инфы, особенно настроек безопасности.


Спецвыпуск Xakep, номер #027, стр. 027-084-6, ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

ПОКА БАГ НЕ ГРЯНЕТ, мужик не забэкапится

Kirion (kirion@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-084-6

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

6. Купи источник бесперебойного питания (а лучше ноутбук, гы - прим. ред.). Я тоже думал, что в новых районах надежные электросети, пока единственное за пять лет отключение электричества не случилось во время работы Partition magic :(.

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

8. Закрывай лишние программы и расшаренные ресурсы во время создания архивов.

9. Будь готов к худшему. Если ты не сможешь восстановить нужную инфу после полного уничтожения системы - лучше и не начинать создавать бэкапы.

Ну, удачи тебе, и пусть твоя система живет долго и безглючно :).


Спецвыпуск Xakep, номер #027, стр. 027-088-1, ][-DESKTOP - убить за 60 секунд

][-DESKTOP - убить за 60 секунд

ilich (ilich@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-088-1

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

ПРИКОЛИСЬ, БАКЛАН!

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

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

Меня неоднократно спрашивали, как нарисовать во Flash'e кольцо, только кольцо не простое, а со сглаженными (а-ля размытыми) краями. А я неоднократно отвечал, что к тому есть несколько путей. А каких, не говорил :). Тебе один из них, пожалуй, расскажу. Создавай новый символ клипа "C - Cross" и в нем рисуй круг сто на сто с черным контуром. Толщину линии поставь пять пикселей. Позиционируй круг ровно по центру и удаляй заливку. Осталась линия - кольцо. Выделяешь ее и прямой наводкой прешь по следующим точкам: "Modify/ Shape/ Convert Lines To Fills" и потом "Modify/ Shape/ Soften Fill Edges", что в русифицированном Flash'e, соответственно, означает "Модификация/ Фигура/ Конвертирование линий в заливку" и " Модификация/ Фигура/ Сглаживание граней заливки". Чего, собственно, и требовалось достичь. Выделяй полученное добро и запихивай в отдельный символ графики "G - Round". Потом из библиотеки тащи туда же, в "C - Cross", еще два новых кольца. Сделай их разного диаметра так, чтобы они, стоя втроем ровно по центру, не налезали друг на друга. Теперь хватай соответствующий инструмент и рисуй две линии: горизонтальную и вертикальную. И ставь их тоже ровно в центре. Что получилось? Я не знаю, что там у тебя вышло :), а у меня - симпатичный такой прицел. А какой же на фиг качественный дестрой экранной картинки без добротного прицела вместо стандартного мышиного указателя?

Но это еще не все! Это был лишь первый кадр. Нам нужно, чтобы у нашего наводчика было два состояния: пассивное и, надо полагать, активное. Пассивное мы сделали. Копируй первый кадр во второй. В первом поставь stop(). А начиная со второго, рисуй активное состояние, т.е. какую-нибудь анимацию прицела, способную показать готовность курсора к стрельбе. У меня, например, за девять кадров (второй - десятый) немного меняются размеры моих колец. Внешнее чуть-чуть увеличивается, а внутренние два наоборот - чуть-чуть уменьшаются. И на десятом кадре все это дело stop'ится. Выглядит прикольно.

На главной сцене сделай отдельный слой (желательно повыше) и засунь туда наш "C - Cross", и дай ему имя "cross". Сразу скажу, его имя нам нужно будет лишь для перехода из активного состояния в пассивное и обратно. Только надо бы размер копии нашего прицела на главной сцене некоторым образом изменить, ведь мы-то его таким большим творили для удобства рисования. А курсор размерами сто на сто пикселей (и даже больше), поверь моему опыту, выглядит не так, как нам надо. После всего этого жми на прицеле правой мышкой :), выбирай Actions и набирай:


Спецвыпуск Xakep, номер #027, стр. 027-088-2, ][-DESKTOP - убить за 60 секунд

][-DESKTOP - убить за 60 секунд

ilich (ilich@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-088-2

onClipEvent (enterFrame) {

if (_root.destr==1) {

_x=_root._xmouse;

Mouse.hide ();

} else {

_x=-100

Mouse.show ();

};

_y=_root._ymouse;

}

Вместо события "enterFrame" (т.е. срабатывает каждый кадр - 12 раз в секунду) с тем же успехом можно было бы использовать "mouseMove" (т.е. срабатывает при движении мыши - я думаю, чаще). Как скрыть/показать мышь и позиционировать мувик на ее место, дети проходят во втором классе. Если ты ушел раньше, этот код наглядно показывает, что пока переменная "_root.destr" равна единице, вместо реального курсора мы имеем счастье наблюдать наш "C - Cross". Когда же вышеобозначенный флажок изволит поменять свое значение на что-то отличное от единицы, появится курсор, который подарил тебе Билл, а прицел улетит в небытие, т.е. аж на 100 пикселей за экран. Теперь надо бы сделать механизм работы с "_root.destr".

Для чего все это вообще надо? А для того, чтобы дестрой Кремля творился у тебя на столе не ежесекундно, а лишь по мановению твоих перстов. Т.е. по нажатию некоторой кнопки (забудь про красный цвет, мы говорим про твой Рабочий стол :)). И чтобы это отследить, мы просто сделаем два режима проигрывания флешки (определяемые именно значением флажка "_root.destr "): дестрой и антидестрой. Создай символ графики "G - Face" и нарисуй в нем себя злобного. Необходимого выражения лица можно достигнуть, попытавшись полноценно работать одновременно во всех прогах, установленных на твоем харде (не забудь потом этот автопортрет повесить где-нибудь в инете или просто прислать мне - я сделаю). Запихни этот шедевр в кнопочку "B - MenuW" во все четыре ключевых кадра.

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

on (press){

if (_root.destr==0){

_root.destr=1;

} else {

_root.destr=0;

for(k=1;k<=_root.i;k++){

removeMovieClip(_root.kremlin["hole"+k]);

};

};

}

Понятно, что при нажатии на ЭТО флажок "_root.destr" меняет свое значение с единицы (дестрой в разгаре) на нолик (Кремль живет) и обратно. Примечательно то, что если кликнуть по этой кнопке во время бойни (в if'e будет else), будет удален ряд клипов с однотипными названиями (я, по крайней мере, стараюсь по возможности давать переводимые названия идентификаторам). Так вот, это мы чистим место для следующего месива - эти клипы есть не что иное, как дырки в Кремле, оставленные твоей горячей рукой. Ну, или чем там еще, тебе решать...

КРЕМЛИН КАПУТ

Этими дырками мы сейчас и займемся. Рисованием то бишь. Создавай новый графический объект "G - Brick" и рисуй там кирпич. Да-да, тот самый кирпич. Достаточно намалевать прямоугольник характерных CC3300-го цвета и пропорций. Это нелегко, я знаю. Вот где по-настоящему проявляются все творческие навыки :). Как справишься, твори новый клип "C - HoleBrick". Здесь надо изобразить появление дырки на свет, т.е. разрушение стены как можно красивее. Действие должно течь от кадра с бесформенным пятном целой еще кирпичной стены к кадру, в котором кирпичи остаются лишь по периметру дыры. За кадров десять часть кирпичей должна разлететься в стороны, а часть - как бы провалиться в дыру (блин, прикольно будет смотреться :)). К последнему кадру все, кроме остающихся элементов, должно стать полностью прозрачным. Это дело лучше всего выполнить при помощи Motion Tweening'a, причем для большего эффекта все кирпичики должны лететь по-своему, с каким-нибудь особенным выкрутасом. То есть должны анимироваться в отдельных слоях.


Спецвыпуск Xakep, номер #027, стр. 027-088-3, ][-DESKTOP - убить за 60 секунд

][-DESKTOP - убить за 60 секунд

ilich (ilich@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-088-3

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

Могу сказать следующее: при анимировании в "C - HoleBrick" штук семи элементов пень 166 умирает после девятого выстрела, причем тормоза такие, что на каждый десятикадровый мувик дырки (при двенадцати кадрах в секунду) уходит от трех-четырех секунд в начале до полного висюка через минут семь после начала сеанса "бойни". Например, от восьмого клика до полной готовности произвести девятый проходит (я засекал :))) около трех минут :( (прим. Дронича - шестисотый пень справляется с этим без проблем, а на моем ноуте кирпичи вообще разлетаются на сверхсветовой :)).

Как закончишь париться с этой дыркой, выноси ее в Кремль и клади на самый верх. Если мы с тобой говорим об одном и том же :), то копия символа разрушения стены у тебя должна оказаться над Кремлем, не плохо было бы вообще расположить ее на отдельном самом верхнем слое. На всякий случай, хотя, учитывая то, как мы будем ее использовать, дыру можно запихать в любой слой. Только не забудь перетащить ее чуть пониже (не в плане порядка, а в плане расположения на экране) Кремля, т.к. этот экземпляр во время проигрывания не должен быть виден. И главное, сделай ее красивого размера. Я сомневаюсь, что дыра на полбашни будет выглядеть уж очень реалистично. Ну и слишком в реализм уходить не стоит, т.к. при таком масштабе, даже если тебе и удастся разглядеть пучок разлетающихся точек - якобы кирпичей, выбитых пулей, - вряд ли это мелкое крошево принесет необходимый нам терапевтический эффект. Дай клипу дырки имя "hole" и, вызвав панель Actions, пиши для него следующую лабуду:

onClipEvent (mouseDown) {

if ((_root.what_destr==1)and(_root.destr==1)) {

_root.i++;

this.duplicateMovieClip("hole"+_root.i, _root.i);

_root.kremlin["hole"+_root.i]._x = _root.kremlin._xmouse;

_root.kremlin["hole"+_root.i]._y = _root.kremlin._ymouse;

};

}

Я думаю, ты не боишься этих слов. Будучи постоянным ридером некоторой печатной продукции (не стану тыкать пальцем), т.е. если ты умница, каких свет не видывал, ты, наверное, уже говоришь на подобном диалекте. А написано тут вот что. Если при нажатии левой кнопки мыши одновременно два флажка ("_root.destr" и "_root.what_destr") равны единице, наша дырка в стене дублируется и идет в место дислокации твоей серой ручной подруги. Там и остается. Создается иллюзия того, что это ты мышкой поставил дырку. Притом что дырки-то остаются в клипе Кремля, т.е. при его сворачивании они тоже свернутся. И обратно развернутся при обратном деянии. Уничтожатся отверстия, когда ты нажмешь на кнопку со своей злой физиономией. Ибо так гласит ActionScript.


Спецвыпуск Xakep, номер #027, стр. 027-088-4, ][-DESKTOP - убить за 60 секунд

][-DESKTOP - убить за 60 секунд

ilich (ilich@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-088-4

МОГУ СТРЕЛЯТЬ, МОГУ НЕ СТРЕЛЯТЬ...

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

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

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

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

Воплощается в житуху это на удивление очень легко. Нужно всего лишь сделать новую пимпу "B - Kremlin" соответствующих формы и размера, запихнуть ее в символ Кремля и мысленно приказать мувику делать все так, как надо, т.е. написать для нее:

on (rollOver) {

_root.what_destr=1;

_root.cross.gotoAndPlay(2);

}

on (rollOut) {

_root.what_destr=0;

_root.cross.gotoAndStop(1);

}

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


Спецвыпуск Xakep, номер #027, стр. 027-088-5, ][-DESKTOP - убить за 60 секунд

][-DESKTOP - убить за 60 секунд

ilich (ilich@winfo.org)

Спецвыпуск Xakep, номер #027, стр. 027-088-5

Насчет формы этой мегакнопки слушай сюда очень внимательно. Ты берешь символ Кремля - тащишь его в новую кнопку. Разбиваешь его полностью до графики - выделяешь и с сумасшедшими глазами начинаешь бить чем попало по Ctrl + B, выкрикивая что-то на арабском. Берешь ластик - кнопка "E", если у тебя нет мышки :). И аккуратно стираешь все края у "графического" Кремля. Причем стираешь ровно столько, сколько у твоей дырки от центра до краев.

Неси пимпу на нижний слой в символ "C - Kremlin".

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

И да пребудет с тобой Великий Flash!


Спецвыпуск Xakep, номер #027, стр. 027-092-1, FAT32 и NTFS5 - дружба или противостояние?

FAT32 и NTFS5 - дружба или противостояние?

Андрей "Дронич" Михайлюк

Спецвыпуск Xakep, номер #027, стр. 027-092-1

(dronich@real.xakep.ru)

Есть в нашей жизни такая страшная проблема - проблема нечеткого выбора. Купить в ларьке Орбит или Дирол, сожрать Сникерс или Натс, поставить ХР или 2К... Когда разница невелика, тебе сложно сделать свой выбор, но ты все же можешь это сделать. А вот когда разница просто неизвестна, а выбирать надо, люди обычно полагаются на авось, либо глубоко задумываются. Так и я в свое время просидел полчаса перед монитором, на котором светились два флажка "FAT32" и "NTFS".

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

VOX POPULI

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

FAT есть суксь, потому как она стара и не защищена.

NTFS есть суксь, потому что она тормознута и недоступна из других систем.

Сам понимаешь, что в форумах редко кричат "рулез" и часто кричат "суксь" :). То есть надеяться на объективность мнений не было никакого смысла. Пришлось немного поRTFMиться и признать, что все обвинения справедливы.

VOX PROFI

Начитавшись монументальных трудов известных личностей, я открыл для себя следующее:

FAT ака File Allocation Table придумали вместе с DOS'ом, а FAT32 является неглобальным ее усовершенствованием. Для домашней системы она еще подходит, но вот в многопользовательских и серверных системах юзать ее строго не рекомендуется. Здесь как раз рулит NT'шка, ибо поддерживает установку прав на каталоги и файлы, шифрование на уровне файловой системы и квотирование дисков. Первые фичи понятны, третью представлю - квотирование позволяет выделять на одном и том же диске, а возможно и в одном и том же каталоге, строго заданное количество места для определенного юзера. Конечно, можно это воплотить и на ФАТе, но только при помощи сторонних программ. А тут все реализовано даже не на софтварном уровне, а на уровне файловой системы.

Это было про старость. Про незащищенность можно сказать только одно - чистая правда. Не видел ни одного диска, на котором после хардного ресета не выжила бы NTFS (даже больше, она и кластеры не теряет при этом). А вот Фаток улетевших видел много...

NTFS ака New Technology File System появилась вместе с семейством серверных осей от MS, получивших название NT (тот же New Technology). Система получилась в корне другая - для адресации файлов уже не используется архаичная таблица, хранящая в себе, по сути, образ диска. Теперь данные организованы бинарным деревом (интересующихся отправляю почитать Кнута, второй том программистского талмуда :)), что позволяет гораздо проще работать с фрагментированными каталогами большого объема. Да и просто объем диска теперь значительно подрос - теоретически NTFS выдержит терабайтные тома. Зато на мелких разделах NTFS действительно подтормаживает, особенно это заметно, когда на разделе лежат несколько больших файлов, а не россыпь мелких. Ну и замкнутость системы убивает - увидеть NTFS со стороны гораздо сложнее, чем FAT; кроме винтукея и ХР никто с этим не справится (я имею в виду полноценный доступ к диску, а не просмотр и легкое редактирование).


Спецвыпуск Xakep, номер #027, стр. 027-092-2, FAT32 и NTFS5 - дружба или противостояние?

FAT32 и NTFS5 - дружба или противостояние?

Андрей "Дронич" Михайлюк

Спецвыпуск Xakep, номер #027, стр. 027-092-2

VOX MICROSOFTI

Не послушать создателей обеих систем было бы по крайней мере глупо. Не люблю цитировать, но пересказывать хелп глупо :). Итак, MS позиционирует эти системы так:

«Файловые системы FAT и FAT32

Файловая система FAT32 является улучшенной версией файловой системы FAT, которая может работать с дисками объемом от 512 мегабайт (Мбайт) до 2 Тбайт. Файловые системы обеспечивают совместимость с операционными системами, отличными от Windows 2000. Если требуется создание конфигурации с двойной загрузкой, вероятно следует использовать файловую систему FAT или FAT32.

Файловая система NTFS

Для работы с Windows 2000 рекомендуется использование файловой системы NTFS. Эта файловая система обладает всеми основными возможностями файловой системы FAT и имеет следующие преимущества по сравнению с файловыми системами FAT и FAT 32:

Повышенная безопасность.

Более эффективное сжатие данных.

Поддержка больших дисков - до 2 терабайт (Тбайт). Максимальный объем дисков для системы NTFS значительно превышает максимальный объем дисков для файловой системы FAT, и, в отличие от системы FAT, при увеличении объема диска не происходит снижения производительности.»

То есть наши деньголюбивые друзья сделали отличную систему FAT, улучшенную FAT32 и совсем офигенную NTFS :). А ext2 вообще давно петухов карамельных сосет. Или пингвинов :). Ну, хоть честно признались, что производительность падает с ростом раздела (я представляю себе FAT на двух терабайтах - и смех, и грех).

VOX HACKERI

Естественно, удержаться от проверки быстродействия на деле мы не смогли. Тестирование систем проводили по простейшей методике - на диске были созданы два раздела одинакового размера (по 2 гига) и забиты разными файлами. Затем шла программа тестирования.

ТЕСТ 1: работа с большим файлом

С основного диска на тестируемый был скопирован лучший отвяз прошлого года - Шрек в виде AVI'шки объемом в 689 метров. На NTFS он ушел за 1 минуту и 35 секунд, а на FAT - за 1 минуту и 47 секунд.

ТЕСТ 2: работа с разветвленными каталогами

С основного диска на тестируемый была скопирована структура каталогов, представлявшая собой подборку лучших вещей группы "Кино" и Виктора Цоя в частности. Двадцать три каталога объемом в 261 метр были посланы на растерзание системам. NTFS приняла их за 1 минуту и 18 секунд, а FAT - за 1 минуту и 19 секунд.

ТЕСТ 3: поиск

С поиском оказалось сложнее - на запрос "звезда" вывалились три песни и одна хэтээмэлька, причем на обоих дисках практически мгновенно (хотя нет, ФАТ думала на квант времени дольше).

ИТОГО

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


Спецвыпуск Xakep, номер #027, стр. 027-092-3, FAT32 и NTFS5 - дружба или противостояние?

FAT32 и NTFS5 - дружба или противостояние?

Андрей "Дронич" Михайлюк

Спецвыпуск Xakep, номер #027, стр. 027-092-3

FAT - плюсы:

Для эффективной работы требуется немного оперативной памяти.

Быстрая работа с малыми и средними каталогами.

Диск совершает в среднем меньшее количество движений головок (в сравнении с NTFS).

Эффективная работа на медленных дисках.

FAT - минусы:

Катастрофическая потеря быстродействия с увеличением фрагментации, особенно для больших дисков (только FAT32).

Сложности с произвольным доступом к большим (скажем, 10% и более от размера диска) файлам.

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

NTFS - плюсы:

Фрагментация файлов не имеет практически никаких последствий для самой файловой системы - работа фрагментированной системы ухудшается только с точки зрения доступа к самим данным файлов.

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

Быстрый доступ к произвольному фрагменту файла (например, редактирование больших .wav файлов).

Очень быстрый доступ к маленьким файлам (несколько сотен байт) - весь файл находится в том же месте, где и системные данные (запись MFT).

NTFS - минусы:

Существенные требования к памяти системы (64 Мбайт - абсолютный минимум, лучше - больше).

Медленные диски и контроллеры без Bus Mastering сильно снижают быстродействие NTFS.

Работа с каталогами средних размеров затруднена тем, что они почти всегда фрагментированы.

Диск, долго работающий в заполненном на 80% - 90% состоянии, будет показывать крайне низкое быстродействие.


Спецвыпуск Xakep, номер #027, стр. 027-094-1, UPDATE - Web Update от Microsoft

UPDATE - Web Update от Microsoft

Алексей Б.Б. aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-094-1

(alex-sun@mtu.ru)

О чем думают люди, когда выбирают себе браузер? О скорости, о безопасности, о размере? А как насчет возможности лазить на все нужные сайты? Пусть попробуют Оперой попасть на cracks.am - не пустят туда таких. А сколько удовольствия лишится человек, если не увидит кучу поп-аповых окон на порносайтах :)))? Только IE - один из немногих браузеров с поддержкой ActiveX - позволяет насладиться такими прелестями в полной красе. Точнее позволял, ибо теперь много чего встанет на свои места. При использовании ИЕ можно будет по-прежнему залезать на любые сайты, только делать это станет намного спокойнее. Ребята из мелкософта об этом позаботились.

ОБНОВЛЕНИЕ ОБНОВИТЕЛЯ

Полез я как-то проверить, не появилось ли чего нового и полезного для виндов. Не успел нажать на кнопку Windows Update в ехplorer'е, как прям тут выскакивает на меня окно с уведомлением о добровольно-принудительном обновлении Windows Update'а. Прекрасно зная, чем чреваты отказы от установки обновлений такого рода (например, без установки SP1 на ХРюшник ХРен 2 тебе получить другие обновления), решился я на скачивание.

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

Пока доустанавливался обновитель, я не успел даже нажать на кнопку "просмотр обновлений", как комп очень быстро потребовал ребут. Хотелось сначала послать ребут куда подальше, но при нажатии кнопки "нет" снова появлялось то же окно с тем же вопросом. После 5 попыток было принято решение устроить перекур.

SERVICE PACK К 6-ОМУ EXPLORER'У

За 3 месяца 3 сервиспака! Мелкософт тянет на рекорд по скорости залатывания дырок у своих детищ :). Или наоборот. Впрочем, ерунда. Нда.

Как и любой сервиспак от мелкософта, этот является очень полезным, правда для пользующих ИЕ. Думается, что ОПЕРАторам не будет сильно интересно знать, что после сервиспака ИЕ стал даже более безопасным, да и глюков поубавилось. Как бы ни старались создатели всевозможных браузеров, но такие вещи, как CSS, XML и DHTML, без которых сейчас не обходится почти ни один сайт, в Explorer'е всегда поддерживались и продолжают поддерживаться наиболее полно и правильно. А ActiveX вообще только эксплорером и поддерживается. Но теперь к этому достоинству можно приписать и безопасность, которая раньше была далека от высшего уровня. На повышение безопасности направлена куча заплаток - закрытие возможной атаки при просмотре HTML-письма аутлуком в окне предпросмотра, при скроле страниц с табличной структурой (все интересные в плане дизайна сайты) в нефулскриновом окне екплорера, при помощи DHTML-кода и многих других способах.

Как заявил Билл Гей(т-с) примерно полгода назад, основной уклон мелкомягие будут делать на повышение безопасности, так оно и происходит. Слава Богу, что не забывают и про повышение стабильности. Какой толк от безопасности, если форточки то и дело сворачиваются, "выпустив недополнимую операцию", или просто пустуют? А ведь было такое, что при попытке открыть ссылку в новом окне, это самое новое окно иногда так и оставалось пустым. А в статусбаре написано, что страница полностью загружена. Думай-гадай после этого, глюки ли это на сайте или глюки в другом месте. При нажатии "Сохранить объект как" выскакивало сообщение об отсутствии файла по указанному линку, хотя линк рабочий и никаких "Узел недоступен или не найден" в этот момент быть не должно. В 6-ом ИЕ при попытке вернуться назад на страницу, где ты заполнил форму, все введенное в полях формы отправлялось на сервак повторно. В результате получался типичный флуд, за который на некоторых форумах можно и под очередь плюсомета попасть (о, как не любят таких у нас на АВТО.ру! - прим. ред.). Веб-дизигнеры и мнящие себя такими обрадуются устранению глюков о нарушении прав доступа при работе с FTP. При попытке даже просто перечислить все исправления уйдет намного больше отведенного для статьи места :). Зато теперь ИЕ становится реально полноценным браузером.


Спецвыпуск Xakep, номер #027, стр. 027-094-2, UPDATE - Web Update от Microsoft

UPDATE - Web Update от Microsoft

Алексей Б.Б. aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-094-2

Заявленные создателями (т.е. M$'ом) минимальные требования к компам для установки сервиспака оказались немного ниже, чем для работы самих виндов! Например, "Windows 2000: не менее 32 МБ оперативной памяти". Хотелось бы посмотреть на работу двухтысячных окон с 32-метровыми рамами :).

Достать дистрибутив сервиспака для IE 6 можно либо на диске, либо при помощи Windows Update. Полный размер SP порядка 25 метров, правда скачать его "от и до" не получится, ибо доступен он только при помощи Windows Update, который после проверки скажет, что качать нужно раза в 2 меньше. Но качать придется не FlashGet'ами или ему подобными даунлоудерами. Сначала сольется небольшая прога (ie6setup.exe), которая потом начнет сама качать все нужное файло для установки SP. Всем обладателям не слишком хороших телефонных линий будет трудновато тащить, ибо докачка работает очень непонятно. Так что лучше обзаведитесь сидюками.

Q382970 - ЕЩЕ ОДИН ПАКЕТ ИСПРАВЛЕНИЙ ДЛЯ 6-ОГО EXPLORER'А

Через несколько дней после выхода первого сервиспака для IE 6 вышел еще один пакет исправлений. Из-за небольшого количества собранных заплаток его не стали называть SP, хотя это не умаляет значимости этого пакета. Исправлено кривое обрабатывание картинок формата PNG, которое могло привести к переполнению буфера, а, следовательно, и к незащищенности системы в целом в такой момент. Использование в URL'ях закодированных символов позволяло любителям заиметь чужие пароли или содержание адресной книги для создания очередной спам-базы делать очень нехороший редирект. Во время перенаправления все переданные за время коннекта с сайтом данные становились доступными хацкеру. Как это делается? Довольно просто. Создается хацкером сайт №1, на котором обязательно есть ссылка на созданный сайт №2, причем на сайт №2 ты должен будешь отправиться ничего не заподозрив. Только вот ссылочка на сайт №2 содержит закодированные символы, на которые ты (как и процентов 90 остальных) не обратишь внимания. После клика на такую ссылку сайт №2 станет для хацкера окном в твой комп - можно будет много полезного узнать за то время, пока будет длиться серфинг по сайту №2. Как правило, такое встречается на полулегальных сайтах (крэки, хак, порно), которые надолго затягивают попавшего. Далеко не на все такие сайты можно попасть не используя ИЕ. Не для того лезем мы на сайты по хаку, чтобы нас хакали! Для спасения от таких неприятностей и выпущено в срочном порядке данное обновление. Лезь за ним на http://www.microsoft.com/windows/ie/downloads/critical/q328970/default.asp, чтобы пошустрее добраться до него и обезопасить себя от описанных выше проблем.


Спецвыпуск Xakep, номер #027, стр. 027-094-3, UPDATE - Web Update от Microsoft

UPDATE - Web Update от Microsoft

Алексей Б.Б. aka Alexys

Спецвыпуск Xakep, номер #027, стр. 027-094-3

ОБНОВЛЕНИЕ Q328523

Это обновление для тех, кто так и не решился пересесть на IE. Какой бы браузер ни был у тебя дефолтным в Win2k, после создание соединения в "Мастере подключения к Интернету" (Internet Connection Wizard) будет обязательно запущен Explorer. Довольно бесполезное обновление, ибо ничего не стоит просто закрыть ИЕ и запустить Оперу или Нетшкаф какой-нибудь. Причина выхода данного обновления наверно связана с продолжением Майкрософтом операции по освобождению винды от своих программ. Так в 3-ем сервиспаке к Win2k уже стало возможным скрывать M$-овские проги, правда не удаляя их. Теперь сделан еще один шажок (правда маленький такой) к избавлению юзеров от монополизма в использовании программ под виндами.

Q328523 не является жизненно необходимым обновлением. Так что ставить его или нет - это личное дело каждого противника M$'а (224 Кб, однако). Так что особо ярым нелюбителям ИЕ можно потратить минутку на его (не ИЕ :)) скачивание: http://download.microsoft.com/download/win2000pro/Patch/Q328523/NT5/RU/Q328523_W2K_SP4_X86_RU.exe.

P.S.: данное обновление не вошло в сервиспак для IE 6. Хотя кому нужен сервиспак для IE 6, не будут ставить этот апдейт. Логично, мля.

УСЕ У ПОРЯДКЕ, ШЕФ!

Для полного пропатчивания IE остается сделать так, чтобы картинки на порносайтах грузились снизу вверх, а не как сейчас :). Тогда вообще придраться не к чему будет, но это уже больше похоже на мечты извращенца. Хотя надо поделиться с мелкософтом таким пожеланием. Глядишь, и сделают порно-патч к ИЕ :).


Спецвыпуск Xakep, номер #027, стр. 027-096-1, ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

Томилин aka Middlenight

Спецвыпуск Xakep, номер #027, стр. 027-096-1

Хай, comrade Spielberg! Наш курс молодого бойца киноиндустрии подходит к логическому концу. "Получите свой диплом, примите наши соболезнования". Сегодня ты узнаешь, как превратить твое 3D-безумие в кино и вывести его на большой экран... твоего телевизора. Разумеется, реалистичность нашего творения будет сравнима лишь с популярными ныне трехмерными мультиками, но люди и на этом огребают деньги. А еще ты научишься смотреть на то, что крутится по нашему ТВ, глазами человека, разбирающегося в 3D-арте изнутри. Когда-нибудь пригодится, поверь мне. "И можешь отнести мое слово в банк" :).

СПЕЦЭФФЕКТЫ

Что у нас осталось недоделанным в плане наполнения сцен? По сюжету, голову Трофимыча долбит электричество. ИМХО, для имитации электрических разрядов лучше всего катит плагин Digimation Lighting. Он может создавать энергетическую дугу, следующую по определенному сплайну или между двумя объектами. Заюзаем! Создадим кривую линию между двумя источниками электричества - я сделал два шара на уровне висков Трофимыча. Ползем в меню плагина: ставим флажок на Spline и создаем в сцене пиктограмму с изображением молнии, которая отвечает за редактирование конкретной электродуги. В разделе Spline щелкаем на Source и выделяем только что созданный сплайн, после чего сразу после нажатия кнопки Play Animation появится молния с дефолтными параметрами. Изменяй их, как хочешь. Дам описание основных параметров для тех, кому в падлу учить ленгвич: Start - время начала электрификации; Strike - продвижения заряда по сплайну, чем выше - тем дольше путь; Forks - количество энергетических лучей; Sub forks - сам догадайся; Circular sweep - отправной и предельный градусы вращения заряда по сплайну. Единственное, что не радует, это невозможность прерывания движения дуги, но если ты сохраняешь анимацию в отдельные кадры, то это не проблема - просто несколько раз запускай рендеринг, периодически отключая молнии.

Итак, молнии есть, но вот только выглядят они как-то не так. Нет в них присущего реальному электричеству свечения, как нет его и в других расположенных в сцене источниках света. Непорядок! Для подобных случаев в Максе предусмотрен набор фильтров. Находятся они в монтажном пульте. Так что идем в Rendering->Video Post и прежде всего добавляем Scene Event, то есть нашу камеру. Щелкаем на Add Image Filter Event - вот здесь все фильтры и хранятся. Нам нужен Lens Effects Glow. В его сетапе щелкай на Preview и ставь по своему вкусу флажки в разделе Source. Флажок на Unclamped должен быть обязательно, иначе при рендеринге ничего не появится. Whole - проставить флаги на четыре оставшихся поля. Еще можно изменить градиенты - это легко. Теперь дави Add Image Output Event, где назначай название выходного файла (опять же, лучше сохранять в последовательность кадров). Подправив, по необходимости, Render Options в Scene Event, переходи в Execute Sequence, назначай размер выходного изображения Pal (video) 720х576 и начинай рендерить всю последовательность кадров. Чувствуешь теперь разницу?

ВЗОРВЕМ?

Осталось самое вкусненькое - взрывы. Начнем с раскалывающегося по сюжету VR-шлема. Самый простой метод - это Bomb из деформаций пространства. Но разлетающиеся в разные стороны полигоны - это как-то слишком примитивно. Попробуем что-нибудь другое. Дави Create->Particle Systems->Particle Array. Помещай этот Particle Array где-нибудь в сцене (пофиг где). Выбирай шлем Трофимыча (Pick Object) и выставляй следующие установки:


Спецвыпуск Xakep, номер #027, стр. 027-096-2, ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

Томилин aka Middlenight

Спецвыпуск Xakep, номер #027, стр. 027-096-2

Viewport Display - Mesh

Particle Type - Object Fragments

Бум! Пока отличий от Bomb мало, но это пока. Надо изменять значения партиклов. Object Fragment Controls: Thickness - это толщина осколков. Object Fragment Controls: Number of Chunks - количество осколков, на которые разлетится шлем. Чтобы он не разлетался на полигоны, поставь приглянувшийся тебе параметр. Spin Speed Controls: Spin Time - вращение осколков, опять же для придания сцене реалистичности. Если этот параметр не 0, то осколок будет делать полный оборот за это количество кадров. Думаю, где менять время начала и конца взрыва, ты сам найдешь. Последняя деталь в этой сцене - это исчезновение основного объекта, ведь партиклы шлема разлетятся, а сам шлем-то останется. Сделать это можно в Track View->Add Visibility Tracks->Visibility или щелкнув правой кнопкой на шлеме, выбрать Properties и снять флажок с Renderable.

Ну а теперь реалистичные взрывы. Пусть все горит синим пламенем, особенно эта монстропроизводящая лаборатория! Нормальный взрыв, ИМХО, должен состоять из трех частей: вспышки взрыва, разлетающихся осколков и ударной волны. Начнем со вспышки. Сначала надо создать ее форму каким-либо образом, хоть из примитива. Не юзай обычный шар. Для реалистичности нахреначь какую-нибудь грушу. Затем иди в Particle Systems, щелкай на Particle Array, помещай эмиттер (источник частиц) в любом месте сцены и через Pick Object выбирай нашу грушу, чтобы эмиттером стала она. После этого делай ее нерендабельной и переходи к редактированию партиклов: Use Rate делай побольше (я сделал 3000); скорость - более эффектная около 0,5; Emit start - 0; Emit Stop - 5, чтобы частиц не рождалось слишком много; жизнь каждой частицы - я установил 30, притом что сам взрыв длился 35 кадров; Grow for - двадцатка подойдет; частицы - стандартные константы. Теперь рендерь последовательность кадров в Avi, но только через фильтр Glow.

Теперь осколки. Использовать опять же будем партиклы, только на этот раз Super Spray. Сначала нужно поместить под камеру подложку только что сделанного взрыва (Rendering->Environment->Environment Map->Bitmap->Твой взрыв.avi), а для удобства пометить изображения взрыва на рабочее поле камеры (Views->Viewport Background->Bitmap Source->Твой взрыв.avi). Спреев будет три: один - растущий шар, два других - спонтанные осколки. Спреи этих осколков сделай вращающимися в разные стороны на период анимации - так будет реалистичнее. К спрею-шару применяешь Trail (равномерное распределение частиц) в Load Presets - так быстрее. В получившихся параметрах меняешь Use total на несколько тысяч, Speed - сойдет 15, Emit start - 2, Emit stop - где нибудь рядом, например, 6. Life (жизнь частицы) - 30, Variation - 5, как было, так и останется. В типе частиц (Particle type) укажи Instanced Geometry, чтобы можно было использовать любой объект. Сделай какую-нибудь корягу (осколок) с соответствующим материалом и выдели его через Pick object. Для двух других спреев также используй заготовку в Presets, только тип укажи, как Fireworks - что-то типа языков пламени, где также измени параметры на схожие с Trail-ом.


Спецвыпуск Xakep, номер #027, стр. 027-096-3, ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

Томилин aka Middlenight

Спецвыпуск Xakep, номер #027, стр. 027-096-3

Ну, и наконец, ударная волна - тут все гораздо проще: тот же Super Spray, в Load/Presets которого выбираем Shockwave - это и есть ударная волна. В Instanced Geometry ей лучше назначить какой-нибудь эффектный синий материал, чтобы взрыв не был однообразным. В итоге, рендерим всю сцену. Чем не Вавилон 5? В фильтрах для пущего эффекта можешь добавить еще и Lens Effects Flare - кольцо засветки, которое появляется повсеместно в том же Вавилоне. Также, по вкусу, добавляется пламя, но не юзай стандартный огненный модуль Макса Combustion (он же Fire effect). Нет, он не плох и при должной настройке он может пригодиться, например, для имитации космического тумана, который прорезает корабль "Enterprise" из "Star Trek. New generation", но только не для создания огня. Самая потрясающая вещь для Fire-эффектов - это плагин Phoenix. Там делаются просто чумовые вещи - от спички до ядерного взрыва. Но этот плаг мне встречался только для версии Макса 2.5 (ставь больше Максов!). Как альтернатива проканает плаг Digimatiom Firestorm - добротное пламя с кучей доступных и чайнику характеристик. Создавай Gizmo (Helpers->Atmospheric Apparatus) для объекта (Pick object) огня и экспериментируй.

ЛОГО!

На кого бы пародию сделать? Труднее всего, ИМХО, на "New Line Cinema", легче всего - на "20-th Century Fox". Его и извратим. Каждую строку в Text делаем отдельно, чтобы потом можно было подогнать их под одну ширину. Когда контур будет готов, надо сделать буквы объемными. Есть два неплохих пути: банальный Extrude и снятие фаски aka "Bevel". Выделяешь текст, находишь Bevel в списке модификаторов и выставляешь от одного до трех уровней. По углам надписи делай пару направленных источников света, применив к ним Volume light или Scatter VL Pro. Не забудь про подставку под буквы. В качестве задника я взял модель вулкана, который сверху подсветил желтым Volume light с параметрами Amount - 1, Turbulence, Levels - 3, Size - 15. Это я сделал для придания заднику вида старой фотографии. Весь логотип на фоне брайсовского неба.

ПАРА ТИПСОВ

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

Когда закончишь снимать процесс морфинга, просто замени фигуру Трофимыча в сцене на что-нибудь другое, сделанное в Creature Creator и Head Designer. Дело в том, что после морфинга у тебя получится что-то непривлекательное, так что смело меняй фигуры - после монтажа зритель все равно ничего не заметит и не поймет. На шотах можешь наблюдать, что сделал с Трофимом я.


Спецвыпуск Xakep, номер #027, стр. 027-096-4, ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

Томилин aka Middlenight

Спецвыпуск Xakep, номер #027, стр. 027-096-4

В МОНТАЖНУЮ!

Наконец все кадры готовы. Осталось добавить звук и перевести ролик на пленку. Как бы это лучше сделать? Нет проблем! Короче, идем в монтажную, берем бетакамовский видак с возможностью покадровой записи, видеоплату для оцифровки видео/аудио (Perception VR или Pinnacle TV), суем это все... Эээ... Что-то меня занесло... У тебя же не коньяк и балык, а водка и селедка, следовательно, обойдемся подручными средствами.

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

Во-вторых, если ты уже успел смонтировать свой ролик (хотя бы в том же Флеше), то самым простым решением будет запустить прогу для линейного монтажа. Моя favorite - это Virtual Dub: весит копейки (730 кило), поддерживает видеозахват, монтаж, компрессию, имеет кучу плагинов для всего, чего только можно (изменение размера, motion blur etc.), и все это абсолютно бесплатно и "чиста интуитивна понятна". В Дубе выполняешь всего три действия: File->Open video file-> твое творение.avi; Audio->Wav audio->твоя фанера.wav/mp3; Video->Compression->оптимальный на твой взгляд кодек. Все. Теперь File->Save as avi, и через пару-тройку секунд (минут, часов) ты обладатель свеженького, прямо из печи набора из чередующихся с частотой 25 кадров в секунду картинок и 48-килогерцового (советую выбирать 48) звука.

Данный способ имеет как свои плюсы, так и минусы. Плюсы: относительно быстро, легко (пара движений, и ты - отец) и... И все. Минусы: один кодек, потом другой кодек, и результат станет довольно поган, волнист и квадратист :). ИМХО, этого достаточно. Вывод: должен быть только один кодек и то только для того, чтобы комп успевал обработать инфу. Сам смотри: если кадры не сжимать, то 25 кадров х 720 точек х 576 пикселей х 3 байта (24-х битный цвет)/сек = 31 Мбайт/сек. Для IDE интерфейса может и ничего, а вот для старого винта (на ATA 66, да и на 100 тоже) еще, так сказать, может и не сдюжить. Так что, если винт не сказевый, приходится жать.

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

ПРЕМЬЕР-МИНИСТР

Самый популярный в этом деле software-пакет - это, разумеется, Adobe (Free Sklyarov!) Premiere. Есть и альтернатива - MGI VideoWave.

Итак, запускаем Премьера. Из предложенного меню выбираем проектный тип ролика DV-PAL & Standard 48 kHz. Если ты помнишь, я советовал сохранять последовательности кадров каждой сцены в отдельных папках. Сейчас поймешь - почему. В меню файл выбираешь Import->Folder и начинаешь импортировать все директории с готовыми фреймами. Видишь, они появляются в отдельном окне проекта? Когда импортируешь все фолдеры, начинай их перетаскивать на Timeline-Video, разумеется, в той последовательности, которая задумана по сценарию. Следи, чтобы кадры начинались с первой секунды и были точно подогнаны друг к другу. Чтобы 25 кадров влезали в одну секунду, иди в Edit->Preferences->General and Still Images, где изменяй Default Duration frames на единицу. Когда с кадрами будет покончено (Die, Bitch!), повторяй ту же операцию с импортом, только для фонограммы, но помещать ее надо на Timeline-Audio дорожку. That`s all, folks :)!


Спецвыпуск Xakep, номер #027, стр. 027-096-5, ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

Томилин aka Middlenight

Спецвыпуск Xakep, номер #027, стр. 027-096-5

Ролик есть сделан. Можно теперь сохранить его и посмотреть на результат своего труда. Выбирай File->Export Timeline->Movie, в Settings->Video юзай понравившийся тебе кодек и можешь смело увековечивать свой шедевр.

НА ЭКРАН!

Свое кино гораздо приятнее смотреть по ящику, чем на компе (хотя в кинотеатре, наверное, еще приятнее :)). Значит, надобно перевести наш ролик на кассету. Здесь, опять же, энергия Премьера нам поможет. Если у тебя хороший винт, то переводить на кассету будем именно склеенные кадры. Если с техникой дела обстоят фигово, то импортируй в новый проект сохраненный ранее ролик, упакованный нормально воспроизводимым у тебя кодеком. Разумеется, все это возможно, только если у тебя есть видеокарта с возможностью видеозахвата, подключенная через TV-out к видаку. Порядок действий должен быть следующим: если используешь обычный VHS-видак, то после создания превьюхи просто нажимаешь одновременно запись на видеомагнитофоне и Play на мониторе Премьера (сразу предупреждаю, что я не несу никакой ответственности за неправильное подключение твоих девайсов друг к другу :). Если же ты более крут и продвинут плюс обладаешь DV-камерой, то после просмотра (для Preview - делаешь активным окно Timeline и нажимаешь на Enter) жмакай File->Export Timeline->Export to Tape, где сделай активным Recording Deck, чтобы камера включилась в режим записи. Ну и все. Теперь Print и here we go!

Когда первая кассета будет готова, можешь быть уверен, что рубикон уже перейден - ты больше никогда не будешь прежним: твоей домашней страничкой будет Render.ru, твоей библиотекой - "Война и Мир: сделай это в 3D" в 40 томах. Ты будешь с бешенными глазами рендерить все подряд: подружку, собаку, сантехника. Главное, что, кроме эстетического наслаждения, увлечение 3D может принести тебе некоторые деньги. Будь уверен, что за 28 секунд графики в России спокойно можно огрести несколько сотен зеленых.

ЭПИЛОГ

Если уж на то пошло, то чем то, что мы сделали, отличается от нормальной телепрограммы? Я, конечно, не говорю про федеральных телегигантов, но на региональном телевидении, например, стандартным носителем де-факто остается бетакам SP (зайди в магазин и посмотри, сколько стоит пятиминутная кассета;), хотя некоторые телекомпании уже переползают на Mini-DV - это тоже не наш уровень. А вот если говорить о кабельном телевидении, то сюда мы вполне вписываемся. Здесь до последнего времени использовали Super VHS - то есть, типа, обычные видиковские кассеты. Известный факт: когда в 2000 году загорелась Останкинская полукопченая телебашня, федеральные телеканалы передавали новости путем доставления бетакамовских кассет на кабельные студии, где их и перегоняли на SVHS. Так что можешь уже считать себя телемагнатом. Так начиналось MTV... Нет, кабельное ТВ - это не то, к чему следует стремиться, но для первого раза неплохо.


Спецвыпуск Xakep, номер #027, стр. 027-096-6, ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

ГОЛЛИВУД У ТЕБЯ ДОМА! PART 3

Томилин aka Middlenight

Спецвыпуск Xakep, номер #027, стр. 027-096-6

Не стоит пытаться побить произведения от "Пилота", "НТВ-дизайн" или Антона Ненашева (оформление "Муз-тв") - там и снимают на "Кодак", и хард/софт на порядок выше (серьезным дядькам западло все делать в Максе на ПК), но на уровень региональных телекомпаний (по качеству графики) мы уже вышли. Я тебя уверяю, что 90% студий в России, работающих на телевидение, используют только расплагиненный Макс, AfterFX да Премьер. Главное - это Идея и стремление воплотить ее. Этим ты и отличаешься от большей части этих самых студий.


Спецвыпуск Xakep, номер #027, стр. 027-100-1, ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

Midi (midi@mail.ru)

Спецвыпуск Xakep, номер #027, стр. 027-100-1

Gutten tag, mein froind! Ты, конечно, есть очень соскучиться по хороший немецкий марш! Найн, найн - смотреть прямо в глаза! Это же надо, до чего доводит отсутствие в полку пластинки с Розенмунденом - все распустились, Sheise! Сапоги не начищены, белье торчит, причиндалы наружу... В общем, пора встряхнуться, изменить, так сказать, привычный ход событий. Начать предлагаю с прослушиваемой тобой музыки. Мне-то она уже вся по барабану - чтоб ты знал, слишком много звуковой инфы в одном логическом мозгу ведет к переполнению своп-извилины, а уплотнение драйв-стимулянтами, как совершенно случайно выяснилось, не приносит нужного эффекта. Если же у тебя еще не все так критично, как у меня, то предлагаю в очередной раз поизмываться над твоими любимыми музыкальными произведениями. А поможет нам в этом... Аудио-редактор GoldWave - он не сушит вашу кожу и уж, конечно, лучше размягчает мозги, чем кипячение.

ИЗ АНАМНЕЗА...

Первое впечатление от проги - пестро. По количеству выскакивающих за раз тулбарных кнопарей на единицу площади прога явно обгоняет не только SoundForge и CakeWalk, но также и Microsoft Урод с 3D-Максимом. Что ж, тем веселей. Помимо основного окна, справа под боком мешается эдакий пульт управления полетом, совмещающий в себе функции магнитофона и пары винамповских плагинов. Это я насчет того, что, щелкнув правой кнопкой крысы по каждому из двух черных окошек ЦУП-а, ты можешь задать графическое представление твоего звукоряда - от спектрограммы до банальной амплитуды сигнала, короче - обычные винамповские AVS-ы. Главный же пульт проги пока что девственно... короче, нету там ничего никогда.

НАЧИНАЕМ ЗАЖИГАТЬ!

Для любого аудио-хирурга, коим и является ГолдВейв, требуется хоть бы самый завалящий, но пациент. Дабы никому не было обидно, в качестве оного я решил взять классическую композицию "Also speach Zaratustra" ("Так говорил Заратустра") Рихарда Штрауса - пора, бляха-муха, окультуриваться...

ПРОБЫ ПЕРА

Начну с общих слов. Самой знаменитой фишкой ГолдВейва является набор поддерживаемых им аудиоформатов, включая PC-несовместимые (в том числе Apple и Amiga). На рубеже 2000-2001 годов эта его фича здорово помогала мне с приятелями, когда в те тяжелые годы нам приходилось кормиться аудио-пиратством (учились мы при этом на юрфаке, так что соответствующую статью УК помнили наизусть). Тогда брались все требуемые (разумеется, сжатые) аудио-файлы, перегонялись в формат Wave (он же CD) и записывались на носитель. Получался вполне продаваемый (втюхиваемый - проф.) аудио-диск. Деньги - в кассы, культуру - в массы. Очень любопытный результат получается, если в ГолдВейве открыть поддерживаемый им формат .TXT. Прога преобразует текстовые символы в звуки, и полученные перлы запросто можно использовать в качестве диковинных самопальных сэмплов.

Итак, горячий, хоть и нордический, парень Заратустра загружен - пора его хорошенько по-русски вздрючить. Я так думаю, что объяснять тебе, как отрезать, переместить или вставить парню вторичные половые признаки, не нужно. Все эти функции достаточно стандартны и изображены в первом ряду тулбаровых кнопок. Коротенько обрисую некоторые из них: Del - удаляет выделенные области (правая и левая кнопки мыша, соответственно, выделяют нужный кусок с двух сторон); Trim - килит невыделенные области звукоряда; Chan - переключение каналов - правый, левый или стерео; ну и зумы там всякие, да прочее мракобесие.


Спецвыпуск Xakep, номер #027, стр. 027-100-2, ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

Midi (midi@mail.ru)

Спецвыпуск Xakep, номер #027, стр. 027-100-2

ПРИЧИНДАЛЫ

Переходим к настоящим хирургическим инструментам. Позолоченные скальпели, сверкающая циркулярная пила, червленое сверло лоботомической дрели... Первым в списке значится мой любимый Доплер. Ты наверняка слышал об эффекте Доплера - его ты можешь, так сказать, наблюдать, когда мимо тебя на полной скорости проносится твой сосед Гогия в блестящем джипе. За тот отрезок времени, пока горячий джигит выжимает педаль газа, звук рычания джипа динамически изменяется относительно тебя. Как раз эту динамику и определяет эффект Доплера, в данном случае - применительно к выбранному отрезку мелодии. В менюхе Доплера находится несколько установленных по умолчанию значений огибающей, которая задает динамику звука. Самым интересным пунктом здесь, на мой взгляд, является Vibrato. Правой кнопкой крысы удаляем пару первых верхних и нижних точек, дабы запускать вибрацию постепенно, и жмем O`k. Что у нас получилось? Правильно, сирена:). Просто поразительно, как из духового концертного вступления можно получить банальный ментовский матюгальник.

Echo благополучно пропускаем - эхо оно и в Африке (читай: фонографе) эхо. Change также счастливо минуем - эта хрень зачем-то меняет местами правый и левый стереоканалы, в чем я особого смысла не вижу. Сразу переходим к более интересным штукам.

ВИНИЛОВЫЙ ДЖО

Знаешь, в чем прелесть старых кассетных магнитофонов? Они "тянут". Не лямку, конечно, но люди старше тридцати прекрасно помнят связанное с этим явлением волшебное слово "пасек". Лично мне это "пчелиное" понятие абсолютно ничего не говорит - полагаю, что его функцию здесь выполняет Flange. Сия фигня оперирует задержками, громкостью звука и прочей лабудой, чтобы ты мог имитировать, скажем, заезженную пластинку. Впрочем Flange не так уж и прост. Самое замечательное в нем это то, что он умеет микшировать низкие и высокие частоты. В Presets ты можешь наблюдать заранее приготовленные для тебя добрыми дядями суповые наборы параметров. Самым интересным здесь я считаю "Alien" - имитацию общепринятых представлений о музыке в старых фантастических фильмах. Основным значением, делающим погоду в этом эффекте, является Mix Volume - поставь его на нуль и получишь практически исходную композицию.

Mechanize - любимый инструмент всех начинающих Робокопов, сообщающих по телефону о минировании родной школы. Посредством этого эффекта мне удалось сделать достаточно реалистичный (применительно к фантастике) сэмпл, в точности повторяющий интонацию ED-209 из Робота-полицейского (ну, вы помните: "...You've got twenty seconds to comply!..").

Pitch - Очень полезная хреновина. Как человек, любящий хвастаться своим музыкальным образованием, спешу сообщить, что Pitch имеет прямое отношение к нотам, гаммам и октавам. Эта функция ГолдВейва повышает или понижает любой звук так, как это делают с нотами Midi-редакторы. И хотя Заратустра у нас вовсе не мидишный, а в MP3, смею утверждать, что и в этом случае изменить его тональность по всем правилам музыкальной школы - раз плюнуть. Сделать это можно двумя путями: на автомате и вручную. Автомат, в данном случае, это Scale. Если задаешь ему значение 0,5, то звукоряд упадет вниз на одну октаву - как видишь, здесь все просто. Для любителей же изврата в Pitch предусмотрена ручная коробка передач, а именно: Semitone и Fine Tune. Semitone двигает полутона в твоем музоне, то есть если бы у нас вместо Заратустры была только одна нота (b) ля, то Semitone на двойке сделал бы из нее си (одна нота - два полутона). Fine Tune же пытается смягчить переход между полутонами, а если конкретнее, то значение 50 сделает из bla - bla-диез. Вообще, его значения можно изменять от 0 до 99, так что, сам понимаешь, в музыкальной грамоте такая диезистость просто не может быть расписана - знаков на такой разброс просто еще не придумано. Да, и еще одна хрень: когда ты повышаешь/понижаешь тональность музыкального произведения, оно становится подобно виниловой пластинке, где повышение или понижение звука достигается путем соответствующего изменения в скорости прокрутки диска. Дабы длительность нашего нордического произведения не изменилась - ставь флажок на Preserve length. Алгоритм этой штуки работает так, что чем выше значения FTT size и Overlap, тем ближе к правильному соотношению звуков в новой тональности и прежней длительности произведения будет результат Pitch-а, но и тем дольше будут вестись расчеты. Оптимальное соотношение, конечно же, для каждого компа свое, но разработчики указывают на 9-11 для FTT size и 88 для Overlap.


Спецвыпуск Xakep, номер #027, стр. 027-100-3, ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

Midi (midi@mail.ru)

Спецвыпуск Xakep, номер #027, стр. 027-100-3

ХАЛДЕИ

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

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

Reverse - кстати об Африке...

Silence - общество слепоглухонемых.

Time Warp - затесался к челяди совершенно случайно. Представляет он собой набор трех разных методов для деформации длительности звучания композиции. Каждый со своими достоинствами и траблами. На всю тройку есть два общих параметра - Speed унд Time. Слово Speed говорит само за себя, выставляешь 0,5 - затормозишь немца ровно в два раза. Time - подход с другого конца, когда тебе нужно загнать музон в определенные временные рамки. Самая первая закладка также носит название Speed, и этот метод преобразования звука является самым быстрым, хотя и безвозвратно убивает исходный сэмпл. Закладка Similarity идет немного другим путем и юзает корреляцию, чтобы наложить друг на друга похожие куски звукоряда. Сия техника сохраняет исходную тональность звука и вроде бы неплоха для сохранения исходного качества голоса. В Similarity, также как и в Pitche-е, можно самому настроить качество выходного результата, настроив диапазон поиска подобных объектов. При этом надо будет дополнительно выставить еще два значения - Window Size и Search range. Если у тебя вместо Заратустры поет хор мальчиков-зайчиков, то ставь первому 30, а второму - 10. В случае же, если изменять фрицу ты не намерен, то выставляй, соответственно, 50 и 25. Последняя закладка - FFT (Fourier transforms). Метод Фурье изменяет плюс интерполирует спектральный анализ звукового сигнала, чем сохраняет исходную тональность, но может добавить в выходной файл разные баги и артефакты (читать голосом седовласого профессора :)). Хотя, в принципе, и с этим можно справиться - выставляй на максимум значения FFT size и Overlap и лови кайфу. Из всего вышеперечисленного можно сделать вывод, что если Pitch нужен для изменения тональности без изменения длительности мелодии, то Time - наоборот - для изменения времени звучания без переходов по полутонам.


Спецвыпуск Xakep, номер #027, стр. 027-100-4, ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

Midi (midi@mail.ru)

Спецвыпуск Xakep, номер #027, стр. 027-100-4

ГОЛОСИСТЕЕ И БАСИСТЕЕ

Как ты думаешь, что будет, если прийти на военную кафедру не в мешковатом дворницком камуфляже, а в чистом и опрятном обмундировании штурмовика SS, купленном на Арбате? Полагаю, что, в первую очередь, на порядок повысится количество матерных децибел, изрыгаемых глоткой герр прапора. Тем не менее есть шанс дать ему фору. Change volume - вот наш козырь. Отвлечемся на секунду от Заратустры и загрузим в ГолдВейве его земляка - первый попавшийся под руку немецкий марш. Выделяй самый агрессивный момент, жмакай Change volume и увеличивай громкость отрезка на 500%. После сих операций соединяй аудиокабелем звуковуху с музыкальным центром, переписывай получившийся марш на кассету и, сунув ее в старый ненужный диктофон, незаметно прячь в дуло танка на военке (или, в зависимости от вида войск, в боевой автомобиль ЗИС, пограничный пароход "Чижик", лифчик любимой учительницы...) Конечно, постоянно подобные безобразия нарушать не стоит, но и здоровое чувство юмора на службе ой как помогает. Поэтому "...Vivat die genze weldt!". (Да здравствует весь мир!)

РАДИО-D-J

После рекламной паузы продолжаем наш обзор эффектов ГолдВейва. Вдохнули - выдохнули.

Fade in и Fade out - все-таки этот ГолдВейв больше похож на Винамп, чем сам Винамп, разве что скинов нету. Что здесь надо помнить - так это то, что весь выделенный отрезок звукоряда будет играть по нарастающей, если Fade in доставить на нуль (с нуля начали - закончим на сотне), и, соответственно, затухать, если Fade out застолбить на 100.

Maximize - шмонает мелодию на предмет самого громкого звука и затем показывает RMS - абсолютное значение этого самого максимума; Maximum - относительный уровень громкости файла и время, когда звучит самый громкий звук. В Заратустре - это десятая с копейками секунда. С максимумом - все понятно, можешь им приглушить/прибавить звук, а вот RMS на кой хрен нужен? - спросишь ты. Оказывается, нужен. В основном - при записи нескольких самопальных мелодий на диск. Если хочешь, чтобы все они были примерно в одном и том же звуковом диапазоне - ставь всем одинаковый RMS.


Спецвыпуск Xakep, номер #027, стр. 027-100-5, ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

Midi (midi@mail.ru)

Спецвыпуск Xakep, номер #027, стр. 027-100-5

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

Я ВАМИ ДОВЕДЕН ДО ТОЧКИ СБОРКИ

Шум, гам, постреливают иногда... Это я про то, что у меня слышно за окном. Расскажу я вам, дети, небольшую историю. Захотелось мне когда-то в одном месте устроить дома звукозаписывающую студию, да такую, чтобы буржуйские медиамагнаты все обосрались. Начать решил с покупки микрофона. Динамического. Потом побежал за электретным. Потом понял, что, по всей видимости, вовсе не буржуи обосрутся... А все почему? Потому что писать звук нужно в абсолютно стерильных, с точки зрения звука, условиях. Певцы потому в студиях наушники и напяливают, чтобы ни один лишний звук не проскочил к микрофону, а тут... Так что придется килить излишний шум самостоятельно. Энергия ГолдВейва нам поможет! Щелкаем по Noise gate и начинаем разбираться. Во-первых, Attack time и Release time. Это, собственно, и есть допускаемые временные значения для пробега порций шума (в миллисекундах). Во-вторых, Threshold. Он отвечает за амплитуду шумовых колебаний - что выставишь, то и поймают. Последним остался Anticipation. Он здесь, по всей видимости, для красоты, поскольку мало на что влияет. Предоставляю тебе возможность самому дотумкать его предназначение. Примерно из той же серии - Noise reduction (уменьшение шума). Это если ты мазохист, но еще не совсем потерян для социума. Хотя уменьшай - не уменьшай, нейтрализуй - не нейтрализуй, все равно получишь...

Low/Highpass - обрубает низкие или высокие частоты. Фильтр рассчитан на оба типа. Герц тебе в помощь.

Bandpass/Stop - еще более конкретная вещь. Указываешь те частоты, которые надо пропускать или оставлять - от и до. Дешево и сердито.

Эквалайзер - ну, не мне же тебе объяснять... Винамп, мазафака :).

ИМЕНИ ЛОБАЧЕВСКОГО

Последнее, о чем хотелось бы рассказать, это Expression Evaluator. Своеобразный стеб над нотной тетрадкой, подразумевающий преобразование аудиоданных посредством алгебраических вычислений. Если абстрагироваться от самого уравнения, то для получения некоего результата надо задать значения нескольких переменных. Одна из них - t, то есть время (в секундах), другая - f - частота (соответственно, в герцах). В пресетах ты и сам потом покопаешься (ничего хорошего из этого не выйдет), а пока попробуем нагрузить Заратустру закорючками. Банальщина: wave(n)*2 - повышение громкости звукоряда ровнехонько в два раза. Пока все понятно? А тогда вот так: sin(2*pi*f*t)? Это эквивалентно выражению y = sin(2pft), то есть обычная синусоида. Пускай f=500 герц, t=2, p=3,14 (самый смешной анекдот из рассказанных мне математиками: Что такое пижонство? - Это многоженство при p в степени n :)). В итоге выходит число (около 0,34). Что с того? А примерно то же самое, что и при чтении ГолдВейвом текстового файла с одной буквой. Все переменные у нас постоянны, вот и выходит, что звук по форме и содержанию равняется гудку в телефонной трубке на 500 Hz (кстати, подобные телефонные гудки можно найти в пресетах). Другой результат получится, если вместо статичного уравнения использовать выражение, содержащее переменную wave(n) - эквивалент мелодии в алгебраическом выражении. Например, предлагаемый в пресете эффект тремоло, достигаемый с помощью выражения wave(n)*(0.6+0.4*sin(2*pi*f*t)), где f=4. Теперь данный эффект можно наблюдать на всем протяжении Also Speech Zaratustra, который теперь стал заметно дребезжать на поворотах.


Спецвыпуск Xakep, номер #027, стр. 027-100-6, ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

ГОНИМ ЗОЛОТУЮ ВОЛНУ: редактируем звук

Midi (midi@mail.ru)

Спецвыпуск Xakep, номер #027, стр. 027-100-6

ЗОЛОТАЯ ЛИХОРАДКА

Ну что сказать вам, москвичи (и гости столицы) на прощание? Я надеюсь, что мне удалось убедить тебя в том, что на свете существует достойная альтернатива Саунд Форжу. Конечно, во многом повторяющая его функции, но, во-первых, с кучей своих фишек, а во-вторых, еще не известно, кто был первым. Саунд Форж делает отдельная фирма с 1991 года при подмоге Microsoft. GoldWave сделал вообще один чел - канадец Chris Craig - хотя бы это, на мой взгляд, достойно уважения. Сделанный им звуковой редактор отлично подходит для решения всех насущных задач: монтаж, микширование, запись/редактирование своего собственного (or постороннего) музона или телефонные приколы. На винте ГолдВейв занимает 1,72 мега (против 7,32 у Sound Forge), да и вообще, нравится мне работать с ним. Желаю тебе того же.


Спецвыпуск Xakep, номер #027, стр. 027-104-1, TIPS OF FLASH: взмылим веревку!

TIPS OF FLASH: взмылим веревку!

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-104-1

Меня прибило на веревку. Короче, чел один кинул линк на флэшкодерз, а там симпатичная такая веревка драгается и дрыгается. А под рукой, как назло, ни одной swf вскрывалки... Это задело меня до глубины души, и я решил сделать сам.

И сделал: http://dembicki.narod.ru/fla/elastic_cord.swf Перед тем как читать дальше, сходи и посмотри на результат, подрагай веревку, посмотри на ее поведение. Хочешь такую же? Тогда поехали, а по ходу разберемся и со всякими полезностями.

ПОДГОТОВКА

Сначала прикинул, какую логику заюзали - вроде ничего сложного.

Перво-наперво нужно создать две кнопки и задать им instance name, а говоря по-русски, имя экземпляра. Называем первую "start_mc", вторую "end_mc" - без кавычек, естественно. Программно будем рисовать в отдельном мувике, зарегистрированном в классе. Создаем пустой мувик, задаем ему name и linkage name: "cord".

Итак, у нас на сцене две кнопки, а в библиотеке кнопка же и пустой залинкованный мув "cord".

TIPS 1

Лучше сразу намутить себе заготовку, а потом с нею работать.

Создадим класс. В первом кадре рута пишем:

CordClass = function () {

};

И сразу же регистрируем мувиклип "cord" в классе:

Object.registerClass("cord", CordClass);

TIPS 2

Да, да. Класс уже создан, и мы уже можем регистрировать на него объекты. Это так просто. Неважно, что он пустой.

Сейчас мы его будем наполнять. Оптом закидываем в прототип CordClass все функции мувиклипов.

TIPS 3

Чтобы не писать тучу лишних знаков, можно присвоить переменной "p" линк на прототип класса, в который и будем в дальнейшем помещать функции:

p = CordClass.prototype=new MovieClip();

Подготовительный этап пройден. Осталась мелочь - наполнить класс функциями.

УЗЛОВЫЕ ТОЧКИ

Наша веревка будет состоять из нескольких узловых точек, через которые будет рисоваться кривая линия. Эти точки будут создаваться один раз в момент аттача мувика "cord" на сцену. В нем будут жить. С ним и умрут. Количество этих точек определим в переменной num, установленной в прототипе класса:

p.num = 11;

TIPS 4

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

p.onLoad = function() {

this.arrMC = [_root.start_mc];

var mc, i = 1;

while (i<this.num-1) {

i++;

mc = this.createEmptyMovieClip("point"+i, i);

mc.lineStyle(0, 0, 100);

mc.moveTo(-5, 0), mc.lineTo(5, 0);

mc.moveTo(0, -5), mc.lineTo(0, 5);

this.arrMC.push(mc);

}

this.arrMC.push(_root.end_mc);

};

TIPS 5

Ты заметил, что мувики у нас не пустые? Сразу после их создания мы в них рисуем крестик. Это для того, чтобы в дальнейшем мы могли увидеть, где они находятся.

И после инициализации требуемых объектов было бы неплохо это посмотреть, но если попробовать:

_root.attachMovie("cord", "cord0", 0);

то увидим, кроме кнопок, только крестик в нулевой координате. Это потому, что все приаттаченные мувики встали в координату _х=0 и _у=0.

TIPS 6

Если заглянуть в листинг переменных, то увидим, что все что создавали, у нас имеется в наличии.


Спецвыпуск Xakep, номер #027, стр. 027-104-2, TIPS OF FLASH: взмылим веревку!

TIPS OF FLASH: взмылим веревку!

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-104-2

Здорово, но непонятно, зачем все эти точки. Разберемся, к чему мы стремимся. Разложим на простые составляющие поведение нашей веревки. Немного о физике происходящего: если повесить веревку за оба конца, какие силы будут на нее действовать? Естественно, сила тяжести, которая будет действовать на все точки веревки. Ей будет сопротивляться сила упругости. И поскольку любая веревка или ее часть имеет массу, то в динамике должна присутствовать инерция.

СИЛА УПРУГОСТИ

Сила упругости заставляет все точки веревки стремиться занять позицию точно между двумя соседними точками.

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

p.onEnterFrame = function() {

for (var i = 1; i<this.arrMC.length-1; i++) {

var s = this.arrMC[i-1];

var c = this.arrMC[i];

var e = this.arrMC[i+1];

c._x = (s._x+e._x)/2;

c._y = (s._y+e._y)/2;

}

};

А вот теперь можно и тестануть, предварительно приаттачив мувик "cord":

_root.attachMovie("cord", "cord0", 0);

Только кнопки-то еще не драгаются.

TIPS 7

Drug&Drop делаем так:

_root.start_mc.onPress = _root.end_mc.onPress=startDrag;

_root.start_mc.onRelease = _root.end_mc.onRelease=stopDrag;

Тестанем еще раз. Теперь все в порядке. Кнопки драгаются, точки встают в позицию.

TIPS 8

Чтобы лучше понять, как все пашет, поиграйся со скриптом, попробуй поменять значение переменной this.num на событии onLoad и посмотри, что из этого выйдет. Не увлекайся большими числами - тормоза включатся довольно рано.

TIPS 9

Уже на базе этого скрипта можно придумать какие-нибудь эффекты. Вместо рисования крестика приаттачь какой-нибудь интересный объект с анимацией. Например, смотри известный исходник Антона Волкова: http://steelcrown.com/ru/interesting/lab/titans/

ГРАВИТАЦИЯ

Сила тяжести будет тащить любую точку веревки вниз. Но ей будет противостоять сила упругости. Точка равновесия этих сил будет находиться ниже среднеарифметического значения координаты двух соседних точек. То есть нам достаточно прибавить к _у координате каждой точки некое число.

TIPS 10

Это число для последующего программного изменения лучше поместить в переменную в классе. Вот так:

p.weight = 3;

Тогда строка

c._y = (s._y+e._y)/2;

будет выглядеть так:

c._y = (s._y+e._y)/2+this.weight;

Вот мы и добавили фактор гравитации. Как все просто! Тестани!

ЭЛАСТИКА

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

Чтобы в этом разобраться, давай сохраним наш проект и откроем новый. Делаем мувик, рисуем в нем симпатичный шарик, задаем ему имя экземпляра "my_mc" и в первом кадре рута напишем:

_root.my_mc.damp = 0.9


Спецвыпуск Xakep, номер #027, стр. 027-104-3, TIPS OF FLASH: взмылим веревку!

TIPS OF FLASH: взмылим веревку!

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-104-3

_root.my_mc.onEnterFrame = function() {

this.accel_x = (this.target_x-this._x)/5;

this.accel_y = (this.target_y-this._y)/5;

this.speed_x = (this.speed_x+this.accel_x)*this.damp;

this.speed_y = (this.speed_y+this.accel_y)*this.damp;

this._x += this.speed_x;

this._y += this.speed_y;

};

_root.my_mc.onMouseDown = function() {

this.target_x = _root._xmouse;

this.target_y = _root._ymouse;

};

Значения переменных в "эластичном" скрипте

Тестани. На клик шарик будет устремляться на установленную ему цель. В расчете участвуют переменные: target (цель), accel (ускорение), speed (скорость) и константа damp (затухание). Причем на каждое измерение собственная переменная.

При установке переменной target мы первым делом вычисляем ускорение, которое составит одну пятую часть расстояния между мувиком и целью. Затем к скорости прибавляем ускорение, но тут же чуток прибиваем затуханием. После вычисления скорости изменяем координаты объекта на значение скорости.

TIPS 11

То же самое можно написать гораздо короче:

_root.my_mc.onEnterFrame = function() {

this._x += this.speed_x=(this.speed_x+(this.target_x-this._x)/5)*this.damp;

this._y += this.speed_y=(this.speed_y+(this.target_y-this._y)/5)*this.damp;

};

Именно этот вариант и будем юзать в нашем скрипте.

Вернемся к веревке и привяжемся с эластичностью к узловым мувиклипам. Значения, которые мы рассчитали для позиции узловых точек, теперь будем применять иначе: они станут значениями цели - target для них. Эластику можем повесить каждому мувику на событие enterFrame, но лучше рассчитывать все в одном месте во избежание торррмозззов.

Добавим в класс переменную затухания:

p.damp = 0.9;

Оформим расчет эластичной позиции в одной функции в классе:

p.update = function(prev_mc, next_mc, damp) {

var y = (prev_mc._y+next_mc._y+this._parent.weight)/2;

var x = (prev_mc._x+next_mc._x)/2;

this._x += this.sx=(this.sx+(x-this._x)/5)*damp;

this._y += this.sy=(this.sy+(y-this._y)/5)*damp;

};

А на onEnterFrame применим функцию ко всем узловым мувикам, передав в аргументах предыдущий и следующий мувик в массиве и значение затухания.

p.onEnterFrame = function() {

for (var i = 1; i<this.arrMC.length-1; i++) {

this.update.apply(this.arrMC[i], [this.arrMC[i-1], this.arrMC[i+1], this.damp]);

}

};

Потесть. Уже похоже! Осталось только нарисовать веревку.

ВЕРЕВКА И МЫЛО

Для начала просто соединим все точки массива прямыми линиями:

p.onEnterFrame = function() {

this.clear();

this.lineStyle(0, 0, 100);

this.moveTo(this.arrMC[0]._x, this.arrMC[0]._y);

for (var i = 1; i<this.arrMC.length-1; i++) {

this.update.apply(this.arrMC[i], [this.arrMC[i-1], this.arrMC[i+1], this.damp]);

this.lineTo(this.arrMC[i]._x, this.arrMC[i]._y);

}

this.lineTo(this.arrMC[i]._x, this.arrMC[i]._y);

};

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

Есть три узловые точки (на рисунке 1, 3, 5), соединенные гладкой кривой. Кривая эта будет гладкой только до тех пор, пока точки 2, 4 и узловая точка 3 будут находиться на одной прямой. Как только одна из точек сместится с этой прямой, тут же образуется угол. А этого мы должны избежать.


Спецвыпуск Xakep, номер #027, стр. 027-104-4, TIPS OF FLASH: взмылим веревку!

TIPS OF FLASH: взмылим веревку!

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-104-4

Поэтому поступим так: первой точкой всегда будет стартовая кнопка, что соответствует узловой точке 1 на рисунке. Следующий за стартовой точкой мувик в массиве, а именно arrMC[1], будет контрольной точкой безье, что соответствует точке 2 на рисунке. Третью точку мы вычислим, она будет посередине между arrMC[1] и arrMC[2]. В следующем проходе цикла третья точка станет первой, второй точкой станет arrMC[2], и третью точку мы опять вычислим как среднее арифметическое контрольных точек. И так последовательно просчитаем всю веревку.

Вот как это выглядит:

p.clr = 0xFF0000;

p.onEnterFrame = function() {

for (var i = 1; i<this.arrMC.length-1; i++) {

this.update.apply(this.arrMC[i], [this.arrMC[i-1], this.arrMC[i+1], this.damp]);

}

this.clear();

this.lineStyle(5, this.clr, 100);

this.moveTo(this.arrMC[0]._x, this.arrMC[0]._y);

for (var i = 1; i<this.arrMC.length-1; i++) {

var cx = (this.arrMC[i]._x+this.arrMC[i+1]._x)/2;

var cy = (this.arrMC[i]._y+this.arrMC[i+1]._y)/2;

this.curveTo(this.arrMC[i]._x, this.arrMC[i]._y, cx, cy);

}

this.lineTo(this.arrMC[i]._x, this.arrMC[i]._y);

};

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

Юзать нашу веревку вообще просто. Значения веса, количества узловых точек цвета и затухания у нас сидят в прототипе класса. Смело меняй их как хочешь. Например, так:

_root.attachMovie("cord", "cord1", 1, {num:5, damp:0.87, weight:5, clr:0xFF00FF});

Если у тебя что-то не получится, то пиши или сходи на http://dembicki@narod.ru/tutor/cord.html


Спецвыпуск Xakep, номер #027, стр. 027-106-1, TIPS OF THE WEB - Запугивание до заикания

TIPS OF THE WEB - Запугивание до заикания

Sevranty

Спецвыпуск Xakep, номер #027, стр. 027-106-1

(sevranty@deepdesign.ru, vsevolod.deepdesign.ru)

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

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

TIPSA 1. Как почекать браузер?

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

<script LANGUAGE="JavaScript">

<!--

var ver = navigator.appVersion;

if (ver.indexOf("MSIE") != -1)

{

window.location.href="ie.html"

} else

window.location.href="bye.html"

-->

</script>

Это переводится так: получаем версию браузера; если это наш любимый и дырявый ослик ИЕ, то мы радуемся и переходим на страницу ie.html; если не ослик ИЕ, то прощаемся и посылаем ламера... куда? Конечно, на страницу bye.html с ласковым прощанием. Теперь про тех, кто в танке (не на ослике), забываем и больше не паримся.

TIPSA 2. Как убить контролзы?

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

<script>

var windowW=screen.width // wide

var windowH=screen.height // high

var windowX = 0 // from left

var windowY = 0 // from top

var urlPop = "fullscreen.html"

var title = "SYSTEM busy"

var autoclose = false

s = "width="+windowW+",height="+windowH;

var beIE = document.all?true:false

function openFrameless(){

if (beIE){

NFW = window.open("","popFrameless","fullscreen,"+s)

NFW.blur()

window.focus()

NFW.resizeTo(windowW,windowH)

NFW.moveTo(windowX,windowY)

var frameString=""+

"<html>"+

"<head>"+

"<title>"+title+"</title>"+

"</head>"+

"<frameset rows='*,0' framespacing=0 border=0 frameborder=0>"+

"<frame name='top' src='"+urlPop+"' scrolling=no>"+

"<frame name='bottom' src='cmd_load.html' scrolling='no'>"+

"</frameset>"+

"</html>"

NFW.document.open();

NFW.document.write(frameString)

NFW.document.close()

} else {

NFW=window.open(urlPop,"popFrameless","scrollbars,"+s)

NFW.blur()

window.focus()

NFW.resizeTo(windowW,windowH)

NFW.moveTo(windowX,windowY)

}

NFW.focus()

if (autoclose){

window.onunload = function(){NFW.close()}

}

}

</script>

Коротко описать можно так: снимаем размеры экрана, указываем, какой мы файл открываем (fullscreen.html) в полном окне и другие параметры окна. Далее страхуемся от ребят, которые с упорством маньяка пытаются залезть не на ослике, и во весь экран открываем наш файл. Заодно у нас открывается еще и файл cmd_load.html (он понадобится потом). В нем мы загружаем необходимые нам графические файлы, чтобы ИЕ их закешировал и не грузил их больше, это нам снимет проблему постепенной подгрузки изображений. И теперь при загрузке ословой страницы ie.html на событие OnLoad вешаем запуск нашего скриптика.


Спецвыпуск Xakep, номер #027, стр. 027-106-2, TIPS OF THE WEB - Запугивание до заикания

TIPS OF THE WEB - Запугивание до заикания

Sevranty

Спецвыпуск Xakep, номер #027, стр. 027-106-2

<body onload="javascript:openFrameless();">

TIPSA 3. Вопрос с подколкой

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

<Script>

function warp()

{var ok=confirm('Для перевалидации системного реестра нажмите "OK".' +

'Если Вы хотите пропустить валидацию и перейти к фрагментации, нажмите "Cancel"')

if(ok)

location="cmd.html"

else

location="cmd.html"}

</Script>

и запускаем его событием OnLoad, а заодно передаем данному окну фокус:

<body onload="JavaScript:warp();top.window.focus();">

Чем страшнее и непонятнее вопрос, тем лучше. Я в ностальгии по DOS'у написал такой текст: "Для перевалидации системного реестра нажмите "OK". Если Вы хотите пропустить валидацию и перейти к фрагментации, нажмите "Cancel"". Независимо от ответа отправляем его смотреть наше действо в файл cmd.html.

TIPSA 4. Мерцаем фоном

Здесь, в файле cmd.html, у нас для бедного чела уже готово в хедере мерцание фона; на всякий случай, чтобы не загипнотизировать лузера, мы остановимся на градациях серого.

<SCRIPT LANGUAGE="JavaScript">

function setbackground()

{

window.setTimeout( "setbackground()", 100); // 100 milliseconds delay

var index = Math.round(Math.random() * 6);

var ColorValue = "FFFFFF"; // default color - white (index = 0)

if(index == 1)

ColorValue = "CCCCCC";

if(index == 2)

ColorValue = "999999";

if(index == 3)

ColorValue = "666666";

if(index == 4)

ColorValue = "333333";

if(index == 5)

ColorValue = "FFFFFF";

if(index == 6)

ColorValue = "000000";

document.bgColor=ColorValue;

}

</SCRIPT>

Это мерцание мы делаем челу, чтобы он забыл о своем рабочем столе и у него устали глазюки.

TIPSA 5. Детонатор

В этом же файле уже готов в хеадере скрипт для инициации постепенного вывода а-ля DOS на экран.

<script language="JavaScript">

var layerRef="null", styleSwitch="null";

function init() {

if (navigator.appName == "Netscape") {

layerRef="document.layers";

styleSwitch="";

} else {

layerRef="document.all";

styleSwitch=".style";

}

}

function hideLayer(layerName) {

eval(layerRef+'["'+layerName+'"]'+styleSwitch+'.visibility="hidden"');

}

function showLayer(layerName) {

eval(layerRef+'["'+layerName+'"]'+styleSwitch+'.visibility="visible"');

}

</script>

Теперь, когда это все готово, инициируем эту мутень из события OnLoad в тэге BODY:

<body onload="JavaScript:setbackground();top.window.focus()">

TIPSA 6. Дурилка интерфейсная

Чтобы совсем обмануть юзера ушастого, делаем скриншот Command Prompt в винде. Подчищаем и нарезаем в "Фотошопе" данный скриншот, публикуем его и делаем красивую страниЦку (для ленивых: готовые, нарезанные макетики Command Prompt & Internet Explorer можешь скачать вместе со всеми исходниками здесь: http://vsevolod.deepdesign.ru/m-xakep-001.php). В окошко а-ля Command Prompt мы вставляем несколько дивов, в нашем случае 12 штюк :).


Спецвыпуск Xakep, номер #027, стр. 027-106-3, TIPS OF THE WEB - Запугивание до заикания

TIPS OF THE WEB - Запугивание до заикания

Sevranty

Спецвыпуск Xakep, номер #027, стр. 027-106-3

<div id="obj1">Microsoft Windows<br>(C) Copyright 1985-2000 Microsoft Corp. </div><br>

<div id="obj2">C:\><b>HELP</b> app</div><br>

О третьем расскажу позже, он у нас будет отвечать за получение информации о посетителе.

<div id="obj4">C:\><b>debug.com</b> /g /f >> command.com << no_way.bat</div>

<div id="obj5">++++++++++++++++++++++++++++++++++++++++++++++ write ok.</div>

<div id="obj6">++++++++++++++++++++++++++++++++++++++++++++++ write ok.</div>

<div id="obj7">++++++++++++++++++++++++++++++++++++++++++++++ write ok.</div>

<div id="obj8">++++++++++ <b>§_Ґ¤·</b></div>

<div id="obj9">Bad sector.</div>

<div id="obj10">Program terminate.</div>

<div id="obj11"><b>debug done with errors</b></div>

<div id="obj12">errorcode 14.</div>

TIPSA 7. Невидимость!

Дивы будут появляться по очереди, имитируя выполнение команд, и чем правдоподобнее будет интерфейс, тем больший будет эффект. Уникальный ID div'а мы зададим стилем в хеадере файла, и по умолчанию все 12 дивов невидимы.

<style type="text/css">

<!--

body, td {font-family: "Lucida Console", "Courier New", Lucida Console, Courier New, Courier, monospace; font-size: 13px;}

#obj1 {VISIBILITY: hidden;}

#obj2 {VISIBILITY: hidden;}

#obj3 {VISIBILITY: hidden;}

и так до 12

#obj12 {VISIBILITY: hidden;}

-->

</style>

После того как ты это все задал, займемся изобретением текста, который выдают нам команды.

TIPSA 8. Мы знаем все!

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

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

<div id="obj3">

<Script Language="JavaScript">

var name = navigator.appName;

var vers = navigator.appVersion;

var code = navigator.appCodeName;

var platform = navigator.platform;

document.write('Броузер: ' + name +

'<br>Версия броузера: ' + vers +

'<br>Кодовое название броузера: ' + code +

'<br>Платформа: ' + platform);

</Script>

</div><br>

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

TIPSA 9. Выводим текст постепенно

Теперь нам надо заставить выводиться их по очереди, для этого есть setTimeout. Пишем перед закрывающим тэгом боди такой скриптик:

<script language="JavaScript">

init();

setTimeout("showLayer('obj1')",500);

setTimeout("showLayer('obj2')",1500);

setTimeout("showLayer('obj3')",1800);

setTimeout("showLayer('obj4')",6000);

setTimeout("showLayer('obj5')",6500);

setTimeout("showLayer('obj6')",7000);

setTimeout("showLayer('obj7')",7500);

setTimeout("showLayer('obj8')",8000);

setTimeout("showLayer('obj9')",10000);

setTimeout("showLayer('obj10')",11000);

setTimeout("showLayer('obj11')",12000);

setTimeout("showLayer('obj12')",13000);

</script>

И еще 500 миллисекунд - это 0.5 секунды. А теперь сохраняем эти все файлы и в путь! Запугаем всех до полусмерти >:]!


Спецвыпуск Xakep, номер #027, стр. 027-108-1, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-1

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

Иллюминатор был справа. Ему повезло (или нет?!) видеть, как самолет закладывает вираж над городом («Уши тоже закладывает... А какая разница в смысле!»). Край крыла мелко вибрировал (Тихонов вспомнил, как в детстве, летая самолетами к бабушке в Ростов, всегда показывал отцу на трясущееся крыло и просто требовал ответа - а что будет, если...). Соседи по ряду сидели, как и было приказано, согнувшись и укрыв голову руками. Крики в салоне казались оглохшему Тихонову очень далекими; по проходу прошел один из этих гадов с автоматом, выкрикивая что-то на своем языке. Когда он поравнялся с Тихоновым и увидел, что тот спокойно смотрит в окно, не выполняя приказа, то закричал еще громче, привлекая внимания второго такого же урода с пистолетом.

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

11 сентября 2001 года стремительно проносилось вместе с ним по небу Нью-Йорка, сокращая расстояние до девяносто первого этажа с каждой секундой...

**********

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

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


Спецвыпуск Xakep, номер #027, стр. 027-108-2, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-2

Звонок был, как всегда, чертовски предсказуем и в то же время крайне неожиданен. Этот мерзкий звук Тихонов слышал уже шесть лет - ровно столько, сколько работал дежурантом в хирургическом отделении городской больницы. Со словами «Ну вот, поспал, мать его...» он подскочил как ужаленный и, босиком пробежав через кабинет, поднял трубку:

- Тихонов... - пересохшими от обезвоженного калорифером воздуха губами прохрипел он, сам от себя не ожидая подобного тембра голоса. На том конце возникла пауза - видимо, там тоже сначала не поняли, с кем имеют дело:

- Сергей Алексеевич?.. Это вы?

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

- Сергей Алексеевич, тут позвонили... Короче, везут, надо вам срочно... Огнестрельное...

- Куда? (А в голове сразу: «Только бы не в грудь и не в живот...»)

- Я пока не поняла... Они просят реанимацию и операционную!

...Фельдшерица, подгоняя четырех солдат, вытаскивающих носилки из залитой кровью «санитарки», на бегу рассказывала Тихонову, задыхаясь от волнения:

- Они пулемет... Ставили на танк... Сломалось что-то, так они... Сняли, часа три возились, а потом... А он обратно никак не... Короче, он двумя руками взялся за ствол, к животу... А кто-то толкнул... Там на спине... А входное в проекции печени...

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

На разрезе - простреленные печень и правая почка, снесена напрочь вся поясничная область («Вот так пулеметный патрон!» - подумал про себя Сергей, заталкивая в брюхо полотенце, мгновенно пропитывающееся кровью); анестезиолог пытался быстро прикинуть кровопотерю и объем переливания, санитарка не успевала выносить окровавленное белье, операционная сестра на ходу натягивала перчатки... Все были при деле, но дело обещало оказаться бесперспективным.

Через двадцать минут все уже было кончено; Тихонов медленно стянул с себя перчатки, швырнул их в сердцах в таз и только потом заметил, что рукава халата по локоть багровые от крови. Ассистент, молодой хирург-практикант, положив стерильные еще пока руки на труп, ждал разрешения отойти от стола. Тихонов понял его, кивнул; парень сделал несколько шагов в сторону, присел на подоконник. Было хорошо видно, что его изрядно трясет; даже маска не могла скрыть, как широко он зевает, что говорило о сильном эмоциональном перенапряжении.

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

- Выкатите в коридор, когда машина подойдет... - попросил сестер Тихонов и пошел переодеваться...


Спецвыпуск Xakep, номер #027, стр. 027-108-3, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-3

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

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

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

Сигарета кончилось на удивление быстро, Тихонов не замечал, что делал очень сильные глубокие затяжки. Взглянул на часы - до смены осталось около двух часов. Ночь была темной, морозной. Тихонов задумался - какого черта им понадобилось заниматься с пулеметом в такое время? Кто из них за секунду до выстрела знал, что сейчас прервется чья-то жизнь? И почему?..

**********

От: MailList.ru. Кому: MailList list45309 Subscriber.

Тема: «Faces of the Death - 114».

«В прошлом выпуске нашей рассылки мы обсуждали тему СМЫСЛА СМЕРТИ. Обычно все люди пытаются найти смысл в прямо противоположном явлении - в жизни. Мне лично кажется, что это достаточно бестолковое занятие - найти его в столь однообразном явлении, как жизнь. Вот СМЕРТЬ - насколько она интересна сама по себе, сколько видов имеет, какую глубокую нагрузку несет!..

Я получил много откликов на свое рассуждение - хоть и краткое, довольно путанное, но, тем не менее, несущее в себе некое рациональное зерно. Отклики разнообразны - от осуждающих до откровенно подхалимских, восхваляющих мою концепцию. Это порадовало меня, вашего покорного слугу. Но больше всего вдохновило меня само количество этих откликов, мнений и суждений. Примерно три с половиной тысячи писем я получил на свой майл, еще около девятисот человек пытались связаться со мной по ICQ. Я рад, что наша аудитория разрастается, что в диалог вовлекаются новые люди. Сегодня мы с вами продолжим разговор...»

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


Спецвыпуск Xakep, номер #027, стр. 027-108-4, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-4

- ...Мое мнение... не совпадает... Там надо... Вы сами видели когда-нибудь... Нельзя об этом говорить, как... Хочу поделиться с вами и всей аудиторией форума...

Еще через несколько минут письмо было окончено. Тихонов облизал пересохшие губы и нажал «Send».

**********

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

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

Он ловил себя на мысли, что постоянно вспоминает этого безвременно ушедшего молодого парня. Сергей успел разглядеть черты его лица, прежде чем оно изменилось до неузнаваемости гримасой боли и не скрылось под маской анестезиолога. У него была родинка на правой (на правой ли?..) щеке, такая маленькая, какая-то детская...

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

- Межгород, - глупо пошутил сам с собой Тихонов и обреченно поднял трубку.

...Спустя два часа, стоя на крыльце хирургического корпуса с сигаретой, он даже забывал затягиваться - настолько все было неестественно, глупо! Молодой парень, курсант, вступился за свою девушку на дискотеке и получил ножом в бедро. Жизнь вытекала из него вместе с кровью через раненую бедренную артерию; «Скорая» просто опоздала, все старания Тихонова по остановке кровотечения ни к чему не привели. Мальчишка умер на столе от кровопотери, не совместимой с жизнью. Двадцать один год, сын начальника училища, впереди была вся жизнь!

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

- Отличник... Николай всегда был на хорошем счету у преподавателей, и не потому что его отец командовал ими... Как же так...

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


Спецвыпуск Xakep, номер #027, стр. 027-108-5, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-5

Опять за окном рыкнул стареньким мотором санитарный «УАЗик», увозя тело пацана; опять тягостно было на душе от неотвратимости случившегося. В очередной раз Тихонов склонил голову перед тем, что у врача не все и не всегда получается так, как хотелось бы. Он вернулся в кабинет, потревожив задремавшего начмеда скрипом двери, открыл холодильник и налил себе в освободившийся стакан на треть.

Стакан холодил руку. Сергей поднял его на уровень глаз, покрутил, разглядывая эту отраву через грани.

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

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

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

Надеялся в глубине души и Тихонов. Но что-то сломалось в нем за эти три дня, через две смерти. И он не мог заснуть, не мог заглушить боль алкоголем, не мог молчать. Очень хотелось с кем-нибудь поговорить...

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

Тихонов посмотрел на часы - до смены еще далеко. Он вытащил из дипломата ноутбук, немного поколдовал с телефонной розеткой, подключился...

*********

От: MailList.ru. Кому: MailList list45309 Subscriber.

Тема: «Faces of the Death - 115».

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

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


Спецвыпуск Xakep, номер #027, стр. 027-108-6, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-6

Сегодня я хочу немного развить тему неотвратимости смерти - как непременной части жизни. Напомните себе - испытывали ли вы хоть раз горечь утраты? Если нет, то сегодня вам нет смысла читать дальше, лучше будет отвлечься, заняться чем-нибудь на досуге в ожидании следующего моего монолога. Тем же, кто уже прошел через это хотя бы единожды, - им я рекомендую внимательно изучить мои постулаты...»

**********

...Тихонов медленно водил глазами по экрану, удовлетворенно кивая в некоторых местах, наиболее близких его пониманию проблемы - тому пониманию, которое родилось именно сегодня. Рассылку «Лики смерти» он получал недавно, со 104 выпуска; он уже не помнил, на каком сайте нашел ее, почему решил подписаться, но читал всегда с нескрываемым интересом. Как врача, его всегда интересовали подобные парамедицинские темы - на этот раз монологи автора, именующего себя просто «Некрос», попали на подготовленную почву.

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

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

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

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

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

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

Обнаружив в Интернете сайт «www.necros.com», он решил осмотреть его тщательнее, чем обычно поступал с подобными ресурсами, носящими громкие имена. Содержание неожиданно оказалось занимательным, администратор сайта неплохо потрудился, собирая в одну большую упорядоченную кучу все, что в этом мире относилось к смерти, - способы самоубийств, фото смертников, хронологию различных катастроф и стихийных бедствий, сопровождавшихся массовой гибелью людей, мнения тех, кто вернулся «оттуда», пережив клиническую смерть. И Тихонов не заметил, как втянулся. Он посещал этот сайт ежедневно, почерпывая все новые и новые сведения о том, что относилось к самой мрачной стороне существования.


Спецвыпуск Xakep, номер #027, стр. 027-108-7, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-7

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

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

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

Их последующий диалог с «Некросом» был следующим:

Тихонов: «Очень трудно обозначить «подходящий» момент - но зато практически всегда можно определить несвоевременность случившегося».

«Некрос»: «Обоснуйте».

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

«Некрос»: «А если бы человек остался жить - но не сделал бы ничего из того, что хотелось бы нам с вами?»

Тихонов: «Почему нам?»

«Некрос»: «А как же? Ведь это именно мы считаем, что он просто обязан был выполнить некие планы на ближайшую половину жизни, - мы, а не он. Вполне возможно, что он сам за полчаса до гибели посчитал свою жизнь сделанной на все сто процентов, что больше нечего желать и пробовать, некого любить, не о чем сожалеть. Разве вы сами никогда не замечали за собой подобных выводов? Обычно это случается во время каких-либо крупных неудач, постарайтесь вспомнить, и вы поймете, что я прав»...


Спецвыпуск Xakep, номер #027, стр. 027-108-8, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-8

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

- Я не согласен, - сказал он сам себе. Тот диалог из коротких писем, происшедший около двух недель назад, сейчас всплыл в памяти Тихонова именно потому, что термин «несвоевременность» привязывался абсолютно четко к обоим погибшим за три дня парням. Сергею очень захотелось возобновить общение с «Некросом» один на один; двое суток назад он уже отправил ему письмо с комментариями по поводу последних рассылок, в которых его далекий собеседник уходил куда-то в сторону Великого Разума и готов был просто сорваться в религию.

Так и сложилось очередное письмо «Некросу» - в короткую фразу «Я НЕ СОГЛАСЕН»...

*******

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

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

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

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

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


Спецвыпуск Xakep, номер #027, стр. 027-108-9, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-9

Удар железа о железо; потом хруст стекла; еще один женский крик. И только после всего этого - звон бьющейся об асфальт стеклянной банки.

Прошло полторы-две секунды. Тихонову показалось, что у него остановилось сердце. Ему очень захотелось вдохнуть - глубоко-глубоко. И в эту секунду ему под ноги неизвестно откуда упал мужчина.

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

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

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

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

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

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


Спецвыпуск Xakep, номер #027, стр. 027-108-10, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-10

ЭТО БЫЛО УЖЕ СЛИШКОМ. Это просто не могло быть правдой. Сбывались все его страхи и переживания; его жизнь оказалась наполненной «несвоевременными» смертями. Человек, несущий домой три литра пива, не думал о том, чтобы расстаться с жизнью, - у него было не выполнено как минимум одно дело, ради которого стоило пожить еще немного. Все-таки три литра - это три литра...

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

*********

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

Сейчас он мало чем отличался от водителя «Жигулей», сбившего пешехода. Его жизнь тоже сломалась на самой середине, сломалась неотвратимо, жестоко, будто проверяя Тихонова на прочность. Его взгляды на жизнь и смерть изменились кардинально - в данный момент он даже не представлял, что может произойти в следующую секунду с ним самим, как распорядится судьба с его мечтами и планами.

- Только бы не со мной... Нет... Только не со мной, - шептал он, стоя у задернутого шторами окна. - Мы не защищены... Никто.

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

- Нет! - закричал Тихонов, дергая штору; струна карниза жалобно пискнула, и половина роскошной портьеры провисла почти на метр. - Я буду жить! ВЕЧНО!

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


Спецвыпуск Xakep, номер #027, стр. 027-108-11, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-11

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

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

Тихонов стукнул кулаком по столу и свалил бутылку. Холодная прозрачная жидкость стала, булькая, вытекать на стол. Сергей прищурил глаза и смахнул бутылку на пол; «Флагман» улетел куда-то в угол и не разбился.

- Если Некрос мне не ответит сегодня на все вопросы - я...

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

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

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

«Нет сигнала в линии». Если бы компьютер мог, он бы приписал: «Отключен за неуплату». Тихонов уныло ткнул в иконку «Оперы», появилось сообщение «Сервер не найден». Выпятив губу, Сергей тихонько выругался, прошелся «мышкой» по меню, открыл «Избранное», отметив про себя на видном месте адрес «Некроса», нажал «ALT» и F4...

Но окно и не думало закрываться. Сколько Тихонов не нажимал на крестик в углу, сколько не пытался зайти через «черный ход» и выключить зависшее приложение с помощью диспетчера задач - ничего не помогало. Но окончательно вывело Сергея из равновесия то, что даже «Reset» не перезагружала компьютер. Он несколько раз нажал заветную кнопку и пришел к неутешительному выводу, что ноутбук скоро прикажет долго жить.

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

Сергей сложил руки на груди. Мигание огоньков на модеме притягивало взгляд. Он поймал себя на мысли, что до боли стискивает зубы; губы стянулись в тонкую жесткую линию. Скулы заныли от напряжения. Состояние Тихонова напоминало сейчас предстартовую готовность спринтера. Он помассировал ладонями веки, с силой нажал на глазные яблоки - до появления перед глазами розово-зеленых пятен, после чего решительно опустил руки на клавиатуру и, не прибегая к помощи «Избранного», набрал в адресной строке привычный адрес - www.necros.com.


Спецвыпуск Xakep, номер #027, стр. 027-108-12, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-12

Уже через несколько секунд перед ним распахнулось окно - но не привычное, с логотипом «Некроса» и эпиграфом на латыни (что-то из «Божественной комедии», как понял, впервые встретившись с этим сайтом, Тихонов; - все, что он разобрал там, так это подпись автора - Данте Алигьери). Перед ним открылся «Гостевой вход для подписчика 45309» - на черном фоне только этот заголовок и кнопка «Enter». Номер принадлежал Тихонову; Сергей, недолго думая, нажал кнопку.

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

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

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

«...За последние 72 часа вы пережили 3 чужих смерти. Две из них - по долгу службы, последнюю - по воле случая. Прошу Вас забыть на время мои рассуждения о смысле жизни и смерти, носящие условно-философский характер, - толку в них всегда было мало, а вот итог оказался более чем удачным. Все 115 рассылок имели под собой одну-единственную задачу - найти Вас. И мне это удалось. Я смог-таки из десятков тысяч человек выделить одну ЛИЧНОСТЬ, способную испытывать сильные эмоциональные переживания. Ваши письма были тщательно проанализированы; по данным исследования были смоделированы три пройденных вами ситуации. Результат превзошел все ожидания...»

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

«...Вы единственный человек, сумевший отреагировать на происходящее в полном соответствии с условиями задачи. Вы переживали смерть посторонних для вас людей как нечто, случившееся с вами или вашими близкими людьми. Вы единственный, кто сумел испугаться и проникнуться этим страхом по-настоящему. Но это не все. Людей, испытывающих страх перед смертью, девяносто девять из ста. Вы же - один из пятнадцати тысяч восьмисот человек (размер нашей выборки), решивший жить ВЕЧНО; вы единственный, кто не заключил договора со смертью, кто не закрыл на нее глаза. И поэтому Вы сейчас читаете эти строки...»


Спецвыпуск Xakep, номер #027, стр. 027-108-13, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-13

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

«Вам - избранному (не только из 15 тысяч человек, нет - из всех живущих на Земле) - дается шанс. ВАМ ПРЕДЛАГАЕТСЯ ПОБЕДИТЬ СМЕРТЬ. К сожалению, не свою собственную - этого не дано. Вы сможете спасать жизни других людей - как и когда это будет происходить, мы сможем обсудить в следующий раз, да Вы и сами все поймете. Когда-нибудь судьба отмерит срок и Вам - но, надеюсь, к тому времени кто-нибудь другой (может быть, я сам) сможет спасти Вас. Когда в следующий раз вам придется взглянуть в глаза умирающему - все будет в Вашей власти. Если вы согласны - загрузите с этой страницы файл, отмеченный в конце страницы золотой звездочкой, и запустите его на своем компьютере, внимательно следуя указаниям на экране. О результатах я узнаю, можете за это не переживать...»

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

«Надеюсь, что Вы останетесь довольны. Не переусердствуйте в своем желании помочь - даже в том новом качестве Вы все равно будете не всесильны. Если станет трудно - перечитайте «Зеленую милю» Стивена Кинга.

Respect Yourself. Necros»

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

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

Его ослабнувшее тело, не удержавшись на стуле, поползло вбок; рука, не выпуская мышку, рефлекторно ухватилась за нее, словно этот маленький хвостатый предмет мог чем-то помочь; как всякий врач, теряя сознание, успел подумать: «И никого рядом нет...»

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


Спецвыпуск Xakep, номер #027, стр. 027-108-14, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-14

Сергей, тихо постанывая, лежал рядом с компьютером, прижавшись щекой к ковру. На экране компьютера появилось сообщение: «Complete. I'm sorry...»

********

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

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

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

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

Тихонов сидел в неизвестной ему машине; его руки сжимали полированный руль из красного дерева, схваченный в середине красивой, зеркально сияющей центральной гайкой с эмблемой «Мерседеса». А потом понял, что стрелка спидометра лежит где-то у правой границы, возле 240 километров в час. С каждым метром, который пролетал стремительный «Мерс», он становился другим человеком - вот Сергей понял, что он в машине не один, кинул взгляд в зеркало заднего вида...

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


Спецвыпуск Xakep, номер #027, стр. 027-108-15, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-15

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

- Paparazzi...

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

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

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

- Diana...

Женщина сзади закричала. Прежде чем прозвучал гром удара, Сергей догадался, кого он вез сейчас на заднем сиденье. Капот вспух бугром точно посредине, руль резко вздрогнул; руки, сжимавшие его, выломали полированный круг с центральной гайки и кинули тело вперед, прямо на рулевую колонку. Она вошла в грудь со страшным хрустом, ломая ребра и позвонки. Тихонов закричал, пронзительно и беспомощно; пассажир к тому времени уже вылетел на бетон сквозь разлетевшееся в пыль лобовое стекло; умирая, Сергей увидел справа от себя свесившееся через спинку переднего сиденья женское тело в тонком, как туман, платье. Безумие безысходности пронзило Тихонова стрелой так же, как рулевая колонка нанизала его тело. Он не должен был умереть сейчас; впереди было слишком много намеченных целей. Но потом двигатель лег ему на ноги, и он все-таки умер...

- ...Сергей Алексеевич?

Вопрос прозвучал будто бы виновато. Ассистент дотронулся до его правой руки, прижимающей тампон к ране. Хирург вздрогнул; осознание того, что он жив и невредим, участило пульс до предельно возможного, в ушах зашумело. Тихонов ошалело оглянулся по сторонам, не отпуская горячий кровавый тампон, и вдруг понял, что те полминуты, что он разбился вместе с принцессой Дианой, здесь заняли две-три секунды - которые Сергей простоял с закрытыми глазами, изображая задумчивость и сосредоточенность.


Спецвыпуск Xakep, номер #027, стр. 027-108-16, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-16

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

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

Тянущая боль действительно ушла; но куда было девать эту жуткую автокатастрофу, случившуюся несколько лет назад? Сергей понимал, что он был там не как во сне, в галлюцинации - он был там НА САМОМ ДЕЛЕ. Он ДЕЙСТВИТЕЛЬНО умер там, врезавшись в опору туннеля в попытке увернуться от папарацци на скорости свыше двухсот километров в час. Он был ЗА ЧЕРТОЙ. И вернувшись ОТТУДА, он сумел спасти парня.

Ценой своей смерти он смог вытащить из-за грани другого человека. Тихонов осознал размеры того эксперимента, который производил сейчас над ним «Некрос», и ужас пронизал его с головы до пят. Умирать каждый раз, когда будет необходимо оказать помощь человеку, заглядывающему в глаза смерти, - кто сможет выдержать такое?! Остановившись в коридоре, Тихонов ухватился рукой за стену и потащил с лица маску, которую забыл снять в операционной. Стало душно, хотелось просто глотать воздух, а не вдыхать его, вдохов казалось мало. Со стороны он был похож на рыбу, выброшенную на песок.

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

Пока медленно закипал чайник, Тихонов спокойно сидел с закрытыми глазами. Ему срочно нужно было задать вопрос «Некросу» - можно ли от всего происходящего отказаться? Почему именно он? Что за странный способ спасать человеческие жизни? Хотя кому, как не врачу, владеть подобным методом возвращения душ - пройти самому по тому ярко освещенному туннелю, погибнуть с Дианой или еще с кем-нибудь или в полном одиночестве (ведь никто, по мнению Тихонова, не мог сказать, куда и когда в следующий раз зашвырнет его). А если он там погибнет по-настоящему?!

И самый интересный вопрос - если перед Тихоновым будет лежать действительно безнадежный больной, которому в принципе уже нельзя помочь (или по возрасту, или по тяжести травмы), то что тогда предпримет его... Новая сущность, что ли.

Вздохнув, Сергей открыл глаза, поднялся и подключился к Интернету. И тут случилось то, чего он меньше всего ожидал, - сайт «Некроса» встретил его ошибкой 403, нарушением прав доступа. Тихонов оказался в числе тех, кому нельзя было получить даже гостевой вход. Сколько ни бился над этой проблемой Сергей, сделать он ничего не мог. Потом догадался проверить почту.


Спецвыпуск Xakep, номер #027, стр. 027-108-17, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-17

«ОТКАЗАТЬСЯ ОТ ЭТОГО НЕЛЬЗЯ, - прочитал он. - ТАК БУДЕТ КАЖДЫЙ РАЗ... А ВОТ ОШИБОК - ИХ БЫТЬ НЕ ДОЛЖНО». На этом общение Тихонова с «Некросом» закончилось.

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

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

- Там из приемного звонят...

У Сергея похолодело внутри в ожидания продолжения. Он молча смотрел на сестру.

- Там мальчишка с велосипеда упал, просят бровь зашить...

Руки предательски затряслись. Тихонов кивнул и поставил кружку на подоконник - боялся пролить горячую жидкость на ноги. «Слава богу, - пронеслось в голове. - Два раза в день было бы слишком...» Он сделал большой глоток и, обжигаясь, кивнул медсестре. Потом выключил компьютер и вышел из кабинета. Его ждала работа. Умирать сегодня было пока не надо...

********

...Шум двигателей в «Боингах» практически не слышен; поэтому так хорошо Тихонов разбирал то, что говорили друг другу люди, сидевшие вокруг него. Что-то о смерти, о том, что скоро все кончится, что террористов убьют, а их самих освободят. Сергей слушал их, искренне переживая за происходящее. Его взгляд приковывала к себе маленькая девочка, постоянно выглядывающая в проход незаметно от матери, потерявшей сознание от страха.

То, что происходило сейчас с Тихоновым, совершалось уже в четвертый раз. Разбившись полтора месяца назад с принцессой Дианой, он еще пару раз тонул где-то в океане. Для него это оказалось еще более страшной пыткой - имея представление о происходящем в основном по кадрам из «Титаника», он и представить себе не мог, что такое на самом деле «тонуть». Идя ко дну в первый раз, он вытащил с того света одну дурочку, сделавшую криминальный аборт; во второй раз окунувшись в ледяную воду Атлантики (почему-то потом хотелось, чтобы это была именно Атлантика - звучит красиво...), он сумел помочь истекающему кровью школьнику, упавшему со второго этажа (на спор собирался выпрыгнуть, но в последний момент сквозняк перед самым носом захлопнул оконную раму, парень вышиб ее собой, повредив артерию на руке).

Нельзя сказать, что чем дальше, тем легче становилось Тихонову - вдохнуть обжигающе холодной соленой воды не пожелаешь никому. Но уже со второго раза он СМИРИЛСЯ. От подарка «Некроса» укрыться было некуда. Вот и сегодня - стоя над телом молодой женщины, совершенно случайно напоровшейся в подъезде на нож наркомана, он уже с самого начала операции чувствовал, что скоро радужный вихрь увлечет его куда-нибудь. Тихонов видел, что ему не справиться самому, несмотря на все меры, им предпринимаемые. И когда цветная струна вошла в его тело, он с радостью поспешил навстречу очередной смерти...


Спецвыпуск Xakep, номер #027, стр. 027-108-18, КАЖДЫЙ РАЗ...

КАЖДЫЙ РАЗ...

Спецвыпуск Xakep, номер #027, стр. 027-108-18

Сидя в кресле и физически ощущая два дула, направленных ему в спину, он сожалел только об одном - ни одного человека более он не мог спасти, только свою больную! А что станется с теми, кто летит в этом самолете? Кто спасает таких, как они, - кому еще очень и очень рано покидать этот мир, за кого распорядились вот эти сволочи-камикадзе! Кто поможет этой девочке, которой на вид лет восемь, остаться в живых? Кто спасет ЕЕ?

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

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

- Поднимите повыше, - коротко бросил он ассистенту, держащему крючки. - Готовимся шить...

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

Когда страх заслонил от Сергея весь мир, внезапно исчез сильный свистящий шум ветра и раздался мягкий голос - словно кто-то, пролетая мимо Тихонова, решил с ним заговорить.

- Ты не один... Девочка останется жива...

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


Спецвыпуск Xakep, номер #027, стр. 027-116-1, ХАКНИ ЕГИПЕТ!

ХАКНИ ЕГИПЕТ!

Albatrosov

Спецвыпуск Xakep, номер #027, стр. 027-116-1

(mailto:$echo nyongebfbi@anebq.eh|rot13)

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

от Митьков 6:2-4

Этим летом небольшая часть Спец-крю чертовски захотела отдохнуть на берегу в меру теплого моря под в меру зелеными пальмами. Подумав как следует, мы решили, что двух сотен енотов на рыло должно хватить. Вообще-то, путевки в Египет стоят дороже, мы про это много читали в прессе. К тому же очень сложно заплатить только за путевку и не потратить ничего там. Но если есть только две сотни, а до ближайшей пенсии еще далеко, фантазия начинает работать как разогнанный до 2 Ггц Ильич, треки альфа-частиц распрямляются и чувствуешь в себе силы решить все проблемы всех сепаратистов раз и навсегда... Мда, опять на поворотах заносит...

ЭКОНОМИЯ

Начнем экономить с визы: стадные туристы платят за египетскую визу 15 енотов в аэропорте прилета, а мы с тобой натянем аэропорт и заплатим 10 енотов посольству в Москве. Делается это так: через Гугол найди мыла пары-тройки не очень пафосных гостиниц в Египте, например, в Хургаде (ищем слова "hurghada hotel") и напиши им письма с просьбой забронировать номер на твое имя на неделю с такого-то по такое-то. Денег за это не берут, селиться туда потом не обязательно, и английский твой может быть любой степени корявости - тебе ответят и ответят с радостью. Распечатай самый симпатичный ответ и сообщайся в египетское посольство. Если едете толпой, сразу бронируй на толпу и сдавай документы стопкой.

Теперь приготовимся к посещению исторических памятников и отделения полиции: очень полезно иметь при себе международную студенческую карточку ISIC. Возьми в деканате справку, что ты - студент (ну или у директора школы - что еще школьник), изучи страницу http://www.spu.ru/isic/ и оформи себе зеленую карточку студента. Это стоит семь енотов, вход в музеи и на пирамиды дешевеет вдвое, и у тебя теперь есть прикольный международный документ.

Дальше будем экономить на турагентах. Знаешь ли ты, перец, что ламеры, покупающие путевку в турагентстве, отдают при этом свои еноты четырем разным конторам, из которых можно без напряга послать три. Первым посылаем турагентство в России - оно получает деньги за то, что ты вообще не занимаешься своей поездкой. Так просто зашел, отдал баблос и в субботу поехал. Что это для нас значит, перец? Правильно, "в субботу поехал" придется организовывать себе самостоятельно. Об этом позже. Вторым посылаем турагентство в Египте. Эти мажоры вообще ничего полезного не делают, только пялятся на твою чиксу и довозят тебя, прилетевшего, от аэропорта до гостиницы, а потом целую неделю стараются развести на деньги, предлагая съездить туда, сходить сюда... Эти тоже остаются в стороне, ходить мы умеем бесплатно, а ездить на рейсовом автобусе - дешевле, чем на ихнем экскурсионном. Третьими отдыхают пафосные гостиницы. Ну, типа, в Египте и вообще на Ближнем Востоке они все-таки сильно подешевле, чем в родной стране, и берут по 20-30 енотов за двухместный номер, но, согласись, это тоже запредельные цены. Мы будем тратить в день на гостиницу не больше пяти енотов на рыло (то есть десять на двоих, и у нас это получится). Одной конторе отдать деньги все-таки придется. Правильно, надо купить билет на самолет :).


Спецвыпуск Xakep, номер #027, стр. 027-116-2, ХАКНИ ЕГИПЕТ!

ХАКНИ ЕГИПЕТ!

Albatrosov

Спецвыпуск Xakep, номер #027, стр. 027-116-2

ОБРАТНЫЙ БИЛЕТ

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

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

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

КУДА ЕДЕМ

Ты, конечно, захочешь спросить у меня, а на какой курорт лучше искать билеты? На тот, куда они есть, старик, только так. То есть лично я предпочитаю Хургаду, она проще и человечней, а Шарм-эль-Шейх полон спеси и пафоса. Но тащиться по мизеру можно в обеих точках, и это не очень сложно. Так что смело бери те билеты, что дешевле, и все будет супер.

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


Спецвыпуск Xakep, номер #027, стр. 027-116-3, ХАКНИ ЕГИПЕТ!

ХАКНИ ЕГИПЕТ!

Albatrosov

Спецвыпуск Xakep, номер #027, стр. 027-116-3

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

Если ты все сделал правильно, то ты выйдешь из аэропорта примерно с полусотней енотов на неделю жизни. И обратным билетом, ты ведь не забыл про обратный билет, да?

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

ПОЧЕМ НОЧЛЕГ?

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

В Хургаде иди в старый город, ищи гостиницу "Калифорния" (можно в номере, можно на крыше), а в Шарме спрашивай Youth Hostel (это общага с восьмиместными комнатами) или Al-Kheima Camp (скромные вигвамы с соломенной крышей). Можешь поискать и другие варианты - там их много. Торгуйся, когда объявят цену за номер. Не расставайся с обратным билетом.

Теперь про хлеб насущный. В ресторан для туристов можешь зайти, чтобы глянуть на цены и идти дальше. Кушать будем в общепите для местных, старайся выбрать точку, где сидит много местных, они знают, кто лучше готовит и чище моет посуду. Там произноси волшебные слова, чтобы все поняли, чего ты хочешь. Слова звучат так (ударение на заглавной букве): "хОбз" или "ААйш" - это лепешки типа грузинского лаваша, "фелЯфель" - вегетарианские тефтели с подливой и салатом, "хуммУс" - растертый в пасту вареный горох с травами и маслом, "кУшари" - смесь отварных лапши, риса и гороха с лимонной и перечной подливами. Когда достанет вегетарианская кухня, заказывай себе "фирЯх" - это цыпленок гриль со сметаной. Кушай только правой рукой, так принято, потому что все моют левой. Отрывай от лепешки кусок, бери им тефтелю или пасту, или курицу и кушай, не смущайся. Моют все. И кушают тоже все :). Торгуйся умеренно, в таких точках больше чем в полтора раза не задирают.

ЧТО ТАМ ПОСМОТРЕТЬ?

С пляжем ты сам разберешься, не маленький, спросишь у местных, а мы поговорим про достопримечательности. В Хургаде иди на автовокзал (махАттат аль отобИс) и выясни про автобусы в Луксор, Асуан или Каир. В отличие от стада, ты не привязан путевкой к своей гостинице и можешь свободно съездить в другой город на два-три дня. В другом городе все делаешь точно так же: селишься в дешевой гостинице в центре города, кушаешь кушари, хуммус и, иногда, фирях.


Спецвыпуск Xakep, номер #027, стр. 027-116-4, ХАКНИ ЕГИПЕТ!

ХАКНИ ЕГИПЕТ!

Albatrosov

Спецвыпуск Xakep, номер #027, стр. 027-116-4

Очень советую добраться до Каира (10 часов автобусом из Хургады). Дешевые гостиницы в Каире находятся вокруг центральной площади Tahrir (ТахрИр). На этой же площади стоит Египетский музей, must see. На маршрутке от Тахрира можно доехать в Гизу до пирамид, must be. Покупай билеты в музей и на пирамиды только в кассах, везде показывай ISIC, входной билет дешевеет вдвое. Не плати незваным экскурсоводам. Купи или попроси чиксу сшить тебе мешочек из джинсы, который можно носить на шее, и положи туда свой паспорт и обратный билет, там они будут в сравнительной безопасности.

Можно двинуть в Луксор (четыре часа от Хургады на автобусе), город небольшой, но очень интересный, раньше на этом месте стояли Фивы, древняя столица Египта. Город стоит на правом берегу, а на левом - долина Царей, где похоронили многих фараонов. Входной билет в долину дает право посетить любые четыре гробницы, must see.

Можно добраться и до Асуана (семь часов автобусом из Хургады) - в основном чтобы посетить храм Абу Симбел на границе с Суданом. Автобусная экскурсия стоит по восемь енотов с чела и входные билеты в храм еще по четыре (если показать ISIC).

Если ты приехал в Шарм, можешь попробовать съездить на автобусе в Дахаб. Это прикольное место примерно в часе езды от Шарма, тоже на берегу моря. Там на пляже лежит почти вся Европа, окаменевшая (stoned) от мариванны. Мариванну разносят вместе с прохладительными напитками по пляжу и продают на улице вместе с бананами и телефонными карточками. Да, в Дахабе тоже можно перекантоваться за пять енотов с человека, так что если ты решишь закаменеть (get stoned), это будет тебе по карману и не напряжно. Помни, перец, что ответственность за мариванну в Египте суровая и полиция очень любит отловить белого мягкого иностранца и показать ему тюремную камеру и в ней тараканов размером с молодую крысу. Отмазки, говорят, стоят три-четыре сотни. И даже если ты лежишь окаменев, как камень на каменном пляже, не забывай про паспорт и обратный билет, они нужны тебе, чтобы вернуться домой.

ОБРАТНЫЙ БИЛЕТ ЕЩЕ РАЗ

Ну а если ты, раздолбай, все же потерял или пропил свой обратный билет и паспорт - иди в папирусный магазин устраиваться на работу зазывалой или в Инет-кафе - там нужны сменные дежурные. Ну и напиши нам рассказ в "Relax" про то, как правильно ездить по Египту, может, заработаешь у нас на обратный билет.


Спецвыпуск Xakep, номер #027, стр. 027-120-1, Обзор книг

Обзор книг

Frozen (frozen@real.xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-120-1

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

Эдвард Дж. Ренеган-младший. Новейший путеводитель программиста по ресурсам World Wide Web: 1001 адрес Web для программистов. - М.: Издательство "Попурри", 1997 - 512 с.

Я-то думал, что что-то нормальное скрывается за таким громким названием - путеводитель, а на деле оказалась достаточно откровенная лажа %(((. А когда я начал внимательно вникать в суть информации, представленной на страницах книги, то совсем огорчился, ведь, как оказалось (эххх, сразу надо было обратить внимание на дату выпуска так называемого путеводителя, да еще и для программиста...), на самом деле довольно староватый материальчик получается... Мало того, что половина линков не работает (хотя надо признать, все ж таки некоторые дельные адреса там есть :), так еще и автор попытался объять необъятное. Даже такого большого объема не хватило, чтобы осилить хотя бы половину дельных ссылочек... Может, конечно, наложило свой отпечаток и то, что автор является не... хм... нашенским с тобой товарисчем, а обыкновенным ламерикосом, ну что с него можно взять?

Рекомендуется: старовата книжечка для рекомендаций... лет пяток назад может и помогла бы кому-нибудь...

Шам Бангал. ActionScript. Основы. - М.: Символ Плюс, 2002 - 480 с.

Признайся, тебе ведь всегда хотелось сделать свою пагу неповторимо-привлекательной, чтобы любая забредшая сюда особь Chelovekus-Internetus сразу занесла в свои закрома лучших ссылок линк на твою мегаулетную страничку? Да вот беда - хочется-то всем и всегда :), да возможности и знания в этой области подкачивают... Ну ничего, ведь на помощь тебе уже спешит и летит, бесспорно, очень нужная книга по ActionScript. А бука эта не простая, а прямо как в сказке - золотая :). Если ты пытался уже что-нибудь такое сварганить во флеше с помощью этого самого экшн-скрипта, но не знаешь программинга, да и париться с освоением новых команд особо не катит, то это именно то, о чем ты мечтал. Автор - опытный веб-дезигнер - уже, видимо, сталкивался с такой проблемой и решил написать что-то типа пособия для чайников. Но не спеши радоваться, не все так просто в освоении предложенных конструкций и заготовок. Все-таки чувствуется, что при написании человек хотел донести до читателей, как самому научиться создавать что-то действительно стоящее, глядя на все глазами не программера, а дизайнера. Интерактивность, циклы, звук, спрайты... это ли не то, о чем ты мечтал, глядя на свою пагу?.. А если еще учесть и присутствие спецглав с описанием свойств, приоритетов различных операций и способов отладки скриптов, то получится прямо-таки книга твоей мечты :).


Спецвыпуск Xakep, номер #027, стр. 027-120-2, Обзор книг

Обзор книг

Frozen (frozen@real.xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-120-2

Рекомендуется: опытным и не очень флэш-дезигнерам.

Л. Лопак. Web-дизайн для "чайников". - М.: Вильямс, 2001 - 272 с.

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

Рекомендуется: самым начинающим веб-дизайнерам.

А. Костарев. PHP в Web-дизайне. - СПб.: БХВ-Петербург, 2002 - 592 с.

Гы, я знаю, как надоедает вручную добавлять новости на паге, создавать список файлов на фтпшнике, рассылать массовый спам мемберам твоей мегапупертусы. Для того, чтобы избежать таких проблем, нужно всего лишь немножечко знать основы программирования, и перед тобой откроется волшебный мир PHP. А приоткроет дверцу в этот мир книга, которую я сейчас держу в руках. А когда ты совсем раскрутишь свою страничку, придашь стильный вид, приделаешь всяческие новости, удобную навигацию, вдруг тебе захочется создать свой инет-магазин? И в виде бонуса в этой буке прилагается подробное руководство по созданию оного, описываются все проблемы, возникающие при реализации таких мегаулетных идей, рассказывается, как сделать удобный административный веб-интерфейс, сделать хорошую систему покупки-продажи, в общем много чего еще. Если ты тащишься не только от дизайна, а еще и от программирования, то я настоятельно рекомендую обратить свое пристальное внимание на эту буку.

Рекомендуется: веб-программерам, знакомым (или не очень :) с ПХП.

Л. Уолл. Программирование на Perl. - М.: Издательство "СИМВОЛ-ПЛЮС", 2002 - 1152 с.

Ну, а чтобы не очень обидеть любителей перла и чтобы меня не обвиняли в необъективности (сам я все-таки больше люблю ПХП :))), я решил представить на твой суд и этот "небольшой" талмудик... Да, тяжеленькая бука, но, как говорится, не по одежде судят. Я, признаться, догадывался, что будет что-то фундаментальное (вообще, как правило, книги от O`REILLY всегда хорошие и интересные), но поподробнее изучив и вникнув внутрь буки, я окончательно убедился в полезности и необходимости такой книги на твоих полках, если ты все-таки всерьез занимаешься веб-дезигном. Как тебе, например, рассмотрение релиза Perl 5.6, просто куча примеров прог, прекрасно иллюстрирующих предложенный материал, объяснение работы с профилями, юникодом, потоками, рассмотрение организации perl'а. В общем, если ты всерьез решил сделать стоящую страничку, то тебе просто необходимо приобрести эту книгу.

Рекомендуется: перловым веб-программерам.

М. А. Дубаков. Веб-мастеринг средствами CSS. - СПб.: БХВ-Петербург, 2002 - 544 с.


Спецвыпуск Xakep, номер #027, стр. 027-120-3, Обзор книг

Обзор книг

Frozen (frozen@real.xakep.ru)

Спецвыпуск Xakep, номер #027, стр. 027-120-3

Признайся, ведь ты знаешь, что такое ЦСС? Нет? Тогда ты упустил одну очень прикольную возможность менять дизайн своей паги путем практически просто редактирования одного-единственного файлика :). Для начала зацени статью Алексиса в этом номере, а потом, если впечатлит, можешь браться и за книгу. В ней раскрываются преимущества использования каскадных таблиц стилей (CSS) - технологии, которая немного расширяет возможности хтмэла по форматированию документов. Рассказывается про способы применения этих самых стилей, объясняются проблемы реализации CSS в различных осликах, шкафах, операх и прочих бродилочках, а также вопросы организации и оптимизации кода. Ну а если ты уже имеешь свою построенную страничку, то тебя не может не порадовать глава по переходу от оформления с использованием HTML к совершенно новому виду с использованием CSS. Приведено множество примеров, а также подробно показан процесс создания сложного сайта с применением CSS-блоков. Как бонус я отмечу сведения по элементам HTML и CSS, таблицы поддержки элементов HTML и свойств CSS различными браузерами.

Рекомендуется: веб-дизайнерам и разработчикам.

Редакция выражает благодарность магазину "Библио-Глобус" за предоставленные книги.


Спецвыпуск Xakep, номер #027, стр. 027-122-1,

На письма отвечал Дронич

Спецвыпуск Xakep, номер #027, стр. 027-122-1

From: Daver (daver@bk.ru)

To: spec@real.xakep.ru

Subject: ТАКАЯ КРИТИКА, ЧТО...

Я хотел сказать, что я вас разлюбил (поймите только правильно). Что это такое!!? В номере 11(24)2002 какой-то (lenin186@yandex.ru) жаловался, (писклявым голосом, как будто навалил в штаны): "...как долго вы будете писать про взлом? И еще он говорил, что он не хакер... ПУСТЬ ЧИТАЕТ #COOL# / А теперь конкретно про вас. Я читал ваш новогодний хак... про авторов журнала... Так вот, если это правда, что пишут про себя авторы, то какого времени им хватает на PC??????????????!!!!!!!!!!! И Я ВАС БОЛЬШЕ ПОКУПАТЬ НЕ БУДУ, ПОТОМУ ЧТО НЕ БУДЕТ НОРМАЛЬНОГО ВЗЛОМА, 2-3 СТАТЬИ В НОМЕРЕ. А ДЛЯ ВСЯКИХ ПОЛЕЗНОСТЕЙ ДЛЯ КОМПА ЕСТЬ ДРУГИЕ ЖУРНАЛЫ.

ЗЫ: Я вас все равно люблю 8)!

To: Daver (daver@bk.ru)

Алоха, нехороший человек Давер! Зачем? Зачем ты разлюбил нас? Без тебя и небо не такое голубое, и трава не такая зеленая (и торкает гораздо хуже). Ну ладно, уходи к другим журналам, посмотрим, умеют ли они так же, как мы... Расскажут ли тебе про веб, оси и снова про взлом? [вздыхает] А авторы у нас всегда пишут только правду, и только Главный иногда может позволить себе почудить... Но это нечасто случается... А пока награжу-ка я тебя ЗеБетом. Ты ведь этот номер все равно не купишь? Вот и славно, какой я заподлянщик :). Пирожок мне, а тебе - оревуару по соусом бланманже. Чао.

From: iFot (ifot-lynx@mtu-net.ru)

To: spec@real.xakep.ru

Subject: Дизигн...

Хай, пипл. Хотел вам письмецо а-ля Ноа, в хексах прислать, но таки пожалел :). В целях сокращения содержания опущу байду о том, что журнал рулез етц. Я тут вас немного обругачить хочу. Типа, народ, хотя бы раз в 3-4 номера можно заморочиться с хотя бы каким изменением дизигна. Я не говорю, что надо все тотально менять, но хоть как-нить. А? ИМХО, когда Спец выпускался раз в 2 месяца, дизигн следующего номера в корне отличался от дизигна предыдущего. В остальном журнал рулит и размазывает по стенке аж до потолка. Niro - rlz. И сделайте комикс поболе, а то это почти самая кАлбАсА из всего журнала. З.Ы.:54 68 65 20 46 6F 72 63 65 20 77 69 6C 6C 20 62 65 20 77 69 74 68 20 79 6F 75 2E 2E 2E 20 41 6C 77 61 79 73 2E 2E 2E.

З.З.Ы.: Не удержался :).

Galkin Dmitriy aka iFot(linx)

To: iFot (ifot-lynx@mtu-net.ru)

Бир манат, ыФот! Опускать байду - это неправильно, ведь кому-то потом придется ее поднимать. Хотя если байда в хексах - почему бы и не приподнять? Ладно, к делу: над новым дизигном пыхтит Денис, наш арт-директор. Заработался до смерти: иногда даже высовывает голову в форточку и обдает случайных прохожих едким дымом из ноздрей. Но, судя по блаженной улыбке, с которой он засыпает на коврике редакции, можно смело утверждать - дизззигн будет что надо. По-моему, я отбрыкался от твоего обругачивания, теперь сам скажу :). Комикса больше не будет! В смысле, его не будет в том виде, в котором ты привык его видеть на наших страницах. Все течет и меняется, и комикс станет другим, но не потеряет своей колбасности. Вот так.

ЗЫ. С тобой тоже 46 6F 72 63 65, чувак!

From: tiger (tiger@dsip.net)


Спецвыпуск Xakep, номер #027, стр. 027-122-2,

На письма отвечал Дронич

Спецвыпуск Xakep, номер #027, стр. 027-122-2

To: spec@real.xakep.ru

Subject: Здоровье

Здорово, Спец ][!

Спасибо твоим родителям, что они дали миру тебя. Супер! Я отлично поднялся по теме безопасность за время ВЗЛОМА. Ведь Бен Ладен (и как только мое письмо дошло?) готовит теракты в сети, и я не хочу оказаться его жертвой. Но пишу я тебе по другой теме, по теме здоровья. Нельзя жыть только в одном виртуале, но еще нужно жить и в реале. Если такими темпами сидения за компом - у вас не останется читателей :( . Я предлагаю сделать статью на эту тему, где будет рассказываться, как реабилитироваться после вреда компа. Ты можешь не опубликовать это письмо. Но это очень важно! Пока.

To: tiger (tiger@dsip.net)

Мерхаба, тигреныш! Как же не опубликую это письмо, если оно настолько важно? Еще как опубликую! Помнится, буквально пару килобайт тому назад некто Daver утверждал, что лично нам на РС вообще не хватает времени. Так что ответ напросился сам собой - чтобы не лечиться от писишника, надо его выкинуть. Не-е-е, ни фига, так точно у нас читателей не останется :). Отрываться от него по жизни надо, вот. Организовывать пьянки-гулянки, как Донор, катаЦЦа на роллах и сноуборде, как Ноа... Ну, в крайнем случае, летать по ночному городу на мафынке или по сугробам на MTB, как я :). И усе у тебя будет пучком, даже если ты этого не хочешь ;).

From: Dudao (dudao@mail.ru)

To: spec@real.xakep.ru

Subject: nosubj

10 Доброго бута!!!

Перцы, огурцы и другие из семейства морковообразных. Хочу брекпоинтить, что спец про DOS был самый гуд. Остальные с ним линковались - многое повторялось, что сложно компилить. А локальное древо определенно хорошо и инсталлится без ребутов. В общем, продолжайте в том же потоке, а мы вас будем риад.

P.S. Не утащите мой ник - я такого не сниффал на просторах рунета- загоню и устрою buffer overflow!

P.P.S. Спасибо, что вы пингуетесь {существуете}.

P.P.P.S. Goto 10.

To: Dudao (dudao@mail.ru)

Handshaking with: Dudao.............OK

Connection established

Ну, здравствуй, хрен. Ты на меня не обижайся, просто мои знания о садово-огородных культурах оставляют желать лучшего, и когда я выбирал между хреном и свеклой, я решил, что тебе приятнее быть мужского пола :). Тебе тоже за все спасибо, ник твой не утащим, у нас и свои есть, даже и покруче (одна ДаркМегаШвея чего стоит). На бейсик наезжать не буду, но скажу, что программирование с ГоТо есть суксь. Следующее письмо оформляй циклом FOR или хотя бы WHILE. Линкуйся и пингуйся, пусть в твоей жизни будет мно%^#("

Connection lost. Retry? [y/n]

From: Кирилл (gerrswin@xakep.ru)

To: spec@real.xakep.ru

Subject: Наконец решился!

Приветствую, родной и дорогой мне Спец(я имею ввиду душевно ;))!!! Вот уже несколько месяцев пытаюсь собраться и написать! Вот, наконец, (простите за каламбур :)) набрался смелости и решил высказать наболевшее. Буду писать по частям. 1) Куда дели Даню??? 2) Где родное сердцу западло??? Так как мое письмо вы не напечатаете (с моим-то счастьем ;-)), то напишите на мыло! P.S. И еще я конечно не супер пупер хакер, но и не полный юзер, но все-таки я думаю, что многие статьи надо писать с расчетом, что их будут читать и не продвинутые юзеры. Я уверен, что многие, видя строчку: "Я зарегил себе гестбуку на том же серваке и потестил его на дырочки..." (думаю автор узнал свою рабору ;-) не держи не меня злобы, я просто привел пример) и т.д. и т.п., тормозят и думают еще 3 недели, что вы имели в виду! Ладно, пора закругляться, а то же обнаглел. Пока, и удачи всей редакции Спеца! P.S.S. Да пребудет с вами шара! ;-)


Спецвыпуск Xakep, номер #027, стр. 027-122-3,

На письма отвечал Дронич

Спецвыпуск Xakep, номер #027, стр. 027-122-3

To: Кирилл (gerrswin@xakep.ru)

Ух, держите меня семеро! Автор, блин, узнал свою работу и сейчас начнет мстить, чтобы злобы больше не держать. ИМХО, если кто-то после прочтения статьи думает три недели - это немереный рулез, и редакторам надо ставить памятник при жизни. Но если кто-то думать не хочет, прямо тут дам ИЗИ-СОЛЮШЕН: поиграться с кавычками в разрешенных тегах (открывать ", а закрывать '), понабивать всякой пурги с тегами и прочим, параметры формы отправки посмотреть. Подробнее обо всем - на просторах инета. Надеюсь, конфликт исчерпан. А помогать молодежи - святое дело. Все мы когда-то учились, и нас не посылали (поэтому мы не уходили и остались тут... во блин!). Все слышат? Вот еще одно письмо на тему "зачем объясняете, как для ламо" - получу - порву. В клочья. И в мусорный бак :).

From: Yana (yana_s@xakep.ru)

To: spec@real.xakep.ru

Subject: 911

Трям, СПЕЦ ХА. Спасибо большое за то, что вы спасли мне жизнь (точнее ваш журнал). Сначала я была расстроена на вас потому, что мне стало нравиться пиво пить у компьютера, за что обычно получала утром от родителей по лбу. Но после вчерашнего инцидента я просто счастлива, что вы со мной Ж8). Это лучше, чем газовые баллончики. Я журналом сломала нос хулигану и еще покалечила так, что он лежал и держался за свое место (детей, наверное, не будет). СПАСИБО.

To: Yana (yana_s@xakep.ru)

Унтака, Яна! Сначала лирическое отступление. Заходит как-то к нам главный хулиган редакции - Холодильник. Одной рукой нос придерживает, чтоб окончательно не поломался, другой подозрительно чешет интимные места. И рассказывает он душераздирающую историю про маньячку, заворачивающую арматурину в Спец и калечащую честных граждан. Просил помочь ее изловить, на что мы вроде согласились. Но это я так, к слову :). Пива много не пей, от него детей не бывает (хм... хорошая мысль, может, кто-то хочет ее оспорить? :)), газовых баллончиков не нюхай, за них по лбу бьют. Лучше на закате скурить свежий Спец и подумать о вечном... Мы вот так полтиража изводим... На раскурку-то... Вот и вся моя скромная философия.


Спецвыпуск Xakep, номер #027, стр. 027-128-1, Анонс: Серия Спецов по web.

Анонс: Серия Спецов по web.

Спецвыпуск Xakep, номер #027, стр. 027-128-1

Журнал, который ты держишь в руках – это первый номер из серии Спецов по web development'у. Всего в этой серии будет четыре журнала:

1. web -> пага-робот

Этот номер ты сейчас держишь в руках – читай его :).

2. web -> свой портал

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

3. web -> веб-мошенничество

Этот номер будет о том, как злые веб-хакеры разводят юзеров сети на показы, клики, креды и прочие блага, форвардя запросы, подменивая адреса, подставляя линки – короче, всячески дуря доверчивый народ.

4. web -> веб-тулзы

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

Содержание