Тайны и секреты компьютера Антон Орлов Эта книга предназначена для тех, кто самостоятельно осваивает мир информационных технологий. Программирование в среде Microsoft Office, устройство сетей Internet и Fidonet, работа системы электронной почты, структура системного реестра Windows и файловой системы, строение жидкокристаллических дисплеев и проблема наличия различных кодировок русского языка, — про все это рассказывается в ней. Многообразие тем и легкий стиль изложения сделают ее вашим спутником на долгое время, и вы всегда сможете найти в ней нужную именно в данный момент информацию. Если Вы интересуетесь компьютерными технологиями, желали бы расширить свои знания и умения в этой области, то она Вам наверняка понравится. http://comptain.nm.ru ОРЛОВ Антон "ТАЙНЫ И СЕКРЕТЫ КОМПЬЮТЕРА" От автора Уважаемые читатели! Книга, которую вы держите в руках — несколько необычная. Необычная прежде всего потому, что предназначена для тех, кто умеет думать и самостоятельно исследовать окружающий мир. В отличие от массы других изданий на компьютерную тематику вы не найдете в ней рассказов о том, как нажимать кнопки мыши и смотреть на экран при работе в общеизвестных программах. В самом деле — у вас ведь есть глаза и ум, чтобы прочитать и понять предназначение кнопок и пунктов меню, тем более что в современных программах сделать это просто. Но зато из этой книги вы можете узнать множество полезных и интересных вещей, которые вы вряд ли так просто обнаружите где-нибудь еще. Программирование в среде Microsoft Office, устройство сети Интернет, структура файловой системы и устройство жесткого диска, сеть Fidonet, строение жидкокристаллических дисплеев и проблема наличия различных кодировок русского языка — про все это вы можете прочитать на последующих страницах. Эта книга не предназначена для того, чтобы читать ее как учебник — подряд от первой страницы до последней. Напротив — она состоит из множества глав на различные темы, среди которых каждый найдет себе то, что полезно и интересно именно ему. Она может стать вам спутником на долгое время, и всякий раз вы будете находить в ней что-нибудь нужное вам в данный момент. Приобретая ее, вы как бы приобретаете сразу несколько книг под одной обложкой: и про программирование в Word, и про различные аспекты устройства и работы компьютерных систем, и про создание сайтов. Сложные главы, посвященные непростым в изложении и понимании технологиям вроде маршрутизации в сетях и устройству жестких дисков, сочетаются в ней с материалами, доступными практически всем, например, рассказом о сайтостроении или секретными приемам работы в Word. Поэтому, приобретя эту книгу сегодня, вы откроете потом ее еще не раз, когда вам будет нужно срочно узнать что-нибудь, что вы нигде больше не смогли найти. Создавая книгу, я постарался максимально насытить ее информацией. Однако, разумеется, мир компьютеров значительно больше, чем может вместиться даже в 400 с небольшим страниц. Поэтому эта книга — лишь введение ко всем описанным в ней темам. Лишь краткое изложение основ. Но зато, прочитав ее и поняв все написанное, вы уже не будете чувствовать себя гостем в мире компьютеров, а сможете читать профессиональные компьютерные статьи и книги уже на равных с их авторами. Для вас не будут секретами такие слова, как «классы», «обьекты», «тэги», «скрипты», "таблица разделов", «протокол», «порт». Вы не найдете здесь пошагового описания восстановления данных на жестком диске — но зато потом легко поймете любую статью на эту тему. Если вы интересуетесь компьютерными технологиями, умеете и любите думать и исследовать неизведанное, и хотите узнать о мире компьютеров больше — тогда эта книга для вас. Но даже если вы уже опытный «компьютерщик» и знаете многое в этой области, — все равно и тогда вы сможете найти в этой книге что-нибудь вам доселе неизвестное. О ценности информации С появлением информационных технологий человеческое общество фактически перешло в новую фазу развития. И связано это с тем, что достижения компьютерной техники позволяют неограниченно и крайне дешево размножать такую вещь, как информацию. Ранее, например, лет пятьсот назад, для получения новой копии информации приходилось прилагать немало усилий: переписать книгу (а перед этим еще подготовить листы для книги из пергамента), прочитать и выучить текст, нарисовать копию картины, перед этим подготовив холст и краски. Зачастую усилия на создание новой копии источника информации были сравнимы с усилиями на создание самого этого источника, — например, переписывание книг занимало года. И создавать новые копии могли лишь специально подготовленные люди: ученые монахи-переписчики, художники, поэты. С появлением книгопечатания процесс облегчился: теперь книгу, ставшую основным носителем информации, можно было распечатать в большом количестве, и для этого не требовалось квалифицированного творческого труда. Но все равно затраты на размножение информации оставались немалыми: книгу надо сверстать, напечатать, сшить, распространить… Но с появлением компьютерных технологий и, в особенности, сети Интернет затраты сил и средств на получение новой копии какой-либо информации стали ничтожными. Ценность любой информации определяется суммой тех материальных и духовных благ, которые может дать конкретному человеку ее использование. Поэтому каждое копирование информации увеличивает количество благ, привносимых ею в мир, фактически на столько же, на сколько оно было увеличено при ее создании, — естественно, при условии попадания ее в нужные руки. При каждом копировании информации с помощью современных компьютерных технологий происходит умножение совокупного богатства человечества с крайне малыми затратами. Это уникальная ситуация — представьте себе, что один человек испек пирог и накормил им множество человек, причем пирог, который сьел каждый, был точно такой же по размерам, что и первоначальный. Из этого следует закономерный вывод — надо всячески стремиться к размножению и копированию информации. Для того, чтобы максимально увеличить количество благ, которыми располагает человечество. Но, к сожалению, в последнее время возобладала прямо противоположная тенденция — запрещать копирование информации, «охранять» ее. Да, разумеется, создатели информации должны получать вознаграждение за свой труд, и немалое — работа тяжелая, даже очень. Но почему это должно достигаться путем запретов на копирование? Ведь есть и другие пути — скажем, можно централизованно собирать со всех, использующих информационные ресурсы, небольшой налог и из этих средств выплачивать авторам вознаграждения, сообразуюсь с мнением пользователей о качестве той или иной информации? Поскольку авторов информации гораздо меньше, чем ее потребителей, то налог может быть очень небольшим. К тому же подобная ситуация приведет к стремлению всех, и авторов, и потребителей, максимально увеличить количество пользователей информационных сетей, как можно больше делать копий, — ведь тогда средств будет собираться больше! В выигрыше будут все. Единственно, что надо для этого — изменить существующий взгляд на информацию как на продаваемый товар: "заплатил — пользуйся, не заплатил — не пользуйся", и считать деньги, выплачиваемые автору информации, вознаграждением ему за труд, а не платой за получение этой информации. Изменить сформировавшееся в последние годы мировоззрение "собственника". Тем более что обьективных предпосылок для такого мировоззрения нет. Стоит помнить, что те, кто сейчас создает информационные ресурсы и получает огромные прибыли за счет их продажи из-за разницы в себестоимости и доходе, фактически стоят "на плечах предков". Миллионы людей работали долгие годы для того, чтобы сейчас у человечества появилась возможность копировать информацию почти без затрат сил и ресурсов, зачастую не получая достаточного вознаграждения своего труда. И они тоже могут рассчитывать на прибыль от распространения информации в настоящее время. Ну, уже, увы, не они — так их потомки, дети и внуки. А в то время, когда ученые разрабатывали первые компьютеры, без которых было бы невозможно создание современных компьютерных систем, этих ученых кто-то должен был кормить, одевать, кто-то строил им дома. Значит, и эти люди имеют право на долю прибыли от продажи информации, созданной и распространяемой с помощью компьютеров! Так что все здесь взаимосвязано, и выяснить, кто конкретно имеет право на доходы от продажи той или иной информации, нельзя. Поэтому развитие технологии, появление компьютерных систем и глобальных информационных сетей требует создания новой системы межчеловеческих взаимоотношений. Только отказ от принципа «продажи» информации, только связанное с этим изменение мировоззрения людей позволят максимально использовать открывшиеся новые возможности. Только восприятие денег, выплачиваемых за информацию, как вознаграждение ее автору за его тяжелый труд, а не как стоимость этой информации, только отказ от принципов "охраны интеллектуальной собственности" (но не авторского права!)[1 - Это означает, что пользователи должны платить за информацию столько, сколько они могут заплатить, а не столько, сколько назначает производитель, — при условии, что информация не предназначена исключительно для этих пользователей.] даст возможность человечеству приумножить свое совокупное богатство во много раз практически без затрат труда и ресурсов. Некоторые попытки создания новой мировоззренческой системы были предприняты в Советском Союзе до его уничтожения. Низкие цены на книги, бесплатная система образования, авторские свидетельства вместо патентов, — все это вызвано именно мировоззрением, отличным от распространяемого сейчас. Проблемы, существовавшие тогда — иной раз не очень высокие вознаграждения авторам, проблемы с бюрократией и внедрением изобретений были вызваны отдельными недоработками в общей системе управления и являлись вполне решаемыми. И последствия такого взгляда на жизнь были налицо — страна, перенесшая разрушительнейшую войну, находящаяся в крайне неблагоприятных климатических условиях, стала одной из самых развитых стран мира и интеллектуальным и научным центром планеты, а ее народ — едва ли не наиболее образованным среди всех… До сих пор многие западные страны охотятся за советскими разработками, зачастую опережающими их собственные на несколько десятилетий. Однако ясно, что односторонний отказ от сложившейся системы «торговли» информацией ни к чему хорошему не приведет, — ведь другие держатели информации отнюдь не обязательно добровольно последуют благому примеру. Создание глобальной централизованной системы распространения информационных ресурсов можно осуществить лишь на государственном уровне. Одним из наиболее прискорбных моментов истории развития компьютерных технологий была ориентация производителей программного обеспечения на продажи своих продуктов на рынке, вместо воздействия на государственные структуры с целью обьединения всех производителей программ в централизованную систему распространения информации. Последствием этого неправильного решения станет серьезное замедление развития нашей цивилизации. Это интересно… Долгое время ведущим разработчиком микропроцессоров фирмы Intel являлся Владимир Пентковский, получивший образование в СССР и работавший в Институте Точной Механики и Вычислительной Техники имени С.А.Лебедева. Пентковский принимал участие в разработке советских компьютеров «Эльбрус-1» и «Эльбрус-2», а затем возглавил разработку процессора для «Эльбруса-3» — Эль-90. После уничтожения СССР вследствие целенаправленной политики правящей верхушки России финансирование проектов, в которых был занят Пентковский, прекратилось, и он был вынужден эмигрировать в США и устроиться на работу в корпорацию Intel. Вскоре он стал ведущим инженером корпорации и под его руководством в 1993 году в Intel разработали процессор Pentium, по слухам, названный так именно в честь Пентковского. Пентковский воплощал в Intel'овских процессорах те советские ноу-хау, которые знал сам, многое додумывая в процессе разработки, и к 1995 году фирма Intel выпустила более совершенный процессор Pentium Pro, который уже вплотную приблизился по своим возможностям к российскому микропроцессору 1990 года Эль-90, хоть и не догнал его полностью. В настоящее время Пентковский разрабатывает следующие поколения процессоров Intel. Так что процессор, на котором, возможно, работает ваш компьютер, сделан именно нашим соотечественником и мог бы быть российского производства, если бы не события после 1991 года. Источник: www.ixbt.com, Алексей Пылкин "Эльбрус Бабаяна и Pentium Пентковского" Часть I. ОСНОВЫ ПРОГРАММИРОВАНИЯ ДЛЯ OFFICE Первая часть книги посвящена весьма интересной теме — созданию программ, работающих в среде текстового редактора Microsoft Word. Нет нужды говорить о его популярности в нашей стране, однако, к сожалению, немногие пользователи знают и применяют в своей деятельности возможности встроенного в Microsoft Office языка программирования Visual Basic for Applications, сокращенно именуемом VBA. А ведь с его помощью можно научить программы из пакета Microsoft Office выполнять практически все, что только может потребоваться пользователю. Более того, VBA — вполне полнофункциональный язык программирования, с помощью которого можно создавать законченные и работоспособные программы, как облегчающие работу с компонентами Microsoft Office, так и предназначенные для проведения расчетов, обработки данных. Но самое главное — на VBA могут создавать программы даже те, кто ранее никогда не занимался программированием, причем для этого не потребуются ни толстые книги, ни дорогие курсы обучения. Необходимо лишь уметь думать: наблюдать, исследовать, ставить эксперименты, делать выводы, — проявлять способности к научному подходу. Для написания программ на VBA вам не потребуются многостраничные руководства. Лучше всего даже, чтобы они появились у Вас тогда, когда Вы освоите по меньшей мере треть или даже половину возможностей этого языка, и тогда они будут прочитаны Вами как захватывающий детектив, а не как занудные учебники. Более того, тогда оставшиеся две трети информации о возможностях VBA будут усвоены вами гораздо быстрее и легче. Кроме того, создавая программы на этом языке, Вы получите прекрасную возможность смоделировать в данном процесе способы подхода к этому миру со стороны исследователя, экспериментатора, ученого, научиться принципам научного подхода к исследованию различных явлений или вспомнить их. И необьятный простор открывает такая, казалось бы, обыкновенная вещь, как Microsoft Office и его средства разработки программ для обучения и воспитания подрастающего поколения, — программирование в среде этого пакета программ является превосходным средством для выработки у учеников самостоятельности в исследованиях, способности сопоставлять различные факты и анализировать информацию, — всего того, что нужно разумному человеку или даже будущему ученому. Главы книги, посвященные программированию в среде Office, естественно, не могут охватить всех тонкостей искусства создания программ на VBA, да такая задача перед ними и не стоит. Они являются, скорее, введением в этот язык, и предназначены для того, чтобы познакомить вас с ним, описать основные его возможности, помочь в начале работы, предостеречь от некоторых затруднений и ошибок. Программы на VBA — макросы — можно создавать для любой программы пакета Microsoft Office — для Word, Excel, Access, PowerPoint и даже Outlook. В этой книге будет рассмотрен процесс создания макросов для Microsoft Word, так как, во-первых, с этой программой приходится работать практически любому пользователю персонального компьютера, а, во-вторых, для Word создавать их несколько легче и проще, чем для других компонентов Microsoft Office. Научившись работать с VBA в Word, вам будет довольно просто перейти к программированию для остальных компонентов Office. Не обязательно читать все главы подряд. В первой и второй главах будут описаны основные компоненты Word, предназначенные для написания программ и рассказано о работе с ними. Они скорее представляют собой небольшой справочник, полезный на первых порах, к которому иногда стоит возвращаться. Следующие три главы посвящены написанию программ на VBA, в них подробно описаны все шаги такой работы. Ну и в предпоследней главе первой части вы найдете краткий обзор некоторых интересных программ на VBA, которые можно использовать для обучения в качестве примеров. Предполагается, что читатели знакомы с программой Microsoft Word и знают основные приемы работы в этом текстовом процессоре. * * * На настоящее время выпущено три версии Microsoft Office, содержащие в себе возможности работы с VBA — 97, 2000 и 2002, иначе именуемая XP. За некоторыми исключениями все они между собой совместимы "сверху вниз", то есть программа, написанная для Word97 и в среде этого редактора, будет работать и в Word2000, и в WordXP. Обратное же верно не всегда: в Word2000 и особенно в WordXP добавлены новые команды VBA, и программа, их использующая, в Word97 уже не заработает. В предстоящих главах в качестве основной среды программирования рассматривается Microsoft Office 97, так как вследствие вышесказанного наиболее разумным будет использовать в качестве среды разработки именно 97-ю версию Microsoft Office, в частности, для того, чтобы создаваемую программу могли применять пользователи всех версий Office. Об особенностях же программирования для Office 2000 и Office XP сообщается отдельно там, где эти особенности имеют какое-либо значение. Полезные советы Если вам необходимо отправить e-mail кому-либо, у кого не русифицировано программное обеспечение компьютера или неправильно настроен почтовый сервер (подробнее — смотрите главу 13), то стопроцентно обеспечить читаемость сообщения можно, например, таким способом. Наберите текст сообщения в каком-либо текстовом редакторе, добившись, чтобы весь он влезал на одну страницу, но был вполне читаем с экрана. После этого комбинацией клавиш Alt+PrintScreen сделайте «снимок» экрана, — его копия в виде картинки поместится в буфер обмена. Затем вставьте содержимое буфера обмена в рисунок в MS Paint'е и сохраните его как отдельный файл (можете вырезать лишь ваш текст и сохранить только его для уменьшения размера файла). Довольно ясно, что прочитать текст в таком файле можно будет на любом компьютере, где есть хотя бы MS Paint, и вы можете смело отправлять его адресату. Только имейте в виду, что размер файла окажется немаленьким, так что постарайтесь либо заархивировать его, либо отконвертировать в формат Jpeg или Gif. Глава 1. Средства программирования на VBA для Word: общий обзор Создание программы В отличие от других средств разработки программного обеспечения, где единственным способом создания новой программы является написание ее кода и создание в визуальных редакторах диалоговых окон или использование уже готовых фрагментов кода других программ, в VBA есть уникальное средство разработки, не присутствующее больше практически нигде и позволяющее быстро научиться создавать простые макросы для компонентов Office, в том числе и для Microsoft Word, без использования описаний языка. Это средство — так называемая "запись макросов". При работе в Word можно включить специальный режим записи макросов, и тогда все действия пользователя в редакторе будут автоматически «переводиться» на язык VBA и записываться в виде текста программы. Этот текст можно потом изучить для выяснения синтаксиса и устройства языка, а также необходимым образом его модифицировать. Для записи макроса в Word надо выбрать из меню «Сервис» пункт «Макросы», а затем из выпадающего подменю — пункт "Начать запись". Документы Word — собственно документы с расширением".doc" и шаблоны документов с расширением".dot" — устроены так, что могут хранить в себе программы. Каждую программу, хранящуюся в документе, может вызывать на исполнение либо кнопка на панели инструментов, либо сочетание клавиш, либо пункт меню, либо другая программа. Возможно любое сочетание способов вызовов. Поэтому перед началом записи макроса пользователю предлагается сразу назначить записываемому макросу способ его вызова (рис. 1.1). Рис. 1.1. Назначение макросу способа вызова — кнопка на панели инструментов или сочетание клавиш. Если на данном этапе для вызова макроса не будет назначена кнопка или сочетание клавиш, то это всегда можно будет сделать впоследствии с помощью диалогового окна «Настройка». После нажатия кнопки «Ок» окна назначения способа вызова макросу в окне Word появится панель "Запись макроса" (рис. 1.2). Рис. 1.2. Панель "Запись макроса". С этого момента все действия пользователя тщательно протоколируются, хотя и с определенными ограничениями — так, в таком режиме невозможно проводить выделение текста мышью (перемещением курсора с нажатой клавишей Shift можно), не работает контекстное меню правой кнопки мыши. Но этих ограничений немного. После окончания выполнения необходимых действий необходимо нажать левую кнопку на панели — "Остановка записи". Если необходимо прерваться и все же выделить какой-нибудь обьект мышью, то необходимо нажать правую кнопку на этой панели — «Пауза». При повторном ее нажатии процесс записи продолжится. Пример подробного анализа результатов подобной записи будет показан в главе 3. А сейчас рассмотрим другой, более традиционный способ написания программ на VBA — посредством Редактора VBA. Редактор Visual Basic for Applications В Microsoft Word этот редактор вызывается из меню "Сервис"-"Макросы"-"Редактор Visual Basic" или нажатием клавиш Alt-F11. Окно редактора VBA (рис. 1.3.) состоит из следующих частей: Менеджер проектов, Окна текста программ и дизайна форм, Окно свойств, Окно отладки, Окно контрольного значения, Окно локальных переменных, Стек вызова, Окно просмотра обьектов. Каждое окно может как отображаться на экране, так и нет. Ниже мы рассмотрим все эти компоненты подробнее. Рис. 1.3.Редактор VBA. Отображаются Менеджер проектов, Окно текста программ и дизайна форм, Окно свойств, Окно отладки Программы на VBA для среды Word хранятся в документах и шаблонах Word. (Другие форматы для хранения макросов непригодны.) Каждый документ или шаблон, содержащий макросы, называется проектом. В окне Менеджера проектов отображаются названия всех доступных Word проектов, в состав которых входят открытые документы и шаблоны, а также шаблоны, загруженные глобально — через помещение их в папку автозагружаемых файлов Word. Кроме того, всегда в этом окне отображается шаблон Normal.dot со всеми макросами, сохраненными в нем (см. рис. 1.4). Рис. 1.4. Менеджер проектов. Отображаются три проекта и их компоненты. Щелкнув мышью по знаку "+" слева от названия, можно открыть список имеющихся компонентов проекта. Однако так можно поступить лишь с проектами, открытыми в Word: шаблон, загруженный глобально (т. е. путем помещения его в папку автозагружаемых файлов Word), так открыть нельзя, — чтобы получить доступ к его коду для редактирования, необходимо открыть его как файл. Иначе при попытке просмотра будет выдано сообщение "Проект недоступен для просмотра" и доступ к коду будет невозможен. Просмотр компонентов проекта можно запретить путем задания пароля, однако делать так не стоит. Компоненты каждого проекта делятся на пять больших категорий: 1. "Microsoft Word обьекты". В макросах для Word здесь имеется только один обьект — называющийся по умолчанию ThisDocument. Его контекстное меню, появляющееся при нажатии правой кнопки мыши, выглядит так, как показано на рис. 1.5. Рис. 1.5. Контекстное меню обьекта ThisDocument. При выборе пункта Обьект (для Normal.dot недоступен) произойдет переход к соответствующему документу — к его содержимому: тексту, графике. В документ Microsoft Word можно вставить специальные обьекты — кнопки, поля ввода текста, поля выбора вариантов и др. В этом случае после выбора пункта Программа контекстного меню обьекта ThisDocument можно написать программу, которая будет выполняться при нажатии соответствующей кнопки, введении текста и др. К написанию такой программы можно перейти и из контекстного меню самого специального обьекта в документе — выделив его, нажав правую кнопку и выбрав пункт "Исходный текст". В Microsoft Excel в Редакторе VBA в качестве обьектов представлены все листы рабочей книги Excel по отдельности, а также сама книга как целое. 2. "Модули." Модули — это и есть то место, где хранятся сами макросы. Щелкнув два раза мышью на имени модуля, можно получить доступ к тексту программы или начать ее создавать. В одном модуле может содержаться несколько макросов. Программы, записанные пользователем с помощью средства записи макросов, хранятся по умолчанию в модуле NewMacros шаблона Normal.dot. Для того, чтобы создать новый модуль, необходимо из контекстного меню Менеджере проектов выбрать пункт "Вставить"-"Модуль". 3. "Модули класса". Класс — это особое понятие, играющее очень важную роль в программировании. Для начала коротко можно сказать, что в данном случае это — "тип обьектов, определяемых программистом". К примеру, надо написать программу, которая работает с электронными версиями классных журналов в школе. В каждом журнале есть множество подразделов: и список учеников, и список их оценок, и система вычисления средней оценки каждого из учеников, и список предметов, и много чего еще… Можно, конечно, на VBA описать устройство каждого классного журнала: создать списки учеников, организовать таблицы с оценками, но тогда при однотипных действиях с группой журналов (например, надо посчитать средний балл оценок всех учащихся седьмых и восьмых классов) придется включать в код очень много операций с каждым компонентом журнала. Также при добавлении нового журнала придется писать программный код для создания списка учащихся, списка предметов и др. Это все очень усложнит программу и потребует большой затраты труда программиста. Поэтому в VBA, как и в других языках программирования, имеется понятие класса — то есть типа обьектов. Новые классы можно создавать самим. Так, можно создать класс «Журналы» и описать в его модуле класса содержимое обьектов этого класса: список учеников — (в коде это реализуется строкой Public Ученики(40) As String), предметов (Public Предметы(20) As String) и др. Теперь для создания нового обьекта класса «Журналы» — нового журнала — не надо заниматься утомительным описанием вновь создаваемых списков учеников и предметов: будет достаточно в одной строчке написать команду "Обьявить новую переменную класса Журналы" (Dim Журнал25 As Журналы) и присвоить нужные значения соответствующим разделам этого новосозданного журнала (Журнал25.Ученики(1)="Андреев" и.т.д.). Кроме того, можно в модуле класса написать программу вычисления средней оценки всех учащихся, и при необходимости сделать такой подсчет вызывать ее одной командой. Если текст предыдущих абзацев вам пока непонятен, то вернитесь к нему позже, когда узнаете о VBA больше. 4. «Формы». Формы — это диалоговые окна программ, которые можно разработать по своему вкусу. Для того, чтобы в проект добавить форму, надо из контекстного меню в Менеджере проектов выбрать пункт "Вставить"-"UserForm". Будет создано пустое диалоговое окно, в которое можно поместить кнопки, картинки, текст и др. Пример сложной пользовательской формы — на рис. 1.6. Рис. 1.6. Пример сложной пользовательской формы 5. «Ссылки». Программы могут запускаться на выполнение не только в результате действий пользователя, но и в результате вызова из другой программы. Однако запустить программу можно только из загруженного в Word проекта (шаблона или документа). Если постоянно загружать проект нецелесообразно (например, подобный вызов используется достаточно редко), то для запуска из загруженного проекта программы из другого, незагруженного шаблона нужно поставить на него ссылку (делается это путем простого перетаскивания иконки шаблона в окно Менеджера проектов). В таком случае будет возможен доступ ко всем программам в этом шаблоне из программ проекта, в котором находится ссылка. Средства создания кода Основным рабочим местом программиста на VBA является окно текста программ и дизайна форм (рис. 1.7). Именно здесь пишется текст программ и разрабатываются диалоговые окна. Для того, чтобы открыть его для какого-либо компонента проекта, надо просто два раза щелкнуть на нем мышью или выбрать из контекстного меню пункт «Программа». Рис. 1.7. Окно текста программ и дизайна форм. Контекстная подсказка редактора VBA Для начала написания программы надо в окне модуля или кода формы написать фразу "Sub Уникальное имя программы", после чего Редактор VBA сам добавит фразу "End Sub", и между этими двумя фразами должен заключаться текст основной части программы. Редактор VBA — очень дружественный редактор. Он постоянно подсказывает программисту, какие параметры имеет та или иная команда, как надо корректно ее написать. Например, если набрать команду MsgBox (эта команда вызывает на экран диалоговое окно, например, такое, как всем известное окошко "Сохранить изменения в документе?") и набрать после нее открывающую круглую скобку, то над курсором сразу же появится подсказка (см. также рис. 1.7.), из которой можно получить информацию о синтаксисе данной команды, то есть о том, как конкретно нужно задавать ее параметры — в данном случае текст окошка, количество кнопок, значок и звук при появлении — в тексте программы. Язык VBA называется обьектно-ориентированным. Это значит, что очень многие его команды имеют особенный формат, отличный, скажем, от формата языков Basic или Pascal, которые изучались в школах еще 10 лет назад. Типичная команда VBA имеет такой вид: <Обьект>.<Обьект, входящий в первый обьект>.<…>.<Тот обьект, с которым нужно произвести действие>.<Собственно действие>. Иными словами, каждая команда пишется как бы "с конца": вначале определяется то, над чем надо произвести действие — обьект, а затем само действие — метод. Разделителями компонентов команды служат знаки «точка». Вот пример такой команды: Application.ActiveDocument.PageSetup.Orientation = wdOrientLandscape Эта команда устанавливает альбомную ориентацию листа в документе. У обьекта Application (то есть приложение, программа, в данном случае — Word) есть подобьект — ActiveDocument (активный документ, а есть еще другие, неактивные документы, тоже загруженные в Word), у этого подобьекта есть подобьект — PageSetup (параметры страницы; а есть еще подобьекты Selection — то, что в данный момент выделено, Characters — все буквы в тексте и др.), у него есть подобьект Orientation (ориентация листа; а есть еще BottomMargin — нижний отступ, LeftMargin — левый отступ и др.), которому присваивается "="значение wdOrientLandscape — то есть альбомная ориентация листа. Такой же вид имеет и команда получения информации об ориентации листа — она будет выглядеть так: p = Application.ActiveDocument.PageSetup.Orientation и после ее выполнения значение переменной р будет wdOrientLandscape или wdOrientPortrait соответственно. (Более подробно синтаксис языка VBA будет рассмотрен в следующей главе.) При написании команд редактор VBA постоянно подсказывает возможные варианты следующего шага. Например, стоит написать в тексте программы слово Application и поставить точку, как сразу появятся возможные варианты продолжения (рис. 1.8). Рис. 1.8. Редактор VBA может сам предлагать продолжения команды Можно мышкой выбрать нужный вариант, и он обязательно будет правильным — не в смысле верности алгоритма (это остается на совести программиста), а в смысле соответствия правилам синтаксиса и иерархии обьектов, а также правописания слова. Затем можно вновь поставить точку, и вновь будет выдан список возможных вариантов продолжения. Есть также команда завершения слова — можно не писать целиком слово Application, а набрать Appli и нажать Ctrl и пробел. Редактор допишет слово до конца сам или предоставит возможность выбора слова, если его однозначно нельзя определить по первым буквам. Он как бы «ведет» программиста по процессу написания программы, позволяя ему сосредоточиться не на банальном синтаксисе, а на решаемой программой проблеме, не держа в памяти правила написания каждой команды. Даже если программист не воспользуется предоставляемой подсказкой и введет всю команду вручную, то редактор не даст ему так просто двинуться дальше, если в элементарном синтаксисе данной команды будет ошибка, выдав сообщение "Ошибка компиляции" (рис. 1.9). Рис. 1.9.Ошибка компиляции Редактор, безусловно, не может найти ошибку, если неверен алгоритм программы — это уже дело программиста. Он не увидит ошибку и в неправильно написанном слове команды, так как посчитает тогда ее функцией — новой командой, созданной самим программистом. Но вот неправильно написанную известную ему команду отследить он может. (В приведенной на рисунке примере программист хотел заменить выделенный текст новым, написав Selection.Text:="Новый текст", но ошибся и не поставил знак двоеточия в операторе присваивания — ":=".) Другим серьезным достоинством редактора VBA является наличие прекрасной справочной системы. Поставив курсор на любую команду или название обьекта VBA и нажав клавишу F1, можно получить подробную справку о том, зачем нужна эта команда, каков ее синтаксис и даже посмотреть пример ее использования и скопировать его себе, если необходимо. В справке VBA очень часто приводятся фрагменты кода программ, иллюстрирующие использование той или иной команды. Их можно копировать в свою программу и изменить так, как необходимо. Подобная дружественность редактора VBA дает прекрасную возможность для самостоятельного изучения этого языка программирования. А в сочетании с средством записи макросов она практически делает ненужными огромные учебники. Достаточно записать пару макросов, с помощью справки изучить назначение каждой записанной команды, и уже можно начинать писать простейшие работающие макросы — редактор не даст ошибиться в грамматике. Надо лишь усвоить некоторые приемы анализа программного кода, о которых пойдет речь в дальнейшем. Поставив перед любой командой знак апострофа (), можно ее закомментировать — то есть исключить из выполнения. В этом случае VBA не будет ее выполнять. Кроме того, после знака апострофа можно написать пояснения к соответствующей части программы для себя и других программистов. Все комментарии отображаются в редакторе VBA зеленым цветом. Щелкнув два раза на названии формы, можно открыть окно Дизайна форм (рис. 1.10). Рис. 1.10. Окно Дизайна форм. Нажав на соответствующий элемент (кнопку, поле ввода, переключатель и др.) на панели инструментов "Элементы «управления» и нарисовав затем мышкой этот элемент на поле формы, можно поместить его на форму. Двойной щелчок на помещенном на форму элементе открывает окно программ пользовательской формы, где можно написать программу, которая будет выполняться при этом самом двойном щелчке на элементе. (Можно также выбрать другие действия, которые надо выполнить пользователю или другим программам, чтобы запустить такую программу, — события.) У каждой формы есть окно ее программ — реакций элементов на события, хотя оно может быть и пустым. Вызвать его можно пунктом «Программа» из контекстного меню названия формы в Менеджере проектов. Если выбрать какой-нибудь элемент формы и из его контекстного меню выбрать пункт «Свойства», то откроется Окно свойств (рис. 1.11). Рис. 1.11. Окно свойств элементов формы Здесь можно задать все доступные свойства каждого элемента, например, его цвет, цвет границы, надпись, состояние — доступно/недоступно для изменений, поместить на элемент картинку из внешнего файла (пункт "Picture"). Все эти свойства также можно задавать программно, однако некоторые, вроде той же картинки, стоит задавать только в этом окне. Для получения подробного описания функции каждого элемента окна свойств (а состав этих элементов различен для каждого элемента формы) достаточно просто поставить на него курсор и нажать F1. Настоятельно рекомендуется подробно изучить предназначение всех элементов данного окна как с помощью вызова справки, так и с помощью изучения изменений в состоянии обьекта после изменения значения свойства. Окно Просмотр обьектов, вызываемое кнопкой F2 или из меню Вид (рис. 1.12), является кратким справочником по всем возможным свойствам и методам (то есть действиям, командам) обьектов VBA. Можно посмотреть, какие свойства или методы доступны для каждого обьекта, какие обьекты в принципе существуют в VBA, вызвать справочный файл для каждого обьекта, свойства или метода. Рис. 1.12. Окно Просмотр обьектов (справа) На панели инструментов «Правка» редактора VBA имеются соответствующие кнопки для вызова вышеописанных функций. Так, кнопка "Список свойств/методов" позволяет увидеть возможные продолжения любой команды (то же самое можно получить, поставив после команды точку, но так неудобно делать в уже написанном тексте), а кнопка «Сведения» выводит информацию о переменной, которая в данный момент выделена. Как и в самом редакторе Word, в редакторе VBA можно вставлять закладки в текст программы для более удобного перехода к соответствующим его частям. Все модули, входящие в состав проекта, можно сохранить в текстовом файле. Для этого в Менеджере проектов из контекстного меню правой кнопки мыши соответствующего модуля надо выбрать функцию "Экспорт файла". Модуль будет сохранен в текстовом файле с расширением".bas". Можно просто перетащить название модуля в окно Explorer'а, держа нажатой левую кнопку мыши — редактор VBA поддерживает механизм Drag-and-Drop. Вставить ранее сохраненный модуль можно через команду "Импорт файла" того же меню или путем перетаскивания его иконки в окно редактора VBA. Модули и формы можно свободно перетаскивать между различными проектами, копируя их из одного проекта в другой. Средства отладки программы Редактор VBA обладает очень большими возможностями отладки программы, то есть поиска в ней алгоритмических и языковых ошибок. Поскольку язык VBA — не компилируемый, а интерпретируемый (то есть готовая программа представляет собой текст исходного кода, хранящийся в шаблоне или документе, который переводится в машинные коды при каждом ее запуске, в то время как конечный продукт средств создания программ на остальных языках программирования представляет собой файл с исполняемым машинным кодом), то после завершения написания кода и успешной его отладки программа готова к использованию. Для запуска на выполнение готовой или записанной программы из редактора VBA необходимо нажать клавишу F5. Программа начнет выполняться и, если в ней вдруг найдутся ошибки в записи команд или обращения к неизвестным командам, будет выдано соответствующее сообщение (рис. 1.13). Рис. 1.13. Сообщение об ошибке компиляции Данное сообщение означает, что эта команда редактору VBA неизвестна. Значит — надо изменить код программы, соответственно исправив его. (В VBA можно создавать собственные команды — функции или процедуры, которые могут вызываться так же, как и встроенные. Об этом будет рассказано в следующей главе.) Если возникает ошибка вследствие неправильного использования команд VBA, то редактор VBA выдает диалоговое окно, в котором приводится некоторое описание ошибки. Так, при попытке выделить жирным шрифтом десятимиллионное слово в документе было выдано сообщение "Запрашиваемый номер семейства не существует" (рис. 1.14), так как десятимиллионного слова в документе не было. В диалоговом окне на рис. 1.14, как можно видеть, есть кнопка под названием «Отладка». Рис. 1.14. Сообщение об ошибке из-за неправильного использования команд VBA Нажав на нее, можно перейти в режим отладки программы — то есть специального состояния редактора VBA, в котором программа может исполняться построчно, а программист имеет возможность видеть значения всех переменных программы и даже принудительно задавать эти значения. Также в режим отладки можно перейти из редактора VBA, поставив курсор внутрь программы и нажав клавишу F8. Если ошибка произошла в макросе, находящемся в недоступном шаблоне (например, загруженным глобально через папку автозагружаемых файлов Word), то кнопка «Отладка» будет неактивна. В режиме отладки программисту доступны следующие возможности: 1. Пошаговое исполнение программы. Выполняются все команды последовательно, но выполнение каждой команды требует нажатия кнопки F8. Если программа где-то выдает ошибку алгоритма, то можно посмотреть, на каком конкретно этапе это происходит. При пошаговом исполнении в редакторе подсвечивается желтым цветом команда, которая будет выполнена следующей. 2. Просмотр значений переменных. Подведя в режиме отладки курсор к имени любой переменной, можно увидеть ее значение (рис. 1.15). Рис. 1.15. Просмотр значения переменной в режиме отладки Кроме того, значения всех переменных программы можно увидеть в окне Локальные переменные (рис. 1.16, вызов — из меню Вид). Рис. 1.16. Окно локальных переменных. При дальнейшем выполнении программы значения переменных в этом окне принимают те значения, которые они имеют в программе. Это очень полезно для отладки алгоритма программы, когда необходимо найти ошибку в ее внутренней логике, связанную с неправильной или недостаточно точной разработкой порядка действий программы. 3. Точки останова. Если программа длинная, то проходить по всем ее строчкам с помощью кнопки F8 — занятие не слишком интересное и приятное. В этом случае лучше использовать точки останова, то есть отметки в тексте программы, где ее исполнение должно остановиться, а сама программа — перейти в режим отладки. Для установки точки останова нужно щелкнуть левой кнопкой мыши на сером левом поле окна модуля, и тогда появится коричневая строка с кружочком на месте точки останова (рис. 1.17). Рис. 1.17. Точка останова. На самом деле она коричневая. Начиная с этого места, программа будет выполняться пошагово по нажатию кнопки F8. Отказаться от пошагового выполнения можно путем нажатия кнопки F5. Точки останова полезны, когда нужно локализовать дающее ошибку место в программе, особенно если оно находится в середине текста или не единичное. 4. Окно контрольного значения. В этом окне можно задать определенное выражение, значение которого будет подсчитываться параллельно с выполнением программы. Кроме того, выделив в режиме отладки какое-нибудь выражение и нажав Shift и F9, можно увидеть его значение, а также добавить это выражение в окно контрольного значения и отслеживать его дальнейшие изменения. Такая возможность необходима, например, при отладке длинной программы с множеством арифметических выражений, одно из которых дает ошибку. С помощью этого окна можно отследить, когда, при изменении какого параметра значение выражения станет неприемлемым. К примеру, идет вычисление оптимального количества учеников в каждом классе с учетом множества параметров и где-то подозревается наличие ошибки: не сходится сумма количеств всех учеников во всех классах с количеством учеников в школе. Можно, конечно, обойтись без всяких там окон контрольного значения и вставить в текст программы после каждого вычисления проверку равенства суммы количества всех учеников во всех классах с численностью учеников школы, но это очень усложнит программу, да и потом придется удалять все эти добавления, — а если программа большая, то сделать это не так просто. Гораздо лучше поставить контрольное значение — сумму количеств всех учеников во всех классах — и при пошаговом исполнении программы отследить, где, на каком этапе происходит ее ненужное изменение. 5. Окно проверки или Отладки. Это окно вызывается из меню Вид — Окно отладки. В текст программы можно вставить специальные команды — Debug.Print (a+b, например — если надо отслеживать значение этой суммы). Тогда при выполнении этой команды в Окне отладки будет печататься то, что задано в ее параметрах (рис. 1.18). Рис. 1.18. Окно отладки. Возможности применения этого окна многообразны. Можно выводить в него сообщения (командой Debug.Print) в случае выполнения или невыполнения какого-либо условия. Можно отображать в нем промежуточные результаты вычислений для контроля их правильности — чтобы не смотреть и искать нужное выражение в окнах Локальных переменных или Контрольного значения, а получать их сразу, перед глазами. Можно даже использовать это окно как маленький калькулятор или командную строку, и тогда при нажатии Enter после ввода команды она будет тут же выполнена! Надо только перед самой командой писать слово Print, если команда должна выдать какой-нибудь результат в этом же окне. 6. Стек вызова. В этом окне отображается структура программы, состоящей из нескольких подпрограмм — процедур или функций, а также показывается, какие переходы возможны между этими подпрограммами. Если программа сложная и большая, то разобраться, какая подпрограмма вызывает ту или иную другую подпрограмму, достаточно трудно, — для этого и стоит использовать Стек вызова, в котором все вызовы подпрограмм друг друга наглядно изображены. Окна Контрольного значения, Локальных переменных, Отладки и Стека вызова могут быть вызваны как из меню Вид или соответствующими сочетаниями клавиш, так и при нажатии кнопок на панели «Отладка». Достаточно только подвести курсор к каждой кнопке панели, чтобы увидеть, какую команду она вызывает. Во время работы макрокоманды ее можно прервать в любой момент нажатием клавиш Ctrl и Break. После этого будет возможен переход в режим отладки с места остановки или завершение программы. Для выхода из режима отладки до завершения полного выполнения программы необходимо выбрать функцию Сброс из меню Запуск или нажать на панели «Отладка» кнопку "Сброс". В режиме отладки возможен принудительный переход к какой-либо команде для того, чтобы дальнейшее выполнение программы пошло именно с нее. Для этого надо просто перетащить мышкой по серой полосе слева указатель в виде желтой стрелки на нужное место. Если Вы, просматривая при отладке текст, забыли, где программа была остановлена, то просто выберите из меню Отладка команду "Показать следующую инструкцию". И помните, что вы можете всегда получить подробную справку по любой команде, поставив на нее курсор и нажав клавишу F1. В Справочной системе по VBA для русской версии Microsoft Office 97 некоторые разделы Справки даже переведены на русский язык, но, к сожалению, в последующих версиях Office это доброе начинание продолжения не нашло. Очень полезно при разработке программ на VBA смотреть примеры использования команд, приводимые в справке — в разделах «Example» многих справочных окон (рис. 1.19). Если вам никак не удается создать работающий фрагмент кода программы — посмотрите в справке в разделе примеров, не встретится ли вам там то, что вы так долго пытались создать. Все фрагменты кода в справке можно свободно копировать в свои программы. Во всяком случае, в справке все команды написаны грамотно и правильно. Рис. 1.19. Фрагмент кода в справке Descent из недр Excel'а Descent — это игра-симулятор космического корабля, перемещающегося в инопланетных шахтах. А Excel — это программа для работы с электронными таблицами. Казалось бы, что между ними может быть общего? А общее есть. Оказывается, в Excel 97 встроена «леталка»: игра, смысл которой заключается в полете над местностью и просмотре открывающихся красот. Вот как ее можно запустить. 1. Запустите Excel 97 и проследите, чтобы в пункте Сервис-Параметры-Общие не стояла отметка в пункте "Стиль ссылок R1C1". 2. Создайте чистую таблицу. Нажмите F5 и введите в строке ссылки для перемещения фразу "x97:l97" (т. е. переход к ячейкам от X97 до L97 с их выделением). Нажмите Ввод. 3. Вы перейдете к строке номер 97. Нажмите Tab, а затем, удерживая Shift и Ctrl, щелкните левой кнопкой мыши по иконке "Мастера диаграмм". Подождите немного. Вот вы и в Excel Descent! Все управление — мышью. Левая кнопка — ускорение вперед, правая — назад, движения мыши задают направление. Выход — Esc. Подлетев к центру местности, можно увидеть камень, а на его поверхности — список имен разработчиков. Descent из недр Excel'а К сожалению, в последующие версии Excel'а данная игра уже не включалась. Однако, скажем, в Excel 2000 есть не менее увлекательная игра — автогонки. Как ее вызвать? Читайте дальше, на одной из таких же врезок данная информация будет приведена. Секрет Internet Explorer'а Если вставить в пустой html-документ строку , а потом открыть этот файл в Microsoft Internet Explorer версии 4 или 5, то на экране появятся весьма интересные визуальные эффекты. К сожалению, в 6-й версии этого браузера данный прием уже не работает. Глава 2. Основы языка Visual Basic for Applications Для полного описания возможностей VBA потребовалось бы несколько толстых книг. Поэтому я не буду описывать все команды VBA, рассказывать об их формате и требуемых параметрах — про это очень подробно рассказано в справке, да и средства подсказки тоже не дадут ошибиться. Если необходимо узнать, какая команда позволяет программно реализовать ту или иную возможность Word, то можно воспользоваться средством записи макросов, а потом почитать в справке о каждой записанной команде. Однако в VBA есть некоторые вещи, о которых в справке упоминается не на первом плане, и человеку, незнакомому с программированием, трудно узнать о них. Поэтому в этой главе вы найдете описания лишь некоторых команд, которые нельзя записать средством записи макросов, а также некоторую информацию о неочевидных возможностях VBA. События, методы, свойства Когда-то давным-давно программы, написанные и работавшие тогда еще под MS-DOS, получали от пользователя данные, обрабатывали их и выдавали затем результат. Почти любая программа предусматривала в своей работе период ввода данных, период обработки, период выдачи результата. Подобные действия были принципом работы Dos-овских программ. И программирование их называлось структурным — надо было строго и последовательно разрабатывать алгоритм, реализовывать заданный порядок действий программы, в который в процессе работы пользователь в момент, для этого не предназначенный, вмешаться не мог, разве только принудительно остановив программу. С появлением операционной системы Windows стал широко известен другой принцип программирования и создания алгоритмических языков — принцип объектно-ориентированного языка. Это значит, что основная направленность разработчика сместилась с действия на объект — на его реакции на действия пользователя, на его свойства и на их изменение. И VBA является типичным представителем объектно-ориентированных языков, как по своему синтаксису, так и по архитектуре программ. Основными понятиями объектно-ориентированного языка являются объект, свойство, метод, событие. Объект — это все, над чем может совершаться какое-либо действие или то, что имеет определенные характеристики. К примеру, открытый документ Word — это объект, первая буква в нем — это тоже объект, тридцатое слово, десятое предложение, второй рисунок — это все объекты. Объектами также являются запущенная программа, какой-нибудь файл на диске, даже сам Word — это тоже объект. Почти каждый объект внутри себя имеет подобъекты, которые, в свою очередь, являются полноценными объектами и могут иметь свои подобъекты. Например, у объекта «Документ» есть подобъект "Десятое предложение", у которого есть подобъект "Второе слово", у которого есть подобъект "Третья буква". С помощью объектно-ориентированного языка VBA можно обратиться к любому объекту, если знать его иерархию — то есть все те объекты, чьим подобъектом он является. Свойство — это любая характеристика объекта. К примеру, у объекта — первой буквы документа есть свойства: выделение жирным, выделение цветом, подчеркивание, выделение курсивом, регистр и много еще других. У объекта — документа есть свойства: наличие автоматической расстановки переносов, наличие автоматической проверки грамматики и др. Большинство свойств объектов VBA можно задавать программно, однако есть свойства Read-Only — не допускающие изменений. Многие свойства объектов Word также задаются через стандартные диалоговые окна Word — например, Файл-Параметры страницы или Сервис-Параметры, однако их всегда можно задать и в программе, а соответствующие диалоговые окна использовать при записи макроса для того, чтобы посмотреть синтаксис команды задания того или иного свойства. Метод — это какое-либо действие над объектом. Например, печать текста или поиск текста в документе. У многих методов есть параметры метода, позволяющие задать параметры действия. Вот пример: With Selection.Find Text = "Этот текст надо заменить" Replacement.Text = "Заменить на этот текст" Forward = True Wrap = wdFindContinue Format = False MatchCase = False End With Selection.Find.Execute Replace:=wdReplaceAll В данном примере вначале объекту VBA «Find», являющемуся подобъектом объекта «Selection», задаются необходимые свойства".Text", ".Forward", ".Format" и другие. Затем выполняется метод".Execute" для объекта "Selection.Find" с параметром "Replace:=wdReplaceAll"(т. е. "Заменить все"). Команда With … End With позволяет не писать для каждого свойства или подобъекта полное название соответствующего объекта, что дает возможность экономить место и делать программу лучше и быстрее работающей. Свойства и методы по-разному отображаются в контекстной подсказке. Так, против названий свойств стоит серый символ указывающей руки, а против названий методов — зеленый значок летящей коробки (см. на рис. 1.8 в предыдущей главе). Событие — это то, что "происходит с объектом помимо его воли", "результат действия какого-то другого метода". Это "все, что случается" с объектами по милости пользователя или программы. Нажатие кнопки, набор буквы, клик мыши, наступление какого-либо момента времени, завершение работы любой другой программы, — все это события. События — основа работы любой программы. И даже если программа должна работать автономно (например, планировщик заданий), то в качестве событий используется наступление того или иного времени на системных часах. Так, когда пользователь нажимает кнопку на форме, происходит событие нажатия этой кнопки. Для каждого события можно написать программу, которая будет срабатывать именно тогда, когда это событие произойдет. Особое значение понятие событий имеет при написании программы реакций формы на изменения ее компонентов, а также при описании новых классов. На каждое событие пишется своя подпрограмма, которая это событие «обрабатывает» — то есть выполняет определенные действия, которые должны быть выполнены, когда это событие происходит. Типы данных и объявление переменных Все переменные в программе на VBA могут содержать какую-нибудь информацию: текст, число, утверждение истинности и др. В зависимости от вида содержимого они подразделяются на типы данных, — соответственно текстовые, числовые, булевые (то есть принимающие значения «да» или «нет», соответственно по-английски «True» или "False"). В VBA определено большое количество различных типов данных, которые может содержать переменная. Вы можете получить информацию о всех возможных типах данных VBA из Справки, найдя в Предметном указателе раздел "Типы Данных" (рис. 2.1). Так, переменная типа Integer — это целое число -32 768 до 32 767, а переменная типа String — это строка текста длиной до двух миллионов символов. Рис. 2.1. Справка по типам данных VBA В зависимости от типа данных с переменной можно производить те или иные действия и вычисления — с числовыми математические, с текстовыми — текстовые (выделение подстроки из строки, получение отдельных символов из строк и др. Для того, чтобы переменная могла использоваться в программе, она должна быть объявлена — то есть указана в соответствующем разделе модуля, который так и называется — Описания и располагается в самой верхней его части, до начала первой программы (рис. 2.2). Рис. 2.2. Область описаний программы Для этого нужно вставить туда описание переменной вида "Dim x(переменная) As (тип данных): Dim a As Integer". Вместо слова Dim могут также использоваться слова Public и Private. Переменная, объявленная как Public, может использоваться и программами из других модулей и форм, при этом она своего значения не теряет, а переменные, объявленные как Private или Dim, могут использоваться только в программах модуля, в котором они объявлены. При наличии такой же переменной в программах другого модуля ее значение не будет передаваться в них при их вызове из программы модуля, где она объявлена. Как Public или Private переменная может быть объявлена только в разделе описаний переменных. С помощью же инструкции (то есть команды, не выполняющей реальных действий) Dim она может быть объявлена и в тексте программы, но тогда ее другие модули уже использовать не смогут никак. Объявление типа переменных нужно программе, чтобы она заранее отвела под них именно столько оперативной памяти, сколько нужно для размещения именно такой переменной. Для логической — хватит и одного бита, для буквенной — нужен целый байт, а для строковой или числовой — значительно большие обьемы. Можно вообще не объявлять специально переменные, включая их в текст программы по мере надобности, так как тогда VBA присвоит им автоматически специальный для таких случаев тип данных Variant и отведет для каждой переменной максимально возможную область памяти, что, впрочем, не имеет особо отрицательного значения из-за большого обьема оперативной памяти на современных компьютерах. Тип данных Variant отличается еще и тем, что переменные с таким типом автоматически могут преобразовываться в нужный другой тип, например, если переменная «х» имеет тип Variant и значение 2 (число), то после команды "x=Str(x)", которая преобразует число в строку, она уже будет иметь значение «2», то есть текстовая строка с цифрой «2». Такое преобразование было бы невозможно, если бы переменная «х» была объявлена как Integer. Может показаться, что определять все переменные как тип Variant или вообще не включать в модуль раздел описаний является очень хорошим решением, однако стоит помнить, что необъявленные переменные не могут быть использованы в других модулях или формах, а, кроме того, переменные типа Variant занимают очень много места в оперативной памяти. Можно запретить для себя использование необъявленных переменных, вставив в начало модуля, в верх раздела описаний инструкцию Option Explicit, и тогда программа остановится и перейдет в режим отладки, если вдруг наткнется на такую переменную. Стоит быть внимательнее с типами данных, так как в некоторых случаях неправильное их использование может дать ошибку. Например, переменная с типом Integer не может превысить значение 32 767; если же надо использовать большие числа, то следует определить ее тип как Long, а если она может быть еще и дробной, то — Double. Процедуры и функции В принципе любая программа для каждого конкретного случая может быть написана в виде одного длинного блока текста. Однако такой код будет крайне нерациональным. Например, в программе необходимо несколько раз подсчитать сумму всех членов арифметической прогрессии для разных чисел. Можно, конечно, считать результат каждый раз по известной формуле, но это очень усложнит код. А если неизвестно, для какого количества чисел надо считать эту сумму (например, это определяет пользователь), то написание программы становится почти невозможным. Поэтому в VBA, как и в других современных языках программирования, есть понятие процедур и функций, иначе называемых подпрограммами. Процедура — это программа, которая может быть вызвана из другой программы и при этом получить для дальнейшей обработки определенную информацию. Например, можно написать процедуру для вычисления суммы всех членов арифметической прогрессии и помещения результата в текст активного документа, и вызывать ее всякий раз, когда надо подсчитать такую сумму, передавая процедуре число, для которого такая сумма считается. Можно сказать, что программа, не использующая вызов процедур, состоит из одной большой процедуры. Функция же — это программа, которая не только получает из другой программы какую-нибудь информацию, но и возвращает той программе определенное значение, которое может быть ею в дальнейшем использовано. В VBA любая процедура, получающая данные из другой программы, имеет следующий формат: Sub "Название процедуры"("Получаемая переменная" As "Тип данных получаемой переменной") "Текст процедуры" End Sub Получаемых переменных может быть несколько. Для каждой из них желательно указать ее тип, но это можно опустить. Вызов процедуры происходит так же, как и вызов любой команды VBA, — путем указания ее названия и передаче ей соответствующих значений переменных, указываемых после имени процедуры в команде ее вызова, как, например, в этой программе: Sub Main() Dim a As Integer a = 1 uvelich a, 3 MsgBox a End Sub Sub uvelich(b As Integer, c As Integer) b = b + c End Sub Здесь из процедуры Main вызывается процедура uvelich, которой передаются два параметра — a (равный 1) и второй — число 3. Процедура uvelich увеличивает первую переданную переменную на значение второго переданного числа, а затем Main отображает результат. Стоит помнить, что если в заглавии процедуры указываются типы данных переменных, то и в вызывающей процедуре передаваемые значения должны быть определены и иметь тот же самый тип, иначе VBA выдаст сообщение об ошибке.[2 - Кроме того, при вызове процедуры или функции иногда требуется указывать команду Call (подробнее смотрите в справочной системе).] Переменные могут передаваться в процедуру двумя способами — только для чтения или и для изменения. По умолчанию переменные могут в функции изменяться. Как, скажем, в вышеприведенном примере — переменная «a» была передана в процедуру (под именем «b», чтобы лучше проиллюстрировать этот момент) и там изменилась (к ней прибавили величину переменной "с"), и затем в исходной программе она тоже стала иметь новое измененное значение. Если же не нужно, чтобы переменная в процедуре менялась (скажем, процедура использует переменную для каких-то своих нужд, не связанных с исходной программой), то перед именем этой переменной в заголовке процедуры следует поместить инструкцию ByVal. Тогда процедура просто использует переменную так, как в этой процедуре описано, возможно, изменив ее значение, а программа, вызвавшая процедуру, дальше будет работать с прежним значением переменной. К примеру, если бы заголовок процедуры uvelich в вышеприведенном примере имел вид Sub uvelich(ByVal b As Integer, c As Integer), то никакого увеличения переменной «a» не произошло бы и программа отобразила бы в качестве результата число 1. Однако в самой процедуре uvelich соответствующая переменная увеличилась бы на 3 и, если бы последняя ее команда была бы MsgBox b, то она отобразила бы значение 4. Функция отличается от процедуры тем, что она передает в вызвавшую ее программу определенное значение, которое может быть использовано в дальнейшей работе программы. В частности, при использовании функции вышеприведенный пример мог бы иметь такой вид: Sub Main() Dim a As Integer Dim d As Integer a = 1 d = uvelich(a, 3) MsgBox d End Sub Function uvelich(ByVal b As Integer, ByVal c As Integer) As Integer uvelich = b + c End Function Как нетрудно видеть, программа присваивает переменной «d» значение, вычисленное функцией. При создании функций опять-таки следует помнить, что если в заголовке функции не указана инструкция ByVal перед описаниями переменных, то соответствующие переменные могут быть в функции изменены и после ее выполнения в исходной программе они будут иметь уже измененные значения. Так, если бы данный пример имел вид Sub Main() Dim a As Integer Dim d As Integer a = 1 d = uvelich(a, 3) MsgBox d MsgBox a End Sub Function uvelich(b As Integer, c As Integer) As Integer uvelich = b + c b=1555 End Function, то программа бы в качестве значения переменной «а» отобразила бы число 1555, а не 1. Указания типов переменных в заголовках функций и процедур необязательны — их можно опустить. В этом случае будет считаться, что все передаваемые переменные могут иметь любой тип (точнее, они просто преобразуются в тип Variant и такими уже используются в подпрограмме). Однако необходимо строго следить за соответствием типов переменных в заголовках подпрограмм и в вызывающей их программе. Так, если в заголовке функции указано, что первая переменная, передаваемая ей, имеет тип Integer, то та переменная, которая передается в функцию как первая (в последнем примере — "a"), должна быть определена именно как Integer до вызова функции (что мы и видим в этом примере). Перед заголовком функции или процедуры можно поставить инструкции Public или Private ("Private Function uvelich(b As Integer, c As Integer) As Integer"). Функция или процедура, объявленная как Public, может вызываться и из других модулей, в то время как функция или процедура, объявленная как Private, доступна только из данного модуля. По умолчанию все функции и процедуры считаются объявленными как Public (а переменные — объявленные как Private!). Если в программе есть вложенные процедуры или функции (то есть процедура или функция вызывает другую процедуру или функцию, которая, в свою очередь, вызывает еще одну процедуру или функцию и.т.д.), то их взаимоотношения ("кто кого вызывает?") удобно при отладке отслеживать с помощью окна Стек Вызова (рис. 2.3), в котором видны все произошедшие вызовы. Рис. 2.3. Окно Стек вызова. В выпадающем меню в правом верхнем углу окна программы (см. на рис. 2.2) перечислены все процедуры и функции открытого модуля. Это меню можно использовать для быстрого перехода к необходимому месту модуля, а также в раздел описаний переменных, указание на который стоит в этом меню первым. Главная процедура — собственно программа — не может иметь параметров (в ее заголовке должны стоять пустые скобки). Только таким процедурам можно назначать кнопки и сочетания клавиш для их вызова на выполнение. Во время пошагового исполнения при отладке программы с процедурами или функциями имеется возможность отказаться от прохода по всем командам той или иной процедуры или функции, вызвав команду "Шаг с обходом" из меню Отладка или кнопкой на одноименной панели. Тогда вся процедура или функция будет выполнена безостановочно, как при обычном исполнении. Команда "Шаг с выходом" доступна в любой процедуре или функции, включая главную, и выполняет в обычном режиме все команды до конца процедуры или функции, переходя затем в режим пошагового исполнения в вызвавшей программе. Разбивая программу на отдельные процедуры и функции, вы получаете возможность легко использовать повторно одни и те же фрагменты кода, обращаясь к ним из программы по мере надобности. К сожалению, увеличить быстродействие программы на VBA при этом не удастся, так как при запуске в шаблоне хотя бы одного макроса он компилируется полностью (в то время как в программах, написанных на многих других языках программирования, загрузка в память функций и процедур происходит лишь по мере обращения к ним). Работа с формами Формы — это окна интерфейса программы. С их помощью можно сообщать пользователю необходимую информацию или получать ее от него. Для создания форм используются средства редактора VBA. Если хотите наглядно посмотреть, что такое форма — откройте окно установки параметров шрифта (меню "Формат"). Создав форму (из меню правой кнопки мыши в Менеджере проектов выберите Вставить-UserForm) или дважды щелкнув на имени существующей формы, можно попасть в окно Дизайна форм. На появившейся панели инструментов "Панель управления" (если ее нет, то ее можно вызвать из меню Вид-Панель элементов) представлены все возможные элементы формы (рис. 2.4): …???… Рис. 2.4. Панель инструментов с компонентами форм 1. Поле отображения текста — отображает текстовую информацию. Просто текст на форме — совет пользователю, к примеру. 2. Поле ввода текста — дает пользователю возможность ввести текстовую информацию. Потом введенные данные можно обрабатывать в программе. 3. Несколько видов списков — средства выбора одного варианта из нескольких представленных, вроде выпадающего списка шрифтов на панели инструментов «Форматирование» в Word. Значения элементов списков задаются только в программе — при разработке формы с помощью окна "Дизайн форм" их задать нельзя. 4. Флажок — элемент, который независимо от других может находиться в трех состояниях: включенном, выключенном (могут быть определены как пользователем, так и программистом) и неактивном (определяется программой). 5. Переключатель — элемент, который также может находиться во включенном, выключенном и неактивном состояниях. В отличие от флажка, переключатели должны быть обьединены в группы с помощью элемента № 7 — рамки — и, если один из переключателей в группе включен, то остальные включены быть не могут. В Microsoft Word имеются диалоговые окна, содержащие как флажки, так и переключатели. Так, почти все вкладки меню Сервис-Параметры состоят из флажков, а меню Вставка-Сноска — из переключателей. 6. Выключатель. Это кнопка, которая может находиться в нажатом или отжатом состоянии. Например, в Microsoft Word так себя ведут кнопки показа скрытых символов или форматирования текста курсивом, жирным шрифтом, подчеркиванием. 7. Рамка. Отображает прямоугольник с заголовком. В основном используется для обьединения групп переключателей (тех, что под номером 5 в нашем списке). В одной форме может быть несколько рамок и, как следствие, несколько групп переключателей, могущих действовать независимо друг от друга. 8. Командная кнопка. Обычная командная кнопка вроде кнопок «Ok» или «Отмена» в любом диалоговом окне. 9. Набор вкладок и 10. Набор страниц. Представляют из себя набор страничек-вкладок вроде вкладок «Общие», «Сохранение», «Печать» и др. в диалоговом окне Word Сервис-Параметры. Отличие между этими двумя элементами состоит в том, что 9-й элемент при переключении на другую страничку совершенно не затрагивает другие элементы формы, даже и находящиеся на нем, и изменения в состоянии других элементов можно эадать только программно. 10-й же элемент при своем переключении принудительно (т. е. вне зависимости от программы) скрывает элементы на одной своей странице и показывает элементы на другой. Если привести пример, то 9-й элемент может использоваться в программе — базе данных, отображая вкладки с именами сотрудников. На каждого сотрудника имеется стандартная информация в нескольких полях отображения текста, и количество этих полей для всех одинаково. В этом случае разумнее использовать именно 9-й элемент, соответственно изменяя содержимое полей отображения текста при переключении вкладок, чем создавать с помощью 10-го элемента набор страничек с отдельными полями отображения текста на каждой, что приведет к резкому увеличению и усложнению программы. К сожалению, в настоящее время не сложилась твердая номенклатура этих двух элементов форм VBA, поэтому в справочной системе, в различной литературе можно встретить разные названия для каждого из них. 11. Полоса прокрутки. Такая же, как и в окне Word. Может передавать в программу число, равное расстоянию в пунктах от ее начала. Верхний предел расстояния неограничен. 12. Счетчик. Две нажимающиеся кнопки со стрелками. Может передавать в программу свое значение от 1 до 100. 13. Рисунок. В этот элемент можно вставить из файла рисунок, который будет храниться в форме (и шаблоне или документе с ней). Для вставки самого рисунка нужно после помещения на форму элемента управления Рисунок в Окне свойств выбрать пункт «Picture», нажать на кнопку слева от него и в появившемся окне открытия файла выбрать нужную картинку — рис. 2.5. У каждого элемента имеется свое уникальное имя, а также набор свойств. Их можно посмотреть в Окне свойств, выделив элемент и выбрав из контекстного меню правой кнопки мыши пункт «Свойства». Стоит внимательно изучить все возможные свойства для каждого элемента, по возможности осознав их предназначение. При необходимости можно вызвать справку по каждому свойству, поставив на него курсор и нажав F1. Большой набор свойств также имеет сама форма. С помощью выпадающего меню в Окне свойств можно быстро перейти к свойствам необходимого элемента (рис. 2.6). …???… Рис. 2.5. Вставка рисунка. на форму …???… Рис. 2.6.Выпадающее меню Окна свойств — навигатор по элементам формы Среди наиболее распространенных свойств, имеющихся почти у всех элементов — Caption (т. е. надпись на поверхности или в заголовке, если он есть), Top и Left — координаты верхнего левого угла элемента, Height и Width — высота и ширина, Enabled — доступность для изменений пользователем, TabIndex — число, показывающее, в какую очередь на данный элемент перейдет фокус (т. е. возможность изменения пользователем содержания или состояния) при переходах между элементами с помощью клавиши табуляции (можно запретить такой переход на какой-либо элемент, указав его свойство TabStop как False). Обратите внимание на свойства Picture, PictureAlignment, PictureSizeMode, PictureTiling собственно формы — с их помощью на поверхность формы можно поместить какой-нибудь фоновый рисунок. Необходимо помнить, что создание элемента — только начало работы над формой. Сам по себе элемент никаких действий не выполняет, за исключением тех, которые его определяют. Кнопка — нажимается под мышкой или Enter'ом, список показывает значения, во флажке можно поставить и убрать галку, но не более того! Для того, чтобы элемент выполнял какое-нибудь действие при действии с ним, нужно написать для него программу реакции на события. Событий, могущих произойти с элементом, много. Это и двойной щелчок мыши на нем, это и проводка мыши над ним, это и ввод текста в поле ввода, это и нажатие на вкладке, это и переход к другому элементу… Для того, чтобы написать программу обработки реакции на событие, нужно два раза щелкнуть на элементе. Откроется окно написания программ реакций на события, и автоматически написанная заготовка будет иметь вид: Private Sub CommandButton1_Click() End Sub Теперь в текст этой процедуры можно вводить команды, которые выполнятся, если событие в заголовке — Click мыши — произойдет. Это событие считается стандартным для кнопок, флажков, рисунков, рамок, переключателей и окон отображения текста. Для остальных элементов — полей ввода текста, полос прокрутки, счетчиков и др. — стандартным считается событие Change, то есть их изменение. Список возможных событий для элемента можно получить, поставив курсор внутрь процедуры обработки стандартного события и выбрав нужное из выпадающего меню справа вверху окна написания программы. В выпадающем меню слева вверху этого окна указаны все процедуры и функции программы реакции формы на события (рис. 2.7). …???… Рис. 2.7. Выпадающий список событий. В программе реакции формы на события могут быть и другие процедуры и функции, не связанные с элементами формы. У некоторых событий есть параметры, с которыми информация о его происшествии передается программе. Так, процедура обработки события KeyDown (то есть нажатия какой-либо клавиши тогда, когда активен данный элемент) имеет вид Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) End Sub Переменная KeyCode будет после срабатывания данной процедуры будет иметь значение, равное коду нажатой клавиши, а переменная Shift — 1, если соответствующая клавиша была нажата, и 0, если нет. Эти переменные можно использовать в процедуре. Все свойства, задаваемые в Окне свойств, можно изменять и из программы. Например, команда TextBox1.Enabled=True даст возможность пользователю ввести текст в поле ввода TextBox1, а команда CheckBox1.Value=False уберет отметку из флажка с именем CheckBox1. Эта возможность делает формы VBA динамическими — то есть содержимое форм может меняться немедленно в ответ на действия пользователя без выгрузки и повторной загрузки формы. Форма может работать как обычное диалоговое окно программы для Windows, — например, выбор пользователем значения из списка может каждый раз выводить в какой-нибудь из допускающих такой вывод элементов формы определенный текст, разный для разных выбранных значений. Наиболее часто возможность создания динамических форм используется для инактивации элементов, не могущих быть использованными при каких-либо условиях. К примеру, в форме, состоящей из поля ввода текста и кнопки, вызывающей процедуру вычисления квадратного корня, кнопка может становиться неактивной и не реагирующей на нажатия, если число, введенное в поле ввода, отрицательное. Для просмотра формы в режиме выполнения (то есть так, как она будет выглядеть в готовой программе) надо нажать клавишу F5 — ту же, что и для запуска на выполнение обычной программы. Все средства отладки, описанные выше, работают и при отладке форм. Стоит иметь в виду, что после выгрузки формы (методом Unload Me) все переменные, описанные в программе реакции формы на события, обнуляются. Поэтому после выгрузки формы получить от нее какие-либо данные уже нельзя. Если в результате работы формы в основную программу должны передаваться какие-либо данные, то тогда нужно в основной программе объявить несколько переменных с помощью инструкции Public (т. е. сделать их доступными для чтения и изменения из любого другого модуля), а затем в программе реакции формы на события записать в них всю необходимую информацию, полученную от пользователя, и использовать значения этих переменных в основной программе. Программа реакции формы на события представляет собой полноценный модуль проекта за одним исключением: процедуры из него могут быть вызваны только из другой программы. Вызов формы на исполнение с помощью кнопки, строки меню или сочетания клавиш невозможен. Поэтому для вызова формы необходимо в основной программе (если все необходимые функции реализованы в процедурах программы реакции формы на события, то основную программу все равно необходимо создать, хотя бы только для вызова этой формы) надо указать команду ИмяФормы. Show, а кнопки и сочетания клавиш назначать именно этой основной программе. Формы, так же как и модули, могут быть сохранены в отдельных файлах путем экспортирования функцией "Экспорт файла" своего контекстного меню правой кнопки мыши в Менеджере проектов или путем перетаскивания ее названия из Менеджера проектов в Explorer. Но, в отличие от модулей, при сохранении форм получается два файла, в одном из которых содержится текст программы реакции формы на события, а в другом — информация о расположении элементов на форме, их свойствах, а также рисунки и фон формы. Поэтому при импортировании формы необходимо, чтобы оба этих файла были в одной папке. Операторы цикла и перехода Если необходимо повторить ту или иную группу операций несколько раз, то используются операторы цикла: Do…Loop, For…Next, For Each…Next и While…Wend. Если необходимо совершить те или иные действия в зависимости от наличия или отсутствия выполнения какого-либо условия или в зависимости от значения той или иной переменной, используются операторы условия: If…Then…Else и Select Case. Если необходимо совершить переход к другой части той же программы, то используется оператор GoTo "имя метки". Там, куда должен быть совершен переход, на отдельной строке должна стоять метка с соответствующим именем, а после нее — двоеточие. Подробное описание функций, особенностей и синтаксиса всех этих операторов можно получить в справочной системе редактора VBA, поэтому не стоит здесь на них останавливаться. Просто наберите интересующий вас оператор в окне Редактора VBA, установите на него курсор и нажмите кнопку F1. В русской версии Office 97 справка по этим операторам переведена на русский язык. Полезный совет Если у вас на компьютере установлено несколько версий Microsoft Office, то вы наверняка сталкивались с одной весьма неприятной ситуацией. Microsoft Word, начиная с 2000-й версии, при каждом своем запуске сканирует системный реестр и перепрограммирует открытие файлов. doc "на себя", заставляя их открываться именно в новой версии, а не в старой. Помимо того, что это занимает немало времени, подобная ситуация мешает использовать на компьютере сразу две версии Word, работая в старой и постепенно осваивая новую. Для того, чтобы «отучить» Word2002 (из OfficeXP) перерегистрировать расширения файлов при каждом запуске, создайте в системном реестре, в разделе HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Word\ Options параметр NoRereg, имеющий формат Dword и равный 1, а чтобы сделать то же с Word2000, отредактируйте так же содержимое раздела HKEY_CURRENT_USER\Software\ Microsoft\Office\9.0\Word\Options. Подробнее о системном реестре вы можете узнать в главе 14. Глава 3. Создание первой макрокоманды В предыдущих двух главах рассказывалась о языке Visual Basic for Applications (сокращенно — VBA), его возможностях и правилах, а также о Редакторе VBA — средстве создания программ на этом языке в среде Microsoft Office. Теперь же на наглядном примере рассмотрим процесс создания простой макрокоманды для Word, подробно обьясняя и иллюстрируя все шаги этого процесса. Цель этой главы — показать ход мыслей программиста, осваивающего неизвестную ему среду разработки без предварительной подготовки. Постарайтесь внимательно ее прочитать, буквально останавливаясь на каждой строчке, ибо, единожды осознав принципы самостоятельного изучения нового языка программирования, вы потом сможете с их помощью быстро и эффективно осваивать другие средства создания программ для компьютеров. * * * У программы Microsoft Word есть огромное количество возможностей по работе с текстом. И огромные возможности по замене и поиску, и средства помещения в документ графики, не уступающие многим современным издательским системам, и средства оформления документов красивыми шрифтами и границами… Казалось бы — что еще надо, все необходимые возможности уже учтены создателями Word? Однако иногда перед пользователями встают такие задачи, разрешить которые с помощью стандартных средств Word очень трудно, а то и вовсе невозможно. Но для этого в Word, как, впрочем, и во всех компонентах пакета Microsoft Office, как раз и есть очень мощное средство разрешения подобных проблем: встроенный язык программирования. Вот наглядный пример, когда именно написание программы-макроса — единственный более-менее достойный выход из проблемы. Все документы на моем компьютере оформлены приблизительно одинаково — для удобства редактирования, переноса текста из одного документа в другой и др. Можно даже сказать, в чем заключаются эти мои предпочтения — шрифт Times New Roman, 12 пунктов, выделения — жирным и курсивом, выравнивание по ширине, все отступы абзацев равны нулю, а красная строка — 1 см. Именно в таком формате я держу все свои документы Word. Кроме того, я очень люблю формат Rtf и стараюсь, по-возможности, делать копии своих документов в этом формате. Но вот из Internet'а я скачал 50 файлов с интересующей меня информацией — скажем, рефератов по актуальным вопросам кардиологии. И все они были набраны разными людьми в соответствии с предпочтениями каждого: везде разный шрифт, разные размеры шрифта, отступы абзацев — все вкривь и вкось, выравнивание — то влево, то по ширине. В общем, работы по приведению в приемлемый вид — куча. (Для тех, кто является решительным противником однообразия оформления своих документов, приведу другую ситуацию: Вы являетесь организатором конференции, на которую все заинтересованные лица прислали свои доклады, и Вам надо привести их в однообразный вид для помещения в Internet, например, или для последующей отдельной распечатки каждого доклада.) Можно, конечно, повозиться с каждым документом: открывать, ставить нужный шрифт, отступы, сохранять в формате Word, потом Rtf… Если документов — два, да даже десять, то еще как-то можно справиться, а если их сорок или сто? И вот тут-то придут на помощь макросы. Но как можно написать программу, да-да, настоящую программу на настоящем языке программирования, ничего не зная о нем, кроме того, что он существует? Это действительно было бы очень трудно сделать на С++ или даже Delphi. Но для написания программ на VBA не надо особых знаний — они появятся в процессе работы. Важно лишь уметь думать. Итак, начинаем. Вначале я определился, что мне надо сделать с каждым документом. Во-первых, обязательно заменить шрифт на Times New Roman, 12 пунктов. Кроме того, необходимо сделать весь текст одного цвета. Во-вторых, убрать все отступы абзацев. В-третьих, заменить все выравнивание по левому краю выравниванием по ширине. Наконец, нужно обработать все документы, предварительно сохранив каждый в формате Rtf. Я открыл пару документов из общей кучи и включил запись макроса, согласившись на его имя по умолчанию — все равно потом буду его редактировать. После начала записи макроса я стал обрабатывать документ, а Word скрупулезно переводил мои действия на язык VBA. Выбрал "Правка-Выделить все", выбрал «Формат-Шрифт», поставил шрифт Times New Roman, 12 пунктов, Черный цвет. Выбрал «Формат-Абзац», обнулил все отступы и поставил одинарный межстрочный интервал и красную строку. Затем выбрал «Правка-Заменить», и, указав в графе «Формат-Абзац» для заменяемого — выравнивание влево, а для заменяющего — выравнивание по ширине, а также «Везде» в графе «Направление», провел замену выравниваний во всем тексте (выделенном целиком еще на первом шаге). После окончания всех этих действий я сохранил документ командой Файл-Сохранить. Затем я выбрал команду Файл-Сохранить в формате Rtf и сохранил документ и в этом формате, после чего закрыл его и выбрал на панели записи макроса кнопку Остановить. В принципе, назначив записанный макрос какой-нибудь кнопке или сочетанию клавиш, я мог бы на этом остановиться и обработать все документы, открыв их в Word и только нажимая на эту кнопку. Макрос бы просто выполнялся для каждого документа. Но нажимать на кнопку сорок-шестьдесят раз и сидеть около компьютера, ждать, пока все выполнится — не очень приятная перспектива. Хотелось бы, чтобы все было сделано автоматически, а самому пойти выпить кофе или чаю. А вот для этого уже надо записанный макрос отредактировать, предварительно его изучив. Итак, открываем редактор VBA и, развернув в Менеджере проектов содержимое папки Normal (то есть макросов в шаблоне Normal.dot), выберем модуль NewMacros. Именно в этот модуль попадают все макросы, записанные пользователем. Поскольку записанный нами макрос — первый, то он сразу и откроется. Вот его содержимое: Sub Макрос1() ' Макрос1 Макрос Selection.WholeStory With Selection.Font Name = "Times New Roman" Size = 12 ColorIndex = wdBlack End With With Selection.ParagraphFormat LeftIndent = CentimetersToPoints(0) RightIndent = CentimetersToPoints(0) SpaceBefore = 0 SpaceAfter = 0 LineSpacingRule = wdLineSpaceSingle FirstLineIndent = CentimetersToPoints(1) End With Selection.Find.ClearFormatting Selection.Find.ParagraphFormat.Alignment = wdAlignParagraphLeft Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify With Selection.Find Text = "" Replacement.Text = "" Forward = True Wrap = wdFindContinue Format = True MatchCase = False MatchWholeWord = False MatchWildcards = False MatchSoundsLike = False MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ActiveDocument.Save ActiveDocument.SaveAs FileName:="Доклад1.rtf", FileFormat:=wdFormatRTF, LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= False ActiveWindow.Close End Sub Разберем все его строки более подробно. Sub Макрос1() ' Макрос1 Макрос Как нетрудно догадаться, это заголовок макроса. Слово "Sub", как уже говорилось, означает начало программы. Название программы — в данном случае "Макрос1" — является уникальным именем, по которому эту программу можно запустить из других программ этого модуля. Знаки перед строчкой обозначают комментарии — то есть все, что стоит в той же строке после них, никак не влияет на работу программы. В окне редактора VBA все комментарии отображаются зеленым цветом. Selection.WholeStory Скорее всего, это — переведенная на язык VBA при записи макроса команда Выделить все. В самом деле, ведь первое действие, выполненное в процессе записи — именно выделение всего текста. Подтвердить это нетрудно, просто поставив курсор на слово «WholeStory» и нажав кнопку вызова помощи F1. Справка языка VBA устроена очень удобно — при ее вызове из редактора VBA она «смотрит», не стоит ли курсор на одном из слов, являющихся командой VBA, и, если курсор стоит именно на таком слове, то выводится справка, относящаяся к этой самой команде (рис. 3.1). Рис. 3.1. Вот что показывает справка по слову WholeStory Немножко непонятный текст, но при помощи словаря удастся перевести, что эта команда расширяет выделение на весь текст. Небольшое отступление Конечно, при самом первом знакомстве с редактором VBA эта информация вряд ли будет очевидной. Но стоит ее привести именно здесь, чтобы строение команд этого языка было более понятным. Как уже неоднократно упоминалось, язык VBA называется обьектно-ориентированнным. Такое название дано этому языку, как, впрочем, и большому количеству других современных языков программирования, из-за особого строения его команд (более подробно синтаксис VBA был описан во второй главе). Типичная команда Visual Basic имеет такой вид: <Обьект>.<Обьект, входящий в первый обьект>.<…>.<Тот обьект, с которым нужно произвести действие>.<Собственно действие>. Иными словами, каждая команда пишется как бы "с конца": вначале определяется то, над чем надо произвести действие — обьект, а затем само действие — метод. Разделителями компонентов команды служат точки. Вот пример такой команды: Selection.Font.Size = 12 Эта команда устанавливает размер шрифта во всем выделенном тексте в 12 пунктов. У обьекта Selection (то есть выделенная в данный момент часть текста) есть подобьект Font — шрифт выделенного текста, а у подобьекта Font — свойство Size. Свойство Size тоже можно считать подобьектом. Знак "=" — это оператор присваивания, в данном случае свойству Size обьекта Font обьекта Selection присваивается значение 12 — размер шрифта во всем выделенном тексте устанавливается в 12 пунктов. Если в документе ничего не выделено, то в 12 пунктов устанавливается размер текущего шрифта и следующая набранная буква будет именно такого размера. Если выделен графический обьект, то команда будет ошибочной, о чем VBA выдаст соответствующее сообщение. Кроме того, с помощью подобной команды можно получить информацию о текущем размере шрифта: а = Selection.Font.Size После ее выполнения переменная а будет иметь значение, равное размеру шрифта выделенного текста. Как видите, синтаксис команды подобен ситаксису предыдущей. Если в документе ничего не выделено, то переменная а будет иметь значение размера шрифта следующего за курсором символа. Если разные части выделенного текста оформлены разными шрифтами, то переменная а будет иметь значение 9999999. Если выделен графический обьект, то команда будет ошибочной, о чем VBA выдаст соответствующее сообщение. * * * With Selection.Font Name = "Times New Roman" Size = 12 ColorIndex = wdBlack End With Похоже, это что-то, связанное со шрифтом. В самом деле, ведь «Font» по-английски значит «шрифт», а «Selection» — «выделение». По слову «Name» можно заключить, что в этой команде устанавливается имя шрифта — "Times New Roman", а слово «Size», наверное, устанавливает его размер.".ColorIndex = wdBlack" — выглядит как команда, устанавливающая цвет шрифта: есть слово «Color» — «цвет» и есть слово «Black» — «черный». Но чтобы не гадать попусту, посмотрим справку VBA — поставим курсор на слово «Selection» и нажмем F1 (рис. 3.2). Рис. 3.2. Справка по слову "Selection" Используя англо-русский словарь, можно узнать, что «Selection» означает выделенный текст или точку ввода текста. Посмотрим справку по слову «Font» (рис. 3.3). Рис. 3.3. Справка по слову "Font" Что-то маловато информации. Ну, ясно, что шрифт, а как пишется команда, какие у нее могут быть еще параметры? Нажмем-ка на подчеркнутое слово «Font» в тексте — это выведет информацию об обьекте «Font» (рис. 3.4). Рис. 3.4. Справка об обьекте "Font" Ну, теперь все ясно. Даже примеры приведены, — и очень похожие на наш макрос. Посмотрим тогда ссылку «Properties» вверху окна справки — список свойств шрифта, которые можно задать в программе (рис. 3.5). Рис. 3.5. Список свойств обьекта "Font" Это, кстати, такой же список, как и тот, что выпадает в качестве контекстной подсказки, если при наборе текста программы вручную поставить после слова «Font» точку. Видно, что там есть все свойства шрифта, задаваемые в макросе: и «Name», и «Size», и «ColorIndex». Можно при желании почитать про каждое свойство подробно, но, наверное, лучше разобраться с командой «With», которая встречается и в нашем макросе, и в справке по слову «Font». Ставим на нее курсор и нажимаем F1 (рис. 3.6). Рис. 3.6. Справка по слову "With" Даже на русском (некоторые разделы справки VBA переведены на русский язык). Ну и прекрасно — прочтя справку, узнаем, что "Инструкция With позволяет выполнить последовательность инструкций над указанным объектом, не повторяя задание имени объекта." То есть она позволяет сократить обьем кода и облегчить ориентировку программиста в нем, — иначе, без этой функции, рассматриваемый фрагмент кода нашего макроса имел бы вид Selection.Font.Name = "Times New Roman" Selection.Font.Size = 12 Selection.Font.ColorIndex = wdBlack что и выглядит некрасиво, и места больше требует. Примем к сведению. Идем дальше: With Selection.ParagraphFormat LeftIndent = CentimetersToPoints(0) RightIndent = CentimetersToPoints(0) SpaceBefore = 0 SpaceAfter = 0 LineSpacingRule = wdLineSpaceSingle FirstLineIndent = CentimetersToPoints(1.27) End With Это — команда установки параметров выделенных абзацев: отступов, межстрочного интервала, красной строки. Нетрудно получить эту информацию из справки или просто догадаться, — ведь «Paragraph» означает «абзац». Впрочем, проверим — так ли это. Откроем какой-либо документ и запишем новый макрос — выделив пару абзацев, включим запись макроса и поставим этим двум абзацам отступы сверху, снизу, справа и слева по одному сантиметру, а межстрочный интервал — полуторный. Вот что получилось: Sub Макрос2() ' Макрос записан 26.01.00 With Selection.ParagraphFormat LeftIndent = CentimetersToPoints(1) RightIndent = CentimetersToPoints(1) SpaceBefore = 1 SpaceAfter = 1 LineSpacingRule = wdLineSpace1pt5 Alignment = wdAlignParagraphJustify WidowControl = True KeepWithNext = False KeepTogether = False PageBreakBefore = False NoLineNumber = False Hyphenation = True FirstLineIndent = CentimetersToPoints(1) OutlineLevel = wdOutlineLevelBodyText End With End Sub Что-то не то! Код какой-то большой и много новых команд, которых не было записано в первый раз! Какие-то".WidowControl", ".KeepWithNext"… Впрочем, ясно, что это свойства абзаца — наверное, "Контроль висячих строк", "Не отрывать от следующего". Но почему же в первый раз записанный код был гораздо меньше, и все было "по делу"? Сравним оба случая. В прошлый раз все абзацы в документе были оформлены по-разному, а в этот раз оформление обоих абзацев было одинаковым. Может, в этом дело? И действительно, поэкспериментировав еще (уж не буду здесь приводить все тексты), позаписывав макросы при оформлении разнооформленных абзацев и одинаково оформленных, можно прийти к выводу, что в текст записанного макроса попадают те свойства, которые после установки параметров абзацев через диалоговое окно "Формат"-"Абзац" оказываются одинаковыми у всех обрабатываемых абзацев! И неважно, были ли эти свойства установлены такими именно сейчас, или когда-то ранее. Небольшое отступление Средство записи макросов VBA отслеживает не столько действия пользователя, сколько изменения параметров текста. Поэтому при задании свойств абзаца с помощью соответствующего диалогового окна "Формат"-"Абзац" оно скрупулезно записывает в макрос все параметры этого диалогового окна, которые в нем были заданы при нажатии кнопки Ok. Если абзацы имели разное оформление, которое не было изменено в данный момент на единообразное, то те пункты данного диалогового окна, которые остались различными у разных абзацев в выделении, будут иметь неопределенное значение, и средство записи макросов не сможет их поместить в текст записываемого макроса. В самом же диалоговом окне подобные неопределенные опции отображаются галочкой на сером фоне, а в полях указания размеров отступов не стоят их значения. Если же все выделенные абзацы были оформлены единообразно, то все значения диалогового окна "Формат"-"Абзац" будут определены, и все они попадут в текст макроса. Лишние команды задания свойств, оказавшиеся в тексте макроса при его записи, рекомендуется удалить с целью сокращения размера программы и для исключения излишних заданий свойств — программа должна изменять лишь те свойства текста, для изменения которых она создавалась. Если при вызове диалогового окна параметров текста или шрифта во время записи макроса в документе ничего не было выделено, то будут определены все параметры диалогового окна, и в макрос попадут все свойства, могущие быть указанными в окне. Установленные параметры будут использоваться для вновь набираемого текста. Параметры таких диалоговых окон, как "Файл"-"Параметры страницы" или "Файл"-"Печать" определены полностью всегда, и поэтому при записи макроса в его текст будут записываться все возможные параметры этих диалоговых окон, вне зависимости от того, были ли изменены они все или изменению подверглись лишь некоторые. * * * Идем дальше. Selection.Find.ClearFormatting Selection.Find.ParagraphFormat.Alignment = wdAlignParagraphLeft Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify With Selection.Find Text = "" Replacement.Text = "" Forward = True Wrap = wdFindContinue Format = True MatchCase = False MatchWholeWord = False MatchWildcards = False MatchSoundsLike = False MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll Насколько помнится, при записи макроса мы вызывали функцию замены Word для изменения всего выравнивания абзацев по левому краю на выравнивание по ширине. И вот перед нами эта функция, вызов которой записан на языке VBA. По всей видимости, строчка "Selection.Find.ClearFormatting" означает очищение параметров форматирования в окне замены — эквивалент нажатию кнопки "Снять форматирование", а фразы "Selection.Find.ParagraphFormat.Alignment = wdAlign ParagraphLeft" и "Selection.Find.Replacement.Paragraph Format.Alignment = wdAlignParagraphJustify" — установка параметров того, что надо искать — выравнивания «Left» (то есть по левому краю) и того, на что надо заменять — выравнивания «Justify» (по ширине). Нетрудно было догадаться — просто переведя с английского языка значения слов, входящих в команды: «Selection» — выделение, "Find.Replacement" — найти и заменить, «ParagraphFormat» — формат абзаца, «Alignment» — выравнивание, "AlignParagraphJustify" — «РавнятьАбзацПоШирине». Что ж, ясно. Оператор «With» нам уже знаком — в следующим за разобранными нами строчками фрагменте речь пойдет об окне "Найти и заменить". Легко сообразить, что все параметры обьекта "Selection.Find" (то есть поиска в выделенной части текста или во всем тексте) соответствуют параметрам окна "Найти и заменить": ".MatchWholeWord" — "искать целое слово", ".MatchCase" — "учитывать регистр".".Text" — здесь, наверное, надо указать заменяемый текст, а".Replacement.Text" — здесь то, на что заменить. В нашем случае заменять надо не текст, а форматирование, поэтому эти строчки пусты. Заметив повторения слов "Selection.Find" в первых четырех строчках, можно посчитать, что и их содержимое можно включить в блок оператора «With». Проверим-ка это. Чуть ниже последнего записанного нами макроса напишем строчку: "Sub experience1()" (имя после «Sub» может быть любым, важно лишь, чтобы оно не совпадало с какой-либо командой VBA). Нажмем Ввод — парой строчек ниже редактор VBA напишет: "End Sub". С помощью команд «Копировать» и «Вставить» скопируем из нашей программы в текст нового макроса блок "With Selection.Find". А затем переместим все строчки, относящиеся к отражению в макросе работы окна "Найти и заменить" в блок "With Selection.Find", убрав слова "Selection.Find": Sub experience1() With Selection.Find ClearFormatting ParagraphFormat.Alignment = wdAlignParagraphLeft Replacement.ClearFormatting Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify Text = "" Replacement.Text = "" Forward = True Wrap = wdFindContinue Format = True MatchCase = False MatchWholeWord = False MatchWildcards = False MatchSoundsLike = False MatchAllWordForms = False Execute Replace:=wdReplaceAll End With End Sub Попробуем программу в деле. Откроем еще один документ из общего набора и запустим клавишей F5 новый макрос на выполнение (курсор должен стоять внутри текста запускаемого макроса). Все прекрасно! Замена произошла так, как необходимо. Значит, ясно — так сокращать текст программы можно. Осталось еще несколько интересных строчек, конкретное значение которых может вызвать вопросы — ".Forward = True", ".Wrap = wdFindContinue", ".Execute Replace:=wdReplaceAll". Ну, первая — это направление поиска — вперед или назад (тогда бы там было значение "False"). Но что значит вторая? А запишем-ка для выяснения еще макрос с такой же заменой выравнивания влево на выравнивание по ширине, но с разными параметрами направления поиска. Вот что получилось: Видно, что наличие или отсутствие согласия на продолжение поиска не влияет на записываемый текст. А как же тогда отказаться от запроса на продолжение? Откроем текст макроса и поставим после команды".Wrap" еще один знак "=" (рис. 3.7). Ну вот, все и ясно — для отказа от продолжения замены после достижения конца документа нужно поставить значение параметра".Wrap" как «wdFindStop». То есть вышеприведенная таблица должна иметь вид Осталось разобраться со строчкой".Execute Replace:= wdReplaceAll". По логике вещей, это должна быть команда запуска поиска, тем более что и слово «Execute» означает «Запустить». Посмотрим в справке — по слову «Execute». Так, четыре ссылки: "For information about the Execute method, click one of the following object names: Dialog, Find, KeyBinding, MailMerge". Нас интересует вторая — «Find», так как мы работаем именно с этим обьектом. Открываем… Так и есть — команда".Execute" запускает команду поиска и замены на выполнение: "Runs the specified find operation. Returns True if the find operation is successful.". Из текста справки также узнаем, что все параметры поиска и замены можно было бы задать и в скобках, а, кроме того, результат выполнения команды можно записать в переменную — успешен ли был поиск или нет (то есть были ли найдены в данном сеансе работы команды "Найти и заменить" искомые элементы). Сейчас данная возможность не требуется, однако запомнить ее стоит — мало ли когда пригодится. Продолжаем изучать записанную макрокоманду. ActiveDocument.Save Вопросов не вызывает — это команда сохранения активного документа. ActiveDocument.SaveAs FileName:="Доклад1.rtf", FileFormat:=wdFormatRTF, LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= False А вот здесь уже понадобится редактирование. Это команда "Сохранить Как…" — поскольку соответствующая команда Word представляет собой диалоговое окно, то в текст макроса помещаются все возможные параметры, как соответствующие установленным по умолчанию, так и нет: «AddToRecentFiles» — добавлять ли ярлык в папку «Recent», «EmbedTrueTypeFonts» — внедрять ли шрифты TrueType. Наиболее интересны элементы "FileName:="Доклад1.rtf"" и "FileFormat:=wdFormatRTF" — имя файла, под которым сохраняется активный документ, и тип сохраняемого файла. Тип нас устраивает — формат Rtf. А вот как быть с именем? Ведь у каждого файла должно быть свое, уникальное имя. Попробуем для начала просто исключить строчку с указанием имени из текста данной команды. Создадим еще один модуль, скопируем туда всю команду "ActiveDocument.SaveAs" со всеми параметрами и удалим строчку "FileName:="Доклад1.rtf"". Запустим программу… ничего не произошло. Но ведь программа что-то делала: и жесткий диск работал, и система была недоступна пару секунд, и сообщений об ошибках не было… Что же все же сработало? А откроем-ка в «Блокноте» или другом редакторе простого текста файл, который сохранялся — у меня это был файл "Доклад2.doc", предварительно выгрузив его из Word (рис. 3.8). Рис. 3.8. Откроем в «Блокноте» файл, который сохранялся нашей командой Так вот в чем дело — файл был сохранен в формате Rtf, но под прежним именем и с расширением".doc"! Но нас это не устраивает — имя пусть будет то же, а вот расширение должно быть именно".rtf". Интересно, а что будет, если запустить эту программу при активном ни разу не сохранявшемся документе? Запускаем… Активный документ приобрел имя "Doc1.doc" (ну, или "Doc2.doc", "Doc3.doc" — у кого как). Но где он сохранился? Ищем по F3 в Explorere — так, сохранен он в папке, где произошло последнее ручное сохранение какого-либо файла или в папке для документов Word по умолчанию.[3 - "Мои документы" или другая, заданная пользователем, путь к которой можно посмотреть во вкладке "Сервис"-"Параметры"-"Расположение"] Следовательно, при программном сохранении ранее несохранявшегося документа без задания ему имени и места сохранения (место сохранения можно задать, включив в имя документа в пункте «FileName» полный путь к его новому местоположению) происходит сохранение активного документа в папке по умолчанию (или в папке, где был последний раз сохранен вручную какой-нибудь документ) и с именем по умолчанию. Примем к сведению. Но как же нам быть с нашей программой? Нам ведь надо, чтобы все обрабатываемые файлы сохранялись под своим именем и в формате и с расширением Rtf! А попробуем-ка каким-нибудь способом получить программно имя активного документа. Создадим еще один макрос, и напишем там «ActiveDocument», ставим точку (рис. 3.9) и видим, что среди возможных продолжений команды есть свойство "Name". Рис. 3.9. А так можно найти нужное продолжение команды. Похоже, это и есть то, что нам надо. Проверим. Модифицируем экспериментальную процедуру следующим образом: Sub experience2() MsgBox ActiveDocument.Name End Su Это позволит нам вызвать окно сообщения с значением функции "ActiveDocument.Name". Можно было бы написать "Debug.Print ActiveDocument.Name", что отобразило бы значение этой функции в специальном Окне отладки (вызывается из меню редактора VBA "Вид"-"Окно отладки"). Но использовать окно сообщения как-то привычнее. Итак, нажимаем F5… получаем окно с сообщением: "Доклад1.doc". Но нам ведь нужно одно только имя, без расширения! Как же его получить? Наверное, проще всего убрать последние четыре символа — ".doc". Но как? Воспользуемся справкой. Нажмем F1 в редакторе VBA, в открывшемся окне нажмем кнопку «Разделы», а там — "Предметный указатель", — в нем все разделы справки классифицированы по смыслу, в то время как в разделе «Поиск» лишь составлена база данных по всем словам, входящим в справочную систему VBA. Наберем в строке поиска слово «строка». Из списка разделов справочной системы VBA выберем то, что нам надо — строчку "крайние левые символы" (ведь нам нужно получить из имени документа с расширением только его имя, то есть левую часть строки без четырех правых символов, то есть крайние слева символы). Получаем справку по функции «Left» (рис. 3.10). Рис. 3.10. Справка по функции Left. Превосходно — функция «Left» является именно той функцией, которая нам требовалась. Но она требует значение количества символов во всей строке — как это узнать? Да так, как описано в данном справочном окне в разделе "Дополнительные сведения" — через функцию «Len». Нажмем ссылку "См. также", выберем из списка строчку "Функция Len" и изучим появившуюся информацию.[4 - Повторите это на своем компьютере.] Немного подумав и использовав данные о синтаксисе обеих команд в справке, можно написать команду, которая возвращает строку без последних четырех символов: imyadoc = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4) Можно проверить. Создадим еще один модуль: Sub experience3() imyadoc = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4) MsgBox imyadoc End Sub и запустим его. В окне сообщения — имя документа без расширения. Все так, как нам необходимо. Небольшое отступление Вышеизложенный способ получения имени активного документа без расширения — не самый лучший, хотя имеет право на существование. Есть еще один способ узнать только имя документа, унаследованный из предыдущих версий Word, — в Word 6.0 и Word 95 была специальная команда для получения имени документа, к сожалению, в VBA не включенная. Однако она может быть использована в VBA, так как макросы для Word 6.0 и Word 95 могут выполняться и в более новых версиях Office. При открытии в Office 97/2000/XP шаблонов с макросами, созданных в предыдущих версиях Office, все макросы автоматически конвертируются для выполнения в VBA с помощью включенной в него версии языка WordBasic, на котором писались макрокоманды для Word 6.0 и Word 95. В Word 6.0 и Word 95 имелась функция "FileNameInfo$(документ, параметр)", с помощью которой можно было получить имя документа без расширения, путь к документу без имени и путь к документу вместе с именем. Для того, чтобы узнать одно имя документа, без расширения и пути, значение параметра должно быть равно 4. (Все это подробно описано в справке по WordBasic для Microsoft Word 6.0 и Microsoft Word 95.) В VBA эта функция будет выглядеть так: imyadoc = WordBasic.[FileNameInfo$](ActiveDocument.Name, 4) Она возвращает полное имя документа без расширения и пути. Данная функция просто незаменима при обработке документов с расширениями, состоящими не из трех символов — например, ".html". В то время как в таких случаях с помощью функций «Len», «Mid», «Right» пришлось бы писать огромные фрагменты кода для получения имени документа без расширения, эта функция позволит получить его одной строчкой. Однако при первой работе с VBA она не будет очевидной, так как узнать о ней, и тем более о ее необходимых параметрах может только тот, кто раньше имел дело с WordBasic. Поэтому в нашей программе будет использоваться предыдущая функция — "imyadoc = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4)". Вообще говоря, иногда бывает очень полезным воспользоваться старыми командами WordBasic, которые остались в нем от предыдущих версий. К сожалению, в справке не освещено их применение, однако, если на вашем компьютере установлены сразу две версии Word, то вы можете узнать о таких командах в справке предыдущей версии. * * * Итак, команда нашей программы "ActiveDocument.SaveAs" должна выглядеть так: ActiveDocument.SaveAs FileName: = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF, LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= False Все лишнее можно убрать, хотя это не обязательно: ActiveDocument.SaveAs FileName: = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF Не мешало бы еще, чтобы новый документ в формате Rtf сохранялся в той же папке, что и исходный. Для этого добавим к параметру «FileName» информацию о пути к активному документу: ActiveDocument.SaveAs FileName:=ActiveDocument.Path + "\" + Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF Иначе Word будет сохранять документы в той папке, где последний раз был сохранен или открыт како-нибудь документ с помощью диалоговых окон "Сохранить как…" и "Открыть…". А это все же не всегда будет той же самой папкой, где находятся обрабатываемые документы, — к тому же документы для обработки можно открывать в Word и путем перетаскивания иконки файла в окно редактора, а при таком способе открытия папка сохранения документов не меняется. И, наконец, последняя строчка: ActiveWindow.Close End Sub Вот и конец программы — закрытие активного окна с документом. Ну, а теперь надо добиться того, чтобы программа могла обрабатывать не один документ, а сразу множество. Можно пойти двумя путями: либо обрабатывать все нужные документы в одной папке, либо обработать все открытые документы, предварительно открыв нужные. Лично я предпочел второй вариант: ведь тогда можно открыть для обработки все действительно необходимые документы, несмотря на их исходное расположение — пусть даже и не в одной папке. Как это сделать? Заметим, что готовый документ закрывается после обработки, и в окне Word активизируется следующий документ из всех открытых в редакторе. Следовательно, во-первых, надо обеспечить выполнение макроса над всеми документами, то есть его повторение — после окончания работы макроса он должен быть выполнен сначала. Можно считать, что в момент обработки в окне Word будут открыты лишь те документы, которые обработать надо — лишние всегда можно закрыть, а если так уж необходимо оставить их открытыми, то ничего не мешает открыть для обработки файлов новое окно Word. Для выполнения макроса сначала нужно заставить VBA перейти в начало программы. Поищем в справке VBA, в Предметном указателе по слову «переход» — есть ли какая команда для этого? Получаем список — «безусловные», "при ошибке", "условные".[5 - Повторите это на своем компьютере.] Выберем «Безусловные» — ведь в нашей программе надо обязательно перейти к обработке следующего документа. Получаем выбор из двух функций — выберем вторую, название короче — наверняка ее использование проще. Из справки и примера узнаем, что инструкция (то есть функция, которая не возвращает никаких значений) «Goto» указывает на необходимость перехода к строке, на которой находится установленная нами метка. Поставим метку[6 - Не стоит поддаваться мнению, что "использование оператора goto — дурной тон". Это не так. Каждый оператор выполняет свою функцию, и если какая-либо проблема может быть лучше всего решена применением именно этого оператора, то его и надо использовать. Дурной тон — делать сложно там, где можно сделать просто.] в начало нашей программы: Sub Макрос1() ' Макрос1 Макрос metka: Selection.WholeStory With Selection.Font Name = "Times New Roman" … … … … а в ее конец — инструкцию "Goto": … … … … ActiveDocument.SaveAs FileName:=ActiveDocument.Path + "\" + Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF ActiveWindow.Close Goto metka End Sub Готово. Теперь наша программа обработает все открытые документы. Но… обработать-то обработала, но в конце выдала сообщение об ошибке. Можно, конечно, оставить и так, но программа, заканчивающая свою работу ошибкой, пусть и после выполнения всех необходимых действий, выглядит некрасиво. Поэтому нужно обеспечить остановку выполнения программы после того, как будут обработаны все документы. Итак, алгоритм действий программы должен быть таков: 1. Выполнить обработку активного документа, сохранить его и закрыть. 2. Посмотреть, есть ли еще открытые документы. 3. Если есть, то перейти к пункту 1, если нет, то завершить работу. "Если" — по-английски «If». Поищем по этому слову в Предметном указателе справки. Получаем строчку: "Инструкция If", выбрав которую, получаем окно из различных сочетаний слов If, Then, Else и др.[7 - Повторите это на своем компьютере.] Выберем "Инструкция If…Then…Else" — вроде первое слово понятнее. Получаем справку, из которой узнаем синтаксис команды: If условие Then [инструкции] [Else инструкции_else] Какое же условие должно быть у нас? Наверное, подсчет количества открытых документов — если не 0, то продолжать работу, а если 0, то остановиться. А как можно подсчитать количество открытых документов? Посмотрим, нет ли в VBA команды для такого подсчета? Напишем в тексте программы: «Documents», поставим точку и просмотрим выпавший список. Так и есть — в списке имеется метод «Count»: скорее всего, это функция подсчета. Выберем ее из списка и посмотрим по ней справку и пример — да, эта команда считает открытые документы. То есть условие должно выглядеть как "If Documents.Count > 0 Then … ". Ну, а инструкции — переход к метке — нами уже написаны. Часть команды "Else …" можно опустить, а просто написать нужные инструкции после команды "If…" — ведь все равно к их выполнению программа не перейдет до тех пор, пока останутся открытые документы. А поместить там, наверное, стоит вызов сообщения, желательно со звуковым сигналом, — чтобы можно было поставить документы на обработку и отойти. Используем функцию MsgBox (о ее синтаксисе подробно написано в справке): signal = MsgBox("Обработка закончена", vbInformation, "Обработка текстов") Итак, программа готова. Можно с помощью диалогового окна «Настройка» назначить ей кнопку, пункт меню или сочетание клавиш, и запускать ее при необходимости. Однако попробуем ее еще улучшить. Сделаем так, чтобы все обработанные документы сохранялись не в своих папках, а в отдельной, задаваемой пользователем, и чтобы пользователь мог выбрать эту папку из стандартного диалогового окна, похожего на Проводник. Опять воспользуемся Справкой. В Предметном указателе зададим слова "dialog boxes", выберем эту же строчку из списка тем. В появившемся окне выбора выберем второе — "Displaying Built-In Word Dialog-Boxes", так как это, судя по названию, более общая тема, чем список аргументов диалоговых окон. Читаем… В переводе текст справки означает, что с помощью команды Dialogs("имя диалога"). Show можно вызвать на экран любое встроенное диалоговое окно Word, вроде окна открытия файла или сохранения в папке. Попробуем найти окно, которое возвращало бы путь к какой-нибудь директории. Для этого создадим очередной экспериментальный модуль и будем перебирать в нем все возможные имена диалоговых окон (рис. 3.11). Рис. 3.11. Для поиска нужной команды можно перебрать список встроенных диалоговых окон Word. В качестве метода вывода окна на экран установим".Display" — вывод окна на экран без каких-либо последующих действий: если с помощью команды Dialogs(wdDialogFileOpen). Show будет выведено окно открытия файла, то при нажатии кнопки «Открыть» в нем выбранный в окне файл будет открыт, а если окно выводилось командой Dialogs(wdDialogFileOpen). Display, то открытия файла не произойдет, но имя выбранного файла можно будет записать в переменную: With Dialogs(wdDialogFileOpen) Display imya=.Name End With и впоследствии использовать это имя по своему усмотрению. При использовании встроенных диалоговых окон Word обязательно использование оператора With, так как, казалось бы, эквивалентный фрагмент кода Dialogs(wdDialogFileOpen). Display imya=Dialogs(wdDialogFileOpen). Name работать не будет. После перебора остановимся на окне Dialogs(wdDialogCopyFile) — копирование файла. Посмотрев ссылку "Built-in dialog box argument lists" окна "Displaying built-in Word dialog boxes", получаем список всех возможных аргументов диалоговых окон (то есть параметров, значения которых можно получить из окон или задать им). Нас интересует параметр «Directory» (папка, куда скопируется файл, указанный в параметре «FileName» при выполнении метода «Show» или «Execute» — при выполнении последнего метода происходит задание или получение необходимой информации из параметров диалогового окна без отображения собственно диалога). Поэкспериментируем с этим окном — напишем в экспериментальном модуле следующий код: Sub experience4() With Dialogs(wdDialogCopyFile) Display papka =.Directory End With MsgBox papka End Sub Запустив эту программу несколько раз, получаем, что в переменную «papka» записывается путь и имя папки, но, если в пути или имени были пробелы, то путь окаймляется кавычками: "C: \Program Files\Microsoft Office\Шаблоны\", а если пробелов в пути не было, то кавычки по краям не ставятся. Поэтому возвращаемую переменную нужно обработать — убрать кавычки. Сделать это можно с помощью уже известных нам команд «Left», «Rigth», «Mid» и "Len": If Right(papka, 1) = Chr$(34) Then papka = Mid(papka, 2, Len(papka) — 2) "Chr$(34)" — это команда, которая возвращает символ с ASCII-кодом 34: кавычку. (Каждый символ в Dos и Windows имеет свой номер — ASCII-код, по которому его можно вызвать на экран. Узнать код выделенного символа можно командой "MsgBox Asc(Selection.Text)". Узнать о командах "Chr$" и «Asc» можно, порывшись в справке.) Кроме того, не мешало бы сделать так, чтобы при запуске программы окно "Копирование файла" по умолчанию стояло бы на директории с активным документом — не всегда же нужно сохранять все обрабатываемые документы в отдельной папке! Нет ничего проще — установим параметр «Directory» как "ActiveDocument.Name" перед командой".Display": With Dialogs(wdDialogCopyFile) Directory = ActiveDocument.Path Display papka =.Directory End With If Right(papka, 1) = Chr$(34) Then papka = Mid(papka, 2, Len(papka) — 2) Это и есть необходимый код для отображения диалогового окна и получения пути к папке для сохранения обработанных документов. Наконец, сделаем так, чтобы нажатие кнопки «Отмена» в диалоговом окне приводило бы не к простому продолжению работы программы, а к выходу из нее. Для этого в справке по слову".Display" узнаем, что эта команда является функцией — то есть возвращает определенное значение, в зависимости от того, какая кнопка была нажата. Добавим в программу условие и команду выхода из программы: With Dialogs(wdDialogCopyFile) Directory = ActiveDocument.Path If.Display = 0 Then Exit Sub papka =.Directory End With If Right(papka, 1) = Chr$(34) Then papka = Mid(papka, 2, Len(papka) — 2) Теперь при нажатии кнопки «Отмена» в диалоговом окне выбора папки произойдет выход из программы. Окончательный вид нашего макроса: Sub Макрос1() ' Программа для обработки документов With Dialogs(wdDialogCopyFile) Directory = ActiveDocument.Path If.Display = 0 Then Exit Sub papka =.Directory End With If Right(papka, 1) = Chr$(34) Then papka = Mid(papka, 2, Len(papka) — 2) metka: Selection.WholeStory With Selection.Font Name = "Times New Roman" Size = 12 ColorIndex = wdBlack End With With Selection.ParagraphFormat LeftIndent = CentimetersToPoints(0) RightIndent = CentimetersToPoints(0) SpaceBefore = 0 SpaceAfter = 0 LineSpacingRule = wdLineSpaceSingle FirstLineIndent = CentimetersToPoints(1.27) End With Selection.Find.ClearFormatting Selection.Find.ParagraphFormat.Alignment = wdAlignParagraphLeft Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify With Selection.Find Text = "" Replacement.Text = "" Forward = True Wrap = wdFindContinue Format = True MatchCase = False MatchWholeWord = False MatchWildcards = False MatchSoundsLike = False MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ActiveDocument.Save ActiveDocument.SaveAs FileName:=papka + Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF ActiveWindow.Close If Documents.Count > 0 Then GoTo metka signal = MsgBox("Обработка закончена", vbInformation, "Обработка текстов") End Sub * * * Весь приведенный выше подробный разбор написания первой макрокоманды, возможно, кому-то показавшийся излишне подробным, помещен здесь исключительно для того, чтобы читающий эти строки мог представить себе ход рассуждений и мыслей, необходимый для создания макрокоманд, и тем самым освоить некоторые приемы анализа программного кода и самостоятельного обучения программированию на VBA. Ведь книга рассчитана не на профессиональных программистов, которые, без сомнения, знают эти приемы, а скорее на тех, кто ранее вообще не имел представления об этой отрасли человеческой деятельности. А эти приемы таковы: 1. Для самого первого начала работы, а также для выяснения, какая команда соответствует тому или иному преобразованию текста или другому действию пользователя Word, необходимо широко использовать основное отличие редактора VBA от редакторов других языков программирования — средство записи макросов. Наличие средства записи макросов позволяет быстро и легко создать свою первую программу и начать ее изучать, а также может оказать серьезную помощь, когда необходимо «перевести» на язык VBA какое-либо действие пользователя Word. 2. Для грамотного написания кода, выяснения возможных продолжений каждой команды следует широко использовать контекстную подсказку VBA, которая появляется при наборе точки или скобки после уже написанной части команды. 3. Справка VBA — основной источник знаний по этому языку! Она построена по контекстному принципу — при вызове справки клавишей F1 отображается справка по той команде, на которой стоит в это время курсор. Таким образом можно быстро и легко изучить назначение, синтаксис и особенности каждой команды — стоит только набрать ее и вызвать справку. К сожалению, многие разделы справки не переведены на русский язык, поэтому англо-русский словарь (или система машинного перевода) может стать вашим спутником на время освоения VBA. Путешествия по справке и чтение различных ее разделов, даже не относящихся к непосредственно выполняемой задаче, обогатит Ваши знания по программированию в Word и не только… 4. Примеры справки VBA — работа, сделанная за вас! Копируйте фрагменты кода из примеров себе в программу и модифицируйте их так, как вам надо. 5. Для тестирования и отладки небольшого фрагмента кода или даже одной команды вынесите ее временно в отдельный модуль — проще будет работать. В принципе, этих приемов хватит, чтобы начать полноценно изучать VBA. Ну, а дальнейшее зависит уже от вашего разума, логики, сообразительности и наблюдательности. Visual Basic for Applications, пожалуй, на настоящее время единственный язык, который можно изучить абсолютно самостоятельно, без каких-либо дополнительных книг или текстов программ, достаточно лишь иметь "научный взгляд на мир", то есть способность наблюдать, экспериментировать и делать выводы. Даже эти главы имеют цель не столько научить вас программировать на VBA, сколько помочь вам начать учиться, чтобы вы не тратили множество времени на поиск и получение информации о не совсем очевидных вещах. Ведь, согласитесь, совсем неплохо облегчить вам начало работы и знакомство с возможностями редактора, немного проиллюстрировав процесс программирования. Автогонки в Excel 2000 Если в программе Microsoft Excel 97 имеется встроенная игра-"леталка", то в следующей версии этой программы работы с электронными таблицами присутствуют даже настоящие автогонки! Так что не стоит удивляться большим размерам программ от Microsoft, — каждая из таких программ умеет многое, в том числе и играть. Автогонки из Excel 2000 Как же добраться до этой автотрассы? Запустите Excel 2000 и создайте новую книгу с помощью команды «Создать» из меню «Файл». Затем сохраните эту книгу как web-страницу с помощью соответствующей команды (т. е. "Сохранить как Web-страницу") того же меню, при этом в диалоговом окне сохранения установите в разделе «Сохранить» отметку в пункте "выделенное: Лист" и поставьте галочку в пункте "Добавить интерактивность". Откройте полученную страницу в браузере Microsoft Internet Explorer, во внедренном в нее листе Excel перейдите с помощью клавиши PageDown к строке 2000, а с помощью линейки горизонтальной прокрутки — к столбцу WC. Выделите строку 2000 (просто нажав мышью на ее номер в указателе номеров строк слева листа) и с помощью клавиши Tab переведите выделение на ячейку WC2000. После этого, нажав одновременно левые клавиши Ctrl, Alt и Shift, кликните левой кнопкой мыши на эмблеме Office в левом верхнем углу внедренного в web-страницу листа Excel. Вот вы и на трассе… Ехать вперед — клавиша "стрелка вверх", тормозить — "стрелка вниз", поворачивать — соответственно стрелки вправо и влево. Включить фары — клавиша «о» (латинская), пробел — стрелять и уничтожать машины соперников. Соприкосновение с обочиной означает проигрыш: аварию автомобиля. На трассе чередуются ночь и день, — ночью освещение дороги дают только фары. На асфальте написаны имена разработчиков Excel'а. Поскольку игра базируется не только на Excel'е, но и на средствах сопряжения этой программы с web-страницей, в том случае, если игра у вас не запускается, проследите, чтобы на компьютере были установлены Microsoft Web Components (компонент Office 2000) и в том случае, если они отсутствуют, установите их из дистрибутива Office. К сожалению, в Excel XP ни автогонки, ни «леталка» не присутствуют. Однако наверняка в скором времени можно будет услышать, как в этой программе запустить какую-нибудь Free Space или еще что почище… Глава 4. Пусть программа с вами говорит… Продолжим изучение программирования на Visual Basic for Applications (напомним — сокращенно VBA). Подробные описания теперь уже не нужны — достаточно лишь заострения внимания на некоторых "подводных камнях" или скрытых возможностях. В этой главе речь пойдет о так называемых "пользовательских формах". Формально они являются "нестандартными диалоговыми окнами" макросов, наподобие диалоговых окон Word, но по сути с их помощью можно создавать настоящие программы, подобные компилируемым программам для Windows, которые будут отличаться от них лишь тем, что для их работы необходим Microsoft Word. К сожалению, формы нельзя создавать с помощью средства записи макросов, но все средства создания форм снабжены подробной справкой, и на ее основе можно довольно быстро научиться работать с формами. Для создания формы необходимо в любом доступном проекте (шаблоне или документе) из контекстного меню правой кнопки мыши в Менеджере проектов выбрать Вставить-UserForm. Форма состоит из элементов-различных средств ввода и отображения информации (командных кнопок, мест для ввода текста, мест для вывода текста, переключателей и флажков и др.), которые могут на ней располагаться. У каждого элемента есть свойства-ширина, высота, цвет, особенности внешнего вида и поведения. Более подробно об элементах форм рассказывалось во второй главе. Основное отличие программного кода, обслуживающего формы, от кода в обычных модулях заключается в принципе программирования. В то время как программа на VBA вроде той, что была нами совместно написана в предыдущей главе, чаще всего выполняется «последовательно», — то есть все ее команды выполняются одна за другой, и их порядок выполнения изменяется лишь в зависимости от операторов условного и безусловного перехода «If» и «Goto», форма "реагирует на события" — то есть каждому элементу формы может быть поставлена в соответствие определенная отдельная программа, выполняющая нужные действия. Большинство программ для Windows, да и сам текстовый редактор Microsoft Word построены именно по такому принципу, — они не "работают сами по себе", а ждут от пользователя команд и «реагируют» на них: выполняют те или иные действия. Так и форма: программист должен разработать ее интерфейс — создать форму, расположить на ней элементы, определить их свойства, а затем написать "программы обработки событий", поместив в каждой такой программе код, который должен быть выполнен, когда то или иное событие произойдет, то есть будет нажата какая-нибудь кнопка на форме или на клавиатуре, введен текст в поле ввода текста, выбран тот или иной флажок на форме и т. д. Программы обработки событий могут изменять и внешний вид самой формы и ее элементов: прятать их или показывать, изменять любые их свойства, так как у каждого элемента формы есть свое уникальное (единственное) имя, по которому к нему можно обращаться. Таким образом можно создавать динамические формы, изменяющиеся в зависимости от действий пользователя. Закон Джоуля-Ленца. Для примера создадим форму, в которой будет производиться подсчет количества теплоты, выделяемой в проводнике при подаче на него разности потенциалов, — пригодится при расчете нагревательных элементов. Согласно соответствующим формулам, Q (количество теплоты в джоулях) = U (квадрат величины напряжения в вольтах) * t (время в секундах) / R (сопротивление в омах), при этом R = p (удельное сопротивление материала проводника в омах на метр) * l (длина проводника в метрах) / s (площадь поперечного сечения проводника в квадратных сантиметрах). Таким образом, формула для расчета количества теплоты выглядит так (она также известна под именем закона Джоуля-Ленца): Q=(U *t*s)/(l*p). Ее мы и запрограммируем в форме. Сначала создадим саму форму и разработаем ее дизайн. В ней должно быть пять полей для ввода значений, одно поле для вывода значения, и кнопка выхода. Но мы добавим еще кнопку — "Вставить значение в документ": пусть при нажатии этой кнопки подсчитанная информация будет вставлена в текст активного документа. Не мешало бы еще поместить на форме текст о назначении данной программы и краткую инструкцию по ее использованию, а также сделать у формы приличный заголовок (свойство «Caption» элемента "UserForm"). Для помещения на форму элемента управления достаточно перетащить его с "Панели элементов" на форму. Вот что получилось (к примеру) — рис. 4.1. Рис. 4.1. Форма нашей программы Поля ввода параметров имеют имена "TextBox1"…"TextBox5" соответственно, поле отображения результата имеет имя «TextBox6», кнопки имеют имена «CommandButton1» и «CommandButton2» сверху вниз соответственно. В элементы "TextBox1"…"TextBox5" пользователь будет вводить текст. Желательно установить свойство Locked элемента «TextBox6» как «True» (рис. 4.2), чтобы не допустить случайного ввода пользователем в него текста — к сбою такой ввод не приведет, но возможность такого ввода может вызвать некоторое недоумение у пользователя. Разработка дизайна программы — ответственный момент, но не менее важным является обдумывание принципов работы программы. Помните, что исправление ошибки на стадии проектировки программы в несколько раз легче ее исправления на стадии реализации, в десятки раз легче, чем на стадии распространения, и в сотни раз легче, чем на стадии внедрения. Рис. 4.2.Установка свойства Locked элемента «TextBox6» как "True" В нашей программе можно сделать, например, так: пользователь вводит все значения, нажимает кнопку «Подсчитать» (надо будет добавить на форму…), и ему в окне результата выдается подсчитанное значение. Но в этом случае, во-первых, пользователь вынужден выполнять лишнее действие — нажатие на кнопку, а, во-вторых, надо будет продумать систему защиты от неправильных действий пользователя: нельзя допускать ввод нулевых или нечисловых значений в поля «TextBox4» и «TextBox5». Для этого придется либо выдавать в таком случае сообщение о неправильном вводе, либо, что представляется более красивым, ставить в эти поля значения по умолчанию, как только пользователь сделает неправильный ввод и уберет курсор с поля ввода. Но… все же, как неудобно! Пользователю надо нажимать лишний раз кнопку, постоянно следить за тем, стоят ли в полях ввода именно нужные значения, а не значения по умолчанию (ведь можно при вводе и случайно задеть соседнюю клавишу), да и при программировании возни будет предостаточно — изволь предусмотреть все случаи, на каждый написать программу обработки именно этого случая… Не слишком ли много проблем? А может быть, надо получше подумать о проектировании программы? Основной принцип такого проектирования — "сделай проще, но без ущерба функциям". Что нам надо? Чтобы был результат. Когда он возможен? Да когда определены все значения в полях ввода, и при этом два нижних (то есть «TextBox4» и "TextBox5") ненулевые. Так пусть результат в своем окне появляется тогда и только тогда, когда все эти условия выполнены. И пусть программа постоянно отслеживает ввод значений в поля ввода и, как только будут введены все пять значений, и последние два будут ненулевые, а остальные — числовые, отобразит результат. Но есть ли такая возможность у языка VBA? А проверим! Откроем окно программного кода формы (из контекстного меню правой кнопки мыши нашей формы в Менеджере проектов выберем "Программа") и из выпадающего списка в левом верхнем углу (рис. 4.3) выберем, например, «TextBox1». Так… появился фрагмент кода: Private Sub TextBox1_Change() End Sub Рис. 4.3. Выпадающий список в левом верхнем углу — навигатор по программам элементов формы "Change" — это по-английски «изменение». Код, написанный в этой части программы (часть эта называется "обработчик события "Change"), должен выполняться всякий раз при происхождении этого события. Можно предположить, что это событие происходит тогда, когда в поле ввода ввели какой-либо символ или удалили его оттуда. В этом случае это — именно то событие, которое нам надо. Но то ли? Проверим. Напишем-ка здесь строчку: Private Sub TextBox1_Change() TextBox6.Text=TextBox1.Text End Sub Пусть для эксперимента при изменении текста в первом поле ввода произойдет изменение текста в поле отображения результата. Проверим, будет ли это работать, — нажмем F5 (запуск программы на выполнение) и введем текст в первое поле ввода. Прекрасно — в поле отображения результата появляется тот же текст! Значит, событие «Change» — именно то, которое нам надо использовать в нашей программе, чтобы после каждого нового ввода данных пользователем проверять условия возможности отображения результата и отображать его в случае их выполнения. Ну, а если бы оно нам не подошло, то пришлось бы перебирать все остальные события из выпадающего списка вверху справа окна программного кода формы (см. на рис. 4.3) и для каждого проводить такое же исследование: помещать в обработчик этого события команду, выполняющую какое-либо действие и смотреть, будет ли она выполнена при вводе текста в первое поле ввода. Проверка возможности подсчета результата и вывод его в случае соблюдения описанных выше условий должна происходить после каждого ввода какого-либо символа в любое из окон ввода, а также при удалении символа из любого окна ввода. Писать пять одинаковых программ для каждого из окон ввода представляется нецелесообразным, поэтому лучше проверку возможности отображения результата и его подсчет вынести в отдельную подпрограмму-процедуру, а из каждого обработчика события «Change» полей ввода ее вызывать. Переведем на язык VBA условие возможности отображения результата. Во-первых, все значения полей ввода должны быть числовыми. В VBA есть специальная функция для проверки того, является ли та или иная строка записью числа — IsNumeric (можно, например, найти ее описание в разделе «Поиск» справки по VBA из Microsoft Office 97 по словам "строковое выражение числовое значение", а в справке VBA из более старших версий этого пакета — по английским эквивалентам данных слов). Ее и используем. Ну, а для проверки отличия от нуля значений в последних двух полях ввода используем функцию «Val». Итак, результат существует, если IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0 В этом случае можно осуществить подсчет по формуле Джоуля-Ленца: rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text)) и отобразить его в поле вывода результата: TextBox6.Text = Str$(rez) Теперь можно написать процедуру вычисления результата и вызовы ее из всех обработчиков событий "Change": Private Sub TextBox1_Change() Scet End Sub Private Sub TextBox2_Change() Scet End Sub Private Sub TextBox3_Change() Scet End Sub Private Sub TextBox4_Change() Scet End Sub Private Sub TextBox5_Change() Scet End Sub Private Sub Scet() If IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0 Then rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text)) TextBox6.Text = Str$(rez) Else TextBox6.Text = "" End If End Sub В принципе программа уже почти закончена, но стоит еще разобраться с командными кнопками. Для кнопки «Отмена» обработчик события «Click» (то есть нажатия на кнопку) прост — выход из программы: Private Sub CommandButton2_Click() Unload Me End Sub Но у нас есть еще вторая кнопка — "Вставить результат в документ". А пусть она вставит в документ не просто значение результата, а осмысленную фразу, содержащую как результат, так и введенные параметры! Это можно сделать командой Selection.Text = "При прохождении тока напряжением в " + TextBox1.Text + " вольт по проводнику длиной " + TextBox4.Text + " метров, сечением " + TextBox3.Text + " кв. мм и удельным сопротивлением " + TextBox5.Text + " ом на метр за " + TextBox2.Text + " секунд выделится" + TextBox6.Text + " джоулей теплоты.» Она сформирует фразу из значений полей ввода и вставит ее в активный документ. Проверим… так, действительно вставляет, но фраза остается выделенной. А значит, что следующая фраза, выведенная с помощью нашей программы, сотрет предыдущую. Надо посмотреть, нет ли в VBA функции снятия выделения? Посмотрим по выпадающему меню после точки "Selection."… есть команда «Collapse» (то есть "Свернуть"). Из справки по ней узнаем ее синтаксис: Selection.Collapse Direction:=wdCollapseEnd. Эта команда убирает выделение и помещает курсор в его конец. Можно также вставить текст в активный документ "Selection.TypeText Text:="Мой текст" (двоеточие после слова «Text» обязательно, так как это — оператор присваивания значения параметру команды). Тогда в команде специального снятия выделения со вставленного текста не будет необходимости, — после выполнения команды выделенного текста не окажется. Но что произойдет, если пользователь вдруг вызовет программу тогда, когда открытых документов в Word'е нет? Тогда ведь возникнет ошибка программы. Но этого легко избежать — надо просто проверить перед вставкой, есть ли открытые документы и, если нет, создать новый: If Documents.Count = 0 Then Documents.Add Осталась еще одна маленькая деталь. Кнопка "Вставить результат в документ" не должна работать, если результат вычислить нельзя (то есть поле «TextBox6» пусто). Как это сделать? Среди всего набора возможных свойств элемента «CommandButton» есть свойство «Enabled» — если его установить как «False» (то есть "ложно"), то кнопка будет отображаться серым цветом и не будет реагировать на события (станет неактивной). Это свойство можно задать и программно — командой "CommandButton1.Enabled = False". Поставим в процедуру вычисления результата пару команд, активизирующих кнопку, когда результат вычисляется и вставка его в текст возможна, и инактивирующих ее в противном случае, а также зададим с самого начала в форме свойство «Enabled» этой кнопки как «False», — чтобы она была неактивной с самого начала, до того, как в какое-либо окно ввода будут вводиться символы и начнет срабатывать процедура вычисления результата с командами задания состояния кнопки. Вот готовый код нашей программы: Private Sub CommandButton1_Click() If Documents.Count = 0 Then Documents.Add Selection.Text = "При прохождении тока напряжением в " + TextBox1.Text + " вольт по проводнику длиной " + TextBox4.Text + " метров, сечением " + TextBox3.Text + " кв. мм и удельным сопротивлением " + TextBox5.Text + " ом на метр за " + TextBox2.Text + " секунд выделится" + TextBox6.Text + " джоулей теплоты.» Selection.Collapse Direction:=wdCollapseEnd End Sub Private Sub CommandButton2_Click() Unload Me End Sub Private Sub TextBox1_Change() Scet End Sub Private Sub TextBox2_Change() Scet End Sub Private Sub TextBox3_Change() Scet End Sub Private Sub TextBox4_Change() Scet End Sub Private Sub TextBox5_Change() Scet End Sub Private Sub Scet() If IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0 Then rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text)) TextBox6.Text = Str$(rez) CommandButton1.Enabled = True Else TextBox6.Text = "" CommandButton1.Enabled = False End If End Sub (В формуле, используемой в программе, указывается напряжение между концами проводника, а не сила тока. Поэтому не удивляйтесь, что выделение тепла окажется максимальным при большой толщине проводника и его малой длине. Эта ситуация имеет место быть при коротком замыкании, когда в условиях постоянного напряжения через точку замыкания идет ток огромной силы.) Назначить форме кнопку или пункт меню для вызова из Word нельзя, — это возможно только для модулей. Поэтому переименуем для красоты форму в «Teplotok», например (свойство «Name» обьекта «UserForm» — можно задать в окне свойств, выделив форму) и напишем модуль, в котором будет всего одна команда — вызов созданной нами формы: Sub TeploCount() Teplotok.Show End Sub Зададим модулю красивое имя ("Teplo", например, через свойство «Name» обьекта «Модуль1», если модуль для программы вызова формы был вставлен с помощью пункта "Вставить"-"Модуль" контекстного меню правой кнопки мыши в Менеджере проектов) и назначим в Word кнопку для вызова макроса "Normal.Teplo.TeploCount". Вот и все — наша программа готова! Если вы последовательно выполняли на своем компьютере все приведенные здесь шаги, то можете проверить ее работу. Теперь программу можно вызывать на выполнение соответствующей кнопкой. При желании можно скопировать форму и модуль в отдельный шаблон и создать в нем панель инструментов с кнопкой вызова макроса, — тогда программу можно будет установить и на другие компьютеры, скопировав шаблон с макросом в папку автозагружаемых файлов Word. Глава 5.Советы и секреты программирования Что такое API? Для того, чтобы облегчить труд своих коллег и обеспечить всем программам для Windows универсальный интерфейс, программисты Microsoft создали такую вещь, как API — "Application Programming Interface". Это — набор функций и процедур, которые могут наиболее часто использоваться программами: отображение дерева каталогов, поиск файлов, отображение стандартного окна с кнопками закрытия, минимизации и развертывания на весь экран и многих других. В итоге разработчик, создающий программу для Windows, не должен продумывать и разрабатывать специальные подпрограммы для отображения окна программы, окна для выбора папки и остальных подобных элементарных операций, — ему достаточно просто вызвать из библиотек kernel32.dll или user32.dll, содержащих функции и процедуры API, нужную ему функцию, а она уже все сделает за него сама. Таких функций и процедур много — порядка 600. В операционной системе MS-DOS такого понятия, как API, не было, — тот, кто брался писать программу для этой операционной системы, обязан был сам, от начала до конца, продумать и реализовать способы выдачи на экран изображения, получения данных от пользователя, путешествия по файловой системе, рисования графики, если таковая возможность была необходимой.[8 - В MS-DOS, впрочем, присутствовала возможность включать в программу так называемые "Esc-последовательности", определяющие внешний вид окна программы, вместо того, чтобы самостоятельно прорисовывать все его элементы. Однако аналогом API данное средство считать нельзя, — все же слишком мало функций было доступно программисту.] Это делало процесс разработки программ с удобным для пользователя интерфейсом весьма трудоемким процессом, зачастую затраты времени и сил на создание приемлемого графического интерфейса программы превосходили затраты на реализацию собственного алгоритма программы, ради которого она и создавалась. Недаром были очень распространены так называемые «консольные» приложения, то есть программы, работающие только из командной строки, без интерфейса, — ввод данных происходил в той же командной строке или производился из указанного в ней файла, а вывод результатов шел в простом текстовом режиме. С появлением операционной системы Windows каторжный труд программистов по разработке внешнего вида программы и удобных способов ввода и вывода информации резко облегчился, — уже в Windows 3.0 использовались функции API. Теперь программист, если он, например, желал создать окно ввода текста или полосу прокрутки, должен был всего лишь написать вызов функции отображения такого окна с необходимыми ему параметрами, так же, как и любой другой функции языка, на котором он писал свою программу, а не вводить огромные обьемы кода ради создания программы, заново рисующей такое окно или полосу (сознавая при этом, что при разработке следующей программы, в которой тоже будут использоваться такие объекты, ему придется вновь разрабатывать такой код или пытаться частично использовать старый, приспосабливая его к нуждам этой новой программы). Поэтому появление API совершило революционный прорыв в технологии программирования, позволяя создавать нужные программы с привычным удобным интерфейсом гораздо быстрее, не заботясь о таких рутинных деталях, как программирование стандартных объектов интерфейса для ввода и вывода информации. В языке Visual Basic for Applications (VBA) многие функции и процедуры API вызываются сами при выполнении программы интерпретатором, так что использовать их для отображения окон ввода и вывода текста, рисования на экране геометрических фигур и других простых действий совершенно нет необходимости, — их VBA вызывает по мере надобности, а программе на нем достаточно использовать соответствующие функции этого языка. Однако иногда возникает необходимость в некоторых действиях, для которых либо нет аналогов во встроенных функциях VBA, либо они работают нерационально или слишком медленно. Например, окно выбора папки с изображением дерева каталогов (рис. 5.1) или программа поиска файлов (аналог на функциях VBA — объект "Application.FileSearch" — работает слишком медленно при больших количествах файлов). Для таких случаев в VBA предусмотрена возможность вызова функций API. Рис. 5.1. Это окно вызывается функцией API. К сожалению, использование функций API в VBA не документировано в справке, вследствие чего для изучения способов их применения приходится либо искать книги или источники в Интернете по офисному программированию, либо анализировать код программ, в которых имеются вызовы функций API. О некоторых из таких программ рассказано в следующей главе. В подавляющем большинстве случаев при программировании для Office можно обойтись без использования API, но иногда только вызов API-функции может привести к достижению нужного результата. Скажем, вам надо обеспечить вызов разных макросов при простом нажатии мышью кнопки на какой-либо панели инструментов Word и в случае одновременного нажатия этой кнопки и клавиши Shift или Control. Вот фрагмент кода, делающего это: Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal kState As Long) As Integer Sub Program() GetAsyncKeyState (vbKeyShift Or vbKeyControl) If GetAsyncKeyState(vbKeyShift) Then Call macro1: Exit Sub ElseIf GetAsyncKeyState(vbKeyControl) Then Call macro2: Exit Sub End If Call macro3 End Sub Первая строчка — это как бы «резервирование» функции API для использования в программе на VBA. Видно, что вызывается функция GetAsyncKeyState из библиотеки (файла, содержащего программы, предназначенные только для использования другими программами) user32.dll, причем в эту функцию передается номер клавиши, а возвращает она целое число (а именно — 0, если клавиша с соответствующим номером не нажата, и -32767 или 1, если нажата). Любую функцию или процедуру, вызываемую из библиотек, не относящихся к VBA, необходимо так резервировать с помощью команды Declare. Фраза vbKeyShift в команде — это заменитель кода клавиши Shift (его значение — 16), а vbKeyControl, как нетрудно понять — заменитель кода клавиши Control. Структура инструкций "If…Then", думается, ясна,[9 - Двоеточие — разделитель команд, расположенных в одной строке.] а если нет — посмотрите в справке VBA. Команда Call перед именем макроса, как вы помните, означает его запуск. В Интернете есть русские сайты, посвященные API.[10 - Например, http://NikolayAM.narod.ru. Также про API и использование его в VBA есть немало информации на сайте программы Microsoft Office Extensions (http://www.microsoft.ru/offext).] Посетите их, чтобы узнать больше об этом наборе функций. Настройка вызова программы. Последние штрихи Когда программа написана и отлажена, необходимо придать ей "товарный вид", — убрать лишние команды и модули, сделать способ вызова программы — кнопку или пункт меню, может быть, создать панель инструментов для кнопок. Без этого даже с очень хорошо написанной программой сможет работать лишь ее создатель, да и то не всегда. К тому же красивая обложка всегда радует глаз. Для начала нужно просмотреть весь код и выкинуть все лишнее — закомментированные ненужные команды, излишние комментарии. Потом следует определить, какие модули и формы являются компонентами готовой программы, а какие, возможно, были написаны для других программ или в качестве экспериментальных и запомнить их названия. Далее надо решить, в каком формате программу стоит оформить — как шаблон Word, как автозагружаемый шаблон Word или как простой документ? Если программа предназначена для одномоментных нечасто используемых расчетов и не работает с текстом документа, то ее проще всего поместить в документ Word. При необходимости его можно будет открыть и выполнить программу. Если программа как-то оформляет текст особого документа, который надо создавать отдельно от всех (к примеру, программа для красивого форматирования поздравительных открыток), то ее лучше оформить как шаблон и создавать на его основе документы, а потом уже эти документы заполнять содержанием с помощью программы. Ну, а если программа выполняет какие-нибудь серьезные операции с текстом, постоянно требуется или работает с многими документами сразу, то тогда ей прямая дорога в папку автозагружаемых файлов Word. Потом необходимо создать документ с программой. Для этого создается пустой документ необходимого формата — шаблон или простой файл Word, а затем с помощью диалогового окна Word «Организатор» ("Сервис — Макрос — Макросы — Организатор" или "Сервис — Шаблоны и надстройки-Организатор") в него копируются все готовые компоненты программы из шаблона или документа, где велась разработка. Документ сохраняется под каким-нибудь красивым именем. И, наконец, делается способ вызова программы. Можно с помощью диалогового окна "Сервис — Настройка — Команды — Макросы" назначить макросу пункт меню или кнопку на стандартной панели путем простого перетаскивания. Можно там же назначить ему комбинацию клавиш для вызова. А можно, что считается лучшим вариантом, создать новую панель инструментов и уже на ней поместить кнопки для вызова макросов. Надо только сохранить все изменения именно в документе с макросами, а не в своем Normal.dot или где-нибудь еще. В окне "Сервис — Настройка — Команды — Макросы" название каждого макроса отображается так: сначала пишется имя проекта (его можно посмотреть и изменить в Окне свойств редактора VBA, выделив мышью название нужного проекта), затем — имя его модуля (тоже можно изменить в окне свойств, выделив мышью название модуля), а затем — собственно имя макроса (то, что стоит после команды начала программы Sub). Назначить кнопку или сочетание клавиш для вызова формы невозможно. Необходимо вставить команду вызова формы ("ИмяФормы. Show") в текст программы в модуле, и уже затем назначить кнопку или сочетание клавиш для вызова именно этой программы. Для вызова программы очень удобно использовать кнопки с иконками. Для этого нужно всего лишь перетащить название нужного макроса из окна «Настройка» на какую-нибудь (лучше специально созданную) панель инструментов, а затем выбрать значок для кнопки и задать стиль отображения — лучше всего без текста, "Основной стиль". Можно также оставить на кнопке текст с названием макроса, однако тогда этот текст стоит соответственно отредактировать. Стоит помнить, что при подведении курсора мыши к кнопке, вызывающей макрос, отображается всплывающая подсказка с названием макроса (берется название макроса после команды начала программы Sub), поэтому макросам неплохо давать осмысленные имена. Однако если макрос назван по-русски, то в нелокализованных версиях Word он не будет вызываться кнопкой, созданной в русской версии. Всплывающие подсказки кнопок можно задать самостоятельно с помощью команды "CommandBars("Имя панели"). Controls("Номер иконки на панели"). TooltipText = "Текст подсказки"". К сожалению, через диалоговое окно настройки панелей и кнопок сделать это не удастся, поэтому для ввода этой команды придется использовать отдельный модуль или Окно отладки. Вам может не понравиться весьма ограниченный выбор значков для кнопок, предлагаемый Word'ом. Этот набор, вызываемый из меню "Выбрать значок для кнопки" в режиме настройки панелей, действительно, маловат. Но никто не мешает с помощью других команд того же меню скопировать значок с любой другой кнопки на любой другой панели или создать его самому во встроенном редакторе изображений на кнопках. Кроме того, красивые значки можно извлечь из «недр» Office, — а он содержит в себе около двух тысяч разнообразных значков! Для этого достаточно ввести в Окне отладки команду CommandBars("имя существующей панели инструментов"). Controls.Add(Type:=msoControlButton, ID:=797). FaceId = x где х — любое число от 1 до 3000. Тогда на указанной в команде панели будет создана кнопка со значком, который можно скопировать на свою кнопку. Не для всех кодов существуют значки, поэтому иногда созданная таким образом кнопка будет пустой, — попробуйте еще раз с другим х.[11 - Существует программа "Генератор иконок", специально предназначенная для извлечения иконок из недр Word'а. О ней рассказано в следующей главе.] Если в качестве способа вызова макроса выбрана панель инструментов с кнопками, то после окончания работы над ней стоит повторить создание нового документа и вновь скопировать все компоненты программы в новый документ вместе с панелью. Такое преобразование позволит существенно сократить размер файла с программой, так как вследствие ошибки в Office при редактировании макросов файл с программой сильно увеличивается в размерах — до полутора-двух раз. Впрочем, в OfficeXP данная рекомендация уже неактуальна. Не стоит забывать и об информативном руководстве для пользователя, особенно если программа будет распространяться через Интернет. Лучше всего такое руководство оформить в отдельном текстовом файле или, если оно имеет большой объем, в виде набора связанных html-документов. Полезные советы · Настройки программы можно сохранять в системном реестре Windows. Для этого служит команда "SaveSetting", с помощью которой можно поместить в системный реестр строку или число. Она имеет формат "SaveSetting "Имя приложения","Имя раздела", «Ключ», "Значение"". Имя приложения, имя раздела и ключ — указатели места, в котором сохраняется Значение. Получить значения из реестра можно командой "GetSetting" с синтаксисом "GetSetting "Имя приложения","Имя раздела", «Ключ», "То значение, которое следует вернуть, если такого ключа, как указанный в предыдущем параметре, в реестре нет"", а удалить — командой "DeleteSetting "Имя приложения","Имя раздела", "Ключ"". Например: SaveSetting «Макросы», «Макрос1», "Имя папки", "C: \MyPapka" papka = GetSetting «Макросы», «Макрос1», "Имя папки", "C: \Docs" · Записать список всех установленных в системе шрифтов в массив можно таким способом: ReDim shrifti(FontNames.Count) As String For r = 1 To FontNames.Count shrifti(r) = FontNames(r) Next r WordBasic.SortArray shrifti() (В массив "shrifti()" размером в количество шрифтов в системе помещается список имен всех установленных в системе шрифтов. Команда "WordBasic.SortArray" сортирует его по алфавиту.) · Условие "If Selection.Type = wdSelectionIP Then …" выполнится, только если в документе не выделен фрагмент текста. · Если вы решили хранить какую-нибудь информацию, нужную при работе программы, в отдельном файле, не стоит экспериментировать с командами чтения и открытия файла типа «open», «write» и др. Просто открывайте файл в Word как текстовый с помощью команды "Documents.Open …" и пишите в него обычными средствами записи текста: "Selection.Text = "Мой текст"". · Посмотрите повнимательнее свойства, объекты и методы таких объектов, как «Application» и «System» (для этого достаточно набрать название объекта и поставить после него точку, — список возможных продолжений отобразится сам). Среди них можно найти немало весьма интересных и полезных, вроде средства задания и получения значений ширины и высоты окна Word, информации о языке данной версии Office, метод чтения данных из произвольного места реестра и многое другое. · С помощью фрагмента кода Set MyData = New DataObject MyData.SetText "Мой текст" MyData.PutInClipboard можно поместить текст в буфер обмена, не используя активный документ. · С помощью команды "Options.DefaultFilePath("константа названия папки")" можно получить пути и имена папок, перечисленных в диалоговом окне Word «Сервис» — «Параметры» — «Расположение». Все константы перечислены в справке VBA по слову «DefaultFilePath», а об их значении можно легко догадаться, переведя название константы с английского. · Если у одного из элементов формы установить свойство Cancel в True, то нажатие кнопки Esc будет эквивалентно клику мыши на этом элементе. · Если вы пишете инсталлятор для ваших программ, который помещает шаблоны с макросами в папку автозагружаемых файлов Word,[12 - Местонахождение папки автозагружаемых файлов можно посмотреть в окне СервисПараметры-Расположение. Для Word97 это обычно папка. \Microsoft Office\Office\Startup, а для Word2000/XP по умолчанию назначается папка C: \Windows\Application Data\Microsoft\Word\Startup.] то совсем необязательно требовать перезагрузки редактора, чтобы макросы из помещенного в эту папку шаблона стали доступны. VBA позволяет активизировать такие шаблоны без перезагрузки Microsoft Word — для этого существует специальная команда AddIns.Add("полное имя шаблона, включая путь к нему и расширение"). Installed = True Эта команда эквивалентна ручному подключению шаблона с макросами через меню Word "Сервис — Шаблоны и надстройки". Однако если она будет выполнена сразу же после программного копирования шаблона в папку автозагружаемых файлов, то может возникнуть ошибка вследствие того, что при таком копировании Word должен зарегистрировать этот шаблон как доступный для подключения (после регистрации он появится в диалоговом окне "Сервис-Шаблоны и надстройки", но не будет отмечен как загруженный). На это уходит пара секунд, и если в этот момент вызвать команду подключения шаблона, то Word может ответить программе, что такого шаблона в папке автозагрузки нет, что вызовет ошибку. Предотвратить подобную ситуацию можно, например, с помощью следующей конструкции, — разместите ее после команды копирования шаблона "FileCopy": a="Имя шаблона в папке автозагрузки с полным указанием пути" On Error Resume Next Do If AddIns(a). Installed Then Exit Do AddIns(a). Installed = True Loop[13 - Благодарю Тестовую лабораторию PC Magazine RE за эту рекомендацию.] При использовании команды подключения шаблона он может находиться и не в папке автозагружаемых файлов, но все же надежнее использовать именно папку автозагрузки. · Для удаления шаблона без выгрузки Word можно использовать такой же код: a="Имя шаблона в папке автозагрузки с указанием пути" On Error Resume Next Do If Not AddIns(a). Installed Then Exit Do AddIns(a). Installed = False Loop AddIns (a). Delete Kill (a) · Команда "Kill" выполняет удаление файла. Команда "On Error Resume Next", встречающаяся в обоих вышеприведенных фрагментах кода — это обработчик ошибок. В случае возникновения ошибки в коде после него (скажем, связанной с обращением к несуществующему объекту) он продолжит выполнение программы с команды, следующей за вызвавшей ошибку. Обработчик ошибок может также иметь вид "On Error GoTo метка", и тогда при ошибке в коде после него произойдет переход к указанной в обработчике метке и выполнение программы продолжится именно с нее. · Если вы, работая в Word 97, часто сохраняете документы в формате HTML, и вам мешает постоянно появляющийся диалог о выборе кодировки файла (рис. 5.2), то отключите его, установив в системном реестре строковый параметр "HKEY_LOCAL_ MACHINE\Software\Microsoft\Shared Tools\ Text Converters\Export\HTML\Options\Show EncodingDialog" как «No». Установить этот параметр реестра можно и программно с помощью команды "System.PrivateProfileString("", "HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\Text Converters\ Export\HTML\Options", "ShowEncodingDialog") = "No"" Рис. 5.2. Как убрать этот диалог? Читайте справа. · Если Вы закрыли исходный код Вашей программы на VBA от просмотра паролем, а потом благополучно его забыли — не огорчайтесь: в Интернете, по адресу www.passwords.ru есть программа AVPR, позволяющая восстановить забытый Вами пароль. Ее английская версия требует оплаты и регистрации, а русская — бесплатная. К сожалению, бесплатная версия работает только с файлами, созданными в Word и Excel из Microsoft Office 97. Чтобы ускорить работу программы, работающей с текстом, поставьте в ее начале команду "Application.ScreenUpdating = False", а в ее конец — команду "Application.ScreenUpdating = True", если · только в процессе работы программы не требуется визуальный контроль происходящих изменений. Эта команда позволяет системе не тратить время и силы на постоянное обновление экрана и отображение изменений. Для того, чтобы все же обновить экран после отключения обновления экрана, используйте команду "Application.ScreenRefresh". · Для получения от пользователя определенных данных, кроме создания форм, можно использовать встроенные диалоги VBA — диалоговое окно "Открытие файла", "Свойства документа" и др. Они вызываются командой Dialogs("Название диалога"). Show (показывает диалог и выполняет соответствующие ему действия), Dialogs("Название диалога"). Display (только показывает диалог и позволяет записать в переменные введенные изменения, но не выполняет никаких действий и ничего не изменяет: очень полезно для использования встроенных диалоговых окон в своих целях), Dialogs("Название диалога"). Execute (ничего не отображает на экране, но применяет все те изменения, которые были сделаны ранее с помощью команды With Dialogs("Название диалога") … End With). Для вывода списка возможных диалогов наберите "Dialogs(", и Вам будет выдан их список. К сожалению, описания конкретных диалогов нет в справке — придется просто попробовать отобразить каждый, хотя список возможных параметров каждого диалога в справке есть. В Microsoft Excel набора встроенных диалогов нет, однако отобразить на экране окна открытия и сохранения файлов все же можно. Для этого служат команды "Application.GetOpenFilename" и "Application.GetSaveAsFilename". В результате выполнения команды "file = Application.GetOpenFilename" будет отображено окно открытия файла, а после выбора имя файла поместится в переменную (здесь — "file"). Команда же "rez = Application.GetSaveAsFilename" отобразит окно сохранения файла, в переменную же (здесь — rez) будет помещено True — если сохранение успешно, и False — если нет. Обе команды докускают указание параметров (например, меняющих заголовки окна и других). Иногда возникает необходимость вызвать из макроса какое-либо диалоговое окно, но так, чтобы такой вызов ничем не отличался от «ручного», производимого через пункты меню Word. А возможно это не всегда: так, команда "Dialogs(wdDialogEditFind). Show" действительно вызывает окно поиска, но при этом в случае ввода в него фрагмента, которого в тексте нет, не отображается сообщение о безрезультатности поиска. Тем не менее вызвать из макроса данное окно так, чтобы оно работало точь-в-точь так же, как и «обычное», можно — для этого следует использовать имеющуюся в VBA функцию SendKeys, которая передает активному окну нажатия клавиш — как если бы они были нажаты на клавиатуре. Подробнее об этой функции вы можете прочитать в Справке по VBA, а использовать ее для вызова диалогового окна можно, к примеру, так: Sub prog() SendKeys "^f" End Sub предполагая, что комбинация клавиш Ctrl+f вызывает окно «Найти», как, впрочем, устанавливается по умолчанию. Список кодов функциональных клавиш — в Справке. Если Вы используете функцию "SendKeys", то вызванное ею окно будет вести себя абсолютно так же, как при ручном вызове. Однако помните, что если пользователь переопределит заложенную Вами в макрос комбинацию клавиш, то Ваша программа начнет работать некорректно. · Помимо привычных кнопок и выпадающих меню в Word существует еще несколько типов элементов вызова команд и программ — поля ввода и выпадающие меню выбора. К примеру, элемент "Выпадающее меню с полем ввода" используется для указания масштаба просмотра документа на панели «Стандартная» или для ввода вопроса к справочной системе в OfficeXP. Создать такое поле можно только программно — через окно настройки это сделать нельзя (как, впрочем, и удалить их впоследствии). Для этого следует в окне отладки или в отдельном модуле выполнить команду CommandBars(x). Controls.Add Type:=y где «х» — номер панели (можно узнать, просто перебрав их все с помощью команды "MsgBox CommandBars(номер). Name" и выяснив, какой номер имеет панель инструментов с нужным названием), а «y» — одна из констант: "msoControlEdit", "msoControlDropdown", "msoControlComboBox", создающие соответственно поле ввода текста, выпадающее меню и выпадающее меню с возможностью ввода текста. Управлять созданными полями, добавляя, к примеру, в них текст, можно стандартными командами работы с панелями инструментов. Так, чтобы поместить какой-либо текст в поле ввода, следует использовать команду CommandBars(x). Controls(y). Text = "текст в поле ввода" где «х» — номер панели, «y» — номер по счету слева направо данного поля среди кнопок этой панели. Таким образом можно использовать эти элементы для отображения нужной пользователю информации. Точно так же — командой "a=CommandBars(x). Controls(y). Text" можно считать информацию из данного поля и использовать ее в работе программы. Следует лишь внимательно следить за соответствием номеров кнопок их реальному расположению, — при изменении порядка кнопок программа может работать неверно. Назначить макрос кнопке, меню или полю ввода можно командой "CommandBars(x). Controls(y). OnAction = "Имя модуля. Имя программы"". · Для работы из одного приложения Office с другим можно использовать технологию ActiveX. Она основана на имеющейся в Office возможности представлять одну программу в другой как некий объект, с которым можно работать теми же командами, что используются при непосредственной работе с этой программой. Так, чтобы можно было из Word'овского макроса работать с Excel'ем, следует создать объект "Excel.Sheet": · Dim es As Object Set es = CreateObject("Excel.Sheet") Здесь «es» — простое наименование переменной, может быть любым. (Если надо сразу открыть какой-либо файл Excel'а, то можно использовать команду "GetObject": Set es= GetObject("Путь к файлу Excel'а")) При желании можно сделать созданный объект Excel видимым: es.Application.Visible = True Теперь можно этому объекту es (т. е. просто запущенному Excel'у) посылать команды такие же, как и в макросах Excel'а (предваряя текстом "es.Application." те из команд, которые не требуют прямого указания объекта, — так как надо дать понять программе, что работа идет именно с Excel'ем). Так, чтобы открыть файл Excel'а, можно также дать команду es.Application.Workbooks.Open FileName:="Путь к документу Excel'а" а чтобы, например, поместить в первую ячейку открытой книги текст, используйте команду es.Cells(1, 1). Value = "Это столбец A, строка 1" Закрыть Excel можно командой es.Application.Quit Set es = Nothing Можно даже вызвать на исполнение макрос, содержащийся в книге Excel. Для этого следует использовать команду es.Application.Run "имя макроса" Так что есть простор для творчества. ProgressBar в ваших программах Во многих программах для Windows используется такой элемент, как ProgressBar — индикатор, показывающий, на сколько продвинулся тот или иной процесс. В частности, он есть практически во всех программах-инсталляторах. К сожалению, в VBA этот элемент отсутствует, но его можно сделать самостоятельно! Выглядеть он будет, например, так, как на рис. 5.3. А делается он следующим образом (предполагается, что у нас есть часть программы, в которой выполняется длинный и долгий цикл: то есть известное нам количество множество однотипных операций, и которую надо снабдить ProgressBar'ом): 1. Создаем небольшую форму и помещаем на нее: надпись с пояснительным текстом (например, "Label1") и две другие надписи, (скажем, «Label2» и "Label3"), низкие и широкие, которые расположим одну над другой (рис. 5.4). К примеру, их координаты и размеры: Label2: Top — 45, Left — 15, Height — 15, Width — 250 Label3: Top — 45, Left — 15, Height — 15, Width — 0 Зададим в качестве фонового цвета для «Label2» — серый, а для «Label3» — зеленый (свойство «BackColor», вкладка "Палитра"). Рис. 5.3.ProgressBar в программе на VBA Рис. 5.4. А вот как он сделан 2. Для того, чтобы форма появилась на экране, но могла быть модифицируема программно все время своего отображения, в ее код нужно поместить следующий текст: Private Sub UserForm_Activate() … остальной текст программы, которая должна выполняться во время отображения ProgressBar'а … Unload Me End Sub Все, что находится в теле этого обработчика, будет выполняться, в то время как форма будет находиться на экране. По окончании выполнения программы форма будет выгружена (хотя выгружать ее не обязательно, если после окончания программы в обработчике предполагается продолжение работы с формой). Однако никакие другие события формой обрабатываться в это время не будут. 3. Идея такова. Ширину третьей надписи «Label3» можно изменять программно. Поэтому для отображения ProgressBar'а надо вставить в код строки, изменяющие ширину этой надписи. К примеру, цикл в программе выполняется n раз. Тогда ширина надписи «Label3» будет определяться командой в теле цикла по формуле "Label3.Width = (scet / n) * 250", где "scet" — это счетчик цикла, а 250 — ширина надписи Label2. После каждой такой команды надо вставлять инструкцию "Me.Repaint", чтобы перерисовать форму с учетом новых параметров третьей надписи, — автоматической перерисовки до полного отображения формы (которое произойдет, когда кончится обработка события "UserForm_Activate()"и форма не будет выгружена) не происходит. Если форма с ProgressBar'ом должна долго находится на экране без изменений, то рекомендуется почаще использовать команду "Me.Repaint", так как без перерисовки внешний вид формы может быть легко испорчен окнами других приложений, когда пользователь решит воспользоваться ими во время работы макроса. Итак, код для формы с ProgressBar'ом должен иметь такой вид ("n" — количество необходимых выполнений цикла): Private Sub UserForm_Activate() Me.Repaint For t=1 to n … … … … необходимые команды программы в цикле … … … … Label3.Width = ((t / n) * 250) Me.Repaint Next t Unload Me End Sub Разумеется, в нем возможны изменения и улучшения. Можно несколько раз использовать ProgressBar в одной форме, каждый раз обнуляя ширину третьей надписи. Можно поместить на одну форму несколько ProgressBar'ов, где один, например, показывает выполнение всего задания, а другой — его текущей части. Хранение скрытой информации в документе Иногда автору программы необходимо записать в документ информацию "для внутреннего пользования": например, чтобы при следующей обработке документа программой использовать определенные предыдущие данные. Можно, конечно, использовать Свойства документа (объект "Dialogs(wdDialogFileSummaryInfo). Comments"), но лучше сделать такую запись с помощью добавления специальной переменной прямо в документ Word: ActiveDocument.Variables.Add Name:="x1", Value:="Текст" ActiveDocument.Variables.Add Name:="x2", Value:=12 Прочитать эти переменные можно будет с помощью похожей функции: y1 = ActiveDocument.Variables("x1"). Value y2 = ActiveDocument.Variables("x2"). Value Кроме как с помощью этой функции, значения заданных в документе переменных узнать нельзя никак! Таким способом можно помещать в документ служебную информацию для макросов: сохраненные параметры, скрытые комментарии и и.д. Но не думайте, что для надежного сокрытия секретной информации достаточно поместить ее в переменные документа — с помощью функции For Each per In ActiveDocument.Variables Debug.Print per.Name + " " + per.Value Next per абсолютно все переменные будут благополучно помещены в окно отладки, где их легко и просто можно просмотреть. Немного о панелях, шаблонах и макросах Панель инструментов Microsoft Word 97/2000/XP — то есть ее название, набор кнопок, расположенных на ней, связь этих кнопок с командами и макросами — может храниться либо в шаблоне Microsoft Word 97/2000/XP (*.dot), либо в документе Word (*.doc). При этом имеет место быть следующее: 1. Если панель инструментов сохранена в Normal.dot, то она доступна всегда, когда открыт Word. 2. Если панель инструментов сохранена в шаблоне, который загружен как глобальный — то есть помещен в папку автозагружаемых файлов Word, то она также доступна всегда, когда открыт Word, но ее можно убрать, выгрузив шаблон с помощью диалогового окна "Сервис-Шаблоны и надстройки". 3. Если панель инструментов сохранена в шаблоне, на котором основаны документы, например, в одном из шаблонов, находящихся в папке шаблонов пользователя Word[14 - Местонахождение папки шаблонов можно посмотреть в окне Сервис-Параметры-Расположение. Для Word97 по умолчанию назначается папка. \Microsoft Office\Office\Шаблоны, а для Word2000 — C: \Windows\Application Data\Microsoft\Шаблоны.] и ее подпапках, то она доступна тогда, когда этот шаблон присутствует на компьютере и активен документ, созданный на его основе. 4. Если панель инструментов сохранена в каком-либо документе, то она доступна тогда, когда активен этот документ. Панели инструментов можно копировать из одного шаблона или документа в другой с помощью диалогового окна «Организатор» (Сервис — Шаблоны и надстройки — Организатор). Информация о том, какие панели при предыдущем выходе из Word'а были видимы, а какие нет, как они располагались и где находились на экране (чтобы восстановить эти их параметры при новой загрузке Word), сохраняется в системном реестре. Информация же о том, как должны располагаться панели при самой первой загрузке шаблона, находится в самом шаблоне и используется при отсутствии нужной информации в реестре. Каждой кнопке панели инструментов, вызывающей макрос, ставится в соответствие имя вызываемого ею макроса, которое состоит из имени модуля, содержащего этот макрос, и имени макроса в модуле. Узнать имена модуля и макроса в модуле можно в редакторе VBA. При изменении любого компонента имени кнопка становится неработоспособной. Несмотря на то, что в параметрах кнопки при назначении ей макроса указывается, где этот макрос находится — в Normal.dot, в каком-либо шаблоне или документе, этот параметр Word'ом не учитывается. Поэтому если в глобально загруженном шаблоне (то есть помещенном в папку автозагружаемых файлов Word) есть макрос с таким же названием и именем, что и в Normal.dot, то при нажатии кнопки, вызывающей этот макрос (расположенной на любой панели), выполняется макрос из Normal.dot, а не из глобального шаблона. Если при запуске Word в папке Шаблоны не оказывается шаблона Normal.dot, то он создается Word'ом на основании стандартов по умолчанию. В него помещается изначальный набор панелей инструментов. Поиск модуля и имени макроса при нажатии кнопки (при этом не имеет значения, где панель сохранена) идет в следующем порядке: "Активный документ" — "Шаблон, на котором основан документ" — "Normal.dot" — "Шаблон, загруженный глобально через папку автозагружаемых файлов Word или окно "Шаблоны и надстройки". Кнопки с панелей можно свободно перемещать с панели на панель, при этом их связь с макросами сохраняется вне зависимости от того, где макрос находится. Если макрос недоступен (скажем, удален глобальный шаблон с ним), то кнопка просто не работает. Немного о паролировании и шифровании Защита доступа с помощью пароля — самый распространенный способ хранения всяческих секретов на компьютере. Однако о принципах такой защиты большинству пользователей известно плохо. В чем же ее основы? И как можно преодолеть такую защиту? Ниже рассказывается об этом. Кроме того, вы узнаете, как можно сделать на VBA простейшую программу для шифрования и расшифровывания простых текстовых сообщений. Среди математических логических функций, таких, как И, Или и других, есть весьма примечательная функция Xor. Команда, выполняющая эту функцию, есть практически во всех языках программирования. Ее действие отражено в следующей таблице: Иными словами, это некое подобие функции Или,[15 - Функция Или возвращает 1, если на хотя бы один из входов подано значение 1.] которая в отличие от настоящей Или возвращает 0, если на входы было подано сразу две единицы. А теперь — приглядитесь повнимательнее и обратите внимание на интереснейшую вещь: если на вход функции Xor подать значение 1 входа и результат, то получится значение 2-го входа! И то же самое — со значением 2 входа и результатом: получается значение 1-го входа. Следовательно, зная итог функции Xor и значение на любом из входов, можно получить значение на другом входе, то есть функция Xor обратима. А отсюда вытекает и принцип парольного шифрования. Берем некий текст, который должен быть зашифрован и некое слово, служащее паролем. Любой текст — это последовательность букв-байтов, а любой байт равен восьми битам, что позволяет представить текст как последовательность битов — нулей и единиц: 11010101010110101001101010111110101010111110101010001… Представляем так же пароль: 10010101010011 и сопоставляем последовательности битов шифруемого текста и пароля, повторив пароль несколько раз так, чтобы у каждого бита шифруемого текста был соответствующий ему бит пароля: 11010101010110101001101010111110101010111110101010001… 10010101010011100101010100111001010101001110010101010… И теперь — шифруем: применяем к этим двум последовательностям функцию Xor: 01000000000101001100111110000111111111110000111111011… Все — шифрование закончено! Полученную последовательность можно хранить в качестве зашифрованного паролем файла. Ну, а когда потребуется расшифровка, то будет необходимо просто применить ту же самую функцию Xor к этой последовательности вместе с паролем, и тогда в результате получится исходный текст. Преобразовать же последовательность нулей и единиц обратно в текст труда не составит. Нетрудно понять, что, зная зашифрованный текст и часть незашифрованного, соответствующую определенной части зашифрованного, можно с помощью той же функции Xor определить пароль, и затем с его помощью расшифровать остальную часть текста. Поэтому в современных системах защиты текста паролем используются более сложные способы, например, повторение пароля не подряд, а с определенными промежутками, с обратным расположением символов в пароле, с двойным шифрованием — результат первого шифрования снова шифруется другим паролем. Но принцип — использование функции Xor — остается неизменным, именно из-за ее обратимости. Функция Xor, разумеется, присутствует и в VBA. Вот пример кода, реализующего возможности шифрования с ее помощью. Sub encrypt() Dim a, b, c, d As String Исходный текст для шифрования — запрашивается от пользователя, к примеру: a = "secret text from kgb agent from newyork rezidentura…" Пароль: может запрашиваться от пользователя: b = «password» Итог шифрования: c = "" Узнаем длины каждой из строк — пароля и исходного текста: lentext = Len(a) lenpass = Len(b) Собственно шифрование: For cn = 1 To lentext В этой строке попробуйте разобраться самостоятельно. Здесь выполняется функция Xor с каждым символом исходной строки и соответствующим символом пароля, как бы «повторенным» на всю длину исходного текста. Mid берет из середины строки символ, Asc — превращает его в ASCII-код, Str — превращает число в строку, Trim — удаляет пробелы: d = Trim(Str(Asc(Mid(a, cn, 1)) Xor Asc(Mid(b, ((cn — 1) Mod lenpass) + 1, 1)))) А теперь сделаем так, чтобы каждый символ занимал ровно три позиции, вне зависимости от величины его ASCII-кода. А иначе как потом при расшифровке разбивать строку на символы? Select Case Val(d) Case 0 To 9 d = «00» + d Case 10 To 99 d = «0» + d End Select c = c + d Ну вот и все, и так — с каждым символом из исходной строки: Next cn Теперь в переменной с — шифрованная строка, каждой исходной букве соответствует 3 символа. Ее можно записать, например, в документ: Selection.TypeText Text:=c End Sub А теперь — программа расшифровки данных. Точно так же разберем ее по строкам. Sub decrypt() Dim a, b, c, d As String Строка для расшифровки: c = "003004016001018027082016021025007083017029029009" Пароль: b = "password" Итог расшифровывания: a = "" Узнаем длины каждой из строк: lentext = Len(c) lenpass = Len(b) Собственно расшифровывание (попробуйте разобраться самостоятельно в структуре команды — это не так сложно): For cn = 1 To lentext Step 3 a = a + Chr(Val(Mid(c, cn, 3)) Xor Asc(Mid(b, (Int(cn / 3) Mod lenpass) + 1, 1))) Next cn В итоге в переменной a — расшифрованная строка, ее можно записать в любое место — в документ, к примеру: Selection.TypeText Text:=a End Sub Можно, конечно, еще добавлять в этот простой код всевозможные дополнения, например, функцию перевода строки цифр в строку символов, чтобы зашифрованный текст выглядел как бессмысленный набор букв. Но это — уже по желанию. Открытый и закрытый коды Наверняка все слышали такие фразы: "Шифрование с открытым ключом", "Шифрование с закрытым ключом", "Публичный ключ". О том, что они означают, можно писать большие книги, однако стоит вкратце описать ситуацию для полноты изложения. При шифровании с закрытым ключом для кодирования и расшифровки используется одна и та же последовательность символов в качестве пароля — ключа. Пример — тот, что описан выше. При шифровании же с открытым ключом используются две последовательности символов, причем зашифрованное с помощью первой последовательности можно расшифровать только с помощью второй, и наоборот. Обе последовательности связаны между собой по определенному закону, при этом из второй последовательности можно получить первую, но из первой вторую не узнаешь, — обратное преобразование невозможно. Сгенерировав специальной программой пару таких последовательностей (называемых ключами), можно первую из них сообщить тому, от кого ждешь секретных посланий ("сообщить ему публичный ключ"), а вторую оставить себе и хранить как зеницу ока ("оставить себе секретный ключ"). То, что будет зашифровано отправителем этим публичным ключом, даже сам отправитель расшифровать не сможет. Это сможет сделать только обладатель секретного ключа. Другое применение шифрования с открытым ключом — это электронная подпись, назначение которой — подтверждать неизменность электронного текста при пересылке или хранении. При ее использовании рассчитывается контрольная сумма (скажем, сумма всех кодов букв) сообщения, а затем она шифруется секретным ключом. Любой, у кого есть второй (публичный) ключ из этой пары, может расшифровать ее и, рассчитав самостоятельно контрольную сумму пришедшего сообщения, сравнить полученную величину с расшифрованной. При несовпадении этих двух величин можно думать о несанкционированном изменении текста сообщения в процессе пересылки. Именно на таком принципе работает механизм шифрования PGP. Отличия новых версий Office Отличия VBA в новых версиях Office в основном заключаются в добавлении новых функций, процедур и объектов. Однако есть некоторые тонкости. В Office2000 изменилась система защиты от вирусов в макросах. Так, в Word2000 для того, чтобы иметь возможность запускать макросы, необходимо, чтобы в диалоговом окне "Сервис — Макросы — Безопасность" был установлен «Средний» или «Низкий» уровень защиты от макросов (лучше «Средний» — тогда при открытии документов с макросами пользователю будет выдан запрос о необходимости разрешения исполнения макросов). Также в Word2000 для того, чтобы пользователь имел возможность запускать макросы из шаблонов, установленных в папку автозагружаемых файлов Word, необходимо на вкладке "Надежные источники" диалогового окна "Сервис — Макросы — Безопасность" установить отметку в пункте "Доверять всем установленным надстройкам и шаблонам". Обо всем этом следует упомянуть в документации к разрабатываемой вами программе. То же самое верно и для Office XP, однако отличия есть и здесь. Во-первых, по умолчанию компоненты Office XP, отвечающие за запуск макросов, на жесткий диск не ставятся — таким образом, похоже, Microsoft пытается защитить наиболее неразумных пользователей от макровирусов. По большому счету, подобные ее действия обычно приносят больше вреда, чем пользы, для авторов же программ на VBA из этого следует, что в справочных файлах к своим программам им следует упоминать о необходимости доустановки компонентов Office перед началом использования макросов. Во-вторых, для того, чтобы иметь возможность программно копировать модули и формы макросы между документами и шаблонами, необходимо, чтобы в диалоговом окне "Сервис — Макросы — Безопасность", на вкладке "Надежные источники" имелась отметка в пункте “Доверять доступ к Visual Basic Project”. Об этом тоже следует упомянуть в справке к программе. В OfficeXP скопировать файл из одной папки в другую или удалить его посредством программного кода можно только при отключенной Службе индексирования (cсылка “Параметры поиска” на панели “Обычный поиск", рис. 5.5). К сожалению, по умолчанию эта Служба включена, а программно ее отключить невозможно. Поэтому, несмотря на декларируемую полную "совместимость сверху вниз" версий Office, автору программ на VBA настоятельно рекомендуется тестировать свои программы во всех версиях Office и отлаживать их при необходимости. Рис. 5.5. Если в OfficeXP вы хотите копировать и удалять файлы с помощью VBA — выключите здесь “Службу индексирования”. Глава 6. Волшебный мир макросов О том, как создавать программы на встроенном в Microsoft Office языке программирования Visual Basic for Applications (VBA), было подробно рассказано в предыдущих главах. Но теория будет еще полезнее, если подкрепить ее практикой — примерами реально работающих программ, написанных на этом языке. А таких — немало. К сожалению, многие из них не такие уж и известные, но весьма интересные и полезные для очень многих пользователей. В этой главе вы найдете небольшой обзор существующих на настоящее время программ на языке VBA, работающих в среде Microsoft Office. Обратите внимание на них — если вы часто и много используете текстовый редактор Microsoft Word или другие компоненты Office, то они могут серьезно помочь вам в работе. Отличительная особенность большинства программ, описанных здесь — то, что они распространяются с открытым кодом. То есть — вы можете свободно просматривать текст программ, исследовать его, учиться на опыте ваших коллег, изучая код их программ и стремясь понять предназначение каждой строчки и каждой команды. Не думайте, что изучение кода уже созданных программ как-то неправильно или незаконно. Вы тем самым служите распространению знаний на Земле (хотя бы и просвещаясь самостоятельно), а это — весьма благородная цель. К тому же и вашим коллегам это принесет пользу — их труд по написанию красивого и быстрого кода, помимо создания хорошей программы, еще и даст вам возможность стать умелым программистом. Все описанные здесь программы доступны через Всемирную Сеть. К сожалению, вполне возможно, что к моменту выхода книги некоторые адреса поменяются, но с помощью средств поиска в Сети найти их снова будет вполне возможно. «Untaco» — расшифровка чисел и их обновление Довольно часто в бухгалтерской и финансовой документации вместе с цифровой записью числа требуется указывать и его текстовую расшифровку — например, писать «сто» после числа 100. Довольно ясно, что делать это вручную утомительно, да и небезопасно — можно легко ошибиться. И не случайно данный процесс весьма большое количество пользователей решило поручить макросам — программам на VBA. Дополнений для Word, помещающие в документ текстовые расшифровки чисел, создано немало. Однако программа Untaco (рис. 6.1) серьезно отличается от своих аналогов одной особенностью. Дело в том, что Untaco умеет автоматически обновлять те расшифровки, которые вставлены с ее помощью. Если после вставления расшифровки числа вы измените его значение, то расшифровка тоже соответственно изменится при сохранении, печати документа или вызове специальной команды, и вам не придется вставлять ее повторно. При работе с деловыми документами, бухгалтерской отчетностью такая автоматическая синхронизация расшифровки числа с его значением весьма важна, так как любое несогласование здесь может вызвать серьезные последствия. Рис. 6.1.Untaco — многофункциональный конвертор «число-текст» с возможностью автоматического обновления расшифровок чисел. Кроме того, параметры вставляемых с помощью Untaco расшифровок можно весьма широко настраивать. Так, расшифровка может производиться на русском или украинском языках в именительном или дательном падеже, а также на английском языке, иметь вид наименования денежной единицы (поддерживается шесть их видов), простой текстовой расшифровки, а также количества процентов. В двух последних случаях расшифровываются и доли чисел вплоть до тысячных. Нетрудно научить программу помещать часть расшифровки или всю ее в скобки, делать ее первую букву заглавной. Компоненты программы могут копироваться в редактируемый документ, что позволит обеспечивать обновление расшифровок даже на компьютере, где Untaco не установлена. В Untaco реализованы интересные технические решения, связанные с работой с переменными в документе, закладками, интеллектуальной обработкой текстовых строк, а также с операциями над самими макросами (их копирование и удаление). Также в Untaco показано, как осуществить подмену стандартных команд Word (например, «Сохранить», "Печать") макрокомандами. Простой и удобный инсталлятор демонстрирует возможность помещения компонентов программ в шаблон Normal.dot. Программа Untaco доступна с адресов: http://antorlov.chat.ru или http://www.newtech.ru/~orlov. TreeView — кнопка «Пуск» для Microsoft Word Данная разработка способна серьезно облегчить труд тех, чей рабочий инструмент — Microsoft Office. Коротко можно сказать, что она — окно "Открыть файл", сделанное по образцу папки Internet Explorer'a «Избранное» (или меню Windows "Пуск"), — в виде выпадающего меню отображаются все документы в текущей папке и в любых других, указанных пользователем, что позволяет искать и открывать документы, не выходя из Word и не роясь в изрядно поднадоевшем окне Word «Открыть» (рис. 6.2). Рис. 6.2.TreeView. Чтобы открыть нужный файл, просто пробегитесь мышкой по этим ниспадающим меню и найдите его. Программа имеет множество полезных настроек. К примеру, можно создать любое необходимое Вам количество панелей, на которых разместить любые наборы указывающих на папки кнопок. Если у Вас на жестком диске есть двенадцать каталогов, где Вы храните свои документы, то можно создать панель с кнопками, соответствующими все этим двенадцати каталогам, и получать доступ к их содержимому одним нажатием мыши. Кроме того, с помощью программы «TreeView» очень легким становится процесс сохранения документов в различных папках. Достаточно лишь перейти с ее помощью по дереву каталогов TreeView в нужную папку и из меню программы выбрать команду сохранения. В программе реализованы такие функции, как обращение к командам API для поиска файлов, динамическое изменение содержимого панелей инструментов и выпадающих меню, работа с реестром, работа с изменяемым автозагружаемым шаблоном. Если вас интересует, как можно сделать все вышеизложенное — поучитесь на наглядном примере. Автор «TreeView» — Антонюк Дмитрий Александрович из города Комсомольск-на Амуре. Программу можно загрузить с сайта разработчика http://treeview.chat.ru. SuperTypist — набиратель текстов Небольшая программа SuperTypist, созданная Константином Ушаковым, предназначена для быстрого и удобного набора текстов. Для работы с программой сначала нужно создать небольшой словарь с теми словами, которые, по Вашему желанию, должны набираться автоматически (о том, как создавать этот словарь и куда его потом помещать, написано в инструкции к программе). Когда же вы начнете набирать какое-нибудь слово из словаря, макрос автоматически подставит его окончание, как только это слово будет однозначно определено. Если вы желаете набрать другое слово, начинающееся с тех же букв, что и записанное в словаре, то просто продолжайте набор, и подставленное слово исчезнет. А если вы согласны с макросом, то нажмите стрелку влево, и курсор автоматически перейдет к концу вставленного слова. Изучение SuperTypist будет полезно при необходимости обеспечить работу программы с файлами, а также переназначить клавиши, — для выполнения своих функций SuperTypist делает так, что программа, проверяющая наличие набираемого слова в словаре и помещающая его в документ срабатывает каждый раз, когда на клавиатуре нажимается какая-либо буквенная клавиша. Загрузить SuperTypist можно из Библиотеки Microsoft Office Extensions, расположенной по адресу http://www.microsoft.ru/offext. ВерсткаТекстаКнижкой — книгоиздательство в Word Иногда при подготовке документов в Microsoft Word возникает необходимость распечатать их в виде книжки размером в половину листа, так, чтобы после печати ее можно было бы сшить посередине. Такую книжку удобно взять с собой, да и просто читать, а для учебных материалов подобный вид был бы самым удобным. Зачастую методические пособия в высших учебных заведениях выпускаются именно в таком формате. До недавнего времени стандартными средствами Word сделать такую книжку было невозможно. Многие пользователи прибегали к различным ухищрениям (к примеру, устанавливая «зеркальные» поля в полстраницы и пропуская каждый лист через принтер четыре раза) или пытались освоить специализированные программы верстки вроде PageMaker'а. В любом случае создание брошюры было весьма непростой задачей. В OfficeXP возможность делать брошюры появилась, однако просмотреть макет перед печатью и вывести на принтер его отдельные листы невозможно, так что при сбое принтера приходится перепечатывать весь макет заново. Кроме того, системные требования данного пакета программ весьма немалые. Но книжку можно спокойно сделать в Word любой версии, начиная с 97-го, с помощью программы, написанной специально для этого и называющейся просто — «ВерсткаТекстаКнижкой». Она использует довольно оригинальный способ создания макета книжки, в качестве основы для него взяв надписи — обьекты Microsoft Word, способные содержать в себе текст. Надписи могут быть между собою связаны, и текст, вводимый в одну из них, при исчерпании свободного места в ней перетечет в другую, следующую по порядку связывания надпись. Эта возможность и используется в программе, которая заполняет макет книжки связанными надписями, соответствующими ее отдельным страничкам, а затем копирует в них текст из исходного документа. В результате получается макет книжки, готовый к печати (рис. 6.3), который в случае необходимости можно спокойно редактировать, а при сбое в процессе печати нетрудно перепечатать любой лист макета. Макет составлен так, что каждый второй лист в нем является обратной стороной первого, поэтому на принтере с двусторонней печатью получить готовую книжку можно, просто послав на печать документ со сверстанным макетом. На обычных принтерах необходимо посылать на печать вначале нечетные, а затем четные страницы макета (для автоматизации данного процесса служит специальный макрос, входящий в комплект поставки программы). При необходимости макет книжки можно перенести для печати на другой компьютер, где данная программа не установлена. Рис. 6.3. Сделать книгу в Word теперь не проблема. Вот написать бы еще ее сначала Каждый второй лист в макете книжки — обратная сторона первого, так что на принтере с двусторонней печатью достаточно будет одного «прохода», чтобы получить готовую книжку, а на остальных принтерах придется сначала посылать на печать нечетные, а затем четные страницы макета, соответственным образом переложив листы после первой печати. Для автоматизации такой печати служит специальный макрос, входящий в комплект поставки программы. Исходный документ при работе макроса не изменяется. В тексте могут содержаться графические обьекты, сноски, диаграммы, которые автоматически переносятся в макет книжки. У программы имеется множество настроек и дополнительных возможностей. Так, можно создать пустой макет документа из определенного числа страничек, а потом вставить туда текст. Можно создать книжку не из последовательно располагающихся листов, а разбитую на отдельные тетрадки, которые затем можно будет сшить между собой. Можно задать параметры верстки так, что на каждой страничке полученной книжки будут располагаться две колонки текста. Программой производится нумерация страничек книжки, причем шрифт и расположение номеров пользователь может задать. Имеется подробное руководство пользователя, которое рекомендуется прочитать перед началом использования программы. Программа имеет как русский, так и английский интерфейс. Также в комплект поставки входит программа «Файлообьединялка», которая поможет вам обьединить содержимое множества однотипных файлов в один. Разумеется, у программы есть и недостатки, в основном обусловленные ограничениями Word в плане работы с надписями. Так, при наличии в исходном документе таблиц процесс верстки брошюры серьезно затрудняется, так как ширину таблиц приходится подгонять под ширину полученных страничек. Иногда при попадании таблицы на границу страничек пара ее строчек, примыкающих к этой границе, перестают отображаться (следствие ошибки в самом Word'е) — приходится принудительно разбивать таблицу. В случае наличия в исходном документе рисунков зачастую необходимо неоднократно переверстывать макет заново (впрочем, это нетрудно благодаря входящей в комплект дополнительной утилите), подбирая нужный размер рисунка, — программа их не масштабирует. Впрочем, данные проблемы возникают лишь при работе со сложными документами, содержащими большое количество таблиц и графики. Ознакомиться с кодом компонентов пакета программ «ВерсткаТекстаКнижкой» рекомендуется всем, кто интересуется возможностями VBA по работе с содержимым документа, пользовательскими формами. Также весьма примечателен инсталлятор программы, который нетрудно приспособить для установки собственных разработок. "ВерсткуТекстаКнижкой" можно загрузить с адресов: http://antorlov.chat.ru или http://www.newtech.ru/~orlov. Красоты из глубин Word Когда обычный пользователь достигает определенных высот во владении компьютерными технологиями, то у него практически всегда возникает желание как-нибудь переделать привычные программы, настроить их под свои требования. Гибкая система настройки панелей и меню в Microsoft Word дает возможность это сделать весьма неплохо. Однако при добавлении новых команд на панели инструментов часто хочется присвоить командам красочные значки, отличающиеся от однообразных стандартных. Но набор значков, предоставляемый Word'ом по умолчанию в выпадающем списке выбора иконки для кнопки, не больно-то и велик… Эту проблему успешно решает программа "Генератор иконок". Впрочем, вернее ее бы можно было бы назвать "Вытаскиватель иконок". Дело в том, что Microsoft Office содержит в себе, в своих исполняемых файлах и библиотеках около 3000 значков. Эти значки по умолчанию назначены разным командам, большую часть которых обычный пользователь никогда не вызывает по причине ненадобности или отсутствия информации о них. Но это не значит, что значки для этих команд нельзя использовать для своих целей! Icon Generator извлечет из «недр» Word'а эти значки, разместив их на специально созданных панелях инструментов (рис. 6.4), так что вам останется лишь скопировать их на свои панели с помощью стандартной функции "Копировать значок" режима настройки панелей. Пусть ваш Word расцветится красивыми иконками! Рис. 6.4. И все это хранит в себе Word Если Вы разрабатываете макросы для Word, то эта программа облегчит Вам жизнь — Вы сможете назначить своим макросам оригинальные иконки, не тратя время на их рисование. В шаблоне с макросом также имеется готовая подборка специально отобранных красивых значков. Программу "Генератор иконок" можно загрузить с адресов http://antorlov.chat.ru/develop.htm или http://www.newtech.ru/~orlov/develop.htm. Для студентов и программистов Пакет макросов, который называется очень просто — "Дополнения для Word", создан Петром Каньковски и доступен с адреса http://kankowski.narod.ru. Основное его предназначение — расширение возможностей пользователя Word, в особенности в плане составления документов, удовлетворяющих требованиям современных научных издательств и ВУЗов. Так, в комплекте пакета есть шаблоны «Реферат», «Заявление», позволяющие быстро оформить соответствующий документ, а параметры основного шаблона программы во многом соответствуют российским требованиям к оформлению научных публикаций. При установке программы большому расширению подвергается список автозамены — после установки пакета в него добавляются многие сокращения, позволяющие серьезно сэкономить время при наборе текста (например, «док-т» заменяется на «документ», «эл-т» — на "элемент"). "Дополнения для Word", а также другие разработки Петра Каньковски особенно заинтересуют тех, кто создает программы на VBA, так как все они поставляются с открытым исходным кодом и подробными комментариями в нем. Особенно примечательны специальные компоненты для разработчиков, доступные так же с сайта Петра — "Пакет для разработчиков" и "Ice In Eyes" (доступный со страницы http://kankowski.narod.ru/dev.htm). Помимо действительно полезных макросов, например, набора математических функций, и коллекции красивых значков, программисты на VBA найдут в этих разработках и коды функций работы из VBA с API — программным интерфейсом Windows, позволяющие отображать диалоговые окна Windows, вызывать команды операционной системы. Одна из разработок представляет собой HTML-конвертор, позволяющий эффективно и качественно преобразовать файл Excel в web-страницу. Этот конвертор в отличие от встроенных в Office средств сохранения данных в формате HTML генерирует компактный и корректный код. Весьма примечательным является «Справка» к пакету, содержащая, помимо его описания, еще и обширную подборку советов по работе с Word. С "Дополнениями…" поставляется методичка "Как написать реферат", которая может помочь студентам в учебной работе с излишне строгими преподавателями. К сожалению, у пакета есть и мелкие дефекты (например, отключение без запроса отображения горизонтальной линии прокрутки вместе с кнопками выбора вида документа, развертывание по умолчанию окна Справки на весь экран), однако они не умаляют его достоинств и не мешают с ним работать. На сайте Петра есть подборка ссылок на Интернет-ресурсы, посвященные VBA, а также сборник полезных советов по работе с Word и использованию API. WOPR — Woody's Office Portal WORP, или Woody's Office Portal — это большой и мощный пакет макросов, выполняющих самые разнообразные задачи, — от предоставления пользователю усовершенствованных диалоговых окон сохранения и открытия файлов до создания и печати конвертов или буклетов. С помощью компонентов WORP можно вставить в документ зеркальное отображение любого его фрагмента, свободно изменять даты создания и изменения файлов, удобно настраивать параметры вставляемых рисунков. WORP поможет пользователю в восстановлении поврежденных документов Word или в управлении стилями. Сайт программы расположен по адресу http://www.wopr.com. Основная версия программы работает под Word 97, однако на сайте есть модули, использующие возможности новых версий Word. К сожалению, по умолчанию код WORP закрыт от просмотра, однако вам может помочь решить эту проблему упоминаемая в прошлой главе бесплатная версия программы AVPR с сайта www.passwords.ru. Программа распространяется по принципу Shareware, а объем установочного файла превышает три мегабайта. Библиотека макросов В Интернете есть целый сайт, посвященный программам на VBA. Это — неоднократно уже упомянутая Библиотека Microsoft Office Extensions — http://www.microsoft.ru/offext. Там представлены макросы на любой вкус: и для набора текстов, и для бухгалтерской работы, и даже игры. На сайте программы Microsoft Office Extensions есть также специальный раздел «VBA-форум», в котором публикуются статьи специалистов по VBA как для начинающих, так и для опытных разработчиков. Рис. 6.5. Знак качества PC Magazine Всем программам, помещаемым в Библиотеку Microsoft Office Extensions, выдается специальный Знак Качества "Yes, Its Works" (рис. 6.5). Его можно размещать на сайте программы, на коробках с дистрибутивом, в общем, где угодно! Так что если вы хотите, чтобы ваша программа имела престижную оценку от Тестовой лаборатории PC Magazine — обязательно отправьте ее в Библиотеку. Но самое главное — если вы отправите в Библиотеку свою программу, то у вас появится шанс получить приз за нее, если ваше творение будет признано наилучшим. На сайте Microsoft Office Extensions проводится конкурс на лучшую разработку для Microsoft Office, и победителям этого конкурса выдаются вполне реальные призы, например, персональный компьютер или клавиатура с оптической мышью. Условия получения призов представлены на сайте конкурса. Фактически конкурс Microsoft Office Extensions является единственным местом в Сети, где разработчики бесплатных программ могут получить достойное вознаграждение за свой труд. Когда вы наконец-то решите представить свою разработку на конкурс, то для начала посетите страницу http://www.microsoft.ru/offext/rules и загрузите с нее Лицензионное соглашение и Анкету разработчика, которые вам необходимо заполнить. Вы можете свободно изменять Лицензионное соглашение так, как вам заблагорассудится, но в Анкете должны указать точные данные. Помните, что оба этих документа будут распространяться вместе с вашей разработкой, так что не указывайте там слишком конфиденциальных данных. Затем поместите вашу разработку, а также Анкету и Лицензионное соглашение в архив формата Zip и отошлите его в виде аттачмента по адресу offext@microsoft.com. В течение 24 часов вам должно придти потверждение получения вашей разработки, отправляемое автоматически. Если оно не пришло, то повторите отправку — видно, почтовые серверы сработали с ошибками. Требования к представляемым программам немногочисленные и вполне разумные. Во-первых, программа должна работать в русской версии Microsoft Office XP. Во-вторых, она не должна повреждать какие-либо файлы системы или пользователя, не должна вызывать зависание системы. Однако есть также и Пожелания Тестовой лаборатории PC Magazine разработчикам. Если представляемая программа им соответствует, то это повышает ее шансы на выигрыш в конкурсе. И вот какие это пожелания: · Во-первых, программа должна хорошо выполнять свою функцию и работать программа должна надежно — не допускать непредсказуемости своего функционирования даже в случае не совсем адекватной работы самого Office. · Во-вторых, программа должна работать корректно — то есть не допускать потери данных пользователя. Так, если программа не предназначена для изменения параметров текста, то она и не должна их менять. · В-третьих, желательно, чтобы разработка имела удобный интерфейс и подробную документацию на русском языке. · В-четвертых, желательно наличие программы установки и удаления разработки, если это, конечно, необходимо. Крайне желательно, чтобы разработка предоставляла возможность как автоматической установки, так и ручной. · И, в-пятых, весьма желательно, чтобы разработка поставлялась с кодом, не закрытым от просмотра паролем. Во всяком случае, доверия тогда к разработчику будет больше, а значит, и вероятность получить приз выше. Сайт "Высокие статистические технологии" Есть в Интернете такой сайт — "Высокие статистические технологии". Казалось бы — посвящен он лишь сложным математическим методам и теориям, которые нужны лишь специалистам в этой области. Да, это в определенной степени так — значительная часть сайта содержит материалы по новому направлению математики — статистике обьектов нечисловой природы. Но есть на этом сайте и учебник по менеджменту, и полезные программы, и интересные статьи, и даже лекция об устройстве атомных реакторов. Впрочем, расскажем об этом ресурсе по порядку. Вот что вы там найдете: · Статьи доктора технических наук, профессора А.И.Орлова, посвященные современным статистическим технологиям. Если вы являетесь специалистом в области статистических наук, то вас наверняка заинтересует рассказ о новом направлении математики — статистике обьектов нечисловой природы, позволяющей использовать статистические методы для обработки данных, не поддающихся переводу в числовые значения. · Статьи про актуальные проблемы современного состояния экономики России, про вероятные перспективы развития нашей страны в ближайшее время. Вас наверняка заинтересует прогноз жизни России на предстоящее десятилетие, представленный в виде возможных сценариев развития событий и оценки вероятности их осуществления. Повествование о новых достижениях исторической науки, ставших возможными вследствие развития информационных технологий, расскажет вам о сенсационных результатах этих исследований. Вы также узнаете о том, насколько велик денежный долг западных стран России, прочитаете рассказ о мифах, существующих до сих пор в общественном сознании. · Информацию об Институте высоких статистических технологий, основанном профессором А.И.Орловым. Институт на хоздоговорных и госбюджетных началах занимается развитием, изучением и внедрением высоких статистических технологий, т. е. наиболее современных технологий анализа технических, экономических, социологических, медицинских данных, ориентированных на использование в условиях современного производства и экономики. Основной интерес представляют применения высоких статистических технологий для анализа конкретных экономических данных — в эконометрике. · Возможность подписаться на бесплатную электронную газету «Эконометрика», в которой рассказывается об этой науке, на наглядных примерах демонстрируются технологии прогнозирования экономической ситуации, оценки рисков, повествуется о применении эконометрики в экологии, менеджменте, управлении предприятием. Если вы учитесь в экономическом ВУЗе, желаете стать специалистом в своей области, то эта газета предназначена специально для вас. · Учебник по менеджменту профессора А.И.Орлова. Он рассказывает о премудростях этой науки живым и легкодоступным языком и может служить как учебным пособием, так и просто интересной книгой. Учебник завоевал заслуженную популярность у студентов и преподавателей и был издан как часть учебного пособия по менеджменту. В настоящее время готовится его отдельное издание. · Программы «ВерсткаТекстаКнижкой», «Untaco» и "Генератор иконок", о которых подробно рассказано в этой главе. · Программу-дополнение для Microsoft Word 97/2000 «Каталогизатор», которая даст вам возможность создавать каталоги из гиперссылок на файлы в той или иной папке, а также web-страницы, содержащие картинки из какого-либо каталога. Ее удобно использовать, если вы желаете упорядочить свои файлы на жестком диске или создаете web-сайт. · Набор дополнений для Microsoft Word 97/2000 «SaveIn». В этом наборе вы можете найти интересные технические решения и посмотреть, как они в нем реализованы. Кроме того, «SaveIn» поможет вам, если вы постоянно сохраняете копии рабочих файлов в нескольких разных папках. · Лекцию об устройстве ядерных реакторов, рассказывающую об основных принципах их работы и строения, освещающую также вопросы безопасности ядерной энергетики. Лекция может послужить прекрасным докладом или рефератом, а также — просто занимательным чтением. Так что каждый может найти на сайте что-нибудь полезное для себя. Вряд ли вы уйдете с него разочарованным. Ну, а какой же адрес у сайта "Высокие статистические технологии"? Вот такой: http://antorlov.euro.ru. Есть и зеркало — http://www.newtech.ru/~orlov. Так что добро пожаловать в любое время дня и ночи. А если вы живете в Москве, то на заглавной странце сайта http://antorlov.euro.ru прочитайте, как получить к его зеркалу доступ бесплатно, не платя деньги провайдерам за пользование Сетью. Глава 7. Напутствие И под конец первой части книги, посвященной программированию в среде Microsoft Office, стоит сказать пару слов тем, кто все же заинтересуется этой темой. Создавая программы на Visual Basic for Applications, вы сможете на опыте получить представление практически обо всех современных принципах программирования: как структурных — основанных на последовательном выполнении всех команд программы, так и «событийных», согласно которым программа должна реагировать соответствующим образом на действия пользователя. В современном программировании используются как структурный, так и событийный принципы: интерфейс программ построен по принципу реакции на события, а функции, выполняемые программой — по принципу независимой работы. Например, графический редактор Paint, да и тот же Word в большей своей части являются приложениями, управляемыми событиями — действиями пользователя; а, скажем, программы дефрагментации или проверки диска работают почти независимо от пользователя, он только должен задать им начальные параметры. В VBA можно писать как программы, управляемые событиями (посредством разработки форм), так и работающие последовательно и независимо (используя только модули), а также, разумеется, и приложения, сочетающие в себе оба способа действия. VBA может служить не только полноценной средой разработки приложений, работающих в Microsoft Office, но и как бы "учебным центром" по освоению принципов и различных приемов современного программирования. Работа с системным реестром, с файловой системой и даже со встроенными в Windows функциями программирования API и многое другое, — все это вы сможете изучить на опыте, используя VBA, причем сделать это Вам будет значительно легче, чем если бы Вы сразу начали учиться программировать на Delphi или Visual Basic for Windows. Средство записи макросов, возможность легкого анализа уже написанных программ (так как фактически любая программа на VBA распространяется вместе со своим исходным текстом), русский интерфейс редактора (к сожалению, только в Microsoft Office 97), большая и четко написанная справка, обилие примеров, — все это очень помогает в освоении этого языка и делает возможным его самостоятельное изучение даже без использования дополнительной литературы. Другие языки программирования так освоить практически невозможно. Кроме того, интерпретатор VBA обладает большими возможностями по коррекции ошибок, и поэтому программа на этом языке вряд ли вызовет ошибку системы и необходимость перезагрузки компьютера, если только не увлекаться вызовом функций API. Если Вы научитесь программировать на VBA, поймете принципы разработки алгоритмов и основные приемы программирования, освоите среду написания программ — редактор VBA, то для Вас практически не составит труда начать создавать программы на Visual Basic for Windows. У этого языка абсолютно такой же синтаксис, такая же среда разработки с контекстной справкой и пошаговыми подсказками, на первый взгляд он отличается от VBA разве что набором доступных встроенных процедур и функций и отсутствием возможности записи макросов. Безусловно, есть и более глубокие различия, но при создании не очень сложных программ они не будут иметь большого значения. Вы сможете легко освоить средство разработки программ Delphi, хотя логика языка Pascal, лежащего в основе Delphi, несколько отличается от логики Visual Basic. Однако и среда разработки, и общие принципы программирования в Delphi те же. Несколько труднее будет освоить C++ и его производные из-за серьезно отличающегося синтаксиса и высокой сложности этого языка, но это не всегда необходимо, — подавляющее большинство проектов программ можно реализовать на Visual Basic или Delphi. * * * Среди тех, кто занимается программированием уже много лет и достиг в этом деле определенных высот, весьма распространено мнение, что VBA, да и Visual Basic — языки, на которых нельзя создать быстро и хорошо работающие программы. В определенной степени это соответствует действительности: программы на Visual Basic обычно работают несколько медленнее и занимают больше места, чем аналогичные им программы на С++, на Visual Basic весьма проблематично решение некоторых программистских задач и приемов. Поэтому профессиональные программисты часто считают, что Visual Basic — язык для дилетантов, а любой уважающий себя специалист в области информационных технологий обязан знать и использовать такие языки, как С++ или ассемблер. Но не следует забывать, что изначальное предназначение компьютерных технологий — помощь человеку в обработке и создании информации, а отнюдь не "служение самим себе", своему дальнейшему развитию. Поэтому основная функция большинства компьютерных программ — получение нужного результата, обработка вводимой информации, например, анализ электрокардиограммы или расчет траектории космической ракеты, а быстродействие, малый размер, да и удобство интерфейса — лишь их хорошие свойства, которые могут серьезно облегчить работу с программой. Создать же программу, дающую действительно нужный результат, может лишь человек, непосредственно работающий в области, для которой данная программа пишется, — врач, инженер, астроном, математик. Только он знает все тонкости своего дела и сможет предусмотреть в программе все необходимые условия. Профессиональный программист же, хоть и имеет возможность создать программу, которая будет работать в несколько раз быстрее и занимать на диске значительно меньше места, чем написанная врачом или инженером, не представляет себе тонкостей области человеческой деятельности, для которой эта программа пишется, а поэтому, при всей внешней привлекательности, такая программа будет работать хуже, чем первая. К примеру, какая программа для анализа электрокардиограмм лучше: созданная опытным специалистом в области медицины, который посвятил всю свою жизнь исследованию электрокардиографии и энает все-все тонкости этого дела, или написанная не менее опытным программистом, который знает все языки программирования как свои пять пальцев, но, увы, не знаком с медициной? Даже если врач обратится к программисту с просьбой помочь ему написать эту программу, то он все равно не сможет посвятить того во все тонкости своего дела, чтобы отразить в программе все грани своего многообразного опыта, — на это может уйти слишком много времени и сил, да и нелегко программисту будет изучить совершенно незнакомую ему до этого сферу деятельности! Поэтому врач, немного знающий программирование, больше подходит для написания медицинской программы, чем профессиональный программист, немного знакомый с медициной. И пусть программа врача будет работать медленнее, пусть она будет занимать на диске в два раза больше места, пусть даже при ее создании будут нарушены все сложившиеся каноны программистского искусства, — все равно она сможет принести людям гораздо больше пользы, чем программа, прекрасно и хорошо написанная не знакомым с медициной человеком, так как только врач сможет поделиться с ней всем своим многогранным опытом.[16 - Без сомнения, при промышленном производстве таких программ и врачи, и программисты работают в команде, причем первые разрабатывают алгоритм работы программы на понятном им языке, а вторые его реализуют. Речь идет о возможности применения программирования каждым пользователем для решения насущных задач, организовывать команды разработчиков для которых возможности нет.] Отнюдь не всякий человек, превосходно умеющий лечить людей, сможет столь же превосходно освоить язык С++. И это нормально — у каждого свой талант, свои дарования. Но, благодаря стараниям сотен и тысяч программистов, зачастую безвестных, сейчас существуют среды программирования, освоить которые без проблем может каждый — те же Visual Basic и Delphi. И поэтому практически любой специалист своего дела может в наши дни использовать в своей работе новейшие достижения информационных технологий — создать нужную ему программу, разработав ее алгоритм на основе своего опыта. А для профессиональных программистов осталось не менее почетное и трудное дело — создавать такие среды программирования и новые языки, с которыми работать будет еще легче и быстрее, чем с существующими. На вопрос: "Какой язык программирования лучше всего?" стоит отвечать так: "Тот, на котором ты можешь лучше всего писать программы и реализовывать свои проекты". Проще всего освоить Visual Basic и Delphi. И поэтому не стоит так уж стремиться обязательно знать ассемблер, выучить все функции API и жалеть, что не можешь вводить программы сразу в машинных кодах, — лучше повнимательнее изучить более простой язык даже вроде того же VBA для того, чтобы уметь использовать все его возможности для воплощения своих пожеланий в жизнь. Ну, а если кто желает посвятить свою жизнь информационным технологиям, создавать новые языки общения с компьютером, то тому знание Visual Basic никогда не помешает, а остальные знания, как говорится, дело наживное, — надо лишь начать учиться и освоить общие принципы. Не стоит думать, что "программирование мне никогда не понадобится" — современные компьютерные технологии развиваются с огромной быстротой, и скоро практически любая область человеческой деятельности будет компьютеризирована. А чтобы получить в своей работе наилучший результат, нужно уметь приспособить орудие труда — компьютер — под свои нужды, то есть — программировать. * * * И, наконец, стоит сказать об использовании программирования на VBA в процессе обучения в школе, институте, да и в самостоятельном образовании. Обучение искусству составления программ на собственном опыте, путем самостоятельного исследования возможностей языка и среды разработки является одним из наилучших способов научиться так называемому "научному мышлению", тому подходу к различным явлениям окружающего мира, на котором стоит вся современная наука. Самостоятельно обучаясь использованию VBA, можно как бы на небольшой модели испробовать почти все исследовательские приемы, которые используются современной наукой, — и наблюдение, и анализ результатов, и эксперимент… Например, вынесение из записанного макроса неизвестной команды в отдельную процедуру для выяснения ее функции, — чем не эксперимент в контролируемых условиях? Или изменение параметров команды с целью узнать, к чему это приведет, — разве не так действуют исследователи, изменяя начальные условия эксперимента? Так что изучение VBA может стать целым "научным исследованием", в течение которого можно будет отработать основные приемы современного научного подхода. Удачи вам в программировании! Из мира Интернета · В Интернете есть немало информации о программировании на VBA. Помимо Форума для разработчиков на сайте программы Microsoft Office Extensions (http://www.microsoft.ru/offext), обратите внимание на сайт Андрея Колесова и Ольги Павловой http://www.visual.2000.ru, на котором представлены статьи этих авторов о VBA, а также на литературу из сетевых библиотек http://www.firststeps.ru, http://www.rusdocs.ru, http://www.emanual.ru и других. Наверняка найдете немало полезного. Список разработчиков VBA Если вы хотите посмотреть имена тех, кто занимался разработкой языка VBA, создавал среду разработки — Редактор VBA или писал справочную систему, то сделайте следующее. Запустите Редактор VBA и выберите из меню «Вид» пункт "Панели инструментов — Настройка" (в английском варианте интерфейса соответственно пункт "Toolbars — Customize" из меню "View"). После открытия диалогового окна настройки панелей вы получите возможность переименовывать, удалять или добавлять пункты меню и иконки на панелях инструментов Редактора VBA. Затем в режиме настройки откройте меню помощи (скрывается за вопросительным знаком или словом Help в строке меню) и переименуйте самый нижний его пункт — "About Microsoft Visual Basic" в английских версиях или "О программе" в русской, задав ему имя "Show VB Credits". Выйдите из Режима настройки, закрыв диалоговое окно. Теперь, выбрав из меню помощи пункт Show VB Credits, вы увидите медленно плывущий снизу вверх список разработчиков на фоне крутящихся кубиков и приятной музыки. Клавиши стрелок управляют скоростью движения списка. Данная возможность присутствует в Office 97 и Office 2000, но из Office XP она убрана. Часть II. ИССЛЕДУЕМ КОМПЬЮЕТР Вторая часть книги посвящена устройству и работе компьютерных систем и сетей. Из нее вы узнаете, что находится внутри жесткого диска и отчего существует пять разных кодировок для русского языка, как устроены жидкокристаллические экраны и кто такие «фидошники» или «линуксоиды». Глава про устройство сети Интернет содержит редкую информацию, которую можно встретить лишь в сложных профессиональных руководствах, тем не менее, написана она достаточно доступно для того, чтобы понять ее без особой подготовки. А если вы хотите узнать о том, как создать сеть без постоянных соединений между компьютерами — познакомьтесь со строением Fidonet. Глава, посвященная электронной почте, расскажет вам о секретах данной технологии передачи информации. Полезные советы, которыми перемежаются некоторые главы, могут помочь вам в вашей работе с компьютерными технологиями. Если вы какую-то информацию не поймете — спокойно пропустите ее. Вернетесь потом. Возможно, некоторые главы вам придется прочитать неоднократно. И это нормально — все осознать и освоить за один раз нельзя. Эта книга — не учебник, который нужно читать последовательно от начала до конца. Она скорее является справочником для "компьютерщиков"-самоучек, для тех, кто решил самостоятельно узнать, как устроен и работает компьютер. Так что читайте в ней то, что вам нужно, а не то, что идет по порядку. Теоретические главы в книге перемежаются практическими, а сложные в понимании — легкими. Хотите ли вы узнать о строении Интернета или о «секретных» приемах работы в Microsoft Word, желаете ли познакомиться с перспективными разработками в области устройств мониторов или узнать об том, как перепрошить BIOS и установить на компьютер несколько операционных систем сразу, — для всего вам пригодится книга, которую вы держите в руках. Так что — в путь! Из мира Интернета · На сайте http://karamurza.chat.ru представлена книга видного современного философа и политолога С.Г.Кара-Мурзы "Опять вопросы вождям", которая является глубоким научным исследованием современных проблем западного и российского общества. Данная книга может серьезно повысить образовательный уровень интересующихся политологическими и социологическими проблемами. · Если вы желаете регулярно получать на ваш компьютер новости и разную полезную информацию, то посетите сервер www.informer.ru и создайте на своем жестком диске web-страницу с набором полюбившихся вам информеров, вставив в нее предоставляемый при выборе информера код. При каждом заходе в Интернет открывайте эту страницу, нажимайте кнопку «Обновить» и узнавайте погоду на текущий день, а также многое другое… Глава 8. Как хранятся данные? Компьютер — это устройство для обработки и хранения информации. Эта глава посвящена устройству основного носителя информации — жесткого диска и работе файловой системы — способа организации хранения информации на нем. Жесткий диск Если вскрыть корпус жесткого диска и посмотреть, что там внутри, то наиболее заметной деталью будет стопка темныхили зеркальных дисков, насаженных на одну ось и занимающих большую часть пространства внутри корпуса винчестера.[17 - Один из жестких дисков, в свое время разработанный корпорацией IBM, имел емкость в 30 мегабайт на пластину и обозначался как 30/30. Точно так же в Америке обозначаются ружья-винчестеры — согласно их калибру. Отсюда и пошло наименование жесткого диска «винчестером» — надо же было как-то назвать деталь с именем "накопитель на жестких магнитных дисках".] Именно они и являются хранилищем информации. В качестве материала для дисков обычно используется алюминий, реже — стекло или керамика. Диски покрыты слоем окиси хрома, которая, собственно, и обладает возможностью сохранять в себе магнитные метки, и жестко закреплены на оси, которая в своей нижней части является якорем плоского электродвигателя. Между каждыми двумя дисками есть некоторое расстояние. Сбоку от стопки дисков находится блок головок, состоящий из расположенных один над другим держателей с головками, скрепленных в единое целое. Блок головок может поворачиваться, причем так, что держатели головок заходят в промежутки между дисками. Данные хранятся на обоих поверхностях каждого из дисков, поэтому вокруг каждого диска находится по две головки — сверху и снизу. В процессе работы стопка дисков вращается вокруг своей оси, поэтому блок головок в принципе может получить доступ к любому участку любого из дисков. Поворотом блока головок управляет специальный электромагнитный двигатель, вмонтированный в его основание. Также внутри корпуса жесткого диска находится небольшая микросхема — усилитель сигналов, соединенная шлейфом из проводов с блоком головок. Магнитные диски, блок головок и микросхема заключены в герметичный корпус, заполненный обеспыленным воздухом. В целом содержимое корпуса напоминает проигрыватель грампластинок, отличающийся тем, что одновременно на ось насажены несколько дисков, для каждого из них с обоих его сторон имеется по звукоснимающей головке, и все головки для всех дисков связаны в единый блок. В выключенном состоянии блок головок повернут так, что головки находятся у оси стопки дисков, в так называемой "зоне парковки". Снаружи герметичного корпуса располагаются различные микросхемы, управляющие жестким диском, в частности, микросхема с нестираемой служебной информацией, кэш диска — как бы его "оперативная память", куда помещаются передаваемые на диск данные перед тем, как стать записанными на винчестер и некоторые другие блоки. Блок головок может перемещаться поперек стопки дисков с определенным шагом. При своем перемещении он ориентируется на специальные магнитные метки, нанесенные на диски при их изготовлении. Тот фрагмент поверхности диска, который доступен одной головке при неподвижном блоке и полном обороте стопки дисков, называется дорожкой, совокупность всех фрагментов поверхностей всех дисков, доступных при одном обороте стопки дисков и неподвижном блоке, именуется цилиндром. Количество цилиндров зависит от радиуса дисков и возможного шага перемещения блока головок. Каждая дорожка с помощью магнитных меток еще во время изготовления винчестера[18 - В первых моделях винчестеров все магнитные метки — и для разбиения на дорожки и на секторы, и для стабилизации скорости вращения, и для поиска секторов — записывались не на заводе, а при так называемом "низкоуровневом форматировании диска" — специальной процедуре, проводимой под руководством BIOS компьютера. В некоторых BIOS'ах и сейчас есть возможность осуществления этого мероприятия, однако диски последних моделей от низкоуровневого форматирования будут необратимо испорчены — служебные метки сотрутся, а новые, помещенные BIOS'ом, восприниматься электроникой дисков не будут.] разбивается на секторы — непосредственные единицы хранения информации на жестком диске. Согласно существующим стандартам, в каждом секторе может быть записано 512 байт информации, метка начала сектора и число, рассчитываемое на основе информации в секторе для отслеживания возможных ее изменений (так называемая "контрольная сумма сектора"). Начало каждой дорожки и сектора также особо помечается, причем начала всех дорожек, как нетрудно понять, расположены в плоскости одного радиуса стопки дисков. Кроме того, на поверхности дисков, обычно между секторами, размещаются служебные магнитные метки, использующиеся для определения и стабилизации скорости вращения стопки дисков, а также более быстрого поиска нужных секторов и дорожек. Управляет работой жесткого диска особая микросхема, именуемая контроллером винчестера. Для чтения или записи какого-либо сектора контроллеру следует указать номер цилиндра, номер дорожки и номер сектора на этой дорожке. (Номера дорожек еще называют "номерами головок" — так как на каждую дорожку, входящую в цилиндр, приходится как раз одна головка.) Получив эту информацию, контроллер прикажет блоку головок расположиться над дорожками цилиндра, а затем начнет работать с той головкой, которая находится над нужной дорожкой, приказав ей дождаться того момента, когда вследствие вращения стопки дисков под ней пройдет нужный сектор, а затем считать из него информацию или, наоборот, записать туда данные. Несмотря на то, что в каждый отдельный момент контроллер винчестера может работать максимум лишь с одним сектором на одном из дисков стопки, блок головок перемещается целиком — со всеми головками. Это может показаться нерациональным, но иначе конструкция винчестера очень бы усложнилась. После окончания сборки жесткого диска на заводе проводится его тестирование с помощью специальной аппаратуры. К сожалению, на существующем уровне развития технологий добиться идеально качественной поверхности магнитных дисков невозможно, поэтому на них обязательно будут дефектные участки — места, куда невозможно полноценно осуществить запись данных. Чтобы этот факт не приводил к невозможностью работать со всем жестким диском, во время тестирования составляется так называемая "таблица переназначения дефектных секторов". При этом контроллер жесткого диска программируется так, что при поступлении обращения операционной системы к дефектному сектору в действительности работа осуществляется с резервными сектором, находящимся в специальной области диска (располагающейся, в зависимости от модели винчестера, на каждой дорожке или, чаще, в отдельных цилиндрах). Данные о соответствии дефектных секторов диска резервным также находятся в специально выделенной области и загружаются в память контроллера жесткого диска при начале работы винчестера. При запуске компьютера и подаче напряжения на жесткий диск после краткого самотестирования микросхем винчестера начинает работать электродвигатель и раскручивает стопку дисков. Когда скорость вращения двигателя достигает определенной величины, за счет давления воздуха, увлекаемого дисками при вращении, держатели головок чуть-чуть приподнимают их над дисками, и под ними возникает воздушная подушка. Головки получают возможность перемещаться поперек стопки дисков, не касаясь их поверхности. Как только это происходит, контроллер винчестера дает им команду считать информацию стабилизации скорости вращения, всегда находящуюся в одних и тех же местах, а также таблицу переназначения дефектных секторов. После этого производится самотестирование жесткого диска путем считывания определенной последовательности дорожек, и, если все прошло нормально, сообщение BIOS'у об успешном запуске винчестера. BIOS, или базовая система ввода-вывода: Base Input-Output System, — это программа, записанная в микрочипе на материнской плате. Она содержит в себе функции управления ресурсами материнской платы и некоторых периферийных устройств, а также программу работы с жестким диском — считывания и записи данных, перемещения головок. Операционная система MS-DOS использует именно BIOS для работы с ресурсами компьютера — когда MS-DOS посылает команду считать данные с винчестера, то выполняет ее BIOS. Системы Windows9x/Me, Windows NT/2000/XP, Linux используют свои программы-драйвера для работы с винчестерами. BIOS'у компьютера и операционной системе не обязательно поставляются точные данные о физическом строении ("физической геометрии") жесткого диска — о количестве цилиндров, головок, секторов. Электроника винчестера способна "на лету" пересчитывать данные "физической геометрии" в так называемую "логическую геометрию" диска и уже именно ее параметры сообщать BIOS'у. Например, старые модели BIOS не могут работать больше, чем с 1024 цилиндрами, 256 дорожками в цилиндре и 63 секторами на дорожке. Это связано с возможностями его так называемого "прерывания 13", способа работы с жестким диском, изначально в BIOS запрограммированного и используемого MS-DOS, а также операционными системами Windows во время загрузки. Поскольку развитие жестких дисков шло именно по пути увеличения количества цилиндров (в самом деле, представить себе жесткий диск с 256 головками одна над другой сложно), то для того, чтобы с диском можно было работать через BIOS, контроллер винчестера представляет BIOS'у, скажем, диск с 20480 цилиндрами и 4 дорожками как диск из 1024 цилиндров и 80 дорожек. К сожалению, даже при использовании конвертации "физической геометрии" диска в «логическую» максимальный обьем винчестера, с которым можно работать средствами BIOS, составляет 1024*256*63*512= 8455716864 байт = около 8 гигабайт. С дисками большего обьема работать посредством 13-го прерывания BIOS невозможно.[19 - Вернее, нельзя работать с данными, расположенными на диске за пределами его первых 8 гигабайт.] Поэтому на новых материнских платах BIOS особым образом усовершенствован ("прерывание 13" сделано "расширенным"), и это ограничение емкости дисков в нем отсутствует. Современные операционные системы при своей работе не используют 13-е прерывание BIOS, а поэтому могут работать с дисками весьма большого обьема. Но каждая операционная система должна загрузиться, а в процессе загрузки ее файлы могут быть считаны с диска только средствами BIOS'а. Поэтому в случае использования больших дисков со старым BIOS'ом с загрузкой операционной системы могут быть сложности. Кроме того, на современных жестких дисках применяется особая форма разделения дорожек на секторы, при которой внешние дорожки, протяженность которых больше, чем внутренних, разбиваются на большее количество секторов. При этом для операционной системы диск все равно имеет равное количество секторов на каждой дорожке, а преобразование запросов операционной системы в команды блоку головок производится в соответствии со специальными таблицами, записанными в микросхемах жесткого диска. В жестких дисках последних 7–8 лет выпуска имеется так называемая система S.M.A.R.T. (то есть "Self Monitoring Analysis and Reporting Technology") — особые компоненты устройства, предназначение которых заключается в отслеживании возможных неисправностей и устранении их по мере возникновения. Так, в то время как в старых дисках таблица переназначения дефектных секторов формировалась на заводе, выпускающем винчестеры, а впоследствии уже не могла изменяться, то в новых винчестерах система S.M.A.R.T. во время работы диска отслеживает качество записи и чтения с каждого сектора и при его снижении заранее переназначает сектор на резервный, не дожидаясь момента отказа. Изначально же область резервных секторов делается больше, чем нужно в момент изготовления диска, — с расчетом на будущее. Читая старые статьи и воспоминания компьютерщиков, вы наверняка обращали внимание на описания ситуации, когда жесткий диск покрывается сбойными секторами, и наверняка поражались, что, к счастью, вас эта чаша минула — ваш недавно выпущенный диск абсолютно исправен и не имеет ни одного поврежденного сектора. Но это так из-за действия системы S.M.A.R.T. - она просто даже не дает операционной системе заметить, что тот или иной участок диска испортился, моментально переназначая на него резервные секторы. И только тогда, когда вся резервная область будет исчерпана, на вашем жестком диске появятся видимые из операционной системы сбойные участки. Помимо слежения за качеством поверхности жесткого диска, S.M.A.R.T. также отслеживает изменения параметров работы механики винчестера, таких, как время достижения диском расчетной скорости вращения, время доступа к различным зонам диска и в случае, когда эти параметры выходят за допустимые пределы, сообщает операционной системе, что диск собирается испортиться. Если операционная система поймет сообщения S.M.A.R.T., то пользователю будет сообщено о вскоре предстоящей необходимости замены диска. Для просмотра параметров S.M,A.R.T. можно воспользоваться программным комплексом HDDUtility Дмитрия Пашкова (адрес для загрузки — http://www.ibaranov.ru/hddutil.rar, программа работает только в среде Windows9x). Кроме того, если ваш диск выпущен фирмой Quantium после 1997 года, то с помощью HDDUtility вы сможете просмотреть его дефект-лист непосредственно и узнать, какие конкретно сектора являются переназначенными. Если же у вас нет HDDUtility или воспользоваться вы им вы не можете (например, по причине работы в другой операционной системе), то используйте любой программный пакет для тестирования компонентов компьютера, имеющий функцию прорисовки графика скорости последовательного чтения секторов диска (например, ZiffDavis WinBench 99). Моменты резкого падения скорости чтения соответствуют переназначенным секторам, так как при тестировании такого сектора тратится время на перемещение магнитной головки в резервную область и обратно к той дорожке, на которой располагался переназначенный сектор. Если при заводском тестировании на одной поверхности магнитной пластины будет найдено столько плохих секторов, что весь дефект-лист окажется заполненным, а другая поверхность будет в порядке, то ту магнитную головку, которая должна работать с дефектной поверхностью, просто отключают. Вас, кстати, никогда не удивляло наличие в магазинах дисков, скажем, на 10 и 30 гигабайт при заявленной емкости одной пластины в этих моделях в 20 гигабайт? Величины-то 20-ти не кратны. Так вот в таких дисках одна из сторон их магнитных пластин имеет так много дефектов, что просто отключена и диск промаркирован на меньшую емкость. Скажем в 10-гигабайтном винчестере стоит 20-гигабайтная пластина, в которой работает только одна сторона. На свободное место в резервной зоне поврежденные сектора переназначаются лишь на некоторых моделях жестких дисков. На остальных же переназначение секторов может идти лишь на резервные, находящиеся лишь на той же дорожке. Или на том же секторальном блоке. Или на том же цилиндре. Использование же для переназначения секторов резервной области другой дорожки (блока, цилиндра) невозможно. Делается это для некоего упрощения работы системы переназначения секторов, подразумевается, что повреждения поверхности про исходят в относительно случайном порядке. При длительной работе жесткого диска примерно так и происходит, однако, скажем, при ударе по диску или при его падении может происходить повреждение сразу множества секторов, расположенных в одном месте. Тогда, если эти поврежденные секторы находились, например, на одной дорожке, резервная область этой дорожки окажется переполненной переназначенными секторами, и места в ней для всех не хватит. Многие bad-сектора останутся непереназначенными, и при проверке диска кластеры, их содержащие, будут помечены как поврежденные. Однако резервные области на остальных дорожках останутся незаполненными — те-то дорожки повреждены не были, и общий процент переназначенных секторов будет не таким уж и высоким. Поэтому получится ситуация, при которой согласно сообщениям S.M.A.R.T. процент заполнения дефект-листа низкий, в bad-блоки на диске имеются. Однако моделей жестких дисков, использующих именно такой способ работы с переназначенными секторами, не так и много. Шумовой эффект «хрюканья», возникающий при работе с жестким диском, обусловлен перемещением головок взад-вперед по диску. Процесс равномерного считывания содержимого диска практически бесшумен. Вы можете сами в этом убедиться, сравнив шумовые эффекты от работы программы ScanDisk в режиме проверки поверхности диска, при которой блок головок медленно и равномерно перемещается вдоль диска, и программы Defrag, при работе которой блок головок постоянно двигается взад-вперед. Однако даже при работе ScanDisk в режиме «полной» проверки диск все равно время от времени «всхрюкивает». Это происходит как раз в те моменты, когда проверка доходит до дефектного сектора, и контроллер винчестера заставляет головки переместиться в зону, где содержатся резервные секторы. Из этого следует простой практический вывод: если вы желаете узнать, насколько качественно сделана поверхность вашего жесткого диска без каких-либо специальных программ проверки S.M.A.R.T. или тестирования скорости считывания, то запустите ScanDisk в режиме полной проверки, дождитесь начала тестирования поверхности и прислушайтесь к звукам, доносящимся из корпуса компьютера. Каждое «хрюканье» будет означать наличие одного дефектного сектора. Естественно, в период проверки не следует допускать какую-нибудь еще работу с жестким диском со стороны операционной системы или запущенных программ, включая планировщики заданий и хранитель экрана. "Всхрюкивание" жесткого диска при начале загрузки компьютера также связано с перемещением головок по определенной последовательности дорожек во время самотестирования. Жесткий диск в своем «натуральном» виде, полученном на заводе, непригоден для размещения информации. Чтобы на винчестере можно было хранить данные, необходимо создать на нем файловую систему. Файловая система Каждый пользователь Windows может провести небольшой интересный эксперимент. Перейдите в корневой каталог какого-нибудь логического диска, например, С, выделите там все папки и файлы и посмотрите совокупный обьем хранящейся в них информации с помощью пункта «Свойства» меню правой кнопки мыши. Если вы работаете в Windows98, обратите внимание на число в окне свойств выделенных папок, после которого стоит слово «занято», — эта величина показывает размер физически занятого этими папками пространства на диске. В Windows2000/XP соответствующая строчка так и гласит — "на диске: столько-то байт". Ну, а в Windows95 посмотрите в окне "Мой компьютер" обьем занятого пространства диска, точно так же вызвав пункт «Свойства диска» (рис. 8.1). Рис. 8.1.Неодинаковые данные. Значение совокупного обьема данных во всех файлах и папках на диске может вас несколько удивить: оно окажется на несколько десятков процентов меньше, чем обьем занятого ими пространства диска. К примеру, на диске С по данным окна "Мой компьютер" и соответствующей строчки в окне свойств совокупности размещенных на нем папок и файлов было занято 1.83 гигабайт, а обьем всего содержимого диска — 1.44 гигабайта (рис. 8.1). Почему так? Куда делись еще 0.39 гигабайт? А ведь этого обьема несколько лет назад хватило бы на небольшой жесткий диск… Да и вообще — как, собственно, устроена система хранения данных на компьютере? Нет, ясно — данные записаны в секторах жесткого диска, чтение их оттуда и запись туда осуществляется контроллером винчестера когласно командам операционной системы. Но ведь секторов так много, и данные в них такие разные! Как же все-таки компьютер находит на кружке из алюминия с магнитным покрытием нужную информацию и при этом не путается? Как он разбирается во всей этой массе секторов? Для того, чтобы решить задачу размещения данных на диске, была создана файловая система — такой способ хранения информации, при котором вся она представлена отдельными фрагментами, имеющими имена — файлами. В разных операционных системах файловая система устроена по-разному. В этой главе будет рассмотрена система FAT, использующаяся в MS-DOS, Windows95 и Windows98 в качестве основной файловой системы, так как она является наиболее просто устроенной и на ее примере легко продемонстрировать основные принципы организации данных. Структура файловых систем, использующихся в качестве основных в операционных системах Unix, Linux, Windows NT/2000/XP другая, но их устройство — тема отдельной книги. Кластерная организация На минутку представим себя создателями первых операционных систем. Вот у нас есть жесткий диск — огромный массив секторов размером по 512 байт. Сектор, или блок — это «единица» поверхности жесткого диска на физическом уровне: именно к секторам обращается микросхема, управляющая жестким диском — контроллер жесткого диска — при проведении операций чтения и записи. Каждый сектор имеет свой «адрес» на диске, который известен контроллеру. Нужно обеспечить возможность записи файлов (то есть — отдельных фрагментов информации, каждый из которых имеет имя) на диск и чтения их оттуда, причем размер файлов значительно превышает 512 байт — то есть весь жесткий диск можно считать одной непрерывной поверхностью для записи данных. Казалось бы — а в чем проблема? Пишем файлы на диск друг за другом, записываем в особую область на диске информацию о номерах секторов с началами файлов и размер каждого файла — и нет проблем. Чтобы прочесть нужный файл, надо лишь перейти к его началу и считать столько секторов, сколько файл занимает. Но дело в том, что файлы с жесткого диска иногда надо не только читать, но и удалять, а на их место записывать новые. И что же получится? Файл удален, после него осталось свободное место, а другой файл, который предполагается записать на место старого, отличается по размерам и либо не влезает целиком туда, либо меньше и не заполняет все освободившеся место! В первом случае придется либо искать достаточно большой кусок свободного места, либо записывать новый файл в конец диска, а во втором — пытаться заполнить оставшееся свободным место более мелкими файлами. Все очень неудобно, и к тому же в результате может получиться диск, на котором полно свободных секторов, а новый файл записать некуда. Чтобы решить эту проблему, был придуман принцип кластерной структуры жесткого диска и использования специальной таблицы размещения файлов. При использовании этого принципа весь жесткий диск как бы делится на множество кусочков равного обьема — кластеров, каждый из которых содержит одинаковое число секторов. В начале диска размещается особая область с данными — FAT-таблица (от File Allocation Table — таблица размещения файлов), в которой записывается, в каких кластерах находится содержимое каждого находящегося на жестком диске файла. Например, примерно так: "файл записан в 121, 122 и 123 кластерах". С первого взгляда может показаться, что это — такая же ситуация, как и ранее. Но все дело в том, что один файл может располагаться не в последовательно расположенных кластерах, а в множестве отдельных кластеров, разбросанных по всему диску. Достаточно лишь перечислить номера этих кластеров и указать их последовательность друг за другом. То есть в FAT может появиться такая информация: "файл расположен в кластерах 120, 124 и 137". Операционная система, получив запрос на чтение этого файла, смотрит в FAT, в каких кластерах он записан, а потом последовательно их считывает, переписывая содержимое этих кластеров в оперативную память и соединяя его в ней в один неразрывный файл. Когда же операционной системе надо записать данные на жесткий диск, то она смотрит по таблице размещения файлов, где находится первый свободный кластер (то есть кластер, который не принадлежит какому-либо файлу), и пишет данные в него и последующие кластеры, указывая их номера в той же таблице. Но как только процесс записи файла на диск натыкается на занятый кластер, то система вновь ищет ближайший свободный кластер, следующий за занятыми, и продолжает запись данных на диск с него.[20 - Точно так происходит только в MS-DOS. Операционные системы Windows 9x ищут первый участок размером в 500 кб и больше, состоящий из пустых кластеров.] Если файл удаляется, то соответствующие ему кластеры освобождаются (точнее, просто их номера помечаются в таблице размещения файлов как свободные), и в эти кластеры снова возможна запись других данных. Таблица FAT Таблица FAT — это как бы уменьшенное изображение строения всего жесткого диска (рис. 8.2). Она состоит из отдельных записей-"строчек" с информацией о последовательности кластеров в файлах. Рис. 8.2. Если вы хотите наглядно представить себе, что такое FAT, то запустите программу дефрагментации диска из Windows95/98 и отобразите сведения о диске. Вот FAT — это примерно то же самое, только там вместо цветных квадратиков — отдельные записи, описывающие состояние каждого кластера диска. В каждой записи FAT содержится информация следующих видов: 1. Если кластер, к которому относится данная запись FAT, не является последним в файле, то в данной записи будет указан номер следующего кластера, в котором записан данный файл. 2. Если кластер, к которому относится данная запись FAT, является последним в файле, то в данной записи будет стоять специальная метка конца файла. 3. Если кластер, к которому относится данная запись FAT, не относится ни к какому файлу, то в данной записи будет находится информация, указывающая, что этот кластер свободный. 4. Если кластер, к которому относится данная запись FAT, расположен на поврежденной области диска, то в данной записи будет находится информация, указывающая, что этот кластер поврежден и не должен использоваться. Каждая запись в FAT имеет вполне определенную длину — 12, 16 или 32 бита. В зависимости от длины отдельных таких записей в FAT ее разновидности так и называются — FAT12, FAT16 и FAT32. С целью повышения надежности на диске обычно находится две копии FAT, записанные в его начале одна за другой. При сбое в первой копии используется вторая, резервная, а при сбое в обоих — лучше сохранившаяся. О том, с какого сектора начинается каждый кластер, нетрудно рассчитать на основе информации о размерах кластера и номере сектора начала области с файлами, разбитой на кластеры, что, собственно, и делается операционной системой. Узнать, какая файловая система установлена на вашем жестком диске, в операционных системах Windows можно в окне "Свойства диска". (Файловая система FAT16 обозначается как просто "FAT".) В FAT располагается информация только о физическом строении файлов — о том, в каких кластерах располагается каждый файл. В ней нет ни названий файлов, ни дат их создания, вообще — нет никакой информации о них. Только информация о связях кластеров между собой в файлы. При обращении операционной системы, скажем, для чтения какого-либо файла она обязана посмотреть сначала в FAT, узнать, в каких кластерах располагается нужный файл, а затем приказать головкам жесткого диска пройтись по этим кластерам и считать их содержимое. То есть — при каждом запросе на считывание или запись файла обязательно происходит обращение и к FAT. Вследствие этого с целью предотвратить постоянные перемещения головок по жесткому диску (к FAT и к кластерам с данными) FAT переписывается в оперативную память — кэшируется, и работа с ее копией на самом диске происходит лишь при изменении таблицы FAT, например, при создании нового файла или сохранении созданного ранее. Сохраните лишний раз в процессе работы какой-нибудь Word'овый, скажем, файл на жесткий диск, и вы заметите, как диск «хрюкнет» — то есть произойдет перемещение головок взад-вперед по диску. Причем шумовой эффект не будет зависеть от фрагментированности диска — даже на абсолютно чистом диске с единственным редактируемым файлом шум все же появится. Это так, потому что для записи файла головки жесткого диска будут перемещаться между областью FAT-таблицы, которая располагается в начале диска, и собственно записываемыми данными на диске. Каталоги Как уже было сказано, в FAT-таблице располагается информация только о размещении файлов в кластерах. Ну а где же хранятся имена файлов, их даты создания, атрибуты? И где находится информация о первом кластере каждого файла? Если в FAT информации о них нет, то где же она? А хранится она в каталогах. Каталог — это попросту файл, почти такой же, как и все остальные, занимающий место на диске, только содержащий данные о других файлах (и каталогах), которые в нем находятся. В файле каталога записана информация о находящихся в нем файлах (и вложенных других каталогах): их имена, обьем, даты изменения и создания, атрибуты, а также указывается номер самого первого кластера, занимаемого каждым файлом (и файлом-каталогом!). Каждая запись о файле называется дескриптором файла, запомните это слово — оно еще пригодится вам при чтении программистской литературы. Кроме того, во всех файлах каталогов, кроме корневого, имеется ссылка на первый кластер «родительского» каталога — то есть того каталога, который содержит этот самый каталог. В файлах каталогов, созданных в Windows95 и более старших версиях этой операционной системы, в каждом дескрипторе хранится как длинное имя файла, так и короткое — вида progra~1.exe, которое находится в том же месте дескриптора, что и в каталогах, созданных в MS-DOS. Таким образом обеспечивается возможность работы с созданными в Windows каталогами в старых операционных системах — эти системы смотрят в файл каталога и считывают оттуда лишь короткие имена файлов, а системы Windows умеют считывать из дескрипторов еще и длинные имена. Естественно, что при копировании или перемещении средствами MS-DOS файлов, созданных в Windows, длинные имена теряются, так как в этом случае операционная система MS-DOS копирует данные о файлах из одного файла каталога в другой, а так как она не умеет читать ту часть дескрипторов этих файлов, в которой записаны их длинные имена, то она их и игнорирует. Файл корневого каталога диска физически всегда расположен в одном и том же месте на диске — сразу после таблицы FAT, присутствующей на диске в виде двух копий, идущих друг за другом — для повышения надежности. Так как каталог — это обычный файл, то пустой каталог все равно будет занимать место на диске. К примеру, создайте на пустой дискете пустую папку и посмотрите обьем дискеты. На ней будет занято 512 байт (рис. 8.3). Рис. 8.3. Пустая папка тоже занимает место. Это и есть обьем файла, являющегося этим каталогом. Или, если у вас установлен пакет программ Norton Utilities для Windows, посмотрите на отчет программы Norton Speed Disk (рис. 8.4), — в нем показывается покластерная структура жесткого диска и указываются, какие файлы расположены в каждом кластере. В отчете вы увидите, что некоторые кластеры содержат файлы с именами каталогов — то есть файлы самих этих каталогов. Рис. 8.4. Если хотите убедиться, что каталог реально из себя представляет файл с информацией об именах и физическим размещении других файлов на диске, посмотрите отчет программы Norton SpeedDisk. Она показывает, какие файлы записаны в том или ином кластере. Вы обязательно найдете записи вроде тех, что здесь — а это названия папок, не обычных файлов! Кэширование Операционная система, желая считать что-нибудь из какого-либо каталога, читает файл этого каталога, смотрит, в каком кластере записан первый фрагмент этого файла, а затем идет в FAT и смотрит, в каких кластерах записаны остальные его фрагменты (как бы «проходя» по всей цепочке ссылок в FAT на остальные кластеры файла). После этого, когда у операционной системы тем самым появляется информация обо всех кластерах, в которых записан данный файл, и об их последовательности, файл собственно читается с диска. Но сам файл каталога тоже еще нужно считать. Для этого, вообще говоря, всегда должен быть выполнен весьма сложный алгоритм: считать файл корневого каталога диска, располагающийся всегда в одном и том же известном месте — сразу после FAT, найти в нем информацию о первом кластере того каталога, в котором содержится файл, который в конце концов должен быть считан, перейти к записи FAT, соответствующей найденному номеру первого кластера этого каталога, узнать из FAT, в каких кластерах содержится файл каталога, считать его, а потом повторить этот алгоритм сначала, до тех пор, пока не доберешься до каталога, непосредственно содержащего файл… Ясно, что весь этот процесс — «поход» в корневой каталог и затем по дереву каталогов, постоянное обращение то к файлам-каталогам, то к FAT, а лишь затем считывание самого файла — занимает немало времени. Поэтому операционные системы используют специальные методики для упрощения и ускорения работы с файлами. Самая простая и распространенная — это кэширование, то есть помещение часто используемых данных в оперативную память. Так, всегда кэшируется FAT, а также информация о структуре каталогов и располагающихся в них файлах. В операционных системах Windows95/98 задать количество кэшируемого материала можно в окне "Файловая система" вкладки «Быстродействие» пункта «Система» Панели управления (рис. 8.5). Рис. 8.5. В операционных системах Windows95/98 здесь можно указать, сколько путей к папкам и файлам операционная система запомнит и будет потом использовать. Если установить в этом окне параметр "Настольный компьютер", то операционной системой будет запоминаться информация о местоположении первых кластеров 32 каталогов и 677 файлов, к которым в последнее время происходило обращение, а если "Сервер сети" — то о первых кластерах 64 каталогов и 2729 файлов. Эта информация располагается в оперативной памяти и тем самым сокращает в какой-то степени ее обьем, доступный другим приложениям, но в любом случае выигрыш во времени и сбережении головок жесткого диска от износа при кэшировании очевиден. То есть — казалось бы: если для каждой операции с файлами, даже самого элементарного считывания файла из корневого каталога, нужно посмотреть минимум в три места на жестком диске, — в файл этого корневого каталога, затем в FAT, и лишь потом в кластеры, содержащие данные файла (а если файл фрагментирован, то еще и пройти по ним по отдельности), — то почему же эти операции происходят все же достаточно быстро? А потому, что на самом деле система смотрит в FAT и в каталоги не всегда — она сначала копирует их в оперативную память, а затем, при необходимости считывания файла, берет нужные данные именно из оперативной памяти, а не с диска. Этот процесс именуется кэшированием. Разделы В начале жесткого диска, в его самом первом секторе самой первой дорожки располагается небольшая программа — так называемая "главная загрузочная запись" Master Boot Record. В том же секторе помещается Корневая Таблица Разделов ("Root Partition Table"), в которой располагаются сведения о разбиении всего физического пространства жесткого диска на разделы — участки диска с определенной файловой системой на них. Раздел — это кольцевидная зона поверхности жесткого диска, находящаяся между двумя определенными цилиндрами. В Корневой Таблице Разделов указывается для каждого раздела, с какого сектора какой дорожки какого цилиндра он начинается и на каких заканчивается, сколько в нем всего секторов, какой тип файловой системы на нем установлен и является ли данный логический диск в данный момент загрузочным — то есть должна ли операционная система загружаться именно с него. Согласно стандартам IBM PC, всего в Корневой Таблице Разделов может быть описано не более четырех различных разделов, так как ее размер не должен превышать 512 байт вместе с Master Boot Record. Внутренняя структура раздела определяется той файловой системой, которая на нем создана. Однако в начале каждого раздела обязательно располагается Загрузочная запись раздела ("Boot Record") — небольшая программа, выполняющая начальную загрузку операционной системы. Один из разделов, описанных в Корневой Таблице Разделов, помечается как «загрузочный», или «активный», и при загрузке компьютера Master Boot Record считывает Корневую Таблицу разделов, а затем считывает и запускает Boot Record того раздела, который помечен в этой таблице как загрузочный. (Сама Master Boot Record запускается BIOS'ом, запрограммированным считывать с диска и запускать на исполнение содержимое его первого сектора.) С понятием «раздела» тесно связано понятие "логического диска", использующееся в операционных системах MS DOS и Windows. "Логический диск" — это некоторая часть жесткого диска, представляемая операционной системе как отдельное физическое устройство — как отдельный жесткий диск. При наличии нескольких логических дисков проще организовывать хранение данных, в частности, можно разнести системные файлы и данные пользователя. Изначально, согласно стандартам, принятым при разработке MS-DOS и впоследствии унаследованными всеми операционными системами типа Windows, в каждом разделе мог быть выделен лишь один логический диск. Однако для увеличения числа логических дисков, могущих быть выделенными на винчестере, в те же стандарты была добавлена возможность создания так называемого Расширенного раздела DOS. Структура этого Расширенного раздела DOS такова. В его первом секторе расположена Таблица Разделов Расширенного раздела DOS с точно такой же структурой, как и Корневая Таблица Разделов. Только описываются в ней координаты начала и конца первого логического диска в этом Расширенном разделе (точно так же, как и каждого раздела в Master Boot Record), его тип файловой системы, а также координаты начала и конца зоны, занимаемой остальными логическими дисками, если они есть. Соответственно в первом секторе зоны остальных логических дисков находится Таблица Разделов с информацией о втором логическом диске, расположенном в Расширенном разделе Dos, и зоне, занимаемой следующими за ним дисками. В итоге получается как бы ряд вложенных друг в друга, как матрешки, разделов, в каждом из которых имеется по Таблице Разделов, описывающей координаты одного логического диска и зоны, занимаемой следующими дисками. Такая структура может показаться сложной, но только она дает возможность совместить большое количество логических устройств и ограниченный размер Таблиц Разделов. Все изложенное проиллюстрировано на рис. 8.6. Рис. 8.6. Структура жесткого диска, на котором в MS-DOS или Windows выделено несколько логических дисков. Операционные системы MS-DOS и Windows допускают создание на жестком диске лишь одного Расширенного раздела DOS. Остальные разделы при этом могут содержать не более одного логического диска (то есть границы этих дисков попросту совпадают с границами разделов) и именуются Первичными разделами DOS. В начале каждого логического диска размещается его Загрузочная запись ("Boot Record"), содержащая в себе информацию о размерах кластера на данном диске, а также о местах начала и конца обеих копий FAT, если на этом диске используется именно такая файловая система. Если логический диск является загрузочным (а это возможно в том случае, если он расположен в Первичном разделе DOS, помеченном в Корневой Таблице Разделов как активный, — в этом случае Master Boot Record загрузит Boot Record именно этого диска в память и запустит ее), то в его Boot Record содержится также и программа, обеспечивающая считывание файлов операционной системы, отвечающих за ее начальный запуск. Эта программа может считывать лишь определенные секторы диска (обычно, хоть и не обязательно, находящиеся сразу за корневым каталогом), поэтому и файлы начального запуска операционной системы обязательно должны располагаться в местах, известных BootRecord.[21 - Именно поэтому перенос операционной системы Dos выполняется командой sys, а не простым копированием — чтобы при этом в Boot Record была помещена информация о размещении файлов с программами начальной загрузки системы.] На логических дисках, не являющихся загрузочными (например, расположенным в Расширенном разделе Dos), Boot Record служит просто для хранения информации о файловой системе. Для разбиения нового жесткого диска на разделы часто используется программа Microsoft FDisk, входящая в состав MS-DOS и Windows 9x. При работе FDisk создаются Таблицы Разделов и все Загрузочные записи. Если вы подготавливаете с помощью FDisk к работе новый чистый жесткий диск, единственный в компьютере, то FDisk следует скопировать на загрузочную дискету (вы можете найти эту программу в Windows 95/98 в подкаталоге Command папки, где установлена Windows) при ее изготовлении, а затем загрузиться с этой дискеты и запустить программу. После запуска FDisk вы увидите вопрос о включении поддержки больших дисков. Согласившись на ее использование, вы сможете создавать разделы с файловой системой FAT32. Сделать это стоит. Затем вы перейдете в основное меню программы (рис. 8.7), после чего можете выполнять разбиение диска. Интерфейс у программы достаточно понятный, так что работать с ней легко, если, конечно, знать о значении всех терминов. Рис. 8.7. Microsoft FDisk После окончания работы fdisk не забудьте отформатировать полученные логические диски командой format (из них диск С: — как системный: format C: /s). Все — жесткий диск готов для установки на него операционной системы. Например, сначала на пустом диске выделите Primary Dos Partition — основной раздел DOS размером в 2–4 гигабайта. Все остальное место отведите под Extended DOS Partition — дополнительный раздел DOS, если вы, конечно, не собираетесь работать с Unix или Linux. В Extended DOS Partition выделите 3–5 логических дисков обьемом до 2 гигабайт, а остальное отведите под один большой диск. Помните, что при удалении логического диска или раздела вся информация на нем удаляется, и восстановить ее можно лишь с помощью специальных программ или приемов. У программы FDisk есть также некоторые неявные параметры, которые могут иногда помочь восстановить работоспособность компьютера. Скажем, некоторые вирусы в результате своей деятельности уничтожают содержимое Master Boot Record, и компьютер перестает загружаться, так как не может найти и использовать Корневую Таблицу Разделов (ведь именно это делает программа, записанная в Master Boot Record). Исправить эту ситуацию можно, загрузив компьютер с дискеты, содержащей FDisk, и введя команду fdisk/mbr. Если у вас два или больше жестких дисков, то ключ должен выглядеть как /cmbr <номер диска> для восстановления загрузочной записи на соответствующем устройстве. Возможности FDisk по работе с диском несколько ограничены — в частности, она умеет выделять только один Первичный раздел DOS на одном жестком диске. Поэтому на дисках, подготовленных с помощью FDisk, присутствуют лишь Первичный раздел DOS, содержащий загрузочный логический диск (по традиции обозначаемый буквой С) и Расширенный раздел DOS, содержащий цепочку логических дисков. Программа Disk Administrator, входящая в состав Windows 2000/XP, является более мощной и позволяет использовать Корневую Таблицу Разделов по максимуму, создавая на диске до 4 Первичных разделов DOS. С помощью специальных программ, так называемых "менеджеров загрузки" можно модифицировать вышеописанную структуру жесткого диска, создав на нем больше 4 отдельных разделов с различными файловыми системами или предоставив пользователю при загрузке компьютера выбор, с какого раздела осуществлять загрузку операционной системы. Подробнее о таких программах читайте в Главе 26. В той же главе вы найдете подборку ответов на некоторые часто задаваемые вопросы о структуре жестких дисков и установке операционных систем. Если на жестком диске уже есть информация, но его разбиение на логические диски вас не устраивает, то его можно изменить с помощью той же Partition Magic. Эта программа самостоятельно перестроит структуру диска, не стирая данные. Существует много специальной литературы об эффективной работе с ней, в том числе и книг, так что если интересуетесь, почитайте их или ознакомьтесь с ее Руководством пользователя. Partition Magic также может использоваться вместо FDisk или Disk Administrator, так как ее интерфейс удобнее, а сама она работает быстрее, чем упомянутые программы. Размеры и обьемы Размер одного кластера определяется размером логического диска и установленным типом файловой системы. Операционные системы MS-DOS, Windows 3.11 и первые версии Windows 95 могли работать лишь с файловой системой FAT16. Размер одной записи в FAT16 (содержащей номер следующего кластера файла), как уже было сказано, составляет 16 бит. Поскольку 2 в 16-й степени составляет 65536, то и количество номеров кластеров, а, следовательно, и самих кластеров при использовании 16-разрядной таблицы размещения файлов на одном логическом диске не может быть больше 65536. Так как максимальный размер кластера в FAT16 согласно стандартам может составлять 32 кб (это, впрочем, не фиксированное ограничение), то и максимальный размер логического диска с FAT16 будет 32*65536=2 гигабайта. Поскольку в FAT16 может адресоваться не более 65536 кластеров, то в ней не может быть больше 65536 записей. При длине одной записи в 16 бит обьем самой FAT16 составит тогда 128 кб. В файловой системе FAT32 для указания номеров следующих кластеров в файле используется записи длиной в 32 бита. Следовательно, всего в ней может адресоваться 2 = 4294967296 кластеров. При размере кластера в 32 кб максимальный обьем логического диска с FAT32 составит 2 *32 кб=131 гб (а размер самой FAT тогда составит 16 гигабайт!), что превышает размеры большинства существующих сейчас моделей винчестеров. Поэтому возможность выделения на логическом диске такого большого количества кластеров используется для того, чтобы уменьшить размер кластера — обычно он для FAT32 составляет 4 кб. Но даже при таком малом размере кластера максимальный обьем логического диска составит 16 гб, поэтому обычно все возможности системы FAT32 не используются и количество кластеров на диске меньше 2 . Так как, во-первых, для размещения информации о кластере в FAT32 используется в два раза больше места, чем в FAT16, а, кроме того, количество кластеров при использовании FAT32 бывает куда как больше, чем 65536, например, при размере кластера в 4 кб и размере диска в 8 гб кластеров будет 2147483648, то размер самой 32-разрядной таблицы FAT значительно больше размера 16-разрядной — в данном случае 8 мегабайт против 128 кб. Это, в частности, приводит к тому, что на компьютерах с малым количеством оперативной памяти вся 32-разрядная FAT не умещается в оперативной памяти при ее недостаточном количестве и при работе с файлами операционной системе приходится часто считывать ее нужный фрагмент с диска, что вызывает снижение быстродействия. Кроме того, при большом количестве кластеров таблица FAT занимает весьма много места на диске и тем самым сокращает его полезный обьем, тем более что на диске всегда имеется две ее копии — одна из них резервная. (Именно поэтому обьем установленного в компьютер и отформатированного жесткого диска всегда меньше того обьема, который указывает для него производитель, — потому что некоторую часть диска занимают две копии FAT и некоторая служебная информация.) С файловой системой FAT32 могут напрямую работать операционные системы Windows (за исключением Windows 3.11 и первых версий Windows95), а также Linux с помощью особых программ. Информация о типе файловой системы, размере кластера, размере самой таблицы FAT, а также о количестве копий FAT на жестком диске содержится в Boot Record, находящейся сразу перед первой копией FAT. Проблемы кластерной организации Потери Кластерная организация данных на жестком диске, обеспечивая возможность многократного удаления и создания файлов, приводит к двум большим проблемам. Первая — это потери дискового пространства. Так как в подавляющем большинстве случаев размер файлов не кратен размерам кластеров, то последний кластер, помеченный в FAT как принадлежащий какому-либо файлу, оказывается заполненным не полностью. Это место уже не может стать частью другого файла, и поэтому не может быть использовано. Если файлов много, то общее количество такого «потерянного» места становится немалым. Особенно такая потеря проявляется при размещении на жестком диске большого количества мелких файлов, размер которых меньше размера кластера. Так, при размере кластера в 32 килобайта 10 файлов по 3 килобайта займут на жестком диске не 30 килобайт, как могло бы показаться, а 320. В самом крайнем случае для сохранения файла размером один байт операционная система выделит на диске один кластер размером 32 килобайта. Стоит запомнить, что так как один кластер занимает фиксированный обьем диска (чаще всего это 16 или 32 килобайта) и может содержать не более одного файла, то неизбежны потери пространства диска. Если размер файла меньшеразмера кластера или просто не кратен ему, то в кластере, содержащем этот файл (или окончание файла) останется незанятое пространство. Информацию о размере кластера и количестве их на диске можно получить, используя программу Scandisk для Windows 95/98 (рис. 8.8). Рис. 8.8.Информация программы ScanDisk. Фрагментация Вторая проблема, вытекающая из принципа кластерной организации — это так называемая фрагментация файлов. Когда файл записывается на диск, то согласно приципам кластерной организации операционная система должна искать первый свободный кластер и записать файл в него и последующие свободные кластеры. Если же кластер, следующий за записываемым, оказывается занят, а файл записан еще не полностью, то операционная система должна повторить поиск первого свободного кластера на последующей части диска и записать файл дальше в найденный свободный кластер и последующие такие же за ним. В итоге после интенсивной работы с диском, сопровождающейся удалением и созданием файлов, очень многие файлы оказываются распределенными по диску — их начало записано, например, в кластерах в начале диска, середина — в кластерах середины, а конец — в последних дисковых кластерах. Файл становится фрагментированным — состоящим из множества фрагментов. Безусловно, информация о всех занимаемых им кластерах целиком и полностью размещается в FAT, но при чтении или перезаписи такого файла головки винчестера вынуждены многократно перемещаться по диску, считывая все фрагменты этого файла, что приводит к увеличению времени доступа к файлу, а также к повышенному износу механизма перемещения головок жесткого диска. Пути решения Путь решения проблемы потерь дискового пространства напрашивается сразу — уменьшить размер кластера. В самом деле, если кластер имеет размер 4 кб, а не 32, то пустого места в нем может остаться в 8 раз меньше, чем при использовании кластеров в 32 кб. Используя FAT16, для этого надо уменьшить размер логического диска (в самом деле, на диске в 1 гигабайт минимальный размер кластера будет 1024*1024/65536=16 килобайт, а на диске в 512 мегабайт — 1024*512/65536=8 килобайт). В FAT32 размер кластера в 4 кб является вполне нормальным и может использоваться на логических дисках размером до 16 гигабайт. Но даже в пределах имеющейся файловой системы FAT16 можно уменьшить потери дискового пространства. Например, делать файлы большого обьема или, если это невозможно, хранить их в архивах, либо извлекая по мере необходимости, либо используя специальные программы, делающие архивы «прозрачными» для операционной системы, вроде ZipFolders или ZipMagic. Тогда кластеров, не до конца заполненных данными, будет мало. Также можно использовать сжатие дисков (при этом все содержимое диска фактически хранится в одном файле), но это очень опасно в плане надежности хранения. Предотвратить фрагментацию файлов труднее. В какой-то степени механизмы ее предотвращения заложены в самой операционной системе — Windows при записи нового файла ищет не просто первый свободный кластер, а первую группу из последовательных свободных кластеров размером не менее 500 кб, и только тогда, когда такая группа не находится, берется первый свободный. Вследствие такой стратегии иной раз возникают картины, подобные той, что вы можете видеть на рис. 8.9. Но в целом эту проблему решить до сих пор так и не удалось. Поэтому широко используются программы дефрагментации диска, например, встроенная в Windows программа Defrag. Рис. 8.9.Не правда ли, странно? Как будто капли дождя на стекле. Цель дефрагментации — добиться такого расположения файлов на жестком диске, чтобы каждый файл занимал цепочку последовательных кластеров, а не набор разбросанных по всему диску. Тогда для считывания такого файла жесткому диску будет достаточно подвести блок головок к началу этой цепочки и произвести считывание, а не делать множество перемещений блока. При своей работе программа дефрагментации, двигаясь от начала диска к его концу, перемещает разрозненные фрагменты файлов, встречающиеся ей на пути, на свободное пространство логического диска, а на их место записывает уже целые файлы, состоящие из одной цепочки кластеров, в том числе и те файлы, фрагменты которых были ранее ею перемещены. В идеале в конце концов после дефрагментации все файлы на диске должны располагаться в идущих друг за другом кластерах. Однако некоторые системные и служебные файлы операционной системы, в частности, файл виртуальной памяти, располагаются в кластерах, которые не могут быть перемещены. В результате в массив дефрагментированных данных оказываются вкраплены фрагменты таких файлов.[22 - Файл, организованный так, что он может использоваться операционной системой в качестве оперативной памяти при ее нехватке.] Поэтому перед дефрагментацией рекомендуется отключить использование виртуальной памяти, а после нее — установить постоянный размер файла подкачки (Панель управления — Система — Быстродействие — Виртуальная память), чтобы он впоследствии не подвергался фрагментации. Это — множество мелких файлов, размером меньше кластера, записанных на диск. А получилось так потому, что при записи каждого файла Windows ищет первый блок из 500 кб свободных кластеров и записывает файл в его конец. Именно в конец — чтобы дать возможность расти без фрагментации тому файлу, который находится перед этим блоком. Проблема выбора Имеется обратная зависимость между возможностью фрагментации файлов и потерями дискового пространства из-за несоответствия размеров кластеров размерам файлов. Так, чем меньше размер кластера, тем меньше потери дискового пространства… и тем больше фрагментация файлов, так как даже весьма маленький файл в таком случае будет записан в нескольких кластерах и тем самым, возможно, фрагментирован. К тому же любой файл будет «разбит» на большее количество кусочков-кластеров и тем самым сможет быть фрагментирован в большей степени. И наоборот — большой размер кластера приводит к большим потерям места на диске и меньшей фрагментации файлов. Поэтому здесь имеется дилемма — или стремиться к минимуму потерь места на диске, но часто дефрагментировать диск и все равно терпеть снижение скорости работы из-за фрагментации файлов, или смириться с неизбежными потерями места в больших кластерах, но реже получать необходимость прибегать к дефрагментации. Если произошла катастрофа и оказалась разрушенной FAT, то данные с диска в какой-то степени все же можно восстановить, хоть это и весьма трудно. Можно найти на диске фрагменты, ранее бывшие каталогами и узнать номера первых кластеров хранящихся в них файлов. Однако, если файл фрагментирован, то остальные его фрагменты найти вряд ли удастся. Если же весь файл находился в одном кластере, что бывает при большом размере кластера или при малом размере файла, то в этом случае файл будет восстановлен полностью. Также имеется вопрос — а какая файловая система лучше, FAT16 или FAT32? Тут необходимо оценить, что важнее. FAT32 позволяет установить меньший размер кластера и разбивать винчестер на логические диски больших размеров — больше 2 гигабайт. Но при этом сама 32-разрядная таблица FAT занимает больше места на диске, труднее кэшируется, а файлы, записанные на диске с малым размером кластера, сильнее фрагментируются, что может привести к меньшему быстродействию FAT32 по сравнению с FAT16. Кроме того, с FAT32 не могут работать ни MS DOS, ни Windows NT. Что здесь выбрать — решать вам. Стоит запомнить: При установке размера кластера приходится делать выбор между быстротой с надежностью и экономичностью. Большой размер кластера — не так плохо, как кажется. Чем больше размер кластера, тем больше потери дискового пространства из-за того, что в кластерах остается незанятое место — но и тем меньше фрагментация файлов, ведь количество фрагментов-кластеров, на которые может быть разбит файл, меньше, чем при меньшем размере кластера! Так что тут стоит выбирать — либо согласиться с потерями свободного места (и бороться с ними путем использования ZipFolders и других программ — архиваторов "на лету"), либо терпеть неизбежную фрагментацию файлов (и регулярно запускать программу дефрагментации). Чем больше кластер, тем меньше фрагментация диска и поэтому — быстрее работа с файлами. Чем больше кластер, тем проще будет восстановить информацию на жестком диске после катастрофы на нем. Но чем больше кластер, тем больше потери дискового пространства на мелких файлах. Бороться с потерями дискового пространства на мелких файлах при больших кластерах можно архивированием и использованием программ, делающих архивы "прозрачными". Бороться с фрагментацией файлов при малом размере кластера можно только регулярной дефрагментацией диска. Путаница Запись данных на диск — достаточно сложный и ответственный процесс. В самом деле, при создании нового файла изменения должны быть проведены как минимум в трех местах: на самом диске — запись содержимого файла в кластеры, в FAT — пометка занимаемых файлом кластеров и указание их последовательности, и в файле каталога, содержащего этот файл — указание там его имени, времени создания, размера. При изменении файла должны быть перезаписаны данные на диске и информация в файле каталога — изменены его время создания и размер. При нормальном режиме работы все эти мероприятия выполняются вполне корректно. Однако при аварийном завершении работы операционной системы (которое произойдет, скажем, при нажатии кнопки Reset во время записи файлов на диск) может возникнуть несоответствие между содержимым диска, FAT и каталога. Например, файл помещен на диск, в FAT расписана его кластерная структура, а в файле каталога остался его старый размер. Это, впрочем, не так опасно — просто, возможно, некоторые программы не смогут с ним работать. Но может также возникнуть путаница и в FAT, а вот это уже значительно хуже. К примеру, операционная система поставила в записи FAT, относящейся к одному из кластеров, ссылку на другой кластер, содержащий продолжение файла, а вот пометить этот кластер с продолжением как занятый (поместив в соответствующую запись FAT либо ссылку на следующий кластер файла, либо символ конца файла) не успела — произошла перезагрузка или отключение компьютера. В итоге кластер оказался помеченным в FAT как свободный, и при записи на диск следующего файла (после новой загрузки операционной системы) он был для него использован. В итоге этот кластер стал принадлежать сразу двум файлам — сделался общим. Ясно, что в итоге в кластер будут записываться попеременно данные для обоих файлов, что испортит и те, и другие. Или другая ситуация: при записи нового файла операционная система для него отвела в FAT цепочку кластеров, а в каталог записать информацию о номере его первого кластера не успела. В итоге отведенные кластеры стали потерянными — и не пустые, и не принадлежащие какому-либо файлу. Данные в них, если все же оказались записанными, стали недоступными. Все описанные ситуации могут серьезно затруднить работу с файлами. Общие кластеры приводят к потерям данных, а потерянные — к трате свободного места и утере их содержимого. Чтобы исправить подобные ошибки файловой системы, используются программы для проверки дисков — например, ScanDisk из поставки Windows или Norton Disk Doctor из комплекта Norton Utilities. Эти программы анализируют FAT и структуру каталогов, и в случае обнаружения потерянных кластеров сохраняют их в отдельные файлы, а общие кластеры копируют для каждого из их файлов. Много интересных материалов об устройствах различных файловых систем и их характеристиках можно найти на сервере www.ixbt.ru, в разделе http://www.ixbt.ru/storage[23 - В частности, обратите внимание на статьи "Win95.CIH: Всем смертям назло" неизвестного автора, "Быстродействие FAT и NTFS" Дмитрия Михайлова, "Файловая система NTFS" его же (весьма полезная и интересная информация).] ]. Об удалении файлов и восстановлении данных Когда выполняется команда удаления файлов с жесткого диска (в Windows это происходит при очистке «Корзины», так как при простом удалении файлов с помощью команды «Удалить» или кнопки Delete файлы перемещаются в «Корзину», а не удаляются), то сама информация, находящаяся в ячейках жесткого диска, не уничтожается. Выполняется лишь пометка в FAT кластеров, ранее занимаемых этим файлом, как свободных, а в файле каталога, в котором этот файл находился, первый символ имени заменяется на знак"!". Так как длинные имена файлов хранятся в файле каталога отдельно от настоящих имен, то они в этом случае сохраняются. Если в каталог и в кластеры, ранее занимаемые удаленным файлом, больше не производилось записи, то имеется возможность файл восстановить. Для этого нужно просто просмотреть файл каталога и найти в нем имя файла, узнать из записи, относящейся к этому файлу, номер первого кластера файла, а затем записать информацию из этого кластера в новый файл на свободное место винчестера. Если файл занимал больше одного кластера, то наверняка восстановить можно лишь содержимое первого кластера. Информация о том, в каких кластерах располагалось остальное содержимое файла, утрачивается полностью, так как из FAT информация об удаленном файле стирается. Поэтому программы восстановления удаленных файлов (к примеру, Norton UnErase Wizard) просто обьединяют в одном файле определенное число последовательных свободных кластеров (соответствующее записанному в файле каталога размеру удаленного файла) и именуют результат названием удаленного файла. Пример того, что получается — на рис. 8.10. Рис. 8.10. Результат работы Norton UnEraze. Этот текстовый файл snakecor.txt размером в 40 килобайт был удален, а потом восстановлен с помощью Notron UnErase Wizard, который нашел в файле каталога, где snakecor.txt находился, его имя с знаком"!" впереди, узнал оттуда размер файла и номер первого кластера, занимаемого файлом, а потом обьединил содержимое этого и следующего свободного кластера. Но, увы, программе и пользователю не повезло — изначально файл snakecor.txt был фрагментирован и в восстановленный файл попал фрагмент другого ранее удаленного файла, а не тот, который был нужен. Что такое Unformat При форматировании жесткого диска очищается таблица FAT (в ней все кластеры помечаются как свободные) и корневой каталог — из него удаляется вся информация о содержащихся в нем файлах и других каталогах. Сами данные на винчестере не стираются. Поэтому их можно восстановить программами типа Unformat. В этом отличие винчестера от дискеты — при проведении полного форматирования дискеты на ней заново записываются и магнитные метки начала секторов, и служебная информация, поэтому после полного форматирования данные на дискете восстановить практически нельзя.[24 - На самом деле с помощью специального оборудования можно считать даже ту информацию, которая была физически удалена с диска, — на месте которой были записаны другие данные. Однако это — уже технологии спецслужб; тем не менее существуют специальные программы (например, Norton WipeInfo), которые производят бесповоротное удаление информации с диска путем многократной записи случайных данных в ранее занимаемые ею магнитные ячейки.] "Быстрое форматирование" дискеты по своему принципу аналогично полному форматированию винчестера. Программа для восстановления данных после форматирования просканирует логический диск и найдет на нем файлы, бывшие некогда каталогами, ориентируясь при этом на типичные последовательности байтов ("метки"), характерные именно для файлов-каталогов. Затем она узнает из этих файлов номера первых кластеров содержащихся в них обычных файлов. К сожалению, информация об остальных кластерах, занимаемых файлами, потеряна навсегда, поэтому Unformat (как и UnErase Wizard), добавит каждому файлу следующие за первым кластером свободные кластеры в количестве, равном занимаемому ранее файлом числу кластеров, и занесет в FAT информацию об этом. После этого Unformat создаст в корневом каталоге свежеотформатированного диска новые каталоги и укажет в этих каталогах имена и первые кластеры узнанных на предыдущем этапе обычных файлов. В результате в корневом каталоге отформатированного диска появятся папки, содержащие файлы, ранее присутствовавшие на диске. Те файлы, которые занимали меньше одного кластера или при восстановлении которых были обьединены именно те кластеры, которые они раньше и занимали (такое бывает, когда диск был дефрагментирован незадолго до форматирования), будут восстановлены полностью. Остальные — как повезет. Такая обычная ScanDisk… Наблюдая за работой всем известной, стандартной программы ScanDisk из Windows 95/98, можно увидеть немало интересного… Конечно, если смотреть внимательно и вдумыватся в то, что видишь. 1. Программа ScanDisk просматривает FAT. Так как вся FAT находится в одном месте диска, то считывается и проверяется она очень быстро. На этом этапе своей работы ScanDisk ищет ошибки файловой системы — общие кластеры, и в случае обнаружении таковых исправляет структуру FAT, копируя эти кластеры для каждого из содержащих их файлов и соответственно изменяя содержимое FAT. 2. А теперь ScanDisk проходит по структуре каталогов — то есть считывает все файлы-каталоги, проходя по их иерархии. Это связано с необходимостью многократного перемещения головок жесткого диска, поскольку эти файлы расположены в разных местах диска. Поэтому времени на "Проверку папок" уходит немало. На этом этапе также собираются данные для последующего анализа диска на предмет наличия потерянных кластеров — помеченных как занятые, но не принадлежащих ни одному из файлов. Сам этот анализ происходит сразу после "Проверки папок". Потерянные кластеры могут быть преобразованы в файлы или удалены. 3. Системная область — это область, занимаемая FAT. Ониа находится в начале логического диска. В те секторы, которые FAT занимает, данные пользователя записывать нельзя, а повреждение здесь приведет к потере и расположенных на диске файлов, так как операционная система не сможет их найти. 4. Проверяется область данных пользователя на предмет поврежденных секторов. В случае обнаружения таковых в FAT будут занесены соответствующие указания. DiskEditor Это редактор содержимого диска, разработанный нашими соотечественниками — компанией ФизТехСофт. Он позволяет просматривать содержимое диска не средствами операционной системы, а "на физическом уровне" — побайтово, то есть смотреть, что записано в каждой электронной ячейке диска, в каждом его секторе. Вот, как, к примеру, выглядит корневой каталог логического диска — смотрите рис. 8.11, или FAT — рис. 8.12. Разобраться в хитросплетении кодов, конечно, сложно… Одно радует — операционная система делает это автоматически, а мы этого даже не замечаем. Рис. 8.11.Это — корневой каталог диска, отображенный в DiskEditor'е. Именно так он выглядит на уровне дорожек, секторов и битов. Основное предназначение DiskEditor'а — помощь в восстановлении информации на жестком диске в случае поражения его вирусом или повреждения служебной информации. Поэтому, как вы, наверное, заметили из рисунков, в DiskEditor'е возможны два представления информации — шестнадцатиричный (слева) и текстовый (справа). Рис. 8.12. Святая святых диска — таблица FAT. Вот что это такое в реальности… В случае печальной необходимости восстановления винчестера можно запустить DiskEditor с дискеты. Имеется возможность создать загрузочную дискету специально для DiskEditor'а, для чего в комплекте редактора есть специальная программа, инсталлирующая на дискету сокращенную версию операционной системы PTS-DOS, позволяющую загрузиться с этой дискеты и работать с DiskEditor'ом. Шестнадцатиричное представление информации удобно использовать для восстановления программного кода загрузочных секторов диска, ну, а текстовое представление поможет вам все-таки вытащить нужную информацию с диска (рис. 8.13). Правда, только представленную в формате простого текста или HTML и только за один прием из одного кластера (второй по всему диску искать придется), но все же хоть что-то…[25 - Пример восстановления загрузочных секторов диска приведен в статье http://www.ixbt.ru/storage/cih_diehard.html.] Рис. 8.13.Слева — вот файл с так нужными мне данными, который был на погибшем диске. Справа — DiskEditor нашел его на поверхности диска. О старых BIOS и о больших дисках Представим себе следующую ситуацию. Наконец наступил долгожданный день, и компьютер, который у вас уже три года, дождался обновления. Пошли вы на рынок, купили новый большой винчестер. Ставите его в компьютер… и — что это, BIOS его не определяет! Ладно, вручную ставим параметры… но второй диск, новый, большой, свежекупленный, не виден из MS-DOS! Причем FDisk его распознает. Неужели вам продали некачественную вещь? Несете его к другу, подключаете… Все видно, все форматируется. Ставите себе снова. Из MS-DOS не виден, из Windows виден. Весь. Итак, диск исправен. Но в чем же причина таких чудес? В устаревшем BIOS. Старые версии BIOS (выпущенные до 1999 г.) не позволяют работать с винчестерами емкостью больше 8 гигабайт, — о причинах этого рассказано выше. Системы же семейства Windows используют свои программы-драйвера для работы с винчестерами, поэтому ограничение в 8 гигабайт на них не распространяется. Однако сначала они должны загрузиться, а при загрузке волей-неволей приходится использовать средства BIOS для работы с винчестером. А это-то невозможно… Иногда диски большой емкости на машинах со старым BIOS'ом все же видны, но работать из через BIOS можно только с их первыми 8-ю гигабайтами (именно с такими ситуациями были связаны случаи отказа загрузки WindowsNT, размещенной на логическом диске емкостью больше 8 гигабайт, после очередного обновления системных файлов — они оказывались за пределами восьмигигабайтной зоны и загрузчик NT, работающий с диском через BIOS, не мог тогда их прочитать). Пути решения описанной проблемы, помимо приобретения новой материнской платы с более совершенным BIOS'ом (а это все платы для Pentium II, III, IV, Celeron, Duron, Athlon, а также платы для Pentium I на чипсетах Ali Aladdin, Via MVP3 и Via MVP4), могут быть такие. 1. Использовать специальные программы работы с большими дисками на компьютерах о старым BIOS'ом. Например, "Ontrack Disk Manager" — она записывает в загрузочную область диска особую программу, подменяющую функции BIOS. В большинстве случаев вы можете найти подобную программу на сайте производителя винчестера (иногда она называется «EZDrive» или как-то еще). Существует универсальный вариант этой программы, по идее подходящий для всех моделей жестких дисков — поищите его на сайте фирмы Ontrack: http://www.ontrack.com. 2. Установить в компьютер (на первый канал IDE как Master) жесткий диск размером до 8 гигабайт и установить на него операционную систему Windows (или Linux). После этого большие диски, устанавливаемые в компьютер дополнительно, будут доступны именно из среды этой операционной системы, так как современные операционные системы используют для работы с жесткими дисками свои программы-драйвера. Из MS-DOS установленные большие диски видны не будут. 3. Перепрошить BIOS материнской платы. О том, как это сделать и какие "подводные камни" могут встретиться на этом пути, рассказано в 25-й главе этой книги. Стоит лишь добавить, что на сайте производителя платы в этом случае следует искать прошивку, в перечне нововведений в которой указано что-то вроде " Support INT13 Extensions". К сожалению, ваши старания могут и не увенчаться успехом — если ваша материнская плата очень старая и сам контроллер жестких дисков не поддерживает большие их обьемы. Если даже использование дополнительного небольшого жесткого диска с Windows не позволит получить доступ к установленному вместе с ним большому (т. е. обьемом больше 8 гигабайт), то единственный выход — замена материнской платы. Иногда встречаются и другие ограничения на обьем диска, связанные с особенностями BIOS конкретной модели материнской платы, — например, некоторые старые материнские платы производства Asus (и некоторых других производителей) могут работать лишь с первыми 32 гигабайтами обьема диска. Пути обхода подобных ограничений такие же, как указаны выше — перепрошивка BIOS, программа EZDrive, дополнительный жесткий диск. Подсчитаем… Чтобы оценить реальный размер папки согласно количеству занимаемых ее файлами кластеров, а не размер содержащихся в этих файлах собственно данных, в Windows 98/2000/XP можно использовать окно "Свойства папки" (пункт «Свойства» меню правой кнопки мыши выделенной папки). То число, которое стоит перед словом «занято», и показывает этот реальный размер. Однако для оценки величины занимаемого места большим количеством папок использовать это окно не так и просто. Поэтому существуют специальные программы, основное предназначение которых — помочь пользователю оценить реальный размер папок и файлов. Такие программы могут быть весьма полезны, когда необходимо оценить, какие файлы и какие папки действительно занимают больше места на винчестере и станут первыми в очереди на архивацию или удаление. Также они пригодятся в Windows95, где окно "Свойства папки" не предоставляет информации о занимаемом ею месте. Кроме того, эти программы часто имеют еще и дополнительные функции наблюдения за диском, поиска файлов и т. д. Расскажем о некоторых их них. Сканер диска Программа «Scanner» (рис. 8.15), написанная немцем Стефаном Герлачем, отображает в виде круговой диаграммы содержимое Вашего жесткого диска, при этом оценивая реально занимаемое файлами место. Так, папка с 300 файлами по 10 килобайт будет отображаться как имеющая размер 9600 килобайт (если у Вас кластер занимает 32 килобайта), то есть занимающая почти 10 мегабайт. Можно оценить, какие файлы у Вас занимают больше места, — чтобы для увеличения свободного пространства на диске архивировать или удалять именно их. Рис. 8.15.Программа Scanner. Программа сделана очень красиво и удобно. Подведя курсор к любому сектору на диаграмме, можно узнать, какую папку он изображает. Щелкнув два раза на секторе, изображающем папку, вы перейдете к такой же диаграмме, построенной специально для этой папки и отображающей только ее содержимое. Для того, чтобы не загромождать рисунок, отображаются только файлы и папки, размер которых превышает определенную величину. Загрузить программу можно с сервера www.freeware.ru или с сайта автора http://www.steffengerlach.de/ freeware. Программа бесплатная. Folder Size Shell Extensions (DFolder) Программа Dfolder интегрируется в стандартное окно "Свойства папки" как дополнительная закладка и при своем вызове выводит отчет о занимаемом этой папкой и вложенными в нее папками реальном месте на диске — с учетом всех занятых содержимым папки кластеров (рис. 8.16). Рис. 8.16. Вся папка — как на ладони. Не правда ли, удобно? Программа допускает различное представление информации о занимаемом папками месте на диске — от байт до гигабайт. Отчет программы можно вывести в отдельный файл, и тогда для каждой папки еще будет указан процент "потерянного места" — какую долю от обьема реальных данных в папке занимает совокупный обьем незаполненных фрагментов кластеров, в которых эти данные находятся. В итоге можно разобраться, какие папки и файлы занимают места на диске гораздо больше, чем их собственный размер. К примеру, папка Cursors занимает места в 20 раз больше, чем содержит реальных данных. На основании полученной информации можно принять решение о том, какие папки стоит удалять или архивировать для освобождения места на винчестере, а какие — лучше оставить. Создана эта бесплатная программа французом Лоренцом Бергером, а загрузить ее можно с адреса http://perecod.chat.ru/ dfolder.rar. Следы на песке Если вы будете просматривать структуру жесткого диска с помощью программы DiskEditor, то вас наверняка заинтересует, каким образом можно найти на диске тот или иной описанный выше его компонент. Скажем, Master Boot Record или FAT. А сделать это можно, используя сигнатуры — последовательности байт, характерные для того или иного компонента файловой системы. К примеру, в самом конце Master Boot Record находится сигнатура 55AAh (так в шестнадцатиричном представлении: собственно эта сигнатура занимает два байта). По ней можно найти конец Главной Загрузочной Записи. Строго говоря, в первом секторе винчестера сначала располагается Partition Table, а лишь потом — Master Boot Record. Но это важно лишь при изучении структуры диска с помощью просмотра содержимого магнитных ячеек или при восстановлении данных на жестком диске. Boot Record каждого логического диска с файловой системой FAT можно найти, ориентируясь на всегда присутствующую в ней строку «MSWIN4» (в текстовом представлении). FAT всегда начинается с последовательности шестнадцатиричных цифр F8 FF FF FF. Заключение В этой главе приведены только самые основы этой огромной темы — принципов размещения информации на магнитных носителях. Была рассмотрена лишь не самая сложная и не самая удачная файловая система FAT. Существуют и другие файловые системы, превосходящие FAT по сложности и возможностям. Зачастую они основаны даже на совсем других принципах организации данных, нежели FAT, однако все же именно FAT на настоящее время остается наиболее распространенной файловой системой. В главе 26 этой книги вы найдете подборку вопросов и ответов, посвященных проблеме установки на компьютер нескольких операционных систем. В ответах на вопросы содержится немало интересной технической информации, так что в том случае, если вы заинтересовались темой организации хранения данных на жестком диске, то обязательно ознакомьтесь и с ней. Весьма интересной и полезной является тема восстановления информации на жестком диске после вирусной атаки или ошибки операционной системы. Ей посвящено немало публикаций, как в Интернете (например, на сервере www.ixbt.ru), так и в периодической печати. Информация, приведенная в этой главе, поможет вам понимать их. Да и в любом случае — весьма полезно знать, как работает то, с чем сталкиваешься каждый день… Глава 10. Порты. Прокси. Файерволл Когда большинство пользователей компьютерных технологий видят слово «порт», то обычно с ним ассоциируются такие аббревиатуры, как COM, LPT, PS/2. То есть — попросту названия «гнезд», куда можно присоединить какие — либо периферийные устройства вроде сканера, принтера или модема. Разные типы таких портов предоставляют разные возможности и предназначены для работы с различными устройствами, подключаемыми к персональному компьютеру. Но при чтении литературы, описывающей работу в сети Интернет, при работе с программами для этой сети становится ясно, что слово «порт» имеет не только это, привычное всем, значение. Но какое же конкретно? И что, например, означает поле "номер порта", встречающееся почти во всех окнах настройки прокси-серверов (рис. 10.1)? Рис. 10.1. Номер порта. Как передаются данные между компьютерами в Интернете, надеюсь, ясно из предыдущей главы. Ну, а как эти самые данные находят на компьютере нужную им программу? Ведь почти все используемые сейчас операционные системы — многозадачные, и в них можно одновременно, скажем, и электронную почту отправлять или получать, и файлы на сервер помещать, и web-странички смотреть, и по Интернет-пейджеру общаться. Вот приходит пакет данных с электронным письмом на компьютер. Как он узнает, в какую программу ему пойти — в браузер или все же в почтовый клиент? Для этого и существует система портов. Представим себе Интернет как большой город, состоящий из домов-компьютеров. Если адресом дома в такой аналогии будет служить IP-адрес, выделяемый компьютеру, то порт будет служить адресом квартиры. Каждый пакет данных имеет в себе адрес дома — IP компьютера, которому он предназначен. По этому адресу происходит маршрутизация пакета при его передаче от компьютера-сервера к компьютеру-получателю. Квартиры в доме-компьютере могут быть заняты (а могут и не быть) различными программами. И внутри этого дома маршрутизация происходит именно по номерам квартир-портов. Заведует этим всем операционная система — выделяет программам порты и распределяет приходящие пакеты по ним. Впрочем, точнее будет сказать, что все запущенные программы, предназначенные для работы с ресурсами Интернета, из всех пакетов данных, приходящих на компьютер, как бы «выбирают» те, которые адресованы именно им. Информация о порте назначения пакета, так же, как и IP-адрес получателя, указывается в служебной информации каждого пакета данных — в его заголовке. Отдельные экземпляры программы, скажем, новые окна браузера тоже имеют свои порты. Поэтому вы можете одновременно смотреть сразу несколько страничек в разных окнах браузера. Различные порты различаются одним — своим номером. Всего возможных номеров портов весьма много — тысячи. Однако некоторые номера портов традиционно присвоены вполне определенным сервисам. К примеру, программа-web-сервер (то есть программа, которая может отвечать на запросы с удаленного компьютера, выдавая для просмотра документ Html и все файлы, которые из него вызываются) отвечает на запросы с указанием порта 80. Программа — Ftp-сервер, выдающая по запросу пользователя файлы, отвечает на запросы, в которых указано, что они посланы на порт 21. Иными словами, когда, скажем, ваш браузер запрашивает сервер, скажем, www.duel.ru, то он посылает пакет данных на порт 80 компьютера с IP-адресом, соответствующим www.duel.ru, а в пакете указывает номер своего порта, выделенного ему операционной системой. Сервер www.duel.ru, получив пакет, посылает на компьютер с запросившим его браузером пакет данных, адресуя его тому порту, с которого был прислан запрос. Операционная система, увидев по заголовку пакета, какому порту адресован пакет, отдаст его в браузер, который его обработает по собственному усмотрению. Поэтому пакет данных, предназначенный, скажем, браузеру, не попадает в почтовый клиент, и наоборот. Какие же выводы следуют из всего вышеизложенного? На компьютере, основная задача которого — выдавать информацию в Сеть по запросам, может одновременно быть запущено сразу множество программ: web-сервер для выдачи web-страничек, ftp-сервер для скачивания файлов, почтовый сервер и др., причем у этого компьютера будет лишь один IP-адрес, по которому к нему будут обращаться с запросами и на загрузку файлов, и на просмотр сайта, и на работу с почтой. Каждая программа работает с запросами, приходящими к ней, по своему порту: web-сервер — по 80-му, Ftp-сервер — по 21-му и др. Браузерам, Ftp-клиентам вроде CuteFtp, почтовым клиентам номера портов выделяются операционной системой того компьютера, на котором они запущены. Номер порта, по которому работают эти серверы, указывается в их настройках. Нетрудно понять, что в том случае, если web-сервер будет настроен на работу, скажем, по 81-му порту, то ни один браузер просто так связаться с ним не сможет. В многих программах, предназначенных для работы с ресурсами Интернет, есть возможность задавать номер порта, с которого сервер Интернета будет этой программе отвечать в том случае, если он настроен на работу с другого порта (рис. 10.2). Рис. 10.2. Здесь настраиваются номера портов в почтовом клиенте The Bat!. Если на сервере запущен еще какой-либо сервис, скажем, многопользовательская ролевая игра, то программа, обеспечивающая ее функционирование, будет работать с какого-либо другого порта, отличного от тех, с которых работают другие программы. Номер этого порта необходимо сообщать тем, кто будет подключаться к игре, или разработать программу — игрового клиента, которая автоматически работала бы с этим портом. Если проводить еще одну аналогию для лучшего восприятия, то можно себе представить порт как некую «радиочастоту», а каждую программу — как приемник для этой частоты. Чтобы программа могла услышать запрос, надо настроиться на ее «радиочастоту» — послать запрос на этой частоте, а в запросе сообщить, на какой частоте она должна выйти на связь с тем, кто ее запросил. Далее. С системой портов тесно связана такая система защиты, как "файерволл".[26 - От англ. "firewall" — стена из негорючих материалов, предусматриваемая в проекте здания на случай пожара для предотвращения его распространения.] Файерволлом называется программа, которая обеспечивает санкционированность всей информации, приходящей или уходящей с компьютера. К примеру, при отправке почты используется порт 25, а при получении — порт 110. С этими портами работает почтовая программа. Если же какая-нибудь другая программа, например, вирус-троян,[27 - Троян — это программа, помимо основной функции в которой есть еще скрытая, вредоносная. Например, отправка по почте своему автору всех логинов и паролей того, на чьем компьютере она запущена.] попытается связаться с чем-либо по этому порту, то файерволл не даст ей это сделать. Кроме того, файерволл не позволяет осуществить связь с удаленным компьютером по какому-либо порту, если это не разрешил пользователь. Перед началом использования файерволла производится его настройка — то есть указание номеров портов, через которые может идти обмен данных, и программ, которые с этими портами работают. В современных файерволлах настройка может пройти и автоматически. Иными словами, если, к примеру, с компьютера собирается отправиться пакет данных, то файерволл посмотрит, какая программа его отправляет, и по какому порту, и на какой порт. И в случае, если эти данные не будут соответствовать указанным в первоначальных настройках файерволла, то он забьет тревогу: либо запретит вообще отправку этого пакета, либо запросит пользователя о возможных действиях (смотря как настроить). Если на компьютер пробралась программа-троян, отсылающая, скажем, пароли пользователя куда бы то ни было, то она не сможет воспользоваться ни одним портом, да и вообще не сможет осуществить отправку данных, так как файерволл ее распознает (так как она, естественно, не будет входить в список разрешенных) и запретит ей доступ к Интернету. Также — и при приходе пакета: пропускаются лишь те пакеты, которые адресованы разрешенным программам — на разрешенные порты. Если же пакет приходит на адрес порта, которого нет в списке разрешенных, то ему в доступе отказывается. Обеспечение безопасности компьютера от «взлома» извне тоже тесно завязано на управлении системой портов. На компьютере постоянно запущено множество программ. И не исключено, что при обращении к какому-либо порту какая-либо программа возьмет и ответит на запрос, да еще и проигнорировав какую-либо авторизацию доступа. Это — так называемая «дыра» в программе, за что ее авторов нещадно бьют. В другом случае операционная система, воспринимая данные по какому-либо порту, может попросту «повиснуть» — опять-таки из-за ошибки в ее программе. Так, до появления третьего Service Pack к Windows NT приход на компьютер с этой операционной системой пакетов данных, адресованных на 139-й порт, происходила либо перезагрузка Windows NT, либо ее «зависание». ("Дыры" могут быть основаны и на совсем других принципах — не только на системе портов, просто "дыра через порт" — один из многочисленных вариантов "дыр".) Порты у компьютера можно «прослушать» — то есть послать на него пакеты данных, адресованные на все порты подряд, и ждать ответа хоть от какого-нибудь порта. Если с какого-либо порта придет ответ, то это значит, что с этим портом можно попробовать договориться — попытаться заставить работать программу, заведующую этим портом, в своих целях. Просканировать порты можно, например, с помощью программы Internet Maniac (рис. 10.3). Рис. 10.3. Вот так сканируются порты. Это пример — а при настоящей хакерской атаке можно было бы и «дыру» отловить, да и самому попасться — зависит от умения обоих сторон. Со сканирования портов и поиска «дыр» в программном обеспечении обычно начинается любая хакерская атака, поэтому многие провайдеры, банковские системы и другие большие сетевые представительства отслеживают подобные действия и принимают адекватные меры в адрес того, кто это делает. Поскольку любой сложный программный комплекс включает в себя тысячи строк кода и множество функций, многие «дыры» в нем выявляются не сразу. К примеру, в Windows NT изначально «дыр» было предостаточно. Обычно в случае, если в программе выявляется «дыра», ее производитель выпускает специальное обновление, ее закрывающее. Такие обновления распространяются через Интернет. Особенно преуспела в закрытии своих «дыр» компания Microsoft, под обновления систем безопасности ее продуктов отведен целый большой раздел на ее сервере, что, впрочем, неудивительно — уж больно большие и сложные программы она выпускает. Использование файерволла позволяет в определенной степени свести на нет риск от возможности сканирования портов, — он не дает возможности получить с портов, не входящих в список разрешенных, какой-либо ответ, так как вообще не пропускает к ним несанкционированные запросы. Но файерволл не может помочь в том случае, когда атака ведется с помощью вполне законного доступа — скажем, при приходе письма, содержащего вирус-троян. * * * При подключении к Интернету компьютеру выделяется провайдером постоянный или динамический IP-адрес (последний — в случае сеансового подключения, когда при каждом новом сеансе IP-адрес дается новый). Те пакеты данных, которые предназначены этому компьютеру, маршрутизируются в Сети именно по этому IP-адресу. Но если к Интернету подключен компьютер, который в свою очередь является частью локальной сети, и необходимо обеспечить доступ к Web c остальных ее компьютеров, то возникает проблема. Заключается она в том, что выделенный для компьютера, имеющего доступ в Сеть, а значит, и фактически для всей этой сети IP-адрес — один, а компьютеров много, — и как тогда распределять пришедшие пакеты по компьютерам? Ведь пришедшие пакеты будут иметь одни и те же IP-адреса получателей. Поэтому используется межсетевой шлюз — такая программа, которая как бы собой «подменяет» Интернет для локальной сети и локальную сеть для Интернета. Получив запрос от одного из компьютеров локальной сети, скажем, на загрузку web-страницы, она запоминает, от какого компьютера пришел этот запрос, и делает запрос в Интернет на загрузку той же страницы, но уже от своего имени и от имени и с IP-адреса того компьютера, на котором установлен прокси-сервер. Когда запрошенная страница загружается межсетевым шлюзом, она передается по локальной сети тому компьютеру, с которого был сделан запрос. Обмен данными между компьютерами локальной сети и межсетевым шлюзом происходит по тому же протоколу, что и обмен данными во всем Интернете — TCP/IP. Поэтому в локальной сети каждый компьютер имеет свой внутренний IP-адрес, по которому с ним могут общаться другие компьютеры, в том числе и прокси-сервер. Межсетевой шлюз имеет два IP-адреса: для «своих» — тот, который присвоен ему в локальной сети, и для Интернета — тот, который присвоен ему провайдером. Такой шлюз может быть и между двумя локальными сетями — принцип тот же: у компьютера два адреса — по одному из каждой сети Внутренние IP-адреса полагается брать из диапазона 192.168.xxx.xxx, — чтобы не было совпадения с каким-либо из существующих в Интернете. Иначе при попытке обратиться к серверу с таким же IP-адресом пользователь будет попадать на компьютер своей же локальной сети. Диапазон 192.168.xxx.xxx специально зарезервирован для использования внутри локальных сетей, и в свободном доступе серверов с адресами из него нет (это невыгодно в первую очередь самим владельцам серверов — ведь иначе на их сервера попасть из любой локальной сети, в которой есть компьютер с таким же IP-адресом, будет невозможно). Обычно межсетевой шлюз между локальной сетью и Интернетом выполняет еще две важные задачи и называется поэтому прокси-сервером. Во-первых, он кэширует данные — все web-страницы, хоть раз запрошенные с одного из компьютеров локальной сети, на прокси-сервере сохраняются (некоторое время — зависит от настроек прокси-сервера). Поэтому работа с Интернетом через прокси-сервер может идти несколько быстрее, чем без него (при прямом подключении), так как раз загруженные страницы будут грузиться с прокси-сервера, а не из Сети. Также при наличии прокси-сервера затруднено проникновение на компьютеры локальной сети из Интернета по сравнению с той ситуацией, когда каждый компьютер имеет свой IP-адрес для работы в Сети, то есть, во-вторых, прокси-сервер обеспечивает "защиту от взлома". И, с другой стороны, при работе с ресурсами Интернета из такой локальной сети через прокси-сервер «выследить» компьютер будет практически невозможно — максимум, что можно будет узнать, так это адрес прокси-сервера. Поскольку прокси-сервер в таком случае фактически играет роль "универсального Интернет-сервера" для всех компьютеров локальной сети, то для работы с ним необходимо указать его «координаты» в настройках программ для работы с Интернетом. К примеру, в браузере Microsoft Internet Explorer 5.0 это делается в пункте Сервис — Свойства обозревателя — Подключение — Настройки локальной сети — Прокси-сервер. К прокси-серверу компьютеры должны обращаться по какому-либо порту. По умолчанию для такой работы выделяется порт 80, но тут есть одна особенность — если на компьютере, на котором запущен прокси-сервер, запущен также и web-сервер для обеспечения доступа из Интернета к сайту, расположенном на этом компьютере, то 80-й порт будет использоваться именно для этого web-сервера, и тогда прокси-сервер придется настраивать для работы по другому порту. Соответственно надо будет настроить и программы для работы с ресурсами Интернет. Строго говоря, для того, чтобы работать через прокси-сервер, не обязательно быть подключенным именно к его локальной сети. Если необходимо использовать возможность кэширования web-страниц или защищаться от взлома (или выслеживания), то можно настроить свой компьютер на работу с каким-нибудь прокси-сервером не из его локальной сети, а из Интернета, просто указав его интернетовский IP-адрес (конечно, если он постоянный). Тогда для прокси-сервера этот компьютер станет как бы частью его локальной сети, и все преимущества работы через прокси-сервер станут доступны. Можно также использовать прокси-сервер лишь для работы с web-страницами (то есть по протоколу HTTP), а по всем остальным протоколам работать без него. Для этого надо опять-таки особым способом настроить браузер — в Microsoft Internet Explorer 5.0 (рис. 10.4) для этого служит вкладка «Дополнительно» окна "Настройки локальной сети" (путь — см. выше). Это имеет смысл, когда прокси-сервер работает недостаточно быстро, и выигрыш в скорости получается лишь для web-страниц за счет их кэширования. Рис. 10.4. Окно настроек использования прокси-серверов в браузере Microsoft Internet Explorer 5.0. Разумеется, администратор прокси-сервера может и запретить доступ к нему извне своей локальной сети, если он не заинтересован в такой повышенной нагрузке на него. Обычной является практика, когда провайдер услуг Интернета предоставляет свой прокси-сервер только тем, кто подключается через его доступ (информация о том, через какого провайдера подключился пользователь, может получаться на основе IP-адреса этого пользователя). В этом случае его клиенты имеют возможность выбора — пользоваться прокси-сервером или нет. В Интернете есть и общедоступные прокси-сервера, с которыми могут работать все желающие, но их список часто меняется. Некоторые пользователи Интернета даже устанавливают прокси-сервер на своем компьютере исключительно из-за хорошей системы кэширования данных. Наиболее известными прокси-серверами для небольших сетей на настоящее время являются программы WinGate и WinProxy, которые можно найти на подавляющем большинстве компакт-дисков, посвященных работе в Интернет. Полезные советы · Если вы идете в Интернет-салон и желаете пользоваться там своими «закладками», сделанными вами в вашем браузере, или просто хотите отправить другу содержимое своего «Избранного», то не возитесь с ярлыками из одноименной папки — просто выберите (в Microsoft Internet Explorer 5.x) пункт "Файл"-"Импорт и экспорт" и проследуйте по ряду диалоговых окон. Автоматически будет создана web-страница, в которой поместятся гиперссылки на все сайты, присутствующие в вашем "Избранном". · Не забывайте об имеющейся во многих почтовых клиентах возможности создавать папки для хранения почтовых сообщений. Никогда не оставляйте сообщения, которые не требуют скорой реакции, в папке входящих писем! Иначе вскоре вы рискуете полностью потерять возможность сколько-нибудь быстро в них ориентироваться. Создайте по папке для писем на каждую тему и после прочтения письма или написания на него ответа перемещайте его в нужную папку. В Outlook Express для создания новой папки нужно выбрать соответствующий пункт из меню правой кнопки мыши, выделив название любой из существующих папок. · Если вам необходимо пообщаться с кем-либо по Сети в реальном времени, то не используйте программы типа ICQ или IRC, которые имеют очень низкий уровень защиты от внедрения вирусов или целенаправленных атак через Сеть. Лучше заведите гостевую книгу (это web-страница, на которую любой ее посетитель может помещать свой текст, который будет сразу же там отображаться), например, на www.guestbook.ru или www.chat.ru, сообщите собеседнику ее адрес и помещайте сообщения туда. На оперативности обмена сообщениями это не скажется — обновление гостевых книг происходит быстро. Во-первых, безопасность работы возрастет многократно — новые «дыры» в ICQ, позволяющие хакерам получать доступ к компьютерам пользователей этой программы, обнаруживаются едва ли не еженедельно. Во-вторых, все ваши сообщения будут автоматически сохраняться в архиве книги, не занимая к тому же места на жестком диске вашего компьютера. В-третьих, вы не будете связаны необходимостью одновременного выхода на связь — ваш собеседник может оставить свое сообщение в свое время, а вы потом, посетив книгу, его прочтете. · Если вы желаете создать в Интернете архив своей переписки, чтобы при необходимости иметь возможность найти там нужное письмо, то не занимайтесь копированием ваших банков сообщений в Сеть, тратя на это время и деньги за доступ. Создайте на сервере, бесплатно предоставляющем много места под почтовый ящики (например, www.mailru.com, www.cmail.ru) два ящика — для ваших входящих и исходящих писем. Если сервер, где расположен ваш основной почтовый ящик, допускает перенаправление копий писем на другой адрес (таковыми являются практически все сервера бесплатной почты, подробнее — см. главу 23), то установите в качестве одного из адресов пересылки адрес первого из созданных вами ящиков, позаботившись, чтобы копии сообщений либо оставались на сервере, либо одновременно отправлялись в ящик, с которого вы забираете почту. Кроме того, всегда, отправляя письма, помещайте адрес второго из созданных вами ящиков в поле "Скрытая копия". В результате все входящие и исходящие письма будут копироваться в созданные вами ящики. Как только они будут заполнены, заведите следующие и соответственно измените параметры пересылок. Если же ваш почтовый сервер не умеет перенаправлять письма на другой адрес, то заведите себе бесплатный почтовый ящик, например, на www.cmail.ru и настройте функцию сбора почты с вашего почтового ящика с оставлением копий сообщений на сервере, а потом уже с этого нового ящика установите перенаправление. Правда, в этом случае вам придется стараться забирать почту лишь сразу после того, как "сборщик почты" сработает, а то некоторые письма в архив не попадут. · Чтобы переслать по Интернету какой-либо большой файл, не обязательно использовать систему электронной почты. Лучше зарегистрируйте аккаунт на каком-либо из серверов, предоставляющих бесплатное место под сайт и дающих доступ по FTP — например, www.chat.ru, www.fromru.com, А затем помещайте передаваемые файлы на этот аккаунт и отправляйте адресату ссылку на них. Во-первых, загружаться файлы с сервера будут быстрее, чем сообщение электронной почты, так как в последнем случае присоединенные к письму документы увеличиваются в обьеме за счет кодирования uuencode (подробнее — см. главу 13). Во-вторых, если у адресата плохая связь с Интернетом, то он сможет использовать программы докачки файлов вроде NetVampire или GetRight. И, в-третьих, если он по каким-то причинам потеряет загруженные файлы, то всегда сможет загрузить их снова, не беспокоя вас необходимостью повторной отправки. Глава 13. дНАПН ОНФЮКНБЮРЭ, или о проблемах понимания русского языка… Строчки, подобные той, что вас так привлекла в заголовке, наверняка иногда встречались вам в путешествиях по Интернету или при чтении электронной почты. Как вы наверняка знаете, такое возникает из-за неправильно подобранной кодировки для чтения текста, — в Internet Explorer даже есть меню специальное: Вид-Вид кодировки (если использовать пятую версию, а в более старых может быть и в других меню). Вы также наверняка пробовали открывать в программах для Windows файлы с текстом, созданные в старых программах для Dos, например, набранные в Norton Editor, и почти всегда возникало затруднение с их чтением: текст отображался примерно так, как на рис. 13.1, и что-либо понять было просто невозможно. Рис. 13.1. Файл, набранный в Norton Editor и открытый в Блокноте В чем же тут дело? Что такое «кодировка»? Почему их столько много, и все они разные? И, наконец, каким образом можно решить их проблему — не запускать же каждый раз Norton Editor, чтобы прочитать и напечатать свои старые файлы? Кодовая страница Как вы наверняка знаете, в компьютерных технологиях для записи текстовой информации используется кодирование символов последовательностями из восьми бит — одного байта.[28 - Так бывает не всегда, но об этом ниже.] Один байт соответствует одному символу. Иными словами, для записи одной буквы, цифры или значка применяется последовательность из восьми нулей и единиц. Когда компьютерная программа получает из какого-нибудь источника компьютерные же данные, в которых содержится текст (читает текстовый файл с диска, с CD-ROM'а, получает текст из Интернета), то она выделяет из получаемого массива данных последовательности по восемь бит и воспринимает их как байты. Каждому байту, то есть каждой последовательности из восьми нулей и единиц соответствует определенный символ. Какой же конкретно? А вот это узнается программой из так называемой "таблицы символов", которая знакома абсолютно каждой программе, могущей отображать текст и используется программой для такого отображения. Таблица символов (еще она называется "кодовой страницей") — это набор данных для перевода последовательностей бит в символы. Она может либо храниться в самой программе, либо в компонентах операционной системы и «поставляться» программе при запросе из нее. Получив последовательность из восьми бит, программа смотрит в таблицу символов и определяет из нее, какому символу эта последовательность бит соответствует. После этого программа использует дальше именно этот символ — например, отображает его на экране, чтобы пользователь мог читать текст. Нетрудно понять, что таблица символов должна быть строжайшим стандартом — ведь если текст был написан его автором в программе, которая переводит его в последовательность бит в соответствии с одной таблицей символов, а пользователь читает эту последовательность другой программой, которая переводит эту последовательность бит в отображаемые на экране символы в соответствии с данными другой кодовой страницы, то прочитать такой текст сможет только человек, долгие годы прослуживший в шифровальном отделении внешней разведки. И для английского алфавита (латиницы) это действительно так — во всех существующих таблицах символов, использующихся во всех имеющихся компьютерных программах каждая латинская буква кодируется одной и только одной, твердо и строго определенной международными стандартами последовательностью бит — байтом. Такое соответствие последовательностей бит и отображаемых символов разработано почти двадцать лет назад на основе последовательности букв в латинском алфавите. Каждая последовательность восьми бит имеет также и свое числовое значение — это ведь фактически число в двоичной системе счисления, которое нетрудно перевести в десятичную. Например, 01010101 в двоичной системе счисления — это 85 в десятичной, а в соответствии с международными стандартами эта последовательность бит кодирует символ «U». Число 85 в данном случае называется кодом символа «U». То есть можно сказать, что при отображении текстовых данных программа, отображающая их, каждую последовательности восьми бит воспринимает как число — код символа, смотрит в таблице символов, кодом какого символа это число является и отображает именно этот символ. Таблицу символов можно отобразить визуально — например, в Windows этой цели служит программа "Таблица символов." При таком отображении символы расставляются по возрастанию их кодов. Но с помощью восьми бит можно закодировать до 256 символов — в самом деле, каждый бит может иметь значение 0 или 1, то есть одно из двух, следовательно, всего различных восьмибитовых последовательностей может быть 2*2*2*2*2*2*2*2=2 =256. Английских букв — 26, их же, но заглавных — столько же, цифры и служебные символы вроде запятой, точки займут еще ну, мест 50, если по максимуму. Поэтому для возможности адаптации операционных систем к различным другим алфавитным системам (то есть, в применении к русскому языку, русификации программ[29 - Это понятие следует отличать от понятия локализации программы, при котором осуществляется перевод всех ее текстовых выводов: меню, информации в окнах, сообщений пользователю.]) в качестве строгого международного стандарта было принято строгое соответствие отображаемым символам лишь первых 127 последовательностей восьми бит — то есть первой половины кодовой страницы, а вторую половину отдали "на откуп" производителям регионального программного обеспечения и информационных ресурсов — чтобы они размещали в ней свои алфавиты. Рис. 13.2. Визуальное отображение кодовой страницы — программа "Таблица символов" Узаконенные международными стандартами коды первых 127 символов кодовых страниц, которые должны быть едиными во всех таких страницах, получили название "стандарта ASCII". Эти символы также могут кодироваться всего семью битами информации. Первые 32 кода (от 0 до 31) были назначены управляющим символам (например, символ с кодом 13 — это символ конца абзаца), остальные кодировали строчные и прописные латинские буквы, цифры, знаки препинания и математических операций. Коды второй половины этой 256-символьной кодовой страницы получили название "расширенного стандарта ASCII". Ими кодировались, как уже было сказано выше, национальные алфавиты, а также символы псевдографики, математические и некоторые другие символы. Первый бит кода символа второй половины кодовой страницы имел значение «1», в то время как для первой половины он равнялся «0». Вы можете легко отобразить на экране символ с желаемым кодом, набрав, например, в Word его код (десятичный на цифровой клавиатуре, с нулем вначале) при удерживаемой клавише Alt. Поэтому появились различные версии кодовых страниц (различающиеся именно своей второй половиной), которым были присвоены некоторые номера для отличия их друг от друга. Чтобы пустое место в исходной английской кодовой странице не пропадало, в ней на места, соответствующие кодам символов больше 127, были поставлены гласные буквы английского алфавита с надстрочными знаками, использующимися в некоторых европейских языках вроде французского для обозначения по особому произносящихся букв, а также символы, позволяющие в текстовом режиме создавать простейшие графические изображения — символы псевдографики. В региональных кодовых страницах на этих местах стали располагать символы отличных от английского алфавитов, таких, как русский, турецкий, вьетнамский, тайский и т. д. Программы, создаваемые в неанглоязычных странах, были рассчитаны на работу с такими кодовыми страницами и, получая откуда-нибудь код символа, больший 127, отображали тот символ, который стоял под таким номером именно в их региональной кодовой странице, а не в исходной английской. Для ввода текстовой информации производились специальные наклейки на клавиатуру, а сейчас делаются и «локализованные» клавиатуры — с выгравированными на них символами национальных алфавитов. При поступлении с клавиатуры в программу, работающую с текстом, символа с кодом, большим 127, программа записывала в файл его код так, как он поступил, а вот отображала символ в соответствии с кодовой страницей. Код такого символа передавался в программу драйвером клавиатуры, когда был включен специальный режим — "переключена раскладка". В таком режиме при нажатии какой-нибудь клавиши с символом драйвер передавал в программу не код собственно нажатой клавиши, а код, соответствующий в региональной кодовой странице тому символу, который был помещен на этой клавише при «локализации» клавиатуры, то есть гравировке или наклейке на ее кнопки символов неанглийского алфавита. Иными словами, кодовая страница — это как бы «закон» для программы, работающей с вводом-выводом текстовой информации, регламентирующий, как должно интерпретировать и выводить на экран или печать последовательность бит, являющуюся записью текста, а также как должно воспринимать ввод данных с клавиатуры. В разных странах существуют разные законы, но первые части у всех законов общие, а поэтому одинаковые. Российская особенность В большинстве стран была создана одна кодовая страница для своего алфавита. Но в России были некоторые особенности. Изначальные английские версии поставляемых в Россию программ не могли работать с русским алфавитом (это и ясно — в них же не было русской кодовой страницы). Поэтому была создана русская кодовая страница ISO-8859-5, в которой кодам символов, большим 127, соответствовали русские буквы. Так как их всего 33, а с заглавными — 66, то в кодовой странице осталось место для символов псевдографики. Для того, чтобы с этой кодовой страницей можно было работать, имелось три возможности: писать программы, отображающие символы именно в соответствии с ней; создать операционную систему, которая сама будет «заведовать» вводом и выводом текста в соответствии с нужной кодовой страницей, а программы будут лишь использовать готовый результат; создать специальную программу, которая будет работать вместе с операционной системой и обрабатывать ввод и вывод текстовой информации в соответствии с нужной кодовой страницей. Первая возможность из-за своей сложности использовалась мало, третья подразумевала создание и использование специальных программ — русификаторов, которые долгое время использовались, при использовании второй возможности была необходима русификация или локализация операционной системы — то есть внедрение в нее функций отображения символов в соответствии с заданной кодовой страницей. В настоящее время повсеместно применяются локализованные операционные системы, то есть те, в которых кроме внедрения функций работы с русской кодовой страницей еще и переведен интерфейс. Вариантов русской кодовой страницы было два. Один, вышеупомянутый — ISO-8859-5. Другой, так называемый «альтернативный», отличался от него другим порядком следования русских букв до строчной «р» и имел ту особенность, что символы псевдографики кодировались в нем теми же кодами, что и в исходной английской таблице символов, а следовательно, при принятом в операционой системе этом варианте кодовой страницы можно было использовать нелокализованные версии западных программ, работающих с псевдографикой. Например, западная программа могла из символов псевдографики изобразить таблицу. Она считывала из файла код символа и отображала на экране соответствующий ему значок. Если в системе была установлена «альтернативная» кодовая страница, то это оказывался именно символ псевдографики и рисунок получался. Если же в системе стояла ISO-8859-5, то рисовалась русская буква, и внешний вид рисунка был весьма своеобразным. Поэтому несмотря на то, что в «альтернативной» кодовой странице русские символы шли не подряд, а с разрывом между строчными буквами «п» и «р», именно она впоследствии получила наибольшее распространение. Кодовая страница ISO-8859-5 применялась при русификации компьютерных систем Sun, поставлявшихся в Россию. Заслуга внедрения русских кодовых страниц принадлежит российской компании «Диалог» и ее ведущему программисту Петру Квитеку. В 1989 году в этой фирме — партнере Microsoft была локализована MS-DOS 4.1, первой среди всех операционных систем. При ее создании в качестве основной кодовой страницы была взята «альтернативная» кодировка, названная Dos(866), — именно из-за того, что программы, использующие ее, корректно отображали символы псевдографики. Это привело к еще более широкому распространению данной кодовой страницы, так как MS-DOS была основной операционной системой для персональных компьютеров. При создании локализованной версии операционной системы Windows фирма Microsoft решила изменить ставшую общепринятой русскую кодовую страницу Dos(866). В частности, с появлением графического интерфейса отпала необходимость в использовании символов псевдографики, что позволило сделать порядок символов русского алфавита в кодовой странице в соответствии с алфавитной последовательностью, а также разместить в ней различные специальные символы вроде изображения торговой марки — ™. Появилась кодировка Windows-1251, которую создал тот же Петр Квитек. В ней тем символам, что в кодировке Dos(866) соответствовали одни русские буквы, были поставлены в соответствие другие символы. В результате для чтения в Windows русского текста, набранного в Dos, стали требоваться программы-перекодировщики. Шрифты "Носителями" кодовых страниц в Windows являются шрифты. Каждый шрифт — это фактически как бы отдельная кодовая страница, в которой записана информация о внешнем виде отображаемых символов, их дизайну, графике и соответствии каждого графического изображения символа определенному коду. С помощью программы Windows "Таблица символов" можно посмотреть первые 256 символов, могущих быть отображенными с помощью данного шрифта. Это могут быть как символы, соответствующие кодовой странице Windows-1251 и применяемые для отображения текста, так и значки для «разукрашивания» текстового документа, хранящиеся в специальных символьных шрифтах или даже математические символы (рис. 13.3). Рис. 13.3. Шрифт, состоящий из математических символов. Практически все текстовые редакторы под Windows, кроме разве что Блокнота, дают возможность пользователю выбирать желаемый шрифт для его текста. Текст, набранный с помощью обычного шрифта, например, Ms Serif, будучи оформлен шрифтом символьным вроде Wingdings, превратится в набор символов: "íàáîðñèìâîëîâ", так как в этом шрифте на местах, соответствующих кодам символов русских букв, расположены графические картинки стрелок. Unicode В ранних версиях Windows для каждой кодовой страницы должен был иметься свой шрифт, так как в один шрифт — в одну кодовую страницу — нельзя было поместить больше 255 символов. Это имело определенные неудобства, и был придуман и утвержден новый стандарт таблицы символов — Unicode. Согласно этому стандарту каждый символ кодировался не восемью, а шестнадцатью битами информации, что позволяло закодировать до 65536 символов. Эта кодировка также получила название двухбайтовой кодировки. Для совместимости со старыми стандартами первые 256 символов стандарта Unicode соответствовали стандартной кодовой таблице, а на остальных местах можно было разместить все необходимые символы всех языков. Были созданы новые шрифты в стандарте Unicode. Безусловно, использовались в них далеко не все 65 тысяч символов — стандарт имеет большой задел на будущее, и пока в шрифтах, совместимых с этим стандартом, «заняты» только первые сотни мест. В шрифте Unicode имеется как бы несколько кодовых страниц сразу. Вот, к примеру, состав Unicode-шрифта Times New Roman (рис. 13.4). Рис. 13.4. Содержимое шрифта Times New Roman, соответствующего стандарту Unicode, в окне Word97 "Вставка символа" Вы видите в правом углу диалогового окна Word "Вставка символа" список региональных кодовых страниц, представленных в этом шрифте. Для того, чтобы программы, не поддерживающие стандарт Unicode (например, Microsoft Word 6.0), могли работать с такими шрифтами, операционная система осуществляет так называемую "подстановку шрифтов", то есть «раскладывает» шрифт Unicode на отдельные кодовые страницы и выбирает из него ту страницу, которая соответствует установленной в системе. Параметры подстановки прописываются в системном реестре, а в операционных системах Windows9x — и в файле Win.ini (рис. 13.5). Рис. 13.5. Подстановка шрифтов в файле Win.ini. Смысл находящихся в системном реестре и в файле win.ini выражений — указание программам на то, где в шрифте искать символы, соответствующие нужной кодовой странице. Так, для шрифта Times New Roman эти символы (кириллица) начинаются с 204-го места, что и указано в Win.ini. Теперь Microsoft Word 6.0 спокойно будет работать с Unicode — шрифтом Times New Roman, воспринимая его как обычный кириллический шрифт. При этом в восприятии этого текстового редактора шрифт Times New Roman окажется как бы «разложенным» на набор шрифтов (Times New Roman Cyr, Times New Roman CE и др.), каждый из которых будет соответствовать определенной кодовой странице, несмотря на то, что все эти «шрифты» хранятся в одном файле. Иногда встречается ситуация, когда Microsoft Word 97 вполне нормально отображает на экране текст, но на принтер выводится набор квадратиков. Это вот как раз проявляется некорректное взаимодействие программного обеспечения, когда одни компоненты (Word97) поддерживают новый стандарт, а другие (драйвера к принтеру) — нет.[30 - Пути преодоления этой проблемы таковы (на выбор): либо установить новые драйвера к принтеру, либо в системном реестре, в разделе "HKEY_CURRENT_USER\Software\ Microsoft\Office\8.0\Word\<имя принтера>" создать новую строковую переменную «Flags» со значением «8192», либо в системном реестре, в разделе "Font Substitution" для всех русских шрифтов, при печати которых выводятся квадратики, надо написать: Font,0=Font,204 и Font,204=Font,204. То же самое надо поместить и в Win.ini.] Существуют русские шрифты, полностью совместимые с стандартом Unicode, которые без проблем отображаются и печатаются как в старых, так и в новых программах. Они содержат только стандартный набор символов, соответствующий русской кодовой странице и отличаются еще красивым их дизайном. В выпадающем меню выбора шрифта они обычно имеют префикс «a_» (рис. 13.6). Рис. 13.6. Шрифты Unicode — работают везде. Koi-8 В то время как на рынке операционных систем для персональных компьютеров безоговорочную победу одержала всем нам знакомая MS-DOS, среди операционных систем для сетей дело обстояло не так. Там начинала властвовать Unix — операционная система, построенная на несколько других принципах. Эта система имела открытый исходный код — любой программист мог создать «свою» Unix, настроенную именно на его предпочтения, была очень удобна для программирования. И эта операционная система весьма бурно развивалась в своей отрасли — обьединении компьютеров в единое целое. Понятие о кодовой странице в Unix имело несколько другое значение, но на этом сейчас останавливаться не стоит. С развитием сетевых технологий возникла тенденция к обьединению не только компьютеров, расположенных в одном месте, в локальные сети, но и самих этих сетей в некое единое целое. Начала зарождаться Всемирная Сеть — Internet. И одной из первых возможностей обьединенной сети стала возможность обмена информацией посредством текстовых сообщений — электронная почта, e-mail. Для работы с электронной почтой, ее передачи и приема, сортировки и разработки маршрута движения были созданы специальные системы — почтовые сервера. Сам по себе "почтовый сервер" — это программа, постоянно работающая на компьютере и выполняющая задачи по обработке почты, поступающей на компьютер, на котором она запушена, из Сети и отправляющая почту в Сеть. (Однако нередко для работы такой программы выделялся отдельный компьютер.) Чаще всего они работали под управлением операционной системы Unix. Всемирная Сеть изначально зародилась и начала развиваться в Америке. Поэтому вся система почтовых серверов вначале была предназначена для работы с почтой англоязычных пользователей, пишущих также англоязычным адресатам. Так как использование в текстовых сообщениях, которые составляли тогда единственное содержимое электронной почты, символов псевдографики было отнюдь не обязательно (хватит и простого текста!), то программы, работающие с электронной почтой, как на компьютерах пользователей, так и на почтовых серверах, делались в расчете на первую половину кодовой страницы — на семибитную кодировку. Ясно, что текстовые сообщения, содержащие символы с кодами, большими 127 и не могущие быть закодированы семью битами, нормально такими серверами обрабатываться не могли. Для того, чтобы такие письма все же как-нибудь проходили через семибитные почтовые серверы, символы сообщений принудительно приводились к семибитному виду — у них обнулялся первый бит, указывающий на половину их кодовой страницы. Например, символ «е» (русская буква е) переходил в «f», символ «ш» — в «y». Дальше шло уже обработанное таким образом письмо. Если бы все почтовые сервера тогда были восьмибитные (то есть умеющие корректно работать с символами второй половины кодовой страницы), то пересылка через них русскоязычной почты не составляла бы проблем — лишь бы компьютеры отправителя и получателя поддерживали бы русскую кодовую страницу (или, в случае операционной системы Windows, и отправитель, и получатель имели бы шрифт с русскими символами). Ну и пусть в пути письмо не могло быть никем прочитано, у кого нет русской кодовой страницы (оно отобразилось бы на их компьютерах как мешанина символов) — даже лучше! Но обрезающие письма сервера не позволяли так делать. Выходы были. Первый, самый тогда распространенный — писать письмо транслитом, latinskimi bukvami. Некрасиво и плохо читаемо, зато надежно — дойдет в исходном виде всегда. Но, поскольку все же не все почтовые сервера были семибитные, была создана специальная кодировка для электронной почты, которая отличалась тем, что на места, соответствующие кодам символов, большим 127, были поставлены русские символы, похожие по звучанию на английские буквы на местах, соответствующих кодам символов, меньших на 128. Иными словами, в этой новой кодировке коды 225, 226, 227, 228 соответствовали символам «а», «б», «ц», «д», которые при семибитном преобразовании перешли бы в коды 97, 98, 99, 100, соответствующие английским буквам «a», «b», «c», «d». Слово «привет», написанное в новой кодировке, пройдя через семибитный почтовый сервер, перешло бы в слово «PRIWET», что еще хоть как-то читаемо. Ну, а если письму бы повезло и на его пути не встретились бы семибитные сервера, то оно дошло бы в исходном виде. Новая кодировка была названа KOI-8. Так как системы на основе Unix были в основном рассчитаны на работу с электронной почтой и международными сетями, то она стала стандартом для этой системы. Количество семибитных серверов стало понемногу сокращаться, сейчас их уже почти совсем не осталось в мире, а кодировка уже стала общепринятой, и программы для Unix предназначены для работы именно с ней. KOI-8 использовалась не только Unix-системами. Так, любой пользователь персонального компьютера под управлением MS-DOS или Windows, имеющий выход к электронной почте, должен был иметь у себя программу для получения и отправки сообщений, умеющую работать с KOI-8. Выход к системе электронной почты был возможен и с компьютеров фирмы Apple — с Макинтошей, однако в операционных системах для этих компьютеров использовалась своя, оригинальная русская кодировка символов, отличающаяся от всех остальных. Для того, чтобы облегчить переписку между пользователями разных типов компьютеров и операционных систем, KOI-8 была принята как универсальная кодировка, и любая почтовая программа была обязана уметь читать и отправлять сообщения в этой кодировке. Слишком умные серверы Наличие пяти различных кодировок для русского языка создало определенные проблемы. Прежде всего, возникла необходимость в специальных программах-перекодировщиках, о которых речь пойдет ниже. Но самая большая проблема оказалась в российских почтовых серверах. Казалось бы, а в чем она могла заключаться? Главное, чтобы серверы могли обрабатывать сообщения в восьмибитных кодировках, и тогда в какой бы кодировке сообщения не пересылались, они всегда могли бы быть прочитаны принимающей стороной с помощью программы, умеющей работать с этой кодировкой. Но, увы, не все оказалось таким простым… В некоторые почтовые серверы их создатели вложили возможность автоматической перекодировки поступающих сообщений — возможно, для некоей «стандартизации»: глупый пользователь, ничего не понимающий в компьютерах, написал и отправил письмо в кодировке Windows-1251, - так надо его письмо перевести в KOI-8, чтобы было, как у нормальных людей, никогда не использующих Windows! Хотя, может быть, у создателей перекодирующих серверов были и иные соображения. Если на такой перекодирующий сервер поступит сообщение в кодировке Windows-1251, и он его воспримет именно как сообщение в этой кодировке, то письмо преспокойно будет перекодировано в KOI-8 и отправлено дальше. О том, в какой кодировке написано письмо, всегда указывается в его заголовке или тексте. Просмотреть текст сообщения именно в том виде, в каком сообщение передается почтовыми серверами (то есть со всей служебной информацией) можно в любой почтовой программе. Например, в Microsoft Outlook Express 5.0 это можно сделать, щелкнув правой кнопкой мыши на письме, выбрав из контекстного меню пункт «Свойства», а в появившемся окне — вкладку «Подробности». Тогда можно будет просмотреть заголовок сообщения. Нажав на кнопку "Исходное сообщение", вы увидите текст письма так, как он передается по Сети. Кодировка письма указывается в заголовке сообщения (рис. 13.7). Рис. 13.7. Указание на кодировку письма в заголовке сообщения. Русская версия Microsoft Outlook Express 5.0 по умолчанию для всех отправляемых сообщений ставит кодировку KOI-8 и сообщения отправляет именно в этой кодировке. Однако некоторые почтовые программы могут делать ошибки — письмо написано, например, в KOI-8, а программа пишет в заголовке письма, в служебной информации, что письмо имеет кодировку Windows-1251. Если такое письмо будет отправлено адресату, то оно сразу не сможет правильно отобразиться в его почтовой программе — на экране будет мешанина символов вроде той, что помещена в заголовке этой главы. Поскольку почти все почтовые программы позволяют просматривать одно и то же письмо в различных кодировках, то получатель письмо прочитать все же сможет, просто выбрав для него правильную кодировку. Но если такое письмо — с несоответствующим содержанию заголовком — попадет на перекодирующий почтовый сервер, то ситуация резко осложнится. Посмотрев на заголовок письма, сервер решит, что, раз оно написано в Windows-1251, как там указано, то оно должно быть перекодировано в стандартную для Сети (по мнению сервера и его создателей) кодировку KOI-8. К письму будет применено преобразование Windows-1251 — KOI-8: будут заменены соответствующие коды символов. Но письмо-то уже изначально было в KOI-8! И что получается? Автор письма написал в нем "Добро пожаловать". В KOI-8 оно перекодировалось как "дНАПН ОНФЮКНБЮРЭ". А сервер эту фразу снова перекодировал по тем же законам, что и любая перекодировка из Windows-1251 в KOI-8. И получилось: "Дмюом нмтчймачпщ". Понять что-либо уже так просто стало невозможно. Ну, а если на пути письма попалось несколько перекодирующих почтовых серверов, и оно было перекодировано не один раз, то дешифрация такого письма становится крайне сложной задачей. Вложенные файлы Изначально система электронной почты предназначалась для обмена исключительно текстовыми сообщениями и не могла пересылать файлы, приложенные к письмам, так как последние обычно являлись архивами и представляли собой двоичные данные, то есть не раскладывающиеся на удобовразумительную последовательность символов. Безусловно, можно было принудительно разбить последовательность бит в файле на группы из восьми бит и попытаться перевести его в текст (эксперимент может проделать каждый, переименовав какой-либо исполняемый файл или архив в файл с расширением".txt" и загрузив его в Microsoft Word 97 или Microsoft Word 6.0), но в этом случае в таком тексте было бы большое количество символов с кодами меньше 33 и больше 127, из которых со вторыми могла бы возникнуть проблема обрезания старшего бита в семибитных почтовых серверах, описанная выше, а первые могли очень своеобразно отобразиться в почтовой программе. Кроме того, символы с кодами, большими 127, имели шанс подвергнуться перекодировке в российских почтовых серверах. Ясно, что после подобных преобразований вряд ли пересылаемая программа бы заработала, а архив открылся — их код стал бы практически невосстановимо испорченным. Поэтому были разработаны специальные системы вложений двоичных файлов в почтовые сообщения, основанные на конвертации двоичных данных в набор символов с кодами от 33 до 127, могущий быть впоследствии подвергнутым обратному преобразованию в исходные двоичные данные. Систем такой конвертации было разработано несколько, самые употребительные из них — uuencode, base64, quoted-printable. Почтовая программа, умеющая работать с вложениями, конвертировала перед отправкой письма вложенные файлы в одну из таких кодировочных систем, помещая перед вложением соответствующее указание на такую конвертацию, а при получении письма с вложениями просматривала текст письма и при нахождении вставки фрагмента, закодированного как, например, uuencode или base64 (что определялось по специальному указателю в тексте письма), превращала этот фрагмент в исходный двоичный файл. Сейчас все общеупотребительные почтовые программы умеют это делать. Вот, к примеру, фрагмент письма с вложением, просматриваемый с помощью функции Microsoft Outlook Express "Свойства-Подробности-Исходное сообщение" (рис. 13.8). Рис. 13.8. Фрагмент письма с вложением. Все как на ладони. Указано, что приложено к письму — архив Zip с названием 999.zip, указан способ конвертации вложения — base64, а дальше идет набор символов первой половины кодовой таблицы, за который можно быть уверенным, что он пройдет через любые почтовые серверы неизмененным. Outlook Express при получении такого письма распознает наличие вставки base64, отобразит вложенный файл на панели вложений и позволит сохранить его на жесткий диск или прочитать, подвергнув обратному преобразованию из base64. Если вложенный файл является текстовым (наиболее частый случай — HTML-вариант письма, который может быть составлен, к примеру, с помощью программы Outlook Express), то для него, помимо способа конвертации (обычно quoted-printable), указывается еще и кодировка исходного текстового файла для того, чтобы почтовая программа получателя, раскодировав его, могла его правильно отобразить (рис. 13.9). Рис. 13.9. Указание на кодировку текстового вложения. В данном случае текстовое вложение еще подвергнуто преобразованию quoted-printable. Иногда встречаются семибитные сервера, которые не "обрезают восьмой бит", а попросту обнуляют все символы с кодами, большими 127. В этом случае пришедшее письмо выглядит как набор вопросительных знаков, и никакая перекодировка не помогает — информация об исходных кодах символов оказывается полностью потерянной. В этом случае использование системы конвертации вложений для самого текста письма позволит ему проходить и по таким почтовым серверам. Решение проблем В связи с наличием пяти различных кодовых страниц для русского языка возникает две проблемы: 1. Обеспечить возможность чтения текстов, написанных в соответствии с одной кодовой страницей, в операционных системах с другой кодовой страницей. Например, текстов MS-DOS в Windows9x. 2. Получить возможность расшифровывать неоднократно перекодированные электронные письма. Для решения этих проблем есть много способов, реализуемых с помощью специальных программ или компонентов программных пакетов. Ниже будет рассказано о некоторых из них. Microsoft Word 97 Да-да, не удивляйтесь — как ни странно, в этом редакторе есть средство открытия файлов в другой кодировке! Правда, поддерживается только возможность открытия и сохранения файлов в кодировке MS-DOS, но и это немаловажно — именно в этой кодировке распространяется большинство книг в "электронных библиотеках", огромное количество документов подготовлено в редакторах под MS-DOS и сохранено в текстовом формате в кодировке MS-DOS. Как же использовать это средство? Для начала в меню Сервис-Параметры-Общие надо поставить флажок в графе "Подтверждать преобразование при открытии". После этого при открытии с помощью диалогового окна «Открыть» любых файлов с расширением, отличным от".doc", будет выдаваться диалоговое окно (см. слева), где можно будет выбрать нужный формат файла из предложенного списка. Если вы открываете таким образом текст, представленный в кодировке MS-DOS, то лучше всего выбрать пункт "Текст DOS". Тогда при открытии файла его текст будет просто отображен на экране. Если файл, открытый таким образом, отредактировать и сохранить, то его формат сохранится, — он по-прежнему останется написанным в кодировке MS-DOS. Чтобы сохранить его в Windows-1251, надо воспользоваться пунктом меню "Файл-Сохранить как…" и указать там "Только текст" для сохранения в текстовом файле или другой формат для сохранения в нем. При выборе в диалоговом окне выбора формата для открытия файла пункта "Текст MS-DOS с форматированием" Word предпримет попытку «отконвертировать» текст в формат Word. При наборе текста в редакторах под MS-DOS в качестве символа конца строки обычно используется символ конца абзаца (то есть клавиша "Enter"), а табуляция и выравнивание по центру или правому краю обозначаются пробелами. Применить к такому тексту методы форматирования (задание нужных полей и отступов, колонок, выравнивания по ширине) не представляется возможным, так как символы конца абзаца на концах строк будут мешать и не позволят тексту свободно перетекать из одной строки в другую, что требуется при подобном форматировании. Встроенный конвертор Word пытается исправить эту ошибку, но, увы, чаще всего делает это неудовлетворительно, и текст потом долго приходится править вручную. В русской версии Microsoft Office 97 Professional есть специальный встроенный конвертер "Лексикон для DOS", его можно установить, выбрав соответствующий пункт при установке самого Office, но работа этого конвертера, хоть и несравненно лучше первого, все же оставляет желать лучшего. Существует программа "Конвертор текста MS-DOS", специально предназначенная для обработки и оптимизации текста, набранного в MS-DOS. Разработка представляет собой макрокоманду для Microsoft Word 97 и Microsoft Word 2000 и запускается из Word. Она, кроме удаления лишних символов конца абзаца, также на основе количества пробелов перед первой буквой в строке устанавливает значение выравнивания (по ширине, по центру, по правому краю), заменяет несколько идущих подряд пробелов на один ("Лексикон" для MS-DOS пытается с помощью добавления лишних пробелов передать выравнивание текста по ширине), оптимизирует пробелы вокруг точек, запятых, других знаков препинания — ведь, в самом деле, пробел перед запятой выглядит несколько странно. Имеется возможность обработки сразу большого количества файлов с автоматическим их сохранением. Программа имеет множество настроек, могущих удовлетворить почти всех требовательных пользователей. "Конвертор текста MS-DOS" является частью пакета программ «ВерсткаТекстаКнижкой» и распространяется вместе с ним. Вы всегда можете загрузить этот пакет с адресов: http://antorlov.chat.ru и http://www.newtech.ru/~orlov. К сожалению, работа с кодировками KOI-8, ISO-8859-5, Macintosh в среде Microsoft Word невозможна. Существуют макросы для перекодирования текста из KOI-8 в загруженном в Word тексте, но они работают медленно и поэтому пользоваться ими нецелесообразно. В Microsoft Word 2000 и Microsoft WordXP при открытии документа в кодировке MS-DOS производится попытка автоматической его конвертации в читаемый вид, однако она не всегда срабатывает корректно. WordPad Если под рукой нет ни Microsoft Office, ни каких-либо других программ для чтения текстов MS-DOS, то можно на крайний случай воспользоваться текстовым редактором WordPad, поставляющийся вместе с Windows9x. В меню этого редактора "Открытие файла" в качестве шаблона для имени файла надо указать пункт "Текстовые документы MS-DOS", и тогда открываемый текстовый файл будет отображен правильно. TextViewer С помощью вышеописанных средств — возможностей Word и WordPad — можно иногда выходить из положения, когда срочно надо напечатать или отредактировать файл, набранный в редакторах под MS-DOS, но при большом количестве таких файлов работа с ними станет весьма затруднительной. Однако в настоящее время имеется достаточно большое количество различных бесплатных программ, написанных русскими программистами специально для решения проблем совместимости различных кодировок. Одной из таких разработок является TextViewer Георгия Гуляева (рис. 13.10). Рис. 13.10. TextViewer. TextViewer открывает текстовые файлы и файлы в формате Rtf. Слева вверху на панели инструментов программы находятся шесть кнопок — пять из них позволяют просмотреть открытый документ в соответствующей кодировке (Dos-866, Windows-1251, KOI-8, Macintosh, Iso-8859-5), а шестая — просмотреть текстовое содержимое файла в формате Rtf, если таковой будет загружен в TextViewer. Открытый файл можно сохранить в нужной кодировке, выбрав соответствующую опцию в окне "Файл-Сохранить как…". Имеется возможность произвести печать файла, использовать функцию предварительного просмотра перед печатью, поиск в тексте и замену фрагмента. Можно выбрать шрифт для отображения текста, с помощью удобного диалогового окна связать программу TextViewer с различными типами текстовых файлов. В целом можно сказать, что разработка Георгия Гуляева — превосходная замена стандартному «Блокноту». Возможность работы с различными кодировками, открытие файлов любого размера, возможность замены — все это дает TextViewer'у неоспоримые преимущества перед Notepad'ом. Однако на компьютерах, не оснащенных процессором Pentium, TextViewer весьма медленно запускается, в связи с чем использование его как стандартного редактора текстовых файлов, например, на 486-м процессоре будет затруднительно. Загрузить TextViewer можно с сайта Георгия Гуляева "http://www.freespeech.org/georgy" или с сервера бесплатных программ "http://www.freeware.ru". Aditor Aditor — мощный текстовый редактор, отличающийся наличием множества разнообразных функций, в числе которых есть и возможность чтения и записи файлов в различных кодировках. Чрезвычайно важной и редкой является возможность работать с текстом, написанным на Translit'е — то есть latinskimi bukvami. Иногда только такое письмо имеет шанс быть правильно прочитанным адресатом (например, когда у адресата вообще нет русифицированных программ на компьютере и работа с русскими кодовыми страницами невозможна, а также в случае, когда на пути письма стоит семибитный почтовый сервер). Aditor позволяет легко подготовить такое письмо и при необходимости прочитать текст на Translit'е. Загрузить Aditor можно с адреса "http://perecod.chat.ru/aditor.rar" или с сервера бесплатных программ "http://www.freeware.ru". Exclude Symbols Программа "Exclude Symbols" Вардугина Александра из Кемерова является многофункциональным пакетным обработчиком текстовых файлов. Как видно из рисунка 13.11, программа поддерживает четыре кодировки — Windows-1251, KOI-8, Dos866 и Iso-8859-5, позволяя переводить текстовые файлы из одной кодировки в другую. Допустима обработка до пятнадцати файлов за один раз: файлы обрабатываются последовательно. В программе есть также ряд весьма интересных функций, например, превращения всех символов в файле в заглавные или, наоборот, в строчные, удаления пустых строк из текста, замены групп пробелов табуляцией, замены символов в обрабатываемых файлах. Рис. 13.11.Exclude Symbols Обращает на себя внимание интересная возможность автоматического определения кодировки документа. Делается это по довольно очевидному алгоритму. Вот пример. В русском языке есть союзы «и» и «в», но нет ни союзов «Ё» и "ў" (символы кодовой страницы Windows-1251, имеющие такие же коды символов, как и символы «и» и «в» в кодовой странице Dos866), ни союзов «Й» и «Ч» (символы кодовой страницы Windows-1251, имеющие такие же коды символов, как и символы «и» и «в» в кодовой странице KOI-8). Поэтому ясно, что текст, открытый как имеющий кодировку Windows-1251, в котором встречаются одиноко стоящие символы «и» и «в», скорее всего, и принадлежит кодовой странице Windows-1251, если же в нем встречаются одиноко стоящие символы «Ё» и "ў", то это, скорее всего, текст в кодировке MS-DOS, а если в этом тексте есть одинокие символы «Й» и «Ч», то, наверное, текст написан в кодировке KOI-8. На подобных принципах основан и способ автоматического определения кодировки документа в программе "Exclude Symbols". Поэтому можно, указав в качестве обьекта для перекодирования группу файлов, не особенно беспокоиться о кодировке каждого из них — достаточно просто указать ту кодировку, которую нужно получить на выходе, а в качестве исходной поставить значение «auto». Программа сама определит для каждого обрабатываемого файла его исходную кодовую страницу, решит, нужна ли ему конвертация в другую кодировку и при необходимости выполнит такую конвертацию. Обращает на себя внимание оригинальный и удобный нестандартный интерфейс программы. Загрузить "Exclude Symbols" можно с адреса http://perecod.chat.ru/exsym.rar. "Штирлиц" Программа «Штирлиц», помимо возможности чтения текстов в различных кодировках, в том числе и в Unicode, имеет очень важную и нужную функцию — функцию расшифровки неоднократно перекодированных почтовых сообщений. Как уже писалось выше, электронное письмо, пройдя через несколько перекодирующих серверов, может стать совершенно нечитаемым. Для его расшифровки необходимо найти ту последовательность перекодировок, которым оно подверглось, и применить к письму обратное преобразование. Именно это делает «Штирлиц», созданный Всеволодом Лукьяниным. Если в него загрузить (например, перенеся с помощью буфера обмена или открыв сохраненный на диске текстовый файл) нечитаемый текст, полученный в качестве письма, то программа после вызова соответствующей функции начнет перебор возможных вариантов перекодирования, пытаясь найти ту последовательность перекодировок, которой подверглось письмо, и применить к нему обратные перекодировки. Пользователю показывается наилучший, по мнению программы, вариант раскодированного письма, — «Штирлиц» анализирует раскодированный текст и, если находит там общеупотребительные слова русского языка, то считает этот вариант раскодировки наилучшим. Программа отличается большим набором режимов работы и функций. Так, можно подбирать схему перекодировок вручную (если есть для этого какие-нибудь предположения), задавать глубину анализа (то есть сколько раз подряд это письмо могло быть неправильно перекодировано), раскодировать текст, разные фрагменты которого имеют разную кодировку, читать тексты, написанные в Unicode-кодировке, читать тексты, написанные на Translit'е. Имеется подробное руководство пользователя и очень удобная функция деинсталляции, которая может служить примером написания таких программ. «Штирлиц» способна вытаскивать из текста письма фрагменты, закодированные в uuencode, base64 и других подобных системах передачи вложенных файлов, если почтовая программа получателя не распознала их. Для этого в «Штирлице» есть специальная функция. Кроме того, при наличии какого-либо текста в закодированном в uuencode, base64 или другом подобном формате фрагменте письма программа сможет его «вытащить» и показать пользователю. В программе есть возможность пакетного перекодирования файлов в нужную кодировку, при этом исходная кодировка каждого файла определяется автоматически и в соответствии с ней выбирается нужный алгоритм перекодирования. Вместе с тем программа «Штирлиц» не лишена и некоторых недостатков. Так, к сожалению, очень некорректно выполняется перекодировка в кодовую таблицу Dos866 и обратно. Несмотря на то, что при этом письмо остается в какой-то степени читаемым, выглядит оно очень непрезентабельно. Так что использование «Штирлица» в качестве программы для чтения файлов в разных кодировках может сопровождаться некоторыми затруднениями. Поэтому лучшее применение, несомненно, превосходного творения Всеволода Лукьянина — «спасение» неправильно перекодированных почтовых сообщений. Загрузить «Штирлиц» можно с адреса http://perecod.chat.ru/shtirlz.rar. "Декодер почты в неверной кодировке" Эта программа Покровского А.В. - простое, но очень хорошо работающее средство для раскодирования писем, прошедших через несколько перекодирующих почтовых серверов. Она просто анализирует текст и преобразует его в читаемый вид. Несмотря на отсутствие сложных настроек и дополнительных возможностей, функцию свою «Декодер» (рис. 13.12) выполняет просто превосходно. Рис. 13.12.Декодер почты в неверной кодировке Для раскодирования текста надо просто вставить его в окно программы и нажать кнопку «Расшифровать». «Декодер» имеет просто превосходный интерфейс, который среди всех программ, описанный в этой главе, без сомнения, заслуживает наибольших похвал. Видно, что автор программы подумал об эргономике, удобстве пользователя, легкости и простоте работы. Это, к сожалению, редкая ситуация, и даже у лучших программ других авторов интерфейс и средства управления программой оставляют желать лучшего. Всем потенциальным авторам программ настоятельно рекомендуется ознакомиться с творением А.Покровского и, по возможности, последовать его примеру в области разработки пользовательского интерфейса. Без сомнения, эта маленькая, но мощная и очень удобная программа достойна того, чтобы занять почетное место на жестком диске каждого пользователя, работающего с электронной почтой и хотя бы изредка сталкивающегося с проблемой восстановления неправильно перекодированных почтовых сообщений. Загрузить программу можно с сайта разработчика www.postman.ru/~a12/decoder. TCode Программа TСode Алекса Бойко (рис. 13.13) — пожалуй, самый мощный инструмент для восстановления многократно перекодированных файлов. Ей подвластна практически любая комбинация перекодирующих серверов. Кроме того, она умеет работать с системами конвертации вложенных файлов base64 и quoted-printable. TCode по своему действию похожа на предыдущую описанную программу, только позволяет проводить также и ручную перекодировку. Рис. 13.13.TCode — ни одно письмо перед ней не устоит. Кроме того, TCode позволяет проводить и обычную конвертацию текста из одной кодировки в другую, что иногда может пригодиться при подготовке web-страниц. Надо только в меню в окне программы отказаться от использования автоопределения кодировки. При испытаниях TCode справилась даже с такой нетривиальной задачей, как раскодирование письма, пять раз неправильно перекодированного (для этого письмо сохранялось как KOI-8, а открывалось как Windows-1251 в виде мешанины символов, и опять сохранялось как ISO-8859-5, и так пять раз). На расшифровку такого письма размером в полкилобайта с помощью TCode ушло около 10 минут на Pentium-166, причем результат был вполне читаем, хотя и не совсем полностью правилен. Загрузить TCode можно с адреса http://perecod.chat.ru/tcode.rar или с сайта автора http://alexboiko.da.ru. Не забудьте отказаться в меню Settings от автоматического перекодирования буфера обмена, а то во время работы TCode вы не сможете с ним работать в других программах. * * * Что касается личного предпочтения автора, то у меня в качестве заменителя Notepad'а стоит TextViewer Георгия Гуляева, для восстановления почтовых сообщений (которое благодаря усилиям разработчиков программного обеспечения требуется все реже и реже) используется программа А.Покровского (одно удовольствие с ней работать — уж больно хорошо спроектирована и написана), а для массовой перекодировки файлов, если такая необходимость возникает, я использую Exclude Symbols. Для конвертации текста, набранного в редакторах для MS-DOS, в формат, допускающий свободное его редактирование (то есть изменение отступов, выравнивания) я применяю "Конвертор текста MS-DOS", поскольку он отличается множеством полезных настроек и позволяет обрабатывать документы в пакетном режиме. Если же возникает необходимость написать или расшифровать текст на Translit'е, то дается работа Aditor'у. Если же "Декодер почты" не справляется со своей задачей (а такое случается крайне редко), то приходит черед TCode, перед которой не устоит ни одно письмо, если оно, конечно, в принципе может быть прочитано. Будем надеяться, что в будущем проблема различных кодировок как-нибудь будет решена. Может быть, наилучшим решением было бы принятие всеми какой-либо кодировки как стандарта. Но это уже зависит от воли производителей программного обеспечения. Полезные советы · Если вас не устраивает максимально допустимое в Microsoft Paint увеличение рисунка, равное восьми крат, то вы можете использовать скрытую возможность этого графического редактора. Нажмите кнопку с изображением линзы, а затем кликните левой кнопкой мыши на нижней границе поля, в котором показываются возможные степени увеличения. Рисунок будет увеличен в десять раз. · Чтобы при загрузке Windows9x при необходимости проверки диска срабатывала альтернативная программа проверки диска, нужно в подпапку Command той папки, куда установлена Windows, поместить ее исполняемый файл, переименовав его в "scandisk.alt". · Для того, чтобы поместить в буфер обмена изображение экрана, воспользуйтесь клавишей PrintScreen. Комбинация клавиш Alt+PrintScreen поместит в буфер обмена изображение активного окна. · Если компьютер будет эксплуатироваться в условиях повышенной вибрации или на одном столе с ним располагается матричный принтер, то положите под системный блок поролоновый коврик толщиной 2–3 см. Позаботьтесь о своих жестких дисках — вибрация для них вредна. · Если вам нужно перенести с помощью дискет с одного компьютера на другой файл, который по размеру больше емкости дискеты, то не ищите специальных программ для «нарезки» файлов. Возьмите архиватор Rar или WinRar. В нем есть превосходная функция "создания многотомных архивов". Задайте в диалоговом окне установки параметров архива размер тома, равный размеру дискеты, а потом перепишите на дискеты созданные тома — на каждую по одному. Если на том компьютере, куда необходимо перенести файл, не установлен Rar, то создайте самораскрывающийся (SFX) — архив, — в этом случае архив будет представлять из себя программу, которая сама извлечет из себя свое содержимое. Обязательно отметьте пункт добавления "информации для восстановления" при архивации — тогда небольшие повреждения архива не скажутся на его содержимом, а лучше копируйте каждый том архива сразу на две отдельные дискеты — в этом случае вероятность одновременного неустранимого повреждения обоих томов будет минимальной. Глава 14. Секреты системного реестра Системный реестр Windows — это большая база данных, в которой записаны настройки как самой операционной системы, так и приложений, в ней установленных. Параметры устройств, сканеров, принтеров, плат расширений, находящихся в компьютере, информация о связях файлов с программами, настройки программ, расположение значков на Рабочем столе и в папках, цветовые схемы Windows, информация об открытых окнах, параметры соединений удаленного доступа и учетных записей почты, параметры сети и Интернета, информация об установленных шрифтах и многое другое, — все это хранят в себе глубины реестра. Без реестра операционная система неработоспособна. Многие компоненты реестра изменяются самостоятельно по приказам операционной системы или программ, некоторые можно настроить с помощью диалоговых окон (скажем, вроде назначения цветовой или звуковой схемы), но большая часть их недоступна для изменения из "стандартных средств" Windows. Эта глава посвящена рассказу о структуре системного реестра, о принципах работы с ним, а также содержит в себе информацию о скрытых настройках реестра, использование которых может дать вам в руки ключи власти почти над всей операционной системой. В качестве обьекта исследования взят системный реестр операционной системы Windows95/98 как устроенный более просто, чем реестр систем на платформе NT — Windows 2000 и Windows XP. Кроме того, в настоящее время в России наиболее распространенной операционной системой остается Windows98 как сочетающая в себе умеренные требования к ресурсам компьютера и удовлетворительные сервисные функции и надежность, так что нижеприведенное описание сможет пригодиться максимальному числу пользователей именно в том случае, если его обьектом станет именно Windows 95/98. Однако о реестре Windows 2000/XP упоминания в главе тоже имеются, но приводятся они лишь "для общей информации" и руководствоваться ими при непосредственных действиях по изменению параметров системного реестра не стоит. В операционных системах Windows9x физически реестр располагается в двух файлах в каталоге Windows (далее именно так будет обозначаться папка, в которую установлена операционная система — название этого каталога на вашем компьютере может быть другим) — System.dat и User.dat. Файлы System.da0 и User.da0 (на конце — цифра ноль) являются резервными копиями реестра первой очереди, которые создаются каждый раз после успешной загрузки компьютера, а в случае неудачи при загрузке могут быть помещены на место поврежденных файлов реестра. В Windows Me к указанным файлам добавился еще и файл classes.dat, являющийся тем самым третьей частью системного реестра. Сам системный реестр состоит из двух частей. Первая — файл System.dat — содержит информацию, общую для всех пользователей данного компьютера: информацию о наличии устройств, их параметры, настройки некоторых программ и др. Вторая же часть — User.dat — является специфичной для каждого пользователя, храня его настройки. Оба файла имеют атрибут «Скрытый». Если на компьютере зарегистрировано несколько пользователей, то в папке Windows\Profiles хранятся в отдельных каталогах «личные» файлы каждого: содержимое рабочего стола, главное меню и т. д… а также часть User.dat системного реестра. В папке Windows тоже хранится файл User.dat, содержащий настройки системы по умолчанию.[31 - То есть те, которые будут загружены, если в ответ на запрос имени пользователя и пароля при загрузке операционной системы Windows9x нажать клавишу Esc.] При загрузке компьютера после ввода имени пользователя файл User.dat из каталога этого пользователя вместе с System.dat и User.dat из каталога Windows загружается в память и «склеивается» с ними в единое целое. В операционных системах Windows 2000/XP файлы системного реестра хранятся в подпапке System32/Config каталога с файлами Windows. Перед тем, как начать изучение внутреннего устройства системного реестра, неплохо было бы обезопасить свою систему от крушения вследствие его возможного повреждения. Вопреки распространенному мнению, если регулярно проводить резервное копирование системного реестра, то его повреждение не нанесет существенного вреда системе.[32 - Очень много полезных советов по работе с реестром вы можете найти на сайтах Андрея Зенченко http://members.xoom.com/_vaz, Александра Рыжова http://www.akhiney. com.ua (раздел "Sovety"), Игоря Лейко http://www.redline.ru/~ipl, Дмитрия Турецкого http://www.listsoft.ru. С первых двух перечисленных сайтов доступны весьма интересные материалы "Руководство по использованию системного реестра" и "Полезные советы по работе с компьютером"] Меры предосторожности Как вы наверняка уже знаете, в случае повреждения системного реестра операционная система Windows может не суметь загрузиться. В этом случае единственным выходом будет переустановка Windows, процесс долгий и занудный. Но этого можно легко избежать, использовав универсальный способ — резервное копирование. В Windows98 резервное копирование реестра совершается автоматически. Каждый раз при успешном запуске Windows запускается программа scanregw.exe, которая копирует файлы реестра в папку Windows\Sysbckup, заархивировав их в файл типа. cab (что уменьшает их обьем раза в четыре). Кроме того, в архив с реестром помещаются файлы win.ini и system.ini, также содержащие важные настройки системы. Для восстановления реестра используется программа scanreg.exe, работающая в Режиме MS-DOS. Если на вашем компьютере установлена именно Windows98, то в случае катастрофы системы, когда при загрузке компьютера вы видите сообщение "Системный реестр поврежден" или "невозможно загрузить драйвер…" или что-нибудь еще, действия должны быть следующими: 1. Перезагрузить компьютер кнопкой Reset. 2. При загрузке компьютера держите нажатой клавишу Ctrl. В появившемся меню выберите пункт Command Prompt Only и дождитесь появления приглашения MS-DOS. Если вызвать меню загрузки таким образом не удается, то вставьте в дисковод загрузочную дискету и загрузитесь с нее. Дождитесь вывода на экран приглашения MS-DOS. 3. Введите команду scanreg /restore. Запустится программа восстановления системного реестра. Выберите желаемую копию (лучше всего наиболее позднюю, что можно определить по дате) и следуйте дальнейшим указаниям программы. 4. Перезагрузите компьютер. Все должно заработать. По умолчанию программой scanregw.exe сохраняется 5 копий реестра — от пяти последних запусков Windows. Можно сделать так, что сохраняться будет не 5, а больше (до 100) или меньше копий реестра. Для этого создайте файл scanreg.ini в каталоге с утилитами scanreg.exe и scanregw.exe и укажите там параметр MaxBackupCopies со значением, равным числу желаемых резервов (просто написав в первой строчке файла scanreg.ini строку MaxBackupCopies=число_резервов). Также можно заставить операционную систему сохранять в архивах с копиями реестра и другие файлы — просто добавьте в scanreg.ini строки Files=полный путь к файлу. Если с реестром вы экспериментируете часто и желаете отменить автоматическое резервирование реестра (чтобы не удалять наиболее старые его копии, которые могут потребоваться для его восстановления), то уберите вызов программы scanregw.exe из раздела автозагружаемых программ системного реестра (о том, где он находится — смотрите ниже), и впоследствии выполняйте ее запуск вручную. Если у вас установлена Windows95, но вы желаете воспользоваться этими утилитами, то извлеките с помощью программы WinZip 7.0 или WinRar 2.50 и выше файлы scanregw.exe и scanreg.exe из файлов. cab дистрибутива Windows98[33 - В моей копии дистрибутива они были в файлах Precopy1.cab и Win98_44.cab.] и поместите туда, куда сочтете нужным. Эти программы прекрасно работают и в этой операционной системе. При работе в Windows95 и отсутствии возможности установки утилит резервирования реестра для его архивации в Режиме MS-DOS просто скопируйте файлы реестра в какую-либо папку вне каталога Windows, а для его восстановления произведите обратную операцию, скопировав заранее зарезервированные файлы поверх испорченных в каталоге Windows. Если даже после восстановления системного реестра Windows не загрузилась — то увы, ее переустановка неизбежна. По всей видимости, в таком случае повредился какой-то системный файл, не реестр. (В этом случае ваши эксперименты над реестром не были причиной сбоя.) Вытаскивайте из папки Program Files и каталога с операционной системой все мало-мальски для вас ценное (не забудьте эвакуировать все нужное из папки "Рабочий стол", или «Desktop» в английской версии, — там находится все содержимое вашего рабочего стола, а также из каталога Profiles, если таковой существует — чтобы спасти файлы остальных пользователей, и из папки Applications Data в каталоге с Windows — там находятся папки с почтой Outlook Express, а также шаблоны Word2000), стирайте их (не забудьте предварительно снять со всех файлов в них атрибут "Только чтение", или придется подтверждать каждое удаление), удалите папку Recycled и запускайте setup.exe из каталога с дистрибутивом Windows. После установки системы и всех программ не забудьте сделать новые копии реестра. Весьма желательно после установки Windows скопировать ее дистрибутив на жесткий диск и сделать загрузочную дискету. В любом случае восстановление Windows придется вести из Режима MS-DOS, а в таком случае доступ к CD-Rom'у будет невозможен, если не загрузить драйвера для него. Последнее же сделать не всегда возможно, так что надежнее будет иметь дистрибутив Windows на жестком диске. Если вы отключите авторезервирование реестра в Windows98 или работаете с Windows95, то время от времени резервирование реестра рекомендуется повторять. Делать это надо в следующих случаях. 1. Когда вы установили новую большую программу и убедились, что она работает. Большие программные пакеты, например, Microsoft Office или Intermet Explorer, делают в реестре при своей установке большое количество записей, и могут отказаться работать, если впоследствии их не обнаружат. Если вы выполните переустановку реестра в таком случае, то вам придется переустановить и все эти программы. 2. Когда вы проводите нужное вам редактирование реестра, и оно оказывается успешным. 3. Когда вы добавляете новые учетные записи в Outlook Express, The Bat! в ftp-менеджеры и почтовые клиенты, и эти записи вам крайне необходимы. Они хранятся в системном реестре и в случае его замены — пропадут. 4. Когда вы регистрируете некоторые из программ, записывающие свой регистрационный код в реестр. В этом случае после переустановки реестра они окажутся снова нерегистрированными. Исключение составляют лишь случаи установки программ, работающих ограниченное время — в этом случае восстановление реестра из предыдущей копии в некоторых случаях позволит продлить срок их эксплуатации. 5. Когда вы внесли в конфигурацию Windows какое-нибудь важное вам изменение вроде настройки цветовой гаммы окон или звуковых схем и не хотели бы его потерять. 6. Когда вы установили новое устройство. Не нужно стремиться к какому-нибудь супер-резервированию реестра, скажем, на дискетах или на сайтах Интернета. Если у вас произошло крушение винчестера, на котором были резервные копии реестра, то Windows однозначно потребует переустановки, а в таком случае старые копии реестра потеряют свою ценность. Кроме утилиты scanregw.exe из дистрибутива Windows98, фирмой Microsoft также создано несколько утилит, которые делают то же, что и эта, но несколько более красиво. К ним относятся программы Cfgback.exe и ERU (находятся на лицензионном компакт-диске Windows). Последняя сохраняет еще и все файлы настроек и автозапуска (win.ini, system.ini, msdos.sys, autoexec.bat, config.sys). Утилиты резервирования и восстановления реестра есть и почти в любом пакете дисковых утилит вроде Nuts&Bolts. Для создания резервной копии системного реестра в Windows2000/XP необходимо загрузить компьютер с системной дискеты MS-DOS или в какой-нибудь другой операционной системе, установленной на нем (если таковая присутствует) и скопировать в отдельную папку все файлы, содержащиеся в подкаталоге system32/config той папки, куда Windows установлена. Произвести копирования файлов реестра этой операционной системы при работе в ней невозможно. Редактор реестра Сами по себе файлы реестра являются двоичными. В этом может убедиться каждый, открыв копию, скажем, User.dat в текстовом редакторе вроде Microsoft Word 6.0. Но в составе Windows есть специальная программа — Редактор реестра, которая представляет системный реестр в виде, удобном для восприятия. Это — файл regedit.exe из папки Windows. При установке операционной системы ярлык на этот файл в меню кнопки «Пуск» не появляется, так что создать его там нужно самому. При запуске программы regedit.exe (рис. 14.1) перед пользователем предстает иерархическая структура системного реестра, несколько похожая на Проводник. В левой части окна программы расположено дерево разделов реестра, а в правой отображаются параметры (другое название — "ключи") и их значения, если они присутствуют в разделе. Все разделы реестра являются подразделами пиктограммы "Моего компьютера" в окне реестра, так как при работе в сети на основе Windows есть возможность редактировать реестры на удаленных компьютерах, и если бы с помощью меню «Реестр» к данному редактору реестра был бы подключен еще и сетевой реестр, то он бы отображался в качестве подраздела пиктограмы своего компьютера. Рис. 14.1.Программа Редактор реестра. Вся навигация по реестру в Редакторе реестра аналогична таковой в «Проводнике». Единственное отличие — в правой части окна редактора реестра никогда не появляются пиктограммы разделов. Нажатиями на знак "+" или двойными кликами на пиктограммах разделов можно добраться до любого раздела и параметра. Чтобы переименовать раздел или параметр, нужно выбрать соответствующий пункт из контекстного меню или нажать F2. Изучить возможности Редактора реестра по редактированию не составит труда. В Редакторе реестра также есть возможность поиска названия раздела, параметра или значения. В Редакторе реестра имеется возможность записать всю древовидную структуру реестра в текстовый файл (с расширением. reg), например, чтобы потом ее изучить или сравнить с другой. Для этого служит команда "Экспорт файла реестра" из меню «Реестр». Есть возможность записать в текстовый файл лишь выделенный раздел, для этого нужно отметить специальный пункт в окне экспорта реестра. При редактировании реестра имейте в виду, что команды «Отменить» в Редакторе реестра нет. Так что удаление раздела или параметра необратимо. Если вы хотите посмотреть, что меняется в системном реестре под действием той или иной программы, то воспользуйтесь программой RegSnap с сайта http://webdon.com[34 - Или http://perecod.chat.ru/regsnap.rar.] ]. Она экспортирует реестр в текстовые файлы до и после действия исследуемой программы, а потом сравнит эти два файла и выяснит, какие ключи были добавлены, удалены, изменены. Обзор системного реестра Все записи в реестре подразделяются на три типа. Это разделы — некое подобие папок «Проводника»: они могут содержать в себе другие разделы и параметры. Это параметры — то, что может содержаться в разделе. Они могут быть трех типов: строковые — обычная текстовая строка, двоичные — число в двоичной системе счисления,[35 - Отображаться в Редакторе реестра оно будет в шестнадцатиричной системе счисления, а в самом реестре находиться. в двоичной.] и типа Dword — число в десятичной или шестнадцатиричной системе (вводить можно в любой — во вторую систему число преобразуется автоматически). Ну, и у параметра может быть (а может и не быть) значение — только того типа, какой допускает параметр. Если посмотреть в левое окно Редактора реестра, то может показаться, что системный реестр компьютера состоит из шести подразделов. Однако это не совсем так. Дело в том, что Редактор реестра интерпретирует содержимое реестра так, чтобы его было удобно смотреть и редактировать. В связи с этим некоторые разделы системного реестра в Редакторе дублируются. На самом деле реестр состоит всего из двух разделов — HKEY_LOCAL_MACHINE (содержится в файле System.dat) и HKEY_USERS (содержится в загруженных файлах User.dat). И именно их вы увидите, если экспортируете весь реестр в текстовый файл и его просмотрите. Так как сам реестр содержит в себе лишь два раздела, а его разложение на шесть производится исключительно в редакторе реестра (как бы "виртуальное представление" для удобства работы) то все изменения, сделанные в одном из дублированных разделов, автоматически будут сделаны и в другом — не из-за действий редактора реестра по синхронизации, а из-за того, что и тот, и другой — один и тот же раздел, просто два раза отображенный. Но — все по порядку. Сокровищница имен Раздел HKEY_CLASSES_ROOT является точной копией раздела HKEY_LOCAL_MACHINE\SOFTWARE\Classes и содержит в себе информацию о всех зарегистрированных в системе типах файлов. Именно из этого раздела берется информация для представления в окне "Типы файлов" (рис. 14.2). Но хранится информация о зарегистрированных расширениях весьма своеобразно и сложно. Вначале в разделе HKEY_CLASSES_ROOT идет список всех расширений (с точками вначале!), зарегистрированных в системе, каждое из которых является названием раздела реестра. В каждом таком разделе обязательно есть параметр "По умолчанию". В нем записано как бы «внутреннее» название расширения, которое "в ходу" у системы (рис. 14.3, слева). Рис. 14.3. Слева показано, где можно узнать «внутреннее» имя типа файлов или задать его. Ну, а справа показано, где расположено «официальное» название типа файлов. Посмотрите его также и на рис. 14.2. В разделе HKEY_CLASSES_ROOT также присутствует раздел с именем этого «внутреннего» названия расширения (расположенный ниже в окне редактора реестра), в котором находятся параметры, определяющие меню правой кнопки мыши для этого расширения. В параметре "По умолчанию" этого раздела записано «официальное» название типа файлов с таким расширением, которое, например, присутствует в списке окна "Типы файлов" (рис. 14.3, справа, также см. рис. 14.2). Рис. 14.2. Сюда поступает информация из раздела HKEY_CLASSES_ROOT В разделе, имя которое соответствует расширению с точкой вначале, также могут находиться различные параметры, определяющие интеграцию данного типа файлов в «Проводник». В частности, если создать в этом здесь раздел с именем, соответствующим внутреннему названию расширения, там — раздел с именем ShellNew, а в нем — строковый параметр NullFile (рис. 14.4, слева), то в выпадающий список "Создать файл" будет помещено «официальное» название типа файлов (рис. 14.4, справа). Так будет только в случае, если «официальное» название типа файлов присутствует в реестре, и указана программа, который этот файл открывает (см. ниже). Рис. 14.4.Создайте параметр NullFile, как показано слева, и любуйтесь на новый пункт в меню Создать, как показано справа. При выборе в этом списке этого типа файлов будет создан пустой файл с расширением, соответствующим этому «официальному» названию, и с таким же именем, что и «официальное» название. Если в папку Windows\ShellNew поместить файл с этим расширением, а в разделе ShellNew создать не параметр NullFile, а параметр FileName, и в его значении указать имя этого файла, то при выборе этого типа файлов в списке "Создать…" в текущей папке будет создана копия файла, помещенного в папку Windows\ShellNew. Кроме того, в разделе ShellNew могут также быть параметры Data и Command. В первом случае значением параметра Data должен быть набор двоичных данных, которые будут помещены в пустой файл при его создании из меню «Создать». А во втором в параметре Command может быть указан путь к какому-либо исполняемому файлу с такими параметрами командной строки, которые приводят к созданию нового файла этой программы. Так, например, создаются ярлыки из меню «Создать». Поэтому для того, чтобы почистить меню «Создать», придется потратить немало времени. Надо с помощью функции «Поиск» Редактора реестра найти в разделе HKEY_CLASSES_ROOT все разделы ShellNew, а в них — параметры «NullFile», «FileName», «Data» и «Command» и оставить среди них только нужные. Если в раздел ShellNew поместить несколько разных полей для создания файла, то выполняться их указания будут согласно приоритету в последовательности «NullFile», «FileName», «Data», "Command". В разделе (рис. 14.4, справа) с именем «внутреннего» названия расширения могут находиться разделы DefaultIcon, параметр "По умолчанию" которого определяет иконку этого типа файлов,[36 - Если в разделе, относящимся к графическому файлу, в этом параметре указать команду "%1", то при отображении такого файла в «Проводнике» вместо его иконки будет показываться уменьшенное изображение содержимого файла, как, скажем, в программе ACDSee в режиме Thumbnails. По умолчанию в Windows так сделано для самих иконок, а также для программ и курсоров.] а также раздел «shell», в котором располагаются команды контекстного меню правой кнопки мыши данного типа файлов. Название действия, которое отображается в меню правой кнопки мыши над файлом данного типа, может быть либо названием одного из подразделов раздела shell, либо значением параметра "По умолчанию" этого подраздела (в последнем случае название самого подраздела не имеет значения[37 - Именно поэтому в англоязычных версиях Windows в контекстном меню могут быть русские названия команд. Обратите, кстати, внимание — альтернативное название команды должно указываться в параметре "По умолчанию" не раздела shell, а у его подраздела, содержащего данные по соответствующей команде.]). В подразделе с именем команды контекстного меню располагается подраздел command, в параметре "По умолчанию" которого указан полный путь к программе, которая должна выполнить данное действие (рис. 14.5). Рис. 14.5.Вот место, где указывается программа, открывающая файл Если для какого-либо типа файлов параметр Default Icon не указан, то в качестве иконки для него используется стандартная иконка документа. Если же в системном реестре вообще нет указания на такой тип файлов, то для него берется иконка с изображением логотипа Windows. Все вышеизложенное несколько трудно для восприятия, но увы — это так. Приведена же здесь эта информация для того, чтобы вы поняли назначение различных групп разделов реестра. Кроме того, из данной информации есть несколько практических выводов. Во-первых — теперь вы можете свободно редактировать выпадающее меню "Создать…". Для удаления лишних пунктов оттуда надо просто провести поиск по словам FileName, NullFile и др. и удалить параметры ShellNew в тех найденных разделах, которые не нужны. Вы можете удивиться, найдя весьма много параметров FileName и NullFile, причем в разделах типов файлов, которые не присутствуют в меню "Создать…". Это чаще всего «обломки» предыдущих инсталляций программ. Дело в том, что для того, чтобы название типа файлов появилось в меню "Создать…", нужно правильное оформление всех разделов реестра, посвященных данному типу: и раздел с «внутренним» именем, и раздел shell, и в нем обязательно — раздел с именем open и т. д. Для добавления какого-либо пункта в меню "Создать…" нужно найти раздел с именем нужного расширения и добавить в него подразделы с его «внутренним» именем и именем ShellNew, а там — указать параметр NullFile (или FileName с именем файла). Ну и, естественно, проверить наличие и правильность оформления раздела с «внутренним» именем этого расширения. "Обломки" инсталляций — разделы с именами типов файлов могут, к примеру, образоваться так. Программа Microsoft Photo Editor при своей установке поместила в реестр записи о том, что файл с расширением. gif имеет «внутреннее» имя «giffile», создала под него в реестре два раздела —.gif и giffile, прописав там все, что нужно. При установке программы ACDSee она в разделе. gif заменила «внутреннее» имя этого типа на свое — ACDSee.GIF и создала под него раздел с именем "ACDSee.GIF", куда и разместила свои команды. А прежний-то раздел, «giffile», остался! Но он теперь уже не соответствует никакому типу файлов, так как ни у одного расширения нет такого «внутреннего» имени. После длительной эксплуатации системы таких обломков накапливается достаточно много. Поэтому поиск нужного раздела надо начинать именно со списка расширений, а потом уже переходить к списку «внутренних» имен, узнав нужное. В некоторых разделах, посвященных типам файлов, можно найти еще и другие разделы. Например, раздел «ddeexec» в подразделе с именем команды раздела shell какого-либо типа файлов содержит те команды DDE, которые должны использоваться. (Некоторые программы способны воспринимать команды операционной системы при открытии того или иного типа файлов и, к примеру, открывать их не в новом окне, а в своем подокне. Это называется Dynamic Data Exchange, DDE — динамический обмен данными.) В некоторых разделах встречаются параметры Content-Type. Это — указания Интернет-браузеру на тот случай, если он встретит подобный файл в Интернете. Существуют и другие возможные виды разделов, но подробное их описание выходит за рамки данной книги. Некоторые типы файлов могут быть зарегистрированы в реестре по упрощенной схеме. При ее использовании «внутреннее» имя типа файлов не указывается, а те параметры, которые должны были бы присутствовать в разделе с «внутренним» именем, находятся в разделе с именем расширения файла. Такая схема тоже работает, но все же является не совсем корректной. Каталог имеет только два «внутренних» имени и тем самым два подраздела — Folder и Directory, соответствующие его пустому и непустому состояниям. В каждом из этих подразделов содержатся команды, применяемые ко всему каталогу. В подразделе с именем "*" находятся команды, применяемые ко всем типам файлов, а в подразделе Unknown — к файлам, которые в реестре не зарегистрированы (то есть в нем нет подразделов с именами, соответствующими их расширениям). Подраздел с именем Drive соответствует логическому диску. В подразделе с «внутренним» именем типа файла может содержаться также параметр EditFlag. В зависимости от его значения запрещаются те или иные параметры редактирования действий с этим типом файлов с помощью окна Вид-Параметры-Типы файлов, вызываемого из «Проводника». Вы, наверное, замечали, что редактировать через это окно действия с каталогом или логическим диском нельзя? Так вот это именно из-за значения параметра EditFlag.[38 - Для того, чтобы разрешить редактирование параметров контекстного меню какого-либо типа файлов, защищенного от изменения таким способом, укажите в его параметре EditFlag значение 00 00 00 00 для файлов и 02 00 00 00 для каталогов и логических дисков.] В разделе HKEY_CLASSES_ROOT также имеется подраздел CLSID, едва ли не самый большой во всем реестре. Он содержит в себе информацию об обьектах операционной системы, имеющих свои идентификаторы — длинные числа в фигурных скобках, как бы большой список всех их имен. С помощью этого подраздела идет общение между различными компонентами системы, и именно он позволяет слаженно им работать и дает возможность добавлять новые обьекты. Обьектами в операционной системе может стать все, что угодно — программы, папки, компоненты программ и др. Строго говоря, обьект в программистском понимании — это все, что имеет имя и к чему можно обращаться, как к единому целому. Этой возможностью пользуются разработчики программ, интегрирующихся в систему. Служебные папки, такие, как Панель управления, Удаленный доступ к сети, Принтеры, которые вы наверняка в свое время безуспешно искали на жестком диске, являются именно такими обьектами и имеют свои идентификаторы. Идентификаторы также имеют и реальные папки, выполняющие в системе какие-либо функции, например, Рабочий стол, Корзина. Вы можете даже дать такой идентификатор какой-либо из своих папок (тогда ее, в частности, можно будет включить в окно "Мой компьютер", как показано на рисунке). Совет. Вот как это можно сделать 1. Откройте раздел реестра HKEY_CLASSES_ROOT\CLSID и добавьте туда раздел с именем {FD4DF9E0-E3DE-11CE-BFCF-….любые 12 цифр и букв…}. Тем самым вы создадите еще один идентификатор обьекта Windows. (Вообще говоря, и остальные цифры могут быть произвольными. Важно лишь, чтобы в реестре не оказалось двух одинаковых идентификаторов.) 2. Добавьте в этот раздел параметр По умолчанию = "Название папки". Здесь введите то имя, под которым вы хотите, чтобы папка отображалась в окне "Мой компьютер". 3. Добавьте в этот раздел подразделы с параметрами: — DefaultIcon и параметр по умолчанию там — путь к желаемой иконке папки. — InProcServer32 и параметр по умолчанию там — "shell32.dll", а также параметр «ThreadingModel» со значением «Apartment». — Shell, в нем подраздел с именем, соответствующим желаемому названию команды по умолчанию для папки (например, "Открыть"), а в нем подраздел Command (то есть так же, как и для любого обычного типа файлов). Введите строку "c: \windows\explorer /n / root…путь к нужной папке…" в качестве значения параметра по умолчанию в подразделе Command. Можете добавить в раздел Shell и другие команды в таком же виде. — ShellEx, в нем подраздел PropertySheetHandler, а в нем — подраздел с именем, равным имени всего раздела, который вы создали для своей папки (то есть {FD4DF9E0-E3DE-11CE-BFCF-….любые 12 цифр и букв…}). Это, впрочем, не обязательно, но желательно. — ShellFolder, а в нем — параметр Attributes со значением 0. Теперь ваша папка стала системным обьектом — таким же, как, скажем, и "Удаленный доступ к сети", «Принтеры». У нее есть свой идентификатор — это длинное выражение в фигурных скобках. Если вы добавите его в качестве имени подраздела в раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\mycomputer\NameSpace, то она появится в окне "Мой компьютер" (имя у нее там будет то, которое вы задали на шаге 2). А чтобы разместить ее на Рабочем столе, добавьте ее идентификатор рядом в раздел Desktop\NameSpace раздела Explorer. А если вместо строки "c: \windows\explorer…" указать путь к какой-нибудь программе, то тогда получится, что ярлык этой программы вы поместите в окно "Мой компьютер" и сможете запускать ее прямо оттуда! Некоторые обьекты операционной системы, кроме идентификаторов, имеют еще и словесные имена. В этом случае эти имена отображаются в качестве имен разделов в той же части HKEY_CLASSES_ROOT, что и «внутренние» имена типов файлов и содержат в себе данные об идентификаторе в одном из своих параметров. Их остальные параметры могут хранить различную служебную информацию. Совет Для того, чтобы изменить параметры (внешний вид и имя, в частности) системных иконок, найдите разделы с именами, соответствующим их идентификаторам в разделе HKEY_CLASSES_ROOT\CLSID и поменяйте нужные вам параметры в них. Вот идентификаторы некоторых из системных иконок: {20D04FE0-3AEA-1069-A2D8-08002B30309D} — "Мой компьютеp" {645FF040-5081-101B-9F08-00AA002F954E} — «Коpзина» {208D2C60-3AEA-1069-A2D7-08002B30309D} — "Сетевое окpужение" {FF393560-C2A7-11CF-BFF4-444553540000} — "History" {992CFFA0-F557-101A-88EC-00DD01 °CCC48} — "Удаленный доступ к сети" {21EC2020-3AEA-1069-A2DD-08002B30309D} — "Панель управления" {2227A280-3AEA-1069-A2DE-08002B30309D} — "Принтеры" Если в «Проводнике» вы создадите папку с именем Имя. Идентификатор, то она превратится в соответствующую папку (верно не для всех идентификаторов, скажем, новый "Мой компьютер" вам так создать не удастся). А добавив параметр InfoTip с строкой в качестве значения в один из таких разделов, можно организовать всплывающую подсказку для соответствующей папки. Добавив некоторые подобные папки в "Главное меню", можно получить весьма интересные результаты. В параметре "По умолчанию" каждого подраздела раздела CLSID располагается название обьекта, так что вы можете в какой-то степени узнать, для чего тот или иной раздел предназначен. В каждом подразделе раздела CLSID с именем, соответствующем тому или иному идентификатору, находится подраздел InprocServer или InprocServer32, в параметре "По умолчанию" которого указана библиотека,[39 - Библиотека — это файл, содержащий в себе программы, вызываемые другими программами, в том числе и операционной системой. По умолчанию имеет расширение. dll. В отличие от собственно программ библиотека не может быть запущена непосредственно.] содержащая программы работы с этим обьектом. С помощью идентификаторов можно редактировать контекстное меню правой кнопки мыши различных файлов, добавляя туда команды работы с этими файлами. Так, к примеру, происходит при установке программы WinZip, после которой в контекстном меню каждого файла и папки появляется пункт "Add to Zip". Многие антивирусные программы, например, Antiviral Toolkit Pro, позволяют вызывать их из контекстного меню какого-либо файла для проверки именно его, помещая команду своего вызова в это меню. Чтобы добавить возможность вызова программы из какой-либо библиотеки для работы с тем или иным типом файлов, в разделе CLSID создается подраздел вида {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} и как-нибудь именуется в его параметре "По умолчанию". Затем в этом подразделе создается подраздел InprocServer, а уже в его параметре "По умолчанию" указывается путь к библиотеке, в которой располагаются программы для работы с нужным типом файлов. Далее в подразделе с именем, равным «внутреннему» имени нужного типа файла или его расширению, создается подраздел ShellEx. В нем могут располагаться так называемые «обработчики» — подразделы с именами PropertySheetHandler, DropHandler и т. д., предназначенные для задания различных способов вызова программ для работы с файлами этого типа. И уже именно в них помещаются разделы (с произвольными именами, обычно отражающими названия программ, для которых они предназначены), в параметрах "По умолчанию" которых указываются соответствующие номера идентификаторов. Идентификаторы, которые указаны в параметрах "По умолчанию" подразделов раздела ContextMenuHandler, добавляют команды связанных с ними библиотек в контекстное меню правой кнопки мыши. Если добавить идентификатор в подраздел раздела DragAndDropHandler (естественно, предварительно создав сам этот раздел), то команда, соответствующая этому идентификатору, будет вызвана, когда файл того типа, для которого все это расписывается, переносится в какую-либо папку при нажатой правой клавише мыши. То, что указано в разделе DropHandler, срабатывает, когда что-либо переносится мышью на сам файл, — например, когда WinRar добавляет файл в архив при его перетаскивании на иконку архива. Если в разделе ShellEx раздела реестра с именем, соответствующим «внутреннему» имени какого-либо типа файла или его расширению, создать подраздел PropertySheetHandler, а в нем — подраздел с идентификатором в параметре "По умолчанию", то команда из библиотеки, на которую указывает этот идентификатор, выполняется при вызове пункта «Свойства» контекстного меню правой кнопки мыши файла этого типа и позволяет добавлять к окну свойств файла дополнительные вкладки. Например, так поступает программа DFolder (о ней рассказано в следующей главе), присоединяя к окну свойств папок вкладку с указанием занимаемого файлами этой папки физического места на жестком диске (рис. 14.5). Рис. 14.5. Возможность появления в меню «Свойства» каждой папки такого окна, как справа, дана параметром в разделе PropertySheetHandler, показанном слева Именно благодаря возможности использования подобных обработчиков ContextMenuHandler, PropertySheetHandler и др. программы могут изменять меню правой кнопки мыши как им необходимо. К примеру, добавлять в окно свойств окна для быстрого просмотра изображений. Причем такое окно появляется не для всех типов файлов, а только для тех, в подразделе ShellEx которых присутствует обработчик PropertySheetHandler, а в его подразделе указан нужный идентификатор, — то есть только для файлов картинок. Параметры и разделы, изменяющие контекстное меню, вносятся программами в реестр при их инсталляции или из диалоговых окон самих программ. Вряд ли, конечно, тем, кто профессионально не занимается программированием, эти данные пригодятся непосредственно в работе. Но, во всяком случае, теперь вы не будете в реестре гостем, незнакомым с местностью, а сможете понимать назначение его записей. Ну, а если когда-нибудь вы возьметесь за изучение технологии составления программ, то эта информация вам в какой-то степени поможет ее освоить. В операционных системах Windows 2000 и Windows XP данный раздел реестра устроен практически так же, как описано выше. Краткий вывод. Каждый тип файлов, зарегистрированный в системе, представлен в разделе HKEY_CLASSES_ROOT системного реестра в двух местах: 1. В начале раздела, в подразделе с именем расширения этого типа файлов с точкой вначале. Здесь приводится «внутреннее» имя этог типа файлов, а также информация о включении данного типа в меню "Создать…". 2. В подразделе с именем, соответствующим «внутреннему» имени. Здесь указывается «официальное» имя этого типа файлов, а также указывается его иконка и определяются пункты контекстного меню правой кнопки мыши для него. В реестре встречаются «обломки» предыдущих регистраций в виде подразделов с уже утратившими актуальность «внутренними» именами типов файлов. Пользовательский модуль Следующий раздел системного реестра, если идти по порядку — HKEY_CURRENT_USER. Это — информация, которая меняется от пользователя к пользователю. При входе в операционную систему под другим именем эта часть реестра будет другая. Он состоит из большого количества подразделов. В разделе AppEvents записана информация о звуковых схемах и назначенных звуках в системе. Именно здесь хранятся те данные, что вы вводите в диалоге Звук Панели управления. Раздел Clock, как нетрудно понять, посвящен часам — именно тем, что торчат в углу панели задач. Здесь — все их параметры. Раздел Control Panel содержит в себе информацию о настройках внешнего вида операционной системы. Это, пожалуй, один из самых интересных разделов реестра, так как именно здесь настраиваются разного рода «красивости» интерфейса Windows. Подраздел Appearance содержит в себе информацию о всех возможных цветовых схемах Windows. Эти схемы закладываются в реестр при его создании и именно отсюда берутся данные для окна Свойства экрана — Оформление (рис. 14.6). Рис. 14.6. А вот и схемы оформления… В подразделе Colors расположена информация об оформлении стандартных элементов интерфейса Windows — границ окон, поверхности кнопок и их краев, полос заголовка окна и прокрутки и т. д. Все цвета представлены в виде трех чисел — интенсивности их красного, зеленого и синего компонентов. Некоторые из этих параметров могут быть заданы при создании цветовой схемы, а некоторые — изменены только в реестре. Если хотите, можете немного поиграть с интерфейсом вашей системы. В подразделе Cursors хранится информация о выбранном наборе изображений курсора и о всех стандартных наборах таких изображений. Подраздел Desktop и его подразделы посвящены оформлению рабочего стола. Информация о шрифтах окон и меню, отображении полос прокрутки находится здесь. Однако большую часть параметров этого подраздела крайне желательно изменять не из редактора реестра, а из стандартных диалоговых окон, так как, в частности, запись используемых шрифтов здесь ведется в своем особом формате. Некоторые параметры вполне могут корректироваться и впрямую в реестре — скажем, если вы хотите удалить пароль скринсейвера, поставьте значение параметра ScreenSaveUsePassword в 0 (сам пароль хранится в параметре ScreenSave_Data). Другие подразделы раздела Control Panel имеют чисто служебное значение. Там могут храниться данные о назначении кнопок мыши и т. д. Раздел Identities, если он у вас есть, используется почтовой программой Outlook Express для хранения информации об имеющихся идентификационных записях (попросту — своих пользователях). Здесь расположены настройки Outlook Express для каждого из пользователей, каждому из которых отведен свой подраздел. Например, в одном из многочисленных подразделов раздела Identities можно найти параметр WindowTitle (а можно и не найти). Именно в нем записана та строка, которая отображается в заголовке Outlook Express, на самой верхней синей полосе окна. Также в этом разделе хранится информация о всех учетных записях почты и новостей всех пользователей Outlook Express, за исключением активного — того, на которого Outlook Express была настроена при последнем выходе из этой программы. Раздел Keyboard layout посвящен раскладкам клавиатуры, а InstallLocationsMRU — путям к некоторым драйверам. Оба раздела — чисто служебные и особого интереса не представляют. В разделе Network находятся параметры локальной сети, если компьютер к ней подключен. Изменять параметры всех этих разделов из редактора реестра не стоит. В разделе RemoteAccess записаны параметры соединений удаленного доступа: имена соединений, телефоны и некоторые настройки. Однако паролей, столь часто интересующих хакеров, тут нет — они хранятся в файлах. pwl в папке Windows в зашифрованном виде. В HKEY_CURRENT_USER могут быть и другие разделы, созданные разными установленными программами. И, наконец, последний и наиболее обширный раздел — это раздел Software. Параметры установленных программ — в том числе и самой Windows! Однако свои параметры в этот раздел пишут не все программы, а лишь те, которые поддерживают многопользовательский режим, то есть допускают различные свои настройки для разных пользователей Windows. (Остальные размещают свои данные в аналогичном разделе ключа HKEY_LOCAL_MACHINE.) В самом разделе Software полагается помещать не подразделы с названиями программ, а подразделы с названиями их фирм-производителей, а уже лишь в них — названия программ. (Это, впрочем, не обязательно для соблюдения программистами.) В подразделе Microsoft расположены настройки установленных на компьютере программ, выпущенных этой фирмой. В его подразделе Internet Account Manager находятся настройки учетных записей текущего пользователя программы Outlook Express. Рядом с ним можно видеть подраздел с именем этой программы, тоже полный всяческих настроек. При смене текущего пользователя Outlook Express содержимое этих разделов заменяется на соответствующее из раздела HKEY_CURRENT_USER\ Identities. Рядом — раздел Internet Explorer: чьи настройки там находятся, думается, ясно. Для того, чтобы через целый лес из имен программ и фирм добраться до настроек вашей операционной системы, найдите в разделе Software подраздел Microsoft, а в нем — подраздел Windows. Там откройте подраздел CurrentVersion (обычно он один). И вот — перед вами еще один блок настроек операционной системы! Количество подразделов здесь может варьировать — в зависимости от «навороченности» вашей Windows: и Internet Explorer, и MS Office могут добавить сюда пару компонентов. В подразделе Applets (ключа HKEY_CURRENT_USER\Software\ Microsoft\Windows\CurrentVersion, если вы еще не забыли) расположены настройки стандартных программ Windows. Тут и старые знакомые Defrag и FreeCell, Hearts и Paint, и System Monitor с Media Player'ом. Иногда вы можете найти параметры с названиями вроде «WindowOriginY» или просто «Y» или «X». Это — записано местоположение окна программы при последнем выходе из нее, чтобы при следующем запуске оно располагалось на том же самом месте, что и в прошлый раз. (А вас никогда эта способность Windows не удивляла?). В подразделе Internet Settings вы также встретите некоторые настройки браузера Internet Explorer. С ними особо разбираться не следует — все равно все можно настроить через диалоговые окна самого браузера. В подразделе Policies можно запретить интерфейсу Windows отображать определенные свои компоненты. Установив параметр NoNetHood раздела Explorer в 1, вы скроете пиктограмму Сетевого окружения с Рабочего стола. А установив параметр NoDispScrSavPage раздела System в 1, вы запретите отображать вкладку установки скринсейвера в Свойствах экрана, тем самым в определенной степени предотвратив чью-нибудь злую шутку по установке пароля на скринсейвер в ваше отсутствие. В принципе названия почти всех параметров в этом разделе вполне понятны. Только не ставьте параметр DisableRegistryTools в 1 — после этого вы больше regedit.exe запустить не сможете. Придется восстанавливать реестр как после краха системы или писать специальный. reg — файл для удаления этого параметра. Или искать другие редакторы реестра, созданные не Microsoft. Подраздел Run — это то место, которое вам надо посещать как можно чаще. Это — одно из двух мест в системном реестре, где прописаны пути к автозагружаемым программам. Указав здесь путь к программе, вы добьетесь того, что она будет загружаться каждый раз при запуске Windows. Этим местом часто пользуются троянские программы (те которые выполняют какие-либо вредоносные функции по отправке информации на удаленный компьютер, например, паролей для доступа в Интернет) для своего автоматического запуска при загрузке компьютера (чтобы, скажем, при установлении соединения с Интернет отправить своему создателю ветвь HKEY_CURRENT_USER\RemoteAccess вашего реестра). Поэтому если вы здесь обнаруживаете запись, ведущую на подозрительный файл — смело удаляйте или хотя бы попробуйте выяснить, откуда эта программа и что она делает. Однако это не единственное место автозапуска программ — аналогичный раздел есть и в HKEY_LOCAL_MACHINE. В составе Windows98 есть программа msconfig.exe (рис. 14.7). Она работает и в Windows95. С помощью этой программы можно просмотреть список автозагружаемых программ и удалить явно лишние. Рис. 14.7. Программа Msconfig даст вам возможность редактировать разделы Run, не запуская Редактор реестра. Расположенный рядом подраздел RunOnce отличается от подраздела Run тем, что программы, пути к которым записаны в нем, запустятся всего лишь один раз, после чего их имена отсюда будут выкинуты. Этим ключом часто пользуются деинсталляторы, — вы ведь наверняка видели сообщение деинсталлятора, что "для завершения деинсталяции требуется перезагрузка компьютера"? При этом деинсталлятор прописывает сюда код для удаления оставшихся файлов, которые до перезагрузки использовались операционной системой и потому удалены быть не могли. Трояны могут прописываться и здесь, так что регулярно просматривать этот подраздел — дело полезное. Подраздел Explorer — самый большой из всех подразделов подраздела CurrentVersion. Это — параметры, пожалуй, самой используемой программы из поставки Windows, кроме нее самой — «Проводника». В нескольких его подразделах размещается информация, местонахождение которой вы наверняка давным-давно хотели узнать. Итак — вот она. Вас никогда не интересовало, каким образом Windows сохраняет информацию о расположении значков на Рабочем столе и в папках, которые вы оставили открытыми, выходя из Windows? Если интересовало — то загляните в подраздел Streams. Видите там 200 подразделов? Это — заготовки для сохранения информации о расположении значков. В некоторых из подразделов можно найти параметр ViewView. Здесь такая информация уже запомнена. Открыв этот параметр двойным щелчком мыши, можно увидеть длинное шестнадцатиричное число, а справа — его «перевод» на обычный символьный язык. И среди мешанины символов будут видны (конечно, не у всех таких параметров) имена ваших файлов, находящихся в какой-то одной папке. Значит, именно в этом разделе хранится информация о расположении значков в ней. Вы можете найти раздел с параметром ViewView, содержащим имена файлов на вашем Рабочем столе, экспортировать его в файл реестра и затем импортировать обратно при необходимости восстановить расположение иконок на экране. Но такой экспорт надо будет производить после каждого важного изменения расположения или состава значков Рабочего стола. В подразделах RunMRU и Doc Find Spec MRU содержится то, что вы когда-либо вводили в окна "Выполнить…" и "Найти…" (рис. 14.8). Почистите эти разделы или, наоборот, дополните их согласно вашей необходимости, если желаете. Рис. 14.8. А вот где находится содержимое окна Пуск-Выполнить. В подразделах Shell Folders и User Shell Folders содержится информация о расположении служебных папок Windows, например, Cookies или History. Если вы пожелаете переместить их в другое место или переименовать, то внесите сюда изменения. Остальные подразделы и параметры подраздела Explorer настраивают мелкие особенности «Проводника». Большинство других подразделов подраздела CurrentVersion являются чисто служебными и особого интереса не представляют. Там записаны некоторые параметры некоторых программ из поставки Windows — и не более того. Хотя не забудьте глянуть в ProfileReconciliation, если будете через реестр менять расположение папок Cookies и History. В разделе HKEY_CURRENT_USER\Software\VB and VBA Program Settings по умолчанию располагаются настройки для всех программ, написанных на языках Visual Basic и VBA. Поэтому загляните и сюда, если вы не нашли имени интересующей вас программы в остальной части раздела Software. Возможно, вас несколько смутило, например, то, что, скажем, настройки браузера Internet Explorer находятся не в одном разделе, а разбросаны по всему ключу HKEY_CURRENT_USER, да и не только по нему. Но это, увы, так — браузер Internet Explorer очень тесно интегрируется в операционную систему и особенно в реестр. Структура данного раздела реестра в операционных системах Windows 2000 и Windows XP отличается от описанной, однако многие компоненты — параметры установленных программ, самой операционной системы, описания цветовых схем настройки экрана располагаются в реестре этих систем так же, как указано выше. Системный блок Следующий раздел реестра — HKEY_LOCAL_MACHINE, хранилище информации о вашем компьютере и о независимых от наличия различных пользователей настройках программ. Он — самый крупный и самый важный из всех разделов реестра. При этом он содержит в себе, в одном из своих подразделов и весь раздел HKEY_CLASSES_ROOT, который вынесен в отдельный ключ реестра лишь для удобства редактирования, и все возможные варианты содержимого раздела HKEY_CURRENT_CONFIG, в который помещается информация из HKEY_LOCAL_MACHINE в зависимости от текущей аппаратной конфигурации. Как HKEY_LOCAL_MACHINE в Редакторе реестра отображается файл System.dat, то есть вся информация HKEY_LOCAL_MACHINE физически содержится именно в этом файле. Таким образом, HKEY_LOCAL_MACHINE — первый из описанных «реальный» раздел реестра, то есть имеющий под собой "физическую природу" — файл System.dat. (HKEY_CLASSES_ROOT и HKEY_ CURRENT_CONFIG — его подразделы, а HKEY_CURRENT_USER — подраздел HKEY_USERS, второго «реального» раздела реестра). Подраздел Config содержит в себе данные о зарегистрированных в системе аппаратных конфигурациях. Windows позволяет при регулярных изменениях состава устройств в компьютере (например, при работе с ноутбуком, который имеет «док» — присоединяемую часть с CD-ROM, модемом и др.) не устанавливать и удалять каждый раз драйверы для всех этих устройств, а создать фиксированный набор драйверов для каждого из этих составов устройств и менять эти наборы при необходимости. Такой набор называется аппаратной конфигурацией и устанавливается через окно Панель управления — Система — Конфигурации. В настоящее время в связи с развитием новых технологий USB и др. устройств "горячего подключения" необходимость в различных аппаратных конфигурациях почти отпала, но их поддержка в Windows присутствует.[40 - В каталоге Windows есть файл tips.txt, в нем приведен пример создания нескольких аппаратных конфигураций для ноутбука.] В ключе Config под своими номерами располагаются записи о всех созданных конфигурациях, а при загрузке компьютера или изменении конфигурации соответствующий раздел «отражается» в реестре под видом раздела HKEY_CURRENT_CONFIG. Если аппаратная конфигурация одна, то и в разделе Config есть только один подраздел, совпадающий с ключом HKEY_CURRENT_CONFIG.[41 - Сами имена конфигураций, отображаемые в окне Система, хранятся в ключе HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\IDConfigDB вместе с номерами этих конфигураций.] В разделе HKEY_LOCAL_MACHINE\Config находятся и некоторые настройки операционной системы. Например, в ключе Сonfig\0001 (номер конфигурации)\display\settings указываются шрифты, используемые Windows по умолчанию, например, в «Блокноте». А в параметре Resolution этого раздела расположено указание на экранное разрешение. (Можете его поменять на любые цифры, хоть на 1000*200, и, если ваша видеокарта позволит, то именно такое разрешение экрана и будет.) Подраздел DesktopManagement посвящен работе системы с библиотекой deskmgmt.dll из каталога Windows\System, отвечающей за работу операционной системы с процессором, памятью и другими устройствами материнской платы компьютера. Здесь записаны команды, обратившись с которыми из другой программы к этой библиотеке, можно получить соответствующие данные. Подраздел Enum содержит информацию о распознанных операционной системой устройствах компьютера. В Windows 9x есть несколько важных программных компонентов, отвечающих за обнаружение устройств и предоставление их для работы другим компонентам системы. Основными среди них являются два — диспетчер конфигурации и энумератор. При загрузке компьютера диспетчер конфигурации опрашивает BIOS и получает от него информацию о всех устройствах, не поддерживающих стандарт Plug&Play, а затем заносит ее в реестр, в этот самый раздел Enum. Затем в дело вступает программа-энумератор, которая считывает из реестра информацию о не-Plug&Play устройствах, а затем опрашивает имеющиеся в компьютере Plug&Play-устройства и составляет список всех имеющихся устройств, назначив каждому единственный идентификатор — так называемый HardwareID. Затем основная роль вновь переходит к диспетчеру конфигурации, который на основании предоставляемой энумератором информации о наличии устройств и их характеристике (Plug&Play или нет) распределяет между устройствами прерывания, адреса ввода-вывода и другие ресурсы системы. В этом ему помогают специальные подпрограммы — «арбитры», которые изменяют выделяемые ресурсы так, чтобы не было ресурсов, используемых одновременно двумя устройствами. Вначале распределяются ресурсы между не-Plug&Play устройствами (информация о которых пришла еще из BIOS), а затем — между Plug&Play, так как последние умеют работать с разными настройками распределения ресурсов без изменения своей аппаратной части, и переназначить им, например, прерывания можно программно. Все внесенные изменения фиксируются в разделе Enum, а также в разделе HKEY_LOCAL_MACHINE\System\CurrentControlSet\ Services\Class, содержащем совокупность информации о распознанных устройствах, а также о загруженных для них драйверах, на подразделы с данными о которых в разделе Enum имеются ссылки. Подраздел HKEY_LOCAL_MACHINE\Hardware, несмотря на многообещающее название, хранит в себе немного информации о имеющихся последовательных портах и установленных на них модемах. Подразделы Network и Security содержат малозначащие параметры сети Microsoft Network (интересно, в России кто-нибудь хоть когда-нибудь ей пользовался?). И вот, наконец, — второй подраздел Software, на этот раз уже состоящий из универсальной для всех пользователей данного компьютера информации. Как и ранее, он состоит из разделов с именами компаний-производителей с подразделами внутри них, посвященных отдельным программам. В разделе HKEY_LOCAL_MACHINE\Software\Microsoft расположены настройки самой Windows и ее компонентов, а также всех программ Microsoft. Например, в подразделе Active Setup этого раздела находятся параметры системы установки компонентов Windows через Internet — Active Setup. В его подразделе Installed Components вы увидите все компоненты Internet Explorer, которые вы выбирали (или нет) при установке этого браузера. В подразделе Shared Tools раздела HKEY_LOCAL_MACHINE\Software\Microsoft находится список программ и библиотек пакета MS Office, которыми могут пользоваться другие компоненты этого пакета (скажем, "галерея клипов", которая может быть вызвана из любого приложения MS Office), с указанием пути к каждому из них. Но, конечно, как и в прошлый раз, самым интересным местом здесь будет подраздел Windows\CurrentVersion, относящийся к операционной системе. В самом CurrentVersion, даже не в его подразделах, есть весьма полезные параметры. Скажем, именно здесь находится информация, отображающаяся в верхней части окна Панель управления — Система — Общие. Подраздел AppPaths раздела CurrentVersion — это Windows'ский аналог параметра Path из файла autoexec.bat. Можно еще назвать его реестровым собранием ярлыков программ. Здесь можно указать пути к различным программам и имена для их запуска, а затем набирать эти имена в окне «Выполнить» для вызова этих программ, не заботясь об указании пути к ним (рис. 14.9). Рис. 14.9.Укажите в этом разделе имя для запуска программы и путь к ней и не заботьтесь о задании правильного пути в окне "Выполнить" Подраздел Explorer опять-таки посвящен программе «Проводник», но уже — ее общим настройкам. В подразделах Desktop\NameSpace и Mycomputer\NameSpace находятся идентификаторы тех обьектов, которые должны быть расположены на Рабочем столе и в папке "Мой компьютер", например, «Корзина» или "Удаленный доступ к сети". Вы можете удалить отсюда ненужные обьекты или, наоборот, добавить сюда желаемые, создав вначале для них идентификаторы в разделе HKEY_CLASSES_ROOT, как описано выше. В параметрах подразделов LastCheck и LastOptimize (подраздела Explorer подраздела CurrentVersion) содержится информация о последнем моменте дефрагментации или проверки жестких дисков компьютера. В подразделе Tips вы найдете все советы, отображающиеся при первом запуске компьютера с Windows (рис. 14.10). Их можно просмотреть и с помощью программы welcome.exe из каталога Windows. Рис. 14.10. Склад полезных советов для окна "Добро пожаловать в Windows". (Когда вы, кстати, видели это окно в последний раз?) Подраздел Fonts хранит в себе информацию об именах шрифтов и их соответствии названиям файлов. Вы, кстати, никогда не удивлялись, почему в «Проводнике» и в Norton Commander содержимое папки Windows\Fonts выглядит по-разному (рис. 14.11)? Да потому, что Norton Commander берет информацию об именах файлов в этой папке из каталога, а «Проводник» — вот из этого раздела реестра. Почему копирование шрифтов в папку Fonts длится значительно дольше, чем в любую другую папку? Да потому, что еще в реестре их все надо прописать, да еще перед этим из каждого извлечь полное имя! Еще бы не дольше было… Рис. 14.11. Сравните окна слева внизу и справа внизу. В чем причина разницы? В окне сверху. В подразделе MS-DOS Emulation, в его подразделе AppCompat находится список программ MS-DOS, которые могут работать только в "Режиме MS-DOS", а не в окне "Сеанса MS-DOS" и требуют выгрузки Windows для своей работы (рис. 14.12). Рис. 14.12.Имя этой программы было прописано здесь в реестре — и вот что вышло из попытки ее запуска. (А вы небось думали, что Windows как-то программы анализирует и думает, «пойдет» она под ней или нет? Как же…) Из следующего подраздела реестра, MS-DOS Options, берутся параметры для диалоговых окон при настройке ярлыков программ MS-DOS для особой конфигурации "Режима MS-DOS". Именно с помощью этих параметров можно удобно настроить файлы autoexec.bat и config.sys для каждого ярлыка программы, работающей в "Режиме MS-DOS". Только настраивать их, разумеется, лучше все же через Свойства ярлыка. Подразделы Run, RunServices, RunOnce, RunOnceEx, RunServicesOnce содержат в себе указания на программы, которые должны запуститься автоматически при запуске Windows. Выше уже рассказывалось про аналогичный раздел в ключе HKEY_CURRENT_USER, программы в котором запускались при начале сеанса работы данного пользователя, ну, а программы, указанные здесь, запустятся в любом случае. Почаще навещайте этот раздел — здесь могут прятаться трояны! (Три последних подраздела из перечисленных запустят указанную в них программу лишь один раз.) Именно здесь, в подразделе Run находится команда вызова программы резервирования реестра scanregw.exe. В разделе HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\Current Version\Policies, в его подразделе Ratings есть параметр Key. Сотрите его, если вы случайно в процессе исследования Microsoft Internet Explorer задали пароль на ограничение доступа к отдельным ресурсам Интернета (Свойства обозревателя — Содержание — Ограничение доступа) и благополучно забыли его. Если вы хотите изменить путь к установочным файлам Windows (например, если вы поставили Windows с компакт-диска, а затем поместили ее дистрибутив на винчестер и желаете, чтобы при любой установке драйверов или своих компонентов она обращалась именно туда), то введите в параметр SourcePath раздела HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\Current Version\Setup нужный путь. В подразделе Time Zones приведен список настроек всех возможных часовых зон из меню настройки местного времени. (Параметры же установленной временной зоны размещаются ниже, в разделе HKEY_LOCAL_MACHINE\ System\CurrentControlSet\control\TimeZoneInformation.) Подраздел Uninstall (подраздела Explorer подраздела CurrentVersion) содержит в себе пути и параметры деинсталляторов для всех программ, которые допускают такую возможность. Именно отсюда берется информация для представления в окне Панель управления — Установка и удаление программ. Параметр DisplayName определяет название программы, которое в этом окне будет отображаться. Если вы хотите напугать какого-нибудь любителя "Color Lines" или «Сапера», кто включит ваш компьютер без вашего ведома, вставьте в раздел HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows\ CurrentVersion\Winlogon параметры LegalNoticeCaption и LegalNoticeText с каким-нибудь текстом. Тогда при загрузке Windows будет отображаться окошко с этими данными (рис. 14.13). Рис. 14.13.Любителя без спросу поиграть на вашем компьютере в «Сапера» подобная надпись может здорово напугать Ну, а теперь закончим описание раздела HKEY_LOCAL_ MACHINE\Software\Microsoft\Windows\ CurrentVersion и перейдем к самому последнему подразделу ключа HKEY_LOCAL_MACHINE — System, к его единственному подразделу CurrentControlSet. В этом подразделе содержатся два ключа: Сontrol и Services. Параметры этой части реестра не менее важны, чем, скажем, подраздела Enum, так как содержат в себе многие настройки системы. Но большая их часть — чисто служебная и изменять их через редактор реестра не стоит. Впрочем, можно слегка пробежаться по наиболее интересным разделам. В подразделе FileSystem записаны некоторые параметры работы операционной системы с носителями информации с другой файловой системой вроде CD-ROM. Подраздел Keyboard layouts содержит список возможных раскладок клавиатуры и имена соответствующих им файлов с раскладками (установлены могут быть отнюдь не все эти файлы). Подраздел Nls посвящен кодовым страницам, которые поддерживаются системой. В его подразделе Codepage каждому номеру кодовой страницы (например, «1251» — кодировка Windows-1251) поставлен в соответствие файл, содержащий информацию об этой кодовой странице, а в подразделе Locale — имена этих кодовых страниц. Иногда проблемы с отображением русских символов в некоторых программах вроде AdobePhotoshop можно устранить, поставив значение параметра «1252» в разделе HKEY_LOCAL_MACHINE\System\ CurrentControlSet\control\Nls\Codepage в "CP_1251.nls". Подраздел PerfStats посвящен состоянию системы и несколько подробнее описан ниже. Подраздел SessionManager посвящен старым приложениям MS-DOS. В подразделе CheckBadApps содержится список программ MS-DOS, которые могут быть несовместимы с Windows. Наверное, вы пробовали из-под Windows запустить Norton Commander для MS-DOS и получали сообщение, что программа некорректно работает в этой операционной системе? Так вот для каждой программы MS-DOS, при попытке запуска которой выдается такое сообщение, есть свой подраздел с именем ее запускающего файла в подразделе CheckBadApps, а в нем — параметр с именем запускающего файла (рис. 14.14), в котором указано число. Это число — указатель на номер справочного раздела в файле Apps.hlp из папки Windows\Help, в котором рассказано, почему данная программа некорректно работает в Windows. Рис. 14.14. Для любой программы MS-DOS можно создать здесь раздел, и тогда при попытке ее запуска будет выводиться подобное предупреждение. Подраздел CheckBadApps400 имеет то же самое предназначение, что и предыдущий, но в нем размещены имена программ для Windows 3.х, а не для MS-DOS. Подразделы подраздела SessionManager с буквами «DLL» в имени хранят в себе имена системных библиотек, с которыми работает Windows, в зависимости от имени раздела — 16-ти или 32-х — разрядных. А в подразделе WarnVerDLLs приводятся имена библиотек, совместимость которых с Windows вызывает у нее "подозрения". Подраздел TimeZoneInformation (подраздела System\Current ControlSet\control) хранит в себе информацию о текущей временной зоне. В следующем большом подразделе HKEY_LOCAL_MACHINE\ System\CurrentControlSet\Services содержится в основном служебная системная информация. Некоторые из его подразделов очень важны для операционной системы. Подраздел Arbitrators содержит информацию программ-арбитров, о которых шла речь выше. Подраздел Class перекликается по своему содержанию с описанным выше разделом HKEY_LOCAL_MACHINE\Enum, частично беря свои данные из него, и содержит в себе информацию об установленных и распознанных устройствах. Именно из него берется информация для отображения в окне Панель управления — Система — Устройства (рис. 14.15). Рис. 14.15.Основа основ компьютера — раздел устройств. Все окно «Устройства» — здесь. И даже разбиение списка устройств на ветки в этом окне такое же, как и ключей в реестре Таким образом, этот подраздел фактически является "реестром в реестре" — базой данных по устройствам, «железу», установленным в компьютере. В него включена информация, поставляемая энумератором и диспетчером конфигурации и записанная в разделе HKEY_LOCAL_MACHINE\Enum, а также данные о загруженных драйверах устройств и их параметрах (к примеру, строка инициализации модема помещается в ключе Class\Modem\0000\Init). Вспомните, кстати, что в Enum'е были ссылки на драйвера устройств вида Driver = DiskDrive\0001. Так вот это были ссылки именно на подразделы этого раздела Class, в чем нетрудно убедиться. То есть — раздел HKEY_LOCAL_MACHINE\System\Current ControlSet\ Services\Class является основным держателем информации об устройствах компьютера, назначенных им ресурсах и загруженных для них драйверах. Именно он поставляет информацию в окно Панель управления — Система — Устройства. Раздел HKEY_LOCAL_ MACHINE\Enum тесно связан с этим разделом и хранит «технические» данные для каждого устройства. В разделе HKEY_DYN_DATA располагаются данные о текущем состоянии каждого из устройств. В разделах HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ Class и HKEY_LOCAL_MACHINE\Enum размещается информация лишь об имеющихся устройствах, об их характеристиках и назначенных ресурсах. Информация же о конкретной работе устройств, о том, исправны они или нет, находится в разделе реестра HKEY_DYN_DATA, который постоянно находится в оперативной памяти. Остальная часть раздела HKEY_LOCAL_MACHINE\System\CurrentControl Set\Services содержит данные некоторых программ и особого интереса для пользователя не представляет. В системном реестре Windows 2000/XP по сравнению с реестром Windows 9х похожую структуру имеет лишь подраздел HKEY_LOCAL_MACHINE\Software, однако настройки операционной системы, в частности, таблица соответствия имен шрифтов и их файлов, находятся не только в его подразделе Microsoft\Windows, но и в подразделе Microsoft\WindowsNT. Остальные подразделы имеют другую структуру и другое предназначение. Кроме того, к перечисленным выше местам реестра, указанные в которых программы запускаются автоматически при старте Windows, в Windows 2000/XP добавились еще параметры Userinit раздела HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows NT\CurrentVersion\Winlogon и Load раздела HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows. Общий модуль HKEY_USERS — второй «реальный» раздел реестра. Он состоит из одного или двух больших подразделов. В любом случае один из них называется. Default и является разделом HKEY_CURRENT_USER для конфигурации пользователя Windows по умолчанию (если в Windows зарегистрировано несколько пользователей, то ее можно загрузить, нажав Esc при запросе пароля на входе в Windows). Если в Windows зарегистрирован один пользователь, то раздел. Default будет единственным и совпадать с HKEY_CURRENT_USER, а если нет, то в HKEY_USERS будет еще один раздел, чье имя будет совпадать с именем текущего пользователя, и именно этот раздел будет отражен в реестре еще раз под именем HKEY_CURRENT_USER. В системном реестре Windows 2000/XP раздел HKEY_USERS тоже присутствует и выполняет ту же функцию — хранит в себе варианты раздела HKEY_CURRENT_USER для каждого из пользователей, зарегистрированных в операционной системе. Ключи конфигурации HKEY_CURRENT_CONFIG — это описание текущей конфигурации оборудования компьютера. Этот раздел является отражением одной из ветвей раздела HKEY_LOCAL_MACHINE\Config, в котором описаны все созданные в системе конфигурации оборудования. Сами эти конфигурации создаются с помощью диалогового окна Панель управления — Система — Конфигурации. Когда конфигурация меняется, меняется и содержимое раздела HKEY_ CURRENT_CONFIG — он начинает «отражать» уже другую ветвь раздела HKEY_LOCAL_MACHINE\ Config. Назначение отдельных разделов и параметров этого ключа практического интереса не представляет, так как редактировать эти данные лучше «законным» способом — с помощью диалоговых окон. Единственным следствием из всей этой информации может быть совет восстановить реестр из резервной копии, если в результате ваших экспериментов с созданием конфигураций компьютер стал неработоспособным. В системном реестре Windows 2000/XP этот раздел устроен совершенно по-другому, хоть и выполняет похожую функцию. Железный ключ HKEY_DYN_DATA — пожалуй, самый недокументированный раздел реестра. Отчасти это обьясняется тем, что данные в этом разделе создаются и корректируются автоматически. Любое вмешательство пользователя может лишь нарушить работу компьютера, — здесь нет ничего такого, что требовало бы необходимости редактирования через Редактор реестра. Интерес этот раздел представлял, скорее всего, лишь для разработчиков самой Windows на стадии ее отладки, а также, может быть, для разработчиков драйверов различных устройств компьютера. Но, так как уж он присутствует в системном реестре, то и программа regedit.exe его отображает. В отличие от всех остальных разделов, содержимое которых хранится в файлах системного реестра на жестком диске и загружается в оперативную память лишь в случае необходимости его считывания или изменения, все данные HKEY_DYN_DATA при загрузке операционной системы размещаются в оперативной памяти и находятся там вплоть до завершения работы операционной системы. В разделе HKEY_ DYN_DATA находятся два подраздела. Первый из них, HKEY_DYN_ DATA\Config Manager\ Enum посвящен состоянию «железа» компьютера. Если в разделе HKEY_LOCAL_MACHINE\System\CurrentControlSet\ Services\Class расположена информация о том, какие устройства установлены в компьютере, то в этом разделе — данные об их функционировании, о том, как они работают — исправно или нет. Информация в окне Панель управления — Система — Устройства формируется из содержимого обоих этих разделов. Второй же раздел, PerfStats — это раздел статистики. Он связан (но не является «отражением», как, скажем, HKEY_CLASSES_ROOT) с разделом HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\Perf Stats (рис. 14.16) и содержит статистическую информацию по параметрам этого раздела. Можно сказать, что в HKEY_LOCAL_ MACHINE\System\CurrentControlSet\Control\ PerfStats перечислены параметры статистики системы, а в HKEY_DYN_DATA\ PerfStats — их значения. Именно отсюда берет свои данные программа Системный монитор. Рис. 14.16. Статистический центр системы. Хотите посмотреть эти данные? Не лазьте в реестр — запустите Системный монитор, и увидите то же самое Назначение раздела HKEY_DYN_DATA — постоянно находиться в оперативной памяти и поставлять системе информацию о состоянии устройств компьютера по первому ее требованию. Чтобы в этом случае не пришлось ничего загружать в память, а все там уже было. Можно было бы, конечно, перенести всю эту информацию в раздел HKEY_ LOCAL_MACHINE, в соответствующие ключи, но тогда быстродействие системы бы серьезно замедлилось. А так — раздел не очень большой и не содержит в себе ничего, кроме данных для системы, — ни названий, ни пояснений. Чисто служебная информация. В системном реестре Windows 2000/XP данный раздел отсутствует. * * * Возможно, конечно, что Ваш реестр в деталях несколько отличается от структуры, которая была здесь описана. Это вполне естественно, так как содержимое реестра во многом зависит от набора программ, установленных на компьютере, да и от самой операционной системы. Наличие или отсутствие установленных Microsoft Internet Explorer и Microsoft Office сильно влияют на состав реестровых ключей и параметров. Но общий план — всегда одинаков. Куски реестра в файлах При экспортировании фрагмента реестра или его всего на жестком диске создается обычный текстовый файл с расширением. reg. Файл реестра имеет жестко регламентированную структуру. На рис. 14.17 показан пример раздела реестра и он же, экспортированный в текстовый файл — обратите внимание на структуру этого файла. Рис. 14.17.Фрагмент реестра, экспортированный в текстовый файл. В начале любого файла с частью реестра должна находиться строка Regedit4. Строго говоря, без этой строки файл не может считаться экспортированным фрагментом реестра и превращается в простой текстовый. Дело в том, что файл реестра может быть импортирован назад в реестр не только с помощью Редактора реестра, но и путем простого двойного клика мышью на нем. По умолчанию для файлов с расширением. reg установлена команда внесения их содержимого в реестр, если файл оформлен правильно. (Некоторые файлы с расширением. reg, содержащиеся, к примеру, в дистрибутивах каких-либо программ, могут содержать не очень корректные данные и тем самым испортить ваш реестр при внесении своего содержимого в него. Поэтому настоятельно рекомендуется в меню Вид — Параметры — Типы файлов (любой папки) найти пункт "Файл реестра" и назначить ему в качестве действия по умолчанию не обьединение с реестром, а открытие, скажем, Блокнотом. При этом опасность порчи реестра при случайном двойном клике на таком файле будет предотвращена.) Ниже команды Regedit4 находятся ключи, вносимые в реестр. Для каждого вносимого в реестр имени раздела должна быть выделена отдельная строка. Полное имя раздела (сокращения не допускаются) помещается в квадратные скобки. Имена параметров этого раздела приводятся по одному на строке, начиная за следующей сразу за именем раздела, в кавычках, рядом на той же строке — их значения. Значения строковых параметров должны приводиться в кавычках, значения параметров типа Dword — в виде шестнадцатиричной строки dword:00000000 (без кавычек), значения двоичных параметров — в шестнадцатиричной системе в виде строки hex:14,00,00,00 (без кавычек). Если в значении строкового параметра встречается символ "\", то он заменяется (в экспортированном файле реестра) на пару таких символов. Сам символ "\" используется для переноса слишком длинных строк. Имя каждого раздела или подраздела, вносимого в реестр, независимо от его иерархического расположения, должно писаться полностью и на отдельной строке. Между описаниями каждого из разделов и в конце файла должно находиться по одной пустой строке. Символ "@" соответствует параметру "По умолчанию". С помощью такого файла можно также и удалять записи из системного реестра. Для этого нужно перед именем раздела поставить знак «-»: "[-HKEY_LOCAL_MACHINE\……..]". Если хотите более подробно поисследовать формат файлов. reg — экспортируйте большой раздел в такой файл и посмотрите, что у вас получилось. Немного полезных советов 1. Если вы используете браузер Microsoft Internet Explorer, то наверняка знакомы с эмблемой Microsoft в правом верхнем углу окна браузера. Во время загрузки страницы эта эмблема вращается. Если хотите, можете заменить эмблему Windows на свой собственный символ. Создайте два bmp-файла — 38*1520 и 24*960 пикселов. В каждом из них нарисуйте последовательность кадров размером 38*38 и 24*24 пикселов, как, скажем, на рисунке: Также сделайте отдельные bmp-файлы с картинками размером в 38*38 и 24*24 пикселов. А затем пропишите пути к первым двум файлам в параметрах BrandBitmap и SmBrandBitmap раздела HKEY_CURRENT _USER\Software\ Microsoft\Internet Explorer\Toolbar, а ко вторым — в параметрах BigBitmap и SmallBitmap раздела HKEY _LOCAL_MACHINE\SOFTWARE\ Microsoft\Internet Explorer\Main. После перезагрузки браузера изображения из файлов с последовательностью кадров будут выводится в момент путешествия по Интернет, а из файлов с отдельными кадрами — при полностью загруженной web-странице. 2. В процессе работы системный реестр из-за особенностей действий с ним операционной системы обрастает лишними двоичными данными. Они не имеют никакого значения для программ, обращающихся к реестру, но занимают место. Для того, чтобы избавиться от них, загрузитесь в Режиме MS-DOS и из командной строки запустите команду regedit /e file.reg, а когда она закончит работу — команду regedit /с file.reg. При этом реестр будет экспортирован в текстовый файл, а потом загружен обратно. Все лишние двоичные данные исчезнут, а размер реестра станет меньше. Данный прием работает исключительно в среде Windows9x. Заключение. Смело — вперед! Вот и закончилась эта большая и сложная глава. Но несмотря на свои размеры, она охватила лишь очень малую часть секретов системного реестра Windows. Конечно, хотелось бы узнать поподробнее про другие разделы, выяснить наконец, где прячутся другие интересные настройки… Можно, конечно, поискать книги, полазить по Интернету. Но это все — дорого и сложно. А ведь между тем у вас есть все инструменты для того, чтобы системный реестр открывал перед вами все новые свои тайны. Этот инструмент — ваши глаза и руки, ваш разум и память. Наблюдайте, исследуйте, делайте выводы, экспериментируйте (естественно, приняв все меры предосторожности!), — и тогда вы не на чьих-то словах, а на собственном опыте узнаете многие и откроете новые секреты этого недокументированного сердца Windows — системного реестра. Глава 15. Экраны на жидких кристаллах Когда большинство людей слышат слово «компьютер», то они при этом обычно представляют себе два больших ящика, наполненных электроникой. Один из них — это системный блок. Ну, а второй — это монитор, основное устройство вывода информации. Однако монитор не всегда должен быть "большим ящиком". Вы ведь неоднократно видели ноутбуки — портативные компьютеры, и их экран представлял из себя тонкую пластинку. А сейчас во многих фирмах, поставляющих компьютерные комплектующие, появились плоские мониторы, которые можно даже повесить на стену. И наверняка вас занимал вопрос об устройстве этих экранов, тем более что в отличие от описания принципов работы электронно-лучевых трудок, использующихся в телевизорах и компьютерных мониторах, в школьной программе про такие экраны не рассказывалось. Называются эти экраны жидкокристаллическими — по основному их компоненту. По-английски это название звучит как Liquid Crystal Display, или сокращенно LCD. А действует он так. Свет, который нас окружает, как все мы может узнать из курса школьной физики, имеет и волновые свойства. В частности, у каждой его единицы — волны есть такой параметр, как направление плоскости колебания — как, скажем, у веревки, которую одним концом привязали к забору, а другой конец дергают вверх-вниз, направление плоскости колебания будет вертикальным, а если ее дергать вправо-влево, то оно будет горизонтальным. Обычный свет от лампы, Солнца, свечи содержит в себе волны со всеми направлениями колебаний. Существуют вещества с кристаллической структурой, которые обладают удивительным свойством — они способны пропускать через себя только волны света со вполне определенным направлением колебаний. В результате после прохождения пучка света через пластину из такого вещества (именуемую поляризационным фильтром) все его световые волны будут иметь одинаковое направление плоскости колебаний. Причем частотные характеристики каждой световой волны (то есть цвет пучка света) не изменятся — только немного уменьшится яркость пучка. Свет поляризуется — то есть все его волны приобретают одинаковое направление плоскости колебаний. Формируется плоскость поляризации света — то есть единственная оставшаяся плоскость, в которой происходят колебания световых волн после прохождения через поляризационный фильтр. Вещества, именуемые жидкими кристаллами, обладают двумя важными свойствами. Во-первых, при прохождении через их слой поляризованного света его плоскость поляризации поворачивается на 90 градусов. А, во-вторых, при подаче электростатического поля на слой жидких кристаллов их структура изменяется и такого поворота плоскости поляризации прошедшего через их слой света не происходит. А теперь представьте себе «бутерброд» из двух поляризационных фильтров с плоскостями поляризации, перпендикулярными друг другу, а между ними — слой жидких кристаллов. Если эта конструкция находится вне электростатического поля, то свет проходит через первый фильтр, поляризуется, поворачивает свою плоскость поляризации на 90 градусов в слое кристаллов и свободно проходит через второй фильтр. Но если на слой жидких кристаллов подать электростатическое поле, то плоскость поляризации проходящего через них света не повернется на 90 градусов и не пройдет через второй фильтр! Получится «затвор» для света — со стороны будет видно, как внезапно трехслойная конструкция стала темной, непрозрачной. Более того — если изменять напряженность электростатического поля, то прозрачность слоя из фильтров и кристаллов будет постепенно изменяться! То есть при малой напряженности поля трехслойная конструкция будет лишь слегка замутненной, при средней — достаточно темной, а при сильном поле — полностью непрозрачной. Это и понятно — ведь чем мощнее поле, тем сильнее изменяется структура кристаллов и тем большее количество молекул кристаллов изменяют свою конфигурацию. В LCD-мониторах используется именно этот эффект. Делается матрица из множества мелких жидкокристаллических ячеек. Каждые несколько (обычно три) стоящих вокруг одного центра ячеек соответствуют одному пикселу изображения. За матрицей и перед ней помещаются поляризационные фильтры с перпендикулярными направлениями поляризации. А к одному из этих фильтров прикрепляется сетка из красных, зеленых и синих светофильтров, каждый из которых точно совмещается с соответствующей ячейкой матрицы. К каждой ячейке матрицы подводится микроэлектрод для создания электростатического поля. А за всем этим сооружением размещается лампа для подсветки (рис. 15.1). Рис. 15.1. Один элемент жидкокристаллического экрана В результате, управляя прозрачностью ячеек с жидкими кристаллами с помощью подачи на них электростатического поля, можно формировать изображение. Комбинируя сочетания количества красных, зеленых и синих ячеек в каждой их группе и различную прозрачность каждой ячейки, можно получать различные цвета. Чем больше возможность регулировать напряженность электростатического поля на каждой ячейке, тем больше разных цветов может экран передавать. Для просмотра изображения на жидкокристаллическом экране не обязательно иметь подсветку. Можно использовать и отраженный свет. Только в этом случае дальний от экрана поляризационный фильтр следует заменить зеркалом. В этом случае вне действия электростатического поля свет пройдет через наружный фильтр, повернется в слое жидких кристаллов на 90 градусов, отразится от зеркала и снова пройдет через кристаллы, и в результате развернется на 180 градусов, что позволит ему вновь пройти через наружный фильтр. А при наличии на кристаллах электростатического поля этого не произойдет. Используя полупрозрачный дальний от экрана фильтр, можно сочетать работу с задней подсветкой и работу в отраженном свете. Для того, чтобы получить возможность подавать напряжение на каждую отдельную ячейку с жидкими кристаллами, под жидкокристаллическую матрицу, содержащую эти ячейки, помещается матрица такого же размера из тонкопленочных транзисторов, пропускающих свет. К каждому столбцу и строке транзисторов с края матрицы подводятся электроды. Транзисторы устроены так, что они создают электростатическое поле лишь тогда, когда и на строку, содержащую этот транзистор, и на его столбец будет подано определенное напряжение. Подавая ток на электроды строк и столбцов, можно тем самым управлять каждым транзистором. Процесс преобразования данных, посылаемых видеокартой компьютера, в сигналы транзисторам выполняет специальный преобразователь, встроенный в монитор. Нетрудно понять все трудности при разработке и производстве жидкокристаллических дисплеев. Во-первых, сделать матрицу с миллионами ячеек с одинаковым качеством нелегко — ведь экран с разрешением 1024*768 точек имеет 786432 точки-пиксела, каждый из которых состоит из трех единиц — красного, зеленого и синего субпикселов. То есть всего в экране такого разрешения должно быть 2359296 (т. е. больше двух миллионов!) жидкокристаллических ячеек. Добиться, чтобы они все полноценно работали, очень трудно — наверняка некоторые из ячеек окажутся дефектными и не будут пропускать свет. Поэтому жидкокристаллические мониторы с большим размером экрана делают из двух-трех отдельных матриц, соединяя их вместе. Для того, чтобы жидкокристаллический монитор мог передавать оттенки цветов, необходимо точно дозировать напряжение на каждой из ячеек, а транзисторы, предназначенные для этого, покамест не обладают такой возможностью. Кроме того, трудно добиться нормальной яркости изображения, особенно при работе в отраженном свете, — ведь при этом свету надо проходить через множество светофильтров. Поэтому обычный цвет LCD-экрана, работающего в отраженном свете — серый. В отличие от мониторов на электронно-лучевых трубках среди жидкокристаллических дисплеев нет двух одинаковых. Каждая матрица — уникальна. Поэтому при приобретении такого монитора следует внимательно осматривать каждый предлагаемый экземпляр на предмет качества изображения, количества дефектных ячеек. Перспективы В связи с сложностью производства, дороговизной комплектующих и хрупкостью конструкции жидкокристаллические мониторы пока не столь широко распространены, как это хотелось бы пользователям и производителям. Поэтому в последнее время ведутся разработки альтернатив LCD-дисплеям, которые, обладая их достоинствами, в то же время были бы лишены их недостатков. А основные достоинства экранов на жидких кристаллах — малая толщина, полная безвредность и высокое качество изображения. Оно не мерцает, а поэтому дает возможность работать зат монитором очень долго без усталости глаз. Но есть и недостатки — помимо стоимости и сложности, LCD-мониторы обладают слабой контрастностью и невысоким углом обзора: чтобы все цвета на таком экране были переданы правильно, на него необходимо смотреть спереди в упор. Для формирования изображения нужно выполнить две задачи. Первая — указать каждой точке картинки, каков должен быть ее цвет. И второй — сделать так, чтобы она именно в этот цвет и окрасилась. К примеру, в электронно-лучевой трубке указывает цвет обегающий экран электронный луч, а собственно его создает люминофор, нанесенный в каждой точке экрана и светящийся под влиянием луча. А в LCD-дисплеях цвет каждой точке указывает сетка электродов, располагающаяся под жидкокристаллической матрицей, а само изображение получается в результате прохождения света через эту матрицу и набор светофильтров. Задача указания каждой точке ее цвета в настоящее время решается вполне успешно, и создать сетку электродов для высокого разрешения можно. А вот вырастить матрицу с такими мелкими кристаллами непросто. Поэтому основным направлением инженерных поисков является именно разработка способов формирования изображения из точек. · В компании Xerox создается совершенно новый тип экрана для вывода информации. Такой дисплей, сейчас именуемый Gyricon, будет состоять из двух листов гибкого прозрачного материала, между которыми находятся микроскопические пластмассовые шарики. У каждого шарика один полюс заряжен положительно и окрашен черным, а другой несет противоположный заряд и окрашен в белый цвет. С помощью хитроумных технических решений на каждый шарик подается электростатическое поле нужной ориентации, в результате чего шарик поворачивается к экрану той или другой стороной. Примерно по такому же принципу работают некоторые иногда встречающиеся информационные табло в аэропортах, на вокзалах, только размеры шариков там побольше. Разработчики считают, что с помощью технологии Gyricon можно достичь такого же качества отображения текста на экране, как и на распечатке лазерного принтера (т. е. 400*600 точек на дюйм). Преимущества такой технологии очевидны — внешний вид текста ничем не будет отличаться от обычного листа бумаги, контрастность будет зависеть всего лишь от насыщенности окраски шариков. Кроме того, дисплей можно сделать гибким. Вместе с тем наличие большого количества движущихся частиц вызывает опасения за долговечность такого монитора — несмотря на масляное заполнение пространства между шариками вполне возможно нарушение их взаиморасположения. Будем надеяться, что исследователям Xerox удастся справиться со всеми этими трудностями. · Компании E Inc и Bell Labs, подразделения корпорации Lucent Technologies, в своих лабораториях разработали оригинальный способ создания изображения с помощью электрофореза. Общий принцип этой технологии таков. При электрофорезе (который, в частности, давно и успешно применяется в медицинских лабораториях для исследования белкового состава крови) на какой-либо носитель, к примеру, гель или фильтровальную бумагу, помещается смесь солей органических веществ с крупными, но разными размерами молекул, и добавляется растворитель — обычно вода. При этом соли будут диссоциировать — то есть разделяться на неорганический ион и органическую крупную молекулу. Скажем, натриевая соль какого-либо белка разделится на положительно заряженный ион натрия и отрицательно заряженный ион этого белка. Если подать на этот носитель электростатическое поле, то ионы натрия отправятся к отрицательному электроду, а ионы белков — к положительному. Но ионы тех белков, молекулы которых крупнее, будут двигаться медленнее, а ионы белков с мелкими молекулами — быстрее. В результате на носителе образуются области, в которых будут располагаться разные белки. Ближе всего к положительному электроду — легкие белки, дальше всего — тяжелые. Процесс обратим — если поменять полярность электростатического поля, то ионы белков поползут обратно. Отсюда вытекает и тот способ формирования изображения, который предложили компании E Inc и Bell Labs. На бумагу, ткань, пластик или металл помещается множество прозрачных микрокапсул со смесью солей двух белков в растворителе. Причем один из этих белков имеет большую молекулу и черный цвет, а другой — маленькую молекулу и белый цвет. Если подать на капсулу электростатическое поле, то белый белок передвинется в капсуле к тому ее концу, который окажется заряжен положительно. Скажем, если положительный заряд был подан на поверхность экрана из таких микрокапсул, то в этом месте на экране возникнет белая точка, а если на подложку — то черная. В настоящее время достигнуто разрешение 600 точек на дюйм, что соответствует распечатке неплохого струйного принтера. Преимуществами этой технологии является возможность создания контрастного и четкого изображения, а недостатком — малая скорость его обновления — около 10 кадров в секунду. В отличие от описанной выше технологии Gyricon капсулы жестко закреплены и могут располагаться на любом носителе, что повышает надежность экрана, созданного по этой «электрофорезной» технологии. (Представьте себе утреннюю газету на полотенце.) Кроме того, если создать белковые молекулы других цветов, то можно разработать и цветной дисплей — скажем, добавив на носитель капсулы со смесью пурпурного и белого, желтого и белого, голубого и белого цветов.[42 - Именно так — ведь смотреться такой дисплей будет в отраженном свете!] · Ученые английской компании Cambridge Display Technology обнаружили, что вещество полифениленвинилен может светиться желто-зеленым цветом, если его разместить между парой электродов. Ну, а от такого открытия недалеко и до разработки дисплея на основе ячеек из полифениленвинилена. Уже создан опытный образец с диагональю в 5 см. Такой дисплей светится сам и, в отличие от описанных выше двух технологий, допускает сколь угодно быструю смену кадров. То есть на электронной книге, созданной на основе полифениленвинилена, можно будет без проблем даже поиграть в Quake! В общем, через некоторое время внешний вид наших компьютеров может радикально измениться. Войдут в практику так называемые "электронные книги", то есть мини-компьютеры, состоящие фактически из экрана и памяти и предназначенные исключительно для чтения текстов. Может быть, экран можно будет вешать на стену или даже нашить на рукав одежды. Посмотрим. Из мира Интернета · Воздушные сражения с "летающими крепостями" и битвы ракетных установок с «фантомами»… Первая Русско-Израильская война, "звездная баталия" 1982 года и постановка плазменных «облаков» в космосе… Русский «нефтеград» в море юго-восточнее Сайгона и настоящий Китеж в скальных толщах Красноярска… Космические «часовые» страны и генераторы, которые делают невидимыми наши ракеты и истребители… Атаки крылатых роботов в долине Бекаа и убийственный огонь установок «Куб»… Все это не фантастика, а совершенно реальная история нашей родной страны. История Великого противостояния с Западом, длившегося почти полвека. О ней рассказывается в книге Максима Калашникова "Битва за Небеса", представленной на сайте http://sw.rus-idea.com. Вы узнаете о том, какими должны были стать воздушно-космические силы Империи 2000 года и прочтете о русских крылатых ракетах А-101, посрамителях Запада. Вы познакомитесь с планом построения страны-сверхкорпорации, которую так боялись США, услышите подробный рассказ о русской авиации 20 века. На этом сайте вы сможете прочитать главы книги, загрузить ее в архиве, приобрести в Интернет-магазине. Глава 16. Компьютерная социология Мир компьютеров многогранен и интересен. Материальная часть, программы и операционные системы, технологии Интернет и секреты программирования, — за каких-то пару десятков лет людьми оказалась создана целая вселенная, развивавшаяся гораздо быстрее почти любой науки. С компьютерами работают люди. И, несомненно, такая работа не является однонаправленной: человек, у которого основным рабочим инструментом является компьютер, в определенной степени отличается от остальных. Вследствие этого в среде «компьютерщиков» иногда возникали стихийные течения, оформляющиеся в устойчивые сообщества на основе какой-либо компьютерной профессии, увлечения или даже просто — принципов мировоззрения. Такие сообщества, достигнув большой численности, становились довольно известными. Эта статья посвящена исследованию нескольких наиболее заметных таких сообществ. Как всегда происходит в мире, разумеется, найдется многое, что в небольшой статье отражено не будет. Возможно, некоторые выводы покажутся спорными даже тем, кто сам состоит в описываемых группах. Но… не стоит возмущаться. Здесь вы найдете всего лишь возможный взгляд на весьма интересные явления в компьютерном мире. И не более. Итак — начнем мы с многогранной группы, которая неоднократно была воспета в компьютерных анекдотах. Фидошники Когда-то давно, в те годы, когда сеть Интернет была чисто специальной, военной и очень даже коммерческой, а получить доступ к ней было весьма дорого, Том Дженнингс из Лос-Анджелеса с другом Джоном Мэдиллом из Балтимора разработали весьма интересную систему маршрутизации почты, не требующую для обмена ею наличия постоянных физических соединений между компьютерами. Так возникла Fido — компьютерная сеть, отличительной чертой которой было то, что каждый входящий в нее компьютер в один момент времени мог быть соединен не более чем еще с одним таким же (об этом вы можете более подробно узнать в главе 12). Кроме того, эта сеть была некоммерческой и функционировала исключительно благодаря добросовестности и бескорыстию своих пользователей. Вследствие особенностей строения FidoNet к ее составляющим предьявлялись особые требования, которые все входящие в эту сеть добровольно выполняли беспрекословно — иначе бы функционирование FidoNet прервалось. Так, отказ узла пересылки почты влек за собой отрезание от остальной сети той части FidoNet, которая этим узлом пользовалась. Отправка в «файл-эху» (т. е. распространяемый по FidoNet набор файлов с полезными данными и программами) каким-либо неразумным пользователем многомегабайтной программы мог привести к большим проблемам у тех узлов, через которые файл этой программы бы прошел (вследствие больших затрат времени на передачу файла по модемной связи). Поэтому весьма важной чертой «фидошника», т. е. пользователя компьютера, входящего в сеть FidoNet, стала высокая ответственность за свои действия, причем обусловленная не материально, а чисто морально. Так как все связи между узлами FidoNet держались на взаимном доверии, то между «фидошниками» завязывались тесные дружеские отношения. Необходимость не совсем тривиальной настройки программ для работы в FidoNet отсеивала лиц с низким уровнем интеллекта и высоким уровнем лени. Некоммерческий характер сети FidoNet привлек в нее тех, для кого общение, свободный обмен информацией важнее получения доходов и бизнеса. В этом «фидошники» в чем-то схожи с хакерами, о которых речь пойдет дальше. Многие хакеры используют FidoNet для общения между собой, однако FidoNet состоит отнюдь не из одних хакеров. Равно как и есть немало хакеров, не знакомых непосредственно с FidoNet. Вышеупомянутые аспекты работы FidoNet и определяют поведение и в какой-то степени мировоззрение тех, кто с этой сетью работает. Традиционный «фидошник» — неплохой специалист по компьютерным технологиям, дружелюбный, ответственный и чаще всего не меркантильный. В мире «фидошников» сформировались и свой диалект, и своя субкультура. Последнее нередко находило свое отражение в анекдотах, гуляющих по компьютерному миру. Вы наверняка встретите в Сети немало высказываний о том, каким должен быть настоящий «фидошник». Например, узнаете, что "обязательный атрибут фидошника — борода", что «фидошник» без пива жить не может, а изьясняется лишь фразами типа "отдаю фреки только на зухеле" или "коннект суксь, ретрейн за ретрейном, ни одного фрека не сдаунлоадишь…" Такие, разумеется, тоже встречаются — ведь мир «фидошников» очень большой, и персоналии в нем встречаются самые разные. Однако есть немало «фидошников», не удовлетворяющих этим критериям, но в то же время являющихся полноценными составляющими этой сети. Рис. 16.1.В FidoNet можно даже поиграть… Во всяком случае, хотя бы отчасти представите себе, как вы будете там жить. Если вы хотите хотя бы приблизительно посмотреть, каково это — быть «фидошником», поиграйте в превосходную игру Юрия Нестеренко, которая так и называется — «Fido». Свежую версию вы можете скачать с сайта http://yun.complife.net, а если он окажется недоступен, то предыдущая версия лежит на http://perecod.chat.ru/fido.rar. В Интернете есть сайты, на которых можно найти полиси FidoNet (договоренности составляющих этой сети, согласно которым они работают), статьи о Fido, юмор и словари «фидошного» диалекта. Конференции Fidonet (основное средство «фидошного» массового общения) доступны и через Всемирную Сеть — например, с сайта http://www.fido-online.com. Хакеры "Ученику выдается компьютер и некоторое количество программных средств, с которыми ему в дальнейшем придется работать. Описаний к этим программам либо не выдается совсем, либо выдается минимальный набор. Если происходит обучение какому-либо языку программирования, в качестве руководства желательно использовать литературу на языке, заведомо незнакомом обучающемуся. Когда будет замечено, что ученик работает с программой (языком программирования) довольно сносно, можно предложить ему для изучения исчерпывающие руководства. Они будут прочитаны как захватывающий детектив. Затем, после небольшого периода переваривания полученных знаний, программист готов к активной деятельности." Приведенные выше слова Н.Родионова, написанные в 1990 году, как нельзя лучше подходят для характеристики подхода хакеров к окружающему миру вообще и к компьютерному в частности. В последнее время под «хакерами» часто понимают тех, кто получает несанкционированный доступ к банковским системам, взламывает web-сайты и ведет прочую разрушительную деятельность либо ради добычи денег, либо для демонстрации всем своей «крутости». К настоящим хакерам таковые не имеют никакого отношения. Путь хакера — это путь Мага. Мага, основной целью которого является Познание мира, людей, себя. Познавать мир весьма трудно в одиночку — поэтому он высоко ценит дружбу. Можно сказать, что «хакер» — это тот, кто высшей целью своей жизни ставит постижение тайн того, что он видит вокруг себя и распространение полученных знаний в мире своих собратьев. Для хакера мир полон пленительных загадок, разгадывать которые, при этом совершенствуя свои навыки и знания — для него высшее удовольствие. Вообще говоря, для этого не обязательно быть «компьютерщиком»: все настоящие ученые в какой-то мере хакеры. Хотя правильнее было бы сказать, что хакеры — это "ученые в мире компьютеров". Они точно так же постигают тайны компьютерного мира без каких-либо руководств (вернее, умеют это делать — если руководства найдутся, то хакер в целях экономии своего времени ими воспользуется, но их наличие для него необязательно), точно так же могут делать выводы и обобщения. К примеру, новый язык программирования, абсолютно незнакомый хакеру, он изучит за считанные дни — просто потому, что ранее он уже понял основные принципы устройства любого языка программирования, причем понял самостоятельно. Хакер широко использует информацию, программы, сделанные другими людьми, в том числе и в тех случаях, когда те отнюдь не желают эту информацию кому-либо предоставлять. Но делает он так не из-за стремления к взлому, разрушению, а по одной простой причине — хакер весьма высоко ценит ресурсы человеческого мозга. И поэтому повторять то, что уже сделано другими, для хакера — абсолютно противоестественный процесс. В самом деле — если кто-то написал программу, затратил свои силы, нашел решения проблем, то зачем же другим проходить опять-таки по тому же пути еще раз? Деньги за продукт своего труда хакер, разумеется, требовать может — но эти деньги для него не является самоцелью и нужны ему только для обеспечения жизни. Чтобы были пища, кров и компьютер для дальнейшего исследования окружающего мира. Хакер презирает тех, кто ставит в качестве главной цели своей жизни накопление богатства, гонку за прибылью или карьерой и считает таковых глубоко несчастными и сумасшедшими. Ведь, в самом деле, они меняют красоту мира и высоту творческого полета на копошение в грязи низких человеческих страстей и грызню с себе подобными… И поэтому хакеры — люди внутренне свободные. Они, возможно, не знают цену разных вещей — но они знают их истинную ценность. Да, хакер может и «взломать» какую-нибудь программу или удаленную систему, — но исключительно для того, чтобы обеспечить свободу распространения информации, которая, как он считает, так должна распространяться. Хакер постарается позаботиться о том, чтобы тот, кто затратил силы и время на создание информации, был достойно вознагражден, но никогда не будет способствовать "деланию бизнеса" на информации, получению из нее наживы. Хакеры не взирают на общественное положение, чины и награды людей, встречаемых ими, — ведь для них ценность человека определяется его умом и совокупностью сделанных им дел, пошедших на пользу остальным. Настоящий хакер всегда готов помочь своему собрату советом, рекомендацией или деятельной помощью. Однако его можно вывести из себя глупыми вопросами, если они покажут, что тот, кто их задает, не умеет самостоятельно думать. К примеру, хакер обьяснит начинающему, почему совокупный обьем всех файлов и папок на логическом диске меньше занятого на этом диске места, но вряд ли станет обьяснять, сколько раз надо нажать "стрелку вниз", чтобы открыть меню свойств диска в Windows. Таково мировоззрение хакеров — этой удивительной группы людей, интеллигенции компьютерного мира. Группа эта сложилась во многом стихийно — ведь те, кто имеет схожее мировоззрение, часто обьединяются на его основе. Именно хакеры разработали Unix и систему Интернета, именно они соединили континенты Всемирной Сетью и сейчас ее поддерживают и развивают. Группа эта не закрытая — в нее может влиться каждый. Весьма красивую и полную статью о том, кто такой хакер на самом деле, вы можете найти на сайте Антона Секачева — http://www.sekachev.ru, далее — по ссылкам. А принадлежит она перу Эрика Реймонда, человека, довольно известного в мире хакеров. Возможно, прочитав ее, вы вдруг обнаружите, что всю свою жизнь подсознательно следовали принципам хакеров и ваше выработанное в трудных схватках с судьбой мировоззрение поразительно похоже на то, что описано в этой статье. Что ж — в этом случае остается только вас поздравить: возможно, скоро вы найдете тех, с кем сможете вместе идти дальше по долгому и трудному пути совместного бескорыстного познания окружающего мира. Крутые Специалисты О, этих трогать опасно! Они, те, кто получил компьютерное образование, вложил немало денег в свое обучение на различных курсах и получение разнообразных сертификатов (в основном о владении программными продуктами различных фирм — на курсах, этими же самыми фирмами и организованными), кто привык тщательно воплощать чужие идеи, будучи заинтересованными лишь в получении за это крупных сумм денег, — крайне плохо относятся к тем, кто живет по иным принципам, чем они сами. Особенно не любят они тех, кто, не будучи выпускником престижного ВУЗа и не отдав ни копейки и ни цента в качестве вложения в свою будущую карьеру, самостоятельно, лишь своими мозгами и своим умением и тяжким трудом исследовал секреты компьютерных технологий и сравнялся, а то и превзошел этих "Крутых Специалистов" в умении и знаниях. Вот ведь — эти антиобщественные элементы труд свой продавать не хотят, рассматривают свою работу как искусство… Психологию сей группы можно понять. Один раз в жизни каждый из них сделал выбор той модели мира, в которой он пожелал жить, и целиком и полностью принял идеалы и принципы жизни этой модели. Выбор же их пал на мир, в котором все продается и покупается — в том числе и люди, и их труд, их жизни. Вложив немало денег в то, чтобы стать конкурентоспособным на рынке компьютерных технологий, чтобы иметь возможность себя наиболее выгодно продать, именно продать свой труд, а не поучаствовать в интересном и нужном деле, получив, разумеется за это достойное вознаграждение (чувствуете разницу в этих двух подходах?), «Специалисты» подсознательно презирают себя за этот свой поступок, зачастую не осознавая своего самопрезрения. А для того, чтобы это осознание загнать поглубже в глубины души, следует максимально ограничить контакты с теми, кто живет иначе. Например, обвиняя таковых в глупости или склонности к преступному образу жизни. Снобизм, покровительственно-презренное отношение к начинающим у них тоже присутствует, но этот снобизм отличается от хакерской нелюбви к «ламерам». Для хакера растолковывание элементарных вещей оскорбительно — не для того он проходил трудным путем познания, чтобы обьяснять, как нажимать на кнопки. «Специалист» же спокойно обьяснит «ламеру», как открыть свернутое окно — но за деньги. "Крутых Специалистов" в компьютерном мире относительно мало. В отличие от хакеров, линуксоидов они редко выступают на Интернет-форумах, в весьма малой степени проявляют себя в переписке и спорах. Их стихия — мир бизнеса. Но встреча с ними для любого, не разделяющего их принципа жизни — продавать себя и свой труд — обычно крайне неприятна. Линуксоиды Если вдуматься — не правда ли, странное название? Операционная система Linux является очень хорошим средством для решения определенного круга задач — обеспечения работы сетевых служб, научных расчетов, как база для Интернет-технологий — но разве можно быть столь горячим ее приверженцем, что даже получить наименование «линуксопоклонников»? Особенно если не самому совершенствовать Linux и предназначенные для этой ОС программы (это почти всегда возможно — программы для Linux и она сама должны распространяться с исходным кодом), а просто ими пользоваться? Оказывается — можно! Можно абсолютно все свои задачи решать с помощью Linux'а, как те, для которых эта операционная система предназначена, так и нет, путешествовать по Интернет-форумам и ругать последними словами всех тех, кто не разделяет такую горячую любовь к Linux, презрительно смотреть на тех, кто использует другие операционые системы — особенно Windows. Можно. Но… по одной простой причине. Потому что в мире существует корпорация Microsoft и созданные ею программы. Среди тех, кто любит работать с операционной системой Linux, есть те, кто одной из важных целей своей жизни сделал доказательство превосходства Linux над операционными системами Windows. Обычно таковые бывают не самыми компетентными в работе с Linux, но весьма крикливыми на Интернет-форумах и гостевых книгах. Скажем, когда на форумах www.ixbt.com обсуждается тема тонкой настройки Windows, в ней обязательно попадется пара-тройка сообщений типа "Windows — суксь, Linux — рулезь", "Кончай юзать мастдай, переходи на Linux", или даже с не совсем приличными словами. Можно спросить: а откуда, собственно, взялись «линуксоиды»? Почему бы им просто не работать с действительно неплохой и весьма грамотно спроектированной и реализованной ОС Linux и никого не критиковать за выбор другой ОС? Ответ на этот вопрос перекликается с большой темой, которая уже навязла в зубах у многих завсегдатаев сетевого общения — "Почему не любят Microsoft". В самом деле — какие серьезные претензии есть у «линуксоидов» к корпорации, которая является не самым сильным конкурентом Linux среди сетевых операционных систем и чьи руководители дальше словесных порицаний в адрес принципа открытости кода в Linux не шли? А основные претензии две. В определенной степени они перекликаются с принципами двух предыдущих описанных групп — «хакеров» и "крутых спецов". Итак, первая — это недостаточная продуманность программ от Microsoft. В то время как Linux спроектирована очень грамотно, "менеджеры среднего звена" (т. е. те, кто сам код не пишет, а занимается разработкой общих алгоритмов и отдельных элементов интерфейса) в Microsoft вместо реального удобства пользователя зачастую больше думали о коммерческом успехе и громких рекламных фразах, что не могло не привести к неудобству и неэффективности внешне эффектных компонентов ОС. (К примеру, у мыслящего лишь рекламными слоганами маркетолога могла возникнуть идея сделать «Проводник» на движке Internet Explorer. Скорость работы «Проводника» уменьшилась на порядок, количество «глюков» возросло на порядок, — зато можно так писать в проспектах и листовках "теперь ваш компьютер является частью Интернет!", Хорошо еще, можно использовать Windows95 — так нет, официально Microsoft больше эту ОС не поддерживает.) К тому же код Windows закрытый — то есть внести исправления в эти ОС могут только в корпорации-разработчике. Тем, кто работает с Linux, операционной системой, разработанной не для успешных продаж, а для быстрого и полноценного решения реальных задач, вследствие этого весьма досадно видеть, как Windows победными шагами идет по компьютерному миру. Ведь, в самом деле, если бы хотя бы часть тех ресурсов, которые сейчас тратятся на разработку новых версий Windows (на тех же «коммерческих» принципах!), была бы потрачена на совершенствование Linux, возможно, мы бы сейчас имели удобную, быструю и весьма хорошо спроектированную операционную систему. Есть и вторая причина ненависти к Windows и Microsoft, — о ней, правда, мало кто упоминает. В основном именно она вызывала массовую критику первых версий «виндов» со стороны «специалистов» компьютерного сообщества. В настоящее время данная причина во многом ушла в прошлое, хотя отголоски ее нередко можно встретить на "чисто технических" форумах. Какая это причина? А простая — "Microsoft пустила к компьютеру дилетантов". В самом деле — ранее, в «до-виндовскую» эру, работа с компьютером для непосвященного выглядела во многом чародейством. Ввод непонятных команд, настройка конфигурационных файлов (даже в MS-DOS — config.sys, к примеру), сочетания клавиш в программах и особенности командных строк, — все это узнать человеку, впервые приобретшему компьютер, было очень непросто. Большинству приходилось либо приобретать множество книг и их читать и изучать, — либо обращаться за помощью к «специалистам». Те за признание их авторитета, ящик пива или сумму в твердой валюте настраивали autoexec.bat, меню Нортона или почтовую программу. Но с появлением Windows и графического интерфейса ситуация изменилась. Любой человек, даже совершенно ранее незнакомый с компьютером, получил возможность абсолютно самостоятельно его исследовать и научиться с ним работать, — разумеется, если он умел думать и исследовать. В результате необходимость обращаться к «специалистам» по настройке Нортона или автозапуска почти отпала. Более того — Windows даже без какой-либо настройки стала доступна для выполнения нужной работы, — скажем, напечатать текст и вывести его на принтер в большинстве случаев было можно даже без установки дополнительных программ, всего лишь с помощью WordPad'а. Естественно, тех, кто не мыслил свою жизнь без конфигурационных файлов и командной строки, такая ситуация устроить не могла, — "как же так, я столько времени потратил на изучение родного MS-DOS'а, прежде чем полноценно стал с ним работать, а тут какой-то «ламер» сразу сел за «мастдай» и стал работать, не прибегнув к моим услугам!" Многие быстро освоили "новую технику" и стали специалистами уже, например, по настройке Windows. А те, кто не сумел перестроиться — стали эту ОС всячески ругать в форумах, переписке, личном общении. Linux для таких стала настоящим подарком — и мощная (действительно ведь так!), и сложная, и, самое главное, — труднонастраиваемая. Теперь можно агитировать за переход на нее всех, даже тех, кому компьютер нужен как печатная машинка, — исключительно для того, чтобы те могли обращаться к «специалистам» за необходимыми консультациями. К счастью, тех, кто "не любит Microsoft" по второй описанной причине, осталось мало. В мире компьютеров не очень разумные люди не приживаются. Поэтому основной претензией к Microsoft от «линуксоидов» является все же именно недовольство принципами построения и разработки операционных систем Windows, а также распространенностью этих ОС и количеством вложенных в них средств. Сайты «линуксоидов» довольно часто можно встретить в Сети, если производить целенаправленный поиск документации по Linux или программного обеспечения для этой ОС. Зачастую на них находится немало полезной информации, однако дух противления Microsoft присутствует почти всегда. * * * Четыре описанных устойчивые группы хотя и не определяют мировоззрения большей части компьютерного сообщества, все же довольно распространены. Они являются довольно устойчивыми течениями, так как их структура, принципы во многом вызваны условиями, в которых они формировались. Так, если бы FidoNet могла функционировать даже в тех условиях, когда, скажем, половина ее составляющих свои бы обязанности выполнять перестала, то вряд ли дружеские отношения среди «фидошников» были бы столь серьезными. Если бы операционные системы от Microsoft были бы рассчитаны на удовлетворение реальных потребностей пользователей, а не на "наилучшую продажу", если бы нужные пользователям функции не приносились бы в них в жертву внешнему блеску и удобству для не очень умных покупателей, то, возможно, «линуксоиды» были бы не агрессивными ненавистниками Windows, а просто хорошими специалистами в своем деле. Изучать общественные течения — дело интересное и полезное. Тем более что для этого не нужно особой траты ресурсов — смотрите, наблюдайте, делайте выводы. Попробуйте отслеживать факторы, влияющие на формирование и развитие мировоззрения устойчивых общественных групп, — вы обязательно встретите немало весьма нетривиальных взаимодействий. А сделанные выводы могут помочь вам лучше познавать окружающий мир. Небольшое дополнение. Это не общественное течение, но все же…"Яблочники" Если наш, российский «компьютерщик» приедет в США, то его наверняка поразит одна вещь. В то время как в России гонка процессоров идет между Intel и Amd, операционных систем — между Linux и Windows, то, придя в американский университет, вы в 30 % случаев обнаружите на столах интернет-классов компьютеры, в которых зачастую нельзя даже засунуть принесенные вами дискеты, а если окажется можно, то все равно они работать не будут. Еще эти компьютеры разрабатываются только одной фирмой во всем мире, а на каждом из них виднеется эмблема с надкушенным красочным яблоком. Это Macintosh — компьютер, который, по мысли своих создателей, является настоящим другом и помощником человеку и умеет разговаривать с ним на понятном языке. В России Macintosh'и не прижились. И даже не столько из-за запрета на их экспорт в СССР вначале и дороговизны в дальнейшем, сколько из-за несоответствия их архитектуры русскому менталитету. Ну не потерпят наши люди систему, где все комплектующие надо покупать у одного производителя, а для их установки в большинстве случаев ехать в сервис-центр. Да еще и ОС устанавливается только одна. Однако есть в нашем мире люди, которые не мыслят свою жизнь без Macintosh'ей — как мы не мыслим свою без PC. Они, конечно, не являются чем-то вроде секты или поклонников культа, но представляют из себя довольно сплоченное общество. Во многом с Macintosh'ами работают те, кто занят в издательском деле (для таких случаев это просто идеальный компьютер), но есть и просто — любители. Их нередко можно встретить в web-конференциях, где они не дают покоя ни любителям Unix, ни любителям Windows… Хотите — прогуляйтесь по сайтам для поклонников Macintosh'ей. Это — и "Все для Macintosh" — http://www.mymac.ru, и Мак-почта — http://macbox.ru, и даже раздел «MacOS» на www.freeware.ru. Если хотите услышать Macintosh'еманов в реальном времени — посетите Форум Macintosh на том же http://www.mymac.ru, только учтите, что иной раз баталии там разгораются нешуточные. Часть III. ПРАКТИКУМ Третья часть книги, как видно из ее названия, посвящена практической работе с компьютером. Первые шесть глав рассказывают о создании Интернет-сайтов. Из них вы узнаете основы языков HTML, PHP и Javascript, познакомитесь с таблицами стилей и Dynamic HTML. В главе 18 описывается удобный инструмент сайтостроения — Script Editor из пакета Microsoft Office, а в главе 22 приводится подборка интересных приемов web-дизайна, делающих сайт красивее и удобнее. Набор тем, освещаемых в остальных главах этой части, заинтересует практически каждого, кому небезразличны компьютерные технологии. Из них вы узнаете, как защититься от воровства паролей и выявить источник нежелательных писем, как на одном жестком диске умещаются сразу несколько операционных систем и какие секреты таит в себе, казалось бы, такой известный текстовый редактор Microsoft Word. И даже если непосредственно в вашей деятельности информация этих глав не потребуется, все равно ее изучение подарит вам несколько приятных минут познания нового. Из мира Интернета · Сайт "Песни Русского Сопротивления", расположенный по адресу www.harchikov.ru — первый в RuNet'е крупный музыкальный проект патриотической направленности. На нем представлены: 1. Альбомы Александра Харчикова — известного исполнителя патриотических песен, композитора и поэта, неоднократного лауреата конкурса "Песни Сопротивления". 2. Песни в исполнении Ивана Баранова, победителя конкурса "Песни Сопротивления" в 1999 и 2001 годах. 3. Альбом "Посторонним вход запрещен" группы "28 панфиловцев". Основные темы альбома — Родина, Долг, Воинская честь. Все песни — в высококачественной оцифровке формата MP3 и доступны для свободного скачивания. Среди произведений — как известные, например, "Наша родина — Советский Союз", "Русский не сдается", так и малознакомые широкому кругу слушателей. · На сайте "Портал советской музыки", расположенном по адресу http://sovmusic.narod.ru, представлены MP3-записи песен советского времени, в основном 30-40-х годов. Встречаются раритетные записи, например, первая версия гимна СССР, составленная в 1938 году. Полезный совет Когда вы работаете на клавиатуре или с мышью, обязательно проследите, чтобы ваши локти располагались при этом на твердой поверхности на уровне клавиатуры и мыши. Иначе боль и усталость в руках будут обеспечены. Глава 17. Сайтостроение Если провести массовый опрос о том, какое технологическое новшество за последние десять лет буквально преобразило мир, то наверняка ответом будет одно слово — Интернет. И действительно, развившаяся буквально за последние даже не десять, а шесть-семь лет глобальная всемирная сеть уже прочно вошла в жизнь многих людей и стала быстрым, удобным и универсальным источником практически любой информации по очень многим отраслям технологии и культуры. Количество источников информации в этой Сети растет в геометрической прогрессии: на настоящий момент обьем текстовой информации только в ее русской части составляет около тысячи гигабайт, в то время как еще даже пять лет назад российская часть Интернета была несоизмеримо меньше. Интернет — это прекрасное средство для обмена информацией между людьми. Тысячу лет назад для того, чтобы сообщить другому человеку какие-либо ценные данные, приходилось либо говорить их лично из уст в уста, либо писать от руки и передавать рукопись. Естественно, что такой способ распространения информации был медленным, сложным и дорогим. Изобретение книгопечатания несколько облегчило этот процесс, но все равно еще долгое время носители информации были весьма дороги, а охват ими населения мал. Появление газет, радио, а потом и телевидения позволило доставлять информацию относительно дешевым способом до большого количества людей. Однако то, какая информация распространяется с помощью этих средств, зависит от тех, кто с ними работает, — издателей газет, редакторов радиопередач, сотрудников телевидения. Отнюдь не всегда, особенно в последнее десятилетие, они распространяют достоверную и полезную информацию. Зачастую телевидение, газеты служат интересам своих хозяев, среди которых попадаются и преступники. Интернет же свободен от многих недостатков остальных средств распространения информации. Получение сведений из этой Сети практически не требует затрат материальных и энергетических ресурсов и обходится очень дешево. Помещать информацию в Сеть может каждый желающий. В Интернете трудно вести целенаправленные пропагандистские мероприятия или использовать манипуляцию сознанием, — создать ресурс с альтернативной информацией и распространять ее можно за весьма короткое время. В связи со всем этим использование Интернета в последнее время стало весьма активным. Количество сайтов в Сети растет очень быстро. Каждый, у кого есть какая-либо полезная информация, может легко донести ее до тех, кому она нужна. Возникает даже противоположная проблема — поиска нужной информации среди всей ее массы, но она успешно решается с помощью специализированных поисковых систем. Эта глава книги, а также несколько последующих посвящены созданию сайтов — ресурсов сети Интернет, на которых может быть размещена информация. Вы узнаете о том, как сайт должен быть устроен, как разместить его в Сети и прорекламировать. Вы также встретитесь с полезными советами по созданию сайтов, которые помогут вам сделать свой сайт красивее и удобнее, узнаете, как обойти некоторые "подводные камни" в этом деле. Рассчитана эта часть, да и вся книга, на пользователя компьютера, который знаком с информационными технологиями лишь в общих чертах, но способен самостоятельно учиться и исследовать. Но даже если вы уже знаете многое о том, что такое Интернет и как делать сайты, вы наверняка найдете в предстоящих главах какие-нибудь сведения или советы, которые были до сих пор вам неизвестны. С чего начать? Первое, о чем должен задуматься тот, кто собрался создавать свое представительство в Интернет, это вопрос: а что, собственно, я могу поместить в Сеть? Что я дам тем самым пользователям? К сожалению, в последнее время стало появляться немало сайтов, не содержащих действительно полезной информации. На них размещается, к примеру, фотография автора сайта, пара слов о том, что он любит из еды, музыки и видеофильмов и ссылки на два-три общеизвестных ресурса.[43 - Такой сайт в сетевом сообществе называется "сайтом Васи Пупкина" или, в англоязычном варианте, "John Smith's site"] Ясно, что никому из пользователей Сети такой «источник» не нужен, — там ведь обычно нет даже резюме со списком професиональных качеств автора. Причем сами авторы обычно бывают весьма активными и с непонятными целями регистрируют свои «творения» во многих поисковых системах. Желающим последовать примеру авторов этих "домашних web-страничек" следует помнить, что своей цели — "прославления имени" владельца сайта — они не достигают. Пользователь Сети, попавший на такую страничку в поисках нужной ему информации, будет очень раздражен, найдя вместо того, чего он желает, фотографию Васи Пупкина и рассказ о том, как тот любит пепси-колу и мультики. Вряд ли после этого имя Васи станет вызывать положительные эмоции. А вот вред эти сайты приносят значительный — они фактически засоряют Сеть, так как, во-первых, занимают места в поисковых системах, скрывая под своей массой ссылки на действительно нужные ресурсы, а, во-вторых, занимают хорошие имена ресурсов. Безусловно, вряд ли автор такого сайта раскошелится на платный хостинг и доменное имя второго уровня, но вот в системах бесплатного размещения сайтов эти авторы занимают весьма привлекательные имена, по сути не давая ничего пользователям. А те, кто собирается поместить в Сеть то, что нужно очень многим, увы, уже не могут создать сайт с красивым именем. Поэтому "сайты Васи Пупкина" пользуются заслуженным отвращением у большинства пользователей, и те их авторы, которые рассчитывают на поток предложений о работе, признаний в уважении и так далее, желаемого не получат никогда. Таким образом, самым первым, самым основным вопросом, который должен себе задать любой потенциальный автор сайта — это вопрос о том, что он может предложить своим посетителям. Если на сайте будет помещена программа автора или его интересная книга, — тогда вопросов нет. Естественно, нет вопросов и тогда, когда сайт является представительством какой-нибудь фирмы в Сети, особенно если на нем присутствует возможность заказа товаров через Сеть. Если сайт предназначен для помощи другим пользователям Интернета в их работе или содержит новости, полезную информацию, то это тоже неплохо. Но допустим, что интересное содержание для сайта готово. Например, набор полезных статей про экономическое положение страны или про разработку программ. Теперь необходимо создать сам сайт. * * * Основа Интернета, те «кирпичики», из которых состоит все информационное наполнение Сети — это web-страницы. Возникает закономерный вопрос: а что же это такое — web-страница, чем она отличается от любого другого документа вроде файла в формате Word или Rtf? Web-страница — это файл в особом формате — HTML (что переводится как HyperText Markup Language, то есть язык гипертекстовой разметки).[44 - Web-страница также может быть написана на XML — новом, разрабатываемом в настоящее время формате. В связи со сложностью данного формата, а также ограниченности его применения XML в данной книге рассматриваться не будет.] Подобный файл характеризуется тем, что его содержимое представляет собой текст, шрифт, размер, расположение, поведение которого определяется специальными управляющими комендами — тэгами. Кроме того, в этом формате допустима такая вещь, как гиперссылки — указатели на другие документы для быстрого перехода к ним, кроме того, возможно размещение на web-странице графических обьектов. Слово «site» означает «место». Место в сети Интернет. Сайтом называется набор web-страниц, связанных между собой перекрестными ссылками и расположенный под одним общим корневым именем. Например, http://antorlov.chat.ru. На этом сайте расположены web-страницы: verstka.htm, urls.htm, имеющие соответственно адреса http://antorlov.chat.ru/verstka.htm и http://antorlov.chat.ru/urls.htm. Но если говорить по сути, то страницы сайта обьединяет не столько единство места или имени, сколько единство содержания и возможность перехода с одной его страницы на другую. Сайт — это прежде всего информационный ресурс, и основное обьединяющее его начало — информация, находящаяся на нем. Язык Интернета Для просмотра документов в сети Интернет необходима специальная программа — браузер (browser, в переводе с английского — обозреватель). Эта программа считывает из Сети нужный документ и отображает его на экране в соответствии с расположением тэгов в документе. То есть тэги — это как бы директивы браузеру о том, как нужно отображать документ. Все современные браузеры поддерживают стандартный набор тэгов, входящий в утвержденный международными соглашениями документ — спецификацию языка HTML. В настоящее время исходный язык HTML очень серьезно усовершенствован. Кроме того, появились технологии, дающие новые возможности, такие, как JavaScript, VBScript, Dynamic HTML, каскадные таблицы стилей и др. Но основа осталась та же — стандартные тэги, которые присутствуют на всех web-страницах. Поэтому для начала стоит посвятить несколько страниц книги основам языка Интернета, а потом уже рассказать и о новых технологиях. Полный список тэгов HTML можно найти в спецификациях HTML. Достаточно большая их часть предназначена для отображения текста специальным образом (мигающим и др.) и используется редко. У многих тэгов есть свойства — специальные параметры, которые указываются в тэге и придают ему определенное значение. Все тэги HTML заключаются в угловые скобки: "<тэг>". Это и есть признак тэга — браузер интерпретирует то, что заключено в угловые скобки, как директивы отображения страницы, если это возможно, и не отображает их самих на экране.[45 - Сами угловые скобки могут быть отображены на экране с помощью специальной комбинации символов.] Регистр букв в наименовании тэга значения не имеет. Практически все тэги являются парными. Это означает, что каждый тэг имеет свою "зону действия", в пределах которой он определяет вид документа. Конец зоны действия тэга обозначается им же, но без параметров и с прибавлением перед тэгом обратного слэша "/", — закрывающим тэгом. Кроме того, для тэгов, обозначающих элементы web-страницы, закрывающий тэг показывает их границы. Например, абзац текста должен иметь вид "
…текст…
". Сейчас уже вышло много книг по HTML, и они есть практически в любом отделе компьютерной литературы. Поэтому не стоит описывать здесь стандарт HTML слишком подробно, так как более развернутые описания есть в специальных изданиях. Кроме того, о назначении каждого тэга нетрудно догадаться самому, проследив соответствие cодержания Web-страницы и ее исходного текста. Вот небольшой список наиболее употребительных тэгов. У некоторых тэгов указаны параметры, влияющие на их действие, а также приведены примеры использования тэгов и их параметров. Служебные тэги без параметров Тэг Значение — Начало Web-страницы. — Различная служебная информация." и трем классам обьектов — с именами text1, text2 и risun. Если такую таблицу поместить на web-страницу, то весь текст, содержащийся в тэгах "
", будет выровнен по ширинеи окрашен в черный цвет (которому и соответствует указанный в таблице стилей номер #000000). Для того, чтобы обеспечить такое же оформление страницы без использования таблицы стилей, пришлось бы в каждом тэге "
" указывать параметр align=justify, а после тэга перед текстом ставить указание на цвет шрифта: "". Помимо увеличения размера страницы и затруднения написания ее кода это привело бы еще и к невозможности быстро поменять цвет или выравнивание всех абзацев — пришлось бы править каждый тэг. Запись о параметрах оформления стандартного тэга, содержащаяся в таблице стилей, при отображении страницы полностью эквивалентна указанию этих параметров именно в этом тэге. Поэтому если на странице, содержащей приведенную выше таблицу стилей, поставить тэг "
", то текст, оформленный тэгом "
", останется выровненным по ширине (так как такое сочетание будет эквивалентно записи "
"), а если после — "
", поэтому его использование никак не повлияет на остальные параметры вида страницы, кроме тех, что определяются заданным в этом тэге классом. Допустимо задание свойств не только тексту, но и изображениям — например, если в странице с приведенной выше таблицей стилей присвоить класс risun изображению: "", то оно будет иметь размеры, указанные в таблице (то есть здесь — высота в 10 пикселов и ширина в 20 пикселов). Если необходимо задать определенные свойства всего лишь одному элементу страницы, то необязательно выделять его в отдельный класс или создавать ради него таблицу стилей. Можно просто указать нужное свойство в тэге этого элемента с помощью параметра style, например,
задает отступ сверху в 140 пикселей только для абзаца, в тэге которого указано это свойство. Параметр style, указанный непосредственно в тэге, имеет приоритет перед параметрами в таблице стилей. Так, текст, содержащийся в тэге "
", будет выровнен по центру независимо от того, какое выравнивание было задано в таблице стилей для тэга "
". Способ задания размера шрифта в таблице стилей несколько отличается от употребляемого в тэге "". Если в качестве значения параметра "size" тэга "" может указываться число от 1 до 7, соответствующее размеру шрифта от самого маленького до самого большого, то в таблице стилей, в параметре "font-size" какого-либо элемента, допускающего его задание для себя, может быть указан либо фиксированный размер шрифта в пикселах (например, "font-size: 12 px"), который при отображении в браузере увеличить или уменьшить будет нельзя (в Microsoft Internet Explorer 5.0 это можно сделать в меню "Вид-Размер Шрифта"), либо процентное значение ("font-size: 120 %"), которое задаст размер шрифта относительно установленного в браузере (с помощью вышеуказанного меню) по умолчанию. Первый способ стоит использовать при необходимости строго задать размер букв надписи (скажем, при их размещении в ограниченной по ширине ячейке таблицы), а второй — во всех остальных случаях. Злоупотреблять первым способом указания размера шрифта — в пикселах — не стоит, так как многие пользователи предпочитают настраивать просмотр web-страниц, в том числе и размеры шрифтов, исходя из своих предпочтений, а указание размера шрифта в пикселах не даст им этого сделать. Синтаксис таблицы стилей можно посмотреть в приведенном выше примере. Все задаваемые параметры заключаются в фигурные скобки. Разделитель между параметрами — точка с запятой, разделитель между параметром и его значением — двоеточие. Перед именем определяемого класса в таблице стилей ставится точка, а перед определяемым стандартным тэгом HTML — нет. Каждый новый тэг или класс описывается с новой строки. Параметры, могущие быть заданными для каждого типа обьектов, весьма многообразны. Полный их перечень приводится в специальной литературе по таблицам стилей. Кроме того, с ним можно ознакомиться с помощью программы Microsoft Script Editor, описанной в следующей главе. Таблицу стилей можно использовать одну на несколько web-страниц. Можно даже брать ее с другого сайта. Для этого надо сохранить таблицу стилей (от тэга "" без самих этих тэгов) в текстовом файле с расширением. css и поместить этот файл на сервер, желательно в ту же самую директорию, где будут находиться сами web-страницы. В раздел "" каждой страницы надо поместить тэг "", где вместо Url поставить имя файла с таблицей стилей или путь к нему, если он находится не в той же самой директории, что и web-страницы. В этом случае при загрузке web-страницы таблица тоже будет загружена. При изменении описаний тэгов и классов в такой таблице стилей изменится внешний вид всех страниц, на которых она используется. Следует помнить, что при таком использовании таблицы стилей при сохранении пользователем web-страницы на жестком диске локального компьютера без использования функций сохранения страниц со всеми компонентами, имеющихся в последних версиях браузеров Microsoft Internet Explorer или Netscape Navigator, сохраненная web-страница полностью потеряет заданное в таблице форматирование. Это и понятно — сама же таблица тогда не будет сохранена. С помощью таблиц стилей можно задать обьектам страницы огромное количество свойств — гораздо большее, чем позволяют стандартные тэги HTML. Например, можно указать для фрагмента текста отступы от остального текста, причем эти отступы могут быть и отрицательными, что позволяет добиваться весьма оригинального вида web-страницы — c наложением фрагментов текста друг на друга. Можно сделать страницу с "водяными знаками" на заднем плане, причем без использования сложной графики в качестве фона. Пример подобной web-страницы — на рис. 17.1. Ее HTML-текст имеет следующий вид: Рис. 17.1.Пример Web-страницы, сделанной с использованием таблицы стилей.
и др. — можно вызвать диалоговое окно "Table"-"Insert Table", указать там нужные параметры таблицы, и ее пустая заготовка будет вставлена в документ, — останется только разместить рисунки и текст. Кликнув правой кнопкой мыши на каком-либо тэге и выбрав пункт Properties, можно задать параметры тэга в специальном диалоговом окне, и они будут правильно и корректно переведены на язык HTML и помещены в код.
Если в стандартном HTML не окажется средств для задания какому-либо элементу нужных свойств, то будет использован язык таблиц стилей — CSS. Тогда при выборе из контекстного меню пункта Properties отобразится не окно задания свойств тэга, а большая панель свойств Properties (рис. 18.3), где можно задать огромное количество параметров тэга. Однако следует помнить, что не все браузеры смогут эти параметры правильно проинтерпретировать. Эту панель можно вызвать и из меню View, выбрав пункт "Properties Window".
Рис. 18.3. Панель Properties редактора Script Editor.
В принципе можно везде использовать лишь средства панели Properties — тогда все без исключения тэги будут обрамлены на CSS, причем для создания страницы знать этот язык вовсе не обязательно, так как названия почти всех параметров вполне понятны даже по-английски.[50 - С помощью технологии CSS любому элементу web-страницы можно задать огромное число свойств. Доля использования старых браузеров или их простых моделей, не поддерживающих данную технологию, не превышает нескольких процентов. Вы можете изучить возможности данной технологии, задавая в Окне свойств редактора различные свойства какому-либо элементу страницы и наблюдая результат при просмотре страницы. Script Editor всегда показывает вам все возможности CSS — вам остается только выбрать желаемую. Подробнее о CSS читайте в главе 17.]
Чтобы вставить на страницу рисунок, достаточно перетащить его иконку из «Проводника» в окно Script Editor на нужное место, а потом слегка откорректировать его имя, если он находился на локальном диске.
Превосходные средства работы с Html-кодом — это лишь очень малая часть возможностей Script Editor (хотя и их вполне бы хватило на небольшой web-редактор, причем очень даже неплохой для своего класса)! Вкладка Design основного окна этой программы представляет собой полноценный WYSIWYG-редактор Web-страницы (рис. 18.4), многократно превосходящий по своим возможностям большинство других аналогов.
Рис. 18.4.Вкладка Design окна программы Script Editor. Включен режим отображения границ таблиц и непечатаемых символов.
Система генерации кода в режиме визуальной разработки в Script Editor построена очень разумно. Фактически она ничем не отличается от такой же генерации в режиме Source, когда в текст страницы попросту помещаются заранее приготовленные шаблоны из тэгов. Поэтому фрагменты кода, генерируемые Script Editor при помещении на страницу какого-либо обьекта в режиме Design, совпадают с кодом, вставляемым в документ в режиме отображения HTML-текста, что делает работу Script Editor очень корректной.
В то время как количество лишних тэгов, «мусора» у многих WYSIWYG-редакторов вроде FrontPage Express или Microsoft Word 97 достигает порой астрономической величины, а уборка их становится долгим и неприятным занятием, код, генерируемый Script Editor в режиме Design, является настолько компактным и правильным, что практически не требует последующей коррекции (разве что адреса рисунков придется подправить, так как по умолчанию указывается полный путь к ним на локальном диске). Все диалоги задания свойств элементов страницы и панель свойств элементов в режиме Design работают точно так же, как и в режиме Source. Возможности вставления таблиц, указания параметров тэгов работают как в режиме написания кода, так и в режиме визуальной разработки, просто в первом случае вы увидите, как вставляется собственно код, а во втором — соответствующий ему элемент.
При работе в режиме Design разработчику доступно огромное количество возможностей сделать свою работу максимально удобной. О таких вещах, как выпадающий список для задания вида и размера шрифта для текста или его стиля, кнопки для установки выравнивания по центру или по одной из сторон, кнопки создания нумерованных списков можно даже не упоминать — они само собой разумеются. Очень большую помощь при создании или правке макета страницы могут оказать кнопки "Отобразить границы" и "Отобразить непечатаемые символы" (см. также на рис. 18.4), расположенные с левого краю панели инструментов Design. Достаточно их нажать, чтобы вся структура страницы, сколь бы сложной она ни была, оказалась видна как на ладони.
Кнопка Absolute Mode позволит располагать новые элементы в произвольном месте страницы — их расположение будет задаваться растояниями от верхнего и левого краев документа. Реализуется такое расположение посредством использования языка CSS. Если же эта кнопка не нажата, то новый элемент будет вставлен на страницу с использованием стандартных средств Html и с учетом их ограничений.
Кнопки Foreground Color (цвет шрифта) и Background Color (цвет фона) панели инструментов Html в режиме Design вызывают очень удобные диалоговые окна задания цвета выделенного элемента или набираемого текста. Три вкладки каждого из этих окон предоставляют разработчику все возможные способы задания цвета — от непосредственного ввода значений отдельных компонентов цветов до выбора нужного цвета в "безопасной палитре" (все цвета из этого набора отображаются одинаково на любом мониторе, в любом браузере, в любой стране) или названия желаемого цвета.
Третья вкладка окна Script Editor из пакета программ Microsoft Office 2000 — Quick View — позволяет посмотреть, как будет выглядеть страница в браузере. Нет необходимости специально загружать браузер и постоянно нажимать Refresh, чтобы увидеть страницу так, как она в нем отображается. Страница в Quick View за очень небольшими отличиями (касающимися только работы скриптов) отображается так же, как и в браузере Microsoft Internet Explorer 5.0 и более старших его версиях. (В Script Editor'е из Microsoft Office XP данная вкладка отсутствует.)
Все панели инструментов Script Editor являются свободно настраиваемыми — такими же, как и в Microsoft Word. Можно свободно размещать кнопки, вызывающие те или иные команды, создавать новые панели инструментов, настраивать рабочую среду под свои требования.
Возможность многократной отмены произведенных действий и возврата отмененных реализована очень удобно (то, что она есть, само собой разумеется для web-редакторов такого класса) — в небольшом окне отображается краткое описание действий, которые можно выделить для отмены или возврата.
К сожалению, список отменяемых действий очищается при переключении в режим Quick View — по всей видимости, это вызвано ошибкой в самой программе. Будем надеяться, что в будущих версиях этот досадный недостаток будет исправлен.
Система поиска фрагментов текста тоже весьма эргономична — поле ввода текста на панели инструментов Standart (рис. 18.5). Вводишь туда нужное слово и жмешь Enter, а Script Editor сама путешествует по документу, подсвечивая найденные вхождения. И не надо никакого диалогового окна вызывать, жать комбинации клавиш или мышью двигать… Все слова, по которым проводился поиск, сохраняются, и впоследствии отображаются в выпадающем списке. Почему до этого не додумались разработчики Microsoft Word — непонятно: а ведь как бы было удобно…
Рис. 18.5. Искать в документе, открытом в Script Editor, просто. Просто введите текст в поле ввода вверху окна.
В Script Editor из Microsoft Office 2000 поиск можно вести и во всех файлах в папке, где находится открытый документ, а также в любой другой произвольной папке, включая вложенные, и даже в нескольких папках одновременно. Результат поиска выводится в виде списка файлов, рядом с именами которых показывается строка первого вхождения искомого текста, а также фрагмент файла, содержащий его. Для загрузки нужного файла в редактор достаточно кликнуть пару раз на его названии в этом списке. (Внимательнее работайте с окном «Browse» при указании директорий для поиска — не забудьте нажать кнопку "Add to list", чтобы Script Editor стал искать текст и в этой папке.) К сожалению, при разработке Microsoft Office XP эти расширенные возможности поиска из Script Editor'а были удалены.
Если страница большая, со множеством элементов, то ориентироваться в ней непросто. Желательно было бы представить ее в виде некоей структуры, «карты». И это позволяет делать Script Editor! Открыв окно "View-OtherWindow-DocumentOutline", можно получить подробнейшую схему страницы (рис. 18.6), со всеми ее иерархическими связями и компонентами. И если надо быстро перейти к какому-либо компоненту страницы, то рыться в тоннах кода нет необходимости — пара кликов на его имени в схеме, и курсор — уже на этом элементе.
Рис. 18.6. Схема web-страницы — просто подарок для дизайнера, который уже запутался в переплетениях таблиц, ссылок, рисунков…
В окне Project Explorer, которое можно вызвать из меню View, отображаются все открываемые ранее для редактирования файлы. Любой из них можно загрузить для работы двумя кликами мыши. Тоже — удобно: открыл единожды все файлы в папке с сайтом и загружай любой без поисков в диалоговых окнах или "Проводнике".
Все панели инструментов и окна являются свободно перемещаемыми по экрану. Их можно расположить как в окне Script Editor, так и в любом другом месте. Но особенно привлекает интересное техническое решение в Script Editor из Microsoft Office 2000, предложенное разработчиками редактора и помогающее быстро и удобно организовать для себя оптимальную рабочую среду. На одной из панелей инструментов (а посмотреть их список и отобразить любую можно так же, как и в Word — просто щелкнув правой кнопкой мыши в любом месте серого поля вверху окна, рядом с панелями инструментов), Windows UI, есть выпадающее меню, содержащее перечень возможных состояний рабочей среды — Debug, Design, Edit Html и др. Если выбрать какое-нибудь из них, то Script Editor само примет соответствующее состояние — будут отображены нужные и закрыты ненужные панели и окна, компоненты редактора выстроятся около краев. К примеру, при выборе состояния Edit Html отобразятся главное окно с кодом, окна Document Outline, Properties и Project Explorer — все, что нужно для полноценной работы с кодом. К сожалению, из следующей версии Script Editor'а данное меню разработчики почему-то убрали.
Всего вышеизложенного хватило бы на приличный редактор web-страниц, который занял бы достойное место на рынке. Но рассказанное — лишь малая часть возможностей этого поистине уникального инструмента для создания страниц Интернет-ресурса любой сложности, поставляемого вместе с пакетами Microsoft Office 2000 и Microsoft Office XP и, к сожалению, так мало описанного в руководствах. Особую уникальность Script Editor придает то, что помимо web-редактора он представляет из себя еще и среду программирования, по набору функций похожую на среду Visual Basic for Applications. Рассчитана эта среда на два языка — JavaScript, VBScript, а также на использование технологии Active Server Pages, которая позволяет выполнять сценарии на скриптовых языках на стороне web-сервера. С технологией ASP большинству пользователей вряд ли придется столкнуться, она используется сейчас нечасто, а вот первые два языка сценариев позволяют украсить и сделать удобной любую страницу, где бы она ни была расположена.
Те, кто уже писал макросы для Microsoft Word, найдут в Script Editor много общего с встроенным в Word редактором Visual Basic for Applications. И это понятно — Microsoft стремится создать единую среду программирования для разработки приложений на любых языках, включая в новые редакции своих продуктов лучшее из предыдущих версий. Кроме того, web-сценарии фактически представляют собой "макросы для браузера", так как они не компилируются заранее, а интерпретируются браузерами после загрузки web-страницы.
Чтобы добавить на страницу сценарий, даже не надо самому писать тэги. Можно просто кликнуть правой кнопкой мыши на нужном месте и из контекстного меню выбрать Script Block-Client (второй вариант этого меню, Server, относится к возможности реализации технологии ASP). Для более легкой ориентировки на странице, где имеется множество скриптов, очень хорошо использовать окно Script Outline (в Microsoft Office 2000 вызывается из меню View-Other Window-Script Outline, а в Microsoft Office XP — кнопкой в заголовке вышеописанного окна Document Outline), в котором перечислены все скрипты, находящиеся в документе. Чтобы перейти к нужному, достаточно пары кликов мыши (рис. 18.7), при этом курсор в окне Source установится на его начало.
Рис. 18.7.Карта сценариев web-страницы. Все четко структурировано
Если в документе есть обьекты Dynamic HTML (то есть поименованные компоненты — любому элементу web-страницы можно дать имя, включив в его тэг выражение "id=уникальное_имя" и впоследствии обращаться к этому элементу из сценариев[51 - Подробнее о Dynamic HTML читайте в главе 17.]), то окно Script Outline в Script Editor из Microsoft Office 2000 дает возможность быстро создавать заготовки обработчиков событий (то есть сценариев, описывающих какие-либо действия при наступлении какого-либо состояния страницы, браузера или обьектов — компонентов документа). Имена всех таких обьектов отображаются в Script Outline, и при необходимости создать сценарий-реакцию на какое-либо событие достаточно щелкнуть на имени нужного обьекта и выбрать нужное событие (заодно можно узнать, какие вообще события могут происходить с этим обьектом). В документ, в его раздел будет вставлена заготовка скрипта-обработчика. Имена уже существующих обработчиков выделяются жирным шрифтом и, нажав на какое-нибудь из них, можно переместиться к его коду. К сожалению, в Microsoft Office XP из Script Editor'а была убрана и эта возможность.
(Технология Dynamic Html неразрывно связана с технологиями JavaScript и VBScript. Иными словами, можно сказать, что Dynamic Html позволяет обратиться к любому обьекту на странице, а VBScript и JavaScript — что-нибудь с этим обьектом сделать. Поэтому сценарии на VBScript и JavaScript часто включают в себя элементы Dynamic Html — обращения к поименованным элементам страницы.)
В списке обьектов окна Script Outline всегда присутствуют обьекты window (то есть окно браузера) и document — сама web-страница и, соответственно, их события — загрузка, выгрузка, прокрутка и др. Само это окно доступно, разумеется, только в режиме просмотра кода.
При написании самого текста сценария Script Editor как бы «ведет» программиста по программе, подсказывая ему возможные продолжения команд. Подобная система используется в большинстве современных средств разработки приложений, так что те, кто ранее программировал на других языках, окажутся в своей привычной среде, а те, кто ранее не занимался созданием программ, получат возможность познакомиться с настоящей средой программирования.
Если программист, создавая текст сценария (то есть вводя команды в текст страницы между тэгами , напишет имя какого-либо обьекта, то Script Editor выдаст ему список возможных действий с этим обьектом (рис. 18.8).
Рис. 18.8. Создавая сценарий, думай только об алгоритме — остальное редактор тебе подскажет: и возможные продолжения команды….
Если же будет написано имя команды, то разработчику будет предоставлена краткая всплывающая справка о ее синтаксисе (рис. 18.9).
Рис. 18.9.…и ее необходимые параметры…
Сценарий — это самая настоящая программа, и, к сожалению, при ее написании ошибки практически неизбежны. В Script Editor есть мощная система отладки сценариев, мало чем уступающая аналогичным системам других сред программирования. Для того, чтобы установить местонахождение ошибки, используются "точки останова" и контрольные значения, а чтобы разобраться в сложной странице, где есть несколько скриптов, вызывающих один другой — окно стека вызова — "Call Stack". В окне редактора можно пометить с помощью мыши на сером поле у левого края окна определенные строки сценария (поставить "точку останова"), и в этом случае при загрузке страницы с этим сценарием в браузер из среды Script Editor (это можно сделать, нажав клавишу F5) в момент, когда выполнение сценария дойдет до отмеченной строки, его работа остановится и активируется окно редактора кода. Задержав в этот момент курсор мыши над какой-нибудь переменной из кода сценария, во всплывающей подсказке можно увидеть ее значение. Также значение любой переменной показывается в окне контрольных значений ("Locals").
Система отладки сценариев Script Editor очень похожа на аналигичную систему редактора Visual Basic for Applications, описанную в первой части книги.
Все имеющиеся в Script Editor из Microsoft Office 2000 окна, предназначенные для web-программирования, показаны на рис. 18.10. Отличия в Microsoft Office XP несущественны.
Рис. 18.10. Все, что нужно для полноценного программирования.
Выполнять сценарий по строкам, чтобы поточнее определить место ошибки, труда не составит — богатые возможности меню Debug (т. е. "Отладка") всегда к вашим услугам.
Всех перечисленных возможностей Script Editor с лихвой хватит подавляющему большинству разработчиков web-страниц. Те же, кто занимается web-программированием профессионально, найдут в этом редакторе практически все необходимые инструменты для создания мощных web-приложений, не описанные здесь за недостатком места, — такие, как окно просмотра процессов системы и т. д. Если пожелаете, то можете попробовать самостоятельно разобраться с возможностями Script Editor в облсти программирования, однако вам будет это гораздо проще сделать, если вы сначала познакомитесь с какой-либо средой программирования, например, редактором Visual Basic for Applications, описанным в первой части книги. В противном случае выяснить назначение некоторых инструментов будет не очень просто.
В Script Editor имеется мощная система справки с богатыми возможностями поиска нужной информации. Так же, как и, скажем, в среде Visual Basic for Applications, в случае вызова справки в то время, как курсор находится на какой-нибудь команде языка сценария она откроется на странице, посвященной именно этой команде. Страницы справочной системы красиво оформлены. При осуществлении поиска по какому-либо ключевому слову список найденных разделов выдается в порядке убывания количества его вхождений, а сами вхождения выделяются в окне справки (рис. 18.11).
Рис. 18.11. Справка — море информации по web-программированию.
Справочная система Visual Studio фактически представляет собой комплекс из нескольких подобных систем, посвященных Html, JavaScript, VBScript и технологии Active Server Pages. К сожалению, неподготовленному человеку будет трудно в ней разобраться, так как она, во-первых, написана на английском языке, а, во-вторых, представляет из себя некое «перемешение» описаний всех трех технологий, так что отделить то, что относится к простому HTML, от описаний приемов и команд ASP будет нелегко. Но редактор Script Editor представляет из себя настолько дружественную среду разработки, что HTML в нем можно освоить, даже не заглядывая в инструкции — просто сравнивая то, что рисуешь, с тем, что он пишет на страницу, и наоборот.
Безусловно, у такого крупного продукта, как Script Editor, есть и свои недостатки. Например, в той версии этой программы, что входит в состав Microsoft Office 2000, нет возможности "переноса по словам" текста страницы (Word Wrap), который есть даже в «Блокноте». Вследствие этого редактирование загруженной в редактор web-страницы, текст которой не разделен на строки, становится крайне сложной задачей. (Выходом из такого положения может стать загрузка страницы как текста в Microsoft Word или WordPad с последующим ее сохранением в том же файле как "текста с концами строк".). Впрочем, новая версия Script Editor'а из Microsoft Office XP данного недостатка лишена. Справка по языкам сценариев и Html при всем своем богатстве несколько трудна в использовании. Однако для чисто практического применения с целью создания web-страниц Script Editor подходит идеально. Тем более что этот продукт входит в стандартную поставку Microsoft Office 2000 и Microsoft Office XP и таким образом имеется на любом компакт-диске с этим пакетом программ. Просто установите Microsoft Office какой-нибудь из этих версий, и вы получите также и Script Editor, если укажете необходимость его установки в диалоговом окне инсталлятора.
К сожалению, из новой версии Script Editor'а, входящей в состав Microsoft Office XP, исключены многие удобные функции, имевшиеся в его предыдущем варианте. Появившиеся же усовершенствования в основном касаются только интерфейса программы или тонкостей ее использования при разработке сценариев (например, в новой версии есть возможность отобразить в окне программы только тексты сценариев, присутствующие на странице, или, наоборот, текст страницы без них). Впрочем, во многом обе версии редактора одинаковы.
Если вы не желаете устанавливать Microsoft Office 2000 или Microsoft Office XP, так как привыкли работать с Microsoft Office 97, но вам нужен Script Editor, то просто проинсталлируйте новую версию Microsoft Office в каталог, отличный от того, в котором расположен Microsoft Office 97, и при установке не забудьте указать необходимость сохранения старых версий программ пакета в одном из диалогов инсталлятора. Вы можете не устанавливать другие компоненты Office — Word или Excel, Script Editor будет прекрасно работать и без них. Только создайте для него ярлык на Рабочем столе (путь см. выше), чтобы не приходилось каждый раз перемещаться по папкам при необходимости его запустить.
Script Editor не будет работать, если не установлен браузер Microsoft Internet Explorer 5.0, но этот браузер устанавливается вместе с Microsoft Office 2000, и без него невозможна работа также и Office. К Script Editor можно «пристыковать» любой другой браузер, установленный на жестком диске, и просматривать страницы и в нем.
В целом можно сказать, что Script Editor сочетает в себе лучшие свойства редакторов web-страниц, как текстовых, так и типа WYSIWYG, а также полноценной среды программирования web-сценариев, что делает этот инструмент практически универсальным. Создание страниц в Script Editor — процесс приятный и увлекательный. Наконец-то у web-дизайнеров появилась возможность думать не о тэгах и командах, а о красоте и удобстве своих творений, не рискуя при этом получить перегруженный лишними тэгами «кривой» код, как это было раньше при использовании многих web-редакторов.
В свете всего вышеизложенного эту среду можно рекомендовать использовать всем — от начинающих создателей Интернет-сайтов до профессиональных web-программистов.
Глава 19. PHP: интерактивность в действии
Когда-то давно, еще в прошлом веке, для того, чтобы сделать сайт "на мировом уровне", достаточно было просто уметь делать web-страницы на HTML и обладать художественным вкусом. Спустя некоторое время требования усложнились: использование JavaScript и Dynamic HTML стало рутинным и дизайн сайта, не имеющего подобных «украшений», считался устаревшим. Вскоре правилом "хорошего тона" для корпоративного сайта стало применение сложных программ на Perl или C++, а создавать такие сайты стало по силам лишь крупным дизайнерским студиям.
Однако простые web-дизайнеры не желали мириться с такой ситуацией. И на свет появился PHP — язык программирования, обладающий возможностями сложных скриптовых языков, но в то же время удивительно простой и легкий в изучении и применении. О нем и пойдет дальше рассказ.
Определения
Web-программирование — разработка любых программных продуктов, предназначенных для работы на сайтах World Wide Web. Строго говоря, даже разработка web-страниц на чистом HTML является web-программированием, ведь при просмотре страницы браузер фактически исполняет код HTML, форматируя текст согласно инструкциям этого языка. В настоящее время под web-программированием понимают создание CGI-приложений и использование на web-странице технологий JavaScript и VBScript для достижений сложных эффектов.
Web-сервер — программа, запущенная на узле сети Интернет и выдающая посетителям этого узла web-страницы с него по их запросам. Также web-сервером часто называется узел, на котором эта программа запущена, или даже компьютер, являющийся таким узлом.
CGI (сокращение от Common Gateway Interface) — технология, позволяющая запускать на web-сервере программы, могущие получать данные от посетителей сайтов, поддерживаемых этим web-сервером, и в свою очередь выдавать им обработанные данные в виде web-страниц или других файлов. Для использования технологии CGI программа-web-сервер должна удовлетворять определенным критериям — "поддерживать CGI". Если программа, запускаемая на web-сервере, представлена не двоичным кодом (т. е. скомпилированным файлом), а текстовым, то для ее выполнения требуется программа-интерпретатор того языка, на котором написана эта программа. Такой интерпретатор включается в состав web-сервера и вызывается им при необходимости заняться выполнением программного кода.
CGI-сценарий (CGI-скрипт) — программа (в текстовом виде), предназначенная для исполнения на web-сервере. Для создания CGI-скриптов можно использовать любой язык программирования — важно лишь, чтобы на том web-сервере, где предполагается эту программу запускать, имелся интерпретатор этого языка. В настоящее время наиболее частоиспользумыми языками CGI-программирования являются PHP, Perl, C++.
Web-программирование
Все языки программирования, используемые при разработке web-сайтов, можно разделить на две большие группы.
К первой будут относиться те из них, код которых выполняется на компьютере посетителя сайта — в его браузере. Это известные всем JavaScript, VBScript, Java-апплеты. Программы на этих языках встраиваются в код web-страниц (или выносятся в отдельный файл с вызовом из web-страниц, но браузер все равно обрабатывает такие вынесенные программы как если бы они были встроены в код страницы).
Во вторую же группу можно включить те языки, программы на которых выполняются на том компьютере, где расположен web-сервер. Эта группа будет гораздо более обширной, — дело в том, что в принципе на web-сервере могут исполняться программы на любом языке (даже командных. bat-файлов MS-DOS), важно лишь, чтобы на нем была установлена программа-интерпретатор этого языка, удовлетворяющая особым требованиям — стандарту CGI, которым также должен удовлетворять сам web-сервер.
PHP относится ко второй группе — программа на PHP исполняется на web-сервере. Однако от других CGI-языков PHP очень сильно отличается в лучшую сторону, — прежде всего своей простотой. Создавая программы на PHP, нет необходимости учитывать все те многочисленные мелочи, которые отравляют жизнь программистам на Perl или C++: не надо заботиться о правах доступа к файлам сценария, не надо прописывать точные пути к различным модулям, нет необходимости следить за отсутствием в файле скрипта недопустимых символов. Синтаксис языка таков, что он допускает его легкое освоение как начинающим программистом, так и тем, кто уже использовал ранее какой-либо язык программирования. Для тестирования PHP-программ на локальном компьютере необязательно устанавливать на нем ту же операционную систему, что и у провайдера хостинга сайта, где эти программы будут применяться, — достаточно лишь установить соответствующей web-сервер и подключить к нему модуль PHP. Можно целиком и полностью сосредоточиться на решаемой задаче и не думать о мелочах. Именно это и делает PHP весьма хорошим выбором для web-дизайнера, который, начав его использовать, может вообще забыть о каких-либо других CGI-языках.
Немного истории
В отличие от многих других языков программирования, PHP был создан не какой-либо корпорацией или гением-программистом, а обычным пользователем, Расмусом Лердорфом, в далеком 1994 году. Цель разработки языка была проста — сделать домашнюю страничку Расмуса более интерактивной, а значит, и более привлекательной для посетителей. Расмус разработал базовый синтаксис и написал первый интерпретатор своего языка, получившего название Personal Home Page Tools — т. е. PHP. Этот интерпретатор мог обрабатывать лишь несколько основных команд, однако начало было положено.
В 1995 году Расмус доработал интерпретатор PHP, соединив его с другой своей программой, умевшей обрабатывать HTML-формы (именовавшейся FI — от "Form Interpretator"), а также сделал так, что интерпретатор, получивший название PHP/FI Version 2, мог становиться частью web-сервера. Последнее сделало программы на PHP очень быстроисполняющимися. Кроме того, в том же 1995 году интерпретатор PHP был дополнен возможностями обработки новых команд, в частности, функций работы с сервером баз данных MySQL и автоматического создания gif-файлов (последнее, к примеру, может быть использовано для генерации кнопок-счетчиков посещений). PHP/FI был размещен в Сети для всеобщего использования, и началось его повсеместное распространение.
Web-мастера быстро оценили достоинства нового языка web-программирования — легкость освоения и богатство возможностей, и вскоре традиционные Perl, C++ стали сдавать ему свои позиции. Так как исходный код интерпретатора был открыт (а сам он, ясное дело, бесплатен), то энтузиасты стали заниматься его доработкой, и летом 1998 года появился на свет PHP3 — детище Зива Сураски и Энди Гутманса (Zeev Suraski and Andi Gutmans). В этой версии интерпретатора были исправлены баги предыдущей версии и добавлены новые функции, что еще больше поспособствовало его победному шествию по миру. Уже к концу 1999 года число сайтов, построенных на основе PHP, перевалило за миллион. Весьма важным достоинством PHP также являлось то, что его можно было использовать в различных операционных системах — от Windows до Unix и Linux.
В 2000-м году вышла четвертая версия интерпретатора PHP, разработанная компанией Zend Technologies, дополненная множеством новых функций. В настоящее время именно она является наиболее распространенной.
С чего начать?
Основным источником сведений по PHP является официальный сайт его разработчиков — www.php.net. Однако тем, кто желает разработать сайт с применением PHP, лучше прежде всего посетить русский сайт "PHP по-русски", расположенный по адресу http://php.spb.ru, и загрузить с него два файла — полное описание PHP на русском языке (точный перевод руководства по PHP с сайта www.php.net) и web-сервер Apache с PHP-модулем, сконфигурированным для немедленного использования. Оба файла подготовил и разместил в Сети ведущий этого сайта Дмитрий Бородин.
Готовый к использованию web-сервер вместе с интерпретатором PHP, а также системой управления базами данных MySQL вы также можете найти на сайте проекта «Денвер», расположенном по адресу http://dklab.ru/chicken/web. В отличие от вышеупомянутого ресурса "PHP по-русски", ведущие проекта "Денвер" Дмитрий Котеров, Дмитрий Короленко, Игорь Светликов и Андрей Любченко регулярно обновляют свой проект, постоянно размещая на нем свежие версии web-сервера с набором компонентов. Однако установка «Денвера» более автоматизирована, нежели набора с сайта "PHP по-русски", и предусматривает значительно меньшую ее «управляемость».
"Денвер" можно порекомендовать тем, кто предпочитает автоматически получить на своем компьютере готовый к использованию web-сервер в целях изучения языка PHP и создания на нем программ, а "PHP по-русски" понравится тому, кто привык все, что ему надо, настраивать сам. Тем более что последнее будет весьма легко — достаточно внимательно прочитать комментарий Дмитрия с сайта и файлы Readme из дистрибутива.
Итак, первым делом установите на своем компьютере web-сервер Apache — из «Денвера» или "PHP по-русски" и освойте его использование. После этого вы сможете полноценно работать с программами на PHP на своем компьютере, не выходя в Интернет, например, тестировать разработанные с использованием PHP сайты.
Ну, а затем приступайте к изучению языка. В этой главе книги изложены самые основные его понятия и описаны базовые команды, с помощью которых можно создать неплохие PHP-программы. За остальной информацией обращайтесь к описанию языка, тем более что оно переведено на русский язык и снабжено массой примеров кода. Только помните, что в том дистрибутиве web-сервера, о котором говорилось выше, отсутствуют модули, расширяющие возможности PHP, так что некоторые разделы описания будут неактуальны. Впрочем, ничего не мешает вам загрузить нужные модули отдельно и установить их (на сайте http://php.spb.ru описано, как это сделать), однако первое время такая необходимость у вас вряд ли появится.
На сайте http://phpclub.unet.ru вы найдете множество примеров сценариев на PHP, сможете загрузить литературу на русском языке, получить от профессионалов в web-программировании ответ на свой вопрос или принять участие в каком-либо обсуждении или пообщаться с коллегами в чате. Архив Форума, расположенного на этом сайте, содержит в себе ответы практически на все мыслимые и немыслимые вопросы по web-программированию на PHP. Также здесь регулярно публикуются новости мира PHP-программирования, рассказывается о новых разработках в этой области, размещается информация о вакансиях web-дизайнеров и программистов на рынке труда. Также немало полезной информации есть в Web-клубе по адресу http://www.webclub.ru/materials/php3, в частности, руководство по PHP, представленное на сайте "PHP для всех", изначально размещалось именно там.
Для написания кода на PHP подходит любой текстовый редактор — от «Блокнота» до "Script Editor'а" из пакета Microsoft Office, здесь выбор зависит от вашего личного вкуса и желания.
В RuNet'е использовать PHP разрешается, например, на таких бесплатных серверах, как http://www.h1.ru, http://meridian.tomsk.ru, http://webservis.ru, http://www.hut.ru, http://wallst.ru, на иностранных — http://www.saxen.net и других. Однако при выборе бесплатного хостинга для размещения сайта помните, что в подавляющем большинстве случаев вам придется в обязательном порядке размещать на своих страницах рекламные баннеры (за их показ на вашем сайте компании, владеющей сервером хостинга, рекламодатели платят деньги, которые, собственно, и служат оплатой поддержки размещенных на этом сервере сайтов). Кроме того, весьма часто владельцы хостингов с поддержкой PHP и других CGI-языков запрещают размещать на сайтах, расположенных у них, файлы zip, rar, exe, mp3. Впрочем, последнее условие можно обойти, использовав для хранения таких файлов другой бесплатный сервер, — пусть и без поддержки PHP.
На рынке платного хостинга ситуация другая — сейчас уже трудно найти хостинг, где бы не предлагали использовать PHP. Тарифные планы, не предполагающие использование PHP, сохранились разве что у некоторых провайдеров услуг доступа в Интернет, параллельно предоставляющих и услугу размещения web-сайтов за отдельную плату. Так что для построения сайтов, использующих PHP, можно выбирать практически любой сервер платного хостинга, оценивая его по различным другим критериям (цена, надежность, скорость и т. д.). Достаточно трудно рекомендовать какую-либо определенную фирму, однако можете попробовать ValueHost (www.valuehost.ru), www.350mb.ru, www.net.ru и другие.
Более подробно о PHP вы можете узнать из специализированной литературы, например, из книги "PHP: полезные приемы", готовящейся в настоящее время к выходу в свет в издательстве "Горячая линия — Телеком". При подготовке данной главы использовались материалы из этой книги.
Ниже будет рассказано об основах PHP. Весь нижеследующий текст рассчитан на тех, кто имеет хотя бы общее представление о программировании и может понять принципы работы с PHP на основании сравнения его с другими языками. Если такового опыта у вас нет, то для изучения PHP воспользуйтесь специальной литературой или Интернет-публикациями — к сожалению, делать книгу об Интернете еще и учебником по программированию у нас возможности нет.
Основы языка
Синтаксис PHP прост. Программы на PHP встраиваются в текст web-страницы так же, как и сценарии на JavaScript, VBScript, — окаймляясь угловыми скобками с указанием языка: . Команды PHP обязательно разделяются символом точки с запятой — ";" (символы конца абзаца или конца строки не учитывается никак), после последней в программе команды его можно не ставить. Также символ";" не ставится после условных операторов и операторов цикла.
Пример программы на PHP вы можете увидеть на рис. 19.1.
Как и во всех языках программирования, в PHP есть возможность работать с переменными — некиими обьектами, имеющими имя и могущими принимать различные значения. Однако работа с переменными в PHP, пожалуй, самая легкая из всех возможных. Переменные не надо заранее обьявлять (если не знаете, что это такое — и не надо), за исключением использования их в функциях, для введения новой переменной достаточно просто присвоить ей какое-либо значение, а для помещения значения переменной в строку текста, имя файла или параметр команды нужно просто написать ее имя в том месте, где должно быть ее значение.
Чтобы PHP мог отличать переменные от строк или команд, ее имя должно начинаться со знака доллара — "$" и не должно содержать пробелов или знаков апострофа и некоторых других. При анализе программного кода интерпретатор PHP считает именем переменной все, что содержится между $ и ближайшим к нему символом, недопустимым в имени переменной.
Переменные в PHP могут быть четырех типов — число (целое и дробное), строка текста, массив и обьект. Интерпретатор PHP автоматически определяет тип переменной на основании анализа ее содержимого. Подробнее о типах данных вы можете узнать в руководстве по PHP, там же рассказано и об особенностях работы с массивами (и вообще обьяснено, что это такое, если вы еще не знаете).
Помните, что для включения переменной в строку текста нельзя использовать символ "+" — он пригоден лишь для числовых выражений. Достаточно просто поместить переменную туда, где она должна стоять — например, в итоге выполнения кода $a="птица певчая"; $b="Дятел — $a" переменной $b будет присвоено значение "дятел — птица певчая".
Довольно часто используются сокращенные обозначения арифметических действий над переменными и действий по присваиванию им каких-либо значений. Например, команда $a++ означает, что переменную $a надо увеличить на единицу, а команда $a+=3 — увеличить на 3, что и будет сделано, если она имеет числовой формат.
Ниже будут перечислены некоторые основные команды PHP, которых вполне хватит для реализации несложных проектов. Для более полного ознакомления с командами PHP можно изучить Руководство по этому языку, доступное, например, с адреса http://php.spb.ru или другие публикации.
· include "имя файла" — команда для включения содержимого одного файла в другой. Содержимое того файла, имя которого указывается в команде, целиком и полностью вставляется на то место, где располагается эта функция, при этом все коды PHP, содержащиеся во вставляемом файле, исполняются так же, как если бы они были на месте этой функции. Пример можно увидеть на рис..
· mail ("Кому", «Тема», "Текст сообщения", "Дополнительные заголовки") — отправка почтового сообщения. При выполнении данной команды на сервере формируется электронное письмо в соответствии с указанными параметрами и отправляется с помощью серверной почтовой программы. В качестве параметра «Кому» может выступать набор адресов, разделенных запятыми. "Дополнительные заголовки" могут быть совершенно любые, разделяться они должны комбинацией символов /n, которая в PHP означает перевод строки. Пример использования функции mail вы можете увидеть ниже, в описании устройства электронного магазина. (Если среди "Дополнительных заголовков" не указано поле From, то оно заполняется по умолчанию, например, именем "Unprivileged User".)
· echo «текст» — вывод на web-страницу какого-либо текста. Чтобы вывести на web-страницу значение какой-либо переменной, достаточно просто написать ее имя внутри выводимой строки: команда echo "это цифра $a" выведет в web-страницу текст "это цифра 1", если ранее переменной $a присваивалось значение единицы.
· if (условие) {…команды, которые должны выполняться, если условие верно…;} else {…команды, которые должны выполняться, если условие неверно…} — команда, позволяющая выполнить то или иное действие в зависимости от верности или неверности того или иного условия. В фигурных скобках может располагаться несколько команд, разделенных точкой с запятой. В качестве условия может быть оператор сравнения «равно» — "==" (именно два знака равенства!), «больше» — ">", «меньше» — "<" и их комбинации — скажем, "<=" — "меньше или равно". Можно использовать и несколько условий, взяв каждое из них, а также все вместе в скобки и разделяя знаками "&&" — «и» или "||" — «или».
Для того, чтобы выполнять различные команды в зависимости от условия, могущего принимать три или больше значений, следует использовать оператор switch (описание смотрите в руководстве), — аналог оператора case в VBA и некоторых других языках.
· for (начальное значение счетчика, условие продолжения цикла, изменение счетчика на каждом цикле) {…команды…;} — цикл, то есть повторение указанных в нем команд столько раз, сколько позволет условие изменения счетчика (т. е. переменной, специально выделенной для подсчета числа выполнений команд цикла). К примеру цикл for ($i = 1; $i <= 10; $i++) {echo $i;} выводит в web-страницу числа с 1 до 10, так как в нем изначально устанавливается значение счетчика в 1 — $i=1, каждый цикл его значение увеличивается на 1 — $i++, а продолжаться он будет до тех пор, пока значение счетчика не превысит 10 (т. е. пока $i<=10).
Также в PHP можно использовать циклы без открытого обьявления числа повторений — while (условие) {…команды…;} и do {…команды…} while (условие);. Описание их смотрите в руководстве по PHP, отличаются же они тем, что второй цикл (do…while) будет в любом случае выполнен не менее одного раза.
Программа на PHP может прерываться кодом web-страницы, — для этого достаточно вставить закрывающий тэг до этого кода и открывающий — после. Все, что находится между ними, будет выдаваться в браузер без какой-либо обработки, рассматриваясь как выводимое с помощью команды echo. Иными словами, код
Переменная а равна 1 эквивалентен коду Переменная а равна 1";}?>, однако первый вариант меньше нагружает процессор компьютера, на котором расположен интерпретатор PHP. Из сказанного также следует, что все программы на PHP, расположенные на одной web-странице, представляют из себя одну большую программу, — несмотря на то, что они разделяются блоками обычного текста страницы. Именно поэтому переменная, обьявленная в расположенном в начале страницы коде, сохраняет свое значение не только до ее конца, но и во всех присоединяемых с помощью команды include файлах. Вот, к примеру, демонстрация этого — рис. 19.1. Рис. 19.1. Пример PHP-кода. Посмотрите внимательно на код (окна слева) и итог его выполнения (окно браузера справа). Обратите внимание, что переменная a, которой присвоено значение еще в первом программном блоке левой страницы, сохранила его не только в других ее блоках, но и в программе, расположенной во включаемой с помощью команды include страницы. Однако помните, что если вы создаете функцию на PHP (попросту вставляя в программу инструкцию Function имя () {…команды функции…} с целью потом ее вызывать командой имя), то переменные, обьявленные в ней, по умолчанию имеют установленное значение только внутри функции. Кроме того, также по умолчанию переменные, обьявленные вне функции, в ней самой никакого значения не имеют. Подробнее о функциях и о переменных в них читайте в руководстве по PHP, например, с того же сайта http://php.spb.ru. Обычно web-сервер настраивается так, что на предмет наличия программ на PHP просматриваются файлы, имеющие расширение. php, phtml, остальные же файлы передаются в браузер пользователя без поиска в них команд PHP. Делается так для более быстрой работы сервера, а также для обеспечения возможности установки на сервере разных интерпретаторов (например, SSI — Server Side Includes, в технологии, в какой-то мере предшествовавшей PHP), так как тогда каждому из интерпретаторов назначаются свои расширения для обработки соответствующих файлов. Так как PHP-код полностью исполняется на web-сервере, то в страницах, выдаваемых браузеру, он будет отсутствовать, и если кто заинтересуется вашим опытом программирования, то вам придется отправлять ему этот код по почте, так как при просмотре сайта каким-нибудь образом узнать исходный PHP-код его страниц нельзя. Работа с формами Значения переменных можно передавать между различными страницами сайта — с помощью использования форм. Формой называется конструкция, состоящая из поименованных элементов особых типов, заключенных между HTML-тэгами . В качестве элементов формы могут выступать поля ввода текста, кнопки, выпадающие меню, переключатели, квадратики для отметки галочкой — checkbox'ы, а также картинки формата jpg или gif. Наиболее важным свойством формы является то, что в ее заголовке — в открывающем тэге На рис. 22.1 показано, как она выглядит на web-странице. Формирование письма произойдет, как только посетитель нажмет кнопку, имеющую тип «submit». Однако, к сожалению, данный процесс полноценно пройдет лишь в том случае, если в качестве используемой по умолчанию почтовой программы установлен Microsoft Outlook Express или Microsoft Outlook. Другие почтовые клиенты будут обрабатывать передаваемые им браузером данные, введенные в форму, не совсем корректно. Скажем, The Bat! не способен брать из формы что-либо, кроме адреса получателя и темы, — то есть само письмо, увы, отправлено не будет. Во избежание подобных ситуаций следует предупредить посетителя сайта в пояснительном тексте рядом с формой отправки о том, что ее следует использовать только при установленном в качестве почтового клиента по умолчанию Microsoft Outlook Express (или Microsoft Outlook), и указать рядом с формой ваш обычный адрес электронной почты для пользователей остальных почтовых клиентов. Рис. 22.1. Так выглядит описанная в тексте форма для отправки писем Автопереход Для того, чтобы после загрузки web-страницы происходил автоматический переход на другую страницу, принято ставить в ее области выражение . Однако в том случае, если посетитель, находясь на той странице, куда его перенаправили, нажмет в своем браузере кнопку «Назад», то возникнет несколько некрасивая ситуация: он станет нажимать на эту кнопку, желая вернуться на ту страницу, где был ранее, попадать снова на страницу с перенаправлением, и тэг Refresh будет его опять отправлять на тот сайт, который указан в нем для перенаправления. Это может вызвать у посетителя отрицательные эмоции, так что для автоматического перенаправления лучше вставить в самое начало страницы, можно даже в раздел небольшой сценарий: Команда window.location.replace() загружает в браузер посетителя страницу с указанным адресом, но не помещает информацию о ней в «Историю» ваших путешествий в Web. Тем самым предотвращается случайное возвращение посетителя на страницу с перенаправлением. Если вам пришлось переместить свой сайт на другой сервер, то оставьте на его предыдущем месте небольшую страничку с вышеприведенными тэгом или скриптом перенаправления на ваш новый адрес. Тогда те посетители, которые придут на ваш сайт из каталогов и поисковых систем, где вы регистрировали еще старый адрес сайта, не будут для вас потеряны. Restricted Area — Защищенная зона Если надо организовать на сайте группу web-страниц, доступ в которую будет возможен лишь при помощи пароля, то обычно данное задание реализуется с помощью сценариев на каком-нибудь CGI-языке: Perl, PHP. На серверах бесплатного хостинга использовать данные языки обычно запрещено, однако можно прибегнуть к нехитрому приему, основанному на JavaScript. Придумайте пароль. Создайте страницу с именем, совпадающим с паролем (например, если пароль — hgty23jyhg, то страница должна иметь имя hgty23jyhg.htm), а на ту страницу, откуда производится переход в часть сайта, защищенную паролем, вставьте форму с полем ввода пароля, кнопкой типа button и небольшой скрипт: При нажатии кнопки произойдет переход на страницу, имя которой было введено в поле ввода текста. Как такая форма выглядит — показано на рис. 22.3. Рис. 22.3. Пароль на вход — без CGI. Однако этот способ ограничения доступа возможен не на всех серверах, а только на тех, где запрещен так называемый "листинг директорий". Листинг директорий — это возможность просмотра содержимого папки на удаленном сервере при отсутствии в ней файла, загружаемого по умолчанию (или при неправильной конфигурации web-сервера даже при наличии такого файла). Вы наверняка во время путешествий по Интернету встречались с ситуацией, когда вместо запрошенной web-страницы высвечивается некое подобие Проводника Windows, а в верхней строчке — ссылка на "Parent Directory" (рис. 22.4)? Рис. 22.4. Здесь листинг директорий разрешен… Это означает, что на этом сервере листинг директорий разрешен, а запрошенной вами страницы не существует. Список файлов в окне браузера — это другие файлы в той же папке, в которой должна была бы быть запрошенная вами web-страница. Если же на сервере листинг директорий запрещен, то при попытке обратиться к несуществующей web-странице будет выдано сообщение об отсутствии на сервере такой страницы. Оно будет сгенерировано либо браузером, который получит соответствующее уведомление от сервера (рис. 22.5), либо самим сервером. В последнем случае обычно демонстрируется небольшая реклама этого сервера. Рис. 22.5…а здесь запрещен. Ясно, что ограничение доступа к страницам сайта, описанное выше, возможно только там, где листинг директорий запрещен. В противном случае достаточно будет ввести любой неправильный пароль, чтобы просмотреть все файлы сайта. Поэтому перед размещением сайта следует проверить допустимость листинга директорий на сервере, где предполагается его расположить, запросив наверняка несуществующую web-страницу. Где можно применить такую структуру разграничения доступа? Да хотя бы в системе онлайнового обучения. При организации образовательных ресурсов с системой контроля знаний возникает проблема разграничения доступа к заданиям разной степени сложности, а также к ответам на них. Сделайте в этом случае так, чтобы паролем для перехода к следующему вопросу был правильный ответ на предыдущий. Или, скажем, ваш сайт посвящен вопросам медицины, но вы не хотите, чтобы некоторую информацию узнали неспециалисты. Например, технология лечения бронхиальной астмы в случае использования теми, кто не знает некоторых аспектов и тонкостей развития этого заболевания, способна привести к тяжелым осложнениям. Вследствие этого доступ к страницам, содержащим ее описание, желательно предоставлять лишь дипломированным врачам. Выясните посредством переписки по электронной почте степень компетентности желающего ознакомиться с содержимым «защищенной» части вашего сайта и отправьте ему пароль. Если вы не хотите использовать один и тот же пароль для всех посетителей, то просто заведите на каждого желаемого посетителя по странице с уникальным именем-паролем. На каждую же из этих страниц поместите параметр refresh, как описано выше, перенаправляющим посетителя на заглавную страницу «защищенной» части. Для добавления нового посетителя «защищенной» части вам потребуется всего лишь поместить на свой сайт маленькую однотипную страницу с параметром refresh и именем, соответствующим паролю нового пользователя. Безусловно, в последнем случае существует риск того, что кто-нибудь из не очень сознательных посетителей станет распространять адрес заглавной страницы «защищенной» части вашего сайта. Это, конечно, неприятная перспектива, но ее можно в значительной степени предотвратить, регулярно меняя имена страниц «защищенной» части и, соответственно, ссылки на них на страницах с именами-паролями.[57 - Чтобы произвести замену адресов сразу во всей массе страниц, стоит использовать специальные программы, например, Search&Replace, загрузить которую можно с серверов бесплатных программ www.freeware.ru, www.listsoft.ru и т. д.] Но самое интересно, что подобную систему разграничения доступа можно применить отнюдь не только при создании сайтов. Программа Microsoft HTML Help Workshop дает возможность создавать файлы HTML-справки вроде тех, что лежат в основе справочной системы Microsoft Office 2000 или Microsoft Internet Explorer 4.0 и выше (они имеют расширение .chm). При этом в качестве основы для таких файлов берется совокупность связанных между собою web-страниц. Скажем, вы можете отконвертировать ваш сайт в chm-файл, и тогда он будет занимать меньше места и находиться в одном файле. В результате передать его другу или отослать по почте целиком станет легче. Так вот. После создания chm-файла узнать имена web-страниц, послуживших для него источниками, можно лишь декомпилировав его той же программой Microsoft HTML Help Workshop. При этом все ссылки внутри этого файла между вошедшими в него web-страницами сохранятся, и та система разграничения доступа, что была описана выше, будет полностью функциональна. В итоге вы, даже не умея программировать, легко сможете создать систему контроля знаний, набор загадок и ответов, базу знаний с разграниченным доступом. Достаточно будет лишь оформить ваш проект как сайт и научиться работать с Microsoft HTML Help Workshop, что очень легко — у последней интерфейс интуитивно понятный. Воспользоваться вашим творением сможет любой владелец Microsoft Internet Explorer 4.0 или более поздней версии. Microsoft HTML Help Workshop входит в состав пакета Microsoft Office 2000 Developer Edition, а кроме того, доступна на сайте www.microsoft.com. Выпадающее меню Если вы хотите на web-страницу поместить выпадающее меню для быстрой навигации по сайту, например, такое, как на рис. 22.6, где при выборе какого-либо пункта происходит автоматический переход на соответствующую страницу, то его можно сделать с помощью средств JavaScript. Вот пример такого скрипта: Рис. 22.6. Выпадающее меню — удобный способ ориентации на сайте. А для того, чтобы при выборе того или иного пункта меню происходило открытие выбранной страницы в новом окне, первая строка сценария должна иметь вид |